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