Skip to content
quarry Artifact [692d2a0bcb]
Login

Artifact [692d2a0bcb]

Artifact 692d2a0bcb77c49504e91fcabe6969424bde2b461107e26175674da984299661:


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
	}
	if errors.Is(err, oltp.ErrPickupBound) {
		err = api.ErrPickupBound
	}
	if errors.Is(err, oltp.ErrPickupMismatch) {
		err = api.ErrPickupMismatch
	}
	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)
}

func (s signOffStore) SignOffByPickup(code string) (api.SignOffRequest, bool, error) {
	r, ok, err := s.db.SignOffByPickup(code)
	return api.SignOffRequest(r), ok, err
}

func (s signOffStore) TakePickupSecret(code string, now time.Time) (api.PickupTake, error) {
	t, err := s.db.TakePickupSecret(code, now)
	return api.PickupTake{Found: t.Found, Taken: t.Taken, Request: api.SignOffRequest(t.Request), Lapsed: t.Lapsed}, err
}

func (s signOffStore) ParkSignOff(r api.SignOffRequest, result, refs string, seal func(id string) (string, error)) (api.SignOffRequest, error) {
	out, err := s.db.ParkSignOff(oltp.SignOff(r), result, refs, seal)
	if errors.Is(err, oltp.ErrPickupBound) {
		err = api.ErrPickupBound
	}
	return api.SignOffRequest(out), err
}