1package database
2
3import (
4 "context"
5
6 "github.com/charmbracelet/soft-serve/pkg/access"
7 "github.com/charmbracelet/soft-serve/pkg/db"
8 "github.com/charmbracelet/soft-serve/pkg/db/models"
9 "github.com/charmbracelet/soft-serve/pkg/store"
10)
11
12// TODO: should we return all the org's teams if the user is an org admin?
13// if so, need to join organization_members too on the selects below.
14
15var _ store.TeamStore = (*teamStore)(nil)
16
17type teamStore struct{}
18
19// RemoveUserFromTeam implements store.TeamStore.
20func (*teamStore) RemoveUserFromTeam(ctx context.Context, h db.Handler, team int64, user int64) error {
21 // TODO: caller perms
22 query := h.Rebind(`
23 DELETE FROM team_members
24 WHERE
25 team_id = ?
26 AND user_id = ?
27 `)
28 _, err := h.ExecContext(ctx, query, team, user)
29 return err
30}
31
32// UpdateUserAccessInTeam implements store.TeamStore.
33func (*teamStore) UpdateUserAccessInTeam(ctx context.Context, h db.Handler, team int64, user int64, lvl access.AccessLevel) error {
34 // TODO: caller perms
35 query := h.Rebind(`
36 UPDATE team_members
37 WHERE
38 team_id = ?
39 AND user_id = ?
40 SET
41 access_level = ?
42 `)
43 _, err := h.ExecContext(ctx, query, team, user, lvl)
44 return err
45}
46
47// AddUserToTeam implements store.TeamStore.
48func (*teamStore) AddUserToTeam(ctx context.Context, h db.Handler, team int64, user int64, lvl access.AccessLevel) error {
49 // TODO: caller perms
50 query := h.Rebind(`
51 INSERT INTO
52 team_members (team_id, user_id, access_level, updated_at)
53 VALUES
54 (?, ?, ?, CURRENT_TIMESTAMP);
55 `)
56 _, err := h.ExecContext(ctx, query, team, user, lvl)
57 return err
58}
59
60// CreateTeam implements store.TeamStore.
61func (s *teamStore) CreateTeam(ctx context.Context, h db.Handler, user, org int64, name string) (models.Team, error) {
62 // TODO: caller perms
63 // TODO: what the access_level column does on team?
64 query := h.Rebind(`
65 INSERT INTO
66 teams (organization_id, name)
67 VALUES
68 (?, ?) RETURNING *
69 `)
70 var team models.Team
71 if err := h.GetContext(ctx, &team, query, org, name); err != nil {
72 return models.Team{}, err
73 }
74 return team, s.AddUserToTeam(ctx, h, team.ID, user, access.AdminAccess)
75}
76
77// DeleteTeamByID implements store.TeamStore.
78func (*teamStore) DeleteTeamByID(ctx context.Context, h db.Handler, id int64) error {
79 // TODO: caller perms
80 query := h.Rebind(`
81 DELETE FROM teams
82 WHERE
83 id = ?
84 `)
85 _, err := h.ExecContext(ctx, query, id)
86 return err
87}
88
89// FindTeamByName implements store.TeamStore.
90func (*teamStore) FindTeamByName(ctx context.Context, h db.Handler, uid int64, name string) ([]models.Team, error) {
91 query := h.Rebind(`
92 SELECT
93 t.*
94 FROM
95 teams t
96 JOIN team_members tm ON tm.team_id = t.id
97 WHERE
98 tm.user_id = ?
99 AND t.name = ?
100 `)
101 var teams []models.Team
102 err := h.SelectContext(ctx, &teams, query, uid, name)
103 return teams, err
104}
105
106// FindTeamByOrgName implements store.TeamStore.
107func (*teamStore) FindTeamByOrgName(ctx context.Context, h db.Handler, user int64, org int64, name string) (models.Team, error) {
108 query := h.Rebind(`
109 SELECT
110 t.*
111 FROM
112 teams t
113 JOIN team_members tm ON tm.team_id = t.id
114 WHERE
115 tm.user_id = ?
116 AND t.organization_id = ?
117 AND t.name = ?
118 `)
119 var team models.Team
120 err := h.GetContext(ctx, &team, query, user, org, name)
121 return team, err
122}
123
124// GetTeamByID implements store.TeamStore.
125func (*teamStore) GetTeamByID(ctx context.Context, h db.Handler, uid, id int64) (models.Team, error) {
126 query := h.Rebind(`
127 SELECT
128 t.*
129 FROM
130 teams t
131 JOIN team_members tm ON tm.team_id = t.id
132 WHERE
133 tm.user_id = ?
134 AND t.id = ?
135 `)
136 var team models.Team
137 err := h.GetContext(ctx, &team, query, uid, id)
138 return team, err
139}
140
141// ListTeams implements store.TeamStore.
142func (*teamStore) ListTeams(ctx context.Context, h db.Handler, uid int64) ([]models.Team, error) {
143 query := h.Rebind(`
144 SELECT
145 t.*
146 FROM
147 teams t
148 JOIN team_members tm ON tm.team_id = t.id
149 WHERE
150 tm.user_id = ?
151 `)
152 var teams []models.Team
153 err := h.SelectContext(ctx, &teams, query, uid)
154 return teams, err
155}