···330330 verified text, -- time of verification331331 created text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),332332333333- unique(instance)333333+ unique(did, instance)334334+ );335335+336336+ create table if not exists spindle_members (337337+ -- identifiers for the record338338+ id integer primary key autoincrement,339339+ did text not null,340340+ rkey text not null,341341+342342+ -- data343343+ instance text not null,344344+ subject text not null,345345+ created text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),346346+347347+ -- constraints348348+ foreign key (did, instance) references spindles(owner, instance) on delete cascade,349349+ unique (did, instance, subject)334350 );335351336352 create table if not exists pipelines (
+96
appview/db/spindle.go
···1717 Created time.Time1818}19192020+type SpindleMember struct {2121+ Id int2222+ Did syntax.DID // owner of the record2323+ Rkey string // rkey of the record2424+ Instance string2525+ Subject syntax.DID // the member being added2626+ Created time.Time2727+}2828+2029func GetSpindles(e Execer, filters ...filter) ([]Spindle, error) {2130 var spindles []Spindle2231···142133143134 _, err := e.Exec(query, args...)144135 return err136136+}137137+138138+func AddSpindleMember(e Execer, member SpindleMember) error {139139+ _, err := e.Exec(140140+ `insert or ignore into spindle_members (did, rkey, instance, subject) values (?, ?, ?, ?)`,141141+ member.Did,142142+ member.Rkey,143143+ member.Instance,144144+ member.Subject,145145+ )146146+ return err147147+}148148+149149+func RemoveSpindleMember(e Execer, filters ...filter) error {150150+ var conditions []string151151+ var args []any152152+ for _, filter := range filters {153153+ conditions = append(conditions, filter.Condition())154154+ args = append(args, filter.Arg()...)155155+ }156156+157157+ whereClause := ""158158+ if conditions != nil {159159+ whereClause = " where " + strings.Join(conditions, " and ")160160+ }161161+162162+ query := fmt.Sprintf(`delete from spindle_members %s`, whereClause)163163+164164+ _, err := e.Exec(query, args...)165165+ return err166166+}167167+168168+func GetSpindleMembers(e Execer, filters ...filter) ([]SpindleMember, error) {169169+ var members []SpindleMember170170+171171+ var conditions []string172172+ var args []any173173+ for _, filter := range filters {174174+ conditions = append(conditions, filter.Condition())175175+ args = append(args, filter.Arg()...)176176+ }177177+178178+ whereClause := ""179179+ if conditions != nil {180180+ whereClause = " where " + strings.Join(conditions, " and ")181181+ }182182+183183+ query := fmt.Sprintf(184184+ `select id, did, rkey, instance, subject, created185185+ from spindle_members186186+ %s187187+ order by created188188+ `,189189+ whereClause,190190+ )191191+192192+ rows, err := e.Query(query, args...)193193+194194+ if err != nil {195195+ return nil, err196196+ }197197+ defer rows.Close()198198+199199+ for rows.Next() {200200+ var member SpindleMember201201+ var createdAt string202202+203203+ if err := rows.Scan(204204+ &member.Id,205205+ &member.Did,206206+ &member.Rkey,207207+ &member.Instance,208208+ &member.Subject,209209+ &createdAt,210210+ ); err != nil {211211+ return nil, err212212+ }213213+214214+ member.Created, err = time.Parse(time.RFC3339, createdAt)215215+ if err != nil {216216+ member.Created = time.Now()217217+ }218218+219219+ members = append(members, member)220220+ }221221+222222+ return members, nil145223}