···11+package db
22+33+import (
44+ "database/sql"
55+66+ _ "github.com/mattn/go-sqlite3"
77+)
88+99+type DB struct {
1010+ db *sql.DB
1111+}
1212+1313+func Setup(dbPath string) (*DB, error) {
1414+ db, err := sql.Open("sqlite3", dbPath)
1515+ if err != nil {
1616+ return nil, err
1717+ }
1818+1919+ _, err = db.Exec(`
2020+ create table if not exists public_keys (
2121+ id integer primary key autoincrement,
2222+ did text not null,
2323+ name text not null,
2424+ key text not null,
2525+ created timestamp default current_timestamp,
2626+ unique(did, name, key)
2727+ );
2828+ create table if not exists repos (
2929+ id integer primary key autoincrement,
3030+ did text not null,
3131+ name text not null,
3232+ description text not null,
3333+ created timestamp default current_timestamp,
3434+ unique(did, name)
3535+ );
3636+ create table if not exists access_levels (
3737+ id integer primary key autoincrement,
3838+ repo_id integer not null,
3939+ did text not null,
4040+ access text not null check (access in ('OWNER', 'WRITER')),
4141+ created timestamp default current_timestamp,
4242+ unique(repo_id, did),
4343+ foreign key (repo_id) references repos(id) on delete cascade
4444+ );
4545+ `)
4646+ if err != nil {
4747+ return nil, err
4848+ }
4949+5050+ return &DB{db: db}, nil
5151+}