this repo has no description
1package db 2 3import ( 4 "log" 5 "strings" 6) 7 8// forms a poset 9type Level int 10 11const ( 12 Reader Level = iota 13 Writer 14 Owner 15) 16 17var ( 18 levelMap = map[string]Level{ 19 "writer": Writer, 20 "owner": Owner, 21 } 22) 23 24func ParseLevel(str string) (Level, bool) { 25 c, ok := levelMap[strings.ToLower(str)] 26 return c, ok 27} 28 29func (l Level) String() string { 30 switch l { 31 case Owner: 32 return "OWNER" 33 case Writer: 34 return "WRITER" 35 case Reader: 36 return "READER" 37 default: 38 return "READER" 39 } 40} 41 42func (d *DB) SetAccessLevel(userDid string, repoDid string, repoName string, level Level) error { 43 _, err := d.db.Exec( 44 `insert 45 into access_levels (repo_id, did, access) 46 values ((select id from repos where did = $1 and name = $2), $3, $4) 47 on conflict (repo_id, did) 48 do update set access = $4;`, 49 repoDid, repoName, userDid, level.String()) 50 return err 51} 52 53func (d *DB) SetOwner(userDid string, repoDid string, repoName string) error { 54 return d.SetAccessLevel(userDid, repoDid, repoName, Owner) 55} 56 57func (d *DB) SetWriter(userDid string, repoDid string, repoName string) error { 58 return d.SetAccessLevel(userDid, repoDid, repoName, Writer) 59} 60 61func (d *DB) GetAccessLevel(userDid string, repoDid string, repoName string) (Level, error) { 62 row := d.db.QueryRow(` 63 select access_levels.access 64 from repos 65 join access_levels 66 on repos.id = access_levels.repo_id 67 where access_levels.did = ? and repos.did = ? and repos.name = ? 68 `, userDid, repoDid, repoName) 69 70 var levelStr string 71 err := row.Scan(&levelStr) 72 if err != nil { 73 log.Println(err) 74 return Reader, err 75 } else { 76 level, _ := ParseLevel(levelStr) 77 return level, nil 78 } 79 80}