42 lines
1.7 KiB
Go
42 lines
1.7 KiB
Go
package postgres
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"git.cin.su/m/Assistant/contracts/work"
|
|
"github.com/jackc/pgx/v5/pgxpool"
|
|
)
|
|
|
|
type WorkRepository struct{ pool *pgxpool.Pool }
|
|
|
|
func OpenWork(ctx context.Context, config ContinuityConfig) (*WorkRepository, error) {
|
|
dsn := fmt.Sprintf("host=%s port=%s dbname=%s user=%s password=%s", config.Host, config.Port, config.Database, config.User, config.Password)
|
|
pool, err := pgxpool.New(ctx, dsn)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &WorkRepository{pool}, nil
|
|
}
|
|
func (r *WorkRepository) Close() { r.pool.Close() }
|
|
func (r *WorkRepository) Create(ctx context.Context, target work.TaskTarget) error {
|
|
_, err := r.pool.Exec(ctx, `INSERT INTO work.tasks (task_id,goal_id,scope_id,revision) VALUES ($1,$2,$3,$4) ON CONFLICT (task_id) DO NOTHING`, target.TaskID, target.GoalID, target.ScopeID, target.Revision)
|
|
return err
|
|
}
|
|
func (r *WorkRepository) Commit(ctx context.Context, target work.TaskTarget) (work.TaskRevision, error) {
|
|
var revision work.TaskRevision
|
|
err := r.pool.QueryRow(ctx, `UPDATE work.tasks SET revision=revision+1 WHERE task_id=$1 AND goal_id=$2 AND scope_id=$3 AND revision=$4 RETURNING revision`, target.TaskID, target.GoalID, target.ScopeID, target.Revision).Scan(&revision)
|
|
if err != nil {
|
|
return 0, fmt.Errorf("commit task: %w", err)
|
|
}
|
|
return revision, nil
|
|
}
|
|
func (r *WorkRepository) Load(ctx context.Context, id work.TaskID) (work.TaskTarget, error) {
|
|
var target work.TaskTarget
|
|
err := r.pool.QueryRow(ctx, `SELECT task_id, goal_id, scope_id, revision FROM work.tasks WHERE task_id=$1`, id).Scan(&target.TaskID, &target.GoalID, &target.ScopeID, &target.Revision)
|
|
if err != nil {
|
|
return work.TaskTarget{}, fmt.Errorf("load task: %w", err)
|
|
}
|
|
return target, nil
|
|
}
|