···600600 return nil601601 })602602603603+ // make registrations.secret nullable for unified registration flow604604+ runMigration(db, "make-registrations-secret-nullable", func(tx *sql.Tx) error {605605+ // sqlite doesn't support ALTER COLUMN, so we need to recreate the table606606+ _, err := tx.Exec(`607607+ create table registrations_new (608608+ id integer primary key autoincrement,609609+ domain text not null unique,610610+ did text not null,611611+ secret text,612612+ created text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),613613+ registered text614614+ );615615+616616+ insert into registrations_new (id, domain, did, secret, created, registered)617617+ select id, domain, did, secret, created, registered from registrations;618618+619619+ drop table registrations;620620+ alter table registrations_new rename to registrations;621621+ `)622622+ return err623623+ })624624+603625 // recreate and add rkey + created columns with default constraint604626 runMigration(db, "rework-collaborators-table", func(tx *sql.Tx) error {605627 // create new table
+30
appview/db/registration.go
···66 "encoding/hex"77 "fmt"88 "log"99+ "strings"910 "time"1011)11121313+// Registration represents a knot registration. Knot would've been a better1414+// name but we're stuck with this for historical reasons.1215type Registration struct {1316 Id int641417 Domain string···188185 where domain = ?;189186 `, domain)190187188188+ return err189189+}190190+191191+func AddKnot(e Execer, domain, did string) error {192192+ _, err := e.Exec(`193193+ insert into registrations (domain, did)194194+ values (?, ?)195195+ `, domain, did)196196+ return err197197+}198198+199199+func DeleteKnot(e Execer, filters ...filter) error {200200+ var conditions []string201201+ var args []any202202+ for _, filter := range filters {203203+ conditions = append(conditions, filter.Condition())204204+ args = append(args, filter.Arg()...)205205+ }206206+207207+ whereClause := ""208208+ if conditions != nil {209209+ whereClause = " where " + strings.Join(conditions, " and ")210210+ }211211+212212+ query := fmt.Sprintf(`delete from registrations %s`, whereClause)213213+214214+ _, err := e.Exec(query, args...)191215 return err192216}