75 lines
2.0 KiB
Go
75 lines
2.0 KiB
Go
package redisstate
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
|
|
"galaxy/mail/internal/service/renderdelivery"
|
|
|
|
"github.com/redis/go-redis/v9"
|
|
)
|
|
|
|
// RenderStore provides the Redis-backed durable storage used by the
|
|
// render-delivery use case.
|
|
type RenderStore struct {
|
|
writer *AtomicWriter
|
|
}
|
|
|
|
// NewRenderStore constructs one Redis-backed render-delivery store.
|
|
func NewRenderStore(client *redis.Client) (*RenderStore, error) {
|
|
if client == nil {
|
|
return nil, errors.New("new render store: nil redis client")
|
|
}
|
|
|
|
writer, err := NewAtomicWriter(client)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("new render store: %w", err)
|
|
}
|
|
|
|
return &RenderStore{writer: writer}, nil
|
|
}
|
|
|
|
// MarkRendered stores one successfully materialized template delivery.
|
|
func (store *RenderStore) MarkRendered(ctx context.Context, input renderdelivery.MarkRenderedInput) error {
|
|
if store == nil || store.writer == nil {
|
|
return errors.New("mark rendered in render store: nil store")
|
|
}
|
|
if ctx == nil {
|
|
return errors.New("mark rendered in render store: nil context")
|
|
}
|
|
if err := input.Validate(); err != nil {
|
|
return fmt.Errorf("mark rendered in render store: %w", err)
|
|
}
|
|
|
|
if err := store.writer.MarkRendered(ctx, MarkRenderedInput{
|
|
Delivery: input.Delivery,
|
|
}); err != nil {
|
|
return fmt.Errorf("mark rendered in render store: %w", err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// MarkRenderFailed stores one classified terminal render failure.
|
|
func (store *RenderStore) MarkRenderFailed(ctx context.Context, input renderdelivery.MarkRenderFailedInput) error {
|
|
if store == nil || store.writer == nil {
|
|
return errors.New("mark render failed in render store: nil store")
|
|
}
|
|
if ctx == nil {
|
|
return errors.New("mark render failed in render store: nil context")
|
|
}
|
|
if err := input.Validate(); err != nil {
|
|
return fmt.Errorf("mark render failed in render store: %w", err)
|
|
}
|
|
|
|
if err := store.writer.MarkRenderFailed(ctx, MarkRenderFailedInput{
|
|
Delivery: input.Delivery,
|
|
Attempt: input.Attempt,
|
|
}); err != nil {
|
|
return fmt.Errorf("mark render failed in render store: %w", err)
|
|
}
|
|
|
|
return nil
|
|
}
|