@bytebrand/export-cars 0.0.3 → 1.0.8

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 (330) hide show
  1. package/.editorconfig +8 -0
  2. package/.eslintignore +1 -0
  3. package/.eslintrc.js +24 -0
  4. package/.prettierrc.js +7 -0
  5. package/README.md +67 -0
  6. package/dist/app.module.d.ts +2 -0
  7. package/dist/app.module.js +47 -0
  8. package/dist/app.module.js.map +1 -0
  9. package/dist/config/as24.config.d.ts +5 -0
  10. package/dist/config/as24.config.js +13 -0
  11. package/dist/config/as24.config.js.map +1 -0
  12. package/dist/config/auto24.config.d.ts +6 -0
  13. package/dist/config/auto24.config.js +31 -0
  14. package/dist/config/auto24.config.js.map +1 -0
  15. package/dist/config/autoboerse.config.d.ts +5 -0
  16. package/dist/config/autoboerse.config.js +15 -0
  17. package/dist/config/autoboerse.config.js.map +1 -0
  18. package/dist/config/autouncle.config.d.ts +5 -0
  19. package/dist/config/autouncle.config.js +14 -0
  20. package/dist/config/autouncle.config.js.map +1 -0
  21. package/dist/config/by-owner.config.d.ts +5 -0
  22. package/dist/config/by-owner.config.js +14 -0
  23. package/dist/config/by-owner.config.js.map +1 -0
  24. package/dist/config/config.d.ts +57 -0
  25. package/dist/config/config.js +78 -0
  26. package/dist/config/config.js.map +1 -0
  27. package/dist/config/eauto.config.d.ts +5 -0
  28. package/dist/config/eauto.config.js +15 -0
  29. package/dist/config/eauto.config.js.map +1 -0
  30. package/dist/config/fb.config.d.ts +5 -0
  31. package/dist/config/fb.config.js +14 -0
  32. package/dist/config/fb.config.js.map +1 -0
  33. package/dist/config/google.config.d.ts +5 -0
  34. package/dist/config/google.config.js +13 -0
  35. package/dist/config/google.config.js.map +1 -0
  36. package/dist/config/marktde.config.d.ts +5 -0
  37. package/dist/config/marktde.config.js +14 -0
  38. package/dist/config/marktde.config.js.map +1 -0
  39. package/dist/config/meinstadt.config.d.ts +5 -0
  40. package/dist/config/meinstadt.config.js +14 -0
  41. package/dist/config/meinstadt.config.js.map +1 -0
  42. package/dist/config/ooyyo.config.d.ts +5 -0
  43. package/dist/config/ooyyo.config.js +14 -0
  44. package/dist/config/ooyyo.config.js.map +1 -0
  45. package/dist/config/yescar.config.d.ts +5 -0
  46. package/dist/config/yescar.config.js +14 -0
  47. package/dist/config/yescar.config.js.map +1 -0
  48. package/dist/constants/autouncle.contants.d.ts +4 -0
  49. package/dist/constants/autouncle.contants.js +8 -0
  50. package/dist/constants/autouncle.contants.js.map +1 -0
  51. package/dist/constants/fb.constants.d.ts +7 -0
  52. package/dist/constants/fb.constants.js +11 -0
  53. package/dist/constants/fb.constants.js.map +1 -0
  54. package/dist/constants/rule-input.contants.d.ts +3 -0
  55. package/dist/constants/rule-input.contants.js +7 -0
  56. package/dist/constants/rule-input.contants.js.map +1 -0
  57. package/dist/enums/environment.enum.d.ts +5 -0
  58. package/dist/enums/environment.enum.js +10 -0
  59. package/dist/enums/environment.enum.js.map +1 -0
  60. package/dist/enums/export-type.enum.d.ts +14 -0
  61. package/dist/enums/export-type.enum.js +19 -0
  62. package/dist/enums/export-type.enum.js.map +1 -0
  63. package/dist/export.command.d.ts +11 -0
  64. package/dist/export.command.js +47 -0
  65. package/dist/export.command.js.map +1 -0
  66. package/dist/export.schema.d.ts +65 -0
  67. package/dist/export.schema.js +70 -0
  68. package/dist/export.schema.js.map +1 -0
  69. package/dist/exporters/as24.exporter.d.ts +13 -0
  70. package/dist/exporters/as24.exporter.js +68 -0
  71. package/dist/exporters/as24.exporter.js.map +1 -0
  72. package/dist/exporters/auto24.exporter.d.ts +13 -0
  73. package/dist/exporters/auto24.exporter.js +81 -0
  74. package/dist/exporters/auto24.exporter.js.map +1 -0
  75. package/dist/exporters/autouncle.exporter.d.ts +15 -0
  76. package/dist/exporters/autouncle.exporter.js +79 -0
  77. package/dist/exporters/autouncle.exporter.js.map +1 -0
  78. package/dist/exporters/by-owner.exporter.d.ts +11 -0
  79. package/dist/exporters/by-owner.exporter.js +58 -0
  80. package/dist/exporters/by-owner.exporter.js.map +1 -0
  81. package/dist/exporters/fb.exporter.d.ts +15 -0
  82. package/dist/exporters/fb.exporter.js +67 -0
  83. package/dist/exporters/fb.exporter.js.map +1 -0
  84. package/dist/exporters/google.exporter.d.ts +15 -0
  85. package/dist/exporters/google.exporter.js +67 -0
  86. package/dist/exporters/google.exporter.js.map +1 -0
  87. package/dist/exporters/meinstadt.exporter.d.ts +15 -0
  88. package/dist/exporters/meinstadt.exporter.js +84 -0
  89. package/dist/exporters/meinstadt.exporter.js.map +1 -0
  90. package/dist/exporters/mobile.exporter.d.ts +18 -0
  91. package/dist/exporters/mobile.exporter.js +111 -0
  92. package/dist/exporters/mobile.exporter.js.map +1 -0
  93. package/dist/exporters/ooyyo.exporter.d.ts +13 -0
  94. package/dist/exporters/ooyyo.exporter.js +65 -0
  95. package/dist/exporters/ooyyo.exporter.js.map +1 -0
  96. package/dist/formats/auto24-xml.builder.d.ts +7 -0
  97. package/dist/formats/auto24-xml.builder.js +47 -0
  98. package/dist/formats/auto24-xml.builder.js.map +1 -0
  99. package/dist/formats/autouncle-json.builder.d.ts +7 -0
  100. package/dist/formats/autouncle-json.builder.js +21 -0
  101. package/dist/formats/autouncle-json.builder.js.map +1 -0
  102. package/dist/formats/fb-xml.builder.d.ts +11 -0
  103. package/dist/formats/fb-xml.builder.js +63 -0
  104. package/dist/formats/fb-xml.builder.js.map +1 -0
  105. package/dist/formats/google-xml.builder.d.ts +8 -0
  106. package/dist/formats/google-xml.builder.js +32 -0
  107. package/dist/formats/google-xml.builder.js.map +1 -0
  108. package/dist/formats/meinstadt-json.builder.d.ts +7 -0
  109. package/dist/formats/meinstadt-json.builder.js +22 -0
  110. package/dist/formats/meinstadt-json.builder.js.map +1 -0
  111. package/dist/formats/ooyyo-xml.builder.d.ts +7 -0
  112. package/dist/formats/ooyyo-xml.builder.js +47 -0
  113. package/dist/formats/ooyyo-xml.builder.js.map +1 -0
  114. package/dist/input.questions.d.ts +3 -0
  115. package/dist/input.questions.js +32 -0
  116. package/dist/input.questions.js.map +1 -0
  117. package/dist/interfaces/description.interface.d.ts +22 -0
  118. package/dist/interfaces/description.interface.js +3 -0
  119. package/dist/interfaces/description.interface.js.map +1 -0
  120. package/dist/interfaces/export-item.interface.d.ts +147 -0
  121. package/dist/interfaces/export-item.interface.js +3 -0
  122. package/dist/interfaces/export-item.interface.js.map +1 -0
  123. package/dist/interfaces/exporter.interface.d.ts +3 -0
  124. package/dist/interfaces/exporter.interface.js +3 -0
  125. package/dist/interfaces/exporter.interface.js.map +1 -0
  126. package/dist/interfaces/input.interface.d.ts +5 -0
  127. package/dist/interfaces/input.interface.js +3 -0
  128. package/dist/interfaces/input.interface.js.map +1 -0
  129. package/dist/interfaces/mapping-rules.interface.d.ts +10 -0
  130. package/dist/interfaces/mapping-rules.interface.js +3 -0
  131. package/dist/interfaces/mapping-rules.interface.js.map +1 -0
  132. package/dist/interfaces/params.interface.d.ts +18 -0
  133. package/dist/interfaces/params.interface.js +3 -0
  134. package/dist/interfaces/params.interface.js.map +1 -0
  135. package/dist/interfaces/rule-parser.interface.d.ts +3 -0
  136. package/dist/interfaces/rule-parser.interface.js +3 -0
  137. package/dist/interfaces/rule-parser.interface.js.map +1 -0
  138. package/dist/main.d.ts +1 -0
  139. package/dist/main.js +23 -0
  140. package/dist/main.js.map +1 -0
  141. package/dist/rules/abstract.rule.d.ts +13 -0
  142. package/dist/rules/abstract.rule.js +32 -0
  143. package/dist/rules/abstract.rule.js.map +1 -0
  144. package/dist/rules/date.rule.d.ts +7 -0
  145. package/dist/rules/date.rule.js +20 -0
  146. package/dist/rules/date.rule.js.map +1 -0
  147. package/dist/rules/number.rule.d.ts +7 -0
  148. package/dist/rules/number.rule.js +16 -0
  149. package/dist/rules/number.rule.js.map +1 -0
  150. package/dist/rules/string.rule.d.ts +5 -0
  151. package/dist/rules/string.rule.js +11 -0
  152. package/dist/rules/string.rule.js.map +1 -0
  153. package/dist/services/car.service.d.ts +24 -0
  154. package/dist/services/car.service.js +74 -0
  155. package/dist/services/car.service.js.map +1 -0
  156. package/dist/services/config.service.d.ts +6 -0
  157. package/dist/services/config.service.js +24 -0
  158. package/dist/services/config.service.js.map +1 -0
  159. package/dist/services/loader.service.d.ts +9 -0
  160. package/dist/services/loader.service.js +45 -0
  161. package/dist/services/loader.service.js.map +1 -0
  162. package/dist/services/mapping.service.d.ts +11 -0
  163. package/dist/services/mapping.service.js +73 -0
  164. package/dist/services/mapping.service.js.map +1 -0
  165. package/dist/services/marketing-images.service.d.ts +16 -0
  166. package/dist/services/marketing-images.service.js +58 -0
  167. package/dist/services/marketing-images.service.js.map +1 -0
  168. package/dist/services/request.service.d.ts +12 -0
  169. package/dist/services/request.service.js +48 -0
  170. package/dist/services/request.service.js.map +1 -0
  171. package/dist/services/rules.service.d.ts +15 -0
  172. package/dist/services/rules.service.js +68 -0
  173. package/dist/services/rules.service.js.map +1 -0
  174. package/dist/services/user.service.d.ts +11 -0
  175. package/dist/services/user.service.js +64 -0
  176. package/dist/services/user.service.js.map +1 -0
  177. package/dist/transformers/as24.transformer.d.ts +28 -0
  178. package/dist/transformers/as24.transformer.js +217 -0
  179. package/dist/transformers/as24.transformer.js.map +1 -0
  180. package/dist/transformers/auto24.transfomer.d.ts +16 -0
  181. package/dist/transformers/auto24.transfomer.js +155 -0
  182. package/dist/transformers/auto24.transfomer.js.map +1 -0
  183. package/dist/transformers/autouncle.transformer.d.ts +32 -0
  184. package/dist/transformers/autouncle.transformer.js +234 -0
  185. package/dist/transformers/autouncle.transformer.js.map +1 -0
  186. package/dist/transformers/by-owner.transformer.d.ts +12 -0
  187. package/dist/transformers/by-owner.transformer.js +274 -0
  188. package/dist/transformers/by-owner.transformer.js.map +1 -0
  189. package/dist/transformers/fb-description.transformer.d.ts +19 -0
  190. package/dist/transformers/fb-description.transformer.js +297 -0
  191. package/dist/transformers/fb-description.transformer.js.map +1 -0
  192. package/dist/transformers/fb-equipment.transformer.d.ts +8 -0
  193. package/dist/transformers/fb-equipment.transformer.js +149 -0
  194. package/dist/transformers/fb-equipment.transformer.js.map +1 -0
  195. package/dist/transformers/fb.transformer.d.ts +41 -0
  196. package/dist/transformers/fb.transformer.js +553 -0
  197. package/dist/transformers/fb.transformer.js.map +1 -0
  198. package/dist/transformers/google.transformer.d.ts +26 -0
  199. package/dist/transformers/google.transformer.js +164 -0
  200. package/dist/transformers/google.transformer.js.map +1 -0
  201. package/dist/transformers/meinstadt.transformer.d.ts +14 -0
  202. package/dist/transformers/meinstadt.transformer.js +95 -0
  203. package/dist/transformers/meinstadt.transformer.js.map +1 -0
  204. package/dist/transformers/mobile.transformer.d.ts +47 -0
  205. package/dist/transformers/mobile.transformer.js +471 -0
  206. package/dist/transformers/mobile.transformer.js.map +1 -0
  207. package/dist/transformers/ooyyo.transformer.d.ts +17 -0
  208. package/dist/transformers/ooyyo.transformer.js +127 -0
  209. package/dist/transformers/ooyyo.transformer.js.map +1 -0
  210. package/dist/tsconfig.build.tsbuildinfo +1 -0
  211. package/dist/utils/converter.utils.d.ts +1 -0
  212. package/dist/utils/converter.utils.js +15 -0
  213. package/dist/utils/converter.utils.js.map +1 -0
  214. package/dist/utils/date-time.utils.d.ts +1 -0
  215. package/dist/utils/date-time.utils.js +21 -0
  216. package/dist/utils/date-time.utils.js.map +1 -0
  217. package/dist/utils/parser.utils.d.ts +2 -0
  218. package/dist/utils/parser.utils.js +9 -0
  219. package/dist/utils/parser.utils.js.map +1 -0
  220. package/dist/utils/validator.utils.d.ts +2 -0
  221. package/dist/utils/validator.utils.js +12 -0
  222. package/dist/utils/validator.utils.js.map +1 -0
  223. package/nest-cli.json +5 -0
  224. package/package.json +57 -31
  225. package/src/app.module.ts +34 -0
  226. package/src/config/as24.config.ts +10 -0
  227. package/src/config/auto24.config.ts +29 -0
  228. package/src/config/autoboerse.config.ts +12 -0
  229. package/src/config/autouncle.config.ts +11 -0
  230. package/src/config/by-owner.config.ts +11 -0
  231. package/src/config/config.ts +87 -0
  232. package/src/config/eauto.config.ts +12 -0
  233. package/src/config/fb.config.ts +11 -0
  234. package/src/config/google.config.ts +10 -0
  235. package/src/config/marktde.config.ts +11 -0
  236. package/src/config/meinstadt.config.ts +11 -0
  237. package/src/config/ooyyo.config.ts +11 -0
  238. package/src/config/yescar.config.ts +11 -0
  239. package/src/constants/autouncle.contants.ts +4 -0
  240. package/src/constants/fb.constants.ts +7 -0
  241. package/src/constants/rule-input.contants.ts +3 -0
  242. package/src/enums/environment.enum.ts +5 -0
  243. package/src/enums/export-type.enum.ts +14 -0
  244. package/src/export.command.ts +33 -0
  245. package/src/export.schema.ts +67 -0
  246. package/src/exporters/as24.exporter.ts +70 -0
  247. package/src/exporters/auto24.exporter.ts +68 -0
  248. package/src/exporters/autouncle.exporter.ts +62 -0
  249. package/src/exporters/by-owner.exporter.ts +45 -0
  250. package/src/exporters/fb.exporter.ts +49 -0
  251. package/src/exporters/google.exporter.ts +48 -0
  252. package/src/exporters/meinstadt.exporter.ts +70 -0
  253. package/src/exporters/mobile.exporter.ts +113 -0
  254. package/src/exporters/ooyyo.exporter.ts +50 -0
  255. package/src/formats/auto24-xml.builder.ts +48 -0
  256. package/src/formats/autouncle-json.builder.ts +20 -0
  257. package/src/formats/fb-xml.builder.ts +71 -0
  258. package/src/formats/google-xml.builder.ts +35 -0
  259. package/src/formats/meinstadt-json.builder.ts +19 -0
  260. package/src/formats/ooyyo-xml.builder.ts +48 -0
  261. package/src/input.questions.ts +12 -0
  262. package/src/interfaces/description.interface.ts +24 -0
  263. package/src/interfaces/export-item.interface.ts +147 -0
  264. package/src/interfaces/exporter.interface.ts +3 -0
  265. package/src/interfaces/input.interface.ts +6 -0
  266. package/src/interfaces/mapping-rules.interface.ts +11 -0
  267. package/src/interfaces/params.interface.ts +19 -0
  268. package/src/interfaces/rule-parser.interface.ts +3 -0
  269. package/src/main.ts +28 -0
  270. package/src/rules/abstract.rule.ts +37 -0
  271. package/src/rules/date.rule.ts +18 -0
  272. package/src/rules/number.rule.ts +15 -0
  273. package/src/rules/string.rule.ts +8 -0
  274. package/src/services/car.service.ts +57 -0
  275. package/src/services/config.service.ts +15 -0
  276. package/src/services/loader.service.ts +30 -0
  277. package/src/services/mapping.service.ts +80 -0
  278. package/src/services/marketing-images.service.ts +67 -0
  279. package/src/services/request.service.ts +44 -0
  280. package/src/services/rules.service.ts +61 -0
  281. package/src/services/user.service.ts +52 -0
  282. package/src/transformers/as24.transformer.ts +225 -0
  283. package/src/transformers/auto24.transfomer.ts +155 -0
  284. package/src/transformers/autouncle.transformer.ts +264 -0
  285. package/src/transformers/by-owner.transformer.ts +364 -0
  286. package/src/transformers/fb-description.transformer.ts +316 -0
  287. package/src/transformers/fb-equipment.transformer.ts +161 -0
  288. package/src/transformers/fb.transformer.ts +640 -0
  289. package/src/transformers/google.transformer.ts +166 -0
  290. package/src/transformers/meinstadt.transformer.ts +80 -0
  291. package/src/transformers/mobile.transformer.ts +495 -0
  292. package/src/transformers/ooyyo.transformer.ts +123 -0
  293. package/src/utils/converter.utils.ts +11 -0
  294. package/src/utils/date-time.utils.ts +20 -0
  295. package/src/utils/parser.utils.ts +6 -0
  296. package/src/utils/validator.utils.ts +7 -0
  297. package/tsconfig.build.json +4 -0
  298. package/tsconfig.json +28 -34
  299. package/.prettierrc +0 -14
  300. package/dist/config/ConfigBuilder.d.ts +0 -4
  301. package/dist/config/ConfigBuilder.js +0 -69
  302. package/dist/config/ConfigBuilder.js.map +0 -1
  303. package/dist/config/index.d.ts +0 -1
  304. package/dist/config/index.js +0 -7
  305. package/dist/config/index.js.map +0 -1
  306. package/dist/index.d.ts +0 -1
  307. package/dist/index.js +0 -46
  308. package/dist/index.js.map +0 -1
  309. package/dist/interfaces/index.d.ts +0 -0
  310. package/dist/interfaces/index.js +0 -1
  311. package/dist/interfaces/index.js.map +0 -1
  312. package/dist/modules/acrhiver/TarArchiver.d.ts +0 -6
  313. package/dist/modules/acrhiver/TarArchiver.js +0 -52
  314. package/dist/modules/acrhiver/TarArchiver.js.map +0 -1
  315. package/dist/modules/acrhiver/index.d.ts +0 -2
  316. package/dist/modules/acrhiver/index.js +0 -7
  317. package/dist/modules/acrhiver/index.js.map +0 -1
  318. package/dist/modules/car-exporter/index.d.ts +0 -2
  319. package/dist/modules/car-exporter/index.js +0 -10
  320. package/dist/modules/car-exporter/index.js.map +0 -1
  321. package/dist/modules/car-loader/index.d.ts +0 -2
  322. package/dist/modules/car-loader/index.js +0 -12
  323. package/dist/modules/car-loader/index.js.map +0 -1
  324. package/index.js +0 -2
  325. package/readme.md +0 -11
  326. package/src/config/ConfigBuilder.ts +0 -69
  327. package/src/config/index.ts +0 -1
  328. package/src/index.ts +0 -44
  329. package/tslint.json +0 -51
  330. package/types/basic-ftp.d.ts +0 -72
@@ -0,0 +1,70 @@
1
+ import { ConfigService } from '../services/config.service';
2
+ import { FsChunkInterface } from '@bytebrand/chunkable';
3
+ import { Exporter } from '../interfaces/exporter.interface';
4
+ import { LoaderService } from '../services/loader.service';
5
+ import { CronicleUtils } from '@bytebrand/cronicle-helper';
6
+ import { Injectable } from '@nestjs/common';
7
+ import { ModuleRef } from '@nestjs/core';
8
+ import { As24Transformer } from '../transformers/as24.transformer';
9
+ import { UserService } from '../services/user.service';
10
+ import { get } from 'lodash';
11
+ import { convertToCSV } from '../utils/converter.utils';
12
+ import { writeFile } from 'fs/promises';
13
+
14
+ @Injectable()
15
+ export class As24Exporter implements Exporter {
16
+ constructor(
17
+ private configService: ConfigService,
18
+ private loaderService: LoaderService,
19
+ private userService: UserService,
20
+ private moduleRef: ModuleRef,
21
+ ) {}
22
+
23
+ async export(): Promise<any> {
24
+ await CronicleUtils.ensureDir(this.configService.config.pathesConfig.localConvertedDirectory);
25
+ await CronicleUtils.emptyDir(this.configService.config.pathesConfig.localConvertedDirectory);
26
+
27
+ const as24Transformer = await this.moduleRef.create(As24Transformer);
28
+ const descriptionSchemas: any = {};
29
+
30
+ for (const dealerId of this.configService.config.dealersList) {
31
+ descriptionSchemas[dealerId] = await this.userService.getDefaultSummaryByDealerId(dealerId);
32
+ }
33
+
34
+ await this.loaderService.process(async (chunk: FsChunkInterface) => {
35
+ if (chunk && chunk.data) {
36
+ for (let i = 0; i < chunk.data.length; i += 1) {
37
+ const data = chunk.data[i];
38
+ const ownerId = get(data.car, 'metaData.ownerId', null);
39
+ if (
40
+ ownerId &&
41
+ this.configService.config.dealersList &&
42
+ this.configService.config.dealersList.includes(ownerId)
43
+ ) {
44
+ const transformedData = await as24Transformer.transform(data.car, descriptionSchemas);
45
+ const transformedDataCSV = `${convertToCSV(transformedData)}\n`;
46
+ await writeFile(
47
+ `${this.configService.config.pathesConfig.localConvertedDirectory}/${ownerId}.csv`,
48
+ Buffer.from(transformedDataCSV),
49
+ { flag: 'a' },
50
+ );
51
+ }
52
+ }
53
+ chunk.data = null;
54
+ }
55
+ });
56
+
57
+ // TODO: filter dealers and zip files
58
+
59
+ // const fileZIP = normalize(
60
+ // `${this.configService.config.pathesConfig.localConvertedDirectory}/${this.configService.config.fileName}.zip`,
61
+ // );
62
+ // const fileCSV = normalize(
63
+ // `${this.configService.config.pathesConfig.localConvertedDirectory}/${this.configService.config.fileName}.csv`,
64
+ // );
65
+
66
+ // if (await CronicleUtils.exists(fileCSV)) {
67
+ // await Zipper.zip({ fileList: [fileCSV], dest: fileZIP });
68
+ // }
69
+ }
70
+ }
@@ -0,0 +1,68 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { CarService } from '../services/car.service';
3
+ import { ConfigService } from '../services/config.service';
4
+ import { FsChunkInterface } from '@bytebrand/chunkable';
5
+ import { Exporter } from '../interfaces/exporter.interface';
6
+ import { LoaderService } from '../services/loader.service';
7
+ import { CronicleUtils } from '@bytebrand/cronicle-helper';
8
+ import { get, toNumber } from 'lodash';
9
+ import { ModuleRef } from '@nestjs/core';
10
+ import { Auto24XmlBuilder } from '../formats/auto24-xml.builder';
11
+ import { Auto24Transformer } from '../transformers/auto24.transfomer';
12
+ import { Zipper } from '@bytebrand/zipper';
13
+
14
+ @Injectable()
15
+ export class Auto24Exporter implements Exporter {
16
+ constructor(
17
+ private carService: CarService,
18
+ private configService: ConfigService,
19
+ private loaderService: LoaderService,
20
+ private moduleRef: ModuleRef,
21
+ ) {}
22
+
23
+ async export(): Promise<void> {
24
+ for (const file of this.configService.config.outputFiles) {
25
+ const exists = await CronicleUtils.exists(file);
26
+ exists && (await CronicleUtils.unlink(file));
27
+ }
28
+
29
+ const [fileCarXml, fileMotoXml, fileNfzXml, fileWomoXml, fileGZ] = this.configService.config.outputFiles;
30
+ console.log(fileCarXml);
31
+ const carsXmlBuilder = new Auto24XmlBuilder(fileCarXml);
32
+ const motoXmlBuilder = new Auto24XmlBuilder(fileMotoXml);
33
+ const nfzXmlBuilder = new Auto24XmlBuilder(fileNfzXml);
34
+ const womoXmlBuilder = new Auto24XmlBuilder(fileWomoXml);
35
+
36
+ await motoXmlBuilder.buildStart();
37
+ await nfzXmlBuilder.buildStart();
38
+ await womoXmlBuilder.buildStart();
39
+
40
+ const auto24Transformer = await this.moduleRef.create(Auto24Transformer);
41
+
42
+ await this.loaderService.process(async (chunk: FsChunkInterface) => {
43
+ if (chunk && chunk.data) {
44
+ if (toNumber(chunk.id) === 0) {
45
+ await carsXmlBuilder.buildStart(chunk.total);
46
+ }
47
+
48
+ for (let i = 0; i < chunk.data.length; i += 1) {
49
+ const data = chunk.data[i];
50
+ const { car, images } = data;
51
+ const ownerId = get(car, 'metaData.ownerId');
52
+ if (this.configService.config.dealersList.indexOf(ownerId) !== -1) {
53
+ await carsXmlBuilder.addItem(auto24Transformer.transform(car, images));
54
+ this.carService.counter.countCar(images);
55
+ }
56
+ }
57
+ chunk.data = null;
58
+ }
59
+ });
60
+
61
+ await carsXmlBuilder.buildEnd();
62
+ await motoXmlBuilder.buildEnd();
63
+ await nfzXmlBuilder.buildEnd();
64
+ await womoXmlBuilder.buildEnd();
65
+
66
+ await Zipper.tar({ dest: fileGZ, fileList: [fileCarXml, fileMotoXml, fileNfzXml, fileWomoXml] });
67
+ }
68
+ }
@@ -0,0 +1,62 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { CarService } from '../services/car.service';
3
+ import { ConfigService } from '../services/config.service';
4
+ import { FsChunkInterface } from '@bytebrand/chunkable';
5
+ import { Exporter } from '../interfaces/exporter.interface';
6
+ import { LoaderService } from '../services/loader.service';
7
+ import { CronicleUtils } from '@bytebrand/cronicle-helper';
8
+ import { ModuleRef } from '@nestjs/core';
9
+ import { AutouncleJsonBuilder } from '../formats/autouncle-json.builder';
10
+ import { AutouncleTransformer } from '../transformers/autouncle.transformer';
11
+ import { get, isNil } from 'lodash';
12
+ import { RulesService } from '../services/rules.service';
13
+
14
+ @Injectable()
15
+ export class AutouncleExporter implements Exporter {
16
+ constructor(
17
+ private carService: CarService,
18
+ private configService: ConfigService,
19
+ private loaderService: LoaderService,
20
+ private rulesService: RulesService,
21
+ private moduleRef: ModuleRef,
22
+ ) {}
23
+
24
+ async export(): Promise<void> {
25
+ const exists = await CronicleUtils.exists(this.configService.config.fileName);
26
+ exists && (await CronicleUtils.unlink(this.configService.config.fileName));
27
+
28
+ const autouncleJsonBuilder = new AutouncleJsonBuilder(this.configService.config.fileName);
29
+ const autouncleTransformer = await this.moduleRef.create(AutouncleTransformer);
30
+
31
+ await autouncleJsonBuilder.buildStart();
32
+
33
+ let firstCar = true;
34
+ await this.loaderService.process(async (chunk: FsChunkInterface) => {
35
+ let chunkData;
36
+ if (this.configService.config.isNewCar) {
37
+ chunkData = chunk.data.filter(
38
+ e => this.carService.filterCar(e, this.rulesService.rules) && this.carService.isCarNew(e),
39
+ );
40
+ } else {
41
+ chunkData = chunk.data.filter(e => this.carService.filterCar(e, this.rulesService.rules));
42
+ }
43
+ chunk.data = null;
44
+ for (const data of chunkData) {
45
+ const ownerId = get(data.car, 'metaData.ownerId', null);
46
+ if (!isNil(ownerId)) {
47
+ const owner = await this.carService.getOwner(ownerId);
48
+ if (owner) {
49
+ const car = await autouncleTransformer.transform({ owner, ...data });
50
+ await autouncleJsonBuilder.addItem(car, firstCar);
51
+ this.carService.counter.countCar(data.images);
52
+ }
53
+ if (firstCar) {
54
+ firstCar = false;
55
+ }
56
+ }
57
+ }
58
+ });
59
+
60
+ await autouncleJsonBuilder.buildEnd();
61
+ }
62
+ }
@@ -0,0 +1,45 @@
1
+ import { ConfigService } from '../services/config.service';
2
+ import { FsChunkInterface } from '@bytebrand/chunkable';
3
+ import { Exporter } from '../interfaces/exporter.interface';
4
+ import { LoaderService } from '../services/loader.service';
5
+ import { CronicleUtils } from '@bytebrand/cronicle-helper';
6
+ import { Injectable } from '@nestjs/common';
7
+ import { ModuleRef } from '@nestjs/core';
8
+ import { ByOwnerTransformer } from '../transformers/by-owner.transformer';
9
+ import { createWriteStream } from 'fs';
10
+ import { DataSchemes } from '@bytebrand/car-schema';
11
+ import { get } from 'lodash';
12
+ const createCsvWriter = require('csv-write-stream');
13
+
14
+ @Injectable()
15
+ export class ByOwnerExporter implements Exporter {
16
+ constructor(
17
+ private configService: ConfigService,
18
+ private loaderService: LoaderService,
19
+ private moduleRef: ModuleRef,
20
+ ) {}
21
+
22
+ async export(): Promise<void> {
23
+ await CronicleUtils.unlinkIfExists(this.configService.config.fileName);
24
+
25
+ const byOwnerTransformer = await this.moduleRef.create(ByOwnerTransformer);
26
+ const csvWriter = createCsvWriter();
27
+ csvWriter.pipe(createWriteStream(this.configService.config.fileName));
28
+
29
+ let index = 0;
30
+ await this.loaderService.process(async (chunk: FsChunkInterface) => {
31
+ chunk.data
32
+ .map(({ car }) => car)
33
+ .filter((car: DataSchemes.Car) => {
34
+ const ownerId = get(car, 'metaData.ownerId');
35
+ return ownerId === this.configService.config.ownerId;
36
+ })
37
+ .map(car => byOwnerTransformer.transform(car, (index += 1)))
38
+ .forEach(car => csvWriter.write(car));
39
+
40
+ chunk.data = null;
41
+ });
42
+
43
+ csvWriter.end();
44
+ }
45
+ }
@@ -0,0 +1,49 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { CarService } from '../services/car.service';
3
+ import { ConfigService } from '../services/config.service';
4
+ import { FsChunkInterface } from '@bytebrand/chunkable';
5
+ import { Exporter } from '../interfaces/exporter.interface';
6
+ import { LoaderService } from '../services/loader.service';
7
+ import { CronicleUtils } from '@bytebrand/cronicle-helper';
8
+ import { get } from 'lodash';
9
+ import { FbXmlBuilder } from '../formats/fb-xml.builder';
10
+ import { ModuleRef } from '@nestjs/core';
11
+ import { FbTransformer } from '../transformers/fb.transformer';
12
+ import { RulesService } from '../services/rules.service';
13
+ import { FbXmlItem } from '../interfaces/export-item.interface';
14
+
15
+ @Injectable()
16
+ export class FbExporter implements Exporter {
17
+ constructor(
18
+ private carService: CarService,
19
+ private configService: ConfigService,
20
+ private rulesService: RulesService,
21
+ private loaderService: LoaderService,
22
+ private moduleRef: ModuleRef,
23
+ ) {}
24
+
25
+ async export(): Promise<void> {
26
+ const exists = await CronicleUtils.exists(this.configService.config.fileName);
27
+ exists && (await CronicleUtils.unlink(this.configService.config.fileName));
28
+
29
+ const fbTransformer = await this.moduleRef.create(FbTransformer);
30
+ const fbXmlBuilder = new FbXmlBuilder(this.configService.config.fileName);
31
+ await fbXmlBuilder.buildStart(this.configService.config.url);
32
+
33
+ await this.loaderService.process(async (chunk: FsChunkInterface) => {
34
+ const chunkData = chunk.data.filter(car => this.carService.filterCar(car, this.rulesService.rules));
35
+ chunk.data = null;
36
+ for (const data of chunkData) {
37
+ const ownerId = get(data.car, 'metaData.ownerId', null);
38
+ const owner = await this.carService.getOwner(ownerId);
39
+ if (owner) {
40
+ const car = await fbTransformer.transform({ owner, ...data });
41
+ await fbXmlBuilder.addItem(car as FbXmlItem);
42
+ this.carService.counter.countCar(data.images);
43
+ }
44
+ }
45
+ });
46
+
47
+ await fbXmlBuilder.buildEnd();
48
+ }
49
+ }
@@ -0,0 +1,48 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { CarService } from '../services/car.service';
3
+ import { ConfigService } from '../services/config.service';
4
+ import { FsChunkInterface } from '@bytebrand/chunkable';
5
+ import { Exporter } from '../interfaces/exporter.interface';
6
+ import { LoaderService } from '../services/loader.service';
7
+ import { CronicleUtils } from '@bytebrand/cronicle-helper';
8
+ import { get } from 'lodash';
9
+ import { GoogleXmlBuilder } from '../formats/google-xml.builder';
10
+ import { GoogleTransformer } from '../transformers/google.transformer';
11
+ import { ModuleRef } from '@nestjs/core';
12
+ import { RulesService } from '../services/rules.service';
13
+
14
+ @Injectable()
15
+ export class GoogleExporter implements Exporter {
16
+ constructor(
17
+ private carService: CarService,
18
+ private configService: ConfigService,
19
+ private rulesService: RulesService,
20
+ private loaderService: LoaderService,
21
+ private moduleRef: ModuleRef,
22
+ ) {}
23
+
24
+ async export(): Promise<void> {
25
+ const exists = await CronicleUtils.exists(this.configService.config.fileName);
26
+ exists && (await CronicleUtils.unlink(this.configService.config.fileName));
27
+
28
+ const googleTransformer = await this.moduleRef.create(GoogleTransformer);
29
+ const googleXmlBuilder = new GoogleXmlBuilder(this.configService.config.fileName);
30
+ await googleXmlBuilder.buildStart(this.configService.config.url);
31
+
32
+ await this.loaderService.process(async (chunk: FsChunkInterface) => {
33
+ const chunkData = chunk.data.filter(car => this.carService.filterCar(car, this.rulesService.rules));
34
+ chunk.data = null;
35
+ for (const data of chunkData) {
36
+ const ownerId = get(data.car, 'metaData.ownerId', null);
37
+ const owner = await this.carService.getOwner(ownerId);
38
+ if (owner) {
39
+ const car = await googleTransformer.transform({ ...data });
40
+ await googleXmlBuilder.addItem(car);
41
+ this.carService.counter.countCar(data.images);
42
+ }
43
+ }
44
+ });
45
+
46
+ await googleXmlBuilder.buildEnd();
47
+ }
48
+ }
@@ -0,0 +1,70 @@
1
+ import { CarService } from '../services/car.service';
2
+ import { ConfigService } from '../services/config.service';
3
+ import { FsChunkInterface } from '@bytebrand/chunkable';
4
+ import { Exporter } from '../interfaces/exporter.interface';
5
+ import { LoaderService } from '../services/loader.service';
6
+ import { CronicleUtils } from '@bytebrand/cronicle-helper';
7
+ import { Zipper } from '@bytebrand/zipper';
8
+ import { Injectable } from '@nestjs/common';
9
+ import { ModuleRef } from '@nestjs/core';
10
+ import { MeinstadtJsonBuilder } from '../formats/meinstadt-json.builder';
11
+ import { get, isNil } from 'lodash';
12
+ import { MeinstadtTransformer } from '../transformers/meinstadt.transformer';
13
+ import { RulesService } from '../services/rules.service';
14
+ import { MeinstadtJsonItem } from '../interfaces/export-item.interface';
15
+
16
+ @Injectable()
17
+ export class MeinstadtExporter implements Exporter {
18
+ constructor(
19
+ private carService: CarService,
20
+ private configService: ConfigService,
21
+ private rulesService: RulesService,
22
+ private loaderService: LoaderService,
23
+ private moduleRef: ModuleRef,
24
+ ) {}
25
+
26
+ async export(): Promise<void> {
27
+ for (const file of this.configService.config.outputFiles) {
28
+ const exists = await CronicleUtils.exists(file);
29
+ exists && (await CronicleUtils.unlink(file));
30
+ }
31
+
32
+ const [fileCarJson, fileGZ] = this.configService.config.outputFiles;
33
+
34
+ const meinstadtJsonBuilder = new MeinstadtJsonBuilder(fileCarJson);
35
+ meinstadtJsonBuilder.buildStart();
36
+
37
+ const meinstadtTransformer = await this.moduleRef.create(MeinstadtTransformer);
38
+
39
+ let firstCar = true;
40
+ await this.loaderService.process(async (chunk: FsChunkInterface) => {
41
+ let chunkData;
42
+ if (this.configService.config.isNewCar) {
43
+ chunkData = chunk.data.filter(
44
+ e => this.carService.filterCar(e, this.rulesService.rules) && this.carService.isCarNew(e),
45
+ );
46
+ } else {
47
+ chunkData = chunk.data.filter(e => this.carService.filterCar(e, this.rulesService.rules));
48
+ }
49
+ chunk.data = null;
50
+ for (const data of chunkData) {
51
+ const ownerId = get(data.car, 'metaData.ownerId', null);
52
+ if (!isNil(ownerId)) {
53
+ const owner = await this.carService.getOwner(ownerId);
54
+ if (owner) {
55
+ const car = await meinstadtTransformer.transform({ owner, ...data });
56
+ await meinstadtJsonBuilder.addItem(car as MeinstadtJsonItem, firstCar);
57
+ this.carService.counter.countCar(data.images);
58
+ }
59
+ if (firstCar) {
60
+ firstCar = false;
61
+ }
62
+ }
63
+ }
64
+ });
65
+
66
+ meinstadtJsonBuilder.buildEnd();
67
+
68
+ await Zipper.zip({ dest: fileGZ, fileList: [fileCarJson] });
69
+ }
70
+ }
@@ -0,0 +1,113 @@
1
+ import { CarService } from '../services/car.service';
2
+ import { ConfigService } from '../services/config.service';
3
+ import { FsChunkInterface } from '@bytebrand/chunkable';
4
+ import { writeFile } from 'fs/promises';
5
+ import { MobileTransformer } from '../transformers/mobile.transformer';
6
+ import { convertToCSV } from '../utils/converter.utils';
7
+ import { Exporter } from '../interfaces/exporter.interface';
8
+ import { LoaderService } from '../services/loader.service';
9
+ import { CronicleUtils } from '@bytebrand/cronicle-helper';
10
+ import { Zipper } from '@bytebrand/zipper';
11
+ import { normalize, join, extname } from 'path';
12
+ import { Injectable } from '@nestjs/common';
13
+ import { ModuleRef } from '@nestjs/core';
14
+ import { HttpService } from '@nestjs/axios';
15
+ import { lastValueFrom } from 'rxjs';
16
+ import { createWriteStream } from 'fs';
17
+ import { get } from 'lodash';
18
+ import { RulesService } from '../services/rules.service';
19
+
20
+ @Injectable()
21
+ export class MobileExporter implements Exporter {
22
+ constructor(
23
+ private carService: CarService,
24
+ private configService: ConfigService,
25
+ private rulesService: RulesService,
26
+ private loaderService: LoaderService,
27
+ private moduleRef: ModuleRef,
28
+ private httpService: HttpService,
29
+ ) {}
30
+
31
+ async export(): Promise<void> {
32
+ await CronicleUtils.ensureDir(this.configService.config.pathesConfig.localConvertedDirectory);
33
+ await CronicleUtils.emptyDir(this.configService.config.pathesConfig.localConvertedDirectory);
34
+ if (this.configService.config.downloadImages) {
35
+ await CronicleUtils.ensureDir(join(this.configService.config.pathesConfig.localConvertedDirectory, 'images'));
36
+ }
37
+
38
+ const mobileTransformer = await this.moduleRef.create(MobileTransformer);
39
+
40
+ await this.loaderService.process(async (chunk: FsChunkInterface) => {
41
+ if (this.configService.config.isNewCar) {
42
+ chunk.data = chunk.data.filter(
43
+ e => this.carService.filterCar(e, this.rulesService.rules) && this.carService.isCarNew(e),
44
+ );
45
+ } else {
46
+ chunk.data = chunk.data.filter(e => this.carService.filterCar(e, this.rulesService.rules));
47
+ }
48
+
49
+ if (chunk && chunk.data) {
50
+ for (let i = 0; i < chunk.data.length; i += 1) {
51
+ const data = chunk.data[i];
52
+ const { car, images } = data;
53
+ const transformedData = await mobileTransformer.transform(car, images);
54
+ if (this.configService.config.downloadImages) {
55
+ await this.downloadImages(get(transformedData, '1'), get(transformedData, '26', '').split(';'));
56
+ }
57
+ const transformedDataCSV = `${convertToCSV(transformedData)}\n`;
58
+
59
+ await writeFile(
60
+ `${this.configService.config.pathesConfig.localConvertedDirectory}/${this.configService.config.fileName}.csv`,
61
+ Buffer.from(transformedDataCSV),
62
+ { flag: 'a' },
63
+ );
64
+ this.carService.counter.countCar(data.images);
65
+ }
66
+ chunk.data = null;
67
+ }
68
+ });
69
+
70
+ const fileZIP = normalize(
71
+ `${this.configService.config.pathesConfig.localConvertedDirectory}/${this.configService.config.fileName}.zip`,
72
+ );
73
+ const fileCSV = normalize(
74
+ `${this.configService.config.pathesConfig.localConvertedDirectory}/${this.configService.config.fileName}.csv`,
75
+ );
76
+ const fileList = [fileCSV];
77
+ if (this.configService.config.downloadImages) {
78
+ const fileImages = normalize(join(this.configService.config.pathesConfig.localConvertedDirectory, 'images'));
79
+ fileList.push(fileImages);
80
+ }
81
+
82
+ if (await CronicleUtils.exists(fileCSV)) {
83
+ await Zipper.zip({ fileList, dest: fileZIP });
84
+ }
85
+ }
86
+
87
+ private downloadImages(vehicleId: string, imageUrls: string[]): Promise<PromiseSettledResult<unknown>[]> {
88
+ return Promise.allSettled(
89
+ imageUrls.map((imageUrl, index) => {
90
+ return new Promise((resolve, reject) => {
91
+ lastValueFrom(
92
+ this.httpService.get(imageUrl, {
93
+ responseType: 'stream',
94
+ }),
95
+ )
96
+ .then(response => {
97
+ const writer = createWriteStream(
98
+ join(
99
+ this.configService.config.pathesConfig.localConvertedDirectory,
100
+ 'images',
101
+ `${vehicleId}_${index + 1}${extname(imageUrl) || '.jpg'}`,
102
+ ),
103
+ );
104
+ response.data.pipe(writer);
105
+ writer.on('finish', resolve);
106
+ writer.on('error', reject);
107
+ })
108
+ .catch(reject);
109
+ });
110
+ }),
111
+ );
112
+ }
113
+ }
@@ -0,0 +1,50 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { CarService } from '../services/car.service';
3
+ import { ConfigService } from '../services/config.service';
4
+ import { FsChunkInterface } from '@bytebrand/chunkable';
5
+ import { Exporter } from '../interfaces/exporter.interface';
6
+ import { LoaderService } from '../services/loader.service';
7
+ import { CronicleUtils } from '@bytebrand/cronicle-helper';
8
+ import { ModuleRef } from '@nestjs/core';
9
+ import { Zipper } from '@bytebrand/zipper';
10
+ import { OoyyoXmlBuilder } from '../formats/ooyyo-xml.builder';
11
+ import { OoyyoTransformer } from '../transformers/ooyyo.transformer';
12
+
13
+ @Injectable()
14
+ export class OoyyoExporter implements Exporter {
15
+ constructor(
16
+ private carService: CarService,
17
+ private configService: ConfigService,
18
+ private loaderService: LoaderService,
19
+ private moduleRef: ModuleRef,
20
+ ) {}
21
+
22
+ async export(): Promise<void> {
23
+ for (const file of this.configService.config.outputFiles) {
24
+ const exists = await CronicleUtils.exists(file);
25
+ exists && (await CronicleUtils.unlink(file));
26
+ }
27
+
28
+ const [fileCarXml, fileGZ] = this.configService.config.outputFiles;
29
+ const ooyyoXmlBuilder = new OoyyoXmlBuilder(fileCarXml);
30
+ const ooyyoTransformer = await this.moduleRef.create(OoyyoTransformer);
31
+
32
+ await ooyyoXmlBuilder.buildStart();
33
+
34
+ await this.loaderService.process(async (chunk: FsChunkInterface) => {
35
+ if (chunk && chunk.data) {
36
+ for (let i = 0; i < chunk.data.length; i += 1) {
37
+ const data = chunk.data[i];
38
+ const { car, images } = data;
39
+ await ooyyoXmlBuilder.addItem(ooyyoTransformer.transform(car, images));
40
+ this.carService.counter.countCar(images);
41
+ }
42
+ chunk.data = null;
43
+ }
44
+ });
45
+
46
+ await ooyyoXmlBuilder.buildEnd();
47
+
48
+ await Zipper.tar({ dest: fileGZ, fileList: [fileCarXml] });
49
+ }
50
+ }
@@ -0,0 +1,48 @@
1
+ import { XMLBuilderBase } from '@bytebrand/cronicle-helper';
2
+ import { Auto24XmlItem } from '../interfaces/export-item.interface';
3
+
4
+ export class Auto24XmlBuilder extends XMLBuilderBase {
5
+ async buildStart(totalResults = 0): Promise<void> {
6
+ await this.write(`<autode version="1.1" types="detail">
7
+ <link>https://www.auto.de</link>
8
+ <language>de</language>
9
+ <index_totalResults>${totalResults}</index_totalResults>`);
10
+ }
11
+
12
+ async addItem(car: Auto24XmlItem): Promise<void> {
13
+ let item = '';
14
+
15
+ item += '\n<item>\n';
16
+ item += this.getElement('autodeid', car.autodeid);
17
+ item += this.getElement('userlink', car.userlink);
18
+ item += this.getElement('apilink', car.apilink);
19
+ item += this.getElement('brand', car.brand);
20
+ item += this.getElement('modell', car.modell);
21
+ item += this.getElement('cartype', car.cartype);
22
+ item += this.getElement('variant', car.variant, true);
23
+ item += this.getElement('bodytype', car.bodytype);
24
+ item += this.getElement('fueltype', car.fueltype);
25
+ item += this.getElement('consumptionK', car.consumptionK);
26
+ item += this.getElement('co2', car.co2);
27
+ item += this.getElement('efficiencyclass', car.efficiencyclass);
28
+ item += this.getElement('image', car.image);
29
+ item += this.getElement('registration', car.registration);
30
+ item += this.getElementsList('images', 'image', car.images);
31
+ item += this.getElement('price', car.price);
32
+ item += this.getElement('power-kw', car.power);
33
+ item += this.getElement('zip', car.zip);
34
+ item += this.getElement('city', car.city, true);
35
+ item += this.getElement('mileage', car.mileage);
36
+ item += this.getElement('companyname', car.companyname, true);
37
+ item += this.getElement('extras', car.extras, true);
38
+ item += this.getElement('sellertype', car.sellertype);
39
+ item += '</item>';
40
+
41
+ await this.write(item);
42
+ }
43
+
44
+ async buildEnd(): Promise<void> {
45
+ await this.write('\n</autode>');
46
+ await this.end();
47
+ }
48
+ }
@@ -0,0 +1,20 @@
1
+ import { XMLBuilderBase } from '@bytebrand/cronicle-helper';
2
+ import { AutouncleJsonItem } from '../interfaces/export-item.interface';
3
+
4
+ export class AutouncleJsonBuilder extends XMLBuilderBase {
5
+ async buildStart(): Promise<void> {
6
+ await this.write('{"ads":[');
7
+ }
8
+
9
+ async addItem(car: AutouncleJsonItem, firstSym?: boolean): Promise<void> {
10
+ if (firstSym) {
11
+ await this.write(`${JSON.stringify(car)}`);
12
+ }
13
+ await this.write(`,${JSON.stringify(car)}`);
14
+ }
15
+
16
+ async buildEnd(): Promise<void> {
17
+ await this.write(']}');
18
+ await this.end();
19
+ }
20
+ }