forked from tangled.org/core
this repo has no description

appview: add repo to db

Changed files
+236 -152
appview
+8 -152
appview/db/db.go
···
import (
"database/sql"
-
"fmt"
-
"log"
-
"time"
-
"github.com/google/uuid"
_ "github.com/mattn/go-sqlite3"
)
···
created integer default (strftime('%s', 'now')),
unique(did, name, key)
);
+
create table if not exists repos (
+
id integer primary key autoincrement,
+
did text not null,
+
name text not null,
+
knot text not null,
+
created integer default (strftime('%s', 'now')),
+
unique(did, name, knot)
+
);
`)
if err != nil {
return nil, err
}
return &DB{db: db}, nil
}
-
-
type Registration struct {
-
Domain string
-
ByDid string
-
Created *time.Time
-
Registered *time.Time
-
}
-
-
func (r *Registration) Status() Status {
-
if r.Registered != nil {
-
return Registered
-
} else {
-
return Pending
-
}
-
}
-
-
type Status uint32
-
-
const (
-
Registered Status = iota
-
Pending
-
)
-
-
// returns registered status, did of owner, error
-
func (d *DB) RegistrationsByDid(did string) ([]Registration, error) {
-
var registrations []Registration
-
-
rows, err := d.db.Query(`
-
select domain, did, created, registered from registrations
-
where did = ?
-
`, did)
-
if err != nil {
-
return nil, err
-
}
-
-
for rows.Next() {
-
var createdAt *int64
-
var registeredAt *int64
-
var registration Registration
-
err = rows.Scan(&registration.Domain, &registration.ByDid, &createdAt, &registeredAt)
-
-
if err != nil {
-
log.Println(err)
-
} else {
-
createdAtTime := time.Unix(*createdAt, 0)
-
-
var registeredAtTime *time.Time
-
if registeredAt != nil {
-
x := time.Unix(*registeredAt, 0)
-
registeredAtTime = &x
-
}
-
-
registration.Created = &createdAtTime
-
registration.Registered = registeredAtTime
-
registrations = append(registrations, registration)
-
}
-
}
-
-
return registrations, nil
-
}
-
-
// returns registered status, did of owner, error
-
func (d *DB) RegistrationByDomain(domain string) (*Registration, error) {
-
var createdAt *int64
-
var registeredAt *int64
-
var registration Registration
-
-
err := d.db.QueryRow(`
-
select domain, did, created, registered from registrations
-
where domain = ?
-
`, domain).Scan(&registration.Domain, &registration.ByDid, &createdAt, &registeredAt)
-
-
if err != nil {
-
if err == sql.ErrNoRows {
-
return nil, nil
-
} else {
-
return nil, err
-
}
-
}
-
-
createdAtTime := time.Unix(*createdAt, 0)
-
var registeredAtTime *time.Time
-
if registeredAt != nil {
-
x := time.Unix(*registeredAt, 0)
-
registeredAtTime = &x
-
}
-
-
registration.Created = &createdAtTime
-
registration.Registered = registeredAtTime
-
-
return &registration, nil
-
}
-
-
func (d *DB) GenerateRegistrationKey(domain, did string) (string, error) {
-
// sanity check: does this domain already have a registration?
-
reg, err := d.RegistrationByDomain(domain)
-
if err != nil {
-
return "", err
-
}
-
-
// registration is open
-
if reg != nil {
-
switch reg.Status() {
-
case Registered:
-
// already registered by `owner`
-
return "", fmt.Errorf("%s already registered by %s", domain, reg.ByDid)
-
case Pending:
-
// TODO: be loud about this
-
log.Printf("%s registered by %s, status pending", domain, reg.ByDid)
-
}
-
}
-
-
secret := uuid.New().String()
-
-
_, err = d.db.Exec(`
-
insert into registrations (domain, did, secret)
-
values (?, ?, ?)
-
on conflict(domain) do update set did = excluded.did, secret = excluded.secret
-
`, domain, did, secret)
-
-
if err != nil {
-
return "", err
-
}
-
-
return secret, nil
-
}
-
-
func (d *DB) GetRegistrationKey(domain string) (string, error) {
-
res := d.db.QueryRow(`select secret from registrations where domain = ?`, domain)
-
-
var secret string
-
err := res.Scan(&secret)
-
if err != nil || secret == "" {
-
return "", err
-
}
-
-
return secret, nil
-
}
-
-
func (d *DB) Register(domain string) error {
-
_, err := d.db.Exec(`
-
update registrations
-
set registered = strftime('%s', 'now')
-
where domain = ?;
-
`, domain)
-
-
return err
-
}
+158
appview/db/registration.go
···
+
package db
+
+
import (
+
"database/sql"
+
"fmt"
+
"log"
+
"time"
+
+
"github.com/google/uuid"
+
)
+
+
type Registration struct {
+
Domain string
+
ByDid string
+
Created *time.Time
+
Registered *time.Time
+
}
+
+
func (r *Registration) Status() Status {
+
if r.Registered != nil {
+
return Registered
+
} else {
+
return Pending
+
}
+
}
+
+
type Status uint32
+
+
const (
+
Registered Status = iota
+
Pending
+
)
+
+
// returns registered status, did of owner, error
+
func (d *DB) RegistrationsByDid(did string) ([]Registration, error) {
+
var registrations []Registration
+
+
rows, err := d.db.Query(`
+
select domain, did, created, registered from registrations
+
where did = ?
+
`, did)
+
if err != nil {
+
return nil, err
+
}
+
+
for rows.Next() {
+
var createdAt *int64
+
var registeredAt *int64
+
var registration Registration
+
err = rows.Scan(&registration.Domain, &registration.ByDid, &createdAt, &registeredAt)
+
+
if err != nil {
+
log.Println(err)
+
} else {
+
createdAtTime := time.Unix(*createdAt, 0)
+
+
var registeredAtTime *time.Time
+
if registeredAt != nil {
+
x := time.Unix(*registeredAt, 0)
+
registeredAtTime = &x
+
}
+
+
registration.Created = &createdAtTime
+
registration.Registered = registeredAtTime
+
registrations = append(registrations, registration)
+
}
+
}
+
+
return registrations, nil
+
}
+
+
// returns registered status, did of owner, error
+
func (d *DB) RegistrationByDomain(domain string) (*Registration, error) {
+
var createdAt *int64
+
var registeredAt *int64
+
var registration Registration
+
+
err := d.db.QueryRow(`
+
select domain, did, created, registered from registrations
+
where domain = ?
+
`, domain).Scan(&registration.Domain, &registration.ByDid, &createdAt, &registeredAt)
+
+
if err != nil {
+
if err == sql.ErrNoRows {
+
return nil, nil
+
} else {
+
return nil, err
+
}
+
}
+
+
createdAtTime := time.Unix(*createdAt, 0)
+
var registeredAtTime *time.Time
+
if registeredAt != nil {
+
x := time.Unix(*registeredAt, 0)
+
registeredAtTime = &x
+
}
+
+
registration.Created = &createdAtTime
+
registration.Registered = registeredAtTime
+
+
return &registration, nil
+
}
+
+
func (d *DB) GenerateRegistrationKey(domain, did string) (string, error) {
+
// sanity check: does this domain already have a registration?
+
reg, err := d.RegistrationByDomain(domain)
+
if err != nil {
+
return "", err
+
}
+
+
// registration is open
+
if reg != nil {
+
switch reg.Status() {
+
case Registered:
+
// already registered by `owner`
+
return "", fmt.Errorf("%s already registered by %s", domain, reg.ByDid)
+
case Pending:
+
// TODO: be loud about this
+
log.Printf("%s registered by %s, status pending", domain, reg.ByDid)
+
}
+
}
+
+
secret := uuid.New().String()
+
+
_, err = d.db.Exec(`
+
insert into registrations (domain, did, secret)
+
values (?, ?, ?)
+
on conflict(domain) do update set did = excluded.did, secret = excluded.secret
+
`, domain, did, secret)
+
+
if err != nil {
+
return "", err
+
}
+
+
return secret, nil
+
}
+
+
func (d *DB) GetRegistrationKey(domain string) (string, error) {
+
res := d.db.QueryRow(`select secret from registrations where domain = ?`, domain)
+
+
var secret string
+
err := res.Scan(&secret)
+
if err != nil || secret == "" {
+
return "", err
+
}
+
+
return secret, nil
+
}
+
+
func (d *DB) Register(domain string) error {
+
_, err := d.db.Exec(`
+
update registrations
+
set registered = strftime('%s', 'now')
+
where domain = ?;
+
`, domain)
+
+
return err
+
}
+57
appview/db/repos.go
···
+
package db
+
+
type Repo struct {
+
Did string
+
Name string
+
Knot string
+
Created *int64
+
}
+
+
func (d *DB) GetAllReposByDid(did string) ([]Repo, error) {
+
var repos []Repo
+
+
rows, err := d.db.Query(`select did, name, knot, created from repos where did = ?`, did)
+
if err != nil {
+
return nil, err
+
}
+
defer rows.Close()
+
+
for rows.Next() {
+
var repo Repo
+
var createdAt *int64
+
if err := rows.Scan(&repo.Did, &repo.Name, &repo.Knot, &createdAt); err != nil {
+
return nil, err
+
}
+
repo.Created = createdAt
+
repos = append(repos, repo)
+
}
+
+
if err := rows.Err(); err != nil {
+
return nil, err
+
}
+
+
return repos, nil
+
}
+
+
func (d *DB) GetRepo(did, name string) (*Repo, error) {
+
var repo Repo
+
+
row := d.db.QueryRow(`select did, name, knot, created from repos where did = ? and name = ?`, did, name)
+
var createdAt *int64
+
if err := row.Scan(&repo.Did, &repo.Name, &repo.Knot, &createdAt); err != nil {
+
return nil, err
+
}
+
repo.Created = createdAt
+
+
return &repo, nil
+
}
+
+
func (d *DB) AddRepo(repo *Repo) error {
+
_, err := d.db.Exec(`insert into repos (did, name, knot) values (?, ?, ?)`, repo.Did, repo.Name, repo.Knot)
+
return err
+
}
+
+
func (d *DB) RemoveRepo(did, name, knot string) error {
+
_, err := d.db.Exec(`delete from repos where did = ? and name = ? and knot = ?`, did, name, knot)
+
return err
+
}
+13
appview/state/state.go
···
return
}
+
// add to local db
+
repo := &db.Repo{
+
Did: user.Did,
+
Name: repoName,
+
Knot: domain,
+
}
+
+
err = s.db.AddRepo(repo)
+
if err != nil {
+
log.Println("failed to add repo to db", err)
+
return
+
}
+
w.Write([]byte("created!"))
}
}