Monorepo for Tangled
at master 223 lines 4.7 kB view raw
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}