team.go

  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}