197 lines
5.6 KiB
Go
197 lines
5.6 KiB
Go
package controller
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/kandev/kandev/internal/task/dto"
|
|
"github.com/kandev/kandev/internal/task/service"
|
|
)
|
|
|
|
type BoardController struct {
|
|
service *service.Service
|
|
}
|
|
|
|
func NewBoardController(svc *service.Service) *BoardController {
|
|
return &BoardController{service: svc}
|
|
}
|
|
|
|
func (c *BoardController) ListBoards(ctx context.Context, req dto.ListBoardsRequest) (dto.ListBoardsResponse, error) {
|
|
boards, err := c.service.ListBoards(ctx, req.WorkspaceID)
|
|
if err != nil {
|
|
return dto.ListBoardsResponse{}, err
|
|
}
|
|
resp := dto.ListBoardsResponse{
|
|
Boards: make([]dto.BoardDTO, 0, len(boards)),
|
|
Total: len(boards),
|
|
}
|
|
for _, board := range boards {
|
|
resp.Boards = append(resp.Boards, dto.FromBoard(board))
|
|
}
|
|
return resp, nil
|
|
}
|
|
|
|
func (c *BoardController) GetBoard(ctx context.Context, req dto.GetBoardRequest) (dto.BoardDTO, error) {
|
|
board, err := c.service.GetBoard(ctx, req.ID)
|
|
if err != nil {
|
|
return dto.BoardDTO{}, err
|
|
}
|
|
return dto.FromBoard(board), nil
|
|
}
|
|
|
|
func (c *BoardController) CreateBoard(ctx context.Context, req dto.CreateBoardRequest) (dto.BoardDTO, error) {
|
|
board, err := c.service.CreateBoard(ctx, &service.CreateBoardRequest{
|
|
WorkspaceID: req.WorkspaceID,
|
|
Name: req.Name,
|
|
Description: req.Description,
|
|
})
|
|
if err != nil {
|
|
return dto.BoardDTO{}, err
|
|
}
|
|
return dto.FromBoard(board), nil
|
|
}
|
|
|
|
func (c *BoardController) UpdateBoard(ctx context.Context, req dto.UpdateBoardRequest) (dto.BoardDTO, error) {
|
|
board, err := c.service.UpdateBoard(ctx, req.ID, &service.UpdateBoardRequest{
|
|
Name: req.Name,
|
|
Description: req.Description,
|
|
})
|
|
if err != nil {
|
|
return dto.BoardDTO{}, err
|
|
}
|
|
return dto.FromBoard(board), nil
|
|
}
|
|
|
|
func (c *BoardController) DeleteBoard(ctx context.Context, req dto.DeleteBoardRequest) (dto.SuccessResponse, error) {
|
|
if err := c.service.DeleteBoard(ctx, req.ID); err != nil {
|
|
return dto.SuccessResponse{}, err
|
|
}
|
|
return dto.SuccessResponse{Success: true}, nil
|
|
}
|
|
|
|
func (c *BoardController) ListColumns(ctx context.Context, req dto.ListColumnsRequest) (dto.ListColumnsResponse, error) {
|
|
columns, err := c.service.ListColumns(ctx, req.BoardID)
|
|
if err != nil {
|
|
return dto.ListColumnsResponse{}, err
|
|
}
|
|
resp := dto.ListColumnsResponse{
|
|
Columns: make([]dto.ColumnDTO, 0, len(columns)),
|
|
Total: len(columns),
|
|
}
|
|
for _, column := range columns {
|
|
resp.Columns = append(resp.Columns, dto.FromColumn(column))
|
|
}
|
|
return resp, nil
|
|
}
|
|
|
|
func (c *BoardController) GetColumn(ctx context.Context, req dto.GetColumnRequest) (dto.ColumnDTO, error) {
|
|
column, err := c.service.GetColumn(ctx, req.ID)
|
|
if err != nil {
|
|
return dto.ColumnDTO{}, err
|
|
}
|
|
return dto.FromColumn(column), nil
|
|
}
|
|
|
|
func (c *BoardController) CreateColumn(ctx context.Context, req dto.CreateColumnRequest) (dto.ColumnDTO, error) {
|
|
column, err := c.service.CreateColumn(ctx, &service.CreateColumnRequest{
|
|
BoardID: req.BoardID,
|
|
Name: req.Name,
|
|
Position: req.Position,
|
|
State: req.State,
|
|
Color: req.Color,
|
|
})
|
|
if err != nil {
|
|
return dto.ColumnDTO{}, err
|
|
}
|
|
return dto.FromColumn(column), nil
|
|
}
|
|
|
|
func (c *BoardController) UpdateColumn(ctx context.Context, req dto.UpdateColumnRequest) (dto.ColumnDTO, error) {
|
|
column, err := c.service.UpdateColumn(ctx, req.ID, &service.UpdateColumnRequest{
|
|
Name: req.Name,
|
|
Position: req.Position,
|
|
State: req.State,
|
|
Color: req.Color,
|
|
})
|
|
if err != nil {
|
|
return dto.ColumnDTO{}, err
|
|
}
|
|
return dto.FromColumn(column), nil
|
|
}
|
|
|
|
func (c *BoardController) DeleteColumn(ctx context.Context, req dto.GetColumnRequest) error {
|
|
return c.service.DeleteColumn(ctx, req.ID)
|
|
}
|
|
|
|
func (c *BoardController) GetSnapshot(ctx context.Context, req dto.GetBoardSnapshotRequest) (dto.BoardSnapshotDTO, error) {
|
|
board, err := c.service.GetBoard(ctx, req.BoardID)
|
|
if err != nil {
|
|
return dto.BoardSnapshotDTO{}, err
|
|
}
|
|
columns, err := c.service.ListColumns(ctx, req.BoardID)
|
|
if err != nil {
|
|
return dto.BoardSnapshotDTO{}, err
|
|
}
|
|
tasks, err := c.service.ListTasks(ctx, req.BoardID)
|
|
if err != nil {
|
|
return dto.BoardSnapshotDTO{}, err
|
|
}
|
|
|
|
resp := dto.BoardSnapshotDTO{
|
|
Board: dto.FromBoard(board),
|
|
Columns: make([]dto.ColumnDTO, 0, len(columns)),
|
|
Tasks: make([]dto.TaskDTO, 0, len(tasks)),
|
|
}
|
|
for _, column := range columns {
|
|
resp.Columns = append(resp.Columns, dto.FromColumn(column))
|
|
}
|
|
for _, task := range tasks {
|
|
resp.Tasks = append(resp.Tasks, dto.FromTask(task))
|
|
}
|
|
return resp, nil
|
|
}
|
|
|
|
func (c *BoardController) GetWorkspaceSnapshot(ctx context.Context, req dto.GetWorkspaceBoardSnapshotRequest) (dto.BoardSnapshotDTO, error) {
|
|
boardID := req.BoardID
|
|
if boardID == "" {
|
|
boards, err := c.service.ListBoards(ctx, req.WorkspaceID)
|
|
if err != nil {
|
|
return dto.BoardSnapshotDTO{}, err
|
|
}
|
|
if len(boards) == 0 {
|
|
return dto.BoardSnapshotDTO{}, fmt.Errorf("no boards found for workspace: %s", req.WorkspaceID)
|
|
}
|
|
boardID = boards[0].ID
|
|
}
|
|
|
|
board, err := c.service.GetBoard(ctx, boardID)
|
|
if err != nil {
|
|
return dto.BoardSnapshotDTO{}, err
|
|
}
|
|
if board.WorkspaceID != req.WorkspaceID {
|
|
return dto.BoardSnapshotDTO{}, fmt.Errorf("board does not belong to workspace: %s", req.WorkspaceID)
|
|
}
|
|
|
|
columns, err := c.service.ListColumns(ctx, boardID)
|
|
if err != nil {
|
|
return dto.BoardSnapshotDTO{}, err
|
|
}
|
|
tasks, err := c.service.ListTasks(ctx, boardID)
|
|
if err != nil {
|
|
return dto.BoardSnapshotDTO{}, err
|
|
}
|
|
|
|
resp := dto.BoardSnapshotDTO{
|
|
Board: dto.FromBoard(board),
|
|
Columns: make([]dto.ColumnDTO, 0, len(columns)),
|
|
Tasks: make([]dto.TaskDTO, 0, len(tasks)),
|
|
}
|
|
for _, column := range columns {
|
|
resp.Columns = append(resp.Columns, dto.FromColumn(column))
|
|
}
|
|
for _, task := range tasks {
|
|
resp.Tasks = append(resp.Tasks, dto.FromTask(task))
|
|
}
|
|
return resp, nil
|
|
}
|