Пример #1
0
        public async Task <Result <Ticket> > UpdateOrCreateTicketAsync(Ticket ticket)
        {
            await using var context = Context;

            Project project = await context.Projects.FindAsync(ticket.ProjectId);

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

            bool userHasAccess = context.Members.Any(member => member.ProjectId == project.ProjectId && member.UserId == UserId);

            if (!userHasAccess)
            {
                return(new Result <Ticket>
                {
                    ResultType = ResultType.Forbidden,
                    Message = "Sorry, but you don't have permission to update this ticket",
                });
            }

            User user = await context.Users.FindAsync(UserId);

            IReadOnlyCollection <User> members =
                await context.Members
                .Where(member => member.ProjectId == project.ProjectId)
                .Include(member => member.CorrespondingUser)
                .Select(member => member.CorrespondingUser)
                .ToListAsync();

            var notificationsBuilder = new NotificationBuilder(user, members);

            if (ticket.TicketId != 0 && context.Tickets.Any(t => t.TicketId == ticket.TicketId))
            {
                if (ticket.AssigneeId == 0)
                {
                    ticket.AssigneeId = null;
                }
                context.Tickets.Update(ticket);
                await context.Notifications.AddRangeAsync(notificationsBuilder.BuildTicketUpdateNotifications(project, ticket));
            }
            else
            {
                await context.Tickets.AddAsync(ticket);

                await context.Notifications.AddRangeAsync(notificationsBuilder.BuildTicketCreateNotifications(project));
            }

            await context.SaveChangesAsync();

            return(new Result <Ticket> {
                ResultType = ResultType.Ok, Payload = ticket
            });
        }