forked from ZyntariHQ/Invoisio
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.module.ts
More file actions
127 lines (124 loc) · 5.35 KB
/
Copy pathapp.module.ts
File metadata and controls
127 lines (124 loc) · 5.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import { Module } from "@nestjs/common";
import * as Joi from "joi";
import { ConfigModule, ConfigService } from "@nestjs/config";
// Configuration
import appConfig from "./config/app.config";
import stellarConfig from "./config/stellar.config";
import throttlerConfig from "./config/throttler.config";
import observabilityConfig from "./config/observability.config";
import { ObservabilityModule } from "./observability/observability.module";
// Modules
import { HealthModule } from "./health/health.module";
import { InvoicesModule } from "./invoices/invoices.module";
import { StellarModule } from "./stellar/stellar.module";
import { HorizonWatcherModule } from "./stellar/horizon-watcher.module";
import { SorobanEventsModule } from "./stellar/soroban-events.module";
import { AuthModule } from "./auth/auth.module";
import { UsersModule } from "./users/user.module";
import { PrismaModule } from "./prisma/prisma.module";
import { ScheduleModule } from "@nestjs/schedule";
import { WebhooksModule } from "./webhooks/webhooks.module";
import { CustomThrottlerModule } from "./throttler/throttler.module";
import { MerchantsModule } from "./merchants/merchants.module";
import { BackfillModule } from "./backfill/backfill.module";
import { AdminAnalyticsModule } from "./admin-analytics/admin-analytics.module";
import { NotificationsModule } from "./notifications/notifications.module";
import { MerchantModule } from "./merchant/merchant.module";
import { ActivityFeedModule } from "./activity-feed/activity-feed.module";
import { CustomersModule } from "./customers/customers.module";
import { RecurringBillingModule } from "./recurring-billing/recurring-billing.module";
import { InvoiceEngagementModule } from "./invoice-engagement/invoice-engagement.module";
/**
* Root application module
*
* Configures:
* - Global configuration with validation
* - Health checks
* - Invoice management
* - Stellar integration (stubbed)
*/
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
envFilePath: [".env", ".env.example"],
load: [appConfig, stellarConfig, throttlerConfig, observabilityConfig],
validationSchema: Joi.object({
PORT: Joi.number().default(3001),
CORS_ORIGIN: Joi.string().default("http://localhost:3000"),
HORIZON_URL: Joi.string()
.uri()
.default("https://horizon-testnet.stellar.org"),
STELLAR_NETWORK_PASSPHRASE: Joi.string().default(
"Test SDF Network ; September 2015",
),
MERCHANT_PUBLIC_KEY: Joi.string().optional().allow(""),
USDC_ISSUER: Joi.string().default(
"GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN",
),
USDC_ASSET_CODE: Joi.string().default("USDC"),
MEMO_PREFIX: Joi.string().default("invoisio-"),
HORIZON_POLL_INTERVAL: Joi.number().integer().min(1000).default(15000),
SOROBAN_RPC_URL: Joi.string()
.uri()
.default("https://soroban-testnet.stellar.org"),
SOROBAN_CONTRACT_ID: Joi.string().optional().allow(""),
SOROBAN_EVENT_TOPIC: Joi.string().default("InvoicePaymentRecorded"),
DATABASE_URL: Joi.string().required().messages({
"any.required":
"DATABASE_URL is required – set it to your database connection string (e.g. postgresql://user:pass@host:5432/db)",
"string.empty":
"DATABASE_URL must not be empty – set it to your database connection string",
}),
JWT_SECRET: Joi.string().min(32).required().messages({
"any.required":
"JWT_SECRET is required – generate one with: openssl rand -base64 32",
"string.min":
"JWT_SECRET must be at least 32 characters long – generate one with: openssl rand -base64 32",
"string.empty":
"JWT_SECRET must not be empty – generate one with: openssl rand -base64 32",
}),
// Rate limiting configuration
THROTTLE_TTL: Joi.number().integer().min(1).default(60),
THROTTLE_LIMIT: Joi.number().integer().min(1).default(100),
THROTTLE_AUTH_TTL: Joi.number().integer().min(1).default(900),
THROTTLE_AUTH_LIMIT: Joi.number().integer().min(1).default(5),
THROTTLE_INVOICE_TTL: Joi.number().integer().min(1).default(3600),
THROTTLE_INVOICE_LIMIT: Joi.number().integer().min(1).default(20),
REDIS_HOST: Joi.string().default("localhost"),
REDIS_PORT: Joi.number().integer().min(1).max(65535).default(6379),
REDIS_PASSWORD: Joi.string().optional().allow(""),
REDIS_DB: Joi.number().integer().min(0).default(0),
REDIS_KEY_PREFIX: Joi.string().default("invoisio:throttle:"),
SLOW_DB_THRESHOLD_MS: Joi.number().integer().min(1).default(200),
SLOW_NETWORK_THRESHOLD_MS: Joi.number().integer().min(1).default(500),
}),
validationOptions: {
abortEarly: false,
allowUnknown: true,
},
}),
ObservabilityModule,
CustomThrottlerModule,
PrismaModule,
ScheduleModule.forRoot(),
HealthModule,
InvoicesModule,
StellarModule,
HorizonWatcherModule,
SorobanEventsModule,
AuthModule,
UsersModule,
MerchantsModule,
WebhooksModule,
BackfillModule,
AdminAnalyticsModule,
NotificationsModule,
MerchantModule,
ActivityFeedModule,
CustomersModule,
RecurringBillingModule,
InvoiceEngagementModule,
],
})
export class AppModule {}