Files
Gardomatic/internal/storage/postgres/task_priorities.go
T
kleiax 904d14b64c
CI / test (push) Canceled after 0s
Initial commit
2026-09-12 22:22:17 +02:00

74 lines
2.9 KiB
Go

package postgres
import (
"database/sql"
"gardomatic.kleiax.de/internal/storage"
)
// TaskPriorityModel implements storage.TaskPriorityModelInterface for the
// application-wide priority catalogue.
type TaskPriorityModel struct{ DB *sql.DB }
func scanTaskPriority(s scanner) (storage.TaskPriority, error) {
var priority storage.TaskPriority
err := s.Scan(&priority.ID, &priority.Name, &priority.Value, &priority.SortOrder, &priority.Active, &priority.CreatedAt, &priority.UpdatedAt, &priority.Version)
return priority, err
}
// Insert creates a priority catalogue entry.
func (m TaskPriorityModel) Insert(priority storage.TaskPriority) (storage.TaskPriority, error) {
ctx, cancel := contextWithTimeout()
defer cancel()
err := m.DB.QueryRowContext(ctx, `INSERT INTO task_priorities (name, value, sort_order, active) VALUES ($1,$2,$3,$4) RETURNING id, created_at, updated_at, version`, priority.Name, priority.Value, priority.SortOrder, priority.Active).Scan(&priority.ID, &priority.CreatedAt, &priority.UpdatedAt, &priority.Version)
if err != nil {
return storage.TaskPriority{}, recordError(err)
}
return priority, nil
}
// Get returns a priority catalogue entry by ID.
func (m TaskPriorityModel) Get(id int) (storage.TaskPriority, error) {
ctx, cancel := contextWithTimeout()
defer cancel()
priority, err := scanTaskPriority(m.DB.QueryRowContext(ctx, `SELECT id,name,value,sort_order,active,created_at,updated_at,version FROM task_priorities WHERE id=$1`, id))
if err != nil {
return storage.TaskPriority{}, recordError(err)
}
return priority, nil
}
// GetAll lists all priority catalogue entries in display order.
func (m TaskPriorityModel) GetAll() ([]storage.TaskPriority, error) {
ctx, cancel := contextWithTimeout()
defer cancel()
rows, err := m.DB.QueryContext(ctx, `SELECT id,name,value,sort_order,active,created_at,updated_at,version FROM task_priorities ORDER BY sort_order, value, id`)
if err != nil {
return nil, err
}
defer rows.Close()
result := []storage.TaskPriority{}
for rows.Next() {
value, err := scanTaskPriority(rows)
if err != nil {
return nil, err
}
result = append(result, value)
}
return result, rows.Err()
}
// Update changes a priority catalogue entry using optimistic locking.
func (m TaskPriorityModel) Update(priority storage.TaskPriority) (storage.TaskPriority, error) {
ctx, cancel := contextWithTimeout()
defer cancel()
err := m.DB.QueryRowContext(ctx, `UPDATE task_priorities SET name=$1,value=$2,sort_order=$3,active=$4,updated_at=CURRENT_TIMESTAMP,version=version+1 WHERE id=$5 AND version=$6 RETURNING updated_at,version`, priority.Name, priority.Value, priority.SortOrder, priority.Active, priority.ID, priority.Version).Scan(&priority.UpdatedAt, &priority.Version)
if err == sql.ErrNoRows {
return storage.TaskPriority{}, storage.ErrEditConflict
}
if err != nil {
return storage.TaskPriority{}, recordError(err)
}
return priority, nil
}