forked from tangled.org/core
Monorepo for Tangled — https://tangled.org
at master 4.6 kB view raw
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}