diff --git a/appview/db/artifact.go b/appview/db/artifact.go index df77a55d..8e938449 100644 --- a/appview/db/artifact.go +++ b/appview/db/artifact.go @@ -23,7 +23,7 @@ type Artifact struct { BlobCid cid.Cid Name string Size uint64 - Mimetype string + MimeType string } func (a *Artifact) ArtifactAt() syntax.ATURI { @@ -52,28 +52,28 @@ func AddArtifact(e Execer, artifact Artifact) error { artifact.BlobCid.String(), artifact.Name, artifact.Size, - artifact.Mimetype, + artifact.MimeType, ) return err } -type Filter struct { +type filter struct { key string arg any } -func NewFilter(key string, arg any) Filter { - return Filter{ +func Filter(key string, arg any) filter { + return filter{ key: key, arg: arg, } } -func (f Filter) Condition() string { +func (f filter) Condition() string { return fmt.Sprintf("%s = ?", f.key) } -func GetArtifact(e Execer, filters ...Filter) ([]Artifact, error) { +func GetArtifact(e Execer, filters ...filter) ([]Artifact, error) { var artifacts []Artifact var conditions []string @@ -124,7 +124,7 @@ func GetArtifact(e Execer, filters ...Filter) ([]Artifact, error) { &blobCid, &artifact.Name, &artifact.Size, - &artifact.Mimetype, + &artifact.MimeType, ); err != nil { return nil, err } @@ -146,7 +146,7 @@ func GetArtifact(e Execer, filters ...Filter) ([]Artifact, error) { return artifacts, nil } -func RemoveArtifact(e Execer, filters ...Filter) error { +func DeleteArtifact(e Execer, filters ...filter) error { var conditions []string var args []any for _, filter := range filters { diff --git a/appview/ingester.go b/appview/ingester.go index 75b71214..8079eb3c 100644 --- a/appview/ingester.go +++ b/appview/ingester.go @@ -5,10 +5,13 @@ import ( "encoding/json" "fmt" "log" + "time" "github.com/bluesky-social/indigo/atproto/syntax" "github.com/bluesky-social/jetstream/pkg/models" - tangled "tangled.sh/tangled.sh/core/api/tangled" + "github.com/go-git/go-git/v5/plumbing" + "github.com/ipfs/go-cid" + "tangled.sh/tangled.sh/core/api/tangled" "tangled.sh/tangled.sh/core/appview/db" ) @@ -36,6 +39,8 @@ func Ingest(d db.DbWrapper) Ingester { ingestStar(&d, e) case tangled.PublicKeyNSID: ingestPublicKey(&d, e) + case tangled.RepoArtifactNSID: + ingestArtifact(&d, e) } return err @@ -131,3 +136,53 @@ func ingestPublicKey(d *db.DbWrapper, e *models.Event) error { return nil } + +func ingestArtifact(d *db.DbWrapper, e *models.Event) error { + did := e.Did + var err error + + switch e.Commit.Operation { + case models.CommitOperationCreate, models.CommitOperationUpdate: + log.Println("processing add of artifact") + raw := json.RawMessage(e.Commit.Record) + record := tangled.RepoArtifact{} + err = json.Unmarshal(raw, &record) + if err != nil { + log.Printf("invalid record: %s", err) + return err + } + + repoAt, err := syntax.ParseATURI(record.Repo) + if err != nil { + return err + } + + createdAt, err := time.Parse(time.RFC3339, record.CreatedAt) + if err != nil { + createdAt = time.Now() + } + + artifact := db.Artifact{ + Did: did, + Rkey: e.Commit.RKey, + RepoAt: repoAt, + Tag: plumbing.Hash(record.Tag), + CreatedAt: createdAt, + BlobCid: cid.Cid(record.Artifact.Ref), + Name: record.Name, + Size: uint64(record.Artifact.Size), + MimeType: record.Artifact.MimeType, + } + + err = db.AddArtifact(d, artifact) + case models.CommitOperationDelete: + log.Println("processing delete of artifact") + err = db.DeleteArtifact(d, db.Filter("did", did), db.Filter("rkey", e.Commit.RKey)) + } + + if err != nil { + return fmt.Errorf("failed to %s artifact record: %w", e.Commit.Operation, err) + } + + return nil +} diff --git a/appview/pages/pages.go b/appview/pages/pages.go index 40a39a4e..38a7128a 100644 --- a/appview/pages/pages.go +++ b/appview/pages/pages.go @@ -496,7 +496,7 @@ func (p *Pages) RepoTags(w io.Writer, params RepoTagsParams) error { type RepoArtifactParams struct { LoggedInUser *auth.User - RepoInfo RepoInfo + RepoInfo repoinfo.RepoInfo Artifact db.Artifact } diff --git a/appview/pages/templates/repo/fragments/artifact.html b/appview/pages/templates/repo/fragments/artifact.html index 3e0a4ba5..bf8849dc 100644 --- a/appview/pages/templates/repo/fragments/artifact.html +++ b/appview/pages/templates/repo/fragments/artifact.html @@ -6,17 +6,17 @@ {{ .Artifact.Name }} - {{ byteFmt .Artifact.Size }} + {{ byteFmt .Artifact.Size }} -
+
{{ shortTimeFmt .Artifact.CreatedAt }} - + - {{ if and (.LoggedInUser) (eq .LoggedInUser.Did .Artifact.Did) }} + {{ if and .LoggedInUser (eq .LoggedInUser.Did .Artifact.Did) }}