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 }