111 lines
3 KiB
Go
111 lines
3 KiB
Go
|
|
package kanboard
|
||
|
|
|
||
|
|
import (
|
||
|
|
"context"
|
||
|
|
"fmt"
|
||
|
|
)
|
||
|
|
|
||
|
|
// GetTaskTags returns the tags assigned to a task as a map of tagID to tag name.
|
||
|
|
func (c *Client) GetTaskTags(ctx context.Context, taskID int) (map[int]string, error) {
|
||
|
|
params := map[string]int{"task_id": taskID}
|
||
|
|
|
||
|
|
// Kanboard returns map[string]string where keys are string tag IDs
|
||
|
|
var result map[string]string
|
||
|
|
if err := c.call(ctx, "getTaskTags", params, &result); err != nil {
|
||
|
|
return nil, fmt.Errorf("getTaskTags: %w", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
// Convert string keys to int
|
||
|
|
tags := make(map[int]string, len(result))
|
||
|
|
for idStr, name := range result {
|
||
|
|
var id int
|
||
|
|
if _, err := fmt.Sscanf(idStr, "%d", &id); err != nil {
|
||
|
|
continue // Skip invalid IDs
|
||
|
|
}
|
||
|
|
tags[id] = name
|
||
|
|
}
|
||
|
|
|
||
|
|
return tags, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// SetTaskTags sets the tags for a task, replacing all existing tags.
|
||
|
|
// Tags are specified by name. Non-existent tags will be auto-created.
|
||
|
|
func (c *Client) SetTaskTags(ctx context.Context, projectID, taskID int, tags []string) error {
|
||
|
|
params := map[string]interface{}{
|
||
|
|
"project_id": projectID,
|
||
|
|
"task_id": taskID,
|
||
|
|
"tags": tags,
|
||
|
|
}
|
||
|
|
|
||
|
|
var result bool
|
||
|
|
if err := c.call(ctx, "setTaskTags", params, &result); err != nil {
|
||
|
|
return fmt.Errorf("setTaskTags: %w", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// GetAllTags returns all tags in the system.
|
||
|
|
func (c *Client) GetAllTags(ctx context.Context) ([]Tag, error) {
|
||
|
|
var result []Tag
|
||
|
|
if err := c.call(ctx, "getAllTags", nil, &result); err != nil {
|
||
|
|
return nil, fmt.Errorf("getAllTags: %w", err)
|
||
|
|
}
|
||
|
|
return result, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// GetTagsByProject returns all tags for a specific project.
|
||
|
|
func (c *Client) GetTagsByProject(ctx context.Context, projectID int) ([]Tag, error) {
|
||
|
|
params := map[string]int{"project_id": projectID}
|
||
|
|
|
||
|
|
var result []Tag
|
||
|
|
if err := c.call(ctx, "getTagsByProject", params, &result); err != nil {
|
||
|
|
return nil, fmt.Errorf("getTagsByProject: %w", err)
|
||
|
|
}
|
||
|
|
return result, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// CreateTag creates a new tag in a project and returns the tag ID.
|
||
|
|
func (c *Client) CreateTag(ctx context.Context, projectID int, name, colorID string) (int, error) {
|
||
|
|
params := map[string]interface{}{
|
||
|
|
"project_id": projectID,
|
||
|
|
"tag": name,
|
||
|
|
}
|
||
|
|
if colorID != "" {
|
||
|
|
params["color_id"] = colorID
|
||
|
|
}
|
||
|
|
|
||
|
|
var result int
|
||
|
|
if err := c.call(ctx, "createTag", params, &result); err != nil {
|
||
|
|
return 0, fmt.Errorf("createTag: %w", err)
|
||
|
|
}
|
||
|
|
return result, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// UpdateTag updates an existing tag's name and/or color.
|
||
|
|
func (c *Client) UpdateTag(ctx context.Context, tagID int, name, colorID string) error {
|
||
|
|
params := map[string]interface{}{
|
||
|
|
"tag_id": tagID,
|
||
|
|
"tag": name,
|
||
|
|
}
|
||
|
|
if colorID != "" {
|
||
|
|
params["color_id"] = colorID
|
||
|
|
}
|
||
|
|
|
||
|
|
var result bool
|
||
|
|
if err := c.call(ctx, "updateTag", params, &result); err != nil {
|
||
|
|
return fmt.Errorf("updateTag: %w", err)
|
||
|
|
}
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// RemoveTag deletes a tag from the system.
|
||
|
|
func (c *Client) RemoveTag(ctx context.Context, tagID int) error {
|
||
|
|
params := map[string]int{"tag_id": tagID}
|
||
|
|
|
||
|
|
var result bool
|
||
|
|
if err := c.call(ctx, "removeTag", params, &result); err != nil {
|
||
|
|
return fmt.Errorf("removeTag: %w", err)
|
||
|
|
}
|
||
|
|
return nil
|
||
|
|
}
|