package provider import ( "context" "fmt" "net/http" "git.unkin.net/unkin/artifactapi/pkg/models" ) type Mutability int const ( Immutable Mutability = iota Mutable ) type Provider interface { Type() models.PackageType Classify(path string) Mutability ContentType(path string) string UpstreamURL(remote models.Remote, path string) string RewriteResponse(body []byte, remote models.Remote, proxyBaseURL string) ([]byte, error) AuthHeaders(ctx context.Context, remote models.Remote) (http.Header, error) } type FileEntry struct { FilePath string ContentHash string } type FileStore interface { ListFilesByPrefix(ctx context.Context, repoName, prefix string) ([]FileEntry, error) ListPackages(ctx context.Context, repoName string) ([]string, error) } type LocalUploader interface { ValidateUpload(filePath string) (storagePath, contentType string, err error) UploadResponse(storagePath, contentHash string, sizeBytes int64) map[string]any } type LocalIndexer interface { ServeLocalIndex(w http.ResponseWriter, r *http.Request, files FileStore, repoName, path string) bool GenerateLocalIndex(ctx context.Context, files FileStore, repoName, path string) ([]byte, error) } type IndexMerger interface { MergeIndexes(members []MemberIndex, proxyBaseURL string) ([]byte, error) } type MemberIndex struct { RemoteName string Body []byte } var registry = map[models.PackageType]Provider{} func Register(p Provider) { registry[p.Type()] = p } func Get(t models.PackageType) (Provider, error) { p, ok := registry[t] if !ok { return nil, fmt.Errorf("no provider registered for package type %q", t) } return p, nil } func All() map[models.PackageType]Provider { return registry }