public async Task <IActionResult> Get([FromRoute] string galleryName, [FromRoute] string imageId, [FromRoute] string tag, [FromRoute] string ext)
        {
            var result = await _thumbnailService.GetAsync(galleryName, imageId, tag, ext);

            return(result.Match(
                       thumbnail =>
            {
                var format = ImageFormat.FromExtension(ext).UnwrapOrThrow();
                return new FileContentResult(thumbnail, format.MimeType);
            },
                       failure => failure.AsActionResult()
                       ));
        }
예제 #2
0
 private ProcessingConfiguration ToConfiguration(ConfigurationSnapshot snapshot)
 {
     return(ProcessingConfiguration.New(
                avoidDuplicates: snapshot.AvoidDuplicates,
                sizes: snapshot.Sizes.Select(s => new SizeConfiguration(
                                                 tag: Name.FromString(s.Tag).UnwrapOrThrow(),
                                                 maxWidth: s.MaxWidth.ToOption(),
                                                 maxHeight: s.MaxHeight.ToOption(),
                                                 crop: s.Crop != null
                 ? Option.Some(new CropConfiguration(
                                   aspectRatio: AspectRatio.FromString(s.Crop.AspectRatio).UnwrapOrThrow(),
                                   cropStrategy: (CropStrategy)Enum.Parse(typeof(CropStrategy), s.Crop.CropStrategy, true),
                                   backgroundColor: s.Crop.Color.ToOption().Map(s => new Color(s))
                                   )) : Option.None(),
                                                 quality: Quality.FromScalar(s.Quality).UnwrapOrThrow(),
                                                 format: ImageFormat.FromExtension(s.Format).UnwrapOrThrow()
                                                 )).ToArray()
                ).UnwrapOrThrow());
 }
        private static Result <Configuration.ProcessingConfiguration, Error> FromContract(Contracts.ProcessingConfiguration value)
        {
            var sizesResult = value.Sizes.Select(s =>
            {
                var cropResult = Result.Success <Option <Configuration.CropConfiguration>, Error>(Option.None());
                if (s.Crop != null)
                {
                    if (Enum.TryParse <CropStrategy>(s.Crop.CropStrategy, true, out var strategy))
                    {
                        var colorResult = Result.Success <Option <Color>, Error>(Option.None());
                        if (s.Crop.Color != null)
                        {
                            colorResult = Color.FromString(s.Crop.Color).MapSuccess(c => Option.Some(c));
                        }

                        cropResult = colorResult.AndThen(color => AspectRatio.FromString(s.Crop.AspectRatio)
                                                         .MapSuccess(ratio => Option.Some(new Configuration.CropConfiguration(ratio, strategy, color))));
                    }
                    else
                    {
                        cropResult = Result.Failure(Error.ValidationError($"Unknown crop strategy {s.Crop.CropStrategy}"));
                    }
                }

                return(cropResult
                       .AndThen(crop => Name.FromString(s.Tag)
                                .AndThen(tag => Quality.FromScalar(s.Quality)
                                         .AndThen(quality => ImageFormat.FromExtension(s.Format)
                                                  .MapSuccess(format => new Configuration.SizeConfiguration(
                                                                  tag,
                                                                  s.MaxWidth.ToOption(),
                                                                  s.MaxHeight.ToOption(),
                                                                  crop,
                                                                  quality,
                                                                  format))))));
            }).Railway();

            return(sizesResult.AndThen(sizes => Configuration.ProcessingConfiguration.New(
                                           value.AvoidDuplicates,
                                           sizes
                                           )));
        }
 private static Image ToAggregate(ImageSnapshot snapshot)
 {
     return(Image.New(
                new Id(snapshot.Id),
                snapshot.RowVersion,
                Instant.FromDateTimeUtc(snapshot.UploadedAt),
                snapshot.Meta?.Length > 0 ? Option.Some(snapshot.Meta) : Option.None(),
                new Color(snapshot.FillColor),
                new Color(snapshot.EdgeColor),
                Md5.FromByteArray(snapshot.Md5).UnwrapOrThrow(),
                snapshot.Sizes.Select(t => new ImageSize(
                                          Name.FromString(t.Tag).UnwrapOrThrow(),
                                          Resolution.FromScalar(t.Width, t.Height).UnwrapOrThrow(),
                                          AspectRatio.FromString(t.AspectRatio).UnwrapOrThrow(),
                                          t.CropStrategy != null ? Option.Some((CropStrategy)Enum.Parse(typeof(CropStrategy), t.CropStrategy, true)) : Option.None(),
                                          ImageFormat.FromExtension(t.ImageFormat).UnwrapOrThrow(),
                                          Quality.FromScalar(t.Quality).UnwrapOrThrow(),
                                          t.DuplicateOf != null ? Option.Some(Name.FromString(t.DuplicateOf).UnwrapOrThrow()) : Option.None()
                                          )).ToArray()
                ).UnwrapOrThrow());
 }
        public async Task <Result <byte[], Contracts.Error> > GetAsync(string galleryName, string imageId, string tag, string formatHint)
        {
            var result = await Name.FromString(galleryName)
                         .AndThenAsync(gallery => Id.FromString(imageId)
                                       .AndThenAsync(id => Name.FromString(tag)
                                                     .AndThenAsync(t => (formatHint != null ? ImageFormat.FromExtension(formatHint).MapSuccess(s => Option.Some(s)) : Result.Success(Option.None <ImageFormat>()))
                                                                   .AndThenAsync(hint => _repository.Get(gallery, new ThumbnailId(id, t, hint))))));

            return(result.Map(s => s.Data, ErrorExtensions.ToContract));
        }