forked from
tangled.org/core
Monorepo for Tangled
1package db
2
3import (
4 "context"
5 "database/sql"
6 "fmt"
7 "strings"
8 "time"
9
10 "tangled.org/core/appview/models"
11 "tangled.org/core/orm"
12)
13
14func GetSpindles(ctx context.Context, e Execer, filters ...orm.Filter) ([]models.Spindle, error) {
15 var spindles []models.Spindle
16
17 var conditions []string
18 var args []any
19 for _, filter := range filters {
20 conditions = append(conditions, filter.Condition())
21 args = append(args, filter.Arg()...)
22 }
23
24 whereClause := ""
25 if conditions != nil {
26 whereClause = " where " + strings.Join(conditions, " and ")
27 }
28
29 query := fmt.Sprintf(
30 `select id, owner, instance, verified, created, needs_upgrade
31 from spindles
32 %s
33 order by created
34 `,
35 whereClause,
36 )
37
38 rows, err := e.QueryContext(ctx, query, args...)
39
40 if err != nil {
41 return nil, err
42 }
43 defer rows.Close()
44
45 for rows.Next() {
46 var spindle models.Spindle
47 var createdAt string
48 var verified sql.NullString
49 var needsUpgrade int
50
51 if err := rows.Scan(
52 &spindle.Id,
53 &spindle.Owner,
54 &spindle.Instance,
55 &verified,
56 &createdAt,
57 &needsUpgrade,
58 ); err != nil {
59 return nil, err
60 }
61
62 spindle.Created, err = time.Parse(time.RFC3339, createdAt)
63 if err != nil {
64 spindle.Created = time.Now()
65 }
66
67 if verified.Valid {
68 t, err := time.Parse(time.RFC3339, verified.String)
69 if err != nil {
70 now := time.Now()
71 spindle.Verified = &now
72 }
73 spindle.Verified = &t
74 }
75
76 if needsUpgrade != 0 {
77 spindle.NeedsUpgrade = true
78 }
79
80 spindles = append(spindles, spindle)
81 }
82
83 return spindles, nil
84}
85
86// if there is an existing spindle with the same instance, this returns an error
87func AddSpindle(e Execer, spindle models.Spindle) error {
88 _, err := e.Exec(
89 `insert into spindles (owner, instance) values (?, ?)`,
90 spindle.Owner,
91 spindle.Instance,
92 )
93 return err
94}
95
96func VerifySpindle(e Execer, filters ...orm.Filter) (int64, error) {
97 var conditions []string
98 var args []any
99 for _, filter := range filters {
100 conditions = append(conditions, filter.Condition())
101 args = append(args, filter.Arg()...)
102 }
103
104 whereClause := ""
105 if conditions != nil {
106 whereClause = " where " + strings.Join(conditions, " and ")
107 }
108
109 query := fmt.Sprintf(`update spindles set verified = strftime('%%Y-%%m-%%dT%%H:%%M:%%SZ', 'now'), needs_upgrade = 0 %s`, whereClause)
110
111 res, err := e.Exec(query, args...)
112 if err != nil {
113 return 0, err
114 }
115
116 return res.RowsAffected()
117}
118
119func DeleteSpindle(e Execer, filters ...orm.Filter) error {
120 var conditions []string
121 var args []any
122 for _, filter := range filters {
123 conditions = append(conditions, filter.Condition())
124 args = append(args, filter.Arg()...)
125 }
126
127 whereClause := ""
128 if conditions != nil {
129 whereClause = " where " + strings.Join(conditions, " and ")
130 }
131
132 query := fmt.Sprintf(`delete from spindles %s`, whereClause)
133
134 _, err := e.Exec(query, args...)
135 return err
136}
137
138func AddSpindleMember(e Execer, member models.SpindleMember) error {
139 _, err := e.Exec(
140 `insert or ignore into spindle_members (did, rkey, instance, subject) values (?, ?, ?, ?)`,
141 member.Did,
142 member.Rkey,
143 member.Instance,
144 member.Subject,
145 )
146 return err
147}
148
149func RemoveSpindleMember(e Execer, filters ...orm.Filter) error {
150 var conditions []string
151 var args []any
152 for _, filter := range filters {
153 conditions = append(conditions, filter.Condition())
154 args = append(args, filter.Arg()...)
155 }
156
157 whereClause := ""
158 if conditions != nil {
159 whereClause = " where " + strings.Join(conditions, " and ")
160 }
161
162 query := fmt.Sprintf(`delete from spindle_members %s`, whereClause)
163
164 _, err := e.Exec(query, args...)
165 return err
166}
167
168func GetSpindleMembers(e Execer, filters ...orm.Filter) ([]models.SpindleMember, error) {
169 var members []models.SpindleMember
170
171 var conditions []string
172 var args []any
173 for _, filter := range filters {
174 conditions = append(conditions, filter.Condition())
175 args = append(args, filter.Arg()...)
176 }
177
178 whereClause := ""
179 if conditions != nil {
180 whereClause = " where " + strings.Join(conditions, " and ")
181 }
182
183 query := fmt.Sprintf(
184 `select id, did, rkey, instance, subject, created
185 from spindle_members
186 %s
187 order by created
188 `,
189 whereClause,
190 )
191
192 rows, err := e.Query(query, args...)
193
194 if err != nil {
195 return nil, err
196 }
197 defer rows.Close()
198
199 for rows.Next() {
200 var member models.SpindleMember
201 var createdAt string
202
203 if err := rows.Scan(
204 &member.Id,
205 &member.Did,
206 &member.Rkey,
207 &member.Instance,
208 &member.Subject,
209 &createdAt,
210 ); err != nil {
211 return nil, err
212 }
213
214 member.Created, err = time.Parse(time.RFC3339, createdAt)
215 if err != nil {
216 member.Created = time.Now()
217 }
218
219 members = append(members, member)
220 }
221
222 return members, nil
223}