package main
import (
"errors"
"time"
"craftdesign.group/quarry/internal/api"
"craftdesign.group/quarry/internal/oltp"
)
// signOffStore adapts the forge database's sign-off rows to the API's
// own type, which is the same record under the package that names it.
type signOffStore struct{ db *oltp.DB }
func toAPISignOff(s oltp.SignOff) api.SignOffRequest { return api.SignOffRequest(s) }
func (s signOffStore) RequestSignOff(r api.SignOffRequest) (api.SignOffRequest, error) {
out, err := s.db.RequestSignOff(oltp.SignOff(r))
if errors.Is(err, oltp.ErrTooManySignOffs) {
err = api.ErrTooManySignOffs
}
return toAPISignOff(out), err
}
func (s signOffStore) SignOffsFor(owner string, limit int) ([]api.SignOffRequest, error) {
rows, err := s.db.SignOffsFor(owner, limit)
out := make([]api.SignOffRequest, 0, len(rows))
for _, r := range rows {
out = append(out, toAPISignOff(r))
}
return out, err
}
func (s signOffStore) SignOffByID(id string) (api.SignOffRequest, bool, error) {
r, ok, err := s.db.SignOffByID(id)
return toAPISignOff(r), ok, err
}
func (s signOffStore) DecideSignOff(id, owner string, approve bool) (api.SignOffRequest, error) {
r, err := s.db.DecideSignOff(id, owner, approve)
return toAPISignOff(r), err
}
func (s signOffStore) FailSignOff(id, why string) error { return s.db.FailSignOff(id, why) }
func (s signOffStore) FinishSignOff(id, result, secret string) error {
return s.db.FinishSignOff(id, result, secret)
}
func (s signOffStore) SetSignOffRefs(id, refs string) error { return s.db.SetSignOffRefs(id, refs) }
func (s signOffStore) ClaimSignOffLapse(id string, cutoff time.Time) (string, bool, error) {
return s.db.ClaimSignOffLapse(id, cutoff)
}
func (s signOffStore) ClearSignOffLapse(id string) error { return s.db.ClearSignOffLapse(id) }
func (s signOffStore) DueSignOffLapses(before time.Time) ([]api.SignOffLapse, error) {
rows, err := s.db.DueSignOffLapses(before)
var out []api.SignOffLapse
for _, r := range rows {
out = append(out, api.SignOffLapse(r))
}
return out, err
}
func (s signOffStore) TakeSignOffSecret(id, agent string, now time.Time) (string, error) {
return s.db.TakeSignOffSecret(id, agent, now)
}