forked from wrenn/wrenn
Admin panel now includes a Teams page with paginated listing of all teams (including soft-deleted), BYOC enable with confirmation dialog, and team deletion with active capsule warnings. Shows member count, owner info, active capsules, and channel count per team.
81 lines
2.5 KiB
SQL
81 lines
2.5 KiB
SQL
-- name: InsertTeam :one
|
|
INSERT INTO teams (id, name, slug)
|
|
VALUES ($1, $2, $3)
|
|
RETURNING *;
|
|
|
|
-- name: GetTeam :one
|
|
SELECT * FROM teams WHERE id = $1;
|
|
|
|
-- name: InsertTeamMember :exec
|
|
INSERT INTO users_teams (user_id, team_id, is_default, role)
|
|
VALUES ($1, $2, $3, $4);
|
|
|
|
-- name: GetDefaultTeamForUser :one
|
|
SELECT t.* FROM teams t
|
|
JOIN users_teams ut ON ut.team_id = t.id
|
|
WHERE ut.user_id = $1 AND ut.is_default = TRUE AND t.deleted_at IS NULL
|
|
LIMIT 1;
|
|
|
|
-- name: SetTeamBYOC :exec
|
|
UPDATE teams SET is_byoc = $2 WHERE id = $1;
|
|
|
|
-- name: GetBYOCTeams :many
|
|
SELECT * FROM teams WHERE is_byoc = TRUE AND deleted_at IS NULL ORDER BY created_at;
|
|
|
|
-- name: GetTeamMembership :one
|
|
SELECT * FROM users_teams WHERE user_id = $1 AND team_id = $2;
|
|
|
|
-- name: UpdateTeamName :exec
|
|
UPDATE teams SET name = $2 WHERE id = $1 AND deleted_at IS NULL;
|
|
|
|
-- name: SoftDeleteTeam :exec
|
|
UPDATE teams SET deleted_at = NOW() WHERE id = $1;
|
|
|
|
-- name: GetTeamBySlug :one
|
|
SELECT * FROM teams WHERE slug = $1 AND deleted_at IS NULL;
|
|
|
|
-- name: GetTeamsForUser :many
|
|
SELECT t.id, t.name, t.slug, t.is_byoc, t.created_at, t.deleted_at, ut.role
|
|
FROM teams t
|
|
JOIN users_teams ut ON ut.team_id = t.id
|
|
WHERE ut.user_id = $1 AND t.deleted_at IS NULL
|
|
ORDER BY ut.created_at;
|
|
|
|
-- name: GetTeamMembers :many
|
|
SELECT u.id, u.name, u.email, ut.role, ut.created_at AS joined_at
|
|
FROM users_teams ut
|
|
JOIN users u ON u.id = ut.user_id
|
|
WHERE ut.team_id = $1
|
|
ORDER BY ut.created_at;
|
|
|
|
-- name: UpdateMemberRole :exec
|
|
UPDATE users_teams SET role = $3 WHERE team_id = $1 AND user_id = $2;
|
|
|
|
-- name: DeleteTeamMember :exec
|
|
DELETE FROM users_teams WHERE team_id = $1 AND user_id = $2;
|
|
|
|
-- name: ListTeamsAdmin :many
|
|
SELECT
|
|
t.id,
|
|
t.name,
|
|
t.slug,
|
|
t.is_byoc,
|
|
t.created_at,
|
|
t.deleted_at,
|
|
(SELECT COUNT(*) FROM users_teams ut WHERE ut.team_id = t.id)::int AS member_count,
|
|
COALESCE(owner_u.name, '') AS owner_name,
|
|
COALESCE(owner_u.email, '') AS owner_email,
|
|
(SELECT COUNT(*) FROM sandboxes s WHERE s.team_id = t.id AND s.status IN ('running', 'paused', 'starting'))::int AS active_sandbox_count,
|
|
(SELECT COUNT(*) FROM channels c WHERE c.team_id = t.id)::int AS channel_count
|
|
FROM teams t
|
|
LEFT JOIN users_teams owner_ut ON owner_ut.team_id = t.id AND owner_ut.role = 'owner'
|
|
LEFT JOIN users owner_u ON owner_u.id = owner_ut.user_id
|
|
WHERE t.id != '00000000-0000-0000-0000-000000000000'
|
|
ORDER BY t.deleted_at ASC NULLS FIRST, t.created_at DESC
|
|
LIMIT $1 OFFSET $2;
|
|
|
|
-- name: CountTeamsAdmin :one
|
|
SELECT COUNT(*)::int AS total
|
|
FROM teams
|
|
WHERE id != '00000000-0000-0000-0000-000000000000';
|