feat(domain): add PreviewRoute and AutoConfig types
- commit
- d757b58b3c11a6715f93da328031ab3a0fa0bd4a
- author
- brice · · 2026-03-19 04:44 UTC
- committer
- brice · · 2026-03-19 05:13 UTC
- parent
- a4e31e9
- signature
- unsigned
3 files · +70 -0
A internal/domain/auto.go +23 -0
| @@ -0,0 +1,23 @@ | |||
| 1 | + | package domain | |
| 2 | + | ||
| 3 | + | import "time" | |
| 4 | + | ||
| 5 | + | // AutoConfig holds the unified auto-route and auto-preview configuration. | |
| 6 | + | type AutoConfig struct { | |
| 7 | + | Enabled bool | |
| 8 | + | AllowedDomains []string | |
| 9 | + | Route AutoRouteConfig | |
| 10 | + | Preview PreviewConfig | |
| 11 | + | } | |
| 12 | + | ||
| 13 | + | // AutoRouteConfig holds auto-route specific settings. | |
| 14 | + | type AutoRouteConfig struct{} | |
| 15 | + | ||
| 16 | + | // PreviewConfig holds auto-preview specific settings. | |
| 17 | + | type PreviewConfig struct { | |
| 18 | + | Enabled bool | |
| 19 | + | TTL time.Duration | |
| 20 | + | Separator string | |
| 21 | + | TagPatterns []string | |
| 22 | + | DataCopy bool | |
| 23 | + | } | |
| @@ -0,0 +1,23 @@ | |||||
| 1 | + | package domain | |||
| 2 | + | ||||
| 3 | + | import "time" | |||
| 4 | + | ||||
| 5 | + | // AutoConfig holds the unified auto-route and auto-preview configuration. | |||
| 6 | + | type AutoConfig struct { | |||
| 7 | + | Enabled bool | |||
| 8 | + | AllowedDomains []string | |||
| 9 | + | Route AutoRouteConfig | |||
| 10 | + | Preview PreviewConfig | |||
| 11 | + | } | |||
| 12 | + | ||||
| 13 | + | // AutoRouteConfig holds auto-route specific settings. | |||
| 14 | + | type AutoRouteConfig struct{} | |||
| 15 | + | ||||
| 16 | + | // PreviewConfig holds auto-preview specific settings. | |||
| 17 | + | type PreviewConfig struct { | |||
| 18 | + | Enabled bool | |||
| 19 | + | TTL time.Duration | |||
| 20 | + | Separator string | |||
| 21 | + | TagPatterns []string | |||
| 22 | + | DataCopy bool | |||
| 23 | + | } | |||
A internal/domain/preview.go +21 -0
| @@ -0,0 +1,21 @@ | |||
| 1 | + | package domain | |
| 2 | + | ||
| 3 | + | import "time" | |
| 4 | + | ||
| 5 | + | // PreviewRoute represents an ephemeral preview environment. | |
| 6 | + | type PreviewRoute struct { | |
| 7 | + | Domain string `json:"domain"` | |
| 8 | + | Image string `json:"image"` | |
| 9 | + | BaseRoute string `json:"base_route"` | |
| 10 | + | Name string `json:"name"` | |
| 11 | + | CreatedAt time.Time `json:"created_at"` | |
| 12 | + | ExpiresAt time.Time `json:"expires_at"` | |
| 13 | + | HTTPS bool `json:"https"` | |
| 14 | + | Volumes []string `json:"volumes"` | |
| 15 | + | Containers []string `json:"containers"` | |
| 16 | + | } | |
| 17 | + | ||
| 18 | + | // IsExpired returns true if the preview has exceeded its TTL. | |
| 19 | + | func (p PreviewRoute) IsExpired() bool { | |
| 20 | + | return time.Now().After(p.ExpiresAt) | |
| 21 | + | } | |
| @@ -0,0 +1,21 @@ | |||||
| 1 | + | package domain | |||
| 2 | + | ||||
| 3 | + | import "time" | |||
| 4 | + | ||||
| 5 | + | // PreviewRoute represents an ephemeral preview environment. | |||
| 6 | + | type PreviewRoute struct { | |||
| 7 | + | Domain string `json:"domain"` | |||
| 8 | + | Image string `json:"image"` | |||
| 9 | + | BaseRoute string `json:"base_route"` | |||
| 10 | + | Name string `json:"name"` | |||
| 11 | + | CreatedAt time.Time `json:"created_at"` | |||
| 12 | + | ExpiresAt time.Time `json:"expires_at"` | |||
| 13 | + | HTTPS bool `json:"https"` | |||
| 14 | + | Volumes []string `json:"volumes"` | |||
| 15 | + | Containers []string `json:"containers"` | |||
| 16 | + | } | |||
| 17 | + | ||||
| 18 | + | // IsExpired returns true if the preview has exceeded its TTL. | |||
| 19 | + | func (p PreviewRoute) IsExpired() bool { | |||
| 20 | + | return time.Now().After(p.ExpiresAt) | |||
| 21 | + | } | |||
A internal/domain/preview_test.go +26 -0
| @@ -0,0 +1,26 @@ | |||
| 1 | + | package domain | |
| 2 | + | ||
| 3 | + | import ( | |
| 4 | + | "testing" | |
| 5 | + | "time" | |
| 6 | + | ||
| 7 | + | "github.com/stretchr/testify/assert" | |
| 8 | + | ) | |
| 9 | + | ||
| 10 | + | func TestPreviewRoute_IsExpired(t *testing.T) { | |
| 11 | + | tests := []struct { | |
| 12 | + | name string | |
| 13 | + | expiresAt time.Time | |
| 14 | + | want bool | |
| 15 | + | }{ | |
| 16 | + | {"expired", time.Now().Add(-1 * time.Hour), true}, | |
| 17 | + | {"not expired", time.Now().Add(1 * time.Hour), false}, | |
| 18 | + | {"just expired", time.Now().Add(-1 * time.Second), true}, | |
| 19 | + | } | |
| 20 | + | for _, tt := range tests { | |
| 21 | + | t.Run(tt.name, func(t *testing.T) { | |
| 22 | + | p := PreviewRoute{ExpiresAt: tt.expiresAt} | |
| 23 | + | assert.Equal(t, tt.want, p.IsExpired()) | |
| 24 | + | }) | |
| 25 | + | } | |
| 26 | + | } | |
| @@ -0,0 +1,26 @@ | |||||
| 1 | + | package domain | |||
| 2 | + | ||||
| 3 | + | import ( | |||
| 4 | + | "testing" | |||
| 5 | + | "time" | |||
| 6 | + | ||||
| 7 | + | "github.com/stretchr/testify/assert" | |||
| 8 | + | ) | |||
| 9 | + | ||||
| 10 | + | func TestPreviewRoute_IsExpired(t *testing.T) { | |||
| 11 | + | tests := []struct { | |||
| 12 | + | name string | |||
| 13 | + | expiresAt time.Time | |||
| 14 | + | want bool | |||
| 15 | + | }{ | |||
| 16 | + | {"expired", time.Now().Add(-1 * time.Hour), true}, | |||
| 17 | + | {"not expired", time.Now().Add(1 * time.Hour), false}, | |||
| 18 | + | {"just expired", time.Now().Add(-1 * time.Second), true}, | |||
| 19 | + | } | |||
| 20 | + | for _, tt := range tests { | |||
| 21 | + | t.Run(tt.name, func(t *testing.T) { | |||
| 22 | + | p := PreviewRoute{ExpiresAt: tt.expiresAt} | |||
| 23 | + | assert.Equal(t, tt.want, p.IsExpired()) | |||
| 24 | + | }) | |||
| 25 | + | } | |||
| 26 | + | } | |||