package app import ( "context" "evening_detective_server/internal/modules/roles" proto "evening_detective_server/proto" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) func taskActor(ctx context.Context) (int, error) { claims, err := claimsFromContext(ctx) if err != nil { return 0, err } if !roles.HasRole(claims, roles.Developer) { return 0, status.Error(codes.PermissionDenied, "Нет доступа к задачам") } return claims.UserID, nil } func (s *server) GetTasks(ctx context.Context, _ *proto.GetTasksReq) (*proto.GetTasksRsp, error) { if _, err := taskActor(ctx); err != nil { return nil, err } tasks, err := s.taskService.List(ctx) if err != nil { return nil, taskErrorStatus(err) } result := &proto.GetTasksRsp{Tasks: make([]*proto.DeveloperTask, 0, len(tasks))} for _, task := range tasks { result.Tasks = append(result.Tasks, mapTask(task)) } return result, nil } func (s *server) GetTaskAssignees(ctx context.Context, _ *proto.GetTaskAssigneesReq) (*proto.GetTaskAssigneesRsp, error) { if _, err := taskActor(ctx); err != nil { return nil, err } users, err := s.taskService.ListAssignees(ctx) if err != nil { return nil, taskErrorStatus(err) } result := &proto.GetTaskAssigneesRsp{Assignees: make([]*proto.TaskAssignee, 0, len(users))} for _, user := range users { result.Assignees = append(result.Assignees, mapTaskAssignee(user)) } return result, nil } func (s *server) CreateTask(ctx context.Context, req *proto.CreateTaskReq) (*proto.TaskRsp, error) { actorID, err := taskActor(ctx) if err != nil { return nil, err } task, err := taskInput(req.GetTitle(), req.GetDescription(), req.GetStatus(), req.AssigneeID, req.GetDueDate()) if err != nil { return nil, taskErrorStatus(err) } task.AuthorID = &actorID result, err := s.taskService.Create(ctx, task) if err != nil { return nil, taskErrorStatus(err) } return &proto.TaskRsp{Task: mapTask(result)}, nil } func (s *server) UpdateTask(ctx context.Context, req *proto.UpdateTaskReq) (*proto.TaskRsp, error) { if _, err := taskActor(ctx); err != nil { return nil, err } task, err := taskInput(req.GetTitle(), req.GetDescription(), req.GetStatus(), req.AssigneeID, req.GetDueDate()) if err != nil { return nil, taskErrorStatus(err) } task.ID = int(req.GetID()) task.Version = int(req.GetVersion()) result, err := s.taskService.Update(ctx, task) if err != nil { return nil, taskErrorStatus(err) } return &proto.TaskRsp{Task: mapTask(result)}, nil } func (s *server) SetTaskStatus(ctx context.Context, req *proto.SetTaskStatusReq) (*proto.TaskRsp, error) { if _, err := taskActor(ctx); err != nil { return nil, err } result, err := s.taskService.SetStatus(ctx, int(req.GetID()), int(req.GetVersion()), req.GetStatus()) if err != nil { return nil, taskErrorStatus(err) } return &proto.TaskRsp{Task: mapTask(result)}, nil } func (s *server) DeleteTask(ctx context.Context, req *proto.DeleteTaskReq) (*proto.DeleteTaskRsp, error) { if _, err := taskActor(ctx); err != nil { return nil, err } if err := s.taskService.Delete(ctx, int(req.GetID()), int(req.GetVersion())); err != nil { return nil, taskErrorStatus(err) } return &proto.DeleteTaskRsp{}, nil }