feat: authsession service
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
package testkit
|
||||
|
||||
import (
|
||||
"context"
|
||||
"sync"
|
||||
|
||||
"galaxy/authsession/internal/domain/gatewayprojection"
|
||||
"galaxy/authsession/internal/ports"
|
||||
)
|
||||
|
||||
// RecordingProjectionPublisher is a deterministic
|
||||
// GatewaySessionProjectionPublisher double that records every published
|
||||
// snapshot.
|
||||
type RecordingProjectionPublisher struct {
|
||||
mu sync.Mutex
|
||||
|
||||
// Err is returned directly from PublishSession when set.
|
||||
Err error
|
||||
|
||||
// Errors is an optional FIFO error script consumed before Err. Nil entries
|
||||
// represent successful publish attempts.
|
||||
Errors []error
|
||||
|
||||
published []gatewayprojection.Snapshot
|
||||
}
|
||||
|
||||
// PublishSession records snapshot and returns the configured error, if any.
|
||||
func (p *RecordingProjectionPublisher) PublishSession(ctx context.Context, snapshot gatewayprojection.Snapshot) error {
|
||||
if err := ctx.Err(); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := snapshot.Validate(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
p.mu.Lock()
|
||||
defer p.mu.Unlock()
|
||||
|
||||
p.published = append(p.published, cloneProjectionSnapshot(snapshot))
|
||||
if len(p.Errors) > 0 {
|
||||
err := p.Errors[0]
|
||||
p.Errors = append([]error(nil), p.Errors[1:]...)
|
||||
return err
|
||||
}
|
||||
|
||||
return p.Err
|
||||
}
|
||||
|
||||
// PublishedSnapshots returns a stable snapshot of every published projection.
|
||||
func (p *RecordingProjectionPublisher) PublishedSnapshots() []gatewayprojection.Snapshot {
|
||||
p.mu.Lock()
|
||||
defer p.mu.Unlock()
|
||||
|
||||
snapshots := make([]gatewayprojection.Snapshot, 0, len(p.published))
|
||||
for _, snapshot := range p.published {
|
||||
snapshots = append(snapshots, cloneProjectionSnapshot(snapshot))
|
||||
}
|
||||
|
||||
return snapshots
|
||||
}
|
||||
|
||||
var _ ports.GatewaySessionProjectionPublisher = (*RecordingProjectionPublisher)(nil)
|
||||
Reference in New Issue
Block a user