Exemple #1
0
        public async Task <Result <TicketTask> > AddTaskAsync(TicketTask task)
        {
            await using var context = Context;

            Ticket ticket = context.Tickets
                            .Include(t => t.CorrespondingProject)
                            .FirstOrDefault(t => t.TicketId == task.TicketId);

            if (ticket != null)
            {
                User notifier = await context.Users.FindAsync(UserId);

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

                var notificationBuilder = new NotificationBuilder(notifier, usersToNotify);
                IReadOnlyCollection <Notification> notifications =
                    notificationBuilder.BuildTaskCreateNotifications(ticket.CorrespondingProject, ticket, task);

                await context.Notifications.AddRangeAsync(notifications);
            }

            await context.Tasks.AddAsync(task);

            await context.SaveChangesAsync();

            return(new Result <TicketTask> {
                Payload = task, ResultType = ResultType.Ok
            });
        }
Exemple #2
0
        public async Task <Result <string> > DeleteTaskAsync(int taskId)
        {
            await using var context = Context;

            TicketTask task = await context.Tasks.FindAsync(taskId);

            Ticket ticket = context.Tickets
                            .Include(t => t.CorrespondingProject)
                            .FirstOrDefault(t => t.TicketId == task.TicketId);

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

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

            var notificationBuilder = new NotificationBuilder(notifier, usersToNotify);
            IReadOnlyCollection <Notification> notifications =
                notificationBuilder.BuildTaskDeleteNotifications(ticket.CorrespondingProject, ticket, task);

            TicketTask correspondingTask = await context.Tasks.FindAsync(taskId);

            if (correspondingTask == null)
            {
                return(new Result <string> {
                    ResultType = ResultType.NotFound, Message = "No task to delete."
                });
            }

            await context.Notifications.AddRangeAsync(notifications);

            context.Tasks.Remove(correspondingTask);
            await context.SaveChangesAsync();

            return(new Result <string> {
                ResultType = ResultType.Ok, Message = "Deleted"
            });
        }
Exemple #3
0
        public async Task <Result <TicketTask> > ModifyTaskAsync(TicketTask task)
        {
            await using var context = Context;

            if (!context.Tasks.Any(t => t.TaskId == task.TaskId))
            {
                return(new Result <TicketTask> {
                    ResultType = ResultType.NotFound, Message = "No task to update."
                });
            }

            Ticket ticket = context.Tickets
                            .Include(t => t.CorrespondingProject)
                            .FirstOrDefault(t => t.TicketId == task.TicketId);

            if (task.Done && ticket != null)
            {
                User notifier = await context.Users.FindAsync(UserId);

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

                var notificationBuilder = new NotificationBuilder(notifier, usersToNotify);
                IReadOnlyCollection <Notification> notifications =
                    notificationBuilder.BuildTaskModifyNotifications(ticket.CorrespondingProject, ticket, task);

                await context.Notifications.AddRangeAsync(notifications);
            }

            context.Tasks.Update(task);
            await context.SaveChangesAsync();

            return(new Result <TicketTask> {
                ResultType = ResultType.Ok, Payload = task
            });
        }
        public IReadOnlyCollection <Notification> BuildTaskDeleteNotifications(Project project, Ticket ticket, TicketTask task)
        {
            var notifications = new List <Notification>();

            foreach (User observer in _observers)
            {
                var notification = new Notification
                {
                    CreatedDate = DateTime.Now,
                    Title       = "Подзадача удалена",
                    Message     = $"{project.Name}: {_notifier.FirstName} {_notifier.LastName} удалил подзадачу {task.Title} в задаче {ticket.Title}.",
                    RecipientId = observer.UserId,
                };
                notifications.Add(notification);
            }

            return(notifications);
        }