64 lines
2.0 KiB
Go
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
|
|
}
|