Kanboard API returns int (ID) on success and false (bool) on failure for create operations. Add IntOrFalse type that handles both cases and update CreateTask, CreateComment, CreateTag, CreateTaskFile, and CreateTaskLink to use it.
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 IntOrFalse
|
|
if err := c.call(ctx, "createTag", params, &result); err != nil {
|
|
return 0, fmt.Errorf("createTag: %w", err)
|
|
}
|
|
return int(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
|
|
}
|