From 34de6d4e29bf729a17ca43b84d430f5cbe0e8660 Mon Sep 17 00:00:00 2001 From: Akhil Mohan Date: Sat, 20 Jan 2024 01:20:14 +0530 Subject: [PATCH] feat(infisical-pg): added migration mode env and page --- backend/src/config/index.ts | 3 +++ backend/src/config/serverConfig.ts | 6 +++--- backend/src/controllers/v1/adminController.ts | 7 ++++--- backend/src/index.ts | 17 +++++++++++++++-- .../ServerConfigContext/ServerConfigContext.tsx | 13 ++++++++++++- frontend/src/hooks/api/admin/types.ts | 1 + .../src/views/admin/SignUpPage/SignUpPage.tsx | 6 +++--- 7 files changed, 41 insertions(+), 12 deletions(-) diff --git a/backend/src/config/index.ts b/backend/src/config/index.ts index a535c3f54..8ba445f99 100644 --- a/backend/src/config/index.ts +++ b/backend/src/config/index.ts @@ -6,6 +6,9 @@ export const client = new InfisicalClient({ token: process.env.INFISICAL_TOKEN! }); +export const getIsMigrationMode = async () => + (await client.getSecret("MIGRATION_MODE")).secretValue === "true"; + export const getPort = async () => (await client.getSecret("PORT")).secretValue || 4000; export const getEncryptionKey = async () => { const secretValue = (await client.getSecret("ENCRYPTION_KEY")).secretValue; diff --git a/backend/src/config/serverConfig.ts b/backend/src/config/serverConfig.ts index 7f1867d15..0c63cf6e8 100644 --- a/backend/src/config/serverConfig.ts +++ b/backend/src/config/serverConfig.ts @@ -3,11 +3,11 @@ import { IServerConfig, ServerConfig } from "../models/serverConfig"; let serverConfig: IServerConfig; export const serverConfigInit = async () => { - const cfg = await ServerConfig.findOne({}); + const cfg = await ServerConfig.findOne({}).lean(); if (!cfg) { const cfg = new ServerConfig(); await cfg.save(); - serverConfig = cfg; + serverConfig = cfg.toObject(); } else { serverConfig = cfg; } @@ -19,6 +19,6 @@ export const getServerConfig = () => serverConfig; export const updateServerConfig = async (data: Partial) => { const cfg = await ServerConfig.findByIdAndUpdate(serverConfig._id, data, { new: true }); if (!cfg) throw new Error("Failed to update server config"); - serverConfig = cfg; + serverConfig = cfg.toObject(); return serverConfig; }; diff --git a/backend/src/controllers/v1/adminController.ts b/backend/src/controllers/v1/adminController.ts index 004a33a68..ebe0d4aa7 100644 --- a/backend/src/controllers/v1/adminController.ts +++ b/backend/src/controllers/v1/adminController.ts @@ -1,5 +1,5 @@ import { Request, Response } from "express"; -import { getHttpsEnabled } from "../../config"; +import { getHttpsEnabled, getIsMigrationMode } from "../../config"; import { getServerConfig, updateServerConfig as setServerConfig } from "../../config/serverConfig"; import { initializeDefaultOrg, issueAuthTokens } from "../../helpers"; import { validateRequest } from "../../helpers/validation"; @@ -8,9 +8,10 @@ import { TelemetryService } from "../../services"; import { BadRequestError, UnauthorizedRequestError } from "../../utils/errors"; import * as reqValidator from "../../validation/admin"; -export const getServerConfigInfo = (_req: Request, res: Response) => { +export const getServerConfigInfo = async (_req: Request, res: Response) => { const config = getServerConfig(); - return res.send({ config }); + const isMigrationModeOn = await getIsMigrationMode(); + return res.send({ config: { ...config, isMigrationModeOn } }); }; export const updateServerConfig = async (req: Request, res: Response) => { diff --git a/backend/src/index.ts b/backend/src/index.ts index cdf2ac8e5..3f85221c6 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -83,6 +83,7 @@ import { healthCheck } from "./routes/status"; import { RouteNotFoundError } from "./utils/errors"; import { requestErrorHandler } from "./middleware/requestErrorHandler"; import { + getIsMigrationMode, getMongoURL, getNodeEnv, getPort, @@ -107,8 +108,8 @@ const main = async () => { const port = await getPort(); - // initializing the database connection + redis - await initRedis() + // initializing the database connection + redis + await initRedis(); await DatabaseService.initDatabase(await getMongoURL()); const serverCfg = await serverConfigInit(); await setup(); @@ -198,6 +199,18 @@ const main = async () => { handler = nextApp.getRequestHandler(); } + app.use((req, _res, next) => { + getIsMigrationMode() + .then((el) => { + if (el && req.method !== "GET") { + next(new Error("Migration mode")); + } else { + next(); + } + }) + .catch(next); + }); + // (EE) routes app.use("/api/v1/identities", v1IdentitiesRouter); app.use("/api/v1/secret", eeSecretRouter); diff --git a/frontend/src/context/ServerConfigContext/ServerConfigContext.tsx b/frontend/src/context/ServerConfigContext/ServerConfigContext.tsx index fba1600cc..57039b526 100644 --- a/frontend/src/context/ServerConfigContext/ServerConfigContext.tsx +++ b/frontend/src/context/ServerConfigContext/ServerConfigContext.tsx @@ -27,7 +27,7 @@ export const ServerConfigProvider = ({ children }: Props): JSX.Element => { }, [data]); useEffect(() => { - if (!isLoading && data && !data.initialized) { + if (!isLoading && data && !data.initialized && !data.isMigrationModeOn) { router.push("/admin/signup"); } }, [isLoading, data]); @@ -40,6 +40,17 @@ export const ServerConfigProvider = ({ children }: Props): JSX.Element => { ); } + if (data?.isMigrationModeOn) { + return ( +
+ loading animation +
+ Infisical under migration. See you in some time.
All read operations are allowed +
+
+ ); + } + return {children}; }; diff --git a/frontend/src/hooks/api/admin/types.ts b/frontend/src/hooks/api/admin/types.ts index 72453ad44..da6b5ce3c 100644 --- a/frontend/src/hooks/api/admin/types.ts +++ b/frontend/src/hooks/api/admin/types.ts @@ -1,6 +1,7 @@ export type TServerConfig = { initialized: boolean; allowSignUp: boolean; + isMigrationModeOn?: boolean; }; export type TCreateAdminUserDTO = { diff --git a/frontend/src/views/admin/SignUpPage/SignUpPage.tsx b/frontend/src/views/admin/SignUpPage/SignUpPage.tsx index bba987bf3..2cbee90c7 100644 --- a/frontend/src/views/admin/SignUpPage/SignUpPage.tsx +++ b/frontend/src/views/admin/SignUpPage/SignUpPage.tsx @@ -61,7 +61,7 @@ export const SignUpPage = () => { router.push("/login"); } } - }, []); + }, [config?.initialized]); const { mutateAsync: createAdminUser } = useCreateAdminUser(); @@ -117,7 +117,7 @@ export const SignUpPage = () => { return ; return ( -
+
{step === SignupSteps.DetailsForm && ( { animate={{ opacity: 1, translateX: 0 }} exit={{ opacity: 0, translateX: 30 }} > -
+
Infisical logo
Welcome to Infisical
Create your first Admin Account