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