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}