Files
schemas/domain/aggregates.go
T
argoyleandClaude Opus 5 57682f2dc3
schemas / check (push) Skipped
schemas / vulnerabilities (push) Skipped
schemas / check-release (push) Skipped
schemas / build (push) Skipped
pre-commit / pre-commit (push) Skipped
schemas / vulnerabilities (pull_request) Successful in 58s
schemas / check-release (pull_request) Successful in 59s
schemas / check (pull_request) Successful in 1m58s
pre-commit / pre-commit (pull_request) Successful in 2m54s
schemas / build (pull_request) Successful in 6m9s
schemas / deploy-prod (pull_request) Skipped
refactor: migrate eventsourced to codeberg and go-messaging-amqp
Move eventsourced modules from gitlab.com/unboundsoftware to codeberg.org/eventsourced.
The Codeberg amqp publisher is built on go-messaging-amqp, so the service
switches from sparetimecoders/goamqp as well:

- routing keys are mapped on the eventsourced publisher (newEventPublisher)
- cache consumers are typed handlers; Cache.Update drops the goamqp shape
- publishes detach from the request context (uncancelledPublisher)
- closeEvents is buffered and the receiver also watches rootCtx
- WithPrefetchLimit dropped (no-op, 20 is the default)
- amqp091-go v1.15.0 (GO-2026-6372)
- renovate groups codeberg.org/messaging with eventsourced

Only transient consumer queues are used, so no queue cutover is needed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dpb7Y47dPz246oY9bCzh7k
2026-09-16 17:23:38 +02:00

108 lines
2.2 KiB
Go

package domain
import (
"fmt"
"strings"
"time"
"codeberg.org/eventsourced/eventsourced"
)
type Organization struct {
eventsourced.BaseAggregate
Name string
Users []string
APIKeys []APIKey
CreatedBy string
CreatedAt time.Time
ChangedBy string
ChangedAt time.Time
}
func (o *Organization) Apply(event eventsourced.Event) error {
switch e := event.(type) {
case *OrganizationAdded:
e.UpdateOrganization(o)
case *UserAddedToOrganization:
e.UpdateOrganization(o)
case *APIKeyAdded:
o.APIKeys = append(o.APIKeys, APIKey{
Name: e.Name,
OrganizationId: o.ID.String(),
Key: e.Key,
Refs: e.Refs,
Read: e.Read,
Publish: e.Publish,
CreatedBy: e.Initiator,
CreatedAt: e.When(),
})
o.ChangedBy = e.Initiator
o.ChangedAt = e.When()
case *APIKeyRemoved:
e.UpdateOrganization(o)
case *OrganizationRemoved:
e.UpdateOrganization(o)
default:
return fmt.Errorf("unexpected event type: %+v", event)
}
return nil
}
var _ eventsourced.Aggregate = &Organization{}
type APIKey struct {
Name string
OrganizationId string
Key string
Refs []string
Read bool
Publish bool
CreatedBy string
CreatedAt time.Time
}
type SubGraph struct {
eventsourced.BaseAggregate
OrganizationId string
Ref string
Service string
Url *string
WSUrl *string
Sdl string
CreatedBy string
CreatedAt time.Time
ChangedBy string
ChangedAt time.Time
}
func (s *SubGraph) Apply(event eventsourced.Event) error {
switch e := event.(type) {
case *SubGraphUpdated:
if s.Ref == "" {
s.CreatedBy = e.Initiator
s.CreatedAt = e.When()
}
if s.OrganizationId == "" {
s.OrganizationId = e.OrganizationId
}
s.ChangedBy = e.Initiator
s.ChangedAt = e.When()
s.Ref = e.Ref
s.Service = e.Service
if e.Url != nil {
url := strings.TrimSpace(*e.Url)
s.Url = &url
}
if e.WSUrl != nil {
url := strings.TrimSpace(*e.WSUrl)
s.WSUrl = &url
}
s.Sdl = e.Sdl
default:
return fmt.Errorf("unexpected event type: %+v", event)
}
return nil
}
var _ eventsourced.Aggregate = &SubGraph{}