dispatcher.go RawHistoryFolder
1package auto
2
3import (
4 "context"
5 "path/filepath"
6
7 "github.com/bnema/zerowrap"
8
9 "github.com/bnema/gordon/internal/boundaries/out"
10 "github.com/bnema/gordon/internal/domain"
11)
12
13// AutoConfigProvider exposes unified auto config to the dispatcher.
14type AutoConfigProvider interface {
15 IsAutoEnabled() bool
16 IsPreviewEnabled() bool
17 GetPreviewTagPatterns() []string
18 GetPreviewConfig() domain.PreviewConfig
19 GetAllowedDomains() []string
20 FindRoutesByImage(ctx context.Context, imageName string) []domain.Route
21}
22
23// ImagePushDispatcher classifies image push events and delegates
24// to either the auto-route handler or the auto-preview handler.
25type ImagePushDispatcher struct {
26 config AutoConfigProvider
27 routeHandler out.EventHandler
28 previewHandler out.EventHandler
29}
30
31func NewImagePushDispatcher(config AutoConfigProvider, routeHandler, previewHandler out.EventHandler) *ImagePushDispatcher {
32 return &ImagePushDispatcher{
33 config: config,
34 routeHandler: routeHandler,
35 previewHandler: previewHandler,
36 }
37}
38
39func (d *ImagePushDispatcher) CanHandle(t domain.EventType) bool {
40 return t == domain.EventImagePushed
41}
42
43func (d *ImagePushDispatcher) Handle(ctx context.Context, event domain.Event) error {
44 log := zerowrap.FromCtx(ctx)
45
46 payload, ok := event.Data.(domain.ImagePushedPayload)
47 if !ok {
48 log.Warn().Str("event_type", string(event.Type)).Msg("dispatcher received event with unexpected payload type; forwarding to route handler")
49 return d.routeHandler.Handle(ctx, event)
50 }
51
52 previewEnabled := d.config.IsPreviewEnabled()
53 tagMatch := d.matchesTagPatterns(payload.Reference)
54 log.Debug().
55 Bool("preview_enabled", previewEnabled).
56 Bool("tag_match", tagMatch).
57 Str("reference", payload.Reference).
58 Msg("dispatcher classifying push event")
59
60 if previewEnabled && tagMatch {
61 return d.previewHandler.Handle(ctx, event)
62 }
63 return d.routeHandler.Handle(ctx, event)
64}
65
66func (d *ImagePushDispatcher) matchesTagPatterns(reference string) bool {
67 for _, pattern := range d.config.GetPreviewTagPatterns() {
68 matched, err := filepath.Match(pattern, reference)
69 if err != nil {
70 continue // skip malformed patterns
71 }
72 if matched {
73 return true
74 }
75 }
76 return false
77}