Пример #1
0
        public async Task <Result <Member> > CreateMemberAsync(string email, int projectId)
        {
            await using var context = Context;

            User user = context.Users.FirstOrDefault(u => u.EmailAddress == email);

            if (user == null)
            {
                return(new Result <Member> {
                    ResultType = ResultType.NotFound, Message = "User not found"
                });
            }

            Project project = await context.Projects.FindAsync(projectId);

            if (project == null)
            {
                return(new Result <Member> {
                    ResultType = ResultType.NotFound, Message = "Corresponding project not found."
                });
            }

            bool userHavePermission = context.Members
                                      .Any(m => m.UserId == _userId && m.ProjectId == projectId && (m.Role == MemberRole.Admin || m.Role == MemberRole.Owner));

            if (!userHavePermission)
            {
                return(new Result <Member> {
                    ResultType = ResultType.Forbidden, Message = "You don't have permission."
                });
            }

            var member = new Member {
                ProjectId = projectId, UserId = user.UserId, Role = MemberRole.Member
            };

            if (context.Members.Any(m => m.ProjectId == projectId && m.UserId == user.UserId))
            {
                return(new Result <Member> {
                    ResultType = ResultType.Bad, Message = "Already a member."
                });
            }

            User notifier = await context.Users.FindAsync(_userId);

            var usersToNotify = new List <User> {
                user
            };
            var notificationBuilder = new NotificationBuilder(notifier, usersToNotify);
            IReadOnlyCollection <Notification> notifications = notificationBuilder.BuildInvitations(project);

            await context.Notifications.AddRangeAsync(notifications);

            await context.Members.AddAsync(member);

            await context.SaveChangesAsync();

            return(new Result <Member> {
                ResultType = ResultType.Created, Payload = member
            });
        }