forked from wrenn/wrenn
- Three-role model (owner/admin/member) with owner protection invariants - Team CRUD: create, rename (admin+), soft-delete with VM cleanup (owner only) - Member management: add by email, remove, role updates (admin+), leave - Switch-team endpoint re-issues JWT after DB membership verification - User email prefix search for add-member UI autocomplete - JWT carries role as a hint; all authorization decisions verified from DB - Team slug: immutable 12-char hex (e.g. a1b2c3-d1e2f3), reserved on soft-delete - Migration adds slug + deleted_at to teams; backfills existing rows
59 lines
1.4 KiB
SQL
59 lines
1.4 KiB
SQL
-- name: InsertSandbox :one
|
|
INSERT INTO sandboxes (id, team_id, host_id, template, status, vcpus, memory_mb, timeout_sec)
|
|
VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
|
|
RETURNING *;
|
|
|
|
-- name: GetSandbox :one
|
|
SELECT * FROM sandboxes WHERE id = $1;
|
|
|
|
-- name: GetSandboxByTeam :one
|
|
SELECT * FROM sandboxes WHERE id = $1 AND team_id = $2;
|
|
|
|
-- name: ListSandboxes :many
|
|
SELECT * FROM sandboxes ORDER BY created_at DESC;
|
|
|
|
-- name: ListSandboxesByTeam :many
|
|
SELECT * FROM sandboxes
|
|
WHERE team_id = $1 AND status NOT IN ('stopped', 'error')
|
|
ORDER BY created_at DESC;
|
|
|
|
-- name: ListSandboxesByHostAndStatus :many
|
|
SELECT * FROM sandboxes
|
|
WHERE host_id = $1 AND status = ANY($2::text[])
|
|
ORDER BY created_at DESC;
|
|
|
|
-- name: UpdateSandboxRunning :one
|
|
UPDATE sandboxes
|
|
SET status = 'running',
|
|
host_ip = $2,
|
|
guest_ip = $3,
|
|
started_at = $4,
|
|
last_active_at = $4,
|
|
last_updated = NOW()
|
|
WHERE id = $1
|
|
RETURNING *;
|
|
|
|
-- name: UpdateSandboxStatus :one
|
|
UPDATE sandboxes
|
|
SET status = $2,
|
|
last_updated = NOW()
|
|
WHERE id = $1
|
|
RETURNING *;
|
|
|
|
-- name: UpdateLastActive :exec
|
|
UPDATE sandboxes
|
|
SET last_active_at = $2,
|
|
last_updated = NOW()
|
|
WHERE id = $1;
|
|
|
|
-- name: BulkUpdateStatusByIDs :exec
|
|
UPDATE sandboxes
|
|
SET status = $2,
|
|
last_updated = NOW()
|
|
WHERE id = ANY($1::text[]);
|
|
|
|
-- name: ListActiveSandboxesByTeam :many
|
|
SELECT * FROM sandboxes
|
|
WHERE team_id = $1 AND status IN ('running', 'paused', 'starting')
|
|
ORDER BY created_at DESC;
|