@urbansolv/create-nestjs-app 1.0.2 → 1.2.0

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.
Files changed (51) hide show
  1. package/dist/templates/nestjs-app/.editorconfig +12 -12
  2. package/dist/templates/nestjs-app/.env.example +24 -24
  3. package/dist/templates/nestjs-app/.eslintrc.js +25 -25
  4. package/dist/templates/nestjs-app/package.json +40 -30
  5. package/dist/templates/nestjs-app/prisma/schema.prisma +79 -79
  6. package/dist/templates/nestjs-app/prisma/seed.ts +153 -154
  7. package/dist/templates/nestjs-app/src/app.module.ts +68 -68
  8. package/dist/templates/nestjs-app/src/common/constants/permissions.constant.ts +27 -27
  9. package/dist/templates/nestjs-app/src/common/decorators/api-response.decorator.ts +44 -44
  10. package/dist/templates/nestjs-app/src/common/decorators/get-user.decorator.ts +11 -11
  11. package/dist/templates/nestjs-app/src/common/decorators/permissions.decorator.ts +5 -5
  12. package/dist/templates/nestjs-app/src/common/decorators/public.decorator.ts +4 -4
  13. package/dist/templates/nestjs-app/src/common/dto/api-response.dto.ts +21 -21
  14. package/dist/templates/nestjs-app/src/common/dto/pagination.dto.ts +33 -33
  15. package/dist/templates/nestjs-app/src/common/filters/http-exception.filter.ts +56 -56
  16. package/dist/templates/nestjs-app/src/common/guards/jwt-auth.guard.ts +32 -32
  17. package/dist/templates/nestjs-app/src/common/guards/permissions.guard.ts +53 -53
  18. package/dist/templates/nestjs-app/src/common/interceptors/logging.interceptor.ts +37 -37
  19. package/dist/templates/nestjs-app/src/common/interceptors/transform.interceptor.ts +55 -55
  20. package/dist/templates/nestjs-app/src/common/prisma/prisma.module.ts +9 -9
  21. package/dist/templates/nestjs-app/src/common/prisma/prisma.service.ts +46 -46
  22. package/dist/templates/nestjs-app/src/common/utils/password.util.ts +13 -13
  23. package/dist/templates/nestjs-app/src/config/app.config.ts +10 -10
  24. package/dist/templates/nestjs-app/src/config/database.config.ts +5 -5
  25. package/dist/templates/nestjs-app/src/config/env.validation.ts +30 -30
  26. package/dist/templates/nestjs-app/src/config/jwt.config.ts +8 -8
  27. package/dist/templates/nestjs-app/src/config/swagger.config.ts +6 -6
  28. package/dist/templates/nestjs-app/src/main.ts +94 -91
  29. package/dist/templates/nestjs-app/src/modules/auth/auth.module.ts +28 -27
  30. package/dist/templates/nestjs-app/src/modules/auth/auth.service.ts +180 -54
  31. package/dist/templates/nestjs-app/src/modules/auth/controllers/v1/auth.controller.ts +33 -33
  32. package/dist/templates/nestjs-app/src/modules/auth/{dto → core/dto}/auth-response.dto.ts +19 -19
  33. package/dist/templates/nestjs-app/src/modules/auth/core/dto/login-response.dto.ts +10 -0
  34. package/dist/templates/nestjs-app/src/modules/auth/{dto → core/dto}/login.dto.ts +15 -15
  35. package/dist/templates/nestjs-app/src/modules/auth/{dto → core/dto}/register.dto.ts +30 -30
  36. package/dist/templates/nestjs-app/src/modules/auth/{interfaces → core/interfaces}/jwt-payload.interface.ts +7 -7
  37. package/dist/templates/nestjs-app/src/modules/auth/{strategies → core/strategies}/jwt.strategy.ts +54 -54
  38. package/dist/templates/nestjs-app/src/modules/health/health.controller.ts +29 -29
  39. package/dist/templates/nestjs-app/src/modules/health/health.module.ts +7 -7
  40. package/dist/templates/nestjs-app/src/modules/users/controllers/v1/users.controller.ts +118 -114
  41. package/dist/templates/nestjs-app/src/modules/users/core/dto/change-position.dto.ts +9 -9
  42. package/dist/templates/nestjs-app/src/modules/users/core/dto/create-user.dto.ts +35 -35
  43. package/dist/templates/nestjs-app/src/modules/users/core/dto/manage-permissions.dto.ts +13 -13
  44. package/dist/templates/nestjs-app/src/modules/users/core/dto/update-user.dto.ts +30 -30
  45. package/dist/templates/nestjs-app/src/modules/users/core/dto/user-query.dto.ts +22 -22
  46. package/dist/templates/nestjs-app/src/modules/users/core/dto/user-response.dto.ts +32 -0
  47. package/dist/templates/nestjs-app/src/modules/users/core/entities/user.entity.ts +45 -45
  48. package/dist/templates/nestjs-app/src/modules/users/core/helpers/user-transform.helper.ts +31 -31
  49. package/dist/templates/nestjs-app/src/modules/users/users.module.ts +10 -10
  50. package/dist/templates/nestjs-app/src/modules/users/users.service.ts +340 -340
  51. package/package.json +2 -2
@@ -1,12 +1,12 @@
1
- root = true
2
-
3
- [*]
4
- charset = utf-8
5
- indent_style = space
6
- indent_size = 2
7
- end_of_line = lf
8
- insert_final_newline = true
9
- trim_trailing_whitespace = true
10
-
11
- [*.md]
12
- trim_trailing_whitespace = false
1
+ root = true
2
+
3
+ [*]
4
+ charset = utf-8
5
+ indent_style = space
6
+ indent_size = 2
7
+ end_of_line = lf
8
+ insert_final_newline = true
9
+ trim_trailing_whitespace = true
10
+
11
+ [*.md]
12
+ trim_trailing_whitespace = false
@@ -1,24 +1,24 @@
1
- # Application
2
- NODE_ENV=development
3
- PORT=3000
4
- APP_NAME=__PROJECT_NAME__
5
-
6
- # Database
7
- DATABASE_URL="postgresql://username:password@localhost:5432/__DATABASE_NAME__?schema=public"
8
-
9
- # JWT
10
- JWT_SECRET=your-super-secret-jwt-key-change-this-in-production
11
- JWT_EXPIRATION=7d
12
- JWT_REFRESH_SECRET=your-super-secret-refresh-key-change-this-in-production
13
- JWT_REFRESH_EXPIRATION=30d
14
-
15
- # CORS
16
- CORS_ORIGIN=http://localhost:3001
17
-
18
- # API
19
- API_PREFIX=api
20
- API_VERSION=v1
21
-
22
- # Swagger
23
- SWAGGER_ENABLED=true
24
- SWAGGER_PATH=api-docs
1
+ # Application
2
+ NODE_ENV=development
3
+ PORT=3000
4
+ APP_NAME=__PROJECT_NAME__
5
+
6
+ # Database
7
+ DATABASE_URL="postgresql://username:password@localhost:5432/__DATABASE_NAME__?schema=public"
8
+
9
+ # JWT
10
+ JWT_SECRET=your-super-secret-jwt-key-change-this-in-production
11
+ JWT_EXPIRATION=7d
12
+ JWT_REFRESH_SECRET=your-super-secret-refresh-key-change-this-in-production
13
+ JWT_REFRESH_EXPIRATION=30d
14
+
15
+ # CORS
16
+ CORS_ORIGIN=http://localhost:3001
17
+
18
+ # API
19
+ API_PREFIX=api
20
+ API_VERSION=v1
21
+
22
+ # Swagger
23
+ SWAGGER_ENABLED=true
24
+ SWAGGER_PATH=docs
@@ -1,25 +1,25 @@
1
- module.exports = {
2
- parser: '@typescript-eslint/parser',
3
- parserOptions: {
4
- project: 'tsconfig.json',
5
- tsconfigRootDir: __dirname,
6
- sourceType: 'module',
7
- },
8
- plugins: ['@typescript-eslint/eslint-plugin'],
9
- extends: [
10
- 'plugin:@typescript-eslint/recommended',
11
- 'plugin:prettier/recommended',
12
- ],
13
- root: true,
14
- env: {
15
- node: true,
16
- jest: true,
17
- },
18
- ignorePatterns: ['.eslintrc.js'],
19
- rules: {
20
- '@typescript-eslint/interface-name-prefix': 'off',
21
- '@typescript-eslint/explicit-function-return-type': 'off',
22
- '@typescript-eslint/explicit-module-boundary-types': 'off',
23
- '@typescript-eslint/no-explicit-any': 'off',
24
- },
25
- };
1
+ module.exports = {
2
+ parser: '@typescript-eslint/parser',
3
+ parserOptions: {
4
+ project: 'tsconfig.json',
5
+ tsconfigRootDir: __dirname,
6
+ sourceType: 'module',
7
+ },
8
+ plugins: ['@typescript-eslint/eslint-plugin'],
9
+ extends: [
10
+ 'plugin:@typescript-eslint/recommended',
11
+ 'plugin:prettier/recommended',
12
+ ],
13
+ root: true,
14
+ env: {
15
+ node: true,
16
+ jest: true,
17
+ },
18
+ ignorePatterns: ['.eslintrc.js'],
19
+ rules: {
20
+ '@typescript-eslint/interface-name-prefix': 'off',
21
+ '@typescript-eslint/explicit-function-return-type': 'off',
22
+ '@typescript-eslint/explicit-module-boundary-types': 'off',
23
+ '@typescript-eslint/no-explicit-any': 'off',
24
+ },
25
+ };
@@ -1,86 +1,96 @@
1
1
  {
2
- "name": "__PROJECT_NAME__",
3
- "version": "1.0.0",
4
- "description": "Urbansolv NestJS Application",
5
- "author": "Urbansolv",
2
+ "name": "product-2025-11-arbas-be",
3
+ "version": "0.0.1",
4
+ "description": "",
5
+ "author": "",
6
6
  "private": true,
7
7
  "license": "UNLICENSED",
8
8
  "scripts": {
9
- "build": "npm run clean && tsc && npm run copy-templates",
10
- "clean": "rm -rf dist",
11
- "copy-templates": "cp -r templates dist/",
12
- "dev": "ts-node src/cli.ts",
13
- "prepublishOnly": "npm run build",
9
+ "build": "nest build",
14
10
  "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
11
+ "lf": "prettier --write .",
15
12
  "start": "nest start",
16
13
  "start:dev": "nest start --watch",
17
14
  "start:debug": "nest start --debug --watch",
18
- "start:prod": "node dist/main",
15
+ "start:prod": "node dist/src/main",
19
16
  "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
20
- "test": "echo \"No tests yet\" && exit 0",
17
+ "test": "jest",
21
18
  "test:watch": "jest --watch",
22
19
  "test:cov": "jest --coverage",
23
20
  "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
24
21
  "test:e2e": "jest --config ./test/jest-e2e.json",
25
- "prisma:generate": "prisma generate",
26
- "prisma:migrate": "prisma migrate dev",
27
- "prisma:studio": "prisma studio",
28
- "prisma:seed": "ts-node prisma/seed.ts"
22
+ "seed": "ts-node prisma/seed/main.ts",
23
+ "seed:locations": "ts-node prisma/seed/seed-locations-postgis.ts"
29
24
  },
30
25
  "dependencies": {
31
26
  "@nestjs/common": "^11.0.1",
32
27
  "@nestjs/config": "^4.0.2",
33
28
  "@nestjs/core": "^11.0.1",
29
+ "@nestjs/mapped-types": "*",
34
30
  "@nestjs/passport": "^11.0.5",
35
31
  "@nestjs/platform-express": "^11.0.1",
36
32
  "@nestjs/swagger": "^11.2.3",
37
33
  "@prisma/client": "^6.19.0",
34
+ "adm-zip": "^0.5.16",
38
35
  "bcryptjs": "^3.0.3",
39
36
  "class-transformer": "^0.5.1",
40
- "class-validator": "^0.14.0",
41
- "joi": "^18.0.2",
37
+ "class-validator": "^0.14.2",
38
+ "cloudinary": "^1.41.3",
39
+ "cookie-parser": "^1.4.7",
40
+ "jsonwebtoken": "^9.0.2",
41
+ "multer": "^2.0.2",
42
+ "multer-storage-cloudinary": "^4.0.0",
42
43
  "passport": "^0.7.0",
43
44
  "passport-jwt": "^4.0.1",
45
+ "prisma": "^6.19.0",
46
+ "proj4": "^2.20.2",
47
+ "puppeteer": "^24.36.0",
44
48
  "reflect-metadata": "^0.2.2",
45
- "rxjs": "^7.8.1"
49
+ "rxjs": "^7.8.1",
50
+ "shapefile": "^0.6.6",
51
+ "swagger-ui-express": "^5.0.1"
46
52
  },
47
53
  "devDependencies": {
54
+ "@eslint/eslintrc": "^3.2.0",
55
+ "@eslint/js": "^9.18.0",
48
56
  "@nestjs/cli": "^11.0.0",
49
57
  "@nestjs/schematics": "^11.0.0",
50
58
  "@nestjs/testing": "^11.0.1",
51
- "@types/bcrypt": "^6.0.0",
52
59
  "@types/express": "^5.0.5",
53
60
  "@types/jest": "^30.0.0",
61
+ "@types/multer": "^2.0.0",
54
62
  "@types/node": "^22.10.7",
55
- "@types/passport-jwt": "^4.0.1",
56
63
  "@types/supertest": "^6.0.2",
57
- "@typescript-eslint/eslint-plugin": "^8.54.0",
58
- "@typescript-eslint/parser": "^8.54.0",
64
+ "dotenv": "^17.2.3",
59
65
  "eslint": "^9.18.0",
60
66
  "eslint-config-prettier": "^10.0.1",
61
67
  "eslint-plugin-prettier": "^5.2.2",
68
+ "globals": "^16.0.0",
62
69
  "jest": "^30.0.0",
63
- "prettier": "^3.4.2",
64
- "prisma": "^6.19.0",
70
+ "prettier": "3.4.2",
65
71
  "source-map-support": "^0.5.21",
66
72
  "supertest": "^7.0.0",
67
73
  "ts-jest": "^29.2.5",
68
74
  "ts-loader": "^9.5.2",
69
75
  "ts-node": "^10.9.2",
70
76
  "tsconfig-paths": "^4.2.0",
71
- "typescript": "^5.7.3"
72
- },
73
- "prisma": {
74
- "seed": "ts-node prisma/seed.ts"
77
+ "typescript": "^5.7.3",
78
+ "typescript-eslint": "^8.20.0"
75
79
  },
76
80
  "jest": {
77
- "moduleFileExtensions": ["js", "json", "ts"],
81
+ "moduleFileExtensions": [
82
+ "js",
83
+ "json",
84
+ "ts"
85
+ ],
78
86
  "rootDir": "src",
79
87
  "testRegex": ".*\\.spec\\.ts$",
80
88
  "transform": {
81
89
  "^.+\\.(t|j)s$": "ts-jest"
82
90
  },
83
- "collectCoverageFrom": ["**/*.(t|j)s"],
91
+ "collectCoverageFrom": [
92
+ "**/*.(t|j)s"
93
+ ],
84
94
  "coverageDirectory": "../coverage",
85
95
  "testEnvironment": "node"
86
96
  }
@@ -1,79 +1,79 @@
1
- // This is your Prisma schema file,
2
- // learn more about it in the docs: https://pris.ly/d/prisma-schema
3
-
4
- generator client {
5
- provider = "prisma-client-js"
6
- }
7
-
8
- datasource db {
9
- provider = "postgresql"
10
- url = env("DATABASE_URL")
11
- }
12
-
13
- // ============================================
14
- // RBAC Schema
15
- // ============================================
16
-
17
- model User {
18
- id Int @id @default(autoincrement())
19
- email String @unique
20
- password String
21
- first_name String
22
- last_name String
23
- is_active Boolean @default(true)
24
- created_at DateTime @default(now())
25
- updated_at DateTime @updatedAt
26
- deleted_at DateTime?
27
-
28
- // Relations
29
- position_id Int
30
- position Position @relation(fields: [position_id], references: [id])
31
-
32
- @@map("users")
33
- }
34
-
35
- model Position {
36
- id Int @id @default(autoincrement())
37
- name String @unique
38
- description String?
39
- is_active Boolean @default(true)
40
- created_at DateTime @default(now())
41
- updated_at DateTime @updatedAt
42
- deleted_at DateTime?
43
-
44
- // Relations
45
- users User[]
46
- position_permissions PositionPermission[]
47
-
48
- @@map("positions")
49
- }
50
-
51
- model Permission {
52
- id Int @id @default(autoincrement())
53
- name String @unique
54
- description String?
55
- resource String // e.g., 'USER', 'TRANSACTION', 'REPORT'
56
- action String // e.g., 'VIEW', 'ADD', 'UPDATE', 'DELETE'
57
- created_at DateTime @default(now())
58
- updated_at DateTime @updatedAt
59
- deleted_at DateTime?
60
-
61
- // Relations
62
- position_permissions PositionPermission[]
63
-
64
- @@map("permissions")
65
- }
66
-
67
- model PositionPermission {
68
- id Int @id @default(autoincrement())
69
- position_id Int
70
- permission_id Int
71
- created_at DateTime @default(now())
72
-
73
- // Relations
74
- position Position @relation(fields: [position_id], references: [id], onDelete: Cascade)
75
- permission Permission @relation(fields: [permission_id], references: [id], onDelete: Cascade)
76
-
77
- @@unique([position_id, permission_id])
78
- @@map("position_permissions")
79
- }
1
+ // This is your Prisma schema file,
2
+ // learn more about it in the docs: https://pris.ly/d/prisma-schema
3
+
4
+ generator client {
5
+ provider = "prisma-client-js"
6
+ }
7
+
8
+ datasource db {
9
+ provider = "postgresql"
10
+ url = env("DATABASE_URL")
11
+ }
12
+
13
+ // ============================================
14
+ // RBAC Schema
15
+ // ============================================
16
+
17
+ model User {
18
+ id Int @id @default(autoincrement())
19
+ email String @unique
20
+ password String
21
+ first_name String
22
+ last_name String
23
+ is_active Boolean @default(true)
24
+ created_at DateTime @default(now())
25
+ updated_at DateTime @updatedAt
26
+ deleted_at DateTime?
27
+
28
+ // Relations
29
+ position_id Int
30
+ position Position @relation(fields: [position_id], references: [id])
31
+
32
+ @@map("users")
33
+ }
34
+
35
+ model Position {
36
+ id Int @id @default(autoincrement())
37
+ name String @unique
38
+ description String?
39
+ is_active Boolean @default(true)
40
+ created_at DateTime @default(now())
41
+ updated_at DateTime @updatedAt
42
+ deleted_at DateTime?
43
+
44
+ // Relations
45
+ users User[]
46
+ position_permissions PositionPermission[]
47
+
48
+ @@map("positions")
49
+ }
50
+
51
+ model Permission {
52
+ id Int @id @default(autoincrement())
53
+ name String @unique
54
+ description String?
55
+ resource String // e.g., 'USER', 'TRANSACTION', 'REPORT'
56
+ action String // e.g., 'VIEW', 'ADD', 'UPDATE', 'DELETE'
57
+ created_at DateTime @default(now())
58
+ updated_at DateTime @updatedAt
59
+ deleted_at DateTime?
60
+
61
+ // Relations
62
+ position_permissions PositionPermission[]
63
+
64
+ @@map("permissions")
65
+ }
66
+
67
+ model PositionPermission {
68
+ id Int @id @default(autoincrement())
69
+ position_id Int
70
+ permission_id Int
71
+ created_at DateTime @default(now())
72
+
73
+ // Relations
74
+ position Position @relation(fields: [position_id], references: [id], onDelete: Cascade)
75
+ permission Permission @relation(fields: [permission_id], references: [id], onDelete: Cascade)
76
+
77
+ @@unique([position_id, permission_id])
78
+ @@map("position_permissions")
79
+ }