public ScenesController
 (
     SceneDescriptorRepository sceneDescriptorRepository,
     IGameSceneService gameSceneService
 )
 {
     SceneDescriptorRepository = sceneDescriptorRepository;
     GameSceneService          = gameSceneService;
 }
 public GameSceneService
 (
     IOptions <S3Configuration> s3Configuration,
     SceneDescriptorRepository sceneDescriptorRepository,
     ICloudStorageService cloudStorageService
 )
 {
     S3Configuration           = s3Configuration.Value;
     SceneDescriptorRepository = sceneDescriptorRepository;
     CloudStorageService       = cloudStorageService;
 }
        public async Task <SceneDescriptor> AddScene(Scene scene)
        {
            var key = await UploadScene(scene, $"scenes/{Guid.NewGuid()}.json").ConfigureAwait(false);

            if (key == null)
            {
                return(null);
            }

            var descriptor = new SceneDescriptor {
                StorageKey = key, Name = scene.Name
            };
            await SceneDescriptorRepository.Add(descriptor);

            return(descriptor.Id == null ? null : descriptor);
        }
        public async Task <bool> DeleteScene(string id)
        {
            var descriptor = await SceneDescriptorRepository.Get(id).ConfigureAwait(false);

            if (descriptor == null)
            {
                return(false);
            }

            var key     = WebUtility.UrlDecode(descriptor.StorageKey);
            var deleted = await CloudStorageService.DeleteFile(S3Configuration.BucketName, key).ConfigureAwait(false);

            if (deleted)
            {
                await SceneDescriptorRepository.Delete(descriptor.Id).ConfigureAwait(false);
            }

            return(deleted);
        }
        public async Task <bool> UpdateScene(Scene scene)
        {
            var descriptor = await SceneDescriptorRepository.GetByStorageKey(scene.StorageKey).ConfigureAwait(false);

            if (descriptor == null)
            {
                return(false);
            }

            var key = await UploadScene(scene, scene.StorageKey).ConfigureAwait(false);

            if (key != null)
            {
                descriptor.Name = scene.Name;
                await SceneDescriptorRepository.Replace(descriptor).ConfigureAwait(false);
            }

            return(key != null);
        }
        public async Task <Scene> GetScene(string id)
        {
            var descriptor = await SceneDescriptorRepository.Get(id).ConfigureAwait(false);

            if (descriptor == null)
            {
                return(null);
            }

            var key  = WebUtility.UrlDecode(descriptor.StorageKey);
            var file = await CloudStorageService.GetFile(S3Configuration.BucketName, key).ConfigureAwait(false);

            using (var reader = new StreamReader(file))
            {
                var option = new JsonSerializerOptions {
                    PropertyNamingPolicy = JsonNamingPolicy.CamelCase
                };
                var scene = JsonSerializer.Deserialize <Scene>(reader.ReadToEnd(), option);
                scene.StorageKey = key;

                return(RenewPreSignedUrls(scene));
            }
        }
 public async Task <IEnumerable <SceneDescriptor> > GetSceneDescriptors([FromQuery] int limit = 0)
 {
     return(await SceneDescriptorRepository.Get(limit).ConfigureAwait(false));
 }