1package db
2
3import (
4 "database/sql"
5 "fmt"
6 "strings"
7 "time"
8
9 "tangled.org/core/appview/models"
10)
11
12func GetRegistrations(e Execer, filters ...filter) ([]models.Registration, error) {
13 var registrations []models.Registration
14
15 var conditions []string
16 var args []any
17 for _, filter := range filters {
18 conditions = append(conditions, filter.Condition())
19 args = append(args, filter.Arg()...)
20 }
21
22 whereClause := ""
23 if conditions != nil {
24 whereClause = " where " + strings.Join(conditions, " and ")
25 }
26
27 query := fmt.Sprintf(`
28 select id, domain, did, created, registered, needs_upgrade
29 from registrations
30 %s
31 order by created
32 `,
33 whereClause,
34 )
35
36 rows, err := e.Query(query, args...)
37 if err != nil {
38 return nil, err
39 }
40
41 for rows.Next() {
42 var createdAt string
43 var registeredAt sql.Null[string]
44 var needsUpgrade int
45 var reg models.Registration
46
47 err = rows.Scan(®.Id, ®.Domain, ®.ByDid, &createdAt, ®isteredAt, &needsUpgrade)
48 if err != nil {
49 return nil, err
50 }
51
52 if t, err := time.Parse(time.RFC3339, createdAt); err == nil {
53 reg.Created = &t
54 }
55
56 if registeredAt.Valid {
57 if t, err := time.Parse(time.RFC3339, registeredAt.V); err == nil {
58 reg.Registered = &t
59 }
60 }
61
62 if needsUpgrade != 0 {
63 reg.NeedsUpgrade = true
64 }
65
66 registrations = append(registrations, reg)
67 }
68
69 return registrations, nil
70}
71
72func MarkRegistered(e Execer, filters ...filter) error {
73 var conditions []string
74 var args []any
75 for _, filter := range filters {
76 conditions = append(conditions, filter.Condition())
77 args = append(args, filter.Arg()...)
78 }
79
80 query := "update registrations set registered = strftime('%Y-%m-%dT%H:%M:%SZ', 'now'), needs_upgrade = 0"
81 if len(conditions) > 0 {
82 query += " where " + strings.Join(conditions, " and ")
83 }
84
85 _, err := e.Exec(query, args...)
86 return err
87}
88
89func AddKnot(e Execer, domain, did string) error {
90 _, err := e.Exec(`
91 insert into registrations (domain, did)
92 values (?, ?)
93 `, domain, did)
94 return err
95}
96
97func DeleteKnot(e Execer, filters ...filter) error {
98 var conditions []string
99 var args []any
100 for _, filter := range filters {
101 conditions = append(conditions, filter.Condition())
102 args = append(args, filter.Arg()...)
103 }
104
105 whereClause := ""
106 if conditions != nil {
107 whereClause = " where " + strings.Join(conditions, " and ")
108 }
109
110 query := fmt.Sprintf(`delete from registrations %s`, whereClause)
111
112 _, err := e.Exec(query, args...)
113 return err
114}