public async Task <IActionResult> Create(DeckRequestModel deckRqModel)
        {
            var userId       = UserUtil.GetUserId(User);
            var deckSameName = await repository.Deck
                               .QueryByName(userId, deckRqModel.Name)
                               .AsNoTracking()
                               .FirstOrDefaultAsync();

            if (deckSameName != null)
            {
                ModelState.AddModelError("Name", "The deck name is taken.");
                return(BadRequest(ModelState));
            }

            var now     = DateTime.Now;
            var newDeck = new Deck()
            {
                Name        = deckRqModel.Name.Trim(),
                Description = deckRqModel.Description == null || deckRqModel.Description.Trim().Length == 0
                                        ? null : deckRqModel.Description.Trim(),
                Theme            = deckRqModel.Theme,
                Completed        = true,
                CreatedDate      = now,
                LastModifiedDate = now,
                OwnerId          = userId,
                AuthorId         = userId
            };

            repository.Deck.Create(newDeck);
            await repository.SaveChangesAsync();

            return(CreatedAtAction(nameof(GetDeck), new { Id = newDeck.Id },
                                   new { Message = "Created Successfully", Id = newDeck.Id }));
        }
        public async Task <IActionResult> Update(int id, DeckRequestModel deckRqModel)
        {
            var user = await userManager.GetUser(User);

            var existingDeck = await repository.Deck
                               .QueryById(user.Id, id)
                               .FirstOrDefaultAsync();

            if (existingDeck == null)
            {
                return(NotFound());
            }

            var deckSameName = await repository.Deck
                               .QueryByName(user.Id, deckRqModel.Name)
                               .AsNoTracking()
                               .FirstOrDefaultAsync();

            if (deckSameName != null && deckSameName.Id != existingDeck.Id)
            {
                ModelState.AddModelError("Name", "The deck name is taken.");
                return(BadRequest(ModelState));
            }

            var notChanged = true;

            notChanged = existingDeck.Name.ToLower() == deckRqModel.Name.Trim().ToLower() && notChanged;
            notChanged = existingDeck.Description?.ToLower() == deckRqModel.Description?.Trim().ToLower() && notChanged;
            var userIsAdmin = await userManager.CheckAdminRole(user);

            existingDeck.Name        = deckRqModel.Name.Trim();
            existingDeck.Description = deckRqModel.Description == null || deckRqModel.Description.Trim().Length == 0
                                ? null : deckRqModel.Description.Trim();
            existingDeck.Theme            = deckRqModel.Theme;
            existingDeck.LastModifiedDate = DateTime.Now;
            existingDeck.Approved         = existingDeck.Approved && (userIsAdmin || notChanged);

            await repository.SaveChangesAsync();

            return(NoContent());
        }