generated from VLADIMIR/template
108 lines
3.2 KiB
Go
108 lines
3.2 KiB
Go
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
|
|
}
|