this repo has no description

appview: add repo to db

Changed files
+236 -152
appview
+8 -152
appview/db/db.go
··· 2 3 import ( 4 "database/sql" 5 - "fmt" 6 - "log" 7 - "time" 8 9 - "github.com/google/uuid" 10 _ "github.com/mattn/go-sqlite3" 11 ) 12 ··· 35 created integer default (strftime('%s', 'now')), 36 unique(did, name, key) 37 ); 38 `) 39 if err != nil { 40 return nil, err 41 } 42 return &DB{db: db}, nil 43 } 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(&registration.Domain, &registration.ByDid, &createdAt, &registeredAt) 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(&registration.Domain, &registration.ByDid, &createdAt, &registeredAt) 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 &registration, 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 - }
··· 2 3 import ( 4 "database/sql" 5 6 _ "github.com/mattn/go-sqlite3" 7 ) 8 ··· 31 created integer default (strftime('%s', 'now')), 32 unique(did, name, key) 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 + ); 42 `) 43 if err != nil { 44 return nil, err 45 } 46 return &DB{db: db}, nil 47 }
+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(&registration.Domain, &registration.ByDid, &createdAt, &registeredAt) 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(&registration.Domain, &registration.ByDid, &createdAt, &registeredAt) 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 &registration, 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
···
··· 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
··· 450 return 451 } 452 453 w.Write([]byte("created!")) 454 } 455 }
··· 450 return 451 } 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 + 466 w.Write([]byte("created!")) 467 } 468 }