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
This commit is contained in:
Shahed Nasser
2024-08-23 14:17:37 +03:00
committed by GitHub
parent aa1ef20172
commit 408ed2ee45
3 changed files with 38 additions and 2 deletions
@@ -73,7 +73,6 @@ export default async ({
title: "", title: "",
verbose, verbose,
} }
const dbName = !skipDb && !dbUrl ? `medusa-${nanoid(4)}` : ""
let isProjectCreated = false let isProjectCreated = false
let isDbInitialized = false let isDbInitialized = false
let printedMessage = false let printedMessage = false
@@ -101,13 +100,18 @@ export default async ({
const projectPath = getProjectPath(projectName, directoryPath) const projectPath = getProjectPath(projectName, directoryPath)
const installNextjs = withNextjsStarter || (await askForNextjsStarter()) const installNextjs = withNextjsStarter || (await askForNextjsStarter())
let { client, dbConnectionString } = !skipDb let dbName = !skipDb && !dbUrl ? `medusa-${slugify(projectName)}` : ""
let { client, dbConnectionString, ...rest } = !skipDb
? await getDbClientAndCredentials({ ? await getDbClientAndCredentials({
dbName, dbName,
dbUrl, dbUrl,
verbose, verbose,
}) })
: { client: null, dbConnectionString: "" } : { client: null, dbConnectionString: "" }
if ("dbName" in rest) {
dbName = rest.dbName as string
}
isDbInitialized = true isDbInitialized = true
track("CMA_OPTIONS", { track("CMA_OPTIONS", {
@@ -178,6 +182,7 @@ export default async ({
try { try {
inviteToken = await prepareProject({ inviteToken = await prepareProject({
directory: projectPath, directory: projectPath,
dbName,
dbConnectionString, dbConnectionString,
seed, seed,
spinner, spinner,
@@ -16,6 +16,12 @@ export default async function createDb({ client, db }: CreateDbOptions) {
await client.query(`CREATE DATABASE "${db}"`) await client.query(`CREATE DATABASE "${db}"`)
} }
async function doesDbExist (client: pg.Client, dbName: string): Promise<boolean> {
const result = await client.query(`SELECT datname FROM pg_catalog.pg_database WHERE datname='${dbName}';`)
return !!result.rowCount
}
export async function runCreateDb({ export async function runCreateDb({
client, client,
dbName, dbName,
@@ -61,6 +67,7 @@ async function getForDbName({
}): Promise<{ }): Promise<{
client: pg.Client client: pg.Client
dbConnectionString: string dbConnectionString: string
dbName: string
}> { }> {
let client!: pg.Client let client!: pg.Client
let postgresUsername = "postgres" 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 // format connection string
const dbConnectionString = formatConnectionString({ const dbConnectionString = formatConnectionString({
user: postgresUsername, user: postgresUsername,
@@ -143,6 +167,7 @@ async function getForDbName({
return { return {
client, client,
dbConnectionString, dbConnectionString,
dbName
} }
} }
@@ -16,6 +16,7 @@ const DEFAULT_REDIS_URL = "redis://localhost:6379"
type PrepareOptions = { type PrepareOptions = {
directory: string directory: string
dbName?: string
dbConnectionString: string dbConnectionString: string
seed?: boolean seed?: boolean
spinner: Ora spinner: Ora
@@ -31,6 +32,7 @@ type PrepareOptions = {
export default async ({ export default async ({
directory, directory,
dbName,
dbConnectionString, dbConnectionString,
seed, seed,
spinner, 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` 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 (!skipDb) {
if (dbName) {
env += `${EOL}DB_NAME=${dbName}`
dbConnectionString = dbConnectionString.replace(dbName, "$DB_NAME")
}
env += `${EOL}DATABASE_URL=${dbConnectionString}` env += `${EOL}DATABASE_URL=${dbConnectionString}`
} }