Files
brain/internal/kanban/kanban.go
T
Andrew S Erwin b9721ff13f
release gate / check (push) Failing after 8m35s
initial commit on Federted servers
2026-10-19 16:23:55 -05:00

60 lines
1.9 KiB
Go

package kanban
import (
"context"
"database/sql"
"github.com/andrew/go-computer/internal/db"
)
var DefaultColumns = []struct{ Label, Color, Key string }{{"Inbox", "#64748b", "INBOX"}, {"To Do", "#3b82f6", "TODO"}, {"In Progress", "#f59e0b", "IN_PROGRESS"}, {"Done", "#22c55e", "DONE"}}
// GetColumns seeds the default board on first use. The common case (columns
// already exist) is a plain read — the user-row lock and seeding transaction
// are only taken when the count is zero, and the count is re-checked inside
// the transaction so concurrent first loads cannot double-seed.
func GetColumns(ctx context.Context, d *db.DB, userID string) ([]db.Object, error) {
var existing int
if err := d.QueryRowContext(ctx, `SELECT count(*) FROM "KanbanColumn" WHERE "userId"=$1`, userID).Scan(&existing); err != nil {
return nil, err
}
if existing == 0 {
err := db.Transaction(ctx, d, func(tx *sql.Tx) error {
if _, e := tx.ExecContext(ctx, `SELECT id FROM "User" WHERE id=$1 FOR UPDATE`, userID); e != nil {
return e
}
var n int
if e := tx.QueryRowContext(ctx, `SELECT count(*) FROM "KanbanColumn" WHERE "userId"=$1`, userID).Scan(&n); e != nil {
return e
}
if n == 0 {
for i, c := range DefaultColumns {
if _, e := db.Insert(ctx, tx, "KanbanColumn", db.Object{"id": db.NewID(), "userId": userID, "position": i, "label": c.Label, "color": c.Color, "key": c.Key}); e != nil {
return e
}
}
}
return nil
})
if err != nil {
return nil, err
}
}
return db.Many(ctx, d, `SELECT to_jsonb(c) FROM "KanbanColumn" c WHERE "userId"=$1 ORDER BY position,id`, userID)
}
func ResolveColumnID(b db.Object, columns []db.Object) string {
for _, c := range columns {
if b["kanbanColumnId"] == c["id"] {
return c["id"].(string)
}
}
for _, c := range columns {
if c["key"] != nil && c["key"] == b["kanbanStatus"] {
return c["id"].(string)
}
}
if len(columns) > 0 {
return columns[0]["id"].(string)
}
return ""
}