mm-share-lib 0.0.1 → 0.0.3

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 (129) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.js +18 -0
  3. package/dist/index.js.map +1 -0
  4. package/dist/src/common/constant/entity-state.constant.d.ts +4 -0
  5. package/dist/src/common/constant/entity-state.constant.js +9 -0
  6. package/dist/src/common/constant/entity-state.constant.js.map +1 -0
  7. package/dist/src/common/constant/index.d.ts +1 -0
  8. package/dist/src/common/constant/index.js +18 -0
  9. package/dist/src/common/constant/index.js.map +1 -0
  10. package/dist/src/common/generic/entity/entity.generic.d.ts +10 -0
  11. package/dist/src/common/generic/entity/entity.generic.js +48 -0
  12. package/dist/src/common/generic/entity/entity.generic.js.map +1 -0
  13. package/dist/src/common/generic/entity/index.d.ts +1 -0
  14. package/dist/src/common/generic/entity/index.js +18 -0
  15. package/dist/src/common/generic/entity/index.js.map +1 -0
  16. package/dist/src/common/generic/index.d.ts +2 -0
  17. package/dist/src/common/generic/index.js +19 -0
  18. package/dist/src/common/generic/index.js.map +1 -0
  19. package/dist/src/common/generic/service/index.d.ts +1 -0
  20. package/dist/src/common/generic/service/index.js +18 -0
  21. package/dist/src/common/generic/service/index.js.map +1 -0
  22. package/dist/src/common/generic/service/service.generic.d.ts +18 -0
  23. package/dist/src/common/generic/service/service.generic.js +85 -0
  24. package/dist/src/common/generic/service/service.generic.js.map +1 -0
  25. package/dist/src/common/index.js +19 -0
  26. package/dist/src/common/index.js.map +1 -0
  27. package/dist/src/dto/base-filter.dto.d.ts +4 -0
  28. package/dist/src/dto/base-filter.dto.js +11 -0
  29. package/dist/src/dto/base-filter.dto.js.map +1 -0
  30. package/dist/src/dto/index.d.ts +2 -0
  31. package/dist/src/dto/index.js +19 -0
  32. package/dist/src/dto/index.js.map +1 -0
  33. package/dist/src/dto/pagination.dto.d.ts +4 -0
  34. package/dist/src/dto/pagination.dto.js +11 -0
  35. package/dist/src/dto/pagination.dto.js.map +1 -0
  36. package/dist/src/index.d.ts +5 -0
  37. package/dist/src/index.js +22 -0
  38. package/dist/src/index.js.map +1 -0
  39. package/dist/src/lib/index.d.ts +1 -0
  40. package/dist/src/lib/index.js +18 -0
  41. package/dist/src/lib/index.js.map +1 -0
  42. package/dist/src/lib/search-engine/document/base.document.d.ts +3 -0
  43. package/dist/src/lib/search-engine/document/base.document.js +7 -0
  44. package/dist/src/lib/search-engine/document/base.document.js.map +1 -0
  45. package/dist/src/lib/search-engine/document/index.d.ts +1 -0
  46. package/dist/src/lib/search-engine/document/index.js +18 -0
  47. package/dist/src/lib/search-engine/document/index.js.map +1 -0
  48. package/dist/src/lib/search-engine/index.d.ts +1 -0
  49. package/dist/src/lib/search-engine/index.js +18 -0
  50. package/dist/src/lib/search-engine/index.js.map +1 -0
  51. package/dist/src/lib/search-engine/interface/index.d.ts +2 -0
  52. package/dist/src/lib/search-engine/interface/index.js +19 -0
  53. package/dist/src/lib/search-engine/interface/index.js.map +1 -0
  54. package/dist/src/lib/search-engine/interface/search-document.interface.d.ts +4 -0
  55. package/dist/src/lib/search-engine/interface/search-document.interface.js +3 -0
  56. package/dist/src/lib/search-engine/interface/search-document.interface.js.map +1 -0
  57. package/dist/src/lib/search-engine/interface/transform-service.interface.d.ts +6 -0
  58. package/dist/src/lib/search-engine/interface/transform-service.interface.js +3 -0
  59. package/dist/src/lib/search-engine/interface/transform-service.interface.js.map +1 -0
  60. package/dist/src/lib/search-engine/schema/generic.schema.d.ts +2 -0
  61. package/dist/src/lib/search-engine/schema/generic.schema.js +7 -0
  62. package/dist/src/lib/search-engine/schema/generic.schema.js.map +1 -0
  63. package/dist/src/lib/search-engine/schema/index.d.ts +1 -0
  64. package/dist/src/lib/search-engine/schema/index.js +18 -0
  65. package/dist/src/lib/search-engine/schema/index.js.map +1 -0
  66. package/dist/src/lib/search-engine/typesense/index.d.ts +3 -0
  67. package/dist/src/lib/search-engine/typesense/index.js +20 -0
  68. package/dist/src/lib/search-engine/typesense/index.js.map +1 -0
  69. package/dist/src/lib/search-engine/typesense/metadata/index.d.ts +2 -0
  70. package/dist/src/lib/search-engine/typesense/metadata/index.js +19 -0
  71. package/dist/src/lib/search-engine/typesense/metadata/index.js.map +1 -0
  72. package/dist/src/lib/search-engine/typesense/metadata/schema.metadata.d.ts +12 -0
  73. package/dist/src/lib/search-engine/typesense/metadata/schema.metadata.js +3 -0
  74. package/dist/src/lib/search-engine/typesense/metadata/schema.metadata.js.map +1 -0
  75. package/dist/src/lib/search-engine/typesense/metadata/typesense.metadata-registry.d.ts +10 -0
  76. package/dist/src/lib/search-engine/typesense/metadata/typesense.metadata-registry.js +34 -0
  77. package/dist/src/lib/search-engine/typesense/metadata/typesense.metadata-registry.js.map +1 -0
  78. package/dist/src/lib/search-engine/typesense/service/client.service.d.ts +33 -0
  79. package/dist/src/lib/search-engine/typesense/service/client.service.js +197 -0
  80. package/dist/src/lib/search-engine/typesense/service/client.service.js.map +1 -0
  81. package/dist/src/lib/search-engine/typesense/service/index.d.ts +1 -0
  82. package/dist/src/lib/search-engine/typesense/service/index.js +18 -0
  83. package/dist/src/lib/search-engine/typesense/service/index.js.map +1 -0
  84. package/dist/src/lib/search-engine/typesense/typesense-module.interface.d.ts +27 -0
  85. package/dist/src/lib/search-engine/typesense/typesense-module.interface.js +3 -0
  86. package/dist/src/lib/search-engine/typesense/typesense-module.interface.js.map +1 -0
  87. package/dist/src/lib/search-engine/typesense/typesense.constants.d.ts +1 -0
  88. package/dist/src/lib/search-engine/typesense/typesense.constants.js +5 -0
  89. package/dist/src/lib/search-engine/typesense/typesense.constants.js.map +1 -0
  90. package/dist/src/lib/search-engine/typesense/typesense.module.d.ts +8 -0
  91. package/dist/src/lib/search-engine/typesense/typesense.module.js +69 -0
  92. package/dist/src/lib/search-engine/typesense/typesense.module.js.map +1 -0
  93. package/dist/src/lib/search-engine/typesense/typesense.module.test.d.ts +1 -0
  94. package/dist/src/lib/search-engine/typesense/typesense.module.test.js +89 -0
  95. package/dist/src/lib/search-engine/typesense/typesense.module.test.js.map +1 -0
  96. package/dist/src/lib/search-engine/typesense/typesense.providers.d.ts +4 -0
  97. package/dist/src/lib/search-engine/typesense/typesense.providers.js +40 -0
  98. package/dist/src/lib/search-engine/typesense/typesense.providers.js.map +1 -0
  99. package/dist/src/response/index.d.ts +1 -0
  100. package/dist/src/response/index.js +18 -0
  101. package/dist/src/response/index.js.map +1 -0
  102. package/dist/src/response/pagination.response.d.ts +17 -0
  103. package/dist/src/response/pagination.response.js +29 -0
  104. package/dist/src/response/pagination.response.js.map +1 -0
  105. package/dist/src/util/date.util.d.ts +2 -0
  106. package/dist/src/util/date.util.js +7 -0
  107. package/dist/src/util/date.util.js.map +1 -0
  108. package/dist/src/util/generator.util.d.ts +2 -0
  109. package/dist/src/util/generator.util.js +20 -0
  110. package/dist/src/util/generator.util.js.map +1 -0
  111. package/dist/src/util/index.d.ts +2 -0
  112. package/dist/src/util/index.js +19 -0
  113. package/dist/src/util/index.js.map +1 -0
  114. package/dist/tsconfig.build.tsbuildinfo +1 -0
  115. package/package.json +81 -77
  116. package/src/{common/constant → constant}/entity-state.constant.ts +4 -4
  117. package/src/{common/constant → constant}/index.ts +1 -1
  118. package/src/{common/generic → generic}/entity/entity.generic.ts +34 -34
  119. package/src/{common/generic → generic}/entity/index.ts +1 -1
  120. package/src/{common/generic → generic}/index.ts +2 -2
  121. package/src/{common/generic → generic}/service/index.ts +1 -1
  122. package/src/{common/generic → generic}/service/service.generic.ts +112 -112
  123. package/src/index.ts +2 -1
  124. package/src/util/date.util.spec.ts +49 -0
  125. package/src/util/date.util.ts +10 -1
  126. package/src/util/generator.util.spec.ts +79 -35
  127. package/src/util/generator.util.ts +27 -18
  128. /package/{src/common/index.ts → dist/src/common/index.d.ts} +0 -0
  129. /package/src/{common/generic/service/service.generic.spec.ts → exception/index.ts} +0 -0
package/package.json CHANGED
@@ -1,77 +1,81 @@
1
- {
2
- "name": "mm-share-lib",
3
- "version": "0.0.1",
4
- "description": "Share the generic service, entity, dto.",
5
- "author": "Mesa SOT",
6
- "license": "MIT",
7
- "homepage": "https://github.com/memotechs/share-lib",
8
- "scripts": {
9
- "build": "nest build",
10
- "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
11
- "start": "nest start",
12
- "start:dev": "nest start --watch",
13
- "start:debug": "nest start --debug --watch",
14
- "start:prod": "node dist/main",
15
- "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
16
- "test": "jest",
17
- "test:watch": "jest --watch",
18
- "test:cov": "jest --coverage",
19
- "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
20
- "test:e2e": "jest --config ./test/jest-e2e.json",
21
- "prepare": "husky install"
22
- },
23
- "dependencies": {
24
- "@babel/runtime": "^7.22.5",
25
- "@nestjs/common": "^9.4.2",
26
- "@nestjs/core": "^9.4.2",
27
- "@nestjs/platform-express": "^9.4.2",
28
- "@nestjs/typeorm": "^9.0.1",
29
- "class-transformer": "^0.5.1",
30
- "class-validator": "^0.14.0",
31
- "reflect-metadata": "^0.1.13",
32
- "rxjs": "^7.8.1",
33
- "typeorm": "^0.3.16",
34
- "typesense": "^1.5.4"
35
- },
36
- "devDependencies": {
37
- "@nestjs/cli": "^9.5.0",
38
- "@nestjs/schematics": "^9.2.0",
39
- "@nestjs/testing": "^9.4.2",
40
- "@types/express": "^4.17.17",
41
- "@types/jest": "29.5.2",
42
- "@types/node": "20.2.5",
43
- "@types/supertest": "^2.0.12",
44
- "@typescript-eslint/eslint-plugin": "^5.59.9",
45
- "@typescript-eslint/parser": "^5.59.9",
46
- "eslint": "^8.42.0",
47
- "eslint-config-prettier": "^8.8.0",
48
- "eslint-plugin-prettier": "^4.2.1",
49
- "husky": "^8.0.3",
50
- "jest": "29.5.0",
51
- "prettier": "^2.8.8",
52
- "source-map-support": "^0.5.21",
53
- "supertest": "^6.3.3",
54
- "ts-jest": "29.1.0",
55
- "ts-loader": "^9.4.3",
56
- "ts-node": "^10.9.1",
57
- "tsconfig-paths": "4.2.0",
58
- "typescript": "^5.1.3"
59
- },
60
- "jest": {
61
- "moduleFileExtensions": [
62
- "js",
63
- "json",
64
- "ts"
65
- ],
66
- "rootDir": "src",
67
- "testRegex": ".*\\.spec\\.ts$",
68
- "transform": {
69
- "^.+\\.(t|j)s$": "ts-jest"
70
- },
71
- "collectCoverageFrom": [
72
- "**/*.(t|j)s"
73
- ],
74
- "coverageDirectory": "../coverage",
75
- "testEnvironment": "node"
76
- }
77
- }
1
+ {
2
+ "name": "mm-share-lib",
3
+ "version": "0.0.3",
4
+ "description": "Share the generic service, entity, dto.",
5
+ "author": "Mesa SOT",
6
+ "license": "MIT",
7
+ "main": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "scripts": {
10
+ "build": "nest build",
11
+ "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
12
+ "start": "nest start",
13
+ "start:dev": "nest start --watch",
14
+ "start:debug": "nest start --debug --watch",
15
+ "start:prod": "node dist/main",
16
+ "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
17
+ "test": "jest",
18
+ "test:watch": "jest --watch",
19
+ "test:cov": "jest --coverage",
20
+ "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
21
+ "test:e2e": "jest --config ./test/jest-e2e.json",
22
+ "prepare": "husky install"
23
+ },
24
+ "dependencies": {
25
+ "@babel/runtime": "^7.22.5",
26
+ "@nestjs/common": "^9.4.2",
27
+ "@nestjs/core": "^9.4.2",
28
+ "@nestjs/platform-express": "^9.4.2",
29
+ "@nestjs/typeorm": "^9.0.1",
30
+ "class-transformer": "^0.5.1",
31
+ "class-validator": "^0.14.0",
32
+ "dayjs": "^1.11.8",
33
+ "reflect-metadata": "^0.1.13",
34
+ "rxjs": "^7.8.1",
35
+ "typeorm": "^0.3.16",
36
+ "bcrypt": "^5.1.0",
37
+ "typesense": "^1.5.4"
38
+ },
39
+ "devDependencies": {
40
+ "@nestjs/cli": "^9.5.0",
41
+ "@nestjs/schematics": "^9.2.0",
42
+ "@nestjs/testing": "^9.4.2",
43
+ "@types/bcrypt": "^5.0.0",
44
+ "@types/express": "^4.17.17",
45
+ "@types/jest": "29.5.2",
46
+ "@types/node": "20.2.5",
47
+ "@types/supertest": "^2.0.12",
48
+ "@typescript-eslint/eslint-plugin": "^5.59.9",
49
+ "@typescript-eslint/parser": "^5.59.9",
50
+ "eslint": "^8.42.0",
51
+ "eslint-config-prettier": "^8.8.0",
52
+ "eslint-plugin-prettier": "^4.2.1",
53
+ "husky": "^8.0.3",
54
+ "jest": "29.5.0",
55
+ "prettier": "^2.8.8",
56
+ "source-map-support": "^0.5.21",
57
+ "supertest": "^6.3.3",
58
+ "ts-jest": "29.1.0",
59
+ "ts-loader": "^9.4.3",
60
+ "ts-node": "^10.9.1",
61
+ "tsconfig-paths": "4.2.0",
62
+ "typescript": "^5.1.3"
63
+ },
64
+ "jest": {
65
+ "moduleFileExtensions": [
66
+ "js",
67
+ "json",
68
+ "ts"
69
+ ],
70
+ "rootDir": "src",
71
+ "testRegex": ".*\\.spec\\.ts$",
72
+ "transform": {
73
+ "^.+\\.(t|j)s$": "ts-jest"
74
+ },
75
+ "collectCoverageFrom": [
76
+ "**/*.(t|j)s"
77
+ ],
78
+ "coverageDirectory": "../coverage",
79
+ "testEnvironment": "node"
80
+ }
81
+ }
@@ -1,4 +1,4 @@
1
- export enum EntityStateConstant {
2
- Active = 1,
3
- Archived = 0,
4
- }
1
+ export enum EntityStateConstant {
2
+ Active = 1,
3
+ Archived = 0,
4
+ }
@@ -1 +1 @@
1
- export * from './entity-state.constant';
1
+ export * from './entity-state.constant';
@@ -1,34 +1,34 @@
1
- import {
2
- Column,
3
- VersionColumn,
4
- CreateDateColumn,
5
- UpdateDateColumn,
6
- PrimaryGeneratedColumn,
7
- } from 'typeorm';
8
-
9
- export class EntityGeneric {
10
- constructor(id?: number) {
11
- this.id = id;
12
- }
13
-
14
- @PrimaryGeneratedColumn()
15
- id: number;
16
-
17
- @CreateDateColumn()
18
- createdAt: Date;
19
-
20
- @UpdateDateColumn()
21
- updatedAt: Date;
22
-
23
- @Column()
24
- createdBy: number;
25
-
26
- @Column({ select: false })
27
- updatedBy: number;
28
-
29
- @Column()
30
- state: number;
31
-
32
- @VersionColumn({ select: false })
33
- version: number;
34
- }
1
+ import {
2
+ Column,
3
+ VersionColumn,
4
+ CreateDateColumn,
5
+ UpdateDateColumn,
6
+ PrimaryGeneratedColumn,
7
+ } from 'typeorm';
8
+
9
+ export class EntityGeneric {
10
+ constructor(id?: number) {
11
+ this.id = id;
12
+ }
13
+
14
+ @PrimaryGeneratedColumn()
15
+ id: number;
16
+
17
+ @CreateDateColumn()
18
+ createdAt: Date;
19
+
20
+ @UpdateDateColumn()
21
+ updatedAt: Date;
22
+
23
+ @Column()
24
+ createdBy: number;
25
+
26
+ @Column({ select: false })
27
+ updatedBy: number;
28
+
29
+ @Column()
30
+ state: number;
31
+
32
+ @VersionColumn({ select: false })
33
+ version: number;
34
+ }
@@ -1 +1 @@
1
- export * from './entity.generic';
1
+ export * from './entity.generic';
@@ -1,2 +1,2 @@
1
- export * from './entity/entity.generic';
2
- export * from './service/service.generic';
1
+ export * from './entity/entity.generic';
2
+ export * from './service/service.generic';
@@ -1 +1 @@
1
- export * from './service.generic';
1
+ export * from './service.generic';
@@ -1,112 +1,112 @@
1
- import {
2
- Repository,
3
- Connection,
4
- EntityManager,
5
- SelectQueryBuilder,
6
- } from 'typeorm';
7
- import { EntityGeneric } from '../entity';
8
- import { PaginationDto, BaseFilterDto } from '../../../dto';
9
- import { EntityStateConstant } from '../../constant';
10
- import { PaginationResponse } from '../../../response';
11
-
12
- export abstract class ServiceGeneric<
13
- Entity extends EntityGeneric,
14
- CustomRepository extends Repository<Entity>,
15
- > {
16
- protected readonly entityName: string;
17
- protected readonly loggable: boolean = false;
18
- protected repository: CustomRepository;
19
- protected connection: Connection;
20
- constructor(
21
- protected readonly connectionOrManager: Connection | EntityManager,
22
- repositoryType: { new (connection: Connection): CustomRepository },
23
- ) {
24
- if (connectionOrManager instanceof EntityManager) {
25
- this.connection = connectionOrManager.connection;
26
- } else {
27
- this.connection = connectionOrManager;
28
- }
29
- this.repository = this.connection.getCustomRepository(repositoryType);
30
- }
31
-
32
- create = async (entity: Entity): Promise<Entity> => {
33
- return this.repository.save(entity);
34
- };
35
-
36
- update = async (entity: Entity): Promise<Entity> => {
37
- return this.repository.save(entity);
38
- };
39
-
40
- getListWithPagination = async (
41
- paginationDto: PaginationDto,
42
- callback?: (query: SelectQueryBuilder<Entity>) => void,
43
- ): Promise<PaginationResponse<Entity>> => {
44
- const { limit = 25, offset = 0 } = paginationDto;
45
- const query = this.repository.createQueryBuilder(this.entityName);
46
- query.limit(limit);
47
- query.offset(offset);
48
- query.where(`${this.entityName}.state != :state`, {
49
- state: EntityStateConstant.Archived,
50
- });
51
- const defaultSelectable = ['createdAt', 'updatedAt'];
52
- query.orderBy(`${this.entityName}.updatedAt`, 'DESC');
53
- const selection = defaultSelectable.map(
54
- (column: string) => `${this.entityName}.${column}`,
55
- );
56
- query.addSelect(selection);
57
- if (callback != null) {
58
- callback(query);
59
- }
60
- const entities = await query.getMany();
61
- const total = await query.getCount();
62
- const response = new PaginationResponse(entities, total, limit, offset);
63
- return response;
64
- };
65
-
66
- getAutocompleteWithPagination = async (
67
- paginationDto: PaginationDto,
68
- filter: BaseFilterDto,
69
- callback?: (query: SelectQueryBuilder<Entity>) => void,
70
- ): Promise<PaginationResponse<Entity>> => {
71
- const { limit = 25, offset = 0 } = paginationDto;
72
- const query = this.repository.createQueryBuilder(this.entityName);
73
- query.limit(limit);
74
- query.offset(offset);
75
- query.where(`${this.entityName}.state != :state`, {
76
- state: EntityStateConstant.Archived,
77
- });
78
- const defaultSelectable = ['createdAt', 'updatedAt'];
79
- query.orderBy(`${this.entityName}.updatedAt`, 'DESC');
80
- const selection = defaultSelectable.map(
81
- (column: string) => `${this.entityName}.${column}`,
82
- );
83
- query.addSelect(selection);
84
- if (callback != null) {
85
- callback(query);
86
- }
87
- const { excludeIds = [], includeIds = [] } = { ...filter };
88
- // Exclude some ids from the list.
89
- if (excludeIds?.length > 0) {
90
- query.andWhere(`${this.entityName}.id NOT IN (:ids)`, {
91
- ids: excludeIds,
92
- });
93
- }
94
- let entities = await query.getMany();
95
- const total = await query.getCount();
96
- // Include some ids to the list.
97
- const allIds: number[] = [];
98
- for (const id of includeIds) {
99
- const entity = entities.filter((entity: Entity) => entity.id === id);
100
- if (entity.length == 0) {
101
- allIds.push(id);
102
- }
103
- }
104
- if (allIds.length > 0) {
105
- query.where(`${this.entityName}.id IN (:ids)`, { ids: allIds });
106
- const data = await query.getMany();
107
- entities = data.concat(entities);
108
- }
109
- const response = new PaginationResponse(entities, total, limit, offset);
110
- return response;
111
- };
112
- }
1
+ import {
2
+ Repository,
3
+ Connection,
4
+ EntityManager,
5
+ SelectQueryBuilder,
6
+ } from 'typeorm';
7
+ import { EntityGeneric } from '../entity';
8
+ import { PaginationDto, BaseFilterDto } from '../../dto';
9
+ import { EntityStateConstant } from '../../constant';
10
+ import { PaginationResponse } from '../../response';
11
+
12
+ export abstract class ServiceGeneric<
13
+ Entity extends EntityGeneric,
14
+ CustomRepository extends Repository<Entity>,
15
+ > {
16
+ protected readonly entityName: string;
17
+ protected readonly loggable: boolean = false;
18
+ protected repository: CustomRepository;
19
+ protected connection: Connection;
20
+ constructor(
21
+ protected readonly connectionOrManager: Connection | EntityManager,
22
+ repositoryType: { new (connection: Connection): CustomRepository },
23
+ ) {
24
+ if (connectionOrManager instanceof EntityManager) {
25
+ this.connection = connectionOrManager.connection;
26
+ } else {
27
+ this.connection = connectionOrManager;
28
+ }
29
+ this.repository = this.connection.getCustomRepository(repositoryType);
30
+ }
31
+
32
+ async create(entity: Entity): Promise<Entity> {
33
+ return this.repository.save(entity);
34
+ }
35
+
36
+ async update(entity: Entity): Promise<Entity> {
37
+ return this.repository.save(entity);
38
+ }
39
+
40
+ async getListWithPagination(
41
+ paginationDto: PaginationDto,
42
+ callback?: (query: SelectQueryBuilder<Entity>) => void,
43
+ ): Promise<PaginationResponse<Entity>> {
44
+ const { limit = 25, offset = 0 } = paginationDto;
45
+ const query = this.repository.createQueryBuilder(this.entityName);
46
+ query.limit(limit);
47
+ query.offset(offset);
48
+ query.where(`${this.entityName}.state != :state`, {
49
+ state: EntityStateConstant.Archived,
50
+ });
51
+ const defaultSelectable = ['createdAt', 'updatedAt'];
52
+ query.orderBy(`${this.entityName}.updatedAt`, 'DESC');
53
+ const selection = defaultSelectable.map(
54
+ (column: string) => `${this.entityName}.${column}`,
55
+ );
56
+ query.addSelect(selection);
57
+ if (callback != null) {
58
+ callback(query);
59
+ }
60
+ const entities = await query.getMany();
61
+ const total = await query.getCount();
62
+ const response = new PaginationResponse(entities, total, limit, offset);
63
+ return response;
64
+ }
65
+
66
+ async getAutocompleteWithPagination(
67
+ paginationDto: PaginationDto,
68
+ filter: BaseFilterDto,
69
+ callback?: (query: SelectQueryBuilder<Entity>) => void,
70
+ ): Promise<PaginationResponse<Entity>> {
71
+ const { limit = 25, offset = 0 } = paginationDto;
72
+ const query = this.repository.createQueryBuilder(this.entityName);
73
+ query.limit(limit);
74
+ query.offset(offset);
75
+ query.where(`${this.entityName}.state != :state`, {
76
+ state: EntityStateConstant.Archived,
77
+ });
78
+ const defaultSelectable = ['createdAt', 'updatedAt'];
79
+ query.orderBy(`${this.entityName}.updatedAt`, 'DESC');
80
+ const selection = defaultSelectable.map(
81
+ (column: string) => `${this.entityName}.${column}`,
82
+ );
83
+ query.addSelect(selection);
84
+ if (callback != null) {
85
+ callback(query);
86
+ }
87
+ const { excludeIds = [], includeIds = [] } = { ...filter };
88
+ // Exclude some ids from the list.
89
+ if (excludeIds?.length > 0) {
90
+ query.andWhere(`${this.entityName}.id NOT IN (:ids)`, {
91
+ ids: excludeIds,
92
+ });
93
+ }
94
+ let entities = await query.getMany();
95
+ const total = await query.getCount();
96
+ // Include some ids to the list.
97
+ const allIds: number[] = [];
98
+ for (const id of includeIds) {
99
+ const entity = entities.filter((entity: Entity) => entity.id === id);
100
+ if (entity.length == 0) {
101
+ allIds.push(id);
102
+ }
103
+ }
104
+ if (allIds.length > 0) {
105
+ query.where(`${this.entityName}.id IN (:ids)`, { ids: allIds });
106
+ const data = await query.getMany();
107
+ entities = data.concat(entities);
108
+ }
109
+ const response = new PaginationResponse(entities, total, limit, offset);
110
+ return response;
111
+ }
112
+ }
package/src/index.ts CHANGED
@@ -1,4 +1,5 @@
1
- export * from './common';
1
+ export * from './generic';
2
+ export * from './constant';
2
3
  export * from './dto';
3
4
  export * from './lib';
4
5
  export * from './response';
@@ -0,0 +1,49 @@
1
+ import dayjs from 'dayjs';
2
+ import { addSecond, isExpired } from './date.util';
3
+
4
+ describe('Utility Functions', () => {
5
+ test('addSecond should return a Date object with the specified duration added', () => {
6
+ // Arrange
7
+ const duration = 10;
8
+
9
+ // Act
10
+ const result = addSecond(duration);
11
+
12
+ // Assert
13
+ const expectedDate = dayjs().add(duration, 'seconds').toDate();
14
+ expect(result).toEqual(expectedDate);
15
+ });
16
+
17
+ test('isExpired should return true for a past date', () => {
18
+ // Arrange
19
+ const pastDate = dayjs().subtract(1, 'day').toDate();
20
+
21
+ // Act
22
+ const result = isExpired(pastDate);
23
+
24
+ // Assert
25
+ expect(result).toBe(true);
26
+ });
27
+
28
+ test('isExpired should return false for a future date', () => {
29
+ // Arrange
30
+ const futureDate = dayjs().add(1, 'day').toDate();
31
+
32
+ // Act
33
+ const result = isExpired(futureDate);
34
+
35
+ // Assert
36
+ expect(result).toBe(false);
37
+ });
38
+
39
+ test('isExpired should return false for the current date', () => {
40
+ // Arrange
41
+ const currentDate = dayjs().toDate();
42
+
43
+ // Act
44
+ const result = isExpired(currentDate);
45
+
46
+ // Assert
47
+ expect(result).toBe(false);
48
+ });
49
+ });
@@ -1 +1,10 @@
1
- export class Test {}
1
+ import dayjs from 'dayjs';
2
+
3
+ export const addSecond = (duration: number): Date => {
4
+ return dayjs().add(duration, 'seconds').toDate();
5
+ };
6
+
7
+ export const isExpired = (date: Date): boolean => {
8
+ const currentDate = dayjs();
9
+ return dayjs(date).isBefore(currentDate);
10
+ };