From 408ed2ee45e2b07bdfb82164097ad304385deaca Mon Sep 17 00:00:00 2001 From: Shahed Nasser Date: Fri, 23 Aug 2024 14:17:37 +0300 Subject: [PATCH] feat(create-medusa-app): set database name to project name (#8727) * add check and prompt for db name * change var format * remove log * remove log --- .../create-medusa-app/src/commands/create.ts | 9 +++++-- .../create-medusa-app/src/utils/create-db.ts | 25 +++++++++++++++++++ .../src/utils/prepare-project.ts | 6 +++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/packages/cli/create-medusa-app/src/commands/create.ts b/packages/cli/create-medusa-app/src/commands/create.ts index 724253f2e3..8217a7ed1b 100644 --- a/packages/cli/create-medusa-app/src/commands/create.ts +++ b/packages/cli/create-medusa-app/src/commands/create.ts @@ -73,7 +73,6 @@ export default async ({ title: "", verbose, } - const dbName = !skipDb && !dbUrl ? `medusa-${nanoid(4)}` : "" let isProjectCreated = false let isDbInitialized = false let printedMessage = false @@ -101,13 +100,18 @@ export default async ({ const projectPath = getProjectPath(projectName, directoryPath) const installNextjs = withNextjsStarter || (await askForNextjsStarter()) - let { client, dbConnectionString } = !skipDb + let dbName = !skipDb && !dbUrl ? `medusa-${slugify(projectName)}` : "" + + let { client, dbConnectionString, ...rest } = !skipDb ? await getDbClientAndCredentials({ dbName, dbUrl, verbose, }) : { client: null, dbConnectionString: "" } + if ("dbName" in rest) { + dbName = rest.dbName as string + } isDbInitialized = true track("CMA_OPTIONS", { @@ -178,6 +182,7 @@ export default async ({ try { inviteToken = await prepareProject({ directory: projectPath, + dbName, dbConnectionString, seed, spinner, diff --git a/packages/cli/create-medusa-app/src/utils/create-db.ts b/packages/cli/create-medusa-app/src/utils/create-db.ts index f748cd7e7d..51f3249c20 100644 --- a/packages/cli/create-medusa-app/src/utils/create-db.ts +++ b/packages/cli/create-medusa-app/src/utils/create-db.ts @@ -16,6 +16,12 @@ export default async function createDb({ client, db }: CreateDbOptions) { await client.query(`CREATE DATABASE "${db}"`) } +async function doesDbExist (client: pg.Client, dbName: string): Promise { + const result = await client.query(`SELECT datname FROM pg_catalog.pg_database WHERE datname='${dbName}';`) + + return !!result.rowCount +} + export async function runCreateDb({ client, dbName, @@ -61,6 +67,7 @@ async function getForDbName({ }): Promise<{ client: pg.Client dbConnectionString: string + dbName: string }> { let client!: pg.Client let postgresUsername = "postgres" @@ -132,6 +139,23 @@ async function getForDbName({ } } + // check if database exists + if (await doesDbExist(client, dbName)) { + const { newDbName } = await inquirer.prompt([ + { + type: "input", + name: "newDbName", + message: `A database already exists with the name ${dbName}, please enter a name for the database:`, + default: dbName, + validate: (input) => { + return typeof input === "string" && input.length > 0 && input !== dbName + }, + }, + ]) + + dbName = newDbName + } + // format connection string const dbConnectionString = formatConnectionString({ user: postgresUsername, @@ -143,6 +167,7 @@ async function getForDbName({ return { client, dbConnectionString, + dbName } } diff --git a/packages/cli/create-medusa-app/src/utils/prepare-project.ts b/packages/cli/create-medusa-app/src/utils/prepare-project.ts index 4de4495504..52132141ae 100644 --- a/packages/cli/create-medusa-app/src/utils/prepare-project.ts +++ b/packages/cli/create-medusa-app/src/utils/prepare-project.ts @@ -16,6 +16,7 @@ const DEFAULT_REDIS_URL = "redis://localhost:6379" type PrepareOptions = { directory: string + dbName?: string dbConnectionString: string seed?: boolean spinner: Ora @@ -31,6 +32,7 @@ type PrepareOptions = { export default async ({ directory, + dbName, dbConnectionString, seed, spinner, @@ -73,6 +75,10 @@ export default async ({ let env = `MEDUSA_ADMIN_ONBOARDING_TYPE=${onboardingType}${EOL}STORE_CORS=${STORE_CORS}${EOL}ADMIN_CORS=${ADMIN_CORS}${EOL}AUTH_CORS=${AUTH_CORS}${EOL}REDIS_URL=${DEFAULT_REDIS_URL}${EOL}JWT_SECRET=supersecret${EOL}COOKIE_SECRET=supersecret` if (!skipDb) { + if (dbName) { + env += `${EOL}DB_NAME=${dbName}` + dbConnectionString = dbConnectionString.replace(dbName, "$DB_NAME") + } env += `${EOL}DATABASE_URL=${dbConnectionString}` }