mirror of
https://github.com/Dvorinka/Containr.git
synced 2026-10-28 07:41:27 +00:00
feat: public platform, admin console, templates, landing docs
Projects become publicly browsable after admin approval; management and secret-adjacent reads (logs, variables, exec, connection URLs) require owner/member/admin auth, and platform controls sit behind RequireAdmin. - Backend: OptionalAuth middleware, read/authed/admin route groups, projects.is_approved + service_templates.owner_id migration, visibility-aware sqlc queries, admin overview/users/approval endpoints, EnsureAdminAccount bootstrap (ADMIN_* env), 30 seeded templates with owner CRUD, managed-database connection URLs gated owner+admin, fix DB.Stats() infinite recursion. - Frontend: expandable persisted sidebar + clickable user menu, public landing page with searchable docs browser (GitHub sync, bundled snapshot + localStorage fallback), DocsBrowser shared with /docs, template create/edit/JSON-upload for owned templates, database create dialog, admin console (stats, approvals, project edit/delete, user admin toggles), HA/Security/Usage polish with dead CSS tokens mapped to real theme vars, anonymous-safe gating on every mutation control. - Tests: safe window.localStorage access fixes happy-dom crashes in PlatformShell and canvas storage. 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
8f5789bf93
commit
8b6214a0f5
62 files changed
+4986
-1133
No files matched your search
@@ -1,19 +1,76 @@
|
||||
-- name: ListServiceTemplates :many
|
||||
SELECT id, name, description, category, logo, config, variables, is_official, created_at, updated_at
|
||||
-- name: ListServiceTemplatesForUser :many
|
||||
SELECT id, name, description, category, logo, config, variables, is_official, owner_id, created_at, updated_at
|
||||
FROM service_templates
|
||||
WHERE is_official = true OR owner_id = sqlc.narg(owner_id)
|
||||
ORDER BY is_official DESC, name ASC;
|
||||
|
||||
-- name: ListServiceTemplatesByCategory :many
|
||||
SELECT id, name, description, category, logo, config, variables, is_official, created_at, updated_at
|
||||
-- name: ListServiceTemplatesByCategoryForUser :many
|
||||
SELECT id, name, description, category, logo, config, variables, is_official, owner_id, created_at, updated_at
|
||||
FROM service_templates
|
||||
WHERE category = $1
|
||||
WHERE category = sqlc.arg(category)
|
||||
AND (is_official = true OR owner_id = sqlc.narg(owner_id))
|
||||
ORDER BY is_official DESC, name ASC;
|
||||
|
||||
-- name: GetServiceTemplateByID :one
|
||||
SELECT id, name, description, category, logo, config, variables, is_official, created_at, updated_at
|
||||
SELECT id, name, description, category, logo, config, variables, is_official, owner_id, created_at, updated_at
|
||||
FROM service_templates
|
||||
WHERE id = $1;
|
||||
|
||||
-- name: UpsertServiceTemplate :exec
|
||||
INSERT INTO service_templates (id, name, description, category, logo, config, variables, is_official)
|
||||
VALUES (
|
||||
sqlc.arg(id),
|
||||
sqlc.arg(name),
|
||||
sqlc.narg(description),
|
||||
sqlc.arg(category),
|
||||
sqlc.narg(logo),
|
||||
sqlc.arg(config),
|
||||
sqlc.narg(variables),
|
||||
sqlc.arg(is_official)
|
||||
)
|
||||
ON CONFLICT (id) DO UPDATE
|
||||
SET name = EXCLUDED.name,
|
||||
description = EXCLUDED.description,
|
||||
category = EXCLUDED.category,
|
||||
logo = EXCLUDED.logo,
|
||||
config = EXCLUDED.config,
|
||||
variables = EXCLUDED.variables,
|
||||
is_official = EXCLUDED.is_official,
|
||||
updated_at = NOW();
|
||||
|
||||
-- name: CreateUserTemplate :exec
|
||||
INSERT INTO service_templates (id, name, description, category, logo, config, variables, is_official, owner_id)
|
||||
VALUES (
|
||||
sqlc.arg(id),
|
||||
sqlc.arg(name),
|
||||
sqlc.narg(description),
|
||||
sqlc.arg(category),
|
||||
sqlc.narg(logo),
|
||||
sqlc.arg(config),
|
||||
sqlc.narg(variables),
|
||||
false,
|
||||
sqlc.arg(owner_id)
|
||||
);
|
||||
|
||||
-- name: UpdateUserTemplate :execrows
|
||||
UPDATE service_templates
|
||||
SET name = sqlc.arg(name),
|
||||
description = sqlc.narg(description),
|
||||
category = sqlc.arg(category),
|
||||
logo = sqlc.narg(logo),
|
||||
config = sqlc.arg(config),
|
||||
variables = sqlc.narg(variables),
|
||||
updated_at = NOW()
|
||||
WHERE id = sqlc.arg(id)
|
||||
AND owner_id = sqlc.arg(owner_id)
|
||||
AND is_official = false;
|
||||
|
||||
-- name: DeleteUserTemplate :execrows
|
||||
DELETE FROM service_templates
|
||||
WHERE id = sqlc.arg(id)
|
||||
AND owner_id = sqlc.arg(owner_id)
|
||||
AND is_official = false;
|
||||
|
||||
-- name: GetProjectOwnerID :one
|
||||
SELECT owner_id
|
||||
FROM projects
|
||||
|
||||
Reference in new issue
Block a user