kanban dashboard refactor

This commit is contained in:
Mazyar
2026-05-27 22:06:23 +03:30
parent 42cd0452ce
commit ce2dc7a61b
12 changed files with 457 additions and 176 deletions
+52 -48
View File
@@ -29,22 +29,22 @@ type CreateColumnRequest struct {
// 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"`
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
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
@@ -58,15 +58,15 @@ type UpdateCardRequest struct {
// 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"`
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"`
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
@@ -77,29 +77,31 @@ type ReorderColumnsRequest struct {
// 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"`
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"`
ID string `json:"id"`
BoardID string `json:"board_id"`
Name string `json:"name"`
Status string `json:"status"`
StatusCategory string `json:"status_category"`
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
@@ -124,7 +126,7 @@ type BoardsListResponse struct {
// BoardDetailResponse represents detailed board response with full column and card data
type BoardDetailResponse struct {
Board BoardResponse `json:"board"`
Board BoardResponse `json:"board"`
Meta *response.Meta `json:"-"`
}
@@ -145,17 +147,19 @@ func (b *Board) ToResponse() *BoardResponse {
// 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,
ID: c.ID.Hex(),
BoardID: c.BoardID,
Name: c.Name,
Status: c.Status,
StatusCategory: c.StatusCategory,
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,
}
}