Monorepo for Tangled
tangled.org
1package db
2
3import (
4 "fmt"
5 "strings"
6 "time"
7
8 "tangled.org/core/appview/models"
9 "tangled.org/core/orm"
10)
11
12func AddCollaborator(e Execer, c models.Collaborator) error {
13 _, err := e.Exec(
14 `insert into collaborators (did, rkey, subject_did, repo_did) values (?, ?, ?, ?)
15 on conflict(repo_did, subject_did) do update set
16 did = excluded.did,
17 rkey = excluded.rkey`,
18 c.Did, c.Rkey, c.SubjectDid, string(c.RepoDid),
19 )
20 return err
21}
22
23func DeleteCollaborator(e Execer, filters ...orm.Filter) error {
24 var conditions []string
25 var args []any
26 for _, filter := range filters {
27 conditions = append(conditions, filter.Condition())
28 args = append(args, filter.Arg()...)
29 }
30
31 whereClause := ""
32 if conditions != nil {
33 whereClause = " where " + strings.Join(conditions, " and ")
34 }
35
36 query := fmt.Sprintf(`delete from collaborators %s`, whereClause)
37
38 _, err := e.Exec(query, args...)
39 return err
40}
41
42func CollaboratingIn(e Execer, collaborator string) ([]models.Repo, error) {
43 rows, err := e.Query(`select repo_did from collaborators where subject_did = ?`, collaborator)
44 if err != nil {
45 return nil, err
46 }
47 defer rows.Close()
48
49 var repoDids []string
50 for rows.Next() {
51 var repoDid string
52 err := rows.Scan(&repoDid)
53 if err != nil {
54 return nil, err
55 }
56 repoDids = append(repoDids, repoDid)
57 }
58 if err := rows.Err(); err != nil {
59 return nil, err
60 }
61 if repoDids == nil {
62 return nil, nil
63 }
64
65 return GetRepos(e, orm.FilterIn("repo_did", repoDids))
66}
67
68func GetCollaborators(e Execer, filters ...orm.Filter) ([]models.Collaborator, error) {
69 var collaborators []models.Collaborator
70 var conditions []string
71 var args []any
72 for _, filter := range filters {
73 conditions = append(conditions, filter.Condition())
74 args = append(args, filter.Arg()...)
75 }
76 whereClause := ""
77 if conditions != nil {
78 whereClause = " where " + strings.Join(conditions, " and ")
79 }
80 query := fmt.Sprintf(`select
81 id,
82 did,
83 rkey,
84 subject_did,
85 repo_did,
86 created
87 from collaborators %s`,
88 whereClause,
89 )
90 rows, err := e.Query(query, args...)
91 if err != nil {
92 return nil, err
93 }
94 defer rows.Close()
95 for rows.Next() {
96 var collaborator models.Collaborator
97 var createdAt string
98 if err := rows.Scan(
99 &collaborator.Id,
100 &collaborator.Did,
101 &collaborator.Rkey,
102 &collaborator.SubjectDid,
103 &collaborator.RepoDid,
104 &createdAt,
105 ); err != nil {
106 return nil, err
107 }
108 collaborator.Created, err = time.Parse(time.RFC3339, createdAt)
109 if err != nil {
110 collaborator.Created = time.Now()
111 }
112 collaborators = append(collaborators, collaborator)
113 }
114 if err := rows.Err(); err != nil {
115 return nil, err
116 }
117 return collaborators, nil
118}