package models import ( "fmt" "time" "github.com/bluesky-social/indigo/atproto/syntax" "github.com/go-git/go-git/v5/plumbing" "github.com/ipfs/go-cid" "tangled.org/core/api/tangled" ) type Artifact struct { Id uint64 Did string Rkey string RepoAt syntax.ATURI Tag plumbing.Hash CreatedAt time.Time BlobCid cid.Cid Name string Size uint64 MimeType string } func (a *Artifact) AtUri() syntax.ATURI { return syntax.ATURI(fmt.Sprintf("at://%s/%s/%s", a.Did, tangled.RepoArtifactNSID, a.Rkey)) } func ArtifactFromRecord(did syntax.DID, rkey syntax.RecordKey, record tangled.RepoArtifact) (Artifact, error) { // validate atproto record repoAt, err := syntax.ParseATURI(record.Repo) if err != nil { return Artifact{}, fmt.Errorf("invalid record %T: %w", record, fmt.Errorf("repo should be valid at-uri: %w", err)) } created, err := time.Parse(time.RFC3339, record.CreatedAt) if err != nil { return Artifact{}, fmt.Errorf("invalid record %T: %w", record, fmt.Errorf("invalid time format '%s'", record.CreatedAt)) } return Artifact{ Did: did.String(), Rkey: rkey.String(), RepoAt: repoAt, Tag: plumbing.Hash(record.Tag), CreatedAt: created, BlobCid: cid.Cid(record.Artifact.Ref), Name: record.Name, Size: uint64(record.Artifact.Size), MimeType: record.Artifact.MimeType, }, nil }