summaryrefslogtreecommitdiffstats
path: root/registry/models.go
diff options
context:
space:
mode:
authorColin Wilk <colin@wilk.cx>2026-10-30 10:04:02 +0100
committerColin Wilk <colin@wilk.cx>2026-10-30 10:07:43 +0100
commitb03b00869391cd70ef1e40561f72dffbd2f47b29 (patch)
treefd1941854bea58ec464b81ac8b0d8627cbed2e74 /registry/models.go
downloadcr-web-b03b00869391cd70ef1e40561f72dffbd2f47b29.tar.gz
cr-web-b03b00869391cd70ef1e40561f72dffbd2f47b29.zip
Initial Commit
Diffstat (limited to 'registry/models.go')
-rw-r--r--registry/models.go75
1 files changed, 75 insertions, 0 deletions
diff --git a/registry/models.go b/registry/models.go
new file mode 100644
index 0000000..11e1db8
--- /dev/null
+++ b/registry/models.go
@@ -0,0 +1,75 @@
+// Package registry is responsible for fetching data from the backend registry
+// and providing the data for the UI components.
+package registry
+
+import (
+ "context"
+ "errors"
+ "time"
+)
+
+// ErrNotFound should be returned for missing repositories/manifests.
+var ErrNotFound = errors.New("registry resource not found")
+
+type Provider interface {
+ Repositories(ctx context.Context) ([]Repository, error)
+ Repository(ctx context.Context, name string) (Repository, error)
+ Manifest(ctx context.Context, repository, digest string) (Manifest, error)
+}
+
+type Repository struct {
+ Name string `json:"name"`
+ UpdatedAt time.Time `json:"updated_at"`
+ Age string `json:"age,omitempty"`
+ Tags []Tag `json:"tags"`
+}
+
+type Tag struct {
+ Name string `json:"name"`
+ Aliases []string `json:"aliases,omitempty"`
+ UpdatedAt time.Time `json:"updated_at"`
+ Age string `json:"age,omitempty"`
+ Platforms string `json:"platforms,omitempty"`
+ SizeBytes int64 `json:"size_bytes,omitempty"`
+ ManifestDigest string `json:"manifest_digest"`
+}
+
+type Manifest struct {
+ Repository string `json:"repository"`
+ Digest string `json:"digest"`
+ Kind string `json:"kind"` // "index" for a list; "image" for layers.
+ SizeBytes int64 `json:"size_bytes,omitempty"` // Registry-reported image total, when available.
+ Tags []TagReference `json:"tags"`
+ Platforms []PlatformManifest `json:"platforms,omitempty"`
+ Layers []Layer `json:"layers,omitempty"`
+}
+
+func (m Manifest) TotalSizeBytes() int64 {
+ if m.SizeBytes > 0 {
+ return m.SizeBytes
+ }
+ var total int64
+ for _, layer := range m.Layers {
+ total += layer.SizeBytes
+ }
+ return total
+}
+
+type TagReference struct {
+ Name string `json:"name"`
+ UpdatedAt time.Time `json:"updated_at"`
+ Age string `json:"age,omitempty"`
+ ManifestDigest string `json:"manifest_digest"`
+}
+
+type PlatformManifest struct {
+ Platform string `json:"platform"`
+ Variant string `json:"variant,omitempty"`
+ SizeBytes int64 `json:"size_bytes"`
+ Digest string `json:"digest"`
+}
+
+type Layer struct {
+ Digest string `json:"digest"`
+ SizeBytes int64 `json:"size_bytes"`
+}