From b5f97e2012f99a5dd2fbed83deb37834c00824c9 Mon Sep 17 00:00:00 2001 From: Ho Ngoc Hai Date: Wed, 7 Jan 2026 17:48:49 +0700 Subject: [PATCH] =?UTF-8?q?feat:=20C=E1=BA=A5u=20h=C3=ACnh=20ESLint=20flat?= =?UTF-8?q?=20config=20m=E1=BB=9Bi,=20th=C3=AAm=20`jsconfig.json`,=20v?= =?UTF-8?q?=C3=A0=20s=E1=BA=AFp=20x=E1=BA=BFp=20l=E1=BA=A1i=20c=C3=A1c=20i?= =?UTF-8?q?mport=20t=E1=BB=B1=20=C4=91=E1=BB=99ng.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- eslint.config.js | 59 +++ jsconfig.json | 16 + package.json | 2 + packages/auth-sdk/package.json | 1 + .../config/eslint-config/eslint.config.js | 145 +++++++ packages/config/eslint-config/package.json | 5 +- packages/config/prettier-config/package.json | 1 + packages/config/tsconfig/package.json | 1 + packages/http-client/package.json | 1 + packages/logger/package.json | 1 + packages/tracing/package.json | 1 + packages/types/package.json | 1 + pnpm-lock.yaml | 387 +----------------- services/_template/eslint.config.js | 23 ++ services/_template/package.json | 3 +- services/iam-service/eslint.config.js | 23 ++ services/iam-service/package.json | 3 +- services/iam-service/src/docs/swagger.ts | 1 + services/iam-service/src/main.ts | 5 +- .../src/middlewares/auth.middleware.ts | 2 +- .../src/middlewares/correlation.middleware.ts | 2 +- .../src/modules/access/access.routes.ts | 4 +- .../access/analytics/analytics.controller.ts | 2 +- .../access/request/request.controller.ts | 2 +- .../access/review/review.controller.ts | 2 +- .../src/modules/auth/auth.controller.ts | 3 +- .../src/modules/auth/auth.routes.ts | 4 +- .../auth/change-password.controller.ts | 3 +- .../src/modules/feature/feature.controller.ts | 2 +- .../src/modules/feature/feature.repository.ts | 2 +- .../compliance/compliance.controller.ts | 2 +- .../modules/governance/governance.routes.ts | 4 +- .../policy/policy-governance.controller.ts | 2 +- .../reporting/reporting.controller.ts | 2 +- .../governance/risk/risk.controller.ts | 2 +- .../identity/group/group.controller.ts | 2 +- .../src/modules/identity/identity.routes.ts | 10 +- .../organization/organization.controller.ts | 2 +- .../identity/profile/profile.controller.ts | 2 +- .../modules/identity/user/user.controller.ts | 2 +- .../src/modules/identity/user/user.service.ts | 2 +- .../verification/verification.controller.ts | 2 +- .../src/modules/mfa/mfa.controller.ts | 3 +- .../iam-service/src/modules/mfa/mfa.routes.ts | 2 + .../src/modules/oidc/oidc.controller.ts | 3 +- .../src/modules/oidc/oidc.routes.ts | 2 + .../src/modules/rbac/rbac.controller.ts | 3 +- .../src/modules/rbac/rbac.routes.ts | 2 + .../src/modules/session/session.routes.ts | 2 + .../modules/session/sessions.controller.ts | 3 +- .../src/modules/social/social.controller.ts | 2 +- services/iam-service/src/routes/index.ts | 9 +- 52 files changed, 356 insertions(+), 416 deletions(-) create mode 100644 eslint.config.js create mode 100644 jsconfig.json create mode 100644 packages/config/eslint-config/eslint.config.js create mode 100644 services/_template/eslint.config.js create mode 100644 services/iam-service/eslint.config.js diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 00000000..5084e5d3 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,59 @@ +// EN: ESLint v9 Flat Config for Root Monorepo +// VI: ESLint v9 Flat Config cho Root Monorepo +import tseslint from '@typescript-eslint/eslint-plugin'; +import tsparser from '@typescript-eslint/parser'; + +export default [ + { + // EN: Ignore patterns for monorepo root + // VI: Các pattern bỏ qua cho monorepo root + ignores: [ + '**/node_modules/**', + '**/dist/**', + '**/build/**', + '**/.next/**', + '**/coverage/**', + '**/.turbo/**', + '**/prisma/migrations/**', + '**/_prisma_client/**', + // EN: Ignore workspace packages (they have their own configs) + // VI: Bỏ qua workspace packages (chúng có config riêng) + 'apps/**', + 'services/**', + 'packages/**', + ], + }, + { + // EN: Configuration for root-level config files + // VI: Cấu hình cho các config files ở root level + files: ['*.js', '*.ts', '*.json'], + languageOptions: { + parser: tsparser, + parserOptions: { + ecmaVersion: 2024, + sourceType: 'module', + }, + globals: { + // Node.js globals + console: 'readonly', + process: 'readonly', + Buffer: 'readonly', + __dirname: 'readonly', + __filename: 'readonly', + module: 'readonly', + require: 'readonly', + exports: 'readonly', + globalThis: 'readonly', + }, + }, + plugins: { + '@typescript-eslint': tseslint, + }, + rules: { + // EN: Minimal rules for root config files + // VI: Rules tối thiểu cho root config files + 'no-console': 'off', + 'no-debugger': 'error', + }, + }, +]; diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 00000000..5d453d60 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "module": "ESNext", + "moduleResolution": "Bundler", + "target": "ES2024", + "jsx": "react-jsx", + "allowImportingTsExtensions": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "strict": true + }, + "exclude": [ + "node_modules", + "**/node_modules/*" + ] +} \ No newline at end of file diff --git a/package.json b/package.json index 616c8342..a1b89327 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,7 @@ "name": "@goodgo/monorepo", "version": "1.0.0", "private": true, + "type": "module", "description": "Enterprise-grade microservices monorepo with Auth Service, Web & Mobile apps", "author": { "name": "VelikHo", @@ -34,6 +35,7 @@ "devDependencies": { "@types/node": "^25.0.3", "eslint": "^9.39.2", + "eslint-scope": "^9.0.0", "prettier": "^3.7.4", "turbo": "^2.7.3", "typescript": "^5.9.3" diff --git a/packages/auth-sdk/package.json b/packages/auth-sdk/package.json index 31e0b0f2..9328c0ff 100644 --- a/packages/auth-sdk/package.json +++ b/packages/auth-sdk/package.json @@ -1,6 +1,7 @@ { "name": "@goodgo/auth-sdk", "version": "1.0.0", + "type": "module", "description": "Authentication SDK utilities", "main": "./dist/index.js", "types": "./dist/index.d.ts", diff --git a/packages/config/eslint-config/eslint.config.js b/packages/config/eslint-config/eslint.config.js new file mode 100644 index 00000000..ee3b5cef --- /dev/null +++ b/packages/config/eslint-config/eslint.config.js @@ -0,0 +1,145 @@ +// EN: ESLint v9 Flat Config for GoodGo Services +// VI: ESLint v9 Flat Config cho GoodGo Services +import tseslint from '@typescript-eslint/eslint-plugin'; +import tsparser from '@typescript-eslint/parser'; +import importPlugin from 'eslint-plugin-import'; + +export default [ + { + // EN: Ignore patterns + // VI: Các pattern bỏ qua + ignores: [ + '**/node_modules/**', + '**/dist/**', + '**/build/**', + '**/.next/**', + '**/coverage/**', + '**/.turbo/**', + '**/prisma/migrations/**', + '**/_prisma_client/**', + ], + }, + { + // EN: Configuration for test files (no project requirement) + // VI: Cấu hình cho test files (không yêu cầu project) + files: ['**/*.test.ts', '**/*.spec.ts', '**/__tests__/**/*.ts'], + languageOptions: { + parser: tsparser, + parserOptions: { + ecmaVersion: 2020, + sourceType: 'module', + // EN: Don't require project for test files + // VI: Không yêu cầu project cho test files + }, + globals: { + // Node.js globals + console: 'readonly', + process: 'readonly', + Buffer: 'readonly', + __dirname: 'readonly', + __filename: 'readonly', + module: 'readonly', + require: 'readonly', + exports: 'readonly', + globalThis: 'readonly', + }, + }, + plugins: { + '@typescript-eslint': tseslint, + import: importPlugin, + }, + rules: { + // EN: Relax rules for test files + // VI: Nới lỏng rules cho test files + '@typescript-eslint/no-explicit-any': 'off', + 'import/order': [ + 'error', + { + groups: [ + 'builtin', + 'external', + 'internal', + 'parent', + 'sibling', + 'index', + ], + 'newlines-between': 'always', + alphabetize: { order: 'asc' }, + }, + ], + }, + }, + { + // EN: Base configuration for TypeScript files + // VI: Cấu hình cơ bản cho TypeScript files + files: ['**/*.ts', '**/*.tsx'], + languageOptions: { + parser: tsparser, + parserOptions: { + ecmaVersion: 2020, + sourceType: 'module', + project: './tsconfig.json', + }, + globals: { + // Node.js globals + console: 'readonly', + process: 'readonly', + Buffer: 'readonly', + __dirname: 'readonly', + __filename: 'readonly', + module: 'readonly', + require: 'readonly', + exports: 'readonly', + // ES2020 globals + globalThis: 'readonly', + }, + }, + plugins: { + '@typescript-eslint': tseslint, + import: importPlugin, + }, + rules: { + // EN: TypeScript rules + // VI: TypeScript rules + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-explicit-any': 'warn', + '@typescript-eslint/no-unused-vars': [ + 'error', + { argsIgnorePattern: '^_' }, + ], + + // EN: Import rules + // VI: Import rules + 'import/order': [ + 'error', + { + groups: [ + 'builtin', + 'external', + 'internal', + 'parent', + 'sibling', + 'index', + ], + 'newlines-between': 'always', + alphabetize: { order: 'asc' }, + }, + ], + + // EN: General rules + // VI: General rules + 'no-console': ['warn', { allow: ['warn', 'error'] }], + 'no-debugger': 'error', + 'prefer-const': 'error', + 'no-var': 'error', + }, + settings: { + 'import/resolver': { + typescript: { + alwaysTryTypes: true, + }, + }, + }, + }, +]; diff --git a/packages/config/eslint-config/package.json b/packages/config/eslint-config/package.json index fb4a0e7b..92f16969 100644 --- a/packages/config/eslint-config/package.json +++ b/packages/config/eslint-config/package.json @@ -2,7 +2,8 @@ "name": "@goodgo/eslint-config", "version": "1.0.0", "description": "Shared ESLint configuration", - "main": "index.js", + "main": "eslint.config.js", + "type": "module", "dependencies": { "@typescript-eslint/eslint-plugin": "^8.52.0", "@typescript-eslint/parser": "^8.52.0", @@ -10,4 +11,4 @@ "eslint-config-prettier": "^10.1.8", "eslint-plugin-import": "^2.32.0" } -} +} \ No newline at end of file diff --git a/packages/config/prettier-config/package.json b/packages/config/prettier-config/package.json index 41bd1024..a186455d 100644 --- a/packages/config/prettier-config/package.json +++ b/packages/config/prettier-config/package.json @@ -1,6 +1,7 @@ { "name": "@goodgo/prettier-config", "version": "1.0.0", + "type": "module", "description": "Shared Prettier configuration", "main": "index.js", "dependencies": { diff --git a/packages/config/tsconfig/package.json b/packages/config/tsconfig/package.json index e87e4cbd..fbfa016a 100644 --- a/packages/config/tsconfig/package.json +++ b/packages/config/tsconfig/package.json @@ -1,6 +1,7 @@ { "name": "@goodgo/tsconfig", "version": "1.0.0", + "type": "module", "description": "Shared TypeScript configurations", "main": "base.json", "files": ["base.json", "node.json", "nextjs.json"] diff --git a/packages/http-client/package.json b/packages/http-client/package.json index e30a851c..49fc6e24 100644 --- a/packages/http-client/package.json +++ b/packages/http-client/package.json @@ -1,6 +1,7 @@ { "name": "@goodgo/http-client", "version": "1.0.0", + "type": "module", "description": "HTTP client wrapper with Axios", "main": "./dist/index.js", "types": "./dist/index.d.ts", diff --git a/packages/logger/package.json b/packages/logger/package.json index 0af3f03b..49824076 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -1,6 +1,7 @@ { "name": "@goodgo/logger", "version": "1.0.0", + "type": "module", "description": "Centralized logging utility using Winston", "main": "./dist/index.js", "types": "./dist/index.d.ts", diff --git a/packages/tracing/package.json b/packages/tracing/package.json index f2dec790..1d5af191 100644 --- a/packages/tracing/package.json +++ b/packages/tracing/package.json @@ -1,6 +1,7 @@ { "name": "@goodgo/tracing", "version": "1.0.0", + "type": "module", "description": "OpenTelemetry tracing setup", "main": "./dist/index.js", "types": "./dist/index.d.ts", diff --git a/packages/types/package.json b/packages/types/package.json index daf95b8c..b43fce0f 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,7 @@ { "name": "@goodgo/types", "version": "1.0.0", + "type": "module", "description": "Shared TypeScript types and interfaces", "main": "./dist/index.js", "types": "./dist/index.d.ts", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f03d98bd..47889c7c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,9 @@ importers: eslint: specifier: ^9.39.2 version: 9.39.2 + eslint-scope: + specifier: ^9.0.0 + version: 9.0.0 prettier: specifier: ^3.7.4 version: 3.7.4 @@ -24,106 +27,6 @@ importers: specifier: ^5.9.3 version: 5.9.3 - apps/web-admin: - dependencies: - '@goodgo/http-client': - specifier: workspace:* - version: link:../../packages/http-client - '@goodgo/types': - specifier: workspace:* - version: link:../../packages/types - '@hookform/resolvers': - specifier: ^5.2.2 - version: 5.2.2(react-hook-form@7.70.0) - '@radix-ui/react-avatar': - specifier: ^1.1.11 - version: 1.1.11(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3) - '@radix-ui/react-dialog': - specifier: ^1.1.15 - version: 1.1.15(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3) - '@radix-ui/react-dropdown-menu': - specifier: ^2.1.16 - version: 2.1.16(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3) - '@radix-ui/react-tabs': - specifier: ^1.1.13 - version: 1.1.13(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3) - axios: - specifier: ^1.13.2 - version: 1.13.2 - class-variance-authority: - specifier: ^0.7.1 - version: 0.7.1 - clsx: - specifier: ^2.1.1 - version: 2.1.1 - lucide-react: - specifier: ^0.562.0 - version: 0.562.0(react@19.2.3) - next: - specifier: ^16.1.1 - version: 16.1.1(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3)(react@19.2.3) - next-intl: - specifier: ^4.7.0 - version: 4.7.0(next@16.1.1)(react@19.2.3)(typescript@5.9.3) - react: - specifier: ^19.2.3 - version: 19.2.3 - react-dom: - specifier: ^19.2.3 - version: 19.2.3(react@19.2.3) - react-hook-form: - specifier: ^7.70.0 - version: 7.70.0(react@19.2.3) - recharts: - specifier: ^3.6.0 - version: 3.6.0(@types/react@19.2.7)(react-dom@19.2.3)(react-is@19.2.3)(react@19.2.3)(redux@5.0.1) - zod: - specifier: ^4.3.5 - version: 4.3.5 - zustand: - specifier: ^5.0.9 - version: 5.0.9(@types/react@19.2.7)(react@19.2.3) - devDependencies: - '@goodgo/eslint-config': - specifier: workspace:* - version: link:../../packages/config/eslint-config - '@goodgo/prettier-config': - specifier: workspace:* - version: link:../../packages/config/prettier-config - '@goodgo/tsconfig': - specifier: workspace:* - version: link:../../packages/config/tsconfig - '@tailwindcss/postcss': - specifier: ^4.1.18 - version: 4.1.18 - '@types/node': - specifier: ^25.0.3 - version: 25.0.3 - '@types/react': - specifier: ^19.2.7 - version: 19.2.7 - '@types/react-dom': - specifier: ^19.2.3 - version: 19.2.3(@types/react@19.2.7) - autoprefixer: - specifier: ^10.4.23 - version: 10.4.23(postcss@8.5.6) - eslint: - specifier: ^9.39.2 - version: 9.39.2 - eslint-config-next: - specifier: ^16.1.1 - version: 16.1.1(@typescript-eslint/parser@8.52.0)(eslint@9.39.2)(typescript@5.9.3) - postcss: - specifier: ^8.5.6 - version: 8.5.6 - tailwindcss: - specifier: ^4.1.18 - version: 4.1.18 - typescript: - specifier: ^5.9.3 - version: 5.9.3 - apps/web-client: dependencies: '@goodgo/http-client': @@ -4522,33 +4425,6 @@ packages: react-dom: 19.2.3(react@19.2.3) dev: false - /@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3): - resolution: {integrity: sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.3) - '@types/react': 19.2.7 - '@types/react-dom': 19.2.3(@types/react@19.2.7) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - dev: false - /@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3): resolution: {integrity: sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==} peerDependencies: @@ -6247,27 +6123,6 @@ packages: react: 19.2.3 dev: false - /@reduxjs/toolkit@2.11.2(react-redux@9.2.0)(react@19.2.3): - resolution: {integrity: sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==} - peerDependencies: - react: ^16.9.0 || ^17.0.0 || ^18 || ^19 - react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0 - peerDependenciesMeta: - react: - optional: true - react-redux: - optional: true - dependencies: - '@standard-schema/spec': 1.1.0 - '@standard-schema/utils': 0.3.0 - immer: 11.1.3 - react: 19.2.3 - react-redux: 9.2.0(@types/react@19.2.7)(react@19.2.3)(redux@5.0.1) - redux: 5.0.1 - redux-thunk: 3.1.0(redux@5.0.1) - reselect: 5.1.1 - dev: false - /@rollup/pluginutils@5.3.0: resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} engines: {node: '>=14.0.0'} @@ -7206,48 +7061,6 @@ packages: '@types/node': 25.0.3 dev: true - /@types/d3-array@3.2.2: - resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} - dev: false - - /@types/d3-color@3.1.3: - resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} - dev: false - - /@types/d3-ease@3.0.2: - resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} - dev: false - - /@types/d3-interpolate@3.0.4: - resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} - dependencies: - '@types/d3-color': 3.1.3 - dev: false - - /@types/d3-path@3.1.1: - resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} - dev: false - - /@types/d3-scale@4.0.9: - resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} - dependencies: - '@types/d3-time': 3.0.4 - dev: false - - /@types/d3-shape@3.1.7: - resolution: {integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==} - dependencies: - '@types/d3-path': 3.1.1 - dev: false - - /@types/d3-time@3.0.4: - resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} - dev: false - - /@types/d3-timer@3.0.2: - resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} - dev: false - /@types/deep-eql@4.0.2: resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} dev: true @@ -7567,10 +7380,6 @@ packages: dev: false optional: true - /@types/use-sync-external-store@0.0.6: - resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} - dev: false - /@types/uuid@11.0.0: resolution: {integrity: sha512-HVyk8nj2m+jcFRNazzqyVKiZezyhDKrGUA3jlEcg/nZ6Ms+qHwocba1Y/AaVaznJTAM9xpdFSh+ptbNrhOGvZA==} deprecated: This is a stub types definition. uuid provides its own type definitions, so you do not need this installed. @@ -8874,77 +8683,6 @@ packages: /csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} - /d3-array@3.2.4: - resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} - engines: {node: '>=12'} - dependencies: - internmap: 2.0.3 - dev: false - - /d3-color@3.1.0: - resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} - engines: {node: '>=12'} - dev: false - - /d3-ease@3.0.1: - resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} - engines: {node: '>=12'} - dev: false - - /d3-format@3.1.0: - resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} - engines: {node: '>=12'} - dev: false - - /d3-interpolate@3.0.1: - resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} - engines: {node: '>=12'} - dependencies: - d3-color: 3.1.0 - dev: false - - /d3-path@3.1.0: - resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} - engines: {node: '>=12'} - dev: false - - /d3-scale@4.0.2: - resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} - engines: {node: '>=12'} - dependencies: - d3-array: 3.2.4 - d3-format: 3.1.0 - d3-interpolate: 3.0.1 - d3-time: 3.1.0 - d3-time-format: 4.1.0 - dev: false - - /d3-shape@3.2.0: - resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} - engines: {node: '>=12'} - dependencies: - d3-path: 3.1.0 - dev: false - - /d3-time-format@4.1.0: - resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} - engines: {node: '>=12'} - dependencies: - d3-time: 3.1.0 - dev: false - - /d3-time@3.1.0: - resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} - engines: {node: '>=12'} - dependencies: - d3-array: 3.2.4 - dev: false - - /d3-timer@3.0.1: - resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} - engines: {node: '>=12'} - dev: false - /damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} dev: true @@ -9007,10 +8745,6 @@ packages: engines: {node: '>=0.10.0'} dev: false - /decimal.js-light@2.5.1: - resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} - dev: false - /decimal.js@10.6.0: resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} dev: false @@ -9383,10 +9117,6 @@ packages: is-date-object: 1.1.0 is-symbol: 1.1.1 - /es-toolkit@1.43.0: - resolution: {integrity: sha512-SKCT8AsWvYzBBuUqMk4NPwFlSdqLpJwmy6AP322ERn8W2YLIB6JBXnwMI2Qsh2gfphT3q7EKAxKb23cvFHFwKA==} - dev: false - /esbuild@0.27.2: resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} engines: {node: '>=18'} @@ -9661,6 +9391,14 @@ packages: esrecurse: 4.3.0 estraverse: 5.3.0 + /eslint-scope@9.0.0: + resolution: {integrity: sha512-+Yh0LeQKq+mW/tQArNj67tljR3L1HajDTQPuZOEwC00oBdoIDQrr89yBgjAlzAwRrY/5zDkM3v99iGHwz9y0dw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + /eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -9770,10 +9508,6 @@ packages: engines: {node: '>= 0.6'} dev: false - /eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - dev: false - /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -10463,14 +10197,6 @@ packages: hasBin: true dev: true - /immer@10.2.0: - resolution: {integrity: sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==} - dev: false - - /immer@11.1.3: - resolution: {integrity: sha512-6jQTc5z0KJFtr1UgFpIL3N9XSC3saRaI9PwWtzM2pSqkNGtiNkYY2OSwkOGDK2XcTRcLb1pi/aNkKZz0nxVH4Q==} - dev: false - /import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} @@ -10523,11 +10249,6 @@ packages: hasown: 2.0.2 side-channel: 1.1.0 - /internmap@2.0.3: - resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} - engines: {node: '>=12'} - dev: false - /intl-messageformat@10.7.18: resolution: {integrity: sha512-m3Ofv/X/tV8Y3tHXLohcuVuhWKo7BBq62cqY15etqmLxg2DZ34AGGgQDeR+SCta2+zICb1NX83af0GJmbQ1++g==} dependencies: @@ -12875,29 +12596,6 @@ packages: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} dev: true - /react-is@19.2.3: - resolution: {integrity: sha512-qJNJfu81ByyabuG7hPFEbXqNcWSU3+eVus+KJs+0ncpGfMyYdvSmxiJxbWR65lYi1I+/0HBcliO029gc4F+PnA==} - dev: false - - /react-redux@9.2.0(@types/react@19.2.7)(react@19.2.3)(redux@5.0.1): - resolution: {integrity: sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==} - peerDependencies: - '@types/react': ^18.2.25 || ^19 - react: ^18.0 || ^19 - redux: ^5.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - redux: - optional: true - dependencies: - '@types/react': 19.2.7 - '@types/use-sync-external-store': 0.0.6 - react: 19.2.3 - redux: 5.0.1 - use-sync-external-store: 1.6.0(react@19.2.3) - dev: false - /react-remove-scroll-bar@2.3.8(@types/react@19.2.7)(react@19.2.3): resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} engines: {node: '>=10'} @@ -13011,33 +12709,6 @@ packages: tslib: 2.8.1 dev: true - /recharts@3.6.0(@types/react@19.2.7)(react-dom@19.2.3)(react-is@19.2.3)(react@19.2.3)(redux@5.0.1): - resolution: {integrity: sha512-L5bjxvQRAe26RlToBAziKUB7whaGKEwD3znoM6fz3DrTowCIC/FnJYnuq1GEzB8Zv2kdTfaxQfi5GoH0tBinyg==} - engines: {node: '>=18'} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-is: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - dependencies: - '@reduxjs/toolkit': 2.11.2(react-redux@9.2.0)(react@19.2.3) - clsx: 2.1.1 - decimal.js-light: 2.5.1 - es-toolkit: 1.43.0 - eventemitter3: 5.0.1 - immer: 10.2.0 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - react-is: 19.2.3 - react-redux: 9.2.0(@types/react@19.2.7)(react@19.2.3)(redux@5.0.1) - reselect: 5.1.1 - tiny-invariant: 1.3.3 - use-sync-external-store: 1.6.0(react@19.2.3) - victory-vendor: 37.3.6 - transitivePeerDependencies: - - '@types/react' - - redux - dev: false - /redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} @@ -13056,18 +12727,6 @@ packages: dependencies: redis-errors: 1.2.0 - /redux-thunk@3.1.0(redux@5.0.1): - resolution: {integrity: sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==} - peerDependencies: - redux: ^5.0.0 - dependencies: - redux: 5.0.1 - dev: false - - /redux@5.0.1: - resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==} - dev: false - /reflect-metadata@0.2.2: resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} dev: false @@ -13131,10 +12790,6 @@ packages: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} dev: false - /reselect@5.1.1: - resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==} - dev: false - /resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} @@ -13859,6 +13514,7 @@ packages: /tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + dev: true /tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -14430,25 +14086,6 @@ packages: engines: {node: '>= 0.8'} dev: false - /victory-vendor@37.3.6: - resolution: {integrity: sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==} - dependencies: - '@types/d3-array': 3.2.2 - '@types/d3-ease': 3.0.2 - '@types/d3-interpolate': 3.0.4 - '@types/d3-scale': 4.0.9 - '@types/d3-shape': 3.1.7 - '@types/d3-time': 3.0.4 - '@types/d3-timer': 3.0.2 - d3-array: 3.2.4 - d3-ease: 3.0.1 - d3-interpolate: 3.0.1 - d3-scale: 4.0.2 - d3-shape: 3.2.0 - d3-time: 3.1.0 - d3-timer: 3.0.1 - dev: false - /vite-plugin-storybook-nextjs@3.1.8(next@16.1.1)(storybook@10.1.11)(typescript@5.9.3)(vite@7.3.1): resolution: {integrity: sha512-RPIt5pRz2p2MAqfjsDbODKfx8Q2ao/DNf0Sczhd4Hj5NEw6/OlWZk6lVSsF56s8i40Cca8IDPB59jZ+F8WYAtg==} peerDependencies: diff --git a/services/_template/eslint.config.js b/services/_template/eslint.config.js new file mode 100644 index 00000000..eb22e384 --- /dev/null +++ b/services/_template/eslint.config.js @@ -0,0 +1,23 @@ +// EN: ESLint v9 Flat Config for Template Service +// VI: ESLint v9 Flat Config cho Template Service +import goodgoConfig from '@goodgo/eslint-config'; + +export default [ + ...goodgoConfig, + { + // EN: Service-specific overrides (exclude test files) + // VI: Override riêng cho service (loại trừ test files) + files: ['**/*.ts'], + ignores: ['**/*.test.ts', '**/*.spec.ts', '**/__tests__/**'], + languageOptions: { + parserOptions: { + tsconfigRootDir: import.meta.dirname, + project: './tsconfig.json', + }, + }, + rules: { + // EN: Add service-specific rules here + // VI: Thêm rules riêng cho service ở đây + }, + }, +]; diff --git a/services/_template/package.json b/services/_template/package.json index aaa0a9b6..52a8bf8c 100644 --- a/services/_template/package.json +++ b/services/_template/package.json @@ -1,6 +1,7 @@ { "name": "@goodgo/service-template", "version": "1.0.0", + "type": "module", "description": "Template for creating new microservices", "main": "./dist/main.js", "scripts": { @@ -63,4 +64,4 @@ "tsx": "^4.21.0", "typescript": "^5.9.3" } -} +} \ No newline at end of file diff --git a/services/iam-service/eslint.config.js b/services/iam-service/eslint.config.js new file mode 100644 index 00000000..dec926df --- /dev/null +++ b/services/iam-service/eslint.config.js @@ -0,0 +1,23 @@ +// EN: ESLint v9 Flat Config for IAM Service +// VI: ESLint v9 Flat Config cho IAM Service +import goodgoConfig from '@goodgo/eslint-config'; + +export default [ + ...goodgoConfig, + { + // EN: Service-specific overrides (exclude test files) + // VI: Override riêng cho service (loại trừ test files) + files: ['**/*.ts'], + ignores: ['**/*.test.ts', '**/*.spec.ts', '**/__tests__/**'], + languageOptions: { + parserOptions: { + tsconfigRootDir: import.meta.dirname, + project: './tsconfig.json', + }, + }, + rules: { + // EN: Add service-specific rules here + // VI: Thêm rules riêng cho service ở đây + }, + }, +]; diff --git a/services/iam-service/package.json b/services/iam-service/package.json index 0a78a268..55a69143 100644 --- a/services/iam-service/package.json +++ b/services/iam-service/package.json @@ -1,6 +1,7 @@ { "name": "@goodgo/iam-service", "version": "1.0.0", + "type": "module", "description": "Enterprise IAM (Identity and Access Management) Service", "main": "./dist/main.js", "scripts": { @@ -101,4 +102,4 @@ "qs@<6.14.1": ">=6.14.1" } } -} +} \ No newline at end of file diff --git a/services/iam-service/src/docs/swagger.ts b/services/iam-service/src/docs/swagger.ts index 5cf42bd5..bd86cdaf 100644 --- a/services/iam-service/src/docs/swagger.ts +++ b/services/iam-service/src/docs/swagger.ts @@ -1,6 +1,7 @@ import { Application } from 'express'; import swaggerJSDoc from 'swagger-jsdoc'; import swaggerUi from 'swagger-ui-express'; + import { appConfig } from '../config/app.config'; /** diff --git a/services/iam-service/src/main.ts b/services/iam-service/src/main.ts index fda75484..89d942f0 100644 --- a/services/iam-service/src/main.ts +++ b/services/iam-service/src/main.ts @@ -1,7 +1,8 @@ import { logger } from '@goodgo/logger'; -import { prisma, connectDatabase } from './config/database.config'; -import { appConfig } from './config/app.config'; + import { app } from './app'; +import { appConfig } from './config/app.config'; +import { prisma, connectDatabase } from './config/database.config'; const startServer = async () => { try { diff --git a/services/iam-service/src/middlewares/auth.middleware.ts b/services/iam-service/src/middlewares/auth.middleware.ts index 93828f1c..c1389234 100644 --- a/services/iam-service/src/middlewares/auth.middleware.ts +++ b/services/iam-service/src/middlewares/auth.middleware.ts @@ -10,7 +10,7 @@ import { getErrorMessage } from '../utils/error-utils'; * VI: Interface Request mở rộng với thông tin người dùng */ declare global { - // eslint-disable-next-line @typescript-eslint/no-namespace + namespace Express { interface Request { user?: { diff --git a/services/iam-service/src/middlewares/correlation.middleware.ts b/services/iam-service/src/middlewares/correlation.middleware.ts index 53fe4177..3182a770 100644 --- a/services/iam-service/src/middlewares/correlation.middleware.ts +++ b/services/iam-service/src/middlewares/correlation.middleware.ts @@ -15,7 +15,7 @@ export const REQUEST_ID_HEADER = 'x-request-id'; * VI: Interface Request mở rộng với correlation ID */ declare global { - // eslint-disable-next-line @typescript-eslint/no-namespace + namespace Express { interface Request { correlationId: string; diff --git a/services/iam-service/src/modules/access/access.routes.ts b/services/iam-service/src/modules/access/access.routes.ts index 1a077e88..b02e5143 100644 --- a/services/iam-service/src/modules/access/access.routes.ts +++ b/services/iam-service/src/modules/access/access.routes.ts @@ -1,9 +1,11 @@ import { Router } from 'express'; + import { authenticate } from '../../middlewares/auth.middleware'; import { requirePermission } from '../../middlewares/rbac.middleware'; + +import { accessAnalyticsController } from './analytics'; import { accessRequestController } from './request'; import { accessReviewController } from './review'; -import { accessAnalyticsController } from './analytics'; /** * EN: Create and configure Access Management routes diff --git a/services/iam-service/src/modules/access/analytics/analytics.controller.ts b/services/iam-service/src/modules/access/analytics/analytics.controller.ts index 93334cb6..d2579a82 100644 --- a/services/iam-service/src/modules/access/analytics/analytics.controller.ts +++ b/services/iam-service/src/modules/access/analytics/analytics.controller.ts @@ -1,10 +1,10 @@ import { Request, Response } from 'express'; import { z } from 'zod'; +import { getErrorMessage } from '../../../utils/error-utils'; import { DateRangeDto, RiskFiltersDto } from '../access.dto'; import { accessAnalyticsService } from './analytics.service'; -import { getErrorMessage } from '../../../utils/error-utils'; /** * EN: Access Analytics Controller diff --git a/services/iam-service/src/modules/access/request/request.controller.ts b/services/iam-service/src/modules/access/request/request.controller.ts index c4036971..4f91d10e 100644 --- a/services/iam-service/src/modules/access/request/request.controller.ts +++ b/services/iam-service/src/modules/access/request/request.controller.ts @@ -2,10 +2,10 @@ import { Request, Response } from 'express'; import { z } from 'zod'; import { NotFoundError, BadRequestError } from '../../../errors/http-error'; +import { getErrorMessage } from '../../../utils/error-utils'; import { CreateAccessRequestDto, ApproveAccessRequestDto, RejectAccessRequestDto } from '../access.dto'; import { accessRequestService } from './request.service'; -import { getErrorMessage } from '../../../utils/error-utils'; /** * EN: Access Request Controller diff --git a/services/iam-service/src/modules/access/review/review.controller.ts b/services/iam-service/src/modules/access/review/review.controller.ts index 97ef0761..099ca26c 100644 --- a/services/iam-service/src/modules/access/review/review.controller.ts +++ b/services/iam-service/src/modules/access/review/review.controller.ts @@ -2,10 +2,10 @@ import { Request, Response } from 'express'; import { z } from 'zod'; import { NotFoundError, BadRequestError } from '../../../errors/http-error'; +import { getErrorMessage } from '../../../utils/error-utils'; import { CreateAccessReviewDto, ReviewAccessItemDto } from '../access.dto'; import { accessReviewService } from './review.service'; -import { getErrorMessage } from '../../../utils/error-utils'; /** * EN: Access Review Controller diff --git a/services/iam-service/src/modules/auth/auth.controller.ts b/services/iam-service/src/modules/auth/auth.controller.ts index b99139c7..82b4d141 100644 --- a/services/iam-service/src/modules/auth/auth.controller.ts +++ b/services/iam-service/src/modules/auth/auth.controller.ts @@ -3,9 +3,10 @@ import { z } from 'zod'; // import { cookieService } from '../token/cookie.service'; +import { getErrorMessage } from '../../utils/error-utils'; + import { RegisterDto, LoginDto } from './auth.dto'; import { authService } from './auth.service'; -import { getErrorMessage } from '../../utils/error-utils'; /** diff --git a/services/iam-service/src/modules/auth/auth.routes.ts b/services/iam-service/src/modules/auth/auth.routes.ts index fdf96522..b272515a 100644 --- a/services/iam-service/src/modules/auth/auth.routes.ts +++ b/services/iam-service/src/modules/auth/auth.routes.ts @@ -1,8 +1,10 @@ import { Router } from 'express'; + import { authenticate } from '../../middlewares/auth.middleware'; +import { socialAuthController } from '../social/social.controller'; + import { authController } from './auth.controller'; import { changePasswordController } from './change-password.controller'; -import { socialAuthController } from '../social/social.controller'; /** * EN: Create and configure auth routes diff --git a/services/iam-service/src/modules/auth/change-password.controller.ts b/services/iam-service/src/modules/auth/change-password.controller.ts index 9db44978..bc5ed1f3 100644 --- a/services/iam-service/src/modules/auth/change-password.controller.ts +++ b/services/iam-service/src/modules/auth/change-password.controller.ts @@ -1,9 +1,10 @@ import { Request, Response } from 'express'; import { z } from 'zod'; +import { getErrorMessage } from '../../utils/error-utils'; + import { ChangePasswordDto } from './auth.dto'; import { changePasswordService } from './change-password.service'; -import { getErrorMessage } from '../../utils/error-utils'; /** * EN: Change Password Controller diff --git a/services/iam-service/src/modules/feature/feature.controller.ts b/services/iam-service/src/modules/feature/feature.controller.ts index d5beb458..62d30e68 100644 --- a/services/iam-service/src/modules/feature/feature.controller.ts +++ b/services/iam-service/src/modules/feature/feature.controller.ts @@ -2,9 +2,9 @@ import { ApiResponse } from '@goodgo/types'; import { Request, Response } from 'express'; import { asyncHandler } from '../../middlewares/error.middleware'; +import { getErrorMessage } from '../../utils/error-utils'; import { FeatureService } from './feature.service'; -import { getErrorMessage } from '../../utils/error-utils'; /** diff --git a/services/iam-service/src/modules/feature/feature.repository.ts b/services/iam-service/src/modules/feature/feature.repository.ts index b9497bb7..46e60bb3 100644 --- a/services/iam-service/src/modules/feature/feature.repository.ts +++ b/services/iam-service/src/modules/feature/feature.repository.ts @@ -2,8 +2,8 @@ import { logger } from '@goodgo/logger'; import { prisma } from '../../config/database.config'; import { ConflictError } from '../../errors/http-error'; -import { BaseRepository, IRepository } from '../common/repository'; import { hasCode } from '../../utils/error-utils'; +import { BaseRepository, IRepository } from '../common/repository'; // EN: Feature entity type from Prisma // VI: Feature entity type từ Prisma diff --git a/services/iam-service/src/modules/governance/compliance/compliance.controller.ts b/services/iam-service/src/modules/governance/compliance/compliance.controller.ts index 5e3ace65..4621e9fb 100644 --- a/services/iam-service/src/modules/governance/compliance/compliance.controller.ts +++ b/services/iam-service/src/modules/governance/compliance/compliance.controller.ts @@ -2,10 +2,10 @@ import { Request, Response } from 'express'; import { z } from 'zod'; import { NotFoundError, BadRequestError } from '../../../errors/http-error'; +import { getErrorMessage } from '../../../utils/error-utils'; import { GenerateComplianceReportDto, ReportFiltersDto } from '../governance.dto'; import { complianceService } from './compliance.service'; -import { getErrorMessage } from '../../../utils/error-utils'; /** * EN: Compliance Controller diff --git a/services/iam-service/src/modules/governance/governance.routes.ts b/services/iam-service/src/modules/governance/governance.routes.ts index 3111955b..12026b49 100644 --- a/services/iam-service/src/modules/governance/governance.routes.ts +++ b/services/iam-service/src/modules/governance/governance.routes.ts @@ -1,10 +1,12 @@ import { Router } from 'express'; + import { authenticate } from '../../middlewares/auth.middleware'; import { requirePermission } from '../../middlewares/rbac.middleware'; + import { complianceController } from './compliance'; import { policyGovernanceController } from './policy'; -import { riskController } from './risk'; import { reportingController } from './reporting'; +import { riskController } from './risk'; /** * EN: Create and configure Governance routes diff --git a/services/iam-service/src/modules/governance/policy/policy-governance.controller.ts b/services/iam-service/src/modules/governance/policy/policy-governance.controller.ts index c0eda0f4..a029a8bb 100644 --- a/services/iam-service/src/modules/governance/policy/policy-governance.controller.ts +++ b/services/iam-service/src/modules/governance/policy/policy-governance.controller.ts @@ -2,10 +2,10 @@ import { Request, Response } from 'express'; import { z } from 'zod'; import { NotFoundError } from '../../../errors/http-error'; +import { getErrorMessage } from '../../../utils/error-utils'; import { CreatePolicyTemplateDto, TestPolicyDto } from '../governance.dto'; import { policyGovernanceService } from './policy-governance.service'; -import { getErrorMessage } from '../../../utils/error-utils'; /** * EN: Policy Governance Controller diff --git a/services/iam-service/src/modules/governance/reporting/reporting.controller.ts b/services/iam-service/src/modules/governance/reporting/reporting.controller.ts index e2d88280..38152b75 100644 --- a/services/iam-service/src/modules/governance/reporting/reporting.controller.ts +++ b/services/iam-service/src/modules/governance/reporting/reporting.controller.ts @@ -1,10 +1,10 @@ import { Request, Response } from 'express'; import { z } from 'zod'; +import { getErrorMessage } from '../../../utils/error-utils'; import { AccessSummaryFiltersDto, UserActivityFiltersDto, SecurityEventsFiltersDto } from '../governance.dto'; import { reportingService } from './reporting.service'; -import { getErrorMessage } from '../../../utils/error-utils'; /** * EN: Reporting Controller diff --git a/services/iam-service/src/modules/governance/risk/risk.controller.ts b/services/iam-service/src/modules/governance/risk/risk.controller.ts index ccc61401..b32cdf0e 100644 --- a/services/iam-service/src/modules/governance/risk/risk.controller.ts +++ b/services/iam-service/src/modules/governance/risk/risk.controller.ts @@ -3,10 +3,10 @@ import { z } from 'zod'; import { getPrismaClient } from '../../../config/database.config'; import { NotFoundError } from '../../../errors/http-error'; +import { getErrorMessage } from '../../../utils/error-utils'; import { CalculateRiskScoreDto, RiskFiltersDto } from '../governance.dto'; import { riskService } from './risk.service'; -import { getErrorMessage } from '../../../utils/error-utils'; /** * EN: Risk Management Controller diff --git a/services/iam-service/src/modules/identity/group/group.controller.ts b/services/iam-service/src/modules/identity/group/group.controller.ts index d1dd1072..c33ff272 100644 --- a/services/iam-service/src/modules/identity/group/group.controller.ts +++ b/services/iam-service/src/modules/identity/group/group.controller.ts @@ -2,10 +2,10 @@ import { Request, Response } from 'express'; import { z } from 'zod'; import { NotFoundError, ConflictError } from '../../../errors/http-error'; +import { getErrorMessage } from '../../../utils/error-utils'; import { CreateGroupDto, UpdateGroupDto, AddGroupMemberDto } from '../identity.dto'; import { groupService } from './group.service'; -import { getErrorMessage } from '../../../utils/error-utils'; /** * EN: Group Controller diff --git a/services/iam-service/src/modules/identity/identity.routes.ts b/services/iam-service/src/modules/identity/identity.routes.ts index 0ca60dc4..71900680 100644 --- a/services/iam-service/src/modules/identity/identity.routes.ts +++ b/services/iam-service/src/modules/identity/identity.routes.ts @@ -1,11 +1,13 @@ import { Router } from 'express'; + import { authenticate } from '../../middlewares/auth.middleware'; import { requirePermission } from '../../middlewares/rbac.middleware'; -import { userManagementController } from './user'; -import { profileController } from './profile'; -import { verificationController } from './verification'; -import { organizationController } from './organization'; + import { groupController } from './group'; +import { organizationController } from './organization'; +import { profileController } from './profile'; +import { userManagementController } from './user'; +import { verificationController } from './verification'; /** * EN: Create and configure Identity routes diff --git a/services/iam-service/src/modules/identity/organization/organization.controller.ts b/services/iam-service/src/modules/identity/organization/organization.controller.ts index a763c466..4798d4ac 100644 --- a/services/iam-service/src/modules/identity/organization/organization.controller.ts +++ b/services/iam-service/src/modules/identity/organization/organization.controller.ts @@ -2,10 +2,10 @@ import { Request, Response } from 'express'; import { z } from 'zod'; import { NotFoundError, ConflictError } from '../../../errors/http-error'; +import { getErrorMessage } from '../../../utils/error-utils'; import { CreateOrganizationDto, UpdateOrganizationDto } from '../identity.dto'; import { organizationService } from './organization.service'; -import { getErrorMessage } from '../../../utils/error-utils'; /** * EN: Organization Controller diff --git a/services/iam-service/src/modules/identity/profile/profile.controller.ts b/services/iam-service/src/modules/identity/profile/profile.controller.ts index ff240594..336820bc 100644 --- a/services/iam-service/src/modules/identity/profile/profile.controller.ts +++ b/services/iam-service/src/modules/identity/profile/profile.controller.ts @@ -2,10 +2,10 @@ import { Request, Response } from 'express'; import { z } from 'zod'; import { NotFoundError } from '../../../errors/http-error'; +import { getErrorMessage } from '../../../utils/error-utils'; import { UpdateUserProfileDto } from '../identity.dto'; import { profileService } from './profile.service'; -import { getErrorMessage } from '../../../utils/error-utils'; /** * EN: Profile Management Controller diff --git a/services/iam-service/src/modules/identity/user/user.controller.ts b/services/iam-service/src/modules/identity/user/user.controller.ts index 021caf09..7cda60d1 100644 --- a/services/iam-service/src/modules/identity/user/user.controller.ts +++ b/services/iam-service/src/modules/identity/user/user.controller.ts @@ -2,10 +2,10 @@ import { Request, Response } from 'express'; import { z } from 'zod'; import { NotFoundError } from '../../../errors/http-error'; +import { getErrorMessage } from '../../../utils/error-utils'; import { UpdateUserDto, UserFiltersDto, BulkImportUsersDto } from '../identity.dto'; import { userManagementService } from './user.service'; -import { getErrorMessage } from '../../../utils/error-utils'; /** * EN: User Management Controller diff --git a/services/iam-service/src/modules/identity/user/user.service.ts b/services/iam-service/src/modules/identity/user/user.service.ts index 1241ff32..86f0af69 100644 --- a/services/iam-service/src/modules/identity/user/user.service.ts +++ b/services/iam-service/src/modules/identity/user/user.service.ts @@ -7,8 +7,8 @@ import { auditService } from '../../../core/events/audit.service'; import { NotFoundError, ConflictError } from '../../../errors/http-error'; import { UserProfileRepository } from '../../../repositories/user-profile.repository'; import { UserRepository } from '../../../repositories/user.repository'; -import { UpdateUserDto, UserFiltersDto, BulkImportUsersDto } from '../identity.dto'; import { getErrorMessage } from '../../../utils/error-utils'; +import { UpdateUserDto, UserFiltersDto, BulkImportUsersDto } from '../identity.dto'; /** * EN: User Management Service for user lifecycle operations diff --git a/services/iam-service/src/modules/identity/verification/verification.controller.ts b/services/iam-service/src/modules/identity/verification/verification.controller.ts index 9004e960..13205025 100644 --- a/services/iam-service/src/modules/identity/verification/verification.controller.ts +++ b/services/iam-service/src/modules/identity/verification/verification.controller.ts @@ -2,10 +2,10 @@ import { Request, Response } from 'express'; import { z } from 'zod'; import { BadRequestError, NotFoundError } from '../../../errors/http-error'; +import { getErrorMessage } from '../../../utils/error-utils'; import { VerifyEmailDto, VerifyPhoneDto } from '../identity.dto'; import { verificationService } from './verification.service'; -import { getErrorMessage } from '../../../utils/error-utils'; /** * EN: Identity Verification Controller diff --git a/services/iam-service/src/modules/mfa/mfa.controller.ts b/services/iam-service/src/modules/mfa/mfa.controller.ts index 4c2d6a78..185a097c 100644 --- a/services/iam-service/src/modules/mfa/mfa.controller.ts +++ b/services/iam-service/src/modules/mfa/mfa.controller.ts @@ -1,9 +1,10 @@ import { Request, Response } from 'express'; import { z } from 'zod'; -import { mfaService } from './mfa.service'; import { getErrorMessage } from '../../utils/error-utils'; +import { mfaService } from './mfa.service'; + const VerifyTOTPDto = z.object({ token: z.string().length(6), }); diff --git a/services/iam-service/src/modules/mfa/mfa.routes.ts b/services/iam-service/src/modules/mfa/mfa.routes.ts index 5bd7c803..ef93234f 100644 --- a/services/iam-service/src/modules/mfa/mfa.routes.ts +++ b/services/iam-service/src/modules/mfa/mfa.routes.ts @@ -1,5 +1,7 @@ import { Router } from 'express'; + import { authenticate } from '../../middlewares/auth.middleware'; + import { mfaController } from './mfa.controller'; /** diff --git a/services/iam-service/src/modules/oidc/oidc.controller.ts b/services/iam-service/src/modules/oidc/oidc.controller.ts index 372bd678..e1fab86b 100644 --- a/services/iam-service/src/modules/oidc/oidc.controller.ts +++ b/services/iam-service/src/modules/oidc/oidc.controller.ts @@ -1,9 +1,10 @@ import { logger } from '@goodgo/logger'; import { Request, Response } from 'express'; -import { oidcProviderService } from './oidc-provider.service'; import { getErrorMessage } from '../../utils/error-utils'; +import { oidcProviderService } from './oidc-provider.service'; + /** * EN: OIDC Controller * VI: Controller OIDC diff --git a/services/iam-service/src/modules/oidc/oidc.routes.ts b/services/iam-service/src/modules/oidc/oidc.routes.ts index 1c144bb8..07686120 100644 --- a/services/iam-service/src/modules/oidc/oidc.routes.ts +++ b/services/iam-service/src/modules/oidc/oidc.routes.ts @@ -1,5 +1,7 @@ import { Router } from 'express'; + import { authenticate } from '../../middlewares/auth.middleware'; + import { oidcController } from './oidc.controller'; /** diff --git a/services/iam-service/src/modules/rbac/rbac.controller.ts b/services/iam-service/src/modules/rbac/rbac.controller.ts index 8ef00bd9..d6632cee 100644 --- a/services/iam-service/src/modules/rbac/rbac.controller.ts +++ b/services/iam-service/src/modules/rbac/rbac.controller.ts @@ -1,9 +1,10 @@ import { Request, Response } from 'express'; import { z } from 'zod'; -import { rbacService } from './rbac.service'; import { getErrorMessage } from '../../utils/error-utils'; +import { rbacService } from './rbac.service'; + const AssignRoleDto = z.object({ userId: z.string(), roleId: z.string(), diff --git a/services/iam-service/src/modules/rbac/rbac.routes.ts b/services/iam-service/src/modules/rbac/rbac.routes.ts index 5bde421b..9c3f6fe3 100644 --- a/services/iam-service/src/modules/rbac/rbac.routes.ts +++ b/services/iam-service/src/modules/rbac/rbac.routes.ts @@ -1,6 +1,8 @@ import { Router } from 'express'; + import { authenticate } from '../../middlewares/auth.middleware'; import { requirePermission } from '../../middlewares/rbac.middleware'; + import { rbacController } from './rbac.controller'; /** diff --git a/services/iam-service/src/modules/session/session.routes.ts b/services/iam-service/src/modules/session/session.routes.ts index fbf74e8d..6cc1283d 100644 --- a/services/iam-service/src/modules/session/session.routes.ts +++ b/services/iam-service/src/modules/session/session.routes.ts @@ -1,5 +1,7 @@ import { Router } from 'express'; + import { authenticate } from '../../middlewares/auth.middleware'; + import { sessionsController } from './sessions.controller'; /** diff --git a/services/iam-service/src/modules/session/sessions.controller.ts b/services/iam-service/src/modules/session/sessions.controller.ts index 1bbc3b63..bc4b1325 100644 --- a/services/iam-service/src/modules/session/sessions.controller.ts +++ b/services/iam-service/src/modules/session/sessions.controller.ts @@ -1,8 +1,9 @@ import { Request, Response } from 'express'; -import { sessionService } from './session.service'; import { getErrorMessage } from '../../utils/error-utils'; +import { sessionService } from './session.service'; + /** * EN: Sessions Controller * VI: Controller sessions diff --git a/services/iam-service/src/modules/social/social.controller.ts b/services/iam-service/src/modules/social/social.controller.ts index 03ee47ac..b7b6b077 100644 --- a/services/iam-service/src/modules/social/social.controller.ts +++ b/services/iam-service/src/modules/social/social.controller.ts @@ -2,13 +2,13 @@ import { logger } from '@goodgo/logger'; import { Request, Response } from 'express'; import { auditService } from '../../core/events/audit.service'; +import { getErrorMessage } from '../../utils/error-utils'; import { rbacService } from '../rbac/rbac.service'; import { sessionService } from '../session/session.service'; import { cookieService } from '../token/cookie.service'; import { jwtService } from '../token/jwt.service'; import { socialAuthService } from './social.service'; -import { getErrorMessage } from '../../utils/error-utils'; /** * EN: Social Auth Controller diff --git a/services/iam-service/src/routes/index.ts b/services/iam-service/src/routes/index.ts index fb33a0e5..6212dfdd 100644 --- a/services/iam-service/src/routes/index.ts +++ b/services/iam-service/src/routes/index.ts @@ -1,12 +1,13 @@ import { Router } from 'express'; -import { createAuthRouter } from '../modules/auth/auth.routes'; -import { createIdentityRouter } from '../modules/identity/identity.routes'; + import { createAccessRouter } from '../modules/access/access.routes'; +import { createAuthRouter } from '../modules/auth/auth.routes'; import { createGovernanceRouter } from '../modules/governance/governance.routes'; -import { createSessionRouter } from '../modules/session/session.routes'; +import { createIdentityRouter } from '../modules/identity/identity.routes'; +import { createMfaRouter } from '../modules/mfa/mfa.routes'; import { createOidcRouter } from '../modules/oidc/oidc.routes'; import { createRbacRouter } from '../modules/rbac/rbac.routes'; -import { createMfaRouter } from '../modules/mfa/mfa.routes'; +import { createSessionRouter } from '../modules/session/session.routes'; /** * EN: Create and configure main application router