forked from tangled.org/core
Monorepo for Tangled

appview/db: add spindle_members table and crud ops

Signed-off-by: oppiliappan <me@oppi.li>

oppi.li f1a8e659 93f3a461

verified
Changed files
+113 -1
appview
+17 -1
appview/db/db.go
··· 330 330 verified text, -- time of verification 331 331 created text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')), 332 332 333 - unique(instance) 333 + unique(did, instance) 334 + ); 335 + 336 + create table if not exists spindle_members ( 337 + -- identifiers for the record 338 + id integer primary key autoincrement, 339 + did text not null, 340 + rkey text not null, 341 + 342 + -- data 343 + instance text not null, 344 + subject text not null, 345 + created text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')), 346 + 347 + -- constraints 348 + foreign key (did, instance) references spindles(owner, instance) on delete cascade, 349 + unique (did, instance, subject) 334 350 ); 335 351 336 352 create table if not exists pipelines (
+96
appview/db/spindle.go
··· 17 17 Created time.Time 18 18 } 19 19 20 + type SpindleMember struct { 21 + Id int 22 + Did syntax.DID // owner of the record 23 + Rkey string // rkey of the record 24 + Instance string 25 + Subject syntax.DID // the member being added 26 + Created time.Time 27 + } 28 + 20 29 func GetSpindles(e Execer, filters ...filter) ([]Spindle, error) { 21 30 var spindles []Spindle 22 31 ··· 134 143 _, err := e.Exec(query, args...) 135 144 return err 136 145 } 146 + 147 + func AddSpindleMember(e Execer, member SpindleMember) error { 148 + _, err := e.Exec( 149 + `insert or ignore into spindle_members (did, rkey, instance, subject) values (?, ?, ?, ?)`, 150 + member.Did, 151 + member.Rkey, 152 + member.Instance, 153 + member.Subject, 154 + ) 155 + return err 156 + } 157 + 158 + func RemoveSpindleMember(e Execer, filters ...filter) error { 159 + var conditions []string 160 + var args []any 161 + for _, filter := range filters { 162 + conditions = append(conditions, filter.Condition()) 163 + args = append(args, filter.Arg()...) 164 + } 165 + 166 + whereClause := "" 167 + if conditions != nil { 168 + whereClause = " where " + strings.Join(conditions, " and ") 169 + } 170 + 171 + query := fmt.Sprintf(`delete from spindle_members %s`, whereClause) 172 + 173 + _, err := e.Exec(query, args...) 174 + return err 175 + } 176 + 177 + func GetSpindleMembers(e Execer, filters ...filter) ([]SpindleMember, error) { 178 + var members []SpindleMember 179 + 180 + var conditions []string 181 + var args []any 182 + for _, filter := range filters { 183 + conditions = append(conditions, filter.Condition()) 184 + args = append(args, filter.Arg()...) 185 + } 186 + 187 + whereClause := "" 188 + if conditions != nil { 189 + whereClause = " where " + strings.Join(conditions, " and ") 190 + } 191 + 192 + query := fmt.Sprintf( 193 + `select id, did, rkey, instance, subject, created 194 + from spindle_members 195 + %s 196 + order by created 197 + `, 198 + whereClause, 199 + ) 200 + 201 + rows, err := e.Query(query, args...) 202 + 203 + if err != nil { 204 + return nil, err 205 + } 206 + defer rows.Close() 207 + 208 + for rows.Next() { 209 + var member SpindleMember 210 + var createdAt string 211 + 212 + if err := rows.Scan( 213 + &member.Id, 214 + &member.Did, 215 + &member.Rkey, 216 + &member.Instance, 217 + &member.Subject, 218 + &createdAt, 219 + ); err != nil { 220 + return nil, err 221 + } 222 + 223 + member.Created, err = time.Parse(time.RFC3339, createdAt) 224 + if err != nil { 225 + member.Created = time.Now() 226 + } 227 + 228 + members = append(members, member) 229 + } 230 + 231 + return members, nil 232 + }