177 lines
7.0 KiB
Go
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,
|
|
}
|
|
}
|