Skip to content

Commit 76ac295

Browse files
authored
Merge pull request #253 from constantvictory/feat/platform-improvements-130-131-132-133
feat: platform improvements — ValidationPipe, CORS, health check, soft-delete
2 parents a1da32e + 5c77708 commit 76ac295

7 files changed

Lines changed: 314 additions & 45 deletions

File tree

package.json

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,17 @@
3131
"@nestjs/core": "^11.0.1",
3232
"@nestjs/mapped-types": "*",
3333
"@nestjs/platform-express": "^11.0.1",
34+
"@nestjs/terminus": "^11.1.1",
3435
"@nestjs/throttler": "^6.5.0",
3536
"@prisma/adapter-pg": "^7.3.0",
3637
"@prisma/client": "^7.3.0",
38+
"axios": "^1.6.0",
39+
"class-transformer": "^0.5.1",
40+
"class-validator": "^0.15.1",
3741
"dotenv": "^17.2.3",
3842
"pg": "^8.17.2",
3943
"reflect-metadata": "^0.2.2",
40-
"rxjs": "^7.8.1",
41-
"axios": "^1.6.0"
44+
"rxjs": "^7.8.1"
4245
},
4346
"devDependencies": {
4447
"@eslint/eslintrc": "^3.2.0",

pnpm-lock.yaml

Lines changed: 239 additions & 25 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

prisma/schema.prisma

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -85,14 +85,18 @@ model User {
8585
lastLoginAt DateTime?
8686
8787
/// Operational metadata
88-
createdAt DateTime @default(now())
89-
updatedAt DateTime @updatedAt
88+
createdAt DateTime @default(now())
89+
updatedAt DateTime @updatedAt
90+
91+
/// Soft-delete timestamp (null = active)
92+
deletedAt DateTime?
9093
9194
/// Relation to user's wallets
9295
wallets Wallet[]
9396
9497
@@index([authId])
9598
@@index([authProvider])
99+
@@index([deletedAt])
96100
}
97101

98102
/// Internal lifecycle states (wallets are not user-facing).
@@ -188,7 +192,11 @@ model RecoveryRequest {
188192
createdAt DateTime @default(now())
189193
updatedAt DateTime @updatedAt
190194
195+
/// Soft-delete timestamp (null = active)
196+
deletedAt DateTime?
197+
191198
@@index([walletId, status])
199+
@@index([deletedAt])
192200
}
193201

194202
/// API Key status lifecycle
@@ -210,14 +218,18 @@ model Developer {
210218
status String @default("ACTIVE")
211219
212220
/// Metadata
213-
createdAt DateTime @default(now())
214-
updatedAt DateTime @updatedAt
215-
221+
createdAt DateTime @default(now())
222+
updatedAt DateTime @updatedAt
223+
224+
/// Soft-delete timestamp (null = active)
225+
deletedAt DateTime?
226+
216227
/// Relations
217228
projects Project[]
218-
229+
219230
@@index([email])
220231
@@index([status])
232+
@@index([deletedAt])
221233
}
222234

223235
/// Project entity for organizing API keys and usage
@@ -240,16 +252,20 @@ model Project {
240252
rateLimitRpm Int @default(60)
241253
242254
/// Metadata
243-
createdAt DateTime @default(now())
244-
updatedAt DateTime @updatedAt
245-
255+
createdAt DateTime @default(now())
256+
updatedAt DateTime @updatedAt
257+
258+
/// Soft-delete timestamp (null = active)
259+
deletedAt DateTime?
260+
246261
/// Relations
247-
apiKeys ApiKey[]
248-
apiKeyUsage ApiKeyUsage[]
262+
apiKeys ApiKey[]
263+
apiKeyUsage ApiKeyUsage[]
249264
webhookEndpoints WebhookEndpoint[]
250-
265+
251266
@@index([developerId])
252267
@@index([status])
268+
@@index([deletedAt])
253269
}
254270

255271
/// API Key for developer authentication
@@ -470,14 +486,18 @@ model WebhookEndpoint {
470486
lastSuccessAt DateTime?
471487
472488
/// Metadata
473-
createdAt DateTime @default(now())
474-
updatedAt DateTime @updatedAt
475-
489+
createdAt DateTime @default(now())
490+
updatedAt DateTime @updatedAt
491+
492+
/// Soft-delete timestamp (null = active)
493+
deletedAt DateTime?
494+
476495
/// Relations
477496
deliveries WebhookDelivery[]
478-
497+
479498
@@index([projectId])
480499
@@index([status])
500+
@@index([deletedAt])
481501
}
482502

483503
/// Webhook delivery attempt tracking

src/app.module.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,7 @@ import { ProjectsModule } from './projects/projects.module';
4141
BalanceIndexerModule,
4242
WebhookModule,
4343
TransactionsModule,
44-
DevelopersModule,
45-
ProjectsModule,
44+
HealthModule,
4645
],
4746
controllers: [AppController],
4847
providers: [

src/health/health.controller.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { Controller, Get } from '@nestjs/common';
2+
import { HealthCheck, HealthCheckService, PrismaHealthIndicator } from '@nestjs/terminus';
3+
import { PrismaService } from '../prisma/prisma.service';
4+
import { Public } from '../auth/public.decorator';
5+
6+
@Controller('health')
7+
export class HealthController {
8+
constructor(
9+
private readonly health: HealthCheckService,
10+
private readonly prismaIndicator: PrismaHealthIndicator,
11+
private readonly prisma: PrismaService,
12+
) {}
13+
14+
@Public()
15+
@Get()
16+
@HealthCheck()
17+
check() {
18+
return this.health.check([
19+
() => this.prismaIndicator.pingCheck('database', this.prisma),
20+
]);
21+
}
22+
}

src/health/health.module.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { Module } from '@nestjs/common';
2+
import { TerminusModule } from '@nestjs/terminus';
3+
import { PrismaModule } from '../prisma/prisma.module';
4+
import { HealthController } from './health.controller';
5+
6+
@Module({
7+
imports: [TerminusModule, PrismaModule],
8+
controllers: [HealthController],
9+
})
10+
export class HealthModule {}

src/main.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { NestFactory } from '@nestjs/core';
2+
import { ValidationPipe } from '@nestjs/common';
23
import { AppModule } from './app.module';
34
import requestLogger from './common/middleware/request-logging.middleware';
45

0 commit comments

Comments
 (0)