mirror of
https://github.com/Dvorinka/Containr.git
synced 2026-10-28 15:51:26 +00:00
refactor(db): port preview environments to sqlc
Tranche 3: all 30 raw sites in preview_environments.go — list/detail joins, access-check reads, create/update/delete, promote, user cleanup, TTL sweep, and the status-sync UPDATE...FROM CASE. Deployments and preview_environments schema.sql definitions completed to match runtime. Shared mapper converts generated rows to the PreviewEnvironment DTO; DeleteServiceByID from tranche 2 is reused for clone teardown. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
1 parent
687555fc78
commit
8379f50c54
7 files changed
+1183
-287
No files matched your search
@@ -0,0 +1,121 @@
|
||||
-- name: ListPreviewEnvironmentsForProject :many
|
||||
SELECT pe.id, pe.project_id, pe.service_id, pe.preview_service_id, pe.branch_name, pe.pr_number,
|
||||
pe.environment, pe.status, pe.url, pe.expires_at, pe.created_at, pe.updated_at,
|
||||
s.id AS svc_id, s.name AS service_name, s.type AS service_type
|
||||
FROM preview_environments pe
|
||||
LEFT JOIN services s ON pe.service_id = s.id
|
||||
WHERE pe.project_id = $1
|
||||
ORDER BY pe.created_at DESC;
|
||||
|
||||
-- name: GetPreviewEnvironment :one
|
||||
SELECT pe.id, pe.project_id, pe.service_id, pe.preview_service_id, pe.branch_name, pe.pr_number,
|
||||
pe.environment, pe.status, pe.url, pe.expires_at, pe.created_at, pe.updated_at,
|
||||
s.id AS svc_id, s.name AS service_name, s.type AS service_type
|
||||
FROM preview_environments pe
|
||||
LEFT JOIN services s ON pe.service_id = s.id
|
||||
JOIN projects p ON pe.project_id = p.id
|
||||
WHERE pe.id = $1 AND (p.is_approved OR p.owner_id = $2 OR $3::bool
|
||||
OR EXISTS (SELECT 1 FROM project_members pm WHERE pm.project_id = p.id AND pm.user_id = $2));
|
||||
|
||||
-- name: GetPreviewEnvironmentForWrite :one
|
||||
SELECT pe.id, pe.project_id, pe.service_id, pe.branch_name, pe.pr_number,
|
||||
pe.environment, pe.status, pe.url, pe.expires_at, pe.created_at, pe.updated_at
|
||||
FROM preview_environments pe
|
||||
JOIN projects p ON pe.project_id = p.id
|
||||
WHERE pe.id = $1 AND (p.owner_id = $2 OR $3::bool);
|
||||
|
||||
-- name: GetPreviewEnvironmentForPromote :one
|
||||
SELECT pe.id, pe.project_id, pe.service_id, pe.preview_service_id, pe.branch_name, pe.environment, pe.status
|
||||
FROM preview_environments pe
|
||||
JOIN projects p ON pe.project_id = p.id
|
||||
WHERE pe.id = $1 AND (p.owner_id = $2 OR $3::bool);
|
||||
|
||||
-- name: GetPreviewEnvironmentOwner :one
|
||||
SELECT p.owner_id
|
||||
FROM preview_environments pe
|
||||
JOIN projects p ON pe.project_id = p.id
|
||||
WHERE pe.id = $1;
|
||||
|
||||
-- name: GetPreviewServiceID :one
|
||||
SELECT preview_service_id FROM preview_environments WHERE id = $1;
|
||||
|
||||
-- name: UpdatePreviewEnvironment :exec
|
||||
UPDATE preview_environments
|
||||
SET status = $1, url = $2, expires_at = $3, updated_at = $4
|
||||
WHERE id = $5;
|
||||
|
||||
-- name: MarkPreviewEnvironmentStatus :exec
|
||||
UPDATE preview_environments SET status = $1, updated_at = NOW() WHERE id = $2;
|
||||
|
||||
-- name: DeletePreviewEnvironment :exec
|
||||
DELETE FROM preview_environments WHERE id = $1;
|
||||
|
||||
-- name: CountActivePreviewsForBranch :one
|
||||
SELECT COUNT(*) FROM preview_environments
|
||||
WHERE service_id = $1 AND branch_name = $2 AND status NOT IN ('expired', 'stopped');
|
||||
|
||||
-- name: CreatePreviewEnvironment :exec
|
||||
INSERT INTO preview_environments
|
||||
(id, project_id, service_id, preview_service_id, branch_name, pr_number, environment,
|
||||
status, url, expires_at, created_at, updated_at)
|
||||
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12);
|
||||
|
||||
-- name: UpdateServicePreviewBranch :exec
|
||||
UPDATE services SET git_branch = $1, domain = '', updated_at = NOW() WHERE id = $2;
|
||||
|
||||
-- name: DeleteAllServiceDomains :exec
|
||||
DELETE FROM service_domains WHERE service_id = $1;
|
||||
|
||||
-- name: CreatePreviewDomain :exec
|
||||
INSERT INTO service_domains (service_id, domain, is_default, cert_type) VALUES ($1, $2, true, 'tls');
|
||||
|
||||
-- name: InsertPendingDeployment :exec
|
||||
INSERT INTO deployments (id, service_id, version, commit_hash, status, created_at, updated_at)
|
||||
VALUES ($1, $2, $3, $4, 'pending', NOW(), NOW());
|
||||
|
||||
-- name: ListExpiredPreviewsForUser :many
|
||||
SELECT pe.id, pe.project_id, pe.service_id, pe.preview_service_id, pe.branch_name, pe.environment
|
||||
FROM preview_environments pe
|
||||
JOIN projects p ON pe.project_id = p.id
|
||||
WHERE (p.owner_id = $1 OR $2::bool) AND pe.expires_at < NOW() AND pe.status != 'expired';
|
||||
|
||||
-- name: ListSweepablePreviews :many
|
||||
SELECT id, preview_service_id FROM preview_environments
|
||||
WHERE expires_at < NOW() AND status NOT IN ('expired', 'stopped');
|
||||
|
||||
-- name: SyncPreviewStatuses :exec
|
||||
UPDATE preview_environments pe
|
||||
SET status = derived.st, updated_at = NOW()
|
||||
FROM (
|
||||
SELECT pe2.id,
|
||||
CASE
|
||||
WHEN s.status IN ('running', 'deployed') THEN 'running'
|
||||
WHEN s.status IN ('failed', 'error') THEN 'failed'
|
||||
WHEN s.status IN ('building', 'deploying', 'queued', 'pending', 'cloning') THEN 'building'
|
||||
ELSE pe2.status
|
||||
END AS st
|
||||
FROM preview_environments pe2
|
||||
JOIN services s ON pe2.preview_service_id = s.id
|
||||
) derived
|
||||
WHERE pe.id = derived.id
|
||||
AND pe.status IN ('building', 'running', 'failed')
|
||||
AND pe.status <> derived.st;
|
||||
|
||||
-- name: GetProjectBrief :one
|
||||
SELECT id, name, owner_id FROM projects WHERE id = $1;
|
||||
|
||||
-- name: GetServiceTypeBrief :one
|
||||
SELECT id, name, COALESCE(type, service_type, '') AS service_type FROM services WHERE id = $1 AND project_id = $2;
|
||||
|
||||
-- name: GetServiceForDeploy :one
|
||||
SELECT s.id, s.project_id, s.name, s.type, s.status, s.image, s.command,
|
||||
s.environment, s.git_repo, s.git_branch, s.build_path, s.cpu, s.memory,
|
||||
COALESCE(s.replicas, 1) AS replicas, COALESCE(s.port, 0) AS port,
|
||||
COALESCE(s.domain, '') AS domain, COALESCE(s.healthcheck_path, '') AS healthcheck_path,
|
||||
COALESCE(s.restart_policy, 'unless-stopped') AS restart_policy,
|
||||
COALESCE(s.builder, 'auto') AS builder, COALESCE(s.cpu_reserve, '') AS cpu_reserve,
|
||||
COALESCE(s.memory_reserve, '') AS memory_reserve, COALESCE(s.static_build_cmd, '') AS static_build_cmd,
|
||||
COALESCE(s.static_dir, '') AS static_dir,
|
||||
s.created_at, s.updated_at
|
||||
FROM services s
|
||||
WHERE s.id = $1;
|
||||
@@ -98,11 +98,37 @@ CREATE TABLE service_domains (
|
||||
);
|
||||
|
||||
CREATE TABLE deployments (
|
||||
id UUID PRIMARY KEY,
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
service_id UUID NOT NULL REFERENCES services(id) ON DELETE CASCADE,
|
||||
status VARCHAR(50),
|
||||
version VARCHAR(255) NOT NULL,
|
||||
commit_hash VARCHAR(255),
|
||||
image_digest VARCHAR(255),
|
||||
status VARCHAR(50) DEFAULT 'created',
|
||||
build_log TEXT,
|
||||
deployment_log TEXT,
|
||||
started_at TIMESTAMPTZ,
|
||||
completed_at TIMESTAMPTZ,
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
||||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
image_name VARCHAR(255),
|
||||
image_tag VARCHAR(255),
|
||||
runtime_log TEXT,
|
||||
error TEXT
|
||||
);
|
||||
|
||||
CREATE TABLE preview_environments (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
project_id UUID NOT NULL,
|
||||
service_id UUID NOT NULL,
|
||||
branch_name VARCHAR(255) NOT NULL,
|
||||
pr_number INTEGER,
|
||||
environment VARCHAR(255) NOT NULL,
|
||||
status VARCHAR(50) NOT NULL DEFAULT 'building',
|
||||
url TEXT,
|
||||
expires_at TIMESTAMPTZ NOT NULL,
|
||||
created_at TIMESTAMPTZ DEFAULT now(),
|
||||
updated_at TIMESTAMPTZ DEFAULT now(),
|
||||
preview_service_id UUID
|
||||
);
|
||||
|
||||
CREATE TABLE environment_variables (
|
||||
|
||||
Reference in new issue
Block a user