Skip to content

Commit 5f0924a

Browse files
committed
refactor: extract migration from instrumentation
1 parent 0311c36 commit 5f0924a

File tree

2 files changed

+49
-51
lines changed

2 files changed

+49
-51
lines changed

src/database/migrate.ts

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import getPackageMetadata from "@omer-x/package-metadata";
2+
import { drizzle } from "drizzle-orm/node-postgres";
3+
import { migrate } from "drizzle-orm/node-postgres/migrator";
4+
import { Client } from "pg";
5+
6+
async function migrateAppDatabase() {
7+
const packageMetadata = getPackageMetadata();
8+
9+
const dbCredentials = {
10+
host: process.env.POSTGRES_HOST || "localhost",
11+
port: parseInt(process.env.POSTGRES_PORT || "5432"),
12+
user: process.env.POSTGRES_USER || "postgres",
13+
password: process.env.POSTGRES_PASSWORD || "example",
14+
database: process.env.POSTGRES_DATABASE || packageMetadata.moduleName,
15+
};
16+
17+
const connect = async () => {
18+
const creator = new Client({ ...dbCredentials, database: "postgres" });
19+
try {
20+
await creator.connect();
21+
try {
22+
await creator.query(`CREATE DATABASE "${dbCredentials.database}"`);
23+
} catch {
24+
// do nothing
25+
} finally {
26+
await creator.end();
27+
}
28+
} catch {
29+
await creator.end();
30+
await new Promise(resolve => setTimeout(resolve, 1000));
31+
await connect();
32+
}
33+
};
34+
if (dbCredentials.database === "verceldb") return;
35+
await connect();
36+
37+
const client = new Client(dbCredentials);
38+
await client.connect();
39+
const db = drizzle(client);
40+
await migrate(db, { migrationsFolder: "./drizzle" });
41+
await client.end();
42+
}
43+
44+
export default migrateAppDatabase;

src/instrumentation.ts

Lines changed: 5 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,10 @@
11
export async function register() {
22
if (process.env.NEXT_RUNTIME === "nodejs") {
3-
const { drizzle } = await import("drizzle-orm/node-postgres");
4-
const { migrate } = await import("drizzle-orm/node-postgres/migrator");
5-
const { Client } = await import("pg");
6-
const path = await import("path");
7-
const fs = await import("fs");
3+
process.title = "user-service";
84

9-
const getServiceName = () => {
10-
try {
11-
const filePath = path.resolve(process.cwd(), "package.json");
12-
const content = fs.readFileSync(filePath, "utf-8");
13-
const data = JSON.parse(content);
14-
const packageName = data.name as string;
15-
const appName = packageName.split("/").pop();
16-
if (!appName) throw new Error(`Invalid package name (${packageName})`);
17-
return appName;
18-
} catch {
19-
return "unknown-service";
20-
}
21-
};
22-
23-
const dbCredentials = {
24-
host: process.env.DATABASE_HOST || "localhost",
25-
port: parseInt(process.env.DATABASE_PORT || "5432"),
26-
user: process.env.DATABASE_USER || "postgres",
27-
password: process.env.DATABASE_PASS || "example",
28-
database: process.env.DATABASE_NAME || getServiceName(),
29-
};
30-
31-
const connect = async () => {
32-
const creator = new Client({ ...dbCredentials, database: "postgres" });
33-
try {
34-
await creator.connect();
35-
try {
36-
await creator.query(`CREATE DATABASE "${dbCredentials.database}"`);
37-
} catch {
38-
// do nothing
39-
} finally {
40-
await creator.end();
41-
}
42-
} catch {
43-
await creator.end();
44-
await new Promise(resolve => setTimeout(resolve, 1000));
45-
await connect();
46-
}
47-
};
48-
await connect();
49-
50-
const client = new Client(dbCredentials);
51-
await client.connect();
52-
const db = drizzle(client);
53-
await migrate(db, { migrationsFolder: "./drizzle" });
54-
await client.end();
5+
if (process.env.VERCEL !== "1") {
6+
const { default: migrate } = await import("./database/migrate");
7+
await migrate();
8+
}
559
}
5610
}

0 commit comments

Comments
 (0)