feat: use postgres
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user