+8
-152
appview/db/db.go
+8
-152
appview/db/db.go
···
2
2
3
3
import (
4
4
"database/sql"
5
-
"fmt"
6
-
"log"
7
-
"time"
8
5
9
-
"github.com/google/uuid"
10
6
_ "github.com/mattn/go-sqlite3"
11
7
)
12
8
···
35
31
created integer default (strftime('%s', 'now')),
36
32
unique(did, name, key)
37
33
);
34
+
create table if not exists repos (
35
+
id integer primary key autoincrement,
36
+
did text not null,
37
+
name text not null,
38
+
knot text not null,
39
+
created integer default (strftime('%s', 'now')),
40
+
unique(did, name, knot)
41
+
);
38
42
`)
39
43
if err != nil {
40
44
return nil, err
41
45
}
42
46
return &DB{db: db}, nil
43
47
}
44
-
45
-
type Registration struct {
46
-
Domain string
47
-
ByDid string
48
-
Created *time.Time
49
-
Registered *time.Time
50
-
}
51
-
52
-
func (r *Registration) Status() Status {
53
-
if r.Registered != nil {
54
-
return Registered
55
-
} else {
56
-
return Pending
57
-
}
58
-
}
59
-
60
-
type Status uint32
61
-
62
-
const (
63
-
Registered Status = iota
64
-
Pending
65
-
)
66
-
67
-
// returns registered status, did of owner, error
68
-
func (d *DB) RegistrationsByDid(did string) ([]Registration, error) {
69
-
var registrations []Registration
70
-
71
-
rows, err := d.db.Query(`
72
-
select domain, did, created, registered from registrations
73
-
where did = ?
74
-
`, did)
75
-
if err != nil {
76
-
return nil, err
77
-
}
78
-
79
-
for rows.Next() {
80
-
var createdAt *int64
81
-
var registeredAt *int64
82
-
var registration Registration
83
-
err = rows.Scan(®istration.Domain, ®istration.ByDid, &createdAt, ®isteredAt)
84
-
85
-
if err != nil {
86
-
log.Println(err)
87
-
} else {
88
-
createdAtTime := time.Unix(*createdAt, 0)
89
-
90
-
var registeredAtTime *time.Time
91
-
if registeredAt != nil {
92
-
x := time.Unix(*registeredAt, 0)
93
-
registeredAtTime = &x
94
-
}
95
-
96
-
registration.Created = &createdAtTime
97
-
registration.Registered = registeredAtTime
98
-
registrations = append(registrations, registration)
99
-
}
100
-
}
101
-
102
-
return registrations, nil
103
-
}
104
-
105
-
// returns registered status, did of owner, error
106
-
func (d *DB) RegistrationByDomain(domain string) (*Registration, error) {
107
-
var createdAt *int64
108
-
var registeredAt *int64
109
-
var registration Registration
110
-
111
-
err := d.db.QueryRow(`
112
-
select domain, did, created, registered from registrations
113
-
where domain = ?
114
-
`, domain).Scan(®istration.Domain, ®istration.ByDid, &createdAt, ®isteredAt)
115
-
116
-
if err != nil {
117
-
if err == sql.ErrNoRows {
118
-
return nil, nil
119
-
} else {
120
-
return nil, err
121
-
}
122
-
}
123
-
124
-
createdAtTime := time.Unix(*createdAt, 0)
125
-
var registeredAtTime *time.Time
126
-
if registeredAt != nil {
127
-
x := time.Unix(*registeredAt, 0)
128
-
registeredAtTime = &x
129
-
}
130
-
131
-
registration.Created = &createdAtTime
132
-
registration.Registered = registeredAtTime
133
-
134
-
return ®istration, nil
135
-
}
136
-
137
-
func (d *DB) GenerateRegistrationKey(domain, did string) (string, error) {
138
-
// sanity check: does this domain already have a registration?
139
-
reg, err := d.RegistrationByDomain(domain)
140
-
if err != nil {
141
-
return "", err
142
-
}
143
-
144
-
// registration is open
145
-
if reg != nil {
146
-
switch reg.Status() {
147
-
case Registered:
148
-
// already registered by `owner`
149
-
return "", fmt.Errorf("%s already registered by %s", domain, reg.ByDid)
150
-
case Pending:
151
-
// TODO: be loud about this
152
-
log.Printf("%s registered by %s, status pending", domain, reg.ByDid)
153
-
}
154
-
}
155
-
156
-
secret := uuid.New().String()
157
-
158
-
_, err = d.db.Exec(`
159
-
insert into registrations (domain, did, secret)
160
-
values (?, ?, ?)
161
-
on conflict(domain) do update set did = excluded.did, secret = excluded.secret
162
-
`, domain, did, secret)
163
-
164
-
if err != nil {
165
-
return "", err
166
-
}
167
-
168
-
return secret, nil
169
-
}
170
-
171
-
func (d *DB) GetRegistrationKey(domain string) (string, error) {
172
-
res := d.db.QueryRow(`select secret from registrations where domain = ?`, domain)
173
-
174
-
var secret string
175
-
err := res.Scan(&secret)
176
-
if err != nil || secret == "" {
177
-
return "", err
178
-
}
179
-
180
-
return secret, nil
181
-
}
182
-
183
-
func (d *DB) Register(domain string) error {
184
-
_, err := d.db.Exec(`
185
-
update registrations
186
-
set registered = strftime('%s', 'now')
187
-
where domain = ?;
188
-
`, domain)
189
-
190
-
return err
191
-
}
+158
appview/db/registration.go
+158
appview/db/registration.go
···
1
+
package db
2
+
3
+
import (
4
+
"database/sql"
5
+
"fmt"
6
+
"log"
7
+
"time"
8
+
9
+
"github.com/google/uuid"
10
+
)
11
+
12
+
type Registration struct {
13
+
Domain string
14
+
ByDid string
15
+
Created *time.Time
16
+
Registered *time.Time
17
+
}
18
+
19
+
func (r *Registration) Status() Status {
20
+
if r.Registered != nil {
21
+
return Registered
22
+
} else {
23
+
return Pending
24
+
}
25
+
}
26
+
27
+
type Status uint32
28
+
29
+
const (
30
+
Registered Status = iota
31
+
Pending
32
+
)
33
+
34
+
// returns registered status, did of owner, error
35
+
func (d *DB) RegistrationsByDid(did string) ([]Registration, error) {
36
+
var registrations []Registration
37
+
38
+
rows, err := d.db.Query(`
39
+
select domain, did, created, registered from registrations
40
+
where did = ?
41
+
`, did)
42
+
if err != nil {
43
+
return nil, err
44
+
}
45
+
46
+
for rows.Next() {
47
+
var createdAt *int64
48
+
var registeredAt *int64
49
+
var registration Registration
50
+
err = rows.Scan(®istration.Domain, ®istration.ByDid, &createdAt, ®isteredAt)
51
+
52
+
if err != nil {
53
+
log.Println(err)
54
+
} else {
55
+
createdAtTime := time.Unix(*createdAt, 0)
56
+
57
+
var registeredAtTime *time.Time
58
+
if registeredAt != nil {
59
+
x := time.Unix(*registeredAt, 0)
60
+
registeredAtTime = &x
61
+
}
62
+
63
+
registration.Created = &createdAtTime
64
+
registration.Registered = registeredAtTime
65
+
registrations = append(registrations, registration)
66
+
}
67
+
}
68
+
69
+
return registrations, nil
70
+
}
71
+
72
+
// returns registered status, did of owner, error
73
+
func (d *DB) RegistrationByDomain(domain string) (*Registration, error) {
74
+
var createdAt *int64
75
+
var registeredAt *int64
76
+
var registration Registration
77
+
78
+
err := d.db.QueryRow(`
79
+
select domain, did, created, registered from registrations
80
+
where domain = ?
81
+
`, domain).Scan(®istration.Domain, ®istration.ByDid, &createdAt, ®isteredAt)
82
+
83
+
if err != nil {
84
+
if err == sql.ErrNoRows {
85
+
return nil, nil
86
+
} else {
87
+
return nil, err
88
+
}
89
+
}
90
+
91
+
createdAtTime := time.Unix(*createdAt, 0)
92
+
var registeredAtTime *time.Time
93
+
if registeredAt != nil {
94
+
x := time.Unix(*registeredAt, 0)
95
+
registeredAtTime = &x
96
+
}
97
+
98
+
registration.Created = &createdAtTime
99
+
registration.Registered = registeredAtTime
100
+
101
+
return ®istration, nil
102
+
}
103
+
104
+
func (d *DB) GenerateRegistrationKey(domain, did string) (string, error) {
105
+
// sanity check: does this domain already have a registration?
106
+
reg, err := d.RegistrationByDomain(domain)
107
+
if err != nil {
108
+
return "", err
109
+
}
110
+
111
+
// registration is open
112
+
if reg != nil {
113
+
switch reg.Status() {
114
+
case Registered:
115
+
// already registered by `owner`
116
+
return "", fmt.Errorf("%s already registered by %s", domain, reg.ByDid)
117
+
case Pending:
118
+
// TODO: be loud about this
119
+
log.Printf("%s registered by %s, status pending", domain, reg.ByDid)
120
+
}
121
+
}
122
+
123
+
secret := uuid.New().String()
124
+
125
+
_, err = d.db.Exec(`
126
+
insert into registrations (domain, did, secret)
127
+
values (?, ?, ?)
128
+
on conflict(domain) do update set did = excluded.did, secret = excluded.secret
129
+
`, domain, did, secret)
130
+
131
+
if err != nil {
132
+
return "", err
133
+
}
134
+
135
+
return secret, nil
136
+
}
137
+
138
+
func (d *DB) GetRegistrationKey(domain string) (string, error) {
139
+
res := d.db.QueryRow(`select secret from registrations where domain = ?`, domain)
140
+
141
+
var secret string
142
+
err := res.Scan(&secret)
143
+
if err != nil || secret == "" {
144
+
return "", err
145
+
}
146
+
147
+
return secret, nil
148
+
}
149
+
150
+
func (d *DB) Register(domain string) error {
151
+
_, err := d.db.Exec(`
152
+
update registrations
153
+
set registered = strftime('%s', 'now')
154
+
where domain = ?;
155
+
`, domain)
156
+
157
+
return err
158
+
}
+57
appview/db/repos.go
+57
appview/db/repos.go
···
1
+
package db
2
+
3
+
type Repo struct {
4
+
Did string
5
+
Name string
6
+
Knot string
7
+
Created *int64
8
+
}
9
+
10
+
func (d *DB) GetAllReposByDid(did string) ([]Repo, error) {
11
+
var repos []Repo
12
+
13
+
rows, err := d.db.Query(`select did, name, knot, created from repos where did = ?`, did)
14
+
if err != nil {
15
+
return nil, err
16
+
}
17
+
defer rows.Close()
18
+
19
+
for rows.Next() {
20
+
var repo Repo
21
+
var createdAt *int64
22
+
if err := rows.Scan(&repo.Did, &repo.Name, &repo.Knot, &createdAt); err != nil {
23
+
return nil, err
24
+
}
25
+
repo.Created = createdAt
26
+
repos = append(repos, repo)
27
+
}
28
+
29
+
if err := rows.Err(); err != nil {
30
+
return nil, err
31
+
}
32
+
33
+
return repos, nil
34
+
}
35
+
36
+
func (d *DB) GetRepo(did, name string) (*Repo, error) {
37
+
var repo Repo
38
+
39
+
row := d.db.QueryRow(`select did, name, knot, created from repos where did = ? and name = ?`, did, name)
40
+
var createdAt *int64
41
+
if err := row.Scan(&repo.Did, &repo.Name, &repo.Knot, &createdAt); err != nil {
42
+
return nil, err
43
+
}
44
+
repo.Created = createdAt
45
+
46
+
return &repo, nil
47
+
}
48
+
49
+
func (d *DB) AddRepo(repo *Repo) error {
50
+
_, err := d.db.Exec(`insert into repos (did, name, knot) values (?, ?, ?)`, repo.Did, repo.Name, repo.Knot)
51
+
return err
52
+
}
53
+
54
+
func (d *DB) RemoveRepo(did, name, knot string) error {
55
+
_, err := d.db.Exec(`delete from repos where did = ? and name = ? and knot = ?`, did, name, knot)
56
+
return err
57
+
}
+13
appview/state/state.go
+13
appview/state/state.go
···
450
450
return
451
451
}
452
452
453
+
// add to local db
454
+
repo := &db.Repo{
455
+
Did: user.Did,
456
+
Name: repoName,
457
+
Knot: domain,
458
+
}
459
+
460
+
err = s.db.AddRepo(repo)
461
+
if err != nil {
462
+
log.Println("failed to add repo to db", err)
463
+
return
464
+
}
465
+
453
466
w.Write([]byte("created!"))
454
467
}
455
468
}