示例#1
0
        public async Task <ServerResponse <bool> > UpdateFriendRequestAsync(long accountId, long personId, EFriendRequestFlag eFriendRequestFlag)
        {
            return(await BaseInvokeAsync(async() =>
            {
                var friend = DbContext.Friends.FirstOrDefault(x =>
                                                              (x.RequestedById == accountId && x.RequestedToId == personId) ||
                                                              (x.RequestedById == personId && x.RequestedToId == accountId));

                if (friend == null)
                {
                    throw new NotFoundException(Constants.Errors.FriendNotExists);
                }

                if (Constants.FriendRequestFlagsWithErrors.ContainsKey(friend.FriendRequestFlag))
                {
                    throw new ConflictException(Constants.FriendRequestFlagsWithErrors[friend.FriendRequestFlag]);
                }

                friend.FriendRequestFlag = eFriendRequestFlag;
                friend.BecameFriendsTime = eFriendRequestFlag == EFriendRequestFlag.Approved ? (DateTime?)DateTime.Now : null;

                await DbContext.SaveChangesAsync();

                return ServerResponseBuilder.Build(true);
            }));
        }
示例#2
0
        public async Task <ServerResponse <PageResult <TagAdminResponse> > > GetAdminTagsByPageAsync(AdminTableFilterRequest adminTableFilterRequest)
        {
            return(await BaseInvokeAsync(async() =>
            {
                var query = DbContext.Tags.AsQueryable();

                query = FilterAdminTags(query, adminTableFilterRequest);

                var tagsCount = query.Count();

                query = SortItems(query, adminTableFilterRequest);

                query = FetchItems(query, adminTableFilterRequest);

                var pageResult = new PageResult <TagAdminResponse>
                {
                    Items = query.Select(x => new TagAdminResponse()
                    {
                        Id = x.Id,
                        Name = x.Name,
                        Notes = x.NoteTags.Select(y => y.Note.Name).ToArray(),
                        Tasks = x.MhTaskTags.Select(z => z.MhTask.Name).ToArray()
                    }).ToList(),
                    TotalCount = tagsCount
                };

                return ServerResponseBuilder.Build(await Task.FromResult(pageResult));
            }));
        }
示例#3
0
        public async Task <ServerResponse <bool> > InviteFriendAsync(long accountId, long personId)
        {
            return(await BaseInvokeAsync(async() =>
            {
                var friend = DbContext.Friends.FirstOrDefault(x =>
                                                              (x.RequestedById == accountId && x.RequestedToId == personId) ||
                                                              (x.RequestedById == personId && x.RequestedToId == accountId));

                if (friend != null)
                {
                    throw new ConflictException(Constants.Errors.RequestsAlreadyExists);
                }

                var appUser = DbContext.AppUsers.First(x => x.Id == accountId);
                var person = DbContext.AppUsers.First(x => x.Id == personId);

                friend = new Friend
                {
                    RequestedBy = appUser,
                    RequestedTo = person,
                    FriendRequestFlag = EFriendRequestFlag.None,
                    RequestTime = DateTime.Now
                };

                await DbContext.Friends.AddAsync(friend);
                await DbContext.SaveChangesAsync();

                return ServerResponseBuilder.Build(true);
            }));
        }
示例#4
0
        public async Task <ServerResponse <List <FeedResponse> > > GetFeedsAsync(long appUserId,
                                                                                 FeedFilterRequest feedFilterRequest, Expression <Func <Feed, bool> > accessPredicate)
        {
            return(await BaseInvokeAsync(async() =>
            {
                var query = DbContext.Feeds
                            .AsQueryable()
                            .Where(x => x.AppUserId == appUserId.ToString())
                            .Where(accessPredicate)
                            .AsEnumerable();

                query = FilterFeeds(query, feedFilterRequest);

                query = query.OrderByDescending(x => x.CreateDate);

                if (feedFilterRequest.Offset.HasValue)
                {
                    query = query.Skip(feedFilterRequest.Offset.Value);
                }

                if (feedFilterRequest.Limit.HasValue)
                {
                    query = query.Take(feedFilterRequest.Limit.Value);
                }

                return ServerResponseBuilder.Build(await query.ToAsyncEnumerable()
                                                   .Select(x => Mapper.Map <Feed, FeedResponse>(x))
                                                   .ToListAsync());
            }));
        }
示例#5
0
        public async Task <ServerResponse <long> > CreateNoteAsync(NoteRequest noteRequest)
        {
            return(await BaseInvokeAsync(async() =>
            {
                var note = new Note
                {
                    Name = noteRequest.Name,
                    Description = noteRequest.Description,
                    VisibleType = noteRequest.VisibleType,
                    UpdateDate = DateTime.Now,
                    AppUserId = noteRequest.AppUserId
                };

                await DbContext.Notes.AddAsync(note);

                if (noteRequest.TagIds.Any())
                {
                    var noteTags = noteRequest.TagIds
                                   .Join(DbContext.Tags, o => o, i => i.Id, (o, i) => i)
                                   .Select(x => new NoteTag
                    {
                        Note = note,
                        Tag = x
                    });

                    await DbContext.NoteTags.AddRangeAsync(noteTags);
                }

                await DbContext.SaveChangesAsync();

                return ServerResponseBuilder.Build(note.Id);
            }, noteRequest));
        }
示例#6
0
        public async Task <ServerResponse <AuthorizationTokenResponse> > RegisterAsync(RegistrationRequest request)
        {
            return(await BaseInvokeAsync(async() =>
            {
                if (DbContext.AppUsers.Any(x => x.Email == request.Email || x.Username == request.UserName))
                {
                    throw new UnauthorizedException(Constants.Errors.UserAlreadyRegistered);
                }

                var appUser = new AppUser
                {
                    Username = request.UserName,
                    Email = request.Email,
                    Password = HashPasswordHelper.Hash(request.Password),
                    UserRole = EUserRole.User,
                    CreatedDate = DateTime.Now
                };

                await DbContext.AddAsync(appUser);
                await DbContext.SaveChangesAsync();

                var tokenInfo = _tokenService.CreateToken(GetClaimsFromAppUser(appUser));

                var authorizationTokenResponse = new AuthorizationTokenResponse()
                {
                    Token = tokenInfo.Token,
                    ExpirationDate = tokenInfo.ExpiredDate,
                    AppUserViewModel = Mapper.Map <AppUser, AppUserViewModel>(appUser)
                };

                return ServerResponseBuilder.Build(authorizationTokenResponse);
            }, request));
        }
示例#7
0
        public async Task <ServerResponse <AuthorizationTokenResponse> > LoginAsync(LoginRequest request)
        {
            return(await BaseInvokeAsync(async() =>
            {
                var appUser = await DbContext.AppUsers
                              .AsQueryable()
                              .FirstOrDefaultAsync(x => x.Username == request.UserName);

                if (appUser == null)
                {
                    throw new UnauthorizedException(Constants.Errors.UsernameIsIncorrect);
                }
                if (!HashPasswordHelper.Verify(appUser.Password, request.Password))
                {
                    throw new UnauthorizedException(Constants.Errors.PasswordIsIncorrect);
                }

                var tokenInfo = _tokenService.CreateToken(GetClaimsFromAppUser(appUser));

                var authorizationTokenResponse = new AuthorizationTokenResponse()
                {
                    Token = tokenInfo.Token,
                    ExpirationDate = tokenInfo.ExpiredDate,
                    AppUserViewModel = Mapper.Map <AppUser, AppUserViewModel>(appUser)
                };

                return ServerResponseBuilder.Build(authorizationTokenResponse);
            }, request));
        }
示例#8
0
        public async Task <ServerResponse <PageResult <AppUserViewModel> > > GetAdminUsersByPageAsync(AdminTableFilterRequest adminTableFilterRequest)
        {
            return(await BaseInvokeAsync(async() =>
            {
                var query = DbContext.AppUsers.AsQueryable();

                query = FilterAppUsers(query, adminTableFilterRequest);

                var usersCount = query.Count();

                query = SortItems(query, adminTableFilterRequest);

                query = FetchItems(query, adminTableFilterRequest);

                var pageResult = new PageResult <AppUserViewModel>
                {
                    Items = query.Select(x => new AppUserViewModel
                    {
                        Id = x.Id,
                        UserName = x.Username,
                        UserRole = x.UserRole,
                        CreatedDate = x.CreatedDate,
                        Email = x.Email
                    }).ToList(),
                    TotalCount = usersCount
                };

                return ServerResponseBuilder.Build(await Task.FromResult(pageResult));
            }));
        }
示例#9
0
        public async Task <ServerResponse <AppUserViewModel> > GetAppUserAsync(long appUserId)
        {
            return(await BaseInvokeWithTryCatchAsync(async() =>
            {
                var appUser = await DbContext.AppUsers
                              .FirstOrDefaultAsync(x => x.Id == appUserId);

                return ServerResponseBuilder.Build(Mapper.Map <AppUser, AppUserViewModel>(appUser));
            }));
        }
示例#10
0
        public async Task <ServerResponse <List <TagResponse> > > GetTagsAsync()
        {
            return(await BaseInvokeAsync(async() =>
            {
                var query = DbContext.Tags
                            .AsQueryable()
                            .Select(x => Mapper.Map <Tag, TagResponse>(x));

                return ServerResponseBuilder.Build(await query.ToListAsync());
            }));
        }
示例#11
0
        public async Task <ServerResponse <List <TagResponse> > > GetTagsByIdsAsync(List <long> tagIds)
        {
            return(await BaseInvokeAsync(async() =>
            {
                var query = DbContext.Tags
                            .AsQueryable()
                            .Where(x => tagIds.Contains(x.Id))
                            .Select(x => Mapper.Map <Tag, TagResponse>(x));

                return ServerResponseBuilder.Build(await query.ToListAsync());
            }));
        }
示例#12
0
        public async Task <ServerResponse <bool> > CreateFeedAsync(Feed entity)
        {
            return(await BaseInvokeWithTryCatchAsync(async() =>
            {
                entity.Id = Guid.NewGuid();
                entity.CreateDate = DateTime.Now;
                entity.LastModifiedDate = entity.CreateDate;
                await DbContext.Feeds.AddAsync(entity);

                return ServerResponseBuilder.Build(true);
            }));
        }
示例#13
0
        public async Task <ServerResponse <long> > CreateMhTaskAsync(MhTaskRequest mhTaskRequest, MhTask parentMhTask = null)
        {
            return(await BaseInvokeAsync(async() =>
            {
                var mhTask = new MhTask
                {
                    Name = mhTaskRequest.Name,
                    Description = mhTaskRequest.Description,
                    StartDate = mhTaskRequest.StartDate >= DateTime.Now ? mhTaskRequest.StartDate : DateTime.Now,
                    IsRecurring = mhTaskRequest.IsRecurring,
                    VisibleType = mhTaskRequest.VisibleType,
                    AppUserId = mhTaskRequest.AppUserId
                };

                if (parentMhTask != null)
                {
                    mhTask.Parent = parentMhTask;
                }

                await DbContext.MhTasks.AddAsync(mhTask);

                if (mhTaskRequest.IsRecurring)
                {
                    var scheduleMhTask = new ScheduleMhTask
                    {
                        MhTask = mhTask,
                        MaxCount = mhTaskRequest.ScheduleMhTaskViewModel.MaxCount ?? 0,
                        ScheduleMhTaskType = mhTaskRequest.ScheduleMhTaskViewModel.ScheduleMhTaskType
                    };

                    await DbContext.ScheduleMhTasks.AddAsync(scheduleMhTask);
                }

                if (mhTaskRequest.TagIds.Any())
                {
                    var mhTaskTags = mhTaskRequest.TagIds
                                     .Join(DbContext.Tags, o => o, i => i.Id, (o, i) => i)
                                     .Select(x => new MhTaskTag
                    {
                        MhTask = mhTask,
                        Tag = x
                    });

                    await DbContext.MhTaskTags.AddRangeAsync(mhTaskTags);
                }

                await AddToUpdateMhTask(DbContext, mhTask, Constants.Updates.CreateMhTask);
                await DbContext.SaveChangesAsync();

                return ServerResponseBuilder.Build(mhTask.Id);
            }, mhTaskRequest));
        }
示例#14
0
        public async Task <ServerResponse <List <long> > > GetFriendIds(long appUserId)
        {
            return(await BaseInvokeWithTryCatchAsync(async() =>
            {
                var friendIds = DbContext.Friends
                                .AsQueryable()
                                .Where(x => x.FriendRequestFlag == EFriendRequestFlag.Approved &&
                                       (x.RequestedById == appUserId || x.RequestedToId == appUserId))
                                .Select(x => x.RequestedById == appUserId ? x.RequestedToId : x.RequestedById);

                return ServerResponseBuilder.Build(await friendIds.ToListAsync());
            }));
        }
示例#15
0
        public async Task <ServerResponse <bool> > DeleteFeedAsync(Feed entity)
        {
            return(await BaseInvokeWithTryCatchAsync(async() =>
            {
                var feed = await DbContext.Feeds
                           .AsQueryable()
                           .FirstOrDefaultAsync(x =>
                                                x.AppUserId == entity.AppUserId && x.FeedId == entity.FeedId);

                DbContext.Feeds.Remove(feed);

                return await Task.FromResult(ServerResponseBuilder.Build(true));
            }));
        }
示例#16
0
        public async Task <ServerResponse <bool> > CreateTagAsync(TagRequest tagRequest)
        {
            return(await BaseInvokeAsync(async() =>
            {
                var tag = new DAL.Entities.Tag
                {
                    Name = tagRequest.Name
                };

                await DbContext.Tags.AddAsync(tag);
                await DbContext.SaveChangesAsync();

                return ServerResponseBuilder.Build(true);
            }, tagRequest));
        }
示例#17
0
        public async Task <ServerResponse <NoteResponse> > GetNoteAsync(long accountId, long id)
        {
            return(await BaseInvokeAsync(async() =>
            {
                var note = await DbContext.Notes
                           .AsQueryable()
                           .FirstOrDefaultAsync(x => x.Id == id && x.AppUserId == accountId);

                if (note == null)
                {
                    throw new NotFoundException(Constants.Errors.NoteNotExists);
                }

                return ServerResponseBuilder.Build(Mapper.Map <Note, NoteResponse>(note));
            }));
        }
示例#18
0
        public async Task <ServerResponse <MhTaskResponse> > GetMhTaskAsync(long accountId, long id)
        {
            return(await BaseInvokeAsync(async() =>
            {
                var mhTask = await DbContext.MhTasks
                             .AsQueryable()
                             .FirstOrDefaultAsync(x => x.Id == id && x.AppUserId == accountId);

                if (mhTask == null)
                {
                    throw new NotFoundException(Constants.Errors.TaskNotExists);
                }

                return ServerResponseBuilder.Build(Mapper.Map <MhTask, MhTaskResponse>(mhTask));
            }));
        }
示例#19
0
        public async Task <ServerResponse <bool> > UpdateFeedAsync(Feed entity)
        {
            return(await BaseInvokeWithTryCatchAsync(async() =>
            {
                var feed = await DbContext.Feeds
                           .AsQueryable()
                           .FirstOrDefaultAsync(x =>
                                                x.AppUserId == entity.AppUserId && x.FeedId == entity.FeedId);

                feed.FeedData = entity.FeedData;
                feed.LastModifiedDate = DateTime.Now;

                DbContext.Feeds.Update(feed);

                return ServerResponseBuilder.Build(true);
            }));
        }
示例#20
0
        public async Task <ServerResponse <bool> > DeleteTagAsync(long id)
        {
            return(await BaseInvokeAsync(async() =>
            {
                var tag = await DbContext.Tags
                          .AsQueryable()
                          .FirstOrDefaultAsync(x => x.Id == id);

                if (tag == null)
                {
                    throw new NotFoundException(Constants.Errors.TagNotExists);
                }

                DbContext.Tags.Remove(tag);
                await DbContext.SaveChangesAsync();

                return ServerResponseBuilder.Build(true);
            }));
        }
示例#21
0
        public async Task <ServerResponse <List <NoteResponse> > > GetNotesAsync(long accountId, NoteFilterRequest noteFilterRequest)
        {
            return(await BaseInvokeAsync(async() =>
            {
                var query = DbContext.Notes
                            .AsQueryable()
                            .Include(x => x.NoteTags)
                            .ThenInclude(e => e.Tag)
                            .Where(x => x.AppUserId == accountId);

                query = FilterNotes(query, noteFilterRequest);

                query = query.OrderByDescending(x => x.Id);

                query = FetchItems(query, noteFilterRequest);

                return ServerResponseBuilder.Build(await query.ToAsyncEnumerable()
                                                   .Select(x => Mapper.Map <Note, NoteResponse>(x)).ToListAsync());
            }));
        }
示例#22
0
        public async Task <ServerResponse <bool> > DeleteFriendAsync(long accountId, long personId)
        {
            return(await BaseInvokeAsync(async() =>
            {
                var friends = DbContext.Friends
                              .AsQueryable()
                              .Where(x => (x.RequestedById == accountId && x.RequestedToId == personId) ||
                                     (x.RequestedById == personId && x.RequestedToId == accountId));

                if (!friends.Any())
                {
                    throw new NotFoundException(Constants.Errors.FriendNotExists);
                }

                DbContext.Friends.RemoveRange(friends);
                await DbContext.SaveChangesAsync();

                return ServerResponseBuilder.Build(true);
            }));
        }
示例#23
0
        public async Task <ServerResponse <List <FriendViewModel> > > GetFriendsByRequestFlag(
            long accountId, EFriendRequestFlag eFriendRequestFlag, FriendFilterRequest friendFilterRequest)
        {
            return(await BaseInvokeAsync(async() =>
            {
                var friends = DbContext.Friends
                              .Include(x => x.RequestedBy)
                              .Include(x => x.RequestedTo)
                              .Where(x =>
                                     (x.RequestedById == accountId || x.RequestedToId == accountId) &&
                                     x.FriendRequestFlag == eFriendRequestFlag);

                friends = FilterFriends(friends, accountId, friendFilterRequest);

                friends = friends.OrderByDescending(x => x.RequestTime);

                friends = FetchItems(friends, friendFilterRequest);

                return await Task.FromResult(ServerResponseBuilder.Build(friends.MapFriendsToViewModels(accountId)));
            }));
        }
示例#24
0
        public async Task <ServerResponse <bool> > UpdateTagAsync(TagRequest tagRequest)
        {
            return(await BaseInvokeAsync(async() =>
            {
                var tag = await DbContext.Tags
                          .AsQueryable()
                          .FirstOrDefaultAsync(x => x.Id == tagRequest.Id);

                if (tag == null)
                {
                    throw new NotFoundException(Constants.Errors.TagNotExists);
                }

                tag.Name = tagRequest.Name;
                DbContext.Tags.Update(tag);

                await DbContext.SaveChangesAsync();

                return ServerResponseBuilder.Build(true);
            }));
        }
示例#25
0
        public async Task <ServerResponse <List <MhTaskResponse> > > GetMhTasksAsync(long accountId, MhTaskFilterRequest mhTaskFilterRequest)
        {
            return(await BaseInvokeAsync(async() =>
            {
                var query = DbContext.MhTasks
                            .AsQueryable()
                            .Include(x => x.ScheduleMhTask)
                            .Include(x => x.MhTaskTags)
                            .ThenInclude(e => e.Tag)
                            .Where(x => x.MhTaskState != EMhTaskState.Delete && x.AppUserId == accountId);

                query = FilterMhTasks(query, mhTaskFilterRequest);

                query = query.OrderBy(x => x.StartDate);

                query = FetchItems(query, mhTaskFilterRequest);

                return ServerResponseBuilder.Build(await query.ToAsyncEnumerable()
                                                   .Select(x => Mapper.Map <MhTask, MhTaskResponse>(x)).ToListAsync());
            }));
        }
示例#26
0
        public async Task <ServerResponse <bool> > DeleteMhTaskAsync(long id)
        {
            return(await BaseInvokeAsync(async() =>
            {
                var mhTask = await DbContext.MhTasks
                             .AsQueryable()
                             .FirstOrDefaultAsync(x => x.Id == id);

                if (mhTask == null)
                {
                    throw new NotFoundException(Constants.Errors.TaskNotExists);
                }

                mhTask.MhTaskState = EMhTaskState.Delete;

                DbContext.MhTasks.Update(mhTask);
                await AddToUpdateMhTask(DbContext, mhTask, Constants.Updates.DeleteMhTask);
                await DbContext.SaveChangesAsync();

                return ServerResponseBuilder.Build(true);
            }));
        }
示例#27
0
        public async Task <ServerResponse <bool> > UpdateNoteAsync(NoteRequest noteRequest)
        {
            return(await BaseInvokeAsync(async() =>
            {
                Note note = await DbContext.Notes
                            .AsQueryable()
                            .FirstOrDefaultAsync(x => x.Id == noteRequest.Id);

                if (note == null)
                {
                    throw new NotFoundException(Constants.Errors.NoteNotExists);
                }

                note.Name = noteRequest.Name;
                note.Description = noteRequest.Description;
                note.VisibleType = noteRequest.VisibleType;
                note.UpdateDate = DateTime.Now;

                DbContext.Notes.Update(note);

                var noteTags = await DbContext.NoteTags
                               .AsQueryable()
                               .Where(x => x.NoteId == note.Id).ToListAsync();
                DbContext.NoteTags
                .RemoveRange(noteTags.Where(x => !noteRequest.TagIds.Contains(x.TagId)));

                await DbContext.NoteTags.AddRangeAsync(
                    noteRequest.TagIds
                    .Join(DbContext.Tags, o => o, i => i.Id, (o, i) => i)
                    .Where(x => !noteTags.Select(y => y.TagId).Contains(x.Id))
                    .Select(x => new NoteTag {
                    Tag = x, Note = note
                }));

                await DbContext.SaveChangesAsync();

                return ServerResponseBuilder.Build(true);
            }, noteRequest));
        }
示例#28
0
        public async Task <ServerResponse <List <FriendViewModel> > > GetSearchFriendsAsync(long accountId, FriendFilterRequest friendFilterRequest)
        {
            return(await BaseInvokeAsync(async() =>
            {
                var friends = DbContext.Friends
                              .AsQueryable()
                              .Where(x => x.RequestedById == accountId || x.RequestedToId == accountId)
                              .Select(x => x.RequestedById == accountId ? x.RequestedToId : x.RequestedById);

                var searchFriends = DbContext.AppUsers
                                    .AsQueryable()
                                    .Where(x => !friends.Contains(x.Id) && x.Id != accountId);

                searchFriends = FilterSearchFriends(searchFriends, friendFilterRequest);

                searchFriends = searchFriends.OrderByDescending(x => x.CreatedDate);

                searchFriends = FetchItems(searchFriends, friendFilterRequest);

                return ServerResponseBuilder.Build(await searchFriends.ToAsyncEnumerable()
                                                   .Select(x => Mapper.Map <AppUser, FriendViewModel>(x)).ToListAsync());
            }));
        }
示例#29
0
        public async Task <ServerResponse <bool> > CancelFriendAsync(long accountId, long personId)
        {
            return(await BaseInvokeAsync(async() =>
            {
                var friend = DbContext.Friends.FirstOrDefault(x =>
                                                              (x.RequestedById == accountId && x.RequestedToId == personId) ||
                                                              (x.RequestedById == personId && x.RequestedToId == accountId));

                if (friend == null)
                {
                    throw new NotFoundException(Constants.Errors.FriendNotExists);
                }

                if (friend.FriendRequestFlag != EFriendRequestFlag.Approved)
                {
                    throw new ConflictException(Constants.Errors.FriendNotApproved);
                }

                friend.FriendRequestFlag = EFriendRequestFlag.None;
                await DbContext.SaveChangesAsync();

                return ServerResponseBuilder.Build(true);
            }));
        }
示例#30
0
        public async Task <ServerResponse <bool> > UpdateMhTaskAsync(MhTaskRequest mhTaskRequest)
        {
            return(await BaseInvokeAsync(async() =>
            {
                MhTask mhTask;

                if (mhTaskRequest.IsRecurring)
                {
                    mhTask = await DbContext.MhTasks.Include(x => x.ScheduleMhTask)
                             .FirstOrDefaultAsync(x => x.Id == mhTaskRequest.Id);
                }
                else
                {
                    mhTask = await DbContext.MhTasks
                             .AsQueryable()
                             .FirstOrDefaultAsync(x => x.Id == mhTaskRequest.Id);
                }

                if (mhTask == null)
                {
                    throw new NotFoundException(Constants.Errors.TaskNotExists);
                }

                if (mhTask.MhTaskState == EMhTaskState.ReSchedule)
                {
                    throw new ConflictException(Constants.Errors.TaskReSheduleCannotBeUpdated);
                }

                mhTask.Name = mhTaskRequest.Name;
                mhTask.Description = mhTaskRequest.Description;
                mhTask.StartDate = mhTaskRequest.StartDate;
                mhTask.IsRecurring = mhTaskRequest.IsRecurring;
                mhTask.VisibleType = mhTaskRequest.VisibleType;

                if (mhTaskRequest.IsRecurring)
                {
                    if (mhTask.ScheduleMhTask == null)
                    {
                        mhTask.ScheduleMhTask = new ScheduleMhTask();
                    }

                    mhTask.ScheduleMhTask.MaxCount = mhTaskRequest.ScheduleMhTaskViewModel.MaxCount ?? 0;
                    mhTask.ScheduleMhTask.ScheduleMhTaskType = mhTaskRequest.ScheduleMhTaskViewModel.ScheduleMhTaskType;
                }

                DbContext.MhTasks.Update(mhTask);

                var mhTaskTags = await DbContext.MhTaskTags
                                 .AsQueryable()
                                 .Where(x => x.MhTaskId == mhTask.Id).ToListAsync();
                DbContext.MhTaskTags.RemoveRange(mhTaskTags.Where(x => !mhTaskRequest.TagIds.Contains(x.TagId)));

                await DbContext.MhTaskTags.AddRangeAsync(
                    mhTaskRequest.TagIds
                    .Join(DbContext.Tags, o => o, i => i.Id, (o, i) => i)
                    .Where(x => !mhTaskTags.Select(y => y.TagId).Contains(x.Id))
                    .Select(x => new MhTaskTag {
                    Tag = x, MhTask = mhTask
                }));

                await AddToUpdateMhTask(DbContext, mhTask, Constants.Updates.UpdateEntireMhTask);
                await DbContext.SaveChangesAsync();

                return ServerResponseBuilder.Build(true);
            }, mhTaskRequest));
        }