This commit is contained in:
2026-10-07 23:09:17 +07:00
parent e0caa0b409
commit 56bc009311
21 changed files with 3310 additions and 221 deletions
+107
View File
@@ -0,0 +1,107 @@
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
}