Files
galaxy-game/mail/internal/adapters/postgres/mailstore/auth_acceptance.go
T
2026-04-26 20:34:39 +02:00

64 lines
2.0 KiB
Go

package mailstore
import (
"context"
"database/sql"
"errors"
"fmt"
"galaxy/mail/internal/domain/common"
deliverydomain "galaxy/mail/internal/domain/delivery"
"galaxy/mail/internal/service/acceptauthdelivery"
)
var _ acceptauthdelivery.Store = (*Store)(nil)
// CreateAcceptance writes one auth-delivery acceptance write set inside one
// BEGIN … COMMIT transaction. Idempotency races surface as
// acceptauthdelivery.ErrConflict.
func (store *Store) CreateAcceptance(ctx context.Context, input acceptauthdelivery.CreateAcceptanceInput) error {
if store == nil {
return errors.New("create auth acceptance: nil store")
}
if ctx == nil {
return errors.New("create auth acceptance: nil context")
}
if err := input.Validate(); err != nil {
return fmt.Errorf("create auth acceptance: %w", err)
}
return store.withTx(ctx, "create auth acceptance", func(ctx context.Context, tx *sql.Tx) error {
if err := insertDelivery(ctx, tx, input.Delivery, input.Idempotency, input.Idempotency.ExpiresAt, input.FirstAttempt); err != nil {
if isUniqueViolation(err) {
return acceptauthdelivery.ErrConflict
}
return fmt.Errorf("create auth acceptance: insert delivery: %w", err)
}
if input.FirstAttempt != nil {
if err := insertAttempt(ctx, tx, *input.FirstAttempt); err != nil {
return fmt.Errorf("create auth acceptance: insert first attempt: %w", err)
}
}
return nil
})
}
// GetDelivery loads one accepted delivery by its identifier.
func (store *Store) GetDelivery(ctx context.Context, deliveryID common.DeliveryID) (deliverydomain.Delivery, bool, error) {
if store == nil {
return deliverydomain.Delivery{}, false, errors.New("get delivery: nil store")
}
operationCtx, cancel, err := store.operationContext(ctx, "get delivery")
if err != nil {
return deliverydomain.Delivery{}, false, err
}
defer cancel()
record, ok, err := loadDeliveryByID(operationCtx, store.db, deliveryID)
if err != nil {
return deliverydomain.Delivery{}, false, fmt.Errorf("get delivery: %w", err)
}
return record, ok, nil
}