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 }