Files

192 lines
5.8 KiB
Go

package db
import "time"
// User represents a user in the system
type User struct {
DID string
Handle string
PDSEndpoint string
Avatar string
DefaultHoldDID string
OciClient string
LastSeen time.Time
}
// Manifest represents an OCI manifest stored in the cache
type Manifest struct {
ID int64
DID string
Repository string
Digest string
HoldEndpoint string
SchemaVersion int
MediaType string
ConfigDigest string
ConfigSize int64
ArtifactType string // container-image, helm-chart, unknown
CreatedAt time.Time
// Annotations removed - now stored in repository_annotations table
}
// Layer represents a layer in a manifest
type Layer struct {
ManifestID int64
Digest string
Size int64
MediaType string
LayerIndex int
Annotations map[string]string // JSON-encoded layer annotations (e.g. in-toto predicate type)
}
// ManifestReference represents a reference to a manifest in a manifest list/index
type ManifestReference struct {
ManifestID int64
Digest string
Size int64
MediaType string
PlatformArchitecture string
PlatformOS string
PlatformVariant string
PlatformOSVersion string
IsAttestation bool // true if vnd.docker.reference.type = "attestation-manifest"
ReferenceIndex int
}
// Tag represents a tag pointing to a manifest
type Tag struct {
ID int64
DID string
Repository string
Tag string
Digest string
CreatedAt time.Time
}
// Repository represents an aggregated view of a user's repository
type Repository struct {
Name string
TagCount int
ManifestCount int
LastPush time.Time
Tags []Tag
Manifests []Manifest
Title string
Description string
SourceURL string
DocumentationURL string
Licenses string
IconURL string
ReadmeURL string
Version string
}
// RepositoryStats represents statistics for a repository
type RepositoryStats struct {
DID string `json:"did"`
Repository string `json:"repository"`
StarCount int `json:"star_count"` // Calculated from stars table, not stored
PullCount int `json:"pull_count"`
LastPull *time.Time `json:"last_pull,omitempty"`
PushCount int `json:"push_count"`
LastPush *time.Time `json:"last_push,omitempty"`
}
// RepositoryWithStats combines repository data with statistics
type RepositoryWithStats struct {
Repository
Stats RepositoryStats
}
// RepoCardData contains all data needed to render a repository card
type RepoCardData struct {
OwnerHandle string
OwnerAvatarURL string // Owner's profile avatar URL (fallback when no repo icon)
Repository string
Title string
Description string
IconURL string
StarCount int
PullCount int
IsStarred bool // Whether the current user has starred this repository
ArtifactType string // container-image, helm-chart, unknown
Tag string // Latest tag name (e.g., "latest", "v1.0.0")
Digest string // Latest manifest digest (sha256:...)
LastUpdated time.Time // When the repository was last pushed to
RegistryURL string // Registry URL for docker commands (e.g., "atcr.io" or "127.0.0.1:5000")
OciClient string // Preferred OCI client for pull commands (e.g., "docker", "podman")
}
// SetRegistryURL sets the RegistryURL field on all cards in the slice
func SetRegistryURL(cards []RepoCardData, registryURL string) {
for i := range cards {
cards[i].RegistryURL = registryURL
}
}
// SetOciClient sets the OciClient field on all cards in the slice
func SetOciClient(cards []RepoCardData, ociClient string) {
for i := range cards {
cards[i].OciClient = ociClient
}
}
// PlatformInfo represents platform information (OS/Architecture)
type PlatformInfo struct {
OS string
Architecture string
Variant string
OSVersion string
Digest string // child platform manifest digest (for manifest lists)
HoldEndpoint string // hold endpoint for this platform manifest
CompressedSize int64 // sum of layer sizes (compressed)
}
// TagWithPlatforms extends Tag with platform information
type TagWithPlatforms struct {
Tag
HoldEndpoint string // hold endpoint from the tag's own manifest
Platforms []PlatformInfo
IsMultiArch bool
HasAttestations bool // true if manifest list contains attestation references
ArtifactType string // container-image, helm-chart, unknown
CompressedSize int64 // sum of layer sizes for single-arch tags
}
// ManifestWithMetadata extends Manifest with tags and platform information
type ManifestWithMetadata struct {
Manifest
Tags []string
Platforms []PlatformInfo
PlatformCount int
IsManifestList bool
HasAttestations bool // true if manifest list contains attestation references
Reachable bool // Whether the hold endpoint is reachable
Pending bool // Whether health check is still in progress
// Note: ArtifactType is available via embedded Manifest struct
}
// ManifestEntry is a unified view model for the tags tab.
// Every entry is a manifest — labeled by tag name or digest.
type ManifestEntry struct {
Label string // tag name, or digest if untagged
Digest string // manifest digest
IsTagged bool
CreatedAt time.Time
HoldEndpoint string
Platforms []PlatformInfo
IsMultiArch bool
HasAttestations bool
ArtifactType string
CompressedSize int64 // for single-arch
}
// AttestationDetail represents an attestation manifest and its layers
type AttestationDetail struct {
Digest string
MediaType string // attestation manifest media type
Size int64
HoldEndpoint string // hold DID/URL where blobs are stored
Layers []Layer
}