mm-share-lib 0.0.5 → 0.0.6

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 (247) hide show
  1. package/.eslintrc.js +25 -25
  2. package/.prettierrc +3 -3
  3. package/README.md +73 -73
  4. package/dist/src/exception/index.d.ts +0 -7
  5. package/dist/src/exception/index.js +0 -23
  6. package/dist/src/exception/index.js.map +1 -1
  7. package/index.ts +1 -1
  8. package/nest-cli.json +8 -8
  9. package/package.json +91 -82
  10. package/src/auth/apple/apple.module.ts +10 -0
  11. package/src/auth/apple/apple.service.ts +28 -0
  12. package/src/auth/apple/dto/apple-login.dto.ts +16 -0
  13. package/src/auth/apple/dto/index.ts +1 -0
  14. package/src/auth/apple/index.ts +3 -0
  15. package/src/auth/config/apple.config.ts +18 -0
  16. package/src/auth/config/auth.config.ts +29 -0
  17. package/src/auth/config/facebook.config.ts +23 -0
  18. package/src/auth/config/file.config.ts +50 -0
  19. package/src/auth/config/google.config.ts +23 -0
  20. package/src/auth/config/index.ts +6 -0
  21. package/src/auth/config/twitter.config.ts +22 -0
  22. package/src/auth/facebook/dto/facebook-login.dto.ts +8 -0
  23. package/src/auth/facebook/dto/index.ts +1 -0
  24. package/src/auth/facebook/facebook.module.ts +11 -0
  25. package/src/auth/facebook/facebook.service.ts +51 -0
  26. package/src/auth/facebook/index.ts +4 -0
  27. package/src/auth/facebook/interface/facebook.interface.ts +6 -0
  28. package/src/auth/facebook/interface/index.ts +1 -0
  29. package/src/auth/google/dto/google-login.dto.ts +8 -0
  30. package/src/auth/google/dto/index.ts +1 -0
  31. package/src/auth/google/google.module.ts +10 -0
  32. package/src/auth/google/google.service.ts +51 -0
  33. package/src/auth/google/index.ts +3 -0
  34. package/src/auth/index.ts +5 -0
  35. package/src/auth/twitter/dto/index.ts +1 -0
  36. package/src/auth/twitter/dto/twitter-login.dto.ts +12 -0
  37. package/src/auth/twitter/index.ts +3 -0
  38. package/src/auth/twitter/twitter.module.ts +11 -0
  39. package/src/auth/twitter/twitter.service.ts +43 -0
  40. package/src/config/index.ts +1 -0
  41. package/src/config/type.config.ts +88 -0
  42. package/src/constant/entity-state.constant.ts +4 -4
  43. package/src/constant/index.ts +1 -1
  44. package/src/dto/base-filter.dto.ts +4 -4
  45. package/src/dto/index.ts +2 -2
  46. package/src/dto/pagination.dto.ts +16 -4
  47. package/src/filter/index.ts +1 -1
  48. package/src/filter/rpc-exception.filter.ts +15 -0
  49. package/src/generic/entity/entity.generic.ts +34 -34
  50. package/src/generic/entity/index.ts +1 -1
  51. package/src/generic/index.ts +2 -2
  52. package/src/generic/service/index.ts +1 -1
  53. package/src/generic/service/service.generic.ts +112 -112
  54. package/src/index.ts +1 -0
  55. package/src/interface/index.ts +1 -0
  56. package/src/interface/social.interface.ts +6 -0
  57. package/src/lib/index.ts +3 -1
  58. package/src/lib/mailer/config/index.ts +1 -0
  59. package/src/lib/mailer/config/mailer.config.ts +62 -0
  60. package/src/lib/mailer/index.ts +2 -0
  61. package/src/lib/mailer/mailer.module.ts +8 -0
  62. package/src/lib/mailer/mailer.service.ts +53 -0
  63. package/src/lib/search-engine/document/base.document.ts +3 -3
  64. package/src/lib/search-engine/index.ts +1 -1
  65. package/src/lib/search-engine/interface/index.ts +1 -1
  66. package/src/lib/search-engine/interface/search-document.interface.ts +13 -5
  67. package/src/lib/search-engine/interface/transform-service.interface.ts +10 -10
  68. package/src/lib/search-engine/schema/generic.schema.ts +1 -1
  69. package/src/lib/search-engine/schema/index.ts +1 -1
  70. package/src/lib/search-engine/typesense/collection/index.ts +1 -0
  71. package/src/lib/search-engine/typesense/document/index.ts +1 -0
  72. package/src/lib/search-engine/typesense/index.ts +4 -3
  73. package/src/lib/search-engine/typesense/metadata/index.ts +1 -1
  74. package/src/lib/search-engine/typesense/metadata/schema.metadata.ts +13 -13
  75. package/src/lib/search-engine/typesense/metadata/typesense.metadata-registry.ts +28 -28
  76. package/src/lib/search-engine/typesense/service/client.service.ts +260 -258
  77. package/src/lib/search-engine/typesense/typesense-module.interface.ts +36 -36
  78. package/src/lib/search-engine/typesense/typesense.constants.ts +1 -1
  79. package/src/lib/search-engine/typesense/typesense.module.test.ts +94 -94
  80. package/src/lib/search-engine/typesense/typesense.module.ts +76 -76
  81. package/src/lib/search-engine/typesense/typesense.providers.ts +42 -42
  82. package/src/lib/storage/index.ts +0 -0
  83. package/src/lib/typesense/client/index.ts +1 -0
  84. package/src/lib/typesense/collection/index.ts +1 -0
  85. package/src/lib/typesense/decorator/field.decorator.spec.ts +89 -0
  86. package/src/lib/typesense/decorator/field.decorator.ts +44 -0
  87. package/src/lib/typesense/decorator/index.ts +2 -0
  88. package/src/lib/typesense/decorator/schema.decorator.ts +23 -0
  89. package/src/lib/typesense/document/base.document.ts +3 -0
  90. package/src/lib/typesense/index.ts +6 -0
  91. package/src/lib/typesense/metadata/index.ts +4 -0
  92. package/src/lib/typesense/metadata/schema.metadata.ts +21 -0
  93. package/src/lib/typesense/metadata/typesense.metadata-accessor.ts +37 -0
  94. package/src/lib/typesense/metadata/typesense.metadata-explorer.spec.ts +56 -0
  95. package/src/lib/typesense/metadata/typesense.metadata-explorer.ts +41 -0
  96. package/src/lib/typesense/metadata/typesense.metadata-registry.ts +28 -0
  97. package/src/lib/typesense/module/index.ts +4 -0
  98. package/src/lib/typesense/module/interface.module.ts +34 -0
  99. package/src/lib/typesense/module/typesense.constant.ts +1 -0
  100. package/src/lib/typesense/module/typesense.module.spec.ts +94 -0
  101. package/src/lib/typesense/module/typesense.module.ts +87 -0
  102. package/src/lib/typesense/module/typesense.provider.ts +54 -0
  103. package/src/response/base-entity.response.ts +8 -0
  104. package/src/response/index.ts +2 -1
  105. package/src/response/login.response.ts +0 -0
  106. package/src/response/pagination.response.ts +52 -37
  107. package/src/setup/index.ts +1 -1
  108. package/src/util/date.util.spec.ts +49 -49
  109. package/src/util/date.util.ts +10 -10
  110. package/src/util/generator.util.spec.ts +79 -79
  111. package/src/util/generator.util.ts +34 -34
  112. package/src/util/index.ts +4 -3
  113. package/src/util/validate-config.ts +20 -0
  114. package/test/app.e2e-spec.ts +24 -24
  115. package/test/jest-e2e.json +9 -9
  116. package/tsconfig.build.json +4 -4
  117. package/tsconfig.json +21 -21
  118. package/dist/index.d.ts +0 -1
  119. package/dist/index.js +0 -18
  120. package/dist/index.js.map +0 -1
  121. package/dist/src/dto/base-filter.dto.d.ts +0 -4
  122. package/dist/src/dto/base-filter.dto.js +0 -11
  123. package/dist/src/dto/base-filter.dto.js.map +0 -1
  124. package/dist/src/dto/index.d.ts +0 -2
  125. package/dist/src/dto/index.js +0 -19
  126. package/dist/src/dto/index.js.map +0 -1
  127. package/dist/src/dto/pagination.dto.d.ts +0 -4
  128. package/dist/src/dto/pagination.dto.js +0 -11
  129. package/dist/src/dto/pagination.dto.js.map +0 -1
  130. package/dist/src/exception/bad-request-error.exception.d.ts +0 -4
  131. package/dist/src/exception/bad-request-error.exception.js +0 -12
  132. package/dist/src/exception/bad-request-error.exception.js.map +0 -1
  133. package/dist/src/exception/base.exception.d.ts +0 -21
  134. package/dist/src/exception/base.exception.js +0 -16
  135. package/dist/src/exception/base.exception.js.map +0 -1
  136. package/dist/src/exception/conflict-error.exception.d.ts +0 -4
  137. package/dist/src/exception/conflict-error.exception.js +0 -12
  138. package/dist/src/exception/conflict-error.exception.js.map +0 -1
  139. package/dist/src/exception/forbidden-error.exception.d.ts +0 -4
  140. package/dist/src/exception/forbidden-error.exception.js +0 -12
  141. package/dist/src/exception/forbidden-error.exception.js.map +0 -1
  142. package/dist/src/exception/internal-server-error.exception.d.ts +0 -4
  143. package/dist/src/exception/internal-server-error.exception.js +0 -12
  144. package/dist/src/exception/internal-server-error.exception.js.map +0 -1
  145. package/dist/src/exception/not-found-error.exception.d.ts +0 -4
  146. package/dist/src/exception/not-found-error.exception.js +0 -12
  147. package/dist/src/exception/not-found-error.exception.js.map +0 -1
  148. package/dist/src/exception/unauthorized-error.exception.d.ts +0 -4
  149. package/dist/src/exception/unauthorized-error.exception.js +0 -12
  150. package/dist/src/exception/unauthorized-error.exception.js.map +0 -1
  151. package/dist/src/filter/http-exception.filter.d.ts +0 -4
  152. package/dist/src/filter/http-exception.filter.js +0 -27
  153. package/dist/src/filter/http-exception.filter.js.map +0 -1
  154. package/dist/src/filter/index.d.ts +0 -1
  155. package/dist/src/filter/index.js +0 -18
  156. package/dist/src/filter/index.js.map +0 -1
  157. package/dist/src/index.d.ts +0 -8
  158. package/dist/src/index.js +0 -25
  159. package/dist/src/index.js.map +0 -1
  160. package/dist/src/lib/index.d.ts +0 -1
  161. package/dist/src/lib/index.js +0 -18
  162. package/dist/src/lib/index.js.map +0 -1
  163. package/dist/src/lib/search-engine/document/base.document.d.ts +0 -3
  164. package/dist/src/lib/search-engine/document/base.document.js +0 -7
  165. package/dist/src/lib/search-engine/document/base.document.js.map +0 -1
  166. package/dist/src/lib/search-engine/document/index.js +0 -18
  167. package/dist/src/lib/search-engine/document/index.js.map +0 -1
  168. package/dist/src/lib/search-engine/index.d.ts +0 -1
  169. package/dist/src/lib/search-engine/index.js +0 -18
  170. package/dist/src/lib/search-engine/index.js.map +0 -1
  171. package/dist/src/lib/search-engine/interface/index.d.ts +0 -2
  172. package/dist/src/lib/search-engine/interface/index.js +0 -19
  173. package/dist/src/lib/search-engine/interface/index.js.map +0 -1
  174. package/dist/src/lib/search-engine/interface/search-document.interface.d.ts +0 -4
  175. package/dist/src/lib/search-engine/interface/search-document.interface.js +0 -3
  176. package/dist/src/lib/search-engine/interface/search-document.interface.js.map +0 -1
  177. package/dist/src/lib/search-engine/interface/transform-service.interface.d.ts +0 -6
  178. package/dist/src/lib/search-engine/interface/transform-service.interface.js +0 -3
  179. package/dist/src/lib/search-engine/interface/transform-service.interface.js.map +0 -1
  180. package/dist/src/lib/search-engine/schema/generic.schema.d.ts +0 -2
  181. package/dist/src/lib/search-engine/schema/generic.schema.js +0 -7
  182. package/dist/src/lib/search-engine/schema/generic.schema.js.map +0 -1
  183. package/dist/src/lib/search-engine/schema/index.d.ts +0 -1
  184. package/dist/src/lib/search-engine/schema/index.js +0 -18
  185. package/dist/src/lib/search-engine/schema/index.js.map +0 -1
  186. package/dist/src/lib/search-engine/typesense/index.d.ts +0 -3
  187. package/dist/src/lib/search-engine/typesense/index.js +0 -20
  188. package/dist/src/lib/search-engine/typesense/index.js.map +0 -1
  189. package/dist/src/lib/search-engine/typesense/metadata/index.d.ts +0 -2
  190. package/dist/src/lib/search-engine/typesense/metadata/index.js +0 -19
  191. package/dist/src/lib/search-engine/typesense/metadata/index.js.map +0 -1
  192. package/dist/src/lib/search-engine/typesense/metadata/schema.metadata.d.ts +0 -12
  193. package/dist/src/lib/search-engine/typesense/metadata/schema.metadata.js +0 -3
  194. package/dist/src/lib/search-engine/typesense/metadata/schema.metadata.js.map +0 -1
  195. package/dist/src/lib/search-engine/typesense/metadata/typesense.metadata-registry.d.ts +0 -10
  196. package/dist/src/lib/search-engine/typesense/metadata/typesense.metadata-registry.js +0 -33
  197. package/dist/src/lib/search-engine/typesense/metadata/typesense.metadata-registry.js.map +0 -1
  198. package/dist/src/lib/search-engine/typesense/service/client.service.d.ts +0 -33
  199. package/dist/src/lib/search-engine/typesense/service/client.service.js +0 -197
  200. package/dist/src/lib/search-engine/typesense/service/client.service.js.map +0 -1
  201. package/dist/src/lib/search-engine/typesense/service/index.d.ts +0 -1
  202. package/dist/src/lib/search-engine/typesense/service/index.js +0 -18
  203. package/dist/src/lib/search-engine/typesense/service/index.js.map +0 -1
  204. package/dist/src/lib/search-engine/typesense/typesense-module.interface.d.ts +0 -27
  205. package/dist/src/lib/search-engine/typesense/typesense-module.interface.js +0 -3
  206. package/dist/src/lib/search-engine/typesense/typesense-module.interface.js.map +0 -1
  207. package/dist/src/lib/search-engine/typesense/typesense.constants.d.ts +0 -1
  208. package/dist/src/lib/search-engine/typesense/typesense.constants.js +0 -5
  209. package/dist/src/lib/search-engine/typesense/typesense.constants.js.map +0 -1
  210. package/dist/src/lib/search-engine/typesense/typesense.module.d.ts +0 -8
  211. package/dist/src/lib/search-engine/typesense/typesense.module.js +0 -68
  212. package/dist/src/lib/search-engine/typesense/typesense.module.js.map +0 -1
  213. package/dist/src/lib/search-engine/typesense/typesense.module.test.d.ts +0 -1
  214. package/dist/src/lib/search-engine/typesense/typesense.module.test.js +0 -89
  215. package/dist/src/lib/search-engine/typesense/typesense.module.test.js.map +0 -1
  216. package/dist/src/lib/search-engine/typesense/typesense.providers.d.ts +0 -4
  217. package/dist/src/lib/search-engine/typesense/typesense.providers.js +0 -40
  218. package/dist/src/lib/search-engine/typesense/typesense.providers.js.map +0 -1
  219. package/dist/src/response/index.d.ts +0 -1
  220. package/dist/src/response/index.js +0 -18
  221. package/dist/src/response/index.js.map +0 -1
  222. package/dist/src/response/pagination.response.d.ts +0 -17
  223. package/dist/src/response/pagination.response.js +0 -29
  224. package/dist/src/response/pagination.response.js.map +0 -1
  225. package/dist/src/setup/index.d.ts +0 -1
  226. package/dist/src/setup/index.js +0 -18
  227. package/dist/src/setup/index.js.map +0 -1
  228. package/dist/src/setup/microservice.setup.d.ts +0 -2
  229. package/dist/src/setup/microservice.setup.js +0 -25
  230. package/dist/src/setup/microservice.setup.js.map +0 -1
  231. package/dist/src/setup/swagger.setup.js +0 -1
  232. package/dist/src/setup/swagger.setup.js.map +0 -1
  233. package/dist/src/util/app.utils.d.ts +0 -4
  234. package/dist/src/util/app.utils.js +0 -21
  235. package/dist/src/util/app.utils.js.map +0 -1
  236. package/dist/src/util/date.util.d.ts +0 -2
  237. package/dist/src/util/date.util.js +0 -14
  238. package/dist/src/util/date.util.js.map +0 -1
  239. package/dist/src/util/generator.util.d.ts +0 -4
  240. package/dist/src/util/generator.util.js +0 -29
  241. package/dist/src/util/generator.util.js.map +0 -1
  242. package/dist/src/util/index.d.ts +0 -3
  243. package/dist/src/util/index.js +0 -20
  244. package/dist/src/util/index.js.map +0 -1
  245. package/dist/tsconfig.build.tsbuildinfo +0 -1
  246. /package/{dist/src/setup/swagger.setup.d.ts → src/lib/redis/index.ts} +0 -0
  247. /package/{dist/src/lib/search-engine/document/index.d.ts → src/lib/typesense/document/index.ts} +0 -0
@@ -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
- 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
- }
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,3 +1,4 @@
1
+ export * from './auth';
1
2
  export * from './generic';
2
3
  export * from './constant';
3
4
  export * from './dto';
@@ -0,0 +1 @@
1
+ export * from './social.interface';
@@ -0,0 +1,6 @@
1
+ export interface SocialInterface {
2
+ id: string;
3
+ firstName?: string;
4
+ lastName?: string;
5
+ email?: string;
6
+ }
package/src/lib/index.ts CHANGED
@@ -1 +1,3 @@
1
- export * from './search-engine';
1
+ export * from './search-engine';
2
+ export * from './mailer';
3
+ export * from './typesense';
@@ -0,0 +1 @@
1
+ export * from './mailer.config';
@@ -0,0 +1,62 @@
1
+ import { registerAs } from '@nestjs/config';
2
+ import {
3
+ IsString,
4
+ IsInt,
5
+ Min,
6
+ Max,
7
+ IsOptional,
8
+ IsBoolean,
9
+ IsEmail,
10
+ } from 'class-validator';
11
+ import { validateConfig } from '../../../util';
12
+ import { MailConfig } from '../../../config';
13
+
14
+ class EnvironmentVariablesValidator {
15
+ @IsInt()
16
+ @Min(0)
17
+ @Max(65535)
18
+ @IsOptional()
19
+ MAIL_PORT: number;
20
+
21
+ @IsString()
22
+ MAIL_HOST: string;
23
+
24
+ @IsString()
25
+ @IsOptional()
26
+ MAIL_USER: string;
27
+
28
+ @IsString()
29
+ @IsOptional()
30
+ MAIL_PASSWORD: string;
31
+
32
+ @IsEmail()
33
+ MAIL_DEFAULT_EMAIL: string;
34
+
35
+ @IsString()
36
+ MAIL_DEFAULT_NAME: string;
37
+
38
+ @IsBoolean()
39
+ MAIL_IGNORE_TLS: boolean;
40
+
41
+ @IsBoolean()
42
+ MAIL_SECURE: boolean;
43
+
44
+ @IsBoolean()
45
+ MAIL_REQUIRE_TLS: boolean;
46
+ }
47
+
48
+ export default registerAs<MailConfig>('mail', () => {
49
+ validateConfig(process.env, EnvironmentVariablesValidator);
50
+
51
+ return {
52
+ port: process.env.MAIL_PORT ? parseInt(process.env.MAIL_PORT, 10) : 587,
53
+ host: process.env.MAIL_HOST,
54
+ user: process.env.MAIL_USER,
55
+ password: process.env.MAIL_PASSWORD,
56
+ defaultEmail: process.env.MAIL_DEFAULT_EMAIL,
57
+ defaultName: process.env.MAIL_DEFAULT_NAME,
58
+ ignoreTLS: process.env.MAIL_IGNORE_TLS === 'true',
59
+ secure: process.env.MAIL_SECURE === 'true',
60
+ requireTLS: process.env.MAIL_REQUIRE_TLS === 'true',
61
+ };
62
+ });
@@ -0,0 +1,2 @@
1
+ export * from './mailer.module';
2
+ export * from './mailer.service';
@@ -0,0 +1,8 @@
1
+ import { Module } from '@nestjs/common';
2
+ import { MailerService } from './mailer.service';
3
+
4
+ @Module({
5
+ providers: [MailerService],
6
+ exports: [MailerService],
7
+ })
8
+ export class MailerModule {}
@@ -0,0 +1,53 @@
1
+ import fs from 'node:fs/promises';
2
+ import Handlebars from 'handlebars';
3
+ import nodemailer from 'nodemailer';
4
+ import { Injectable } from '@nestjs/common';
5
+ import { ConfigService } from '@nestjs/config';
6
+ import { AllConfigType } from '../../config';
7
+
8
+ @Injectable()
9
+ export class MailerService {
10
+ private readonly transporter: nodemailer.Transporter;
11
+ constructor(private readonly configService: ConfigService<AllConfigType>) {
12
+ this.transporter = nodemailer.createTransport({
13
+ host: configService.get('mail.host', { infer: true }),
14
+ port: configService.get('mail.port', { infer: true }),
15
+ ignoreTLS: configService.get('mail.ignoreTLS', { infer: true }),
16
+ secure: configService.get('mail.secure', { infer: true }),
17
+ requireTLS: configService.get('mail.requireTLS', { infer: true }),
18
+ auth: {
19
+ user: configService.get('mail.user', { infer: true }),
20
+ pass: configService.get('mail.password', { infer: true }),
21
+ },
22
+ });
23
+ }
24
+
25
+ async sendMail({
26
+ templatePath,
27
+ context,
28
+ ...mailOptions
29
+ }: nodemailer.SendMailOptions & {
30
+ templatePath: string;
31
+ context: Record<string, unknown>;
32
+ }): Promise<void> {
33
+ let html: string | undefined;
34
+ if (templatePath) {
35
+ const template = await fs.readFile(templatePath, 'utf-8');
36
+ html = Handlebars.compile(template, {
37
+ strict: true,
38
+ })(context);
39
+ }
40
+
41
+ await this.transporter.sendMail({
42
+ ...mailOptions,
43
+ from: mailOptions.from
44
+ ? mailOptions.from
45
+ : `"${this.configService.get('mail.defaultName', {
46
+ infer: true,
47
+ })}" <${this.configService.get('mail.defaultEmail', {
48
+ infer: true,
49
+ })}>`,
50
+ html: mailOptions.html ? mailOptions.html : html,
51
+ });
52
+ }
53
+ }
@@ -1,3 +1,3 @@
1
- export class BaseDocument {
2
- id: string;
3
- }
1
+ export class BaseDocument {
2
+ id?: string;
3
+ }
@@ -1 +1 @@
1
- export * from 'typesense';
1
+ export * from 'typesense';
@@ -1,2 +1,2 @@
1
- export * from './search-document.interface';
1
+ export * from './search-document.interface';
2
2
  export * from './transform-service.interface';
@@ -1,5 +1,13 @@
1
- import { SearchOptions, SearchParams, SearchResponse, DocumentSchema } from 'typesense/lib/Typesense/Documents';
2
-
3
- export interface SearchDocumentService<Document extends DocumentSchema> {
4
- searchDocument(searchParameters: SearchParams, options: SearchOptions): Promise<SearchResponse<any>>;
5
- }
1
+ import {
2
+ SearchOptions,
3
+ SearchParams,
4
+ SearchResponse,
5
+ DocumentSchema,
6
+ } from 'typesense/lib/Typesense/Documents';
7
+
8
+ export interface SearchDocumentService<Document extends DocumentSchema> {
9
+ searchDocument(
10
+ searchParameters: SearchParams,
11
+ options: SearchOptions,
12
+ ): Promise<SearchResponse<Document>>;
13
+ }
@@ -1,10 +1,10 @@
1
- import { EntityGeneric } from '../../../generic';
2
- import { BaseDocument } from '../document';
3
-
4
- export interface TransformerService<
5
- T extends EntityGeneric,
6
- Document extends BaseDocument,
7
- > {
8
- transform(data: T): Document;
9
- transforms(datas: T[]): Document[];
10
- }
1
+ import { EntityGeneric } from '../../../generic';
2
+ import { BaseDocument } from '../document';
3
+
4
+ export interface TransformerService<
5
+ T extends EntityGeneric,
6
+ Document extends BaseDocument,
7
+ > {
8
+ transform(data: T): Document;
9
+ transforms(datas: T[]): Document[];
10
+ }
@@ -1 +1 @@
1
- export class GenericSchema {}
1
+ export class GenericSchema {}
@@ -1 +1 @@
1
- export * from './generic.schema';
1
+ export * from './generic.schema';
@@ -0,0 +1 @@
1
+ export * from 'typesense/lib/Typesense/Collections';
@@ -0,0 +1 @@
1
+ export * from 'typesense/lib/Typesense/Documents';
@@ -1,3 +1,4 @@
1
- export * from './typesense.module';
2
- export * from './metadata';
3
- export * from './service';
1
+ export * from './typesense.module';
2
+ export * from './metadata';
3
+ export * from './service';
4
+ export * from './document';
@@ -1,2 +1,2 @@
1
- export * from './schema.metadata';
1
+ export * from './schema.metadata';
2
2
  export * from './typesense.metadata-registry';
@@ -1,13 +1,13 @@
1
- export interface SchemaField {
2
- name: string;
3
- type: string;
4
- facet?: boolean;
5
- index?: boolean;
6
- optional?: boolean;
7
- }
8
-
9
- export interface Schema {
10
- name: string;
11
- defaultSortingField: string;
12
- fields: Array<SchemaField>;
13
- }
1
+ export interface SchemaField {
2
+ name: string;
3
+ type: string;
4
+ facet?: boolean;
5
+ index?: boolean;
6
+ optional?: boolean;
7
+ }
8
+
9
+ export interface Schema {
10
+ name: string;
11
+ defaultSortingField: string;
12
+ fields: Array<SchemaField>;
13
+ }
@@ -1,28 +1,28 @@
1
- import { Injectable, Logger } from '@nestjs/common'
2
-
3
- import { Schema } from './schema.metadata'
4
-
5
- type Constructor = new (...args: any[]) => Record<string, unknown> // {}
6
-
7
- @Injectable()
8
- export class TypesenseMetadataRegistry {
9
- private logger = new Logger(TypesenseMetadataRegistry.name)
10
-
11
- private schemas: Map<Constructor, Schema> = new Map()
12
-
13
- addSchema(target: Constructor, schema: Schema) {
14
- if (this.schemas.has(target)) {
15
- this.logger.warn(`Schema ${target} already exists`)
16
- }
17
-
18
- this.schemas.set(target, schema)
19
- }
20
-
21
- getSchemaByTarget(target: Constructor) {
22
- return this.schemas.get(target)
23
- }
24
-
25
- getTargets() {
26
- return this.schemas.keys()
27
- }
28
- }
1
+ import { Injectable, Logger } from '@nestjs/common'
2
+
3
+ import { Schema } from './schema.metadata'
4
+
5
+ type Constructor = new (...args: any[]) => Record<string, unknown> // {}
6
+
7
+ @Injectable()
8
+ export class TypesenseMetadataRegistry {
9
+ private logger = new Logger(TypesenseMetadataRegistry.name)
10
+
11
+ private schemas: Map<Constructor, Schema> = new Map()
12
+
13
+ addSchema(target: Constructor, schema: Schema) {
14
+ if (this.schemas.has(target)) {
15
+ this.logger.warn(`Schema ${target} already exists`)
16
+ }
17
+
18
+ this.schemas.set(target, schema)
19
+ }
20
+
21
+ getSchemaByTarget(target: Constructor) {
22
+ return this.schemas.get(target)
23
+ }
24
+
25
+ getTargets() {
26
+ return this.schemas.keys()
27
+ }
28
+ }