Beispiel #1
0
        public async Task Update(PadSeries series)
        {
            using (var conn = OpenConnection()) {
                using (var t = conn.BeginTransaction()) {
                    // Pull in the OG record. useful to see what was created or updated.
                    var old = (await FindById(series.Id)) !;

                    // Update parent record.
                    await conn.ExecuteAsync(
                        @"update pad_series set brand_id = @BrandId, name = @Name, polisher_types = @PolisherTypes where id = @Id;",
                        new PadSeriesRow()
                    {
                        Id            = series.Id,
                        BrandId       = series.BrandId,
                        Name          = series.Name,
                        PolisherTypes = series.PolisherTypes.Flatten()
                    }
                        );

                    await UpdatePadSizes(conn, series.Id, old.Sizes, series.Sizes);
                    await UpdatePads(conn, series.Id, old.Pads, series.Pads);

                    t.Commit();
                }
            }
        }
Beispiel #2
0
        public async Task RejectsNoSizes()
        {
            var s = new PadSeries("Name", Guid.NewGuid());

            var res = await new PadSeriesHasSizesSpecification().Check(s);

            Assert.IsFalse(res.IsSatisfied);
        }
Beispiel #3
0
        public async Task RejectsPadsWithNoOptions()
        {
            var s = new PadSeries("Name", Guid.NewGuid());

            s.Pads.Add(new Pad("Color", PadCategory.Cutting, PadMaterial.Foam, PadTexture.Dimpled, PadColor.Red, false));

            var satisified = await new PadSeriesHasOptionsForEveryPadSpecification().Check(s);

            Assert.IsFalse(satisified.IsSatisfied);
        }
Beispiel #4
0
        public async Task AcceptsSizes()
        {
            var s = new PadSeries("Name", Guid.NewGuid());

            s.Sizes.Add(new PadSize(new Measurement(1, MeasurementUnit.Inches)));

            var res = await new PadSeriesHasSizesSpecification().Check(s);

            Assert.IsTrue(res.IsSatisfied);
        }
Beispiel #5
0
        public async Task Delete(PadSeries series)
        {
            using (var conn = OpenConnection()) {
                using (var t = conn.BeginTransaction()) {
                    // Thank you cascade
                    await conn.ExecuteAsync(@"delete from pad_series where id = @Id;", series);

                    t.Commit();
                }
            }
        }
Beispiel #6
0
        public async Task AcceptsPadsWithOption()
        {
            var s = new PadSeries("Name", Guid.NewGuid());

            s.Pads.Add(new Pad("Color", PadCategory.Cutting, PadMaterial.Foam, PadTexture.Dimpled, PadColor.Red, false));
            s.Pads[0].Options.Add(new PadOption(Guid.NewGuid()));

            var res = await new PadSeriesHasOptionsForEveryPadSpecification().Check(s);

            Assert.IsTrue(res.IsSatisfied);
        }
Beispiel #7
0
        public async Task RejectsOptionsOnSameColorWithTheSameSize()
        {
            var s = new PadSeries("Name", Guid.NewGuid());

            s.Pads.Add(new Pad("Color", PadCategory.Cutting, PadMaterial.Foam, PadTexture.Dimpled, PadColor.Red, false));

            var sizeId = Guid.NewGuid();

            s.Pads[0].Options.Add(new PadOption(sizeId));
            s.Pads[0].Options.Add(new PadOption(sizeId));

            var res = await new PadSeriesOptionsAreUniqueBySizesSpecification().Check(s);

            Assert.IsFalse(res.IsSatisfied);
        }
Beispiel #8
0
        public async Task AcceptsOptionsWithSameSizeOnDifferentColors()
        {
            var s = new PadSeries("Name", Guid.NewGuid());

            s.Pads.Add(new Pad("Color1", PadCategory.Cutting, PadMaterial.Foam, PadTexture.Dimpled, PadColor.Red, false));
            s.Pads.Add(new Pad("Color2", PadCategory.Finishing, PadMaterial.Foam, PadTexture.Dimpled, PadColor.Red, false));

            var sizeId = Guid.NewGuid();

            s.Pads[0].Options.Add(new PadOption(sizeId));
            s.Pads[1].Options.Add(new PadOption(sizeId));

            var res = await new PadSeriesOptionsAreUniqueBySizesSpecification().Check(s);

            Assert.IsTrue(res.IsSatisfied);
        }
Beispiel #9
0
        public async override Task <Guid> Execute(PadSeriesCreateCommand command, User?user)
        {
            var sizes = command.Sizes.Select(s => new PadSize(s.Diameter, s.Thickness)).OrderByDescending(s => s.Diameter).ToList();

            var colors = command.Pads.Select(c => {
                ProcessedImage?image = null;

                if (c.Image != null)
                {
                    var dataUrlImage = c.Image.Right(); // Crash and burn if Guid passed. (Theoretically) this should be impossible since they're new pads.
                    image            = imageProcessor.Process(dataUrlImage.Name, dataUrlImage.Data);
                }

                List <PadOption> options = new();

                foreach (var optionCreate in c.Options)
                {
                    PadOption option;

                    option = new PadOption(sizes[optionCreate.PadSizeIndex].Id);
                    option.PartNumbers.AddRange(optionCreate.PartNumbers.Select(pn => new PartNumber(pn.Id, pn.Value, pn.Notes)));
                    options.Add(option);
                }

                // Sort options
                options = options.OrderByDescending(o => sizes.Find(s => s.Id == o.PadSizeId) !.Diameter).ToList();

                return(new Pad(c.Name, c.Category, c.Material, c.Texture, c.Color, c.HasCenterHole, image, options));
            }).OrderBy(c => c.Name).ToList();


            var series = new PadSeries(
                command.Name,
                command.BrandId,
                command.PolisherTypes,
                sizes,
                colors
                );

            await spec.CheckAndThrow(series);

            await repo.Add(series);

            return(series.Id);
        }
Beispiel #10
0
        public async Task Add(PadSeries series)
        {
            using (var conn = OpenConnection()) {
                using (var t = conn.BeginTransaction()) {
                    await conn.ExecuteAsync(
                        @"insert into pad_series (id, brand_id, name, polisher_types) values (@Id, @BrandId, @Name, @PolisherTypes);",
                        new PadSeriesRow()
                    {
                        Id            = series.Id,
                        BrandId       = series.BrandId,
                        Name          = series.Name,
                        PolisherTypes = series.PolisherTypes.Flatten()
                    }
                        );

                    await conn.ExecuteAsync(
                        @"insert into pad_sizes (id, pad_series_id, diameter_amount, diameter_unit, thickness_amount, thickness_unit) values (@Id, @PadSeriesId, @DiameterAmount, @DiameterUnit, @ThicknessAmount, @ThicknessUnit);",
                        series.Sizes.Select(s => new PadSizeRow()
                    {
                        Id = s.Id,
                        PadSeriesId = series.Id,
                        DiameterAmount = s.Diameter.Amount,
                        DiameterUnit = s.Diameter.Unit.Serialize(),
                        ThicknessAmount = s.Thickness?.Amount,
                        ThicknessUnit = s.Thickness?.Unit.Serialize()
                    }).ToList()
                        );

                    List <PadImageRow> imageRelations = new();
                    List <ImageRow>    images         = new();

                    foreach (var pad in series.Pads)
                    {
                        if (pad.Image == null)
                        {
                            continue;
                        }

                        imageRelations.Add(new() { ImageId = pad.Image.Id, PadId = pad.Id });
                        images.Add(new() {
                            Id            = pad.Image.Id,
                            FileName      = pad.Image.FileName,
                            MimeType      = pad.Image.MimeType,
                            ImageData     = ImageUtils.ToBinary(pad.Image.Full),
                            ThumbnailData = ImageUtils.ToBinary(pad.Image.Thumbnail)
                        });
                    }

                    if (images.Count > 0)
                    {
                        await conn.ExecuteAsync(
                            @"insert into images(id, file_name, mime_type, image_data, thumbnail_data) values (@Id, @FileName, @MimeType, @ImageData, @ThumbnailData);",
                            images
                            );
                    }

                    await conn.ExecuteAsync(
                        @"insert into pads (id, pad_series_id, category, material, texture, color, has_center_hole, name) values (@Id, @PadSeriesId, @Category, @Material, @Texture, @Color, @HasCenterHole, @Name);",
                        series.Pads.Select(c => new PadRow()
                    {
                        Id = c.Id,
                        PadSeriesId = series.Id,
                        Category = c.Category.Flatten(),
                        Material = c.Material?.Serialize(),
                        Texture = c.Texture?.Serialize(),
                        Color = c.Color?.Serialize(),
                        HasCenterHole = c.HasCenterHole,
                        Name = c.Name,
                    }).ToList()
                        );

                    if (imageRelations.Count > 0)
                    {
                        await conn.ExecuteAsync(
                            @"insert into pad_images (pad_id, image_id) values (@PadId, @ImageId);",
                            imageRelations
                            );
                    }

                    List <PadOptionRow>           padOptionRows           = new();
                    List <PadOptionPartNumberRow> padOptionPartNumberRows = new();
                    List <PartNumberRow>          partNumberRows          = new();

                    foreach (var color in series.Pads)
                    {
                        foreach (var option in color.Options)
                        {
                            var optionRow = new PadOptionRow()
                            {
                                Id        = Guid.NewGuid(),
                                PadId     = color.Id,
                                PadSizeId = option.PadSizeId,
                            };

                            padOptionRows.Add(optionRow);

                            foreach (var partNumber in option.PartNumbers)
                            {
                                var partNumberRow = new PartNumberRow()
                                {
                                    Id    = Guid.NewGuid(),
                                    Value = partNumber.Value,
                                    Notes = partNumber.Notes
                                };

                                padOptionPartNumberRows.Add(new PadOptionPartNumberRow()
                                {
                                    PadOptionId  = optionRow.Id,
                                    PartNumberId = partNumberRow.Id,
                                });

                                partNumberRows.Add(partNumberRow);
                            }
                        }
                    }

                    await conn.ExecuteAsync(@"insert into pad_options (id, pad_id, pad_size_id) values (@Id, @PadId, @PadSizeId);", padOptionRows);

                    await conn.ExecuteAsync(@"insert into part_numbers (id, value, notes) values (@Id, @Value, @Notes);", partNumberRows);

                    await conn.ExecuteAsync(@"insert into pad_option_part_numbers (pad_option_id, part_number_id) values (@PadOptionId, @PartNumberId);", padOptionPartNumberRows);

                    t.Commit();
                }
            }
        }