Select the types of activity you want to include in your feed.
implement access levels
- new table tracks access levels between each DID and a repo - creators of a repo are owners by default - newly added members are writers by default - introduces AccessLevel middleware to mask routes based on level
···11+package db22+33+import (44+ "log"55+ "strings"66+)77+88+// forms a poset99+type Level int1010+1111+const (1212+ Reader Level = iota1313+ Writer1414+ Owner1515+)1616+1717+var (1818+ levelMap = map[string]Level{1919+ "writer": Writer,2020+ "owner": Owner,2121+ }2222+)2323+2424+func ParseLevel(str string) (Level, bool) {2525+ c, ok := levelMap[strings.ToLower(str)]2626+ return c, ok2727+}2828+2929+func (l Level) String() string {3030+ switch l {3131+ case Owner:3232+ return "OWNER"3333+ case Writer:3434+ return "WRITER"3535+ case Reader:3636+ return "READER"3737+ default:3838+ return "READER"3939+ }4040+}4141+4242+func (d *DB) SetAccessLevel(userDid string, repoDid string, repoName string, level Level) error {4343+ _, err := d.db.Exec(4444+ `insert4545+ into access_levels (repo_id, did, access)4646+ values ((select id from repos where did = $1 and name = $2), $3, $4)4747+ on conflict (repo_id, did)4848+ do update set access = $4;`,4949+ repoDid, repoName, userDid, level.String())5050+ return err5151+}5252+5353+func (d *DB) SetOwner(userDid string, repoDid string, repoName string) error {5454+ return d.SetAccessLevel(userDid, repoDid, repoName, Owner)5555+}5656+5757+func (d *DB) SetWriter(userDid string, repoDid string, repoName string) error {5858+ return d.SetAccessLevel(userDid, repoDid, repoName, Writer)5959+}6060+6161+func (d *DB) GetAccessLevel(userDid string, repoDid string, repoName string) (Level, error) {6262+ row := d.db.QueryRow(`6363+ select access_levels.access6464+ from repos6565+ join access_levels6666+ on repos.id = access_levels.repo_id6767+ where access_levels.did = ? and repos.did = ? and repos.name = ?6868+ `, userDid, repoDid, repoName)6969+7070+ var levelStr string7171+ err := row.Scan(&levelStr)7272+ if err != nil {7373+ log.Println(err)7474+ return Reader, err7575+ } else {7676+ level, _ := ParseLevel(levelStr)7777+ return level, nil7878+ }7979+8080+}
+10-1
db/init.go
···3232 description text not null,3333 created timestamp default current_timestamp,3434 unique(did, name)3535- )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 cascade4444+ );3645 `)3746 if err != nil {3847 return nil, err