Skip to content

Commit 1b9d32b

Browse files
authored
Merge pull request #1 from Rykuno/feature/prisma
Refactor database integration and update dependencies: replace Drizzl…
2 parents be14f6f + 1fda046 commit 1b9d32b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+13076
-3207
lines changed

apps/api/.gitignore

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,3 @@ pids
5454

5555
# Diagnostic reports (https://nodejs.org/api/report.html)
5656
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
57-
58-
/prisma/generated/prisma
59-
60-
/generated/prisma

apps/api/drizzle.config.ts

Lines changed: 0 additions & 12 deletions
This file was deleted.

apps/api/package.json

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@
77
"private": true,
88
"scripts": {
99
"build": "nest build",
10-
"db:generate": "drizzle-kit generate",
11-
"db:migrate": "drizzle-kit migrate",
12-
"db:push": "drizzle-kit push",
13-
"db:studio": "drizzle-kit studio",
10+
"db:generate": "prisma generate",
11+
"db:migrate:generate": "prisma migrate dev",
12+
"db:migrate:deploy": "prisma migrate deploy",
13+
"db:push": "prisma db push",
14+
"db:reset": "prisma migrate reset",
15+
"db:studio": "prisma studio",
1416
"dev": "nest start --watch",
1517
"email:dev": "email dev --dir ./src/notifications/emails --port 3030",
1618
"nuke": "docker compose down -v --remove-orphans && docker compose up -d",
@@ -24,12 +26,14 @@
2426
"typecheck": "tsc --noEmit"
2527
},
2628
"dependencies": {
29+
"@aws-sdk/client-s3": "^3.940.0",
30+
"@aws-sdk/s3-request-presigner": "^3.940.0",
2731
"@itgorillaz/configify": "^4.0.1",
2832
"@keyv/redis": "^5.1.4",
2933
"@keyv/valkey": "^1.0.11",
3034
"@nest-lab/throttler-storage-redis": "^1.1.0",
3135
"@nestjs-cls/transactional": "^3.1.1",
32-
"@nestjs-cls/transactional-adapter-drizzle-orm": "^1.2.1",
36+
"@nestjs-cls/transactional-adapter-prisma": "^1.3.1",
3337
"@nestjs/cache-manager": "^3.0.1",
3438
"@nestjs/common": "^11.1.9",
3539
"@nestjs/config": "^4.0.2",
@@ -39,6 +43,9 @@
3943
"@nestjs/swagger": "^11.2.3",
4044
"@nestjs/throttler": "^6.4.0",
4145
"@paralleldrive/cuid2": "^3.0.4",
46+
"@prisma/adapter-pg": "^7.0.1",
47+
"@prisma/client": "^7.0.1",
48+
"@prisma/client-runtime-utils": "^7.0.1",
4249
"@react-email/components": "^1.0.1",
4350
"@react-email/render": "2.0.0",
4451
"better-auth": "^1.4.1",
@@ -51,8 +58,6 @@
5158
"cors": "^2.8.5",
5259
"date-fns": "^4.1.0",
5360
"dotenv": "^17.2.3",
54-
"drizzle-kit": "1.0.0-beta.1-ac4ce44",
55-
"drizzle-orm": "1.0.0-beta.1-ac4ce44",
5661
"keyv": "^5.5.4",
5762
"minio": "^8.0.6",
5863
"nestjs-cls": "^6.1.0",
@@ -87,6 +92,7 @@
8792
"jest": "^30.2.0",
8893
"openapi-typescript": "^7.10.1",
8994
"pnpm": "^10.23.0",
95+
"prisma": "^7.0.1",
9096
"react-email": "5.0.5",
9197
"source-map-support": "^0.5.21",
9298
"supertest": "^7.1.4",

apps/api/prisma.config.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// This file was generated by Prisma and assumes you have installed the following:
2+
// npm install --save-dev prisma dotenv
3+
import 'dotenv/config';
4+
import { defineConfig, env } from 'prisma/config';
5+
6+
export default defineConfig({
7+
schema: 'src/databases/schema.prisma',
8+
migrations: {
9+
path: 'src/databases/migrations',
10+
},
11+
datasource: {
12+
url: env('DATABASE_URL'),
13+
},
14+
});

apps/api/src/app.module.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,23 @@ import { AppController } from './app.controller';
33
import { AppService } from './app.service';
44
import { DatabasesModule } from './databases/databases.module';
55
import { AuthModule } from './auth/auth.module';
6-
import { APP_GUARD, APP_INTERCEPTOR } from '@nestjs/core';
6+
import { APP_GUARD } from '@nestjs/core';
77
import { AuthGuard } from './auth/guards/auth.guard';
88
import { NotificationsModule } from './notifications/notifications.module';
99
import { CacheModule } from '@nestjs/cache-manager';
1010
import { createKeyv, Keyv } from '@keyv/redis';
1111
import { CacheableMemory } from 'cacheable';
12-
import { BrowserSessionInterceptor } from './common/guards/browser-session.interceptor';
1312
import { UsersModule } from './users/users.module';
1413
import { MulterModule } from '@nestjs/platform-express';
1514
import { StorageModule } from './storage/storage.module';
1615
import { ThrottlerGuard, ThrottlerModule } from '@nestjs/throttler';
1716
import { ThrottlerStorageRedisService } from '@nest-lab/throttler-storage-redis';
1817
import { ClsPluginTransactional } from '@nestjs-cls/transactional';
1918
import { ClsModule } from 'nestjs-cls';
20-
import { TransactionalAdapterDrizzleOrm } from '@nestjs-cls/transactional-adapter-drizzle-orm';
21-
import { DB_PROVIDER } from './databases/database.provider';
2219
import { ConfigifyModule } from '@itgorillaz/configify';
2320
import { CacheConfig } from './common/config/cache.config';
21+
import { TransactionalAdapterPrisma } from '@nestjs-cls/transactional-adapter-prisma';
22+
import { PrismaService } from './databases/prisma.service';
2423

2524
@Module({
2625
imports: [
@@ -40,8 +39,9 @@ import { CacheConfig } from './common/config/cache.config';
4039
plugins: [
4140
new ClsPluginTransactional({
4241
imports: [DatabasesModule],
43-
adapter: new TransactionalAdapterDrizzleOrm({
44-
drizzleInstanceToken: DB_PROVIDER,
42+
adapter: new TransactionalAdapterPrisma({
43+
prismaInjectionToken: PrismaService,
44+
sqlFlavor: 'postgresql',
4545
}),
4646
}),
4747
],

apps/api/src/auth/auth.module.ts

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,21 +21,7 @@ export class AuthModule {
2121
private readonly appConfig: AppConfig,
2222
private readonly authConfig: AuthConfig,
2323
) {
24-
// this.adapter.httpAdapter.use(cors(this.appConfig.cors as CorsOptions));
25-
this.adapter.httpAdapter.use(
26-
cors({
27-
origin: 'http://localhost:3000',
28-
methods: ['GET', 'PATCH', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'HEAD'],
29-
allowedHeaders: [
30-
'workspace-id',
31-
'Content-Type',
32-
'Authorization',
33-
'X-Requested-With',
34-
'Accept',
35-
],
36-
credentials: true,
37-
}),
38-
);
24+
this.adapter.httpAdapter.use(cors(this.appConfig.cors as CorsOptions));
3925
this.adapter.httpAdapter.all(
4026
`${this.authConfig.basePath}/{*any}`,
4127
toNodeHandler(this.betterAuthService.client),

apps/api/src/auth/better-auth.service.ts

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,33 @@
11
import { Injectable } from '@nestjs/common';
2-
import { betterAuth } from 'better-auth';
2+
import { Auth, betterAuth, BetterAuthOptions } from 'better-auth';
33
import { emailOTP, openAPI } from 'better-auth/plugins';
44
import { MailService } from 'src/notifications/mail.service';
55
import { Cache } from '@nestjs/cache-manager';
6-
import { drizzleAdapter } from 'better-auth/adapters/drizzle';
76
import { seconds } from '@nestjs/throttler';
8-
import { DatabaseTransactionAdapter } from 'src/databases/database.provider';
9-
import { TransactionHost } from '@nestjs-cls/transactional';
10-
import * as schema from 'src/databases/drizzle.schema';
117
import { AuthConfig } from 'src/common/config/auth.config';
128
import { AppConfig } from 'src/common/config/app.config';
9+
import { prismaAdapter } from 'better-auth/adapters/prisma';
10+
import { TransactionHost } from '@nestjs-cls/transactional';
11+
import { TransactionalAdapterPrisma } from '@nestjs-cls/transactional-adapter-prisma';
12+
import { PrismaClient } from 'src/generated/prisma/client';
1313

1414
@Injectable()
1515
export class BetterAuthService {
16-
readonly client: ReturnType<typeof betterAuth>;
16+
readonly client: Auth<BetterAuthOptions>;
1717

1818
constructor(
19-
private readonly db: TransactionHost<DatabaseTransactionAdapter>,
20-
private mailService: MailService,
21-
private cache: Cache,
19+
private readonly txHost: TransactionHost<
20+
TransactionalAdapterPrisma<PrismaClient>
21+
>,
22+
private readonly mailService: MailService,
23+
private readonly cache: Cache,
2224
private readonly appConfig: AppConfig,
2325
private readonly authConfig: AuthConfig,
2426
) {
2527
this.client = betterAuth({
26-
database: drizzleAdapter(this.db.tx, {
27-
provider: 'pg',
28-
schema: {
29-
...schema,
30-
user: schema.users,
31-
session: schema.sessions,
32-
account: schema.accounts,
33-
verification: schema.verifications,
34-
},
28+
experimental: { joins: true },
29+
database: prismaAdapter(this.txHost.tx, {
30+
provider: 'postgresql',
3531
}),
3632
advanced: {
3733
database: {

apps/api/src/common/config/app.config.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,14 @@ export class AppConfig {
3232
@IsObject()
3333
@IsNotEmpty()
3434
cors: CorsOptions = {
35-
origin: process.env['WEB_URL']!,
35+
origin: process.env['APP_WEB_URL']!,
36+
credentials: true,
3637
methods: ['GET', 'PATCH', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'HEAD'],
3738
allowedHeaders: [
3839
'Content-Type',
3940
'Authorization',
4041
'X-Requested-With',
42+
'user-agent',
4143
'Accept',
4244
],
4345
};
Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
import { Configuration, Value } from '@itgorillaz/configify';
2-
import { IsNotEmpty, IsNumber, IsString } from 'class-validator';
2+
import { IsNotEmpty, IsString } from 'class-validator';
33

44
@Configuration()
55
export class StorageConfig {
66
@IsString()
77
@IsNotEmpty()
8-
@Value('STORAGE_HOST')
9-
host!: string;
8+
@Value('STORAGE_URL')
9+
url!: string;
1010

11-
@IsNumber()
11+
@IsString()
1212
@IsNotEmpty()
13-
@Value('STORAGE_PORT', { parse: parseInt })
14-
port!: number;
13+
@Value('STORAGE_REGION', { default: 'us-east-1' })
14+
region!: string;
1515

1616
@IsString()
1717
@IsNotEmpty()
@@ -22,4 +22,4 @@ export class StorageConfig {
2222
@IsNotEmpty()
2323
@Value('STORAGE_SECRET_KEY')
2424
secretKey!: string;
25-
}
25+
}
Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,19 @@
1-
import { Inject } from '@nestjs/common';
2-
import { drizzle, NodePgDatabase } from 'drizzle-orm/node-postgres';
3-
import { relations } from './drizzle.relations';
4-
import { TransactionalAdapterDrizzleOrm } from '@nestjs-cls/transactional-adapter-drizzle-orm';
5-
import { DatabaseConfig } from 'src/common/config/database.config';
1+
// import { Inject } from '@nestjs/common';
2+
// import { DatabaseConfig } from 'src/common/config/database.config';
3+
// import { PrismaPg } from '@prisma/adapter-pg';
4+
// import { PrismaClient } from '../../generated/prisma/client';
5+
// import { TransactionHost } from '@nestjs-cls/transactional';
6+
// import { TransactionalAdapterPrisma } from '@nestjs-cls/transactional-adapter-prisma';
67

7-
export type DatabaseClient = NodePgDatabase<typeof relations, typeof relations>;
8-
export type DatabaseTransactionAdapter =
9-
TransactionalAdapterDrizzleOrm<DatabaseClient>;
8+
// export const DB_PROVIDER = 'DB_PROVIDER';
9+
// export const InjectDb = () => Inject(DB_PROVIDER);
1010

11-
export const DB_PROVIDER = 'DB_PROVIDER';
12-
export const InjectDb = () => Inject(DB_PROVIDER);
13-
14-
export const dbProvider = {
15-
provide: DB_PROVIDER,
16-
inject: [DatabaseConfig],
17-
useFactory: (databaseConfig: DatabaseConfig) => {
18-
return drizzle(databaseConfig.url, {
19-
relations,
20-
});
21-
},
22-
};
11+
// export const dbProvider = {
12+
// provide: DB_PROVIDER,
13+
// inject: [DatabaseConfig],
14+
// useFactory: (databaseConfig: DatabaseConfig) => {
15+
// const adapter = new PrismaPg({ connectionString: databaseConfig.url });
16+
// const prisma = new PrismaClient({ adapter });
17+
// return prisma;
18+
// },
19+
// };

0 commit comments

Comments
 (0)