yegara 1.0.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 (211) hide show
  1. package/dist/db/index.d.ts +1 -0
  2. package/dist/db/index.js +18 -0
  3. package/dist/db/index.js.map +1 -0
  4. package/dist/db/typeorm/audit.entity.d.ts +5 -0
  5. package/dist/db/typeorm/audit.entity.js +32 -0
  6. package/dist/db/typeorm/audit.entity.js.map +1 -0
  7. package/dist/db/typeorm/index.d.ts +3 -0
  8. package/dist/db/typeorm/index.js +20 -0
  9. package/dist/db/typeorm/index.js.map +1 -0
  10. package/dist/db/typeorm/typeorm.config.d.ts +5 -0
  11. package/dist/db/typeorm/typeorm.config.js +27 -0
  12. package/dist/db/typeorm/typeorm.config.js.map +1 -0
  13. package/dist/db/typeorm/typeorm.service.d.ts +8 -0
  14. package/dist/db/typeorm/typeorm.service.js +30 -0
  15. package/dist/db/typeorm/typeorm.service.js.map +1 -0
  16. package/dist/dtos/index.d.ts +1 -0
  17. package/dist/dtos/index.js +18 -0
  18. package/dist/dtos/index.js.map +1 -0
  19. package/dist/dtos/language.dto.d.ts +4 -0
  20. package/dist/dtos/language.dto.js +36 -0
  21. package/dist/dtos/language.dto.js.map +1 -0
  22. package/dist/generics/controllers/extra-crud.controller.d.ts +28 -0
  23. package/dist/generics/controllers/extra-crud.controller.js +86 -0
  24. package/dist/generics/controllers/extra-crud.controller.js.map +1 -0
  25. package/dist/generics/controllers/index.d.ts +2 -0
  26. package/dist/generics/controllers/index.js +19 -0
  27. package/dist/generics/controllers/index.js.map +1 -0
  28. package/dist/generics/controllers/relation-crud.controller.d.ts +23 -0
  29. package/dist/generics/controllers/relation-crud.controller.js +69 -0
  30. package/dist/generics/controllers/relation-crud.controller.js.map +1 -0
  31. package/dist/generics/controllers/schema-crud.controller.d.ts +28 -0
  32. package/dist/generics/controllers/schema-crud.controller.js +85 -0
  33. package/dist/generics/controllers/schema-crud.controller.js.map +1 -0
  34. package/dist/generics/drizzle/controllers/extra-crud.controller.d.ts +28 -0
  35. package/dist/generics/drizzle/controllers/extra-crud.controller.js +86 -0
  36. package/dist/generics/drizzle/controllers/extra-crud.controller.js.map +1 -0
  37. package/dist/generics/drizzle/controllers/index.d.ts +2 -0
  38. package/dist/generics/drizzle/controllers/index.js +19 -0
  39. package/dist/generics/drizzle/controllers/index.js.map +1 -0
  40. package/dist/generics/drizzle/controllers/relation-crud.controller.d.ts +23 -0
  41. package/dist/generics/drizzle/controllers/relation-crud.controller.js +69 -0
  42. package/dist/generics/drizzle/controllers/relation-crud.controller.js.map +1 -0
  43. package/dist/generics/drizzle/controllers/schema-crud.controller.d.ts +28 -0
  44. package/dist/generics/drizzle/controllers/schema-crud.controller.js +85 -0
  45. package/dist/generics/drizzle/controllers/schema-crud.controller.js.map +1 -0
  46. package/dist/generics/drizzle/index.d.ts +2 -0
  47. package/dist/generics/drizzle/index.js +19 -0
  48. package/dist/generics/drizzle/index.js.map +1 -0
  49. package/dist/generics/drizzle/services/extra-crud.service.d.ts +22 -0
  50. package/dist/generics/drizzle/services/extra-crud.service.js +51 -0
  51. package/dist/generics/drizzle/services/extra-crud.service.js.map +1 -0
  52. package/dist/generics/drizzle/services/index.d.ts +2 -0
  53. package/dist/generics/drizzle/services/index.js +19 -0
  54. package/dist/generics/drizzle/services/index.js.map +1 -0
  55. package/dist/generics/drizzle/services/relation-crud.service.d.ts +28 -0
  56. package/dist/generics/drizzle/services/relation-crud.service.js +90 -0
  57. package/dist/generics/drizzle/services/relation-crud.service.js.map +1 -0
  58. package/dist/generics/drizzle/services/schema-crud.service.d.ts +21 -0
  59. package/dist/generics/drizzle/services/schema-crud.service.js +48 -0
  60. package/dist/generics/drizzle/services/schema-crud.service.js.map +1 -0
  61. package/dist/generics/dtos/index.d.ts +1 -0
  62. package/dist/generics/dtos/index.js +18 -0
  63. package/dist/generics/dtos/index.js.map +1 -0
  64. package/dist/generics/dtos/relation-crud.dto.d.ts +8 -0
  65. package/dist/generics/dtos/relation-crud.dto.js +43 -0
  66. package/dist/generics/dtos/relation-crud.dto.js.map +1 -0
  67. package/dist/generics/exceptions/global-filter-exceptions.d.ts +5 -0
  68. package/dist/generics/exceptions/global-filter-exceptions.js +44 -0
  69. package/dist/generics/exceptions/global-filter-exceptions.js.map +1 -0
  70. package/dist/generics/exceptions/index.d.ts +1 -0
  71. package/dist/generics/exceptions/index.js +18 -0
  72. package/dist/generics/exceptions/index.js.map +1 -0
  73. package/dist/generics/index.d.ts +5 -0
  74. package/dist/generics/index.js +22 -0
  75. package/dist/generics/index.js.map +1 -0
  76. package/dist/generics/schemas/audit.schema.d.ts +5 -0
  77. package/dist/generics/schemas/audit.schema.js +10 -0
  78. package/dist/generics/schemas/audit.schema.js.map +1 -0
  79. package/dist/generics/schemas/index.d.ts +1 -0
  80. package/dist/generics/schemas/index.js +18 -0
  81. package/dist/generics/schemas/index.js.map +1 -0
  82. package/dist/generics/services/extra-crud.service.d.ts +22 -0
  83. package/dist/generics/services/extra-crud.service.js +51 -0
  84. package/dist/generics/services/extra-crud.service.js.map +1 -0
  85. package/dist/generics/services/index.d.ts +2 -0
  86. package/dist/generics/services/index.js +19 -0
  87. package/dist/generics/services/index.js.map +1 -0
  88. package/dist/generics/services/relation-crud.service.d.ts +28 -0
  89. package/dist/generics/services/relation-crud.service.js +90 -0
  90. package/dist/generics/services/relation-crud.service.js.map +1 -0
  91. package/dist/generics/services/schema-crud.service.d.ts +21 -0
  92. package/dist/generics/services/schema-crud.service.js +48 -0
  93. package/dist/generics/services/schema-crud.service.js.map +1 -0
  94. package/dist/generics/typeorm/controllers/entity-crud.controller.d.ts +22 -0
  95. package/dist/generics/typeorm/controllers/entity-crud.controller.js +85 -0
  96. package/dist/generics/typeorm/controllers/entity-crud.controller.js.map +1 -0
  97. package/dist/generics/typeorm/controllers/extra-crud.controller.d.ts +22 -0
  98. package/dist/generics/typeorm/controllers/extra-crud.controller.js +86 -0
  99. package/dist/generics/typeorm/controllers/extra-crud.controller.js.map +1 -0
  100. package/dist/generics/typeorm/controllers/index.d.ts +3 -0
  101. package/dist/generics/typeorm/controllers/index.js +20 -0
  102. package/dist/generics/typeorm/controllers/index.js.map +1 -0
  103. package/dist/generics/typeorm/controllers/relation-crud.controller.d.ts +23 -0
  104. package/dist/generics/typeorm/controllers/relation-crud.controller.js +74 -0
  105. package/dist/generics/typeorm/controllers/relation-crud.controller.js.map +1 -0
  106. package/dist/generics/typeorm/index.d.ts +2 -0
  107. package/dist/generics/typeorm/index.js +19 -0
  108. package/dist/generics/typeorm/index.js.map +1 -0
  109. package/dist/generics/typeorm/services/entity-crud.service.d.ts +13 -0
  110. package/dist/generics/typeorm/services/entity-crud.service.js +50 -0
  111. package/dist/generics/typeorm/services/entity-crud.service.js.map +1 -0
  112. package/dist/generics/typeorm/services/extra-crud.service.d.ts +14 -0
  113. package/dist/generics/typeorm/services/extra-crud.service.js +55 -0
  114. package/dist/generics/typeorm/services/extra-crud.service.js.map +1 -0
  115. package/dist/generics/typeorm/services/index.d.ts +3 -0
  116. package/dist/generics/typeorm/services/index.js +20 -0
  117. package/dist/generics/typeorm/services/index.js.map +1 -0
  118. package/dist/generics/typeorm/services/relation-crud.service.d.ts +26 -0
  119. package/dist/generics/typeorm/services/relation-crud.service.js +98 -0
  120. package/dist/generics/typeorm/services/relation-crud.service.js.map +1 -0
  121. package/dist/index.d.ts +4 -0
  122. package/dist/index.js +21 -0
  123. package/dist/index.js.map +1 -0
  124. package/dist/modules/auth/auth.module.d.ts +2 -0
  125. package/dist/modules/auth/auth.module.js +48 -0
  126. package/dist/modules/auth/auth.module.js.map +1 -0
  127. package/dist/modules/auth/decorators/current-user.decorator.d.ts +1 -0
  128. package/dist/modules/auth/decorators/current-user.decorator.js +9 -0
  129. package/dist/modules/auth/decorators/current-user.decorator.js.map +1 -0
  130. package/dist/modules/auth/decorators/index.d.ts +2 -0
  131. package/dist/modules/auth/decorators/index.js +19 -0
  132. package/dist/modules/auth/decorators/index.js.map +1 -0
  133. package/dist/modules/auth/decorators/public.decorator.d.ts +2 -0
  134. package/dist/modules/auth/decorators/public.decorator.js +8 -0
  135. package/dist/modules/auth/decorators/public.decorator.js.map +1 -0
  136. package/dist/modules/auth/dtos/index.d.ts +0 -0
  137. package/dist/modules/auth/dtos/index.js +1 -0
  138. package/dist/modules/auth/dtos/index.js.map +1 -0
  139. package/dist/modules/auth/guards/index.d.ts +1 -0
  140. package/dist/modules/auth/guards/index.js +18 -0
  141. package/dist/modules/auth/guards/index.js.map +1 -0
  142. package/dist/modules/auth/guards/jwt.guard.d.ts +11 -0
  143. package/dist/modules/auth/guards/jwt.guard.js +51 -0
  144. package/dist/modules/auth/guards/jwt.guard.js.map +1 -0
  145. package/dist/modules/auth/index.d.ts +4 -0
  146. package/dist/modules/auth/index.js +21 -0
  147. package/dist/modules/auth/index.js.map +1 -0
  148. package/dist/modules/auth/services/auth.helper.d.ts +13 -0
  149. package/dist/modules/auth/services/auth.helper.js +137 -0
  150. package/dist/modules/auth/services/auth.helper.js.map +1 -0
  151. package/dist/modules/auth/services/index.d.ts +2 -0
  152. package/dist/modules/auth/services/index.js +19 -0
  153. package/dist/modules/auth/services/index.js.map +1 -0
  154. package/dist/modules/auth/services/jwt-strategy.service.d.ts +7 -0
  155. package/dist/modules/auth/services/jwt-strategy.service.js +33 -0
  156. package/dist/modules/auth/services/jwt-strategy.service.js.map +1 -0
  157. package/dist/modules/index.d.ts +1 -0
  158. package/dist/modules/index.js +18 -0
  159. package/dist/modules/index.js.map +1 -0
  160. package/dist/tsconfig.tsbuildinfo +1 -0
  161. package/dist/yegara.module.d.ts +2 -0
  162. package/dist/yegara.module.js +24 -0
  163. package/dist/yegara.module.js.map +1 -0
  164. package/package.json +59 -0
  165. package/src/db/index.ts +1 -0
  166. package/src/db/typeorm/audit.entity.ts +13 -0
  167. package/src/db/typeorm/index.ts +3 -0
  168. package/src/db/typeorm/typeorm.config.ts +29 -0
  169. package/src/db/typeorm/typeorm.service.ts +18 -0
  170. package/src/dtos/index.ts +1 -0
  171. package/src/dtos/language.dto.ts +20 -0
  172. package/src/generics/drizzle/controllers/extra-crud.controller.ts +62 -0
  173. package/src/generics/drizzle/controllers/index.ts +2 -0
  174. package/src/generics/drizzle/controllers/relation-crud.controller.ts +39 -0
  175. package/src/generics/drizzle/controllers/schema-crud.controller.ts +60 -0
  176. package/src/generics/drizzle/index.ts +2 -0
  177. package/src/generics/drizzle/services/extra-crud.service.ts +44 -0
  178. package/src/generics/drizzle/services/index.ts +2 -0
  179. package/src/generics/drizzle/services/relation-crud.service.ts +97 -0
  180. package/src/generics/drizzle/services/schema-crud.service.ts +39 -0
  181. package/src/generics/dtos/index.ts +1 -0
  182. package/src/generics/dtos/relation-crud.dto.ts +24 -0
  183. package/src/generics/exceptions/global-filter-exceptions.ts +42 -0
  184. package/src/generics/exceptions/index.ts +1 -0
  185. package/src/generics/index.ts +5 -0
  186. package/src/generics/schemas/audit.schema.ts +7 -0
  187. package/src/generics/schemas/index.ts +1 -0
  188. package/src/generics/typeorm/controllers/entity-crud.controller.ts +60 -0
  189. package/src/generics/typeorm/controllers/extra-crud.controller.ts +62 -0
  190. package/src/generics/typeorm/controllers/index.ts +3 -0
  191. package/src/generics/typeorm/controllers/relation-crud.controller.ts +46 -0
  192. package/src/generics/typeorm/index.ts +2 -0
  193. package/src/generics/typeorm/services/entity-crud.service.ts +39 -0
  194. package/src/generics/typeorm/services/extra-crud.service.ts +45 -0
  195. package/src/generics/typeorm/services/index.ts +3 -0
  196. package/src/generics/typeorm/services/relation-crud.service.ts +90 -0
  197. package/src/index.ts +4 -0
  198. package/src/modules/auth/auth.module.ts +35 -0
  199. package/src/modules/auth/decorators/current-user.decorator.ts +8 -0
  200. package/src/modules/auth/decorators/index.ts +2 -0
  201. package/src/modules/auth/decorators/public.decorator.ts +4 -0
  202. package/src/modules/auth/dtos/index.ts +0 -0
  203. package/src/modules/auth/guards/index.ts +1 -0
  204. package/src/modules/auth/guards/jwt.guard.ts +45 -0
  205. package/src/modules/auth/index.ts +4 -0
  206. package/src/modules/auth/services/auth.helper.ts +146 -0
  207. package/src/modules/auth/services/index.ts +2 -0
  208. package/src/modules/auth/services/jwt-strategy.service.ts +18 -0
  209. package/src/modules/index.ts +1 -0
  210. package/src/yegara.module.ts +11 -0
  211. package/tsconfig.json +25 -0
@@ -0,0 +1,2 @@
1
+ export declare class YegaraModule {
2
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.YegaraModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const auth_module_1 = require("./modules/auth/auth.module");
12
+ let YegaraModule = class YegaraModule {
13
+ };
14
+ exports.YegaraModule = YegaraModule;
15
+ exports.YegaraModule = YegaraModule = __decorate([
16
+ (0, common_1.Module)({
17
+ imports: [
18
+ auth_module_1.AuthModule
19
+ ],
20
+ providers: [],
21
+ exports: [],
22
+ })
23
+ ], YegaraModule);
24
+ //# sourceMappingURL=yegara.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yegara.module.js","sourceRoot":"","sources":["../src/yegara.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,4DAAwD;AASjD,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,oCAAY;uBAAZ,YAAY;IAPxB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,wBAAU;SACX;QACD,SAAS,EAAE,EAAE;QACb,OAAO,EAAE,EAAE;KACZ,CAAC;GACW,YAAY,CAAG"}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "yegara",
3
+ "version": "1.0.0",
4
+ "description": "",
5
+ "main": "./src/index.ts",
6
+ "exports": {
7
+ ".": "./dist/index.js"
8
+ },
9
+ "types": "dist/index.d.ts",
10
+ "scripts": {
11
+ "build": "nest build"
12
+ },
13
+ "keywords": [],
14
+ "author": "",
15
+ "license": "ISC",
16
+ "dependencies": {
17
+ "-": "^0.0.1",
18
+ "@nestjs/common": "^10.0.0",
19
+ "@nestjs/core": "^10.0.0",
20
+ "@nestjs/jwt": "10.2.0",
21
+ "@nestjs/passport": "^10.0.3",
22
+ "@nestjs/platform-express": "^10.0.0",
23
+ "@nestjs/swagger": "^8.1.0",
24
+ "@types/passport-jwt": "^4.0.1",
25
+ "class-transformer": "^0.5.1",
26
+ "class-validator": "^0.14.1",
27
+ "drizzle-orm": "^0.36.4",
28
+ "express": "^4.21.2",
29
+ "passport-jwt": "^4.0.1",
30
+ "reflect-metadata": "^0.2.0",
31
+ "rxjs": "^7.8.1",
32
+ "typeorm": "^0.3.20",
33
+ "typeorm-extension": "^3.6.3"
34
+ },
35
+ "devDependencies": {
36
+ "@nestjs/cli": "^10.4.9",
37
+ "@nestjs/schematics": "^10.0.0",
38
+ "@nestjs/testing": "^10.0.0",
39
+ "@nestjs/typeorm": "^10.0.2",
40
+ "@types/express": "^5.0.0",
41
+ "@types/jest": "^29.5.2",
42
+ "@types/node": "^20.3.1",
43
+ "@types/supertest": "^6.0.0",
44
+ "@typescript-eslint/eslint-plugin": "^8.0.0",
45
+ "@typescript-eslint/parser": "^8.0.0",
46
+ "eslint": "^8.0.0",
47
+ "eslint-config-prettier": "^9.0.0",
48
+ "eslint-plugin-prettier": "^5.0.0",
49
+ "jest": "^29.5.0",
50
+ "prettier": "^3.0.0",
51
+ "source-map-support": "^0.5.21",
52
+ "supertest": "^7.0.0",
53
+ "ts-jest": "^29.1.0",
54
+ "ts-loader": "^9.4.3",
55
+ "ts-node": "^10.9.1",
56
+ "tsconfig-paths": "^4.2.0",
57
+ "typescript": "^5.1.3"
58
+ }
59
+ }
@@ -0,0 +1 @@
1
+ export * from'./typeorm'
@@ -0,0 +1,13 @@
1
+ import { CreateDateColumn, UpdateDateColumn, DeleteDateColumn, Entity } from "typeorm";
2
+
3
+ @Entity()
4
+ export class Audit {
5
+ @CreateDateColumn({ type: "timestamp", default: () => "CURRENT_TIMESTAMP" })
6
+ createdAt: Date;
7
+
8
+ @UpdateDateColumn({ type: "timestamp", nullable: true })
9
+ updatedAt: Date;
10
+
11
+ @DeleteDateColumn({ type: "timestamp", nullable: true })
12
+ deletedAt: Date;
13
+ }
@@ -0,0 +1,3 @@
1
+ export * from './typeorm.config'
2
+ export * from './typeorm.service'
3
+ export * from './audit.entity'
@@ -0,0 +1,29 @@
1
+ import * as dotenv from 'dotenv'
2
+ import { DataSource, DataSourceOptions } from 'typeorm';
3
+ import { SeederOptions } from 'typeorm-extension';
4
+ dotenv.config({ path: '.env' });
5
+
6
+
7
+ const pathPrefix = '';
8
+
9
+ export const typeormConfig = {
10
+ type: 'postgres',
11
+ host: process.env.DATABASE_HOST,
12
+ port: Number(process.env.DATABASE_PORT),
13
+ database: process.env.DATABASE_NAME,
14
+ username: process.env.DATABASE_USER,
15
+ password: process.env.DATABASE_PASSWORD,
16
+ entities: [`${pathPrefix}dist/**/*.entity.{ts,js}`],
17
+ migrations: [`${pathPrefix}dist/migrations/*.{ts,js}`],
18
+ migrationsRun: true,
19
+ seeds: [`${pathPrefix}dist/modules/seeders/**.seeder.{ts,js}`],
20
+ migrationsTableName: 'typeorm_migrations',
21
+ logger: 'advanced-console',
22
+ logging: 'all',
23
+ synchronize: false,
24
+ autoLoadEntities: true,
25
+ } as DataSourceOptions & SeederOptions;
26
+
27
+ const dataSource = new DataSource(typeormConfig);
28
+
29
+ export default dataSource;
@@ -0,0 +1,18 @@
1
+ import { Injectable } from "@nestjs/common";
2
+ import { TypeOrmDataSourceFactory, TypeOrmModuleOptions, TypeOrmOptionsFactory } from "@nestjs/typeorm";
3
+ import { typeormConfig } from "./typeorm.config";
4
+ import { SeederOptions } from "typeorm-extension";
5
+
6
+ @Injectable()
7
+ export class TypeOrmService implements TypeOrmOptionsFactory {
8
+ public createTypeOrmOptions(): TypeOrmModuleOptions & SeederOptions {
9
+ return typeormConfig;
10
+ }
11
+ }
12
+
13
+ @Injectable()
14
+ export class TypeOrmConfigService implements TypeOrmOptionsFactory {
15
+ public createTypeOrmOptions(): TypeOrmModuleOptions & SeederOptions {
16
+ return typeormConfig;
17
+ }
18
+ }
@@ -0,0 +1 @@
1
+ export * from './language.dto';
@@ -0,0 +1,20 @@
1
+ import { ApiProperty } from "@nestjs/swagger";
2
+ import { IsNotEmpty, IsString } from "class-validator";
3
+
4
+ export class LanguageDto {
5
+ @ApiProperty({
6
+ description: 'The language name',
7
+ example: 'English',
8
+ })
9
+ @IsNotEmpty()
10
+ @IsString()
11
+ en!: string;
12
+
13
+ @ApiProperty({
14
+ description: 'The language name in the native language',
15
+ example: 'አማርኛ',
16
+ })
17
+ @IsNotEmpty()
18
+ @IsString()
19
+ am!: string;
20
+ }
@@ -0,0 +1,62 @@
1
+ import { Body, Controller, Delete, Get, Param, Post, Put, UseInterceptors } from "@nestjs/common";
2
+ import { ApiBearerAuth, ApiBody } from "@nestjs/swagger";
3
+ import { DExtraCrudService } from "../services/extra-crud.service";
4
+
5
+ export type ExtraCrudOptions = {
6
+ createDto?: { new(): NonNullable<unknown> };
7
+ updateDto?: { new(): NonNullable<unknown> };
8
+ };
9
+
10
+
11
+ export function DExtraCrudController(
12
+ options?: ExtraCrudOptions,
13
+ ) {
14
+ @Controller()
15
+ @UseInterceptors(/* your interceptors if any */)
16
+ @ApiBearerAuth()
17
+ class ExtraCrudControllerHost {
18
+ constructor(
19
+ public readonly schemaCrudService: DExtraCrudService,
20
+ ) {
21
+ }
22
+
23
+ @Get('/list/:parentId')
24
+ async findAll(
25
+ @Param('parentId') parentId: string
26
+ ) {
27
+ return await this.schemaCrudService.findAll(parentId)
28
+ }
29
+
30
+ @Get('/:id')
31
+ async findOne(
32
+ @Param('id') id: string
33
+ ) {
34
+ return await this.schemaCrudService.findOne(id)
35
+ }
36
+
37
+ @Post()
38
+ @ApiBody({ type: options?.createDto })
39
+ async create(
40
+ @Body() itemData: any
41
+ ) {
42
+ return await this.schemaCrudService.create(itemData)
43
+ }
44
+
45
+ @Put('/:id')
46
+ @ApiBody({ type: options?.updateDto })
47
+ async update(
48
+ @Param('id') id: string,
49
+ @Body() itemData: any
50
+ ) {
51
+ return await this.schemaCrudService.update(id, itemData)
52
+ }
53
+
54
+ @Delete('/:id')
55
+ async delete(
56
+ @Param('id') id: string
57
+ ) {
58
+ return await this.schemaCrudService.delete(id)
59
+ }
60
+ }
61
+ return ExtraCrudControllerHost
62
+ }
@@ -0,0 +1,2 @@
1
+ export * from './extra-crud.controller'
2
+ export * from './extra-crud.controller'
@@ -0,0 +1,39 @@
1
+ import { Body, Controller, Get, Param, Post } from "@nestjs/common";
2
+ import { DRelationCrudService } from "../services/relation-crud.service";
3
+ import { AssignSecondForFirstDTO, AssignFirstForSecondDTO } from "../../dtos/relation-crud.dto";
4
+
5
+ @Controller()
6
+ export class DRelationCrudController {
7
+ constructor(
8
+ private readonly schemaCrudService: DRelationCrudService,
9
+ ) {
10
+ }
11
+
12
+ @Get('/given-first/:id')
13
+ async givenFirst(
14
+ @Param('id') id: string
15
+ ) {
16
+ return await this.schemaCrudService.givenFirst(id)
17
+ }
18
+
19
+ @Get('/given-second/:id')
20
+ async givenSecond(
21
+ @Param('id') id: string
22
+ ) {
23
+ return await this.schemaCrudService.givenSecond(id)
24
+ }
25
+
26
+ @Post('assign-firsts-for-second')
27
+ async assignSecond(
28
+ @Body() itemData: AssignFirstForSecondDTO
29
+ ) {
30
+ return await this.schemaCrudService.assignFirstsForSecond(itemData.secondId, itemData.firstIds)
31
+ }
32
+
33
+ @Post('assign-seconds-for-first')
34
+ async assignFirst(
35
+ @Body() itemData: AssignSecondForFirstDTO
36
+ ) {
37
+ return await this.schemaCrudService.assignSecondsForFirst(itemData.firstId, itemData.secondIds)
38
+ }
39
+ }
@@ -0,0 +1,60 @@
1
+ import { Body, Controller, Delete, Get, Param, Post, Put, UseInterceptors } from "@nestjs/common";
2
+ import { DSchemaCrudService } from "../services/schema-crud.service";
3
+ import { ApiBearerAuth, ApiBody } from "@nestjs/swagger";
4
+
5
+ export type SchemaCrudOptions = {
6
+ createDto?: { new(): NonNullable<unknown> };
7
+ updateDto?: { new(): NonNullable<unknown> };
8
+ };
9
+
10
+
11
+ export function DSchemaCrudController(
12
+ options?: SchemaCrudOptions,
13
+ ) {
14
+ @Controller()
15
+ @UseInterceptors(/* your interceptors if any */)
16
+ @ApiBearerAuth()
17
+ class SchemaCrudControllerHost {
18
+ constructor(
19
+ public readonly schemaCrudService: DSchemaCrudService,
20
+ ) {
21
+ }
22
+
23
+ @Get()
24
+ async findAll() {
25
+ return await this.schemaCrudService.findAll()
26
+ }
27
+
28
+ @Get('/:id')
29
+ async findOne(
30
+ @Param('id') id: string
31
+ ) {
32
+ return await this.schemaCrudService.findOne(id)
33
+ }
34
+
35
+ @Post()
36
+ @ApiBody({ type: options?.createDto })
37
+ async create(
38
+ @Body() itemData: any
39
+ ) {
40
+ return await this.schemaCrudService.create(itemData)
41
+ }
42
+
43
+ @Put('/:id')
44
+ @ApiBody({ type: options?.updateDto })
45
+ async update(
46
+ @Param('id') id: string,
47
+ @Body() itemData: any
48
+ ) {
49
+ return await this.schemaCrudService.update(id, itemData)
50
+ }
51
+
52
+ @Delete('/:id')
53
+ async delete(
54
+ @Param('id') id: string
55
+ ) {
56
+ return await this.schemaCrudService.delete(id)
57
+ }
58
+ }
59
+ return SchemaCrudControllerHost
60
+ }
@@ -0,0 +1,2 @@
1
+ export * from './controllers'
2
+ export * from './services'
@@ -0,0 +1,44 @@
1
+ import { Injectable } from "@nestjs/common";
2
+ import { eq } from "drizzle-orm";
3
+ import { NodePgDatabase } from "drizzle-orm/node-postgres";
4
+ import { PgTableWithColumns } from "drizzle-orm/pg-core";
5
+
6
+ @Injectable()
7
+ export class DExtraCrudService {
8
+ constructor(
9
+ protected readonly db: NodePgDatabase<any>,
10
+ private readonly schema: PgTableWithColumns<any>,
11
+ private readonly parentFieldName: string
12
+ ) {
13
+ }
14
+
15
+ async findAll(parentFieldValue: string) {
16
+ const data = await this.db.select()
17
+ .from(this.schema)
18
+ .where(eq(this.schema[this.parentFieldName], parentFieldValue))
19
+
20
+ return {
21
+ count: data.length,
22
+ items: data
23
+ }
24
+
25
+ }
26
+
27
+ async findOne(id: string) {
28
+ return await this.db.select()
29
+ .from(this.schema)
30
+ .where(eq(this.schema.id, id));
31
+ }
32
+
33
+ async create(itemData: any) {
34
+ return await this.db.insert(this.schema).values(itemData).returning();
35
+ }
36
+
37
+ async update(id: string, itemData: any) {
38
+ return await this.db.update(this.schema).set(itemData).where(eq(this.schema.id, id));
39
+ }
40
+
41
+ async delete(id: string) {
42
+ return await this.db.delete(this.schema).where(eq(this.schema.id, id));
43
+ }
44
+ }
@@ -0,0 +1,2 @@
1
+ export * from './schema-crud.service'
2
+ export * from './extra-crud.service'
@@ -0,0 +1,97 @@
1
+ import { Injectable } from "@nestjs/common";
2
+ import { eq, getTableColumns } from "drizzle-orm";
3
+ import { NodePgDatabase } from "drizzle-orm/node-postgres";
4
+ import { PgTableWithColumns } from "drizzle-orm/pg-core";
5
+
6
+ @Injectable()
7
+ export class DRelationCrudService {
8
+ constructor(
9
+ protected readonly db: NodePgDatabase<any>,
10
+ private readonly schema: PgTableWithColumns<any>,
11
+ private readonly firstSchema: PgTableWithColumns<any>,
12
+ private readonly secondSchema: PgTableWithColumns<any>,
13
+ private readonly firstFieldName: string,
14
+ private readonly secondFieldName: string
15
+ ) {
16
+ }
17
+ async givenFirst(schemaId: string) {
18
+ try {
19
+
20
+ const result = await this.db.select({
21
+ ...getTableColumns(this.secondSchema),
22
+ })
23
+ .from(this.secondSchema)
24
+ .leftJoin(this.schema, eq(this.secondSchema.id, this.schema[this.secondFieldName]))
25
+ .where(eq(this.schema[this.firstFieldName], schemaId))
26
+
27
+
28
+ // const result = await this.db.select({
29
+ // ...getTableColumns(this.firstSchema),
30
+ // [this.firstFieldName]: sql`json_agg(${this.secondSchema})`
31
+ // })
32
+ // .from(this.firstSchema)
33
+ // .leftJoin(this.secondSchema, eq(this.firstSchema[this.firstFieldId], this.secondSchema.id))
34
+ // .groupBy(this.firstSchema.id)
35
+
36
+
37
+ return {
38
+ count: result.length,
39
+ items: result
40
+ }
41
+ } catch (error) {
42
+ console.error('Error in givenFirst:', error);
43
+ throw error;
44
+ }
45
+ }
46
+
47
+ async givenSecond(schemaId: string) {
48
+ try {
49
+
50
+ const result = await this.db.select({
51
+ ...getTableColumns(this.firstSchema),
52
+ })
53
+ .from(this.firstSchema)
54
+ .leftJoin(this.schema, eq(this.firstSchema.id, this.schema[this.firstFieldName]))
55
+ .where(eq(this.schema[this.secondFieldName], schemaId))
56
+
57
+
58
+ return {
59
+ count: result.length,
60
+ items: result
61
+ }
62
+ } catch (error) {
63
+ console.error('Error in givenSecond:', error);
64
+ throw error;
65
+ }
66
+ }
67
+
68
+ async assignFirstsForSecond(secondId: string, firstIds: string[]) {
69
+ try {
70
+ const result = await this.db.insert(this.schema)
71
+ .values(firstIds.map((firstId) => ({ [this.firstFieldName]: firstId, [this.secondFieldName]: secondId })))
72
+ .returning()
73
+
74
+ return {
75
+ count: result.length,
76
+ items: result
77
+ }
78
+ } catch (error) {
79
+ console.error('Error in assignSecond:', error);
80
+ throw error;
81
+ }
82
+ }
83
+
84
+ async assignSecondsForFirst(firstId: string, secondsIds: string[]) {
85
+ try {
86
+ const result = await this.db.insert(this.schema)
87
+ .values(secondsIds.map((secondId) => ({ [this.secondFieldName]: secondId, [this.firstFieldName]: firstId })))
88
+ .returning()
89
+
90
+ return result
91
+ } catch (error) {
92
+ console.error('Error in assignFirst:', error);
93
+ throw error;
94
+ }
95
+ }
96
+
97
+ }
@@ -0,0 +1,39 @@
1
+ import { Injectable } from "@nestjs/common";
2
+ import { eq } from "drizzle-orm";
3
+ import { NodePgDatabase } from "drizzle-orm/node-postgres";
4
+ import { PgTableWithColumns } from "drizzle-orm/pg-core";
5
+
6
+ @Injectable()
7
+ export class DSchemaCrudService {
8
+ constructor(
9
+ protected readonly db: NodePgDatabase<any>,
10
+ private readonly schema: PgTableWithColumns<any>
11
+ ) {
12
+ }
13
+
14
+ async findAll() {
15
+ const data = await this.db.select().from(this.schema);
16
+ return {
17
+ count: data.length,
18
+ items: data
19
+ }
20
+ }
21
+
22
+ async findOne(id: string) {
23
+ return await this.db.select()
24
+ .from(this.schema)
25
+ .where(eq(this.schema.id, id));
26
+ }
27
+
28
+ async create(itemData: any) {
29
+ return await this.db.insert(this.schema).values(itemData).returning();
30
+ }
31
+
32
+ async update(id: string, itemData: any) {
33
+ return await this.db.update(this.schema).set(itemData).where(eq(this.schema.id, id));
34
+ }
35
+
36
+ async delete(id: string) {
37
+ return await this.db.delete(this.schema).where(eq(this.schema.id, id));
38
+ }
39
+ }
@@ -0,0 +1 @@
1
+ export * from './relation-crud.dto'
@@ -0,0 +1,24 @@
1
+ import { ApiProperty } from "@nestjs/swagger";
2
+ import { IsArray, IsString } from "class-validator";
3
+
4
+ export class AssignFirstForSecondDTO {
5
+ @ApiProperty()
6
+ @IsString()
7
+ secondId!: string;
8
+
9
+ @ApiProperty()
10
+ @IsString({ each: true })
11
+ @IsArray()
12
+ firstIds!: string[];
13
+ }
14
+
15
+ export class AssignSecondForFirstDTO {
16
+ @ApiProperty()
17
+ @IsString()
18
+ firstId!: string;
19
+
20
+ @ApiProperty()
21
+ @IsString({ each: true })
22
+ @IsArray()
23
+ secondIds!: string[];
24
+ }
@@ -0,0 +1,42 @@
1
+ import {
2
+ ExceptionFilter,
3
+ Catch,
4
+ ArgumentsHost,
5
+ HttpException,
6
+ HttpStatus,
7
+ Logger,
8
+ } from '@nestjs/common';
9
+
10
+ @Catch()
11
+ export class GlobalExceptionFilter implements ExceptionFilter {
12
+ private readonly logger = new Logger(GlobalExceptionFilter.name);
13
+ catch(exception: any, host: ArgumentsHost) {
14
+ const ctx = host.switchToHttp();
15
+ const response = ctx.getResponse();
16
+ const request = ctx.getRequest();
17
+
18
+ const status =
19
+ exception instanceof HttpException
20
+ ? exception.getStatus()
21
+ : HttpStatus.BAD_REQUEST;
22
+
23
+ let message =
24
+ exception instanceof HttpException
25
+ ? (exception.getResponse() as any)['message']
26
+ : (exception as Error).message;
27
+
28
+ if (!message && exception.message) {
29
+ message = exception.message;
30
+ }
31
+
32
+ const responseBody = {
33
+ statusCode: status,
34
+ timestamp: new Date().toISOString(),
35
+ path: request.url,
36
+ message,
37
+ exception: exception,
38
+ };
39
+ this.logger.error(responseBody);
40
+ response.status(status).json(responseBody);
41
+ }
42
+ }
@@ -0,0 +1 @@
1
+ export * from'./global-filter-exceptions'
@@ -0,0 +1,5 @@
1
+ export * from './drizzle'
2
+ export * from './dtos'
3
+ export * from './exceptions'
4
+ export * from './schemas'
5
+ export * from './typeorm'
@@ -0,0 +1,7 @@
1
+ import { timestamp } from "drizzle-orm/pg-core";
2
+
3
+ export const audit = {
4
+ updatedAt: timestamp(),
5
+ createdAt: timestamp().defaultNow().notNull(),
6
+ deletedAt: timestamp(),
7
+ }
@@ -0,0 +1 @@
1
+ export * from './audit.schema';