Files
tm_back/internal/kanban/form.go
T
2026-01-05 15:36:20 +03:30

177 lines
7.0 KiB
Go

package kanban
import "tm/pkg/response"
// CreateBoardRequest represents a request to create a new kanban board
type CreateBoardRequest struct {
Name string `json:"name" valid:"required~Board name is required,stringlength(1|100)~Board name must be between 1 and 100 characters"`
Description string `json:"description" valid:"stringlength(0|500)~Description must not exceed 500 characters"`
IsDefault bool `json:"is_default"`
UserID string `json:"-"` // Set from context/auth middleware
}
// UpdateBoardRequest represents a request to update an existing board
type UpdateBoardRequest struct {
ID string `json:"id" valid:"required~Board ID is required"`
Name *string `json:"name,omitempty" valid:"stringlength(1|100)~Board name must be between 1 and 100 characters"`
Description *string `json:"description,omitempty" valid:"stringlength(0|500)~Description must not exceed 500 characters"`
IsDefault *bool `json:"is_default,omitempty"`
}
// CreateColumnRequest represents a request to create a new column
type CreateColumnRequest struct {
BoardID string `json:"board_id" valid:"required~Board ID is required"`
Name string `json:"name" valid:"required~Column name is required,stringlength(1|50)~Column name must be between 1 and 50 characters"`
Color string `json:"color" valid:"hexcolor~Color must be a valid hex color"`
Order int `json:"order"`
Limit *int `json:"limit,omitempty" valid:"range(1|100)~WIP limit must be between 1 and 100"`
}
// UpdateColumnRequest represents a request to update an existing column
type UpdateColumnRequest struct {
ID string `json:"id" valid:"required~Column ID is required"`
Name *string `json:"name,omitempty" valid:"stringlength(1|50)~Column name must be between 1 and 50 characters"`
Color *string `json:"color,omitempty" valid:"hexcolor~Color must be a valid hex color"`
Order *int `json:"order,omitempty"`
Limit *int `json:"limit,omitempty" valid:"range(1|100)~WIP limit must be between 1 and 100"`
}
// CreateCardRequest represents a request to create a new card
type CreateCardRequest struct {
ColumnID string `json:"column_id" valid:"required~Column ID is required"`
TenderID string `json:"tender_id" valid:"required~Tender ID is required"`
Title string `json:"title" valid:"required~Title is required,stringlength(1|200)~Title must be between 1 and 200 characters"`
Order int `json:"order"`
Priority CardPriority `json:"priority"`
Labels []string `json:"labels,omitempty"`
DueDate *int64 `json:"due_date,omitempty"` // Unix timestamp
}
// UpdateCardRequest represents a request to update an existing card
type UpdateCardRequest struct {
ID string `json:"id" valid:"required~Card ID is required"`
Title *string `json:"title,omitempty" valid:"stringlength(1|200)~Title must be between 1 and 200 characters"`
Priority *CardPriority `json:"priority,omitempty"`
Labels []string `json:"labels,omitempty"`
DueDate *int64 `json:"due_date,omitempty"` // Unix timestamp
}
// MoveCardRequest represents a request to move a card to a different column
type MoveCardRequest struct {
CardID string `json:"card_id" valid:"required~Card ID is required"`
ColumnID string `json:"column_id" valid:"required~Column ID is required"`
NewOrder int `json:"new_order"`
}
// ReorderCardsRequest represents a request to reorder cards within a column
type ReorderCardsRequest struct {
ColumnID string `json:"column_id" valid:"required~Column ID is required"`
CardOrders map[string]int `json:"card_orders" valid:"required~Card orders are required"`
}
// ReorderColumnsRequest represents a request to reorder columns within a board
type ReorderColumnsRequest struct {
BoardID string `json:"board_id" valid:"required~Board ID is required"`
ColumnOrders map[string]int `json:"column_orders" valid:"required~Column orders are required"`
}
// BoardResponse represents a board in API responses
type BoardResponse struct {
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
Columns []ColumnResponse `json:"columns"`
IsDefault bool `json:"is_default"`
UserID string `json:"user_id"`
CreatedAt int64 `json:"created_at"`
UpdatedAt int64 `json:"updated_at"`
}
// ColumnResponse represents a column in API responses
type ColumnResponse struct {
ID string `json:"id"`
BoardID string `json:"board_id"`
Name string `json:"name"`
Order int `json:"order"`
Color string `json:"color"`
Limit *int `json:"limit,omitempty"`
Cards []CardResponse `json:"cards"`
CardCount int `json:"card_count"`
IsOverLimit bool `json:"is_over_limit"`
CreatedAt int64 `json:"created_at"`
UpdatedAt int64 `json:"updated_at"`
}
// CardResponse represents a card in API responses
type CardResponse struct {
ID string `json:"id"`
ColumnID string `json:"column_id"`
TenderID string `json:"tender_id"`
Title string `json:"title"`
Order int `json:"order"`
Priority CardPriority `json:"priority"`
Labels []string `json:"labels,omitempty"`
DueDate *int64 `json:"due_date,omitempty"`
CreatedAt int64 `json:"created_at"`
UpdatedAt int64 `json:"updated_at"`
}
// BoardsListResponse represents the response for listing boards
type BoardsListResponse struct {
Boards []BoardResponse `json:"boards"`
Meta *response.Meta `json:"-"`
}
// BoardDetailResponse represents detailed board response with full column and card data
type BoardDetailResponse struct {
Board BoardResponse `json:"board"`
Meta *response.Meta `json:"-"`
}
// ToBoardResponse converts a Board entity to BoardResponse
func (b *Board) ToResponse() *BoardResponse {
return &BoardResponse{
ID: b.ID.Hex(),
Name: b.Name,
Description: b.Description,
Columns: make([]ColumnResponse, 0), // Will be populated by service
IsDefault: b.IsDefault,
UserID: b.UserID,
CreatedAt: b.CreatedAt,
UpdatedAt: b.UpdatedAt,
}
}
// ToColumnResponse converts a Column entity to ColumnResponse
func (c *Column) ToResponse() *ColumnResponse {
return &ColumnResponse{
ID: c.ID.Hex(),
BoardID: c.BoardID,
Name: c.Name,
Order: c.Order,
Color: c.Color,
Limit: c.Limit,
Cards: make([]CardResponse, 0), // Will be populated by service
CardCount: 0, // Will be populated by service
IsOverLimit: false, // Will be calculated by service
CreatedAt: c.CreatedAt,
UpdatedAt: c.UpdatedAt,
}
}
// ToCardResponse converts a Card entity to CardResponse
func (c *Card) ToResponse() *CardResponse {
return &CardResponse{
ID: c.ID.Hex(),
ColumnID: c.ColumnID,
TenderID: c.TenderID,
Title: c.Title,
Order: c.Order,
Priority: c.Priority,
Labels: c.Labels,
DueDate: c.DueDate,
CreatedAt: c.CreatedAt,
UpdatedAt: c.UpdatedAt,
}
}