Esempio n. 1
0
        public async Task <dynamic> Work([FromBody] CreateWorkRequest requestBody)
        {
            var userId = new ObjectId(this.GetCurrentUserId());

            var autorCollection = MongoWrapper.Database.GetCollection <Musician>(nameof(User));

            var autorFilterBuilder = new FilterDefinitionBuilder <Musician>();
            var autorFilter        = autorFilterBuilder.And(
                GeneralUtils.NotDeactivated(autorFilterBuilder),
                autorFilterBuilder.Eq(u => u._id, userId)
                );

            var userTask = autorCollection.FindAsync(autorFilter, new FindOptions <Musician>
            {
                AllowPartialResults = false,
                Projection          = new ProjectionDefinitionBuilder <Musician>()
                                      .Include(m => m.FileBytesLimit)
                                      .Include(m => m.FileBytesOccupied)
                                      .Include(m => m.FullName)
                                      .Include("_t")
            });

            Models.User thisUser = null;

            List <(FileReference, Func <Task>)> files             = new List <(FileReference, Func <Task>)>();
            Task <(FileReference, Func <Task>)> fileReferenceTask = Task.FromResult <(FileReference, Func <Task>)>((null, () => Task.CompletedTask));

            if (requestBody.Midias != null)
            {
                long totalSize = 0;
                foreach (MidiaRequest midiaRequest in requestBody.Midias)
                {
                    if (midiaRequest.Id != null)
                    {
                        fileReferenceTask = GeneralUtils.GetFileForReferenceToken
                                            (
                            MongoWrapper,
                            midiaRequest.Id,
                            userId
                                            );
                        var(fileReference, expirer) = await fileReferenceTask;
                        totalSize += fileReference.FileInfo.Size;
                        files.Add((fileReference, expirer));
                    }
                }
                thisUser = (await userTask).Single();
                GeneralUtils.CheckSizeForUser(totalSize, thisUser.FileBytesOccupied, thisUser.FileBytesLimit);
            }

            var musicianFilterBuilder = new FilterDefinitionBuilder <Models.Musician>();
            var musicianFilter        = musicianFilterBuilder.And(
                GeneralUtils.NotDeactivated(musicianFilterBuilder),
                musicianFilterBuilder.Eq(u => u._id, userId)
                );

            var musicianCollection = MongoWrapper.Database.GetCollection <Models.Musician>(nameof(User));

            List <Models.User> musicians = new List <Models.User>();

            if (requestBody.Musicos != null)
            {
                foreach (UserModelRequest musicianRequest in requestBody.Musicos)
                {
                    if (musicianRequest.Id != null)
                    {
                        musicianFilterBuilder = new FilterDefinitionBuilder <Models.Musician>();
                        musicianFilter        = musicianFilterBuilder.And
                                                (
                            musicianFilterBuilder.Eq(u => u._id, new ObjectId(musicianRequest.Id)),
                            GeneralUtils.NotDeactivated(musicianFilterBuilder)
                                                );

                        var musician = (await musicianCollection.FindAsync(musicianFilter, new FindOptions <Models.Musician>
                        {
                            Limit = 1,
                        })).SingleOrDefault();

                        Musician simpleMusician = new Musician
                        {
                            _id      = musician._id,
                            FullName = musician.FullName,
                            Avatar   = musician.Avatar,
                            About    = musician.About
                        };

                        musicians.Add(simpleMusician);
                    }
                }
            }

            List <Models.Song> songList = new List <Models.Song>();

            if (requestBody.Musicas != null)
            {
                var userSongFilterBuilder = new FilterDefinitionBuilder <Models.Musician>();
                var userSongFilter        = userSongFilterBuilder.And
                                            (
                    userSongFilterBuilder.Eq(u => u._id, userId),
                    GeneralUtils.NotDeactivated(userSongFilterBuilder)
                                            );

                var userSong = (await musicianCollection.FindAsync(userSongFilter, new FindOptions <Models.Musician>
                {
                    Limit = 1,
                    Projection = new ProjectionDefinitionBuilder <Musician>().Include(m => m.Songs),
                })).SingleOrDefault();

                songList.AddRange
                (
                    userSong
                    .Songs
                    .Where
                    (
                        s => requestBody.Musicas.Select(m => m.Id)
                        .Contains(s._id.ToString())
                    )
                );
            }

            var creationDate = DateTime.UtcNow;

            var work = new Models.Work
            {
                _id              = ObjectId.GenerateNewId(creationDate),
                Name             = requestBody.Nome,
                Description      = requestBody.Descricao,
                FileReferences   = files.Select(f => f.Item1).ToList(),
                Original         = requestBody.Original,
                Songs            = songList,
                RelatedMusicians = musicians,
            };

            var userUpdateBuilder = new UpdateDefinitionBuilder <Musician>();
            var userUpdate        = userUpdateBuilder.AddToSet(w => w.Works, work);

            var updateResult = await autorCollection.UpdateOneAsync(autorFilter, userUpdate);

            // Consume the file tokens
            files.AsParallel().ForAll(async f => await f.Item2());

            return(new ResponseBody
            {
                Code = ResponseCode.GenericSuccess,
                Data = work._id,
                Message = "Trabalho criado com sucesso!",
                Success = true
            });
        }
Esempio n. 2
0
 public void CreateWork([FromBody] CreateWorkRequest request)
 {
     workAppService.Create(mapper.Map <Work>(request));
 }