ar-saas 0.3.0 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +338 -314
- package/dist/cli.js +19 -0
- package/dist/generator.js +166 -55
- package/package.json +52 -50
- package/templates/backend/.env.example +67 -67
- package/templates/backend/.prettierrc +4 -4
- package/templates/backend/README.md +249 -168
- package/templates/backend/eslint.config.mjs +35 -35
- package/templates/backend/nest-cli.json +8 -8
- package/templates/backend/package-lock.json +10979 -10979
- package/templates/backend/package.json +88 -88
- package/templates/backend/src/app.controller.spec.ts +24 -24
- package/templates/backend/src/app.controller.ts +15 -15
- package/templates/backend/src/app.module.ts +40 -40
- package/templates/backend/src/app.service.ts +11 -11
- package/templates/backend/src/common/base/base.repository.ts +221 -221
- package/templates/backend/src/common/base/base.schema.ts +24 -24
- package/templates/backend/src/common/decorators/cookie.decorator.ts +9 -9
- package/templates/backend/src/common/decorators/current-user.decorator.ts +20 -20
- package/templates/backend/src/common/decorators/workspace-id.decorator.ts +14 -14
- package/templates/backend/src/common/filters/global-exception.filter.ts +61 -61
- package/templates/backend/src/common/guards/jwt-auth.guard.ts +5 -5
- package/templates/backend/src/common/interceptors/workspace-tenant.interceptor.ts +45 -45
- package/templates/backend/src/main.ts +51 -51
- package/templates/backend/src/modules/auth/auth.controller.ts +158 -158
- package/templates/backend/src/modules/auth/auth.module.ts +20 -20
- package/templates/backend/src/modules/auth/auth.service.ts +257 -257
- package/templates/backend/src/modules/auth/dto/forgot-password.dto.ts +9 -9
- package/templates/backend/src/modules/auth/dto/login.dto.ts +14 -14
- package/templates/backend/src/modules/auth/dto/refresh-token.dto.ts +12 -12
- package/templates/backend/src/modules/auth/dto/register.dto.ts +26 -26
- package/templates/backend/src/modules/auth/dto/reset-password.dto.ts +16 -16
- package/templates/backend/src/modules/auth/dto/verify-email.dto.ts +9 -9
- package/templates/backend/src/modules/auth/strategies/jwt.strategy.ts +43 -43
- package/templates/backend/src/modules/mail/mail.module.ts +9 -9
- package/templates/backend/src/modules/mail/mail.service.ts +141 -141
- package/templates/backend/src/modules/users/schemas/user.schema.ts +54 -54
- package/templates/backend/src/modules/users/users.module.ts +14 -14
- package/templates/backend/src/modules/users/users.repository.ts +51 -51
- package/templates/backend/src/modules/users/users.service.ts +104 -104
- package/templates/backend/src/modules/workspaces/schemas/workspace.schema.ts +26 -26
- package/templates/backend/src/modules/workspaces/workspaces.module.ts +16 -16
- package/templates/backend/src/modules/workspaces/workspaces.repository.ts +34 -34
- package/templates/backend/src/modules/workspaces/workspaces.service.ts +42 -42
- package/templates/backend/test/app.e2e-spec.ts +25 -25
- package/templates/backend/test/jest-e2e.json +9 -9
- package/templates/backend/tsconfig.build.json +4 -4
- package/templates/backend/tsconfig.json +26 -26
- package/templates/frontend/.env.local.example +1 -1
- package/templates/frontend/README.md +152 -0
- package/templates/frontend/components.json +20 -20
- package/templates/frontend/eslint.config.mjs +14 -14
- package/templates/frontend/next.config.ts +5 -5
- package/templates/frontend/package-lock.json +6722 -6722
- package/templates/frontend/package.json +48 -48
- package/templates/frontend/pnpm-lock.yaml +5012 -5012
- package/templates/frontend/pnpm-workspace.yaml +3 -3
- package/templates/frontend/postcss.config.mjs +7 -7
- package/templates/frontend/src/app/(auth)/forgot-password/page.tsx +84 -84
- package/templates/frontend/src/app/(auth)/layout.tsx +28 -28
- package/templates/frontend/src/app/(auth)/login/page.tsx +111 -111
- package/templates/frontend/src/app/(auth)/register/page.tsx +161 -161
- package/templates/frontend/src/app/(auth)/reset-password/page.tsx +120 -120
- package/templates/frontend/src/app/(auth)/verify-email/page.tsx +78 -78
- package/templates/frontend/src/app/(dashboard)/billing/page.tsx +111 -111
- package/templates/frontend/src/app/(dashboard)/dashboard/page.tsx +105 -105
- package/templates/frontend/src/app/(dashboard)/layout.tsx +38 -38
- package/templates/frontend/src/app/(dashboard)/profile/page.tsx +226 -226
- package/templates/frontend/src/app/(dashboard)/settings/page.tsx +156 -156
- package/templates/frontend/src/app/(dashboard)/team/page.tsx +178 -178
- package/templates/frontend/src/app/(legal)/privacy/page.tsx +127 -127
- package/templates/frontend/src/app/(legal)/terms/page.tsx +118 -118
- package/templates/frontend/src/app/globals.css +81 -81
- package/templates/frontend/src/app/layout.tsx +26 -26
- package/templates/frontend/src/app/page.tsx +5 -45
- package/templates/frontend/src/app/setup/page.tsx +371 -275
- package/templates/frontend/src/components/dashboard/header.tsx +89 -89
- package/templates/frontend/src/components/dashboard/sidebar.tsx +71 -71
- package/templates/frontend/src/components/dashboard/stat-card.tsx +34 -34
- package/templates/frontend/src/components/landing/faq.tsx +39 -39
- package/templates/frontend/src/components/landing/features.tsx +54 -54
- package/templates/frontend/src/components/landing/footer.tsx +76 -76
- package/templates/frontend/src/components/landing/hero.tsx +72 -72
- package/templates/frontend/src/components/landing/navbar.tsx +78 -78
- package/templates/frontend/src/components/landing/pricing.tsx +90 -90
- package/templates/frontend/src/components/ui/accordion.tsx +52 -52
- package/templates/frontend/src/components/ui/avatar.tsx +46 -46
- package/templates/frontend/src/components/ui/badge.tsx +30 -30
- package/templates/frontend/src/components/ui/button.tsx +52 -52
- package/templates/frontend/src/components/ui/card.tsx +50 -50
- package/templates/frontend/src/components/ui/checkbox.tsx +27 -27
- package/templates/frontend/src/components/ui/dialog.tsx +100 -100
- package/templates/frontend/src/components/ui/dropdown-menu.tsx +173 -173
- package/templates/frontend/src/components/ui/form.tsx +158 -158
- package/templates/frontend/src/components/ui/input.tsx +21 -21
- package/templates/frontend/src/components/ui/label.tsx +22 -22
- package/templates/frontend/src/components/ui/separator.tsx +25 -25
- package/templates/frontend/src/components/ui/skeleton.tsx +7 -7
- package/templates/frontend/src/components/ui/switch.tsx +28 -28
- package/templates/frontend/src/components/ui/tabs.tsx +54 -54
- package/templates/frontend/src/components/ui/textarea.tsx +20 -20
- package/templates/frontend/src/components/ui/toast.tsx +109 -109
- package/templates/frontend/src/components/ui/toaster.tsx +30 -30
- package/templates/frontend/src/config/site.ts +197 -197
- package/templates/frontend/src/hooks/use-toast.ts +116 -116
- package/templates/frontend/src/lib/api/auth.ts +39 -39
- package/templates/frontend/src/lib/api/client.ts +66 -66
- package/templates/frontend/src/lib/hooks/use-auth.ts +1 -1
- package/templates/frontend/src/lib/utils.ts +6 -6
- package/templates/frontend/src/providers/auth-provider.tsx +60 -60
- package/templates/frontend/src/types/api.ts +12 -12
- package/templates/frontend/src/types/auth.ts +27 -27
- package/templates/frontend/tsconfig.json +23 -23
|
@@ -1,88 +1,88 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "create-saas-ar-backend",
|
|
3
|
-
"version": "0.0.1",
|
|
4
|
-
"description": "Backend SaaS multi-tenant generado con create-saas-ar",
|
|
5
|
-
"author": "",
|
|
6
|
-
"private": true,
|
|
7
|
-
"license": "UNLICENSED",
|
|
8
|
-
"scripts": {
|
|
9
|
-
"build": "nest build",
|
|
10
|
-
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
|
|
11
|
-
"start": "nest start",
|
|
12
|
-
"start:dev": "nest start --watch",
|
|
13
|
-
"start:debug": "nest start --debug --watch",
|
|
14
|
-
"start:prod": "node dist/main",
|
|
15
|
-
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
|
|
16
|
-
"test": "jest",
|
|
17
|
-
"test:watch": "jest --watch",
|
|
18
|
-
"test:cov": "jest --coverage",
|
|
19
|
-
"test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
|
|
20
|
-
"test:e2e": "jest --config ./test/jest-e2e.json"
|
|
21
|
-
},
|
|
22
|
-
"dependencies": {
|
|
23
|
-
"@nestjs/common": "^11.0.1",
|
|
24
|
-
"@nestjs/config": "^4.0.2",
|
|
25
|
-
"@nestjs/core": "^11.0.1",
|
|
26
|
-
"@nestjs/jwt": "^11.0.1",
|
|
27
|
-
"@nestjs/mongoose": "^11.0.2",
|
|
28
|
-
"@nestjs/passport": "^11.0.5",
|
|
29
|
-
"@nestjs/platform-express": "^11.0.1",
|
|
30
|
-
"@nestjs/schedule": "^6.0.1",
|
|
31
|
-
"@nestjs/swagger": "^11.2.1",
|
|
32
|
-
"bcryptjs": "^2.4.3",
|
|
33
|
-
"class-transformer": "^0.5.1",
|
|
34
|
-
"class-validator": "^0.14.2",
|
|
35
|
-
"cookie-parser": "^1.4.7",
|
|
36
|
-
"mongoose": "^9.0.1",
|
|
37
|
-
"passport": "^0.7.0",
|
|
38
|
-
"passport-jwt": "^4.0.1",
|
|
39
|
-
"reflect-metadata": "^0.2.2",
|
|
40
|
-
"resend": "^4.1.2",
|
|
41
|
-
"rxjs": "^7.8.1"
|
|
42
|
-
},
|
|
43
|
-
"devDependencies": {
|
|
44
|
-
"@eslint/eslintrc": "^3.2.0",
|
|
45
|
-
"@eslint/js": "^9.18.0",
|
|
46
|
-
"@nestjs/cli": "^11.0.0",
|
|
47
|
-
"@nestjs/schematics": "^11.0.0",
|
|
48
|
-
"@nestjs/testing": "^11.0.1",
|
|
49
|
-
"@types/bcryptjs": "^2.4.6",
|
|
50
|
-
"@types/cookie-parser": "^1.4.8",
|
|
51
|
-
"@types/express": "^5.0.0",
|
|
52
|
-
"@types/jest": "^30.0.0",
|
|
53
|
-
"@types/node": "^22.10.7",
|
|
54
|
-
"@types/passport-jwt": "^4.0.1",
|
|
55
|
-
"@types/supertest": "^6.0.2",
|
|
56
|
-
"eslint": "^9.18.0",
|
|
57
|
-
"eslint-config-prettier": "^10.0.1",
|
|
58
|
-
"eslint-plugin-prettier": "^5.2.2",
|
|
59
|
-
"globals": "^16.0.0",
|
|
60
|
-
"jest": "^30.0.0",
|
|
61
|
-
"prettier": "^3.4.2",
|
|
62
|
-
"source-map-support": "^0.5.21",
|
|
63
|
-
"supertest": "^7.0.0",
|
|
64
|
-
"ts-jest": "^29.2.5",
|
|
65
|
-
"ts-loader": "^9.5.2",
|
|
66
|
-
"ts-node": "^10.9.2",
|
|
67
|
-
"tsconfig-paths": "^4.2.0",
|
|
68
|
-
"typescript": "^5.7.3",
|
|
69
|
-
"typescript-eslint": "^8.20.0"
|
|
70
|
-
},
|
|
71
|
-
"jest": {
|
|
72
|
-
"moduleFileExtensions": [
|
|
73
|
-
"js",
|
|
74
|
-
"json",
|
|
75
|
-
"ts"
|
|
76
|
-
],
|
|
77
|
-
"rootDir": "src",
|
|
78
|
-
"testRegex": ".*\\.spec\\.ts$",
|
|
79
|
-
"transform": {
|
|
80
|
-
"^.+\\.(t|j)s$": "ts-jest"
|
|
81
|
-
},
|
|
82
|
-
"collectCoverageFrom": [
|
|
83
|
-
"**/*.(t|j)s"
|
|
84
|
-
],
|
|
85
|
-
"coverageDirectory": "../coverage",
|
|
86
|
-
"testEnvironment": "node"
|
|
87
|
-
}
|
|
88
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "create-saas-ar-backend",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Backend SaaS multi-tenant generado con create-saas-ar",
|
|
5
|
+
"author": "",
|
|
6
|
+
"private": true,
|
|
7
|
+
"license": "UNLICENSED",
|
|
8
|
+
"scripts": {
|
|
9
|
+
"build": "nest build",
|
|
10
|
+
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
|
|
11
|
+
"start": "nest start",
|
|
12
|
+
"start:dev": "nest start --watch",
|
|
13
|
+
"start:debug": "nest start --debug --watch",
|
|
14
|
+
"start:prod": "node dist/main",
|
|
15
|
+
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
|
|
16
|
+
"test": "jest",
|
|
17
|
+
"test:watch": "jest --watch",
|
|
18
|
+
"test:cov": "jest --coverage",
|
|
19
|
+
"test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
|
|
20
|
+
"test:e2e": "jest --config ./test/jest-e2e.json"
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"@nestjs/common": "^11.0.1",
|
|
24
|
+
"@nestjs/config": "^4.0.2",
|
|
25
|
+
"@nestjs/core": "^11.0.1",
|
|
26
|
+
"@nestjs/jwt": "^11.0.1",
|
|
27
|
+
"@nestjs/mongoose": "^11.0.2",
|
|
28
|
+
"@nestjs/passport": "^11.0.5",
|
|
29
|
+
"@nestjs/platform-express": "^11.0.1",
|
|
30
|
+
"@nestjs/schedule": "^6.0.1",
|
|
31
|
+
"@nestjs/swagger": "^11.2.1",
|
|
32
|
+
"bcryptjs": "^2.4.3",
|
|
33
|
+
"class-transformer": "^0.5.1",
|
|
34
|
+
"class-validator": "^0.14.2",
|
|
35
|
+
"cookie-parser": "^1.4.7",
|
|
36
|
+
"mongoose": "^9.0.1",
|
|
37
|
+
"passport": "^0.7.0",
|
|
38
|
+
"passport-jwt": "^4.0.1",
|
|
39
|
+
"reflect-metadata": "^0.2.2",
|
|
40
|
+
"resend": "^4.1.2",
|
|
41
|
+
"rxjs": "^7.8.1"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@eslint/eslintrc": "^3.2.0",
|
|
45
|
+
"@eslint/js": "^9.18.0",
|
|
46
|
+
"@nestjs/cli": "^11.0.0",
|
|
47
|
+
"@nestjs/schematics": "^11.0.0",
|
|
48
|
+
"@nestjs/testing": "^11.0.1",
|
|
49
|
+
"@types/bcryptjs": "^2.4.6",
|
|
50
|
+
"@types/cookie-parser": "^1.4.8",
|
|
51
|
+
"@types/express": "^5.0.0",
|
|
52
|
+
"@types/jest": "^30.0.0",
|
|
53
|
+
"@types/node": "^22.10.7",
|
|
54
|
+
"@types/passport-jwt": "^4.0.1",
|
|
55
|
+
"@types/supertest": "^6.0.2",
|
|
56
|
+
"eslint": "^9.18.0",
|
|
57
|
+
"eslint-config-prettier": "^10.0.1",
|
|
58
|
+
"eslint-plugin-prettier": "^5.2.2",
|
|
59
|
+
"globals": "^16.0.0",
|
|
60
|
+
"jest": "^30.0.0",
|
|
61
|
+
"prettier": "^3.4.2",
|
|
62
|
+
"source-map-support": "^0.5.21",
|
|
63
|
+
"supertest": "^7.0.0",
|
|
64
|
+
"ts-jest": "^29.2.5",
|
|
65
|
+
"ts-loader": "^9.5.2",
|
|
66
|
+
"ts-node": "^10.9.2",
|
|
67
|
+
"tsconfig-paths": "^4.2.0",
|
|
68
|
+
"typescript": "^5.7.3",
|
|
69
|
+
"typescript-eslint": "^8.20.0"
|
|
70
|
+
},
|
|
71
|
+
"jest": {
|
|
72
|
+
"moduleFileExtensions": [
|
|
73
|
+
"js",
|
|
74
|
+
"json",
|
|
75
|
+
"ts"
|
|
76
|
+
],
|
|
77
|
+
"rootDir": "src",
|
|
78
|
+
"testRegex": ".*\\.spec\\.ts$",
|
|
79
|
+
"transform": {
|
|
80
|
+
"^.+\\.(t|j)s$": "ts-jest"
|
|
81
|
+
},
|
|
82
|
+
"collectCoverageFrom": [
|
|
83
|
+
"**/*.(t|j)s"
|
|
84
|
+
],
|
|
85
|
+
"coverageDirectory": "../coverage",
|
|
86
|
+
"testEnvironment": "node"
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
import { Test, TestingModule } from '@nestjs/testing';
|
|
2
|
-
import { AppController } from './app.controller';
|
|
3
|
-
import { AppService } from './app.service';
|
|
4
|
-
|
|
5
|
-
describe('AppController', () => {
|
|
6
|
-
let appController: AppController;
|
|
7
|
-
|
|
8
|
-
beforeEach(async () => {
|
|
9
|
-
const app: TestingModule = await Test.createTestingModule({
|
|
10
|
-
controllers: [AppController],
|
|
11
|
-
providers: [AppService],
|
|
12
|
-
}).compile();
|
|
13
|
-
|
|
14
|
-
appController = app.get<AppController>(AppController);
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
describe('health', () => {
|
|
18
|
-
it('should return status ok', () => {
|
|
19
|
-
const result = appController.getHealth();
|
|
20
|
-
expect(result.status).toBe('ok');
|
|
21
|
-
expect(result.timestamp).toBeDefined();
|
|
22
|
-
});
|
|
23
|
-
});
|
|
24
|
-
});
|
|
1
|
+
import { Test, TestingModule } from '@nestjs/testing';
|
|
2
|
+
import { AppController } from './app.controller';
|
|
3
|
+
import { AppService } from './app.service';
|
|
4
|
+
|
|
5
|
+
describe('AppController', () => {
|
|
6
|
+
let appController: AppController;
|
|
7
|
+
|
|
8
|
+
beforeEach(async () => {
|
|
9
|
+
const app: TestingModule = await Test.createTestingModule({
|
|
10
|
+
controllers: [AppController],
|
|
11
|
+
providers: [AppService],
|
|
12
|
+
}).compile();
|
|
13
|
+
|
|
14
|
+
appController = app.get<AppController>(AppController);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
describe('health', () => {
|
|
18
|
+
it('should return status ok', () => {
|
|
19
|
+
const result = appController.getHealth();
|
|
20
|
+
expect(result.status).toBe('ok');
|
|
21
|
+
expect(result.timestamp).toBeDefined();
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
});
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { Controller, Get } from '@nestjs/common';
|
|
2
|
-
import { ApiTags, ApiOperation } from '@nestjs/swagger';
|
|
3
|
-
import { AppService } from './app.service';
|
|
4
|
-
|
|
5
|
-
@ApiTags('Health')
|
|
6
|
-
@Controller()
|
|
7
|
-
export class AppController {
|
|
8
|
-
constructor(private readonly appService: AppService) {}
|
|
9
|
-
|
|
10
|
-
@Get()
|
|
11
|
-
@ApiOperation({ summary: 'Health check' })
|
|
12
|
-
getHealth(): { status: string; timestamp: string } {
|
|
13
|
-
return this.appService.getHealth();
|
|
14
|
-
}
|
|
15
|
-
}
|
|
1
|
+
import { Controller, Get } from '@nestjs/common';
|
|
2
|
+
import { ApiTags, ApiOperation } from '@nestjs/swagger';
|
|
3
|
+
import { AppService } from './app.service';
|
|
4
|
+
|
|
5
|
+
@ApiTags('Health')
|
|
6
|
+
@Controller()
|
|
7
|
+
export class AppController {
|
|
8
|
+
constructor(private readonly appService: AppService) {}
|
|
9
|
+
|
|
10
|
+
@Get()
|
|
11
|
+
@ApiOperation({ summary: 'Health check' })
|
|
12
|
+
getHealth(): { status: string; timestamp: string } {
|
|
13
|
+
return this.appService.getHealth();
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -1,40 +1,40 @@
|
|
|
1
|
-
import { Module } from '@nestjs/common';
|
|
2
|
-
import { ConfigModule, ConfigService } from '@nestjs/config';
|
|
3
|
-
import { MongooseModule } from '@nestjs/mongoose';
|
|
4
|
-
import { APP_FILTER } from '@nestjs/core';
|
|
5
|
-
import { AppController } from './app.controller';
|
|
6
|
-
import { AppService } from './app.service';
|
|
7
|
-
import { GlobalExceptionFilter } from './common/filters/global-exception.filter';
|
|
8
|
-
import { AuthModule } from './modules/auth/auth.module';
|
|
9
|
-
import { MailModule } from './modules/mail/mail.module';
|
|
10
|
-
import { UsersModule } from './modules/users/users.module';
|
|
11
|
-
import { WorkspacesModule } from './modules/workspaces/workspaces.module';
|
|
12
|
-
|
|
13
|
-
@Module({
|
|
14
|
-
imports: [
|
|
15
|
-
ConfigModule.forRoot({
|
|
16
|
-
isGlobal: true,
|
|
17
|
-
envFilePath: '.env',
|
|
18
|
-
}),
|
|
19
|
-
MongooseModule.forRootAsync({
|
|
20
|
-
imports: [ConfigModule],
|
|
21
|
-
inject: [ConfigService],
|
|
22
|
-
useFactory: (config: ConfigService) => ({
|
|
23
|
-
uri: config.getOrThrow<string>('MONGODB_URI'),
|
|
24
|
-
}),
|
|
25
|
-
}),
|
|
26
|
-
MailModule,
|
|
27
|
-
UsersModule,
|
|
28
|
-
WorkspacesModule,
|
|
29
|
-
AuthModule,
|
|
30
|
-
],
|
|
31
|
-
controllers: [AppController],
|
|
32
|
-
providers: [
|
|
33
|
-
AppService,
|
|
34
|
-
{
|
|
35
|
-
provide: APP_FILTER,
|
|
36
|
-
useClass: GlobalExceptionFilter,
|
|
37
|
-
},
|
|
38
|
-
],
|
|
39
|
-
})
|
|
40
|
-
export class AppModule {}
|
|
1
|
+
import { Module } from '@nestjs/common';
|
|
2
|
+
import { ConfigModule, ConfigService } from '@nestjs/config';
|
|
3
|
+
import { MongooseModule } from '@nestjs/mongoose';
|
|
4
|
+
import { APP_FILTER } from '@nestjs/core';
|
|
5
|
+
import { AppController } from './app.controller';
|
|
6
|
+
import { AppService } from './app.service';
|
|
7
|
+
import { GlobalExceptionFilter } from './common/filters/global-exception.filter';
|
|
8
|
+
import { AuthModule } from './modules/auth/auth.module';
|
|
9
|
+
import { MailModule } from './modules/mail/mail.module';
|
|
10
|
+
import { UsersModule } from './modules/users/users.module';
|
|
11
|
+
import { WorkspacesModule } from './modules/workspaces/workspaces.module';
|
|
12
|
+
|
|
13
|
+
@Module({
|
|
14
|
+
imports: [
|
|
15
|
+
ConfigModule.forRoot({
|
|
16
|
+
isGlobal: true,
|
|
17
|
+
envFilePath: '.env',
|
|
18
|
+
}),
|
|
19
|
+
MongooseModule.forRootAsync({
|
|
20
|
+
imports: [ConfigModule],
|
|
21
|
+
inject: [ConfigService],
|
|
22
|
+
useFactory: (config: ConfigService) => ({
|
|
23
|
+
uri: config.getOrThrow<string>('MONGODB_URI'),
|
|
24
|
+
}),
|
|
25
|
+
}),
|
|
26
|
+
MailModule,
|
|
27
|
+
UsersModule,
|
|
28
|
+
WorkspacesModule,
|
|
29
|
+
AuthModule,
|
|
30
|
+
],
|
|
31
|
+
controllers: [AppController],
|
|
32
|
+
providers: [
|
|
33
|
+
AppService,
|
|
34
|
+
{
|
|
35
|
+
provide: APP_FILTER,
|
|
36
|
+
useClass: GlobalExceptionFilter,
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
})
|
|
40
|
+
export class AppModule {}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { Injectable } from '@nestjs/common';
|
|
2
|
-
|
|
3
|
-
@Injectable()
|
|
4
|
-
export class AppService {
|
|
5
|
-
getHealth(): { status: string; timestamp: string } {
|
|
6
|
-
return {
|
|
7
|
-
status: 'ok',
|
|
8
|
-
timestamp: new Date().toISOString(),
|
|
9
|
-
};
|
|
10
|
-
}
|
|
11
|
-
}
|
|
1
|
+
import { Injectable } from '@nestjs/common';
|
|
2
|
+
|
|
3
|
+
@Injectable()
|
|
4
|
+
export class AppService {
|
|
5
|
+
getHealth(): { status: string; timestamp: string } {
|
|
6
|
+
return {
|
|
7
|
+
status: 'ok',
|
|
8
|
+
timestamp: new Date().toISOString(),
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
}
|