Monorepo for Tangled
1package db
2
3import (
4 "database/sql"
5 "fmt"
6 "strings"
7 "time"
8
9 "github.com/go-git/go-git/v5/plumbing"
10 "github.com/ipfs/go-cid"
11 "tangled.org/core/appview/models"
12 "tangled.org/core/orm"
13)
14
15func AddArtifact(e Execer, artifact models.Artifact) error {
16 var repoDid *string
17 if artifact.RepoDid != "" {
18 repoDid = &artifact.RepoDid
19 }
20 _, err := e.Exec(
21 `insert or ignore into artifacts (
22 did,
23 rkey,
24 repo_at,
25 repo_did,
26 tag,
27 created,
28 blob_cid,
29 name,
30 size,
31 mimetype
32 )
33 values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
34 artifact.Did,
35 artifact.Rkey,
36 artifact.RepoAt,
37 repoDid,
38 artifact.Tag[:],
39 artifact.CreatedAt.Format(time.RFC3339),
40 artifact.BlobCid.String(),
41 artifact.Name,
42 artifact.Size,
43 artifact.MimeType,
44 )
45 return err
46}
47
48func GetArtifact(e Execer, filters ...orm.Filter) ([]models.Artifact, error) {
49 var artifacts []models.Artifact
50
51 var conditions []string
52 var args []any
53 for _, filter := range filters {
54 conditions = append(conditions, filter.Condition())
55 args = append(args, filter.Arg()...)
56 }
57
58 whereClause := ""
59 if conditions != nil {
60 whereClause = " where " + strings.Join(conditions, " and ")
61 }
62
63 query := fmt.Sprintf(`select
64 did,
65 rkey,
66 repo_at,
67 repo_did,
68 tag,
69 created,
70 blob_cid,
71 name,
72 size,
73 mimetype
74 from artifacts %s`,
75 whereClause,
76 )
77
78 rows, err := e.Query(query, args...)
79 if err != nil {
80 return nil, err
81 }
82 defer rows.Close()
83
84 for rows.Next() {
85 var artifact models.Artifact
86 var createdAt string
87 var tag []byte
88 var blobCid string
89 var repoDid sql.NullString
90
91 if err := rows.Scan(
92 &artifact.Did,
93 &artifact.Rkey,
94 &artifact.RepoAt,
95 &repoDid,
96 &tag,
97 &createdAt,
98 &blobCid,
99 &artifact.Name,
100 &artifact.Size,
101 &artifact.MimeType,
102 ); err != nil {
103 return nil, err
104 }
105 if repoDid.Valid {
106 artifact.RepoDid = repoDid.String
107 }
108
109 artifact.CreatedAt, err = time.Parse(time.RFC3339, createdAt)
110 if err != nil {
111 artifact.CreatedAt = time.Now()
112 }
113 artifact.Tag = plumbing.Hash(tag)
114 artifact.BlobCid = cid.MustParse(blobCid)
115
116 artifacts = append(artifacts, artifact)
117 }
118
119 if err := rows.Err(); err != nil {
120 return nil, err
121 }
122
123 return artifacts, nil
124}
125
126func DeleteArtifact(e Execer, filters ...orm.Filter) error {
127 var conditions []string
128 var args []any
129 for _, filter := range filters {
130 conditions = append(conditions, filter.Condition())
131 args = append(args, filter.Arg()...)
132 }
133
134 whereClause := ""
135 if conditions != nil {
136 whereClause = " where " + strings.Join(conditions, " and ")
137 }
138
139 query := fmt.Sprintf(`delete from artifacts %s`, whereClause)
140
141 _, err := e.Exec(query, args...)
142 return err
143}