mirror of
https://github.com/Dvorinka/Containr.git
synced 2026-06-03 20:12:58 +00:00
100 lines
3.0 KiB
SQL
100 lines
3.0 KiB
SQL
-- name: ListProjectsWithStatsByUser :many
|
|
SELECT
|
|
p.id,
|
|
p.name,
|
|
p.description,
|
|
p.owner_id,
|
|
p.created_at,
|
|
p.updated_at,
|
|
COUNT(DISTINCT s.id)::bigint AS service_count,
|
|
COUNT(DISTINCT d.id)::bigint AS deployment_count,
|
|
COUNT(DISTINCT CASE WHEN s.status = 'running' THEN s.id END)::bigint AS running_services,
|
|
(
|
|
SELECT d2.created_at
|
|
FROM deployments d2
|
|
JOIN services s2 ON s2.id = d2.service_id
|
|
WHERE s2.project_id = p.id
|
|
ORDER BY d2.created_at DESC
|
|
LIMIT 1
|
|
) AS last_deployment
|
|
FROM projects p
|
|
LEFT JOIN services s ON s.project_id = p.id
|
|
LEFT JOIN deployments d ON d.service_id = s.id
|
|
WHERE
|
|
(p.owner_id = sqlc.arg(user_id) OR EXISTS (
|
|
SELECT 1
|
|
FROM project_members pm
|
|
WHERE pm.project_id = p.id AND pm.user_id = sqlc.arg(user_id)
|
|
))
|
|
AND (
|
|
sqlc.narg(search)::text IS NULL
|
|
OR p.name ILIKE ('%' || sqlc.narg(search)::text || '%')
|
|
OR COALESCE(p.description, '') ILIKE ('%' || sqlc.narg(search)::text || '%')
|
|
)
|
|
GROUP BY p.id, p.name, p.description, p.owner_id, p.created_at, p.updated_at
|
|
ORDER BY p.updated_at DESC
|
|
LIMIT sqlc.arg(limit_count) OFFSET sqlc.arg(offset_count);
|
|
|
|
-- name: CountProjectsByUser :one
|
|
SELECT COUNT(*)::bigint AS total
|
|
FROM projects p
|
|
WHERE
|
|
(p.owner_id = sqlc.arg(user_id) OR EXISTS (
|
|
SELECT 1
|
|
FROM project_members pm
|
|
WHERE pm.project_id = p.id AND pm.user_id = sqlc.arg(user_id)
|
|
))
|
|
AND (
|
|
sqlc.narg(search)::text IS NULL
|
|
OR p.name ILIKE ('%' || sqlc.narg(search)::text || '%')
|
|
OR COALESCE(p.description, '') ILIKE ('%' || sqlc.narg(search)::text || '%')
|
|
);
|
|
|
|
-- name: GetProjectByIDForUser :one
|
|
SELECT p.id, p.name, p.description, p.owner_id, p.created_at, p.updated_at
|
|
FROM projects p
|
|
WHERE p.id = sqlc.arg(project_id)
|
|
AND (
|
|
p.owner_id = sqlc.arg(user_id)
|
|
OR EXISTS (
|
|
SELECT 1
|
|
FROM project_members pm
|
|
WHERE pm.project_id = p.id AND pm.user_id = sqlc.arg(user_id)
|
|
)
|
|
);
|
|
|
|
-- name: CreateProject :one
|
|
INSERT INTO projects (name, description, owner_id)
|
|
VALUES (sqlc.arg(name), sqlc.narg(description), sqlc.arg(owner_id))
|
|
RETURNING id, name, description, owner_id, created_at, updated_at;
|
|
|
|
-- name: InsertProjectEnvironment :exec
|
|
INSERT INTO environments (name, project_id)
|
|
VALUES (sqlc.arg(name), sqlc.arg(project_id));
|
|
|
|
-- name: GetProjectRoleForUser :one
|
|
SELECT (CASE
|
|
WHEN p.owner_id = sqlc.arg(user_id) THEN 'owner'
|
|
ELSE COALESCE(pm.role, '')
|
|
END)::text AS role
|
|
FROM projects p
|
|
LEFT JOIN project_members pm ON p.id = pm.project_id AND pm.user_id = sqlc.arg(user_id)
|
|
WHERE p.id = sqlc.arg(project_id);
|
|
|
|
-- name: UpdateProjectByID :execrows
|
|
UPDATE projects
|
|
SET
|
|
name = COALESCE(sqlc.narg(name), name),
|
|
description = COALESCE(sqlc.narg(description), description),
|
|
updated_at = NOW()
|
|
WHERE id = sqlc.arg(project_id);
|
|
|
|
-- name: GetProjectOwnerByID :one
|
|
SELECT owner_id
|
|
FROM projects
|
|
WHERE id = sqlc.arg(project_id);
|
|
|
|
-- name: DeleteProjectByID :execrows
|
|
DELETE FROM projects
|
|
WHERE id = sqlc.arg(project_id);
|