diff --git a/TODO.md b/TODO.md index f2db8051..fcd0eada 100644 --- a/TODO.md +++ b/TODO.md @@ -3,7 +3,7 @@ ## UI Related - [ ] Fix Theming to be more professional (use frontend themeing skill & make it look like a professional product) - +- [x] replace emoji in the top left with the actual icon ## Future BS - [ ] CPU, MEM, NET, DISK sentinal first-installed on EC2s to expose a backend for the user's ui to hit, THROUGH A BACKEND PROXY ROUTE so we can cache and rate limit the requests. This will allow for a better dashboard and better stats for the user to see. We'll use an obscure port for the sentinal so that we dont hit any other services the user may have. Sentinal is our own little C program exposing the stats we need, seperate repo for that thing tho! diff --git a/backend/src/index.ts b/backend/src/index.ts index dd26f24d..6346aa88 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -18,7 +18,7 @@ import { runWebhookReconciliation } from "./services/webhookReconcile"; import { loginHandler, logoutHandler, meHandler, setupStatusHandler, firstUserHandler } from "./routes/auth"; import { webhookHandler } from "./routes/webhook"; -import { getUserSettings, updateUsername, updatePassword, updateGitea, updateAws, getWebhookSecret, regenerateWebhookSecret } from "./routes/api/user"; +import { getUserSettings, updateUsername, updatePassword, updateGitea, updateAws, skipSetupWizard, getWebhookSecret, regenerateWebhookSecret } from "./routes/api/user"; import { listRepos, saveRepoConfig, toggleRepoEnabled, getRepoConfig } from "./routes/api/repos"; import { listPreviews, getPreview, stopPreviewRoute, rebuildPreviewRoute, previewLogsWs, previewAppLogsWs } from "./routes/api/previews"; import { getStats } from "./routes/api/stats"; @@ -66,6 +66,7 @@ server.path("/", (path) => path .http("PATCH", "/api/user/password", (http) => http.onRequest(updatePassword)) .http("PUT", "/api/user/gitea", (http) => http.onRequest(updateGitea)) .http("PUT", "/api/user/aws", (http) => http.onRequest(updateAws)) + .http("POST", "/api/user/setup/skip", (http) => http.onRequest(skipSetupWizard)) .http("GET", "/api/user/webhook-secret", (http) => http.onRequest(getWebhookSecret)) .http("POST", "/api/user/webhook-secret/regenerate", (http) => http.onRequest(regenerateWebhookSecret)) ); diff --git a/backend/src/routes/api/user.ts b/backend/src/routes/api/user.ts index 469bbc57..117f6f75 100644 --- a/backend/src/routes/api/user.ts +++ b/backend/src/routes/api/user.ts @@ -181,6 +181,18 @@ export async function updateAws(ctr: any) { return makeResponse({ ctr, content: { code: 200, message: `Connected as ${validation.arn}`, data: { arn: validation.arn } } }); } +export async function skipSetupWizard(ctr: any) { + const user = requireAuth(ctr); + if (!user) return makeResponse({ ctr, content: { code: 401, message: ERROR_MESSAGES.UNAUTHORIZED.message } }); + + await prisma.user.update({ + where: { id: user.id }, + data: { setupSkipped: true }, + }); + + return makeResponse({ ctr, content: { code: 200, message: "Setup wizard skipped" } }); +} + export async function getWebhookSecret(ctr: any) { const user = requireAuth(ctr); if (!user) return makeResponse({ ctr, content: { code: 401, message: ERROR_MESSAGES.UNAUTHORIZED.message } }); diff --git a/backend/src/routes/auth.ts b/backend/src/routes/auth.ts index 7ad9a7c3..410ce96a 100644 --- a/backend/src/routes/auth.ts +++ b/backend/src/routes/auth.ts @@ -10,6 +10,17 @@ const log = createLogger("AUTH_ROUTE"); const COOKIE_NAME = "pp_session"; const COOKIE_MAX_AGE_MS = 30 * 24 * 60 * 60 * 1000; +function isSetupComplete(user: { + setupSkipped: boolean; + giteaInstanceUrl: string | null; + giteaPAT: string | null; + awsAccessKeyId: string | null; + awsSecretAccessKey: string | null; + awsRegion: string | null; +}) { + return user.setupSkipped || !!(user.giteaInstanceUrl && user.giteaPAT && user.awsAccessKeyId && user.awsSecretAccessKey && user.awsRegion); +} + export async function loginHandler(ctr: any) { let body: any; try { @@ -82,7 +93,8 @@ export async function meHandler(ctr: any) { awsAccessKeyId: user.awsAccessKeyId ? "****" : null, awsRegion: user.awsRegion, awsConfigured: !!(user.awsAccessKeyId && user.awsSecretAccessKey && user.awsRegion), - setupComplete: !!(user.giteaInstanceUrl && user.giteaPAT && user.awsAccessKeyId && user.awsSecretAccessKey && user.awsRegion), + setupSkipped: user.setupSkipped, + setupComplete: isSetupComplete(user), }, }, }); diff --git a/frontend/src/components/Layout.tsx b/frontend/src/components/Layout.tsx index 57e63331..306b405a 100644 --- a/frontend/src/components/Layout.tsx +++ b/frontend/src/components/Layout.tsx @@ -3,7 +3,7 @@ import { Link, useLocation, useNavigate } from "react-router-dom"; import { useAuth } from "../hooks/useAuth"; import { ThemePreference, useTheme } from "../hooks/useTheme"; import { api } from "../services/api"; -import { Rocket, Sun, Moon, Monitor } from "lucide-react"; +import { Sun, Moon, Monitor } from "lucide-react"; const themeOptions: { value: ThemePreference; label: string; Icon: typeof Sun }[] = [ { value: "light", label: "Light", Icon: Sun }, @@ -42,7 +42,7 @@ export function Layout({ children }: { children: React.ReactNode }) {
Open a pull request on an enabled repo and PP will provision a preview automatically.
-