@solidxai/core 0.1.4 → 0.1.5-beta.1

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 (251) hide show
  1. package/.claude/settings.local.json +8 -0
  2. package/dist/constants/error-messages.d.ts +1 -0
  3. package/dist/constants/error-messages.d.ts.map +1 -1
  4. package/dist/constants/error-messages.js +1 -0
  5. package/dist/constants/error-messages.js.map +1 -1
  6. package/dist/constants.d.ts +3 -3
  7. package/dist/constants.d.ts.map +1 -1
  8. package/dist/constants.js +12 -12
  9. package/dist/constants.js.map +1 -1
  10. package/dist/controllers/otp-authentication.controller.d.ts +1 -4
  11. package/dist/controllers/otp-authentication.controller.d.ts.map +1 -1
  12. package/dist/controllers/otp-authentication.controller.js +1 -1
  13. package/dist/controllers/role-metadata.controller.d.ts +1 -0
  14. package/dist/controllers/role-metadata.controller.d.ts.map +1 -1
  15. package/dist/controllers/role-metadata.controller.js +15 -0
  16. package/dist/controllers/role-metadata.controller.js.map +1 -1
  17. package/dist/controllers/view-metadata.controller.d.ts +1 -0
  18. package/dist/controllers/view-metadata.controller.d.ts.map +1 -1
  19. package/dist/dtos/create-email-template.dto.d.ts.map +1 -1
  20. package/dist/dtos/create-email-template.dto.js.map +1 -1
  21. package/dist/dtos/create-list-of-values.dto.d.ts.map +1 -1
  22. package/dist/dtos/create-list-of-values.dto.js.map +1 -1
  23. package/dist/dtos/create-menu-item-metadata.dto.d.ts.map +1 -1
  24. package/dist/dtos/create-menu-item-metadata.dto.js.map +1 -1
  25. package/dist/dtos/create-role-metadata.dto.d.ts.map +1 -1
  26. package/dist/dtos/create-role-metadata.dto.js.map +1 -1
  27. package/dist/dtos/create-saved-filters.dto.d.ts +1 -0
  28. package/dist/dtos/create-saved-filters.dto.d.ts.map +1 -1
  29. package/dist/dtos/create-saved-filters.dto.js +8 -1
  30. package/dist/dtos/create-saved-filters.dto.js.map +1 -1
  31. package/dist/dtos/create-scheduled-job.dto.d.ts.map +1 -1
  32. package/dist/dtos/create-scheduled-job.dto.js.map +1 -1
  33. package/dist/dtos/create-security-rule.dto.d.ts.map +1 -1
  34. package/dist/dtos/create-security-rule.dto.js.map +1 -1
  35. package/dist/dtos/create-sms-template.dto.d.ts.map +1 -1
  36. package/dist/dtos/create-sms-template.dto.js.map +1 -1
  37. package/dist/dtos/create-view-metadata.dto.d.ts.map +1 -1
  38. package/dist/dtos/create-view-metadata.dto.js.map +1 -1
  39. package/dist/dtos/otp-sign-in.dto.d.ts +1 -1
  40. package/dist/dtos/otp-sign-in.dto.d.ts.map +1 -1
  41. package/dist/dtos/otp-sign-in.dto.js +2 -2
  42. package/dist/dtos/otp-sign-in.dto.js.map +1 -1
  43. package/dist/dtos/otp-sign-up.dto.d.ts +2 -2
  44. package/dist/dtos/otp-sign-up.dto.d.ts.map +1 -1
  45. package/dist/dtos/otp-sign-up.dto.js +2 -2
  46. package/dist/dtos/otp-sign-up.dto.js.map +1 -1
  47. package/dist/dtos/resolve-s3-url.dto.d.ts +2 -5
  48. package/dist/dtos/resolve-s3-url.dto.d.ts.map +1 -1
  49. package/dist/dtos/resolve-s3-url.dto.js +1 -13
  50. package/dist/dtos/resolve-s3-url.dto.js.map +1 -1
  51. package/dist/dtos/sign-up.dto.d.ts.map +1 -1
  52. package/dist/dtos/sign-up.dto.js.map +1 -1
  53. package/dist/dtos/update-email-template.dto.d.ts.map +1 -1
  54. package/dist/dtos/update-email-template.dto.js.map +1 -1
  55. package/dist/dtos/update-list-of-values.dto.d.ts.map +1 -1
  56. package/dist/dtos/update-list-of-values.dto.js.map +1 -1
  57. package/dist/dtos/update-menu-item-metadata.dto.d.ts.map +1 -1
  58. package/dist/dtos/update-menu-item-metadata.dto.js.map +1 -1
  59. package/dist/dtos/update-saved-filters.dto.d.ts +1 -0
  60. package/dist/dtos/update-saved-filters.dto.d.ts.map +1 -1
  61. package/dist/dtos/update-saved-filters.dto.js +10 -1
  62. package/dist/dtos/update-saved-filters.dto.js.map +1 -1
  63. package/dist/dtos/update-scheduled-job.dto.d.ts.map +1 -1
  64. package/dist/dtos/update-scheduled-job.dto.js.map +1 -1
  65. package/dist/dtos/update-security-rule.dto.d.ts.map +1 -1
  66. package/dist/dtos/update-security-rule.dto.js.map +1 -1
  67. package/dist/dtos/update-sms-template.dto.d.ts.map +1 -1
  68. package/dist/dtos/update-sms-template.dto.js.map +1 -1
  69. package/dist/dtos/update-view-metadata.dto.d.ts.map +1 -1
  70. package/dist/dtos/update-view-metadata.dto.js.map +1 -1
  71. package/dist/entities/chatter-message-details.entity.d.ts.map +1 -1
  72. package/dist/entities/chatter-message-details.entity.js +1 -0
  73. package/dist/entities/chatter-message-details.entity.js.map +1 -1
  74. package/dist/entities/chatter-message.entity.d.ts.map +1 -1
  75. package/dist/entities/chatter-message.entity.js +1 -0
  76. package/dist/entities/chatter-message.entity.js.map +1 -1
  77. package/dist/entities/common.entity.js +4 -4
  78. package/dist/entities/common.entity.js.map +1 -1
  79. package/dist/entities/legacy-common.entity.js +4 -4
  80. package/dist/entities/legacy-common.entity.js.map +1 -1
  81. package/dist/entities/saved-filters.entity.d.ts +1 -0
  82. package/dist/entities/saved-filters.entity.d.ts.map +1 -1
  83. package/dist/entities/saved-filters.entity.js +6 -1
  84. package/dist/entities/saved-filters.entity.js.map +1 -1
  85. package/dist/entities/user.entity.d.ts +1 -0
  86. package/dist/entities/user.entity.d.ts.map +1 -1
  87. package/dist/entities/user.entity.js +6 -1
  88. package/dist/entities/user.entity.js.map +1 -1
  89. package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.d.ts +2 -0
  90. package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.d.ts.map +1 -1
  91. package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.js +33 -23
  92. package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.js.map +1 -1
  93. package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.d.ts +3 -0
  94. package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.d.ts.map +1 -1
  95. package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.js +36 -23
  96. package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.js.map +1 -1
  97. package/dist/helpers/security.helper.js +1 -0
  98. package/dist/helpers/security.helper.js.map +1 -1
  99. package/dist/index.d.ts +0 -4
  100. package/dist/index.d.ts.map +1 -1
  101. package/dist/index.js +0 -4
  102. package/dist/index.js.map +1 -1
  103. package/dist/repository/solid-base.repository.d.ts +10 -1
  104. package/dist/repository/solid-base.repository.d.ts.map +1 -1
  105. package/dist/repository/solid-base.repository.js +109 -0
  106. package/dist/repository/solid-base.repository.js.map +1 -1
  107. package/dist/seeders/module-metadata-seeder.service.d.ts +2 -0
  108. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  109. package/dist/seeders/module-metadata-seeder.service.js +142 -72
  110. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  111. package/dist/seeders/permission-metadata-seeder.service.d.ts +1 -1
  112. package/dist/seeders/permission-metadata-seeder.service.d.ts.map +1 -1
  113. package/dist/seeders/permission-metadata-seeder.service.js +1 -1
  114. package/dist/seeders/permission-metadata-seeder.service.js.map +1 -1
  115. package/dist/seeders/seed-data/solid-core-metadata.json +23 -25
  116. package/dist/services/authentication.service.d.ts +22 -8
  117. package/dist/services/authentication.service.d.ts.map +1 -1
  118. package/dist/services/authentication.service.js +230 -214
  119. package/dist/services/authentication.service.js.map +1 -1
  120. package/dist/services/crud-helper.service.d.ts +4 -0
  121. package/dist/services/crud-helper.service.d.ts.map +1 -1
  122. package/dist/services/crud-helper.service.js +66 -32
  123. package/dist/services/crud-helper.service.js.map +1 -1
  124. package/dist/services/crud.service.d.ts.map +1 -1
  125. package/dist/services/crud.service.js +7 -4
  126. package/dist/services/crud.service.js.map +1 -1
  127. package/dist/services/field-metadata.service.d.ts.map +1 -1
  128. package/dist/services/field-metadata.service.js.map +1 -1
  129. package/dist/services/file/disk-file.service.d.ts +0 -2
  130. package/dist/services/file/disk-file.service.d.ts.map +1 -1
  131. package/dist/services/file/disk-file.service.js +7 -16
  132. package/dist/services/file/disk-file.service.js.map +1 -1
  133. package/dist/services/file/index.d.ts +1 -0
  134. package/dist/services/file/index.d.ts.map +1 -1
  135. package/dist/services/file/index.js +1 -0
  136. package/dist/services/file/index.js.map +1 -1
  137. package/dist/services/file/storage-path-builder.d.ts +17 -0
  138. package/dist/services/file/storage-path-builder.d.ts.map +1 -0
  139. package/dist/{seeders/sms-template-seeder.service.js → services/file/storage-path-builder.js} +45 -35
  140. package/dist/services/file/storage-path-builder.js.map +1 -0
  141. package/dist/services/media.service.d.ts +1 -1
  142. package/dist/services/media.service.d.ts.map +1 -1
  143. package/dist/services/media.service.js +45 -6
  144. package/dist/services/media.service.js.map +1 -1
  145. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js.map +1 -1
  146. package/dist/services/mediaStorageProviders/file-storage-provider.d.ts.map +1 -1
  147. package/dist/services/mediaStorageProviders/file-storage-provider.js +46 -7
  148. package/dist/services/mediaStorageProviders/file-storage-provider.js.map +1 -1
  149. package/dist/services/module-metadata.service.d.ts +4 -6
  150. package/dist/services/module-metadata.service.d.ts.map +1 -1
  151. package/dist/services/module-metadata.service.js +16 -14
  152. package/dist/services/module-metadata.service.js.map +1 -1
  153. package/dist/services/setting.service.d.ts +3 -2
  154. package/dist/services/setting.service.d.ts.map +1 -1
  155. package/dist/services/setting.service.js +7 -4
  156. package/dist/services/setting.service.js.map +1 -1
  157. package/dist/services/settings/default-settings-provider.service.d.ts +24 -2
  158. package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
  159. package/dist/services/settings/default-settings-provider.service.js +8 -6
  160. package/dist/services/settings/default-settings-provider.service.js.map +1 -1
  161. package/dist/services/view-metadata.service.d.ts +1 -0
  162. package/dist/services/view-metadata.service.d.ts.map +1 -1
  163. package/dist/services/view-metadata.service.js +25 -1
  164. package/dist/services/view-metadata.service.js.map +1 -1
  165. package/dist/solid-core.module.d.ts +3 -1
  166. package/dist/solid-core.module.d.ts.map +1 -1
  167. package/dist/solid-core.module.js +45 -9
  168. package/dist/solid-core.module.js.map +1 -1
  169. package/dist/testing/adapters/ui/playwright-adapter.d.ts.map +1 -1
  170. package/dist/testing/adapters/ui/playwright-adapter.js +35 -2
  171. package/dist/testing/adapters/ui/playwright-adapter.js.map +1 -1
  172. package/dist/transformers/typeorm/local-date-time-transformer.d.ts +4 -3
  173. package/dist/transformers/typeorm/local-date-time-transformer.d.ts.map +1 -1
  174. package/dist/transformers/typeorm/local-date-time-transformer.js +20 -2
  175. package/dist/transformers/typeorm/local-date-time-transformer.js.map +1 -1
  176. package/package.json +8 -2
  177. package/src/constants/error-messages.ts +1 -0
  178. package/src/constants.ts +3 -3
  179. package/src/controllers/role-metadata.controller.ts +26 -18
  180. package/src/dtos/create-email-template.dto.ts +7 -0
  181. package/src/dtos/create-list-of-values.dto.ts +7 -0
  182. package/src/dtos/create-menu-item-metadata.dto.ts +12 -1
  183. package/src/dtos/create-role-metadata.dto.ts +9 -0
  184. package/src/dtos/create-saved-filters.dto.ts +7 -0
  185. package/src/dtos/create-scheduled-job.dto.ts +14 -0
  186. package/src/dtos/create-security-rule.dto.ts +6 -0
  187. package/src/dtos/create-sms-template.dto.ts +6 -0
  188. package/src/dtos/create-view-metadata.dto.ts +11 -0
  189. package/src/dtos/otp-sign-in.dto.ts +3 -3
  190. package/src/dtos/otp-sign-up.dto.ts +3 -3
  191. package/src/dtos/resolve-s3-url.dto.ts +2 -12
  192. package/src/dtos/sign-up.dto.ts +0 -2
  193. package/src/dtos/update-email-template.dto.ts +6 -0
  194. package/src/dtos/update-list-of-values.dto.ts +8 -0
  195. package/src/dtos/update-menu-item-metadata.dto.ts +12 -0
  196. package/src/dtos/update-saved-filters.dto.ts +5 -1
  197. package/src/dtos/update-scheduled-job.dto.ts +15 -0
  198. package/src/dtos/update-security-rule.dto.ts +7 -0
  199. package/src/dtos/update-sms-template.dto.ts +32 -32
  200. package/src/dtos/update-view-metadata.dto.ts +12 -0
  201. package/src/entities/chatter-message-details.entity.ts +1 -0
  202. package/src/entities/chatter-message.entity.ts +1 -0
  203. package/src/entities/common.entity.ts +5 -5
  204. package/src/entities/legacy-common.entity.ts +5 -5
  205. package/src/entities/saved-filters.entity.ts +3 -0
  206. package/src/entities/user.entity.ts +4 -1
  207. package/src/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.ts +43 -32
  208. package/src/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.ts +45 -33
  209. package/src/helpers/security.helper.ts +1 -1
  210. package/src/index.ts +0 -4
  211. package/src/repository/solid-base.repository.ts +172 -1
  212. package/src/seeders/module-metadata-seeder.service.ts +189 -127
  213. package/src/seeders/permission-metadata-seeder.service.ts +1 -4
  214. package/src/seeders/seed-data/solid-core-metadata.json +30 -32
  215. package/src/services/authentication.service.ts +273 -269
  216. package/src/services/crud-helper.service.ts +79 -36
  217. package/src/services/crud.service.ts +9 -4
  218. package/src/services/field-metadata.service.ts +0 -71
  219. package/src/services/file/disk-file.service.ts +8 -18
  220. package/src/services/file/index.ts +1 -0
  221. package/src/services/file/storage-path-builder.ts +56 -0
  222. package/src/services/media.service.ts +13 -7
  223. package/src/services/mediaStorageProviders/file-s3-storage-provider.ts +1 -1
  224. package/src/services/mediaStorageProviders/file-storage-provider.ts +13 -8
  225. package/src/services/module-metadata.service.ts +18 -15
  226. package/src/services/setting.service.ts +5 -3
  227. package/src/services/settings/default-settings-provider.service.ts +5 -3
  228. package/src/services/view-metadata.service.ts +29 -1
  229. package/src/solid-core.module.ts +16 -12
  230. package/src/testing/adapters/ui/playwright-adapter.ts +1 -1
  231. package/src/transformers/typeorm/local-date-time-transformer.ts +21 -3
  232. package/dist/passport-strategies/local.strategy.d.ts +0 -15
  233. package/dist/passport-strategies/local.strategy.d.ts.map +0 -1
  234. package/dist/passport-strategies/local.strategy.js +0 -44
  235. package/dist/passport-strategies/local.strategy.js.map +0 -1
  236. package/dist/seeders/email-template-seeder.service.d.ts +0 -10
  237. package/dist/seeders/email-template-seeder.service.d.ts.map +0 -1
  238. package/dist/seeders/email-template-seeder.service.js +0 -84
  239. package/dist/seeders/email-template-seeder.service.js.map +0 -1
  240. package/dist/seeders/sms-template-seeder.service.d.ts +0 -10
  241. package/dist/seeders/sms-template-seeder.service.d.ts.map +0 -1
  242. package/dist/seeders/sms-template-seeder.service.js.map +0 -1
  243. package/dist/seeders/user-seeder.service.d.ts +0 -10
  244. package/dist/seeders/user-seeder.service.d.ts.map +0 -1
  245. package/dist/seeders/user-seeder.service.js +0 -44
  246. package/dist/seeders/user-seeder.service.js.map +0 -1
  247. package/src/passport-strategies/local.strategy.ts +0 -28
  248. package/src/seeders/email-template-seeder.service.ts +0 -49
  249. package/src/seeders/sms-template-seeder.service.ts +0 -50
  250. package/src/seeders/user-seeder.service.ts +0 -33
  251. package/src/workflow.readme.md +0 -25
@@ -41,46 +41,56 @@ var __importStar = (this && this.__importStar) || (function () {
41
41
  var __metadata = (this && this.__metadata) || function (k, v) {
42
42
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
43
  };
44
- var SmsTemplateSeederService_1;
45
44
  Object.defineProperty(exports, "__esModule", { value: true });
46
- exports.SmsTemplateSeederService = void 0;
45
+ exports.StoragePathBuilderFactory = exports.S3StoragePathBuilder = exports.DiskStoragePathBuilder = exports.FILE_STORAGE_PATH_BUILDER = void 0;
47
46
  const common_1 = require("@nestjs/common");
48
- const fs = __importStar(require("fs"));
49
47
  const path = __importStar(require("path"));
50
- const sms_template_service_1 = require("../services/sms-template.service");
51
- const setting_service_1 = require("../services/setting.service");
52
- let SmsTemplateSeederService = SmsTemplateSeederService_1 = class SmsTemplateSeederService {
53
- constructor(smsTemplateService, settingService) {
54
- this.smsTemplateService = smsTemplateService;
55
- this.settingService = settingService;
56
- this.logger = new common_1.Logger(SmsTemplateSeederService_1.name);
48
+ const default_settings_provider_service_1 = require("../settings/default-settings-provider.service");
49
+ exports.FILE_STORAGE_PATH_BUILDER = Symbol('FILE_STORAGE_PATH_BUILDER');
50
+ let DiskStoragePathBuilder = class DiskStoragePathBuilder {
51
+ constructor() {
52
+ this.base = process.env.AB_MEDIA_FILE_STORAGE_DIR || default_settings_provider_service_1.DEFAULT_MEDIA_FILE_STORAGE_DIR;
57
53
  }
58
- async seed() {
59
- const seedDataFileVariable = this.settingService.getConfigValue("smsTemplateSeederFiles");
60
- const seedDataFiles = seedDataFileVariable.split(',');
61
- for (let i = 0; i < seedDataFiles.length; i++) {
62
- const seedDataFile = seedDataFiles[i];
63
- const fullPath = path.join(process.cwd(), seedDataFile);
64
- this.logger.log(`Using sms template seed data: ${fullPath}`);
65
- const smsTemplateJson = fs.readFileSync(fullPath, 'utf-8').toString();
66
- const smsTemplates = JSON.parse(smsTemplateJson);
67
- for (let i = 0; i < smsTemplates.length; i++) {
68
- const smsTemplate = smsTemplates[i];
69
- this.logger.log(`Found ${smsTemplate.name} sms template`);
70
- if (smsTemplate.body) {
71
- const smsTemplateFilePath = path.join(process.cwd(), smsTemplate.body);
72
- smsTemplate.body = fs.readFileSync(smsTemplateFilePath, 'utf-8').toString();
73
- }
74
- await this.smsTemplateService.removeByName(smsTemplate.name);
75
- await this.smsTemplateService.create(smsTemplate);
76
- }
54
+ build(fileName) {
55
+ if (path.isAbsolute(fileName) || fileName.startsWith(`${this.base}/`)) {
56
+ return fileName;
77
57
  }
58
+ return `${this.base}/${fileName}`;
78
59
  }
79
60
  };
80
- exports.SmsTemplateSeederService = SmsTemplateSeederService;
81
- exports.SmsTemplateSeederService = SmsTemplateSeederService = SmsTemplateSeederService_1 = __decorate([
61
+ exports.DiskStoragePathBuilder = DiskStoragePathBuilder;
62
+ exports.DiskStoragePathBuilder = DiskStoragePathBuilder = __decorate([
82
63
  (0, common_1.Injectable)(),
83
- __metadata("design:paramtypes", [sms_template_service_1.SmsTemplateService,
84
- setting_service_1.SettingService])
85
- ], SmsTemplateSeederService);
86
- //# sourceMappingURL=sms-template-seeder.service.js.map
64
+ __metadata("design:paramtypes", [])
65
+ ], DiskStoragePathBuilder);
66
+ let S3StoragePathBuilder = class S3StoragePathBuilder {
67
+ constructor() {
68
+ this.bucket = process.env.S3_DEFAULT_BUCKET ?? '';
69
+ }
70
+ build(fileName) {
71
+ if (fileName.includes(':')) {
72
+ return fileName;
73
+ }
74
+ return `${this.bucket}:${fileName}`;
75
+ }
76
+ };
77
+ exports.S3StoragePathBuilder = S3StoragePathBuilder;
78
+ exports.S3StoragePathBuilder = S3StoragePathBuilder = __decorate([
79
+ (0, common_1.Injectable)(),
80
+ __metadata("design:paramtypes", [])
81
+ ], S3StoragePathBuilder);
82
+ exports.StoragePathBuilderFactory = {
83
+ provide: exports.FILE_STORAGE_PATH_BUILDER,
84
+ useFactory: (disk, s3) => {
85
+ const defaultService = process.env.DEFAULT_FILE_SERVICE ?? 'disk';
86
+ switch (defaultService.toLowerCase()) {
87
+ case 's3':
88
+ return s3;
89
+ case 'disk':
90
+ default:
91
+ return disk;
92
+ }
93
+ },
94
+ inject: [DiskStoragePathBuilder, S3StoragePathBuilder],
95
+ };
96
+ //# sourceMappingURL=storage-path-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-path-builder.js","sourceRoot":"","sources":["../../../src/services/file/storage-path-builder.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAAsD;AACtD,2CAA6B;AAC7B,qGAA+F;AAElF,QAAA,yBAAyB,GAAG,MAAM,CAAC,2BAA2B,CAAC,CAAC;AAOtE,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IAGjC;QACE,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,kEAA8B,CAAC;IACtF,CAAC;IAED,KAAK,CAAC,QAAgB;QACpB,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACtE,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,QAAQ,EAAE,CAAC;IACpC,CAAC;CACF,CAAA;AAbY,wDAAsB;iCAAtB,sBAAsB;IADlC,IAAA,mBAAU,GAAE;;GACA,sBAAsB,CAalC;AAGM,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAG/B;QACE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,QAAgB;QACpB,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,OAAO,GAAG,IAAI,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;IACtC,CAAC;CACF,CAAA;AAbY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,mBAAU,GAAE;;GACA,oBAAoB,CAahC;AAEY,QAAA,yBAAyB,GAAa;IACjD,OAAO,EAAE,iCAAyB;IAClC,UAAU,EAAE,CAAC,IAA4B,EAAE,EAAwB,EAAuB,EAAE;QAC1F,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,MAAM,CAAC;QAClE,QAAQ,cAAc,CAAC,WAAW,EAAE,EAAE,CAAC;YACrC,KAAK,IAAI;gBACP,OAAO,EAAE,CAAC;YACZ,KAAK,MAAM,CAAC;YACZ;gBACE,OAAO,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;IACD,MAAM,EAAE,CAAC,sBAAsB,EAAE,oBAAoB,CAAC;CACvD,CAAC","sourcesContent":["import { Injectable, Provider } from '@nestjs/common';\nimport * as path from 'path';\nimport { DEFAULT_MEDIA_FILE_STORAGE_DIR } from '../settings/default-settings-provider.service';\n\nexport const FILE_STORAGE_PATH_BUILDER = Symbol('FILE_STORAGE_PATH_BUILDER');\n\nexport interface IStoragePathBuilder {\n build(fileName: string): string;\n}\n\n@Injectable()\nexport class DiskStoragePathBuilder implements IStoragePathBuilder {\n private readonly base: string;\n\n constructor() {\n this.base = process.env.AB_MEDIA_FILE_STORAGE_DIR || DEFAULT_MEDIA_FILE_STORAGE_DIR;\n }\n\n build(fileName: string): string {\n if (path.isAbsolute(fileName) || fileName.startsWith(`${this.base}/`)) {\n return fileName;\n }\n return `${this.base}/${fileName}`;\n }\n}\n\n@Injectable()\nexport class S3StoragePathBuilder implements IStoragePathBuilder {\n private readonly bucket: string;\n\n constructor() {\n this.bucket = process.env.S3_DEFAULT_BUCKET ?? '';\n }\n\n build(fileName: string): string {\n if (fileName.includes(':')) {\n return fileName;\n }\n return `${this.bucket}:${fileName}`;\n }\n}\n\nexport const StoragePathBuilderFactory: Provider = {\n provide: FILE_STORAGE_PATH_BUILDER,\n useFactory: (disk: DiskStoragePathBuilder, s3: S3StoragePathBuilder): IStoragePathBuilder => {\n const defaultService = process.env.DEFAULT_FILE_SERVICE ?? 'disk';\n switch (defaultService.toLowerCase()) {\n case 's3':\n return s3;\n case 'disk':\n default:\n return disk;\n }\n },\n inject: [DiskStoragePathBuilder, S3StoragePathBuilder],\n};\n"]}
@@ -42,7 +42,7 @@ export declare class MediaService extends CRUDService<Media> {
42
42
  }>;
43
43
  upload(createDto: any, files: Array<Express.Multer.File>): Promise<any[]>;
44
44
  remove(id: number): Promise<Media>;
45
- private getFileSysytemFullFilePath;
45
+ private getFullFilePathForDisk;
46
46
  private getAwsS3FullFilePath;
47
47
  private getFileName;
48
48
  }
@@ -1 +1 @@
1
- {"version":3,"file":"media.service.d.ts","sourceRoot":"","sources":["../../src/services/media.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,aAAa,EAAM,MAAM,SAAS,CAAC;AAG5C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAInE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,0CAA0C,CAAC;AACnF,OAAO,EAAE,sCAAsC,EAAE,MAAM,2DAA2D,CAAC;AACnH,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0CAA0C,CAAC;AAInF,qBACa,YAAa,SAAQ,WAAW,CAAC,KAAK,CAAC;IAEhD,QAAQ,CAAC,aAAa,EAAE,aAAa;IACrC,QAAQ,CAAC,eAAe,EAAE,eAAe;IACzC,QAAQ,CAAC,aAAa,EAAE,aAAa;IAErC,QAAQ,CAAC,aAAa,EAAE,aAAa;IAGrC,QAAQ,CAAC,IAAI,EAAE,eAAe;IAQ9B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,gCAAgC;IACjD,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,QAAQ,CAAC,SAAS,EAAE,SAAS;gBAlBpB,aAAa,EAAE,aAAa,EAC5B,eAAe,EAAE,eAAe,EAChC,aAAa,EAAE,aAAa,EAE5B,aAAa,EAAE,aAAa,EAG5B,IAAI,EAAE,eAAe,EAQb,iBAAiB,EAAE,uBAAuB,EAC1C,gCAAgC,EAAE,sCAAsC,EACxE,iBAAiB,EAAE,uBAAuB,EAClD,SAAS,EAAE,SAAS;IAKzB,IAAI,CAAC,cAAc,EAAE,cAAc,EAAE,mBAAmB,GAAE,GAAQ;;;;;;;;;;;;;;;;;;;;IAsDlE,MAAM,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;IAwDxD,MAAM,CAAC,EAAE,EAAE,MAAM;YAiCT,0BAA0B;IAKxC,OAAO,CAAC,oBAAoB;IAK5B,OAAO,CAAC,WAAW;CAIpB"}
1
+ {"version":3,"file":"media.service.d.ts","sourceRoot":"","sources":["../../src/services/media.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,aAAa,EAAM,MAAM,SAAS,CAAC;AAK5C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAInE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,0CAA0C,CAAC;AACnF,OAAO,EAAE,sCAAsC,EAAE,MAAM,2DAA2D,CAAC;AACnH,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0CAA0C,CAAC;AAInF,qBACa,YAAa,SAAQ,WAAW,CAAC,KAAK,CAAC;IAEhD,QAAQ,CAAC,aAAa,EAAE,aAAa;IACrC,QAAQ,CAAC,eAAe,EAAE,eAAe;IACzC,QAAQ,CAAC,aAAa,EAAE,aAAa;IAErC,QAAQ,CAAC,aAAa,EAAE,aAAa;IAGrC,QAAQ,CAAC,IAAI,EAAE,eAAe;IAQ9B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,gCAAgC;IACjD,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,QAAQ,CAAC,SAAS,EAAE,SAAS;gBAlBpB,aAAa,EAAE,aAAa,EAC5B,eAAe,EAAE,eAAe,EAChC,aAAa,EAAE,aAAa,EAE5B,aAAa,EAAE,aAAa,EAG5B,IAAI,EAAE,eAAe,EAQb,iBAAiB,EAAE,uBAAuB,EAC1C,gCAAgC,EAAE,sCAAsC,EACxE,iBAAiB,EAAE,uBAAuB,EAClD,SAAS,EAAE,SAAS;IAKzB,IAAI,CAAC,cAAc,EAAE,cAAc,EAAE,mBAAmB,GAAE,GAAQ;;;;;;;;;;;;;;;;;;;;IAsDlE,MAAM,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;IAwDxD,MAAM,CAAC,EAAE,EAAE,MAAM;IAiCvB,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,oBAAoB;IAK5B,OAAO,CAAC,WAAW;CAIpB"}
@@ -1,10 +1,43 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
2
18
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
19
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
20
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
21
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
22
  return c > 3 && r && Object.defineProperty(target, key, r), r;
7
23
  };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
8
41
  var __metadata = (this && this.__metadata) || function (k, v) {
9
42
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
43
  };
@@ -17,6 +50,8 @@ const common_1 = require("@nestjs/common");
17
50
  const core_1 = require("@nestjs/core");
18
51
  const typeorm_1 = require("@nestjs/typeorm");
19
52
  const typeorm_2 = require("typeorm");
53
+ const path = __importStar(require("path"));
54
+ const default_settings_provider_service_1 = require("./settings/default-settings-provider.service");
20
55
  const config_1 = require("@nestjs/config");
21
56
  const crud_service_1 = require("./crud.service");
22
57
  const file_1 = require("./file");
@@ -45,7 +80,7 @@ let MediaService = class MediaService extends crud_service_1.CRUDService {
45
80
  if (data.records) {
46
81
  for (const media of data.records) {
47
82
  if (media.mediaStorageProviderMetadata?.type === create_media_storage_provider_metadata_dto_1.MediaStorageProviderType.Filesystem) {
48
- media.relativeUri = `${this.settingService.getConfigValue("baseUrl")}/${await this.getFileSysytemFullFilePath(media.relativeUri)}`;
83
+ media.relativeUri = `${this.settingService.getConfigValue("baseUrl")}/${this.getFullFilePathForDisk(media.relativeUri)}`;
49
84
  }
50
85
  else if (media.mediaStorageProviderMetadata?.type === create_media_storage_provider_metadata_dto_1.MediaStorageProviderType.AwsS3) {
51
86
  media.relativeUri = this.getAwsS3FullFilePath(media.relativeUri, media.mediaStorageProviderMetadata.bucketName, media.mediaStorageProviderMetadata.region);
@@ -56,7 +91,7 @@ let MediaService = class MediaService extends crud_service_1.CRUDService {
56
91
  for (const group of data.groupRecords) {
57
92
  for (const media of group.groupData.records) {
58
93
  if (media.mediaStorageProviderMetadata?.type === create_media_storage_provider_metadata_dto_1.MediaStorageProviderType.Filesystem) {
59
- media.relativeUri = `${this.settingService.getConfigValue("baseUrl")}/${await this.getFileSysytemFullFilePath(media.relativeUri)}`;
94
+ media.relativeUri = `${this.settingService.getConfigValue("baseUrl")}/${this.getFullFilePathForDisk(media.relativeUri)}`;
60
95
  }
61
96
  else if (media.mediaStorageProviderMetadata?.type === create_media_storage_provider_metadata_dto_1.MediaStorageProviderType.AwsS3) {
62
97
  media.relativeUri = this.getAwsS3FullFilePath(media.relativeUri, media.mediaStorageProviderMetadata.bucketName, media.mediaStorageProviderMetadata.region);
@@ -90,7 +125,7 @@ let MediaService = class MediaService extends crud_service_1.CRUDService {
90
125
  const file = files[i];
91
126
  switch (createDto.mediaStorageProviderMetadata.type) {
92
127
  case create_media_storage_provider_metadata_dto_1.MediaStorageProviderType.Filesystem:
93
- const fileStoragePath = await this.getFileSysytemFullFilePath(this.getFileName(file));
128
+ const fileStoragePath = this.getFullFilePathForDisk(this.getFileName(file));
94
129
  await this.diskFileService.copy(file.path, fileStoragePath);
95
130
  createDto['relativeUri'] = this.getFileName(file);
96
131
  break;
@@ -128,9 +163,13 @@ let MediaService = class MediaService extends crud_service_1.CRUDService {
128
163
  await storageProvider.delete(modelEntity, media.fieldMetadata);
129
164
  return this.repo.remove(media);
130
165
  }
131
- async getFileSysytemFullFilePath(fileName) {
132
- const fileStorageDir = this.settingService.getConfigValue("fileStorageDir");
133
- return `${fileStorageDir}/${fileName}`;
166
+ getFullFilePathForDisk(fileName) {
167
+ const base = this.settingService.getConfigValue("fileStorageDir")
168
+ || default_settings_provider_service_1.DEFAULT_MEDIA_FILE_STORAGE_DIR;
169
+ if (path.isAbsolute(fileName) || fileName.startsWith(`${base}/`)) {
170
+ return fileName;
171
+ }
172
+ return `${base}/${fileName}`;
134
173
  }
135
174
  getAwsS3FullFilePath(awsMediaurl, bucketName, regionName) {
136
175
  return `https://${bucketName}.s3.${regionName}.amazonaws.com/${awsMediaurl}`;
@@ -1 +1 @@
1
- {"version":3,"file":"media.service.js","sourceRoot":"","sources":["../../src/services/media.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { forwardRef, Inject, Injectable, NotFoundException } from '@nestjs/common';\nimport { ModuleRef } from \"@nestjs/core\";\nimport { InjectEntityManager } from '@nestjs/typeorm';\nimport { EntityManager, In } from 'typeorm';\nimport type { SolidCoreSetting } from \"src/services/settings/default-settings-provider.service\";\n\nimport { ConfigService } from '@nestjs/config';\nimport { CRUDService } from 'src/services/crud.service';\nimport { DiskFileService, S3FileService } from 'src/services/file';\n\n\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\nimport { BasicFilterDto } from 'src/dtos/basic-filters.dto';\nimport { MediaStorageProviderType } from 'src/dtos/create-media-storage-provider-metadata.dto';\nimport { Media } from 'src/entities/media.entity';\nimport { FieldMetadataRepository } from 'src/repository/field-metadata.repository';\nimport { MediaStorageProviderMetadataRepository } from 'src/repository/media-storage-provider-metadata.repository';\nimport { MediaRepository } from 'src/repository/media.repository';\nimport { ModelMetadataRepository } from 'src/repository/model-metadata.repository';\nimport { getMediaStorageProvider } from \"./mediaStorageProviders\";\n\n\n@Injectable()\nexport class MediaService extends CRUDService<Media> {\n constructor(\n readonly configService: ConfigService,\n readonly diskFileService: DiskFileService,\n readonly s3FileService: S3FileService,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n // @InjectRepository(Media, 'default')\n // readonly repo: Repository<Media>,\n readonly repo: MediaRepository,\n // @InjectRepository(ModelMetadata)\n // private readonly modelMetadataRepo: Repository<ModelMetadata>,\n // @InjectRepository(MediaStorageProviderMetadata)\n // private readonly mediaStorageProviderMetadataRepo: Repository<MediaStorageProviderMetadata>,\n // @InjectRepository(FieldMetadata)\n // private readonly fieldMetadataRepo: Repository<FieldMetadata>,\n @Inject(forwardRef(() => ModelMetadataRepository))\n private readonly modelMetadataRepo: ModelMetadataRepository,\n private readonly mediaStorageProviderMetadataRepo: MediaStorageProviderMetadataRepository,\n private readonly fieldMetadataRepo: FieldMetadataRepository,\n readonly moduleRef: ModuleRef,\n ) {\n super(entityManager, repo, 'media', 'solid-core', moduleRef);\n }\n\n async find(basicFilterDto: BasicFilterDto, solidRequestContext: any = {}) {\n const data = await super.find(basicFilterDto, solidRequestContext);\n if (data.records) {\n\n for (const media of data.records) {\n if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.Filesystem) {\n media.relativeUri = `${this.settingService.getConfigValue<SolidCoreSetting>(\"baseUrl\")}/${await this.getFileSysytemFullFilePath(media.relativeUri)}`;\n } else if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.AwsS3) {\n media.relativeUri = this.getAwsS3FullFilePath(\n media.relativeUri,\n media.mediaStorageProviderMetadata.bucketName,\n media.mediaStorageProviderMetadata.region\n );\n }\n }\n // data.records.forEach((media: Media) => {\n // if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.Filesystem) {\n // media.relativeUri = `${process.env.BASE_URL}/${await this.getFileSysytemFullFilePath(media.relativeUri)}`;\n // } else if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.AwsS3) {\n // media.relativeUri = this.getAwsS3FullFilePath(\n // media.relativeUri,\n // media.mediaStorageProviderMetadata.bucketName,\n // media.mediaStorageProviderMetadata.region\n // );\n // }\n // });\n }\n if (data.groupRecords) {\n\n for (const group of data.groupRecords) {\n for (const media of group.groupData.records) {\n if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.Filesystem) {\n media.relativeUri = `${this.settingService.getConfigValue<SolidCoreSetting>(\"baseUrl\")}/${await this.getFileSysytemFullFilePath(media.relativeUri)}`;\n }\n else if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.AwsS3) {\n media.relativeUri = this.getAwsS3FullFilePath(media.relativeUri, media.mediaStorageProviderMetadata.bucketName, media.mediaStorageProviderMetadata.region);\n }\n }\n }\n\n // data.groupRecords.forEach((group) => {\n // group.groupData.records.forEach((media) => {\n // if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.Filesystem) {\n // media.relativeUri = `${process.env.BASE_URL}/${this.getFileSysytemFullFilePath(media.relativeUri)}`;\n // }\n // else if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.AwsS3) {\n // media.relativeUri = this.getAwsS3FullFilePath(media.relativeUri, media.mediaStorageProviderMetadata.bucketName, media.mediaStorageProviderMetadata.region);\n // }\n // });\n // });\n }\n return data\n }\n\n async upload(createDto: any, files: Array<Express.Multer.File>) {\n\n if (!files) {\n throw new NotFoundException(ERROR_MESSAGES.FILE_NOT_FOUND);\n\n }\n const savedMedias = [];\n for (let i = 0; i < files.length; i++) {\n\n createDto['fieldMetadata'] = await this.fieldMetadataRepo.findOne({\n where: {\n id: createDto['fieldMetadataId']\n },\n });\n createDto['modelMetadata'] = await this.modelMetadataRepo.findOne({\n where: {\n id: createDto['modelMetadataId']\n },\n });\n createDto['mediaStorageProviderMetadata'] = await this.mediaStorageProviderMetadataRepo.findOne({\n where: {\n id: createDto['mediaStorageProviderMetadataId']\n },\n });\n\n const file = files[i];\n\n switch (createDto.mediaStorageProviderMetadata.type) {\n case MediaStorageProviderType.Filesystem:\n const fileStoragePath = await this.getFileSysytemFullFilePath(this.getFileName(file));\n await this.diskFileService.copy(file.path, fileStoragePath);\n createDto['relativeUri'] = this.getFileName(file);\n break;\n case MediaStorageProviderType.AwsS3:\n const fileName = this.getFileName(file);\n const bucketName = createDto.mediaStorageProviderMetadata.bucketName;\n\n // Read file from disk and upload to S3\n const fileData = await this.diskFileService.read(file.path);\n await this.s3FileService.write(`${bucketName}:${fileName}`, fileData, { contentType: file.mimetype });\n\n createDto['relativeUri'] = fileName;\n break;\n default:\n break;\n }\n // Delete temp file from disk\n await this.diskFileService.delete(file.path);\n\n const media = this.repo.create(createDto);\n const savedMedia = await this.repo.save(media);\n savedMedias.push(savedMedia)\n }\n return savedMedias\n }\n\n async remove(id: number) {\n // const lov = await this.findOne(id);\n const media = await this.repo.findOne({\n where: {\n id: id,\n },\n relations: ['mediaStorageProviderMetadata', 'fieldMetadata', 'fieldMetadata.model', 'fieldMetadata.mediaStorageProvider'],\n });\n const modelEntity = await this.modelMetadataRepo.findOne({\n where: {\n id: media.entityId,\n }\n }\n );\n // if (media.mediaStorageProviderMetadata.type === 'filesystem') {\n // const fileStorageProvider = new FileStorageProvider(this.configService, this.fileService, this);\n\n // await fileStorageProvider.delete(media, media.fieldMetadata);\n\n // } else if (media.mediaStorageProviderMetadata.type === 'aws-s3') {\n // const fileStorageProvider = new FileS3StorageProvider(this.configService, this.fileService, this);\n // await fileStorageProvider.delete(media, media.fieldMetadata);\n\n // } else {\n // }\n const storageProviderType = media.mediaStorageProviderMetadata.type as MediaStorageProviderType;\n const storageProvider = await getMediaStorageProvider(this.moduleRef, storageProviderType);\n await storageProvider.delete(modelEntity, media.fieldMetadata);\n\n return this.repo.remove(media);\n }\n //TODO: Move this to a app builder config\n\n private async getFileSysytemFullFilePath(fileName: string): Promise<string> {\n const fileStorageDir = this.settingService.getConfigValue<SolidCoreSetting>(\"fileStorageDir\");\n return `${fileStorageDir}/${fileName}`;\n }\n\n private getAwsS3FullFilePath(awsMediaurl: string, bucketName: string, regionName: string): string {\n // https://lunarismedia.s3.ap-south-1.amazonaws.com/LUNARIS_CP_REGISTRATION_CREATIVE.jpg\n return `https://${bucketName}.s3.${regionName}.amazonaws.com/${awsMediaurl}`;\n }\n\n private getFileName(file: Express.Multer.File): string {\n return `${file.filename}-${file.originalname}`;\n }\n\n}\n"]}
1
+ {"version":3,"file":"media.service.js","sourceRoot":"","sources":["../../src/services/media.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { forwardRef, Inject, Injectable, NotFoundException } from '@nestjs/common';\nimport { ModuleRef } from \"@nestjs/core\";\nimport { InjectEntityManager } from '@nestjs/typeorm';\nimport { EntityManager, In } from 'typeorm';\nimport * as path from 'path';\nimport { DEFAULT_MEDIA_FILE_STORAGE_DIR } from \"src/services/settings/default-settings-provider.service\";\nimport type { SolidCoreSetting } from \"src/services/settings/default-settings-provider.service\";\n\nimport { ConfigService } from '@nestjs/config';\nimport { CRUDService } from 'src/services/crud.service';\nimport { DiskFileService, S3FileService } from 'src/services/file';\n\n\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\nimport { BasicFilterDto } from 'src/dtos/basic-filters.dto';\nimport { MediaStorageProviderType } from 'src/dtos/create-media-storage-provider-metadata.dto';\nimport { Media } from 'src/entities/media.entity';\nimport { FieldMetadataRepository } from 'src/repository/field-metadata.repository';\nimport { MediaStorageProviderMetadataRepository } from 'src/repository/media-storage-provider-metadata.repository';\nimport { MediaRepository } from 'src/repository/media.repository';\nimport { ModelMetadataRepository } from 'src/repository/model-metadata.repository';\nimport { getMediaStorageProvider } from \"./mediaStorageProviders\";\n\n\n@Injectable()\nexport class MediaService extends CRUDService<Media> {\n constructor(\n readonly configService: ConfigService,\n readonly diskFileService: DiskFileService,\n readonly s3FileService: S3FileService,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n // @InjectRepository(Media, 'default')\n // readonly repo: Repository<Media>,\n readonly repo: MediaRepository,\n // @InjectRepository(ModelMetadata)\n // private readonly modelMetadataRepo: Repository<ModelMetadata>,\n // @InjectRepository(MediaStorageProviderMetadata)\n // private readonly mediaStorageProviderMetadataRepo: Repository<MediaStorageProviderMetadata>,\n // @InjectRepository(FieldMetadata)\n // private readonly fieldMetadataRepo: Repository<FieldMetadata>,\n @Inject(forwardRef(() => ModelMetadataRepository))\n private readonly modelMetadataRepo: ModelMetadataRepository,\n private readonly mediaStorageProviderMetadataRepo: MediaStorageProviderMetadataRepository,\n private readonly fieldMetadataRepo: FieldMetadataRepository,\n readonly moduleRef: ModuleRef,\n ) {\n super(entityManager, repo, 'media', 'solid-core', moduleRef);\n }\n\n async find(basicFilterDto: BasicFilterDto, solidRequestContext: any = {}) {\n const data = await super.find(basicFilterDto, solidRequestContext);\n if (data.records) {\n\n for (const media of data.records) {\n if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.Filesystem) {\n media.relativeUri = `${this.settingService.getConfigValue<SolidCoreSetting>(\"baseUrl\")}/${this.getFullFilePathForDisk(media.relativeUri)}`;\n } else if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.AwsS3) {\n media.relativeUri = this.getAwsS3FullFilePath(\n media.relativeUri,\n media.mediaStorageProviderMetadata.bucketName,\n media.mediaStorageProviderMetadata.region\n );\n }\n }\n // data.records.forEach((media: Media) => {\n // if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.Filesystem) {\n // media.relativeUri = `${process.env.BASE_URL}/${this.getFileSysytemFullFilePath(media.relativeUri)}`;\n // } else if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.AwsS3) {\n // media.relativeUri = this.getAwsS3FullFilePath(\n // media.relativeUri,\n // media.mediaStorageProviderMetadata.bucketName,\n // media.mediaStorageProviderMetadata.region\n // );\n // }\n // });\n }\n if (data.groupRecords) {\n\n for (const group of data.groupRecords) {\n for (const media of group.groupData.records) {\n if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.Filesystem) {\n media.relativeUri = `${this.settingService.getConfigValue<SolidCoreSetting>(\"baseUrl\")}/${this.getFullFilePathForDisk(media.relativeUri)}`;\n }\n else if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.AwsS3) {\n media.relativeUri = this.getAwsS3FullFilePath(media.relativeUri, media.mediaStorageProviderMetadata.bucketName, media.mediaStorageProviderMetadata.region);\n }\n }\n }\n\n // data.groupRecords.forEach((group) => {\n // group.groupData.records.forEach((media) => {\n // if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.Filesystem) {\n // media.relativeUri = `${process.env.BASE_URL}/${this.getFileSysytemFullFilePath(media.relativeUri)}`;\n // }\n // else if (media.mediaStorageProviderMetadata?.type === MediaStorageProviderType.AwsS3) {\n // media.relativeUri = this.getAwsS3FullFilePath(media.relativeUri, media.mediaStorageProviderMetadata.bucketName, media.mediaStorageProviderMetadata.region);\n // }\n // });\n // });\n }\n return data\n }\n\n async upload(createDto: any, files: Array<Express.Multer.File>) {\n\n if (!files) {\n throw new NotFoundException(ERROR_MESSAGES.FILE_NOT_FOUND);\n\n }\n const savedMedias = [];\n for (let i = 0; i < files.length; i++) {\n\n createDto['fieldMetadata'] = await this.fieldMetadataRepo.findOne({\n where: {\n id: createDto['fieldMetadataId']\n },\n });\n createDto['modelMetadata'] = await this.modelMetadataRepo.findOne({\n where: {\n id: createDto['modelMetadataId']\n },\n });\n createDto['mediaStorageProviderMetadata'] = await this.mediaStorageProviderMetadataRepo.findOne({\n where: {\n id: createDto['mediaStorageProviderMetadataId']\n },\n });\n\n const file = files[i];\n\n switch (createDto.mediaStorageProviderMetadata.type) {\n case MediaStorageProviderType.Filesystem:\n const fileStoragePath = this.getFullFilePathForDisk(this.getFileName(file));\n await this.diskFileService.copy(file.path, fileStoragePath);\n createDto['relativeUri'] = this.getFileName(file);\n break;\n case MediaStorageProviderType.AwsS3:\n const fileName = this.getFileName(file);\n const bucketName = createDto.mediaStorageProviderMetadata.bucketName;\n\n // Read file from disk and upload to S3\n const fileData = await this.diskFileService.read(file.path);\n await this.s3FileService.write(`${bucketName}:${fileName}`, fileData, { contentType: file.mimetype });\n\n createDto['relativeUri'] = fileName;\n break;\n default:\n break;\n }\n // Delete temp file from disk\n await this.diskFileService.delete(file.path);\n\n const media = this.repo.create(createDto);\n const savedMedia = await this.repo.save(media);\n savedMedias.push(savedMedia)\n }\n return savedMedias\n }\n\n async remove(id: number) {\n // const lov = await this.findOne(id);\n const media = await this.repo.findOne({\n where: {\n id: id,\n },\n relations: ['mediaStorageProviderMetadata', 'fieldMetadata', 'fieldMetadata.model', 'fieldMetadata.mediaStorageProvider'],\n });\n const modelEntity = await this.modelMetadataRepo.findOne({\n where: {\n id: media.entityId,\n }\n }\n );\n // if (media.mediaStorageProviderMetadata.type === 'filesystem') {\n // const fileStorageProvider = new FileStorageProvider(this.configService, this.fileService, this);\n\n // await fileStorageProvider.delete(media, media.fieldMetadata);\n\n // } else if (media.mediaStorageProviderMetadata.type === 'aws-s3') {\n // const fileStorageProvider = new FileS3StorageProvider(this.configService, this.fileService, this);\n // await fileStorageProvider.delete(media, media.fieldMetadata);\n\n // } else {\n // }\n const storageProviderType = media.mediaStorageProviderMetadata.type as MediaStorageProviderType;\n const storageProvider = await getMediaStorageProvider(this.moduleRef, storageProviderType);\n await storageProvider.delete(modelEntity, media.fieldMetadata);\n\n return this.repo.remove(media);\n }\n //TODO: Move this to a app builder config\n\n private getFullFilePathForDisk(fileName: string): string {\n const base = this.settingService.getConfigValue<SolidCoreSetting>(\"fileStorageDir\")\n || DEFAULT_MEDIA_FILE_STORAGE_DIR;\n if (path.isAbsolute(fileName) || fileName.startsWith(`${base}/`)) {\n return fileName;\n }\n return `${base}/${fileName}`;\n }\n\n private getAwsS3FullFilePath(awsMediaurl: string, bucketName: string, regionName: string): string {\n // https://lunarismedia.s3.ap-south-1.amazonaws.com/LUNARIS_CP_REGISTRATION_CREATIVE.jpg\n return `https://${bucketName}.s3.${regionName}.amazonaws.com/${awsMediaurl}`;\n }\n\n private getFileName(file: Express.Multer.File): string {\n return `${file.filename}-${file.originalname}`;\n }\n\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"file-s3-storage-provider.js","sourceRoot":"","sources":["../../../src/services/mediaStorageProviders/file-s3-storage-provider.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAoD;AACpD,2CAA+C;AAC/C,gEAA0D;AAE1D,8EAAuE;AACvE,8FAAqF;AAGrF,kCAAmE;AAEnE,wEAAkE;AAG3D,IAAM,qBAAqB,6BAA3B,MAAM,qBAAqB;IAG9B,YACqB,aAA4B,EACpC,eAAgC,EAChC,aAA4B,EAC5B,eAAgC;QAHxB,kBAAa,GAAb,aAAa,CAAe;QACpC,oBAAe,GAAf,eAAe,CAAiB;QAChC,kBAAa,GAAb,aAAa,CAAe;QAC5B,oBAAe,GAAf,eAAe,CAAiB;QANrC,WAAM,GAAG,IAAI,eAAM,CAAC,uBAAqB,CAAC,IAAI,CAAC,CAAC;IAOpD,CAAC;IAEL,YAAY,CAAC,WAAiC,EAAE,MAAS,EAAE,kBAAiC;QACxF,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAS,EAAE,kBAAiC;QACvD,MAAM,iBAAiB,GAAG,MAAM,YAAY,4BAAY;eACjD,MAAM,YAAY,yCAAkB;eACpC,MAAM,YAAY,uDAAwB,CAAC;QAClD,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,4FAA4F,CAAC,CAAC;QAClH,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,0CAA0C,CAAC,MAAM,CAAC,EAAE,EAAE,kBAAkB,CAAC,EAAE,EAAE,kBAAkB,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,8BAA8B,CAAC,CAAC,CAAC;QAKrL,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACpB,MAAM,WAAW,GAAG,CAAC,CAAC,4BAA4B,CAAC;YACnD,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC3D,IAAI,WAAW,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;gBAEjC,MAAM,eAAe,GAAG,CAAC,WAAW,CAAC,eAAe,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC;gBACjE,CAAC,CAAC,WAAW,CAAC,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,WAAW,EAAE,UAAU,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC;YAC5I,CAAC;iBAAM,CAAC;gBAEJ,CAAC,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC7C,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC;IAKjB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAA4B,EAAE,MAAS,EAAE,kBAAiC;QAClF,MAAM,iBAAiB,GAAG,MAAM,YAAY,4BAAY;eACjD,MAAM,YAAY,yCAAkB;eACpC,MAAM,YAAY,uDAAwB,CAAC;QAClD,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,4FAA4F,CAAC,CAAC;QAClH,CAAC;QACD,MAAM,MAAM,GAAY,EAAE,CAAC;QAC3B,MAAM,eAAe,GAAG,kBAAkB,CAAC,oBAAoB,CAAC;QAChE,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAE/D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,UAAU,GAAG,eAAe,CAAC,UAAU,CAAC;YAG9C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5D,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,UAAU,IAAI,QAAQ,EAAE,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;YAG9G,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAE7C,MAAM,UAAU,GAAG,QAAQ,CAAC;YAG5B,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC;gBAEvD,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACnB,eAAe,EAAE,kBAAkB,CAAC,KAAK,CAAC,EAAE;gBAC5C,WAAW,EAAE,UAAU;gBACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,gBAAgB,EAAE,IAAI,CAAC,YAAY;gBACnC,8BAA8B,EAAE,kBAAkB,CAAC,oBAAoB,CAAC,EAAE;gBAC1E,eAAe,EAAE,kBAAkB,CAAC,EAAE;aACzC,CAAqB,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACzB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC;QACxD,CAAC;QAAA,CAAC;QACF,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAS,EAAE,kBAAiC;QACrD,MAAM,iBAAiB,GAAG,MAAM,YAAY,4BAAY;eACjD,MAAM,YAAY,yCAAkB;eACpC,MAAM,YAAY,uDAAwB,CAAC;QAClD,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,4FAA4F,CAAC,CAAC;QAClH,CAAC;QACD,MAAM,eAAe,GAAG,kBAAkB,CAAC,oBAAoB,CAAC;QAChE,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAG/D,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,0CAA0C,CAAC,MAAM,CAAC,EAAE,EAAE,kBAAkB,CAAC,EAAE,EAAE,kBAAkB,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,8BAA8B,CAAC,CAAC,CAAC;QAE7L,IAAI,CAAC,eAAe,CAAC,4CAA4C,CAAC,MAAM,CAAC,EAAE,EAAE,kBAAkB,CAAC,EAAE,EAAE,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjI,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;YAChC,MAAM,UAAU,GAAG,eAAe,CAAC,UAAU,CAAC;YAC9C,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,UAAU,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACtF,CAAC;IACL,CAAC;IAMO,kBAAkB,CAAC,cAAuB;QAC9C,OAAO,cAAc,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAC1E,CAAC;IAEO,eAAe,CAAC,KAAY;QAEhC,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAC;QAElF,OAAO,WAAW,KAAK,CAAC,4BAA4B,CAAC,UAAU,OAAO,MAAM,kBAAkB,KAAK,CAAC,WAAW,EAAE,CAAC;IACtH,CAAC;IAEO,WAAW,CAAC,IAAyB;QACzC,OAAO,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;IACnD,CAAC;CACJ,CAAA;AA/HY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,mBAAU,GAAE;qCAK2B,sBAAa;QACnB,sBAAe;QACjB,oBAAa;QACX,kCAAe;GAPpC,qBAAqB,CA+HjC","sourcesContent":["import { Injectable, Logger } from \"@nestjs/common\";\nimport { ConfigService } from \"@nestjs/config\";\nimport { CommonEntity } from \"src/entities/common.entity\";\nimport { FieldMetadata } from \"src/entities/field-metadata.entity\";\nimport { LegacyCommonEntity } from \"src/entities/legacy-common.entity\";\nimport { LegacyCommonWithIdEntity } from \"src/entities/legacy-common-with-id.entity\";\nimport { Media } from \"src/entities/media.entity\";\nimport { MediaStorageProvider } from \"src/interfaces\";\nimport { DiskFileService, S3FileService } from \"src/services/file\";\nimport { Readable } from \"stream\";\nimport { MediaRepository } from \"src/repository/media.repository\";\n\n@Injectable()\nexport class FileS3StorageProvider<T> implements MediaStorageProvider<T> {\n private logger = new Logger(FileS3StorageProvider.name);\n\n constructor(\n private readonly configService: ConfigService,\n readonly diskFileService: DiskFileService,\n readonly s3FileService: S3FileService,\n readonly mediaRepository: MediaRepository,\n ) { }\n\n storeStreams(streamPairs: [Readable, string][], entity: T, mediaFieldMetadata: FieldMetadata): Promise<Media[]> {\n throw new Error(\"Method not implemented.\");\n }\n\n async retrieve(entity: T, mediaFieldMetadata: FieldMetadata): Promise<Media[]> {\n const isSupportedEntity = entity instanceof CommonEntity\n || entity instanceof LegacyCommonEntity\n || entity instanceof LegacyCommonWithIdEntity;\n if (!isSupportedEntity) {\n throw new Error(\"Entity must be an instance of CommonEntity, LegacyCommonEntity or LegacyCommonWithIdEntity\"); // FIXME This needs to be handled through generics. e.g T extends CommonEntity\n }\n // @ts-ignore\n const media = await this.mediaRepository.findByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id, ['mediaStorageProviderMetadata']);\n\n // TODO: Check if the mediaStorageProvider (s3 in this case) is configured with a public bucket or not.\n // If private bucket then we need to return a \"signed-url\", the timeout for the signed url can be configured in the media storage provider entity and modified using the CRUD interface.\n // Add the full URL to the media\n for (const m of media) {\n const storageMeta = m.mediaStorageProviderMetadata;\n const region = this.getEffectiveRegion(storageMeta.region);\n if (storageMeta.isPublic === false) {\n // Generate signed URL\n const expiryInSeconds = (storageMeta.signedUrlExpiry ?? 60) * 60; // default 5 min\n m['_full_url'] = await this.s3FileService.getUrl(`${storageMeta?.bucketName}:${m.relativeUri}`, { expiresIn: expiryInSeconds, region });\n } else {\n // Public S3 or local filesystem: use normal URL\n m['_full_url'] = this.getFullFilePath(m);\n }\n }\n\n return media;\n // media.forEach(m => {\n // m['_full_url'] = this.getFullFilePath(m);\n // });\n // return media;\n }\n\n async store(files: Express.Multer.File[], entity: T, mediaFieldMetadata: FieldMetadata): Promise<Media[]> {\n const isSupportedEntity = entity instanceof CommonEntity\n || entity instanceof LegacyCommonEntity\n || entity instanceof LegacyCommonWithIdEntity;\n if (!isSupportedEntity) {\n throw new Error(\"Entity must be an instance of CommonEntity, LegacyCommonEntity or LegacyCommonWithIdEntity\"); // FIXME This needs to be handled through generics. e.g T extends CommonEntity\n }\n const result: Media[] = [];\n const storageProvider = mediaFieldMetadata.mediaStorageProvider;\n const region = this.getEffectiveRegion(storageProvider.region);\n\n for (const file of files) {\n const fileName = this.getFileName(file);\n const bucketName = storageProvider.bucketName;\n\n // Read file from disk and upload to S3\n const fileData = await this.diskFileService.read(file.path);\n await this.s3FileService.write(`${bucketName}:${fileName}`, fileData, { contentType: file.mimetype, region });\n\n // Delete temp file from disk\n await this.diskFileService.delete(file.path);\n\n const awsFileUrl = fileName;\n\n // Create an entry in the media table\n const mediaEntity = await this.mediaRepository.createMedia({\n // @ts-ignore\n entityId: entity.id,\n modelMetadataId: mediaFieldMetadata.model.id,\n relativeUri: awsFileUrl,\n mimeType: file.mimetype,\n fileSize: file.size,\n originalFileName: file.originalname,\n mediaStorageProviderMetadataId: mediaFieldMetadata.mediaStorageProvider.id,\n fieldMetadataId: mediaFieldMetadata.id\n }) as unknown as Media;\n result.push(mediaEntity);\n this.logger.debug(`Stored media with`, mediaEntity);\n };\n return result;\n }\n\n async delete(entity: T, mediaFieldMetadata: FieldMetadata): Promise<void> {\n const isSupportedEntity = entity instanceof CommonEntity\n || entity instanceof LegacyCommonEntity\n || entity instanceof LegacyCommonWithIdEntity;\n if (!isSupportedEntity) {\n throw new Error(\"Entity must be an instance of CommonEntity, LegacyCommonEntity or LegacyCommonWithIdEntity\"); // FIXME This needs to be handled through generics. e.g T extends CommonEntity\n }\n const storageProvider = mediaFieldMetadata.mediaStorageProvider;\n const region = this.getEffectiveRegion(storageProvider.region);\n\n // @ts-ignore\n const existingMedia = await this.mediaRepository.findByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id, ['mediaStorageProviderMetadata']);\n // @ts-ignore\n this.mediaRepository.deleteByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id);\n for (const media of existingMedia) {\n const bucketName = storageProvider.bucketName;\n await this.s3FileService.delete(`${bucketName}:${media.relativeUri}`, { region });\n }\n }\n\n /**\n * Get the effective region to use for S3 operations.\n * Uses the provider-specific region if configured, otherwise falls back to env variable.\n */\n private getEffectiveRegion(providerRegion?: string): string | undefined {\n return providerRegion || this.configService.get('S3_AWS_REGION_NAME');\n }\n\n private getFullFilePath(media: Media): string {\n // Use provider region if available, fallback to env variable\n const region = this.getEffectiveRegion(media.mediaStorageProviderMetadata.region);\n // https://lunarismedia.s3.ap-south-1.amazonaws.com/LUNARIS_CP_REGISTRATION_CREATIVE.jpg\n return `https://${media.mediaStorageProviderMetadata.bucketName}.s3.${region}.amazonaws.com/${media.relativeUri}`;\n }\n\n private getFileName(file: Express.Multer.File): string {\n return `${file.filename}-${file.originalname}`;\n }\n}\n"]}
1
+ {"version":3,"file":"file-s3-storage-provider.js","sourceRoot":"","sources":["../../../src/services/mediaStorageProviders/file-s3-storage-provider.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAoD;AACpD,2CAA+C;AAC/C,gEAA0D;AAE1D,8EAAuE;AACvE,8FAAqF;AAGrF,kCAAmE;AAEnE,wEAAkE;AAG3D,IAAM,qBAAqB,6BAA3B,MAAM,qBAAqB;IAG9B,YACqB,aAA4B,EACpC,eAAgC,EAChC,aAA4B,EAC5B,eAAgC;QAHxB,kBAAa,GAAb,aAAa,CAAe;QACpC,oBAAe,GAAf,eAAe,CAAiB;QAChC,kBAAa,GAAb,aAAa,CAAe;QAC5B,oBAAe,GAAf,eAAe,CAAiB;QANrC,WAAM,GAAG,IAAI,eAAM,CAAC,uBAAqB,CAAC,IAAI,CAAC,CAAC;IAOpD,CAAC;IAEL,YAAY,CAAC,WAAiC,EAAE,MAAS,EAAE,kBAAiC;QACxF,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAS,EAAE,kBAAiC;QACvD,MAAM,iBAAiB,GAAG,MAAM,YAAY,4BAAY;eACjD,MAAM,YAAY,yCAAkB;eACpC,MAAM,YAAY,uDAAwB,CAAC;QAClD,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,4FAA4F,CAAC,CAAC;QAClH,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,0CAA0C,CAAC,MAAM,CAAC,EAAE,EAAE,kBAAkB,CAAC,EAAE,EAAE,kBAAkB,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,8BAA8B,CAAC,CAAC,CAAC;QAKrL,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACpB,MAAM,WAAW,GAAG,CAAC,CAAC,4BAA4B,CAAC;YACnD,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC3D,IAAI,WAAW,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;gBAEjC,MAAM,eAAe,GAAG,CAAC,WAAW,CAAC,eAAe,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC;gBACjE,CAAC,CAAC,WAAW,CAAC,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,WAAW,EAAE,UAAU,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC;YAC5I,CAAC;iBAAM,CAAC;gBAEJ,CAAC,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC7C,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC;IAKjB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAA4B,EAAE,MAAS,EAAE,kBAAiC;QAClF,MAAM,iBAAiB,GAAG,MAAM,YAAY,4BAAY;eACjD,MAAM,YAAY,yCAAkB;eACpC,MAAM,YAAY,uDAAwB,CAAC;QAClD,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,4FAA4F,CAAC,CAAC;QAClH,CAAC;QACD,MAAM,MAAM,GAAY,EAAE,CAAC;QAC3B,MAAM,eAAe,GAAG,kBAAkB,CAAC,oBAAoB,CAAC;QAChE,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAE/D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,UAAU,GAAG,eAAe,CAAC,UAAU,CAAC;YAG9C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5D,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,UAAU,IAAI,QAAQ,EAAE,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;YAG9G,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAE7C,MAAM,UAAU,GAAG,QAAQ,CAAC;YAG5B,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC;gBAEvD,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACnB,eAAe,EAAE,kBAAkB,CAAC,KAAK,CAAC,EAAE;gBAC5C,WAAW,EAAE,UAAU;gBACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,gBAAgB,EAAE,IAAI,CAAC,YAAY;gBACnC,8BAA8B,EAAE,kBAAkB,CAAC,oBAAoB,CAAC,EAAE;gBAC1E,eAAe,EAAE,kBAAkB,CAAC,EAAE;aACzC,CAAqB,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACzB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC;QACxD,CAAC;QAAA,CAAC;QACF,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAS,EAAE,kBAAiC;QACrD,MAAM,iBAAiB,GAAG,MAAM,YAAY,4BAAY;eACjD,MAAM,YAAY,yCAAkB;eACpC,MAAM,YAAY,uDAAwB,CAAC;QAClD,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,4FAA4F,CAAC,CAAC;QAClH,CAAC;QACD,MAAM,eAAe,GAAG,kBAAkB,CAAC,oBAAoB,CAAC;QAChE,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAG/D,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,0CAA0C,CAAC,MAAM,CAAC,EAAE,EAAE,kBAAkB,CAAC,EAAE,EAAE,kBAAkB,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,8BAA8B,CAAC,CAAC,CAAC;QAE7L,IAAI,CAAC,eAAe,CAAC,4CAA4C,CAAC,MAAM,CAAC,EAAE,EAAE,kBAAkB,CAAC,EAAE,EAAE,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjI,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;YAChC,MAAM,UAAU,GAAG,eAAe,CAAC,UAAU,CAAC;YAC9C,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,UAAU,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACtF,CAAC;IACL,CAAC;IAMO,kBAAkB,CAAC,cAAuB;QAC9C,OAAO,cAAc,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAC1E,CAAC;IAEO,eAAe,CAAC,KAAY;QAEhC,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAC;QAElF,OAAO,WAAW,KAAK,CAAC,4BAA4B,CAAC,UAAU,OAAO,MAAM,kBAAkB,KAAK,CAAC,WAAW,EAAE,CAAC;IACtH,CAAC;IAEO,WAAW,CAAC,IAAyB;QACzC,OAAO,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;IACnD,CAAC;CACJ,CAAA;AA/HY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,mBAAU,GAAE;qCAK2B,sBAAa;QACnB,sBAAe;QACjB,oBAAa;QACX,kCAAe;GAPpC,qBAAqB,CA+HjC","sourcesContent":["import { Injectable, Logger } from \"@nestjs/common\";\nimport { ConfigService } from \"@nestjs/config\";\nimport { CommonEntity } from \"src/entities/common.entity\";\nimport { FieldMetadata } from \"src/entities/field-metadata.entity\";\nimport { LegacyCommonEntity } from \"src/entities/legacy-common.entity\";\nimport { LegacyCommonWithIdEntity } from \"src/entities/legacy-common-with-id.entity\";\nimport { Media } from \"src/entities/media.entity\";\nimport { MediaStorageProvider } from \"src/interfaces\";\nimport { DiskFileService, S3FileService } from \"src/services/file\";\nimport { Readable } from \"stream\";\nimport { MediaRepository } from \"src/repository/media.repository\";\n\n@Injectable()\nexport class FileS3StorageProvider<T> implements MediaStorageProvider<T> {\n private logger = new Logger(FileS3StorageProvider.name);\n\n constructor(\n private readonly configService: ConfigService,\n readonly diskFileService: DiskFileService,\n readonly s3FileService: S3FileService,\n readonly mediaRepository: MediaRepository,\n ) { }\n\n storeStreams(streamPairs: [Readable, string][], entity: T, mediaFieldMetadata: FieldMetadata): Promise<Media[]> {\n throw new Error(\"Method not implemented.\");\n }\n\n async retrieve(entity: T, mediaFieldMetadata: FieldMetadata): Promise<Media[]> {\n const isSupportedEntity = entity instanceof CommonEntity\n || entity instanceof LegacyCommonEntity\n || entity instanceof LegacyCommonWithIdEntity;\n if (!isSupportedEntity) {\n throw new Error(\"Entity must be an instance of CommonEntity, LegacyCommonEntity or LegacyCommonWithIdEntity\"); // FIXME This needs to be handled through generics. e.g T extends CommonEntity\n }\n // @ts-ignore\n const media = await this.mediaRepository.findByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id, ['mediaStorageProviderMetadata']);\n\n // TODO: Check if the mediaStorageProvider (s3 in this case) is configured with a public bucket or not.\n // If private bucket then we need to return a \"signed-url\", the timeout for the signed url can be configured in the media storage provider entity and modified using the CRUD interface.\n // Add the full URL to the media\n for (const m of media) {\n const storageMeta = m.mediaStorageProviderMetadata;\n const region = this.getEffectiveRegion(storageMeta.region);\n if (storageMeta.isPublic === false) {\n // Generate signed URL\n const expiryInSeconds = (storageMeta.signedUrlExpiry ?? 60) * 60;\n m['_full_url'] = await this.s3FileService.getUrl(`${storageMeta?.bucketName}:${m.relativeUri}`, { expiresIn: expiryInSeconds, region });\n } else {\n // Public S3 or local filesystem: use normal URL\n m['_full_url'] = this.getFullFilePath(m);\n }\n }\n\n return media;\n // media.forEach(m => {\n // m['_full_url'] = this.getFullFilePath(m);\n // });\n // return media;\n }\n\n async store(files: Express.Multer.File[], entity: T, mediaFieldMetadata: FieldMetadata): Promise<Media[]> {\n const isSupportedEntity = entity instanceof CommonEntity\n || entity instanceof LegacyCommonEntity\n || entity instanceof LegacyCommonWithIdEntity;\n if (!isSupportedEntity) {\n throw new Error(\"Entity must be an instance of CommonEntity, LegacyCommonEntity or LegacyCommonWithIdEntity\"); // FIXME This needs to be handled through generics. e.g T extends CommonEntity\n }\n const result: Media[] = [];\n const storageProvider = mediaFieldMetadata.mediaStorageProvider;\n const region = this.getEffectiveRegion(storageProvider.region);\n\n for (const file of files) {\n const fileName = this.getFileName(file);\n const bucketName = storageProvider.bucketName;\n\n // Read file from disk and upload to S3\n const fileData = await this.diskFileService.read(file.path);\n await this.s3FileService.write(`${bucketName}:${fileName}`, fileData, { contentType: file.mimetype, region });\n\n // Delete temp file from disk\n await this.diskFileService.delete(file.path);\n\n const awsFileUrl = fileName;\n\n // Create an entry in the media table\n const mediaEntity = await this.mediaRepository.createMedia({\n // @ts-ignore\n entityId: entity.id,\n modelMetadataId: mediaFieldMetadata.model.id,\n relativeUri: awsFileUrl,\n mimeType: file.mimetype,\n fileSize: file.size,\n originalFileName: file.originalname,\n mediaStorageProviderMetadataId: mediaFieldMetadata.mediaStorageProvider.id,\n fieldMetadataId: mediaFieldMetadata.id\n }) as unknown as Media;\n result.push(mediaEntity);\n this.logger.debug(`Stored media with`, mediaEntity);\n };\n return result;\n }\n\n async delete(entity: T, mediaFieldMetadata: FieldMetadata): Promise<void> {\n const isSupportedEntity = entity instanceof CommonEntity\n || entity instanceof LegacyCommonEntity\n || entity instanceof LegacyCommonWithIdEntity;\n if (!isSupportedEntity) {\n throw new Error(\"Entity must be an instance of CommonEntity, LegacyCommonEntity or LegacyCommonWithIdEntity\"); // FIXME This needs to be handled through generics. e.g T extends CommonEntity\n }\n const storageProvider = mediaFieldMetadata.mediaStorageProvider;\n const region = this.getEffectiveRegion(storageProvider.region);\n\n // @ts-ignore\n const existingMedia = await this.mediaRepository.findByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id, ['mediaStorageProviderMetadata']);\n // @ts-ignore\n this.mediaRepository.deleteByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id);\n for (const media of existingMedia) {\n const bucketName = storageProvider.bucketName;\n await this.s3FileService.delete(`${bucketName}:${media.relativeUri}`, { region });\n }\n }\n\n /**\n * Get the effective region to use for S3 operations.\n * Uses the provider-specific region if configured, otherwise falls back to env variable.\n */\n private getEffectiveRegion(providerRegion?: string): string | undefined {\n return providerRegion || this.configService.get('S3_AWS_REGION_NAME');\n }\n\n private getFullFilePath(media: Media): string {\n // Use provider region if available, fallback to env variable\n const region = this.getEffectiveRegion(media.mediaStorageProviderMetadata.region);\n // https://lunarismedia.s3.ap-south-1.amazonaws.com/LUNARIS_CP_REGISTRATION_CREATIVE.jpg\n return `https://${media.mediaStorageProviderMetadata.bucketName}.s3.${region}.amazonaws.com/${media.relativeUri}`;\n }\n\n private getFileName(file: Express.Multer.File): string {\n return `${file.filename}-${file.originalname}`;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"file-storage-provider.d.ts","sourceRoot":"","sources":["../../../src/services/mediaStorageProviders/file-storage-provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGpD,qBACa,mBAAmB,CAAC,CAAC,CAAE,YAAW,oBAAoB,CAAC,CAAC,CAAC;IAM9D,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,QAAQ,CAAC,WAAW,EAAE,eAAe;IACrC,QAAQ,CAAC,eAAe,EAAE,eAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc;IARnC,OAAO,CAAC,MAAM,CAAwC;gBAKjC,aAAa,EAAE,aAAa,EACpC,WAAW,EAAE,eAAe,EAC5B,eAAe,EAAE,eAAe,EACxB,cAAc,EAAE,cAAc;IAI7C,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,kBAAkB,EAAE,aAAa,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAiBxE,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,kBAAkB,EAAE,aAAa,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IA6BnG,YAAY,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,kBAAkB,EAAE,aAAa,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAsB/G,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,kBAAkB,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;YAgB3D,eAAe;IAM7B,OAAO,CAAC,WAAW;CAGtB"}
1
+ {"version":3,"file":"file-storage-provider.d.ts","sourceRoot":"","sources":["../../../src/services/mediaStorageProviders/file-storage-provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAIpD,qBACa,mBAAmB,CAAC,CAAC,CAAE,YAAW,oBAAoB,CAAC,CAAC,CAAC;IAM9D,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,QAAQ,CAAC,WAAW,EAAE,eAAe;IACrC,QAAQ,CAAC,eAAe,EAAE,eAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc;IARnC,OAAO,CAAC,MAAM,CAAwC;gBAKjC,aAAa,EAAE,aAAa,EACpC,WAAW,EAAE,eAAe,EAC5B,eAAe,EAAE,eAAe,EACxB,cAAc,EAAE,cAAc;IAI7C,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,kBAAkB,EAAE,aAAa,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAiBxE,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,kBAAkB,EAAE,aAAa,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IA6BnG,YAAY,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,kBAAkB,EAAE,aAAa,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAsB/G,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,kBAAkB,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBzE,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,WAAW;CAGtB"}
@@ -1,10 +1,43 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
2
18
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
19
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
20
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
21
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
22
  return c > 3 && r && Object.defineProperty(target, key, r), r;
7
23
  };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
8
41
  var __metadata = (this && this.__metadata) || function (k, v) {
9
42
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
43
  };
@@ -15,7 +48,9 @@ const common_1 = require("@nestjs/common");
15
48
  const config_1 = require("@nestjs/config");
16
49
  const media_repository_1 = require("../../repository/media.repository");
17
50
  const file_1 = require("../file");
51
+ const path = __importStar(require("path"));
18
52
  const setting_service_1 = require("../setting.service");
53
+ const default_settings_provider_service_1 = require("../settings/default-settings-provider.service");
19
54
  let FileStorageProvider = FileStorageProvider_1 = class FileStorageProvider {
20
55
  constructor(configService, fileService, mediaRepository, settingService) {
21
56
  this.configService = configService;
@@ -27,14 +62,14 @@ let FileStorageProvider = FileStorageProvider_1 = class FileStorageProvider {
27
62
  async retrieve(entity, mediaFieldMetadata) {
28
63
  const media = await this.mediaRepository.findByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id, ['mediaStorageProviderMetadata']);
29
64
  for (const m of media) {
30
- m['_full_url'] = `${this.settingService.getConfigValue("baseUrl")}/${await this.getFullFilePath(m.relativeUri)}`;
65
+ m['_full_url'] = `${this.settingService.getConfigValue("baseUrl")}/${this.getFullFilePath(m.relativeUri)}`;
31
66
  }
32
67
  return media;
33
68
  }
34
69
  async store(files, entity, mediaFieldMetadata) {
35
70
  const result = [];
36
71
  for (const file of files) {
37
- const fileStoragePath = await this.getFullFilePath(this.getFileName(file));
72
+ const fileStoragePath = this.getFullFilePath(this.getFileName(file));
38
73
  await this.fileService.copy(file.path, fileStoragePath);
39
74
  await this.fileService.delete(file.path);
40
75
  const mediaEntity = await this.mediaRepository.createMedia({
@@ -58,7 +93,7 @@ let FileStorageProvider = FileStorageProvider_1 = class FileStorageProvider {
58
93
  for (const pair of streamPairs) {
59
94
  const stream = pair[0];
60
95
  const fileName = pair[1];
61
- await this.fileService.writeStream(await this.getFullFilePath(fileName), stream);
96
+ await this.fileService.writeStream(this.getFullFilePath(fileName), stream);
62
97
  const mediaEntity = await this.mediaRepository.createMedia({
63
98
  entityId: entity.id,
64
99
  modelMetadataId: mediaFieldMetadata.model.id,
@@ -75,12 +110,16 @@ let FileStorageProvider = FileStorageProvider_1 = class FileStorageProvider {
75
110
  const existingMedia = await this.mediaRepository.findByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id, ['mediaStorageProviderMetadata']);
76
111
  this.mediaRepository.deleteByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id);
77
112
  for (const media of existingMedia) {
78
- await this.fileService.delete(await this.getFullFilePath(media.relativeUri));
113
+ await this.fileService.delete(this.getFullFilePath(media.relativeUri));
79
114
  }
80
115
  }
81
- async getFullFilePath(fileName) {
82
- const fileStorageDir = this.settingService.getConfigValue("fileStorageDir");
83
- return `${fileStorageDir}/${fileName}`;
116
+ getFullFilePath(fileName) {
117
+ const base = this.settingService.getConfigValue("fileStorageDir")
118
+ || default_settings_provider_service_1.DEFAULT_MEDIA_FILE_STORAGE_DIR;
119
+ if (path.isAbsolute(fileName) || fileName.startsWith(`${base}/`)) {
120
+ return fileName;
121
+ }
122
+ return `${base}/${fileName}`;
84
123
  }
85
124
  getFileName(file) {
86
125
  return `${file.filename}-${file.originalname}`;
@@ -1 +1 @@
1
- {"version":3,"file":"file-storage-provider.js","sourceRoot":"","sources":["../../../src/services/mediaStorageProviders/file-storage-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, Logger } from \"@nestjs/common\";\nimport { ConfigService } from \"@nestjs/config\";\nimport { CommonEntity } from \"src/entities/common.entity\";\nimport { FieldMetadata } from \"src/entities/field-metadata.entity\";\nimport { Media } from \"src/entities/media.entity\";\nimport { MediaStorageProvider } from \"src/interfaces\";\nimport { MediaRepository } from \"src/repository/media.repository\";\nimport { DiskFileService } from \"src/services/file\";\nimport { Readable } from \"stream\";\nimport { SettingService } from \"../setting.service\";\nimport type { SolidCoreSetting } from \"src/services/settings/default-settings-provider.service\";\n\n@Injectable()\nexport class FileStorageProvider<T> implements MediaStorageProvider<T> {\n private logger = new Logger(FileStorageProvider.name);\n\n constructor(\n // @Inject(appBuilderConfig.KEY)\n // private readonly appBuilderConfiguration: ConfigType<typeof appBuilderConfig>,\n private readonly configService: ConfigService,\n readonly fileService: DiskFileService,\n readonly mediaRepository: MediaRepository,\n private readonly settingService: SettingService\n\n ) { }\n\n async retrieve(entity: T, mediaFieldMetadata: FieldMetadata): Promise<Media[]> {\n // if (!(entity instanceof CommonEntity)) {\n // throw new Error(\"Entity must be an instance of CommonEntity\"); //FIXME This needs to be handled through generics. e.g T extends CommonEntity\n // }\n //@ts-ignore\n const media = await this.mediaRepository.findByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id, ['mediaStorageProviderMetadata']);\n // Add the full URL to the media\n // media.forEach(m => {\n // });\n for (const m of media) {\n m['_full_url'] = `${this.settingService.getConfigValue<SolidCoreSetting>(\"baseUrl\")}/${await this.getFullFilePath(m.relativeUri)}`;\n }\n\n\n return media;\n }\n\n async store(files: Express.Multer.File[], entity: T, mediaFieldMetadata: FieldMetadata): Promise<Media[]> {\n // if (!(entity instanceof CommonEntity)) {\n // throw new Error(\"Entity must be an instance of CommonEntity\"); //FIXME This needs to be handled through generics. e.g T extends CommonEntity\n // }\n const result: Media[] = [];\n for (const file of files) {\n // Store the file in the configured file storage directory\n const fileStoragePath = await this.getFullFilePath(this.getFileName(file));\n await this.fileService.copy(file.path, fileStoragePath);\n await this.fileService.delete(file.path);\n\n // Create an entry in the media table\n const mediaEntity = await this.mediaRepository.createMedia({\n //@ts-ignore\n entityId: entity.id,\n modelMetadataId: mediaFieldMetadata.model.id,\n relativeUri: this.getFileName(file),\n mimeType: file.mimetype,\n fileSize: file.size,\n originalFileName: file.originalname,\n mediaStorageProviderMetadataId: mediaFieldMetadata.mediaStorageProvider.id,\n fieldMetadataId: mediaFieldMetadata.id\n }) as unknown as Media;\n result.push(mediaEntity);\n this.logger.debug(`Stored media with`, mediaEntity);\n };\n return result;\n }\n\n async storeStreams(streamPairs: [Readable, string][], entity: T, mediaFieldMetadata: FieldMetadata): Promise<Media[]> {\n // if (!(entity instanceof CommonEntity)) {\n // throw new Error(\"Entity must be an instance of CommonEntity\"); //FIXME This needs to be handled through generics. e.g T extends CommonEntity\n // }\n const result: Media[] = [];\n for (const pair of streamPairs) {\n const stream = pair[0];\n const fileName = pair[1];\n await this.fileService.writeStream(await this.getFullFilePath(fileName), stream);\n const mediaEntity = await this.mediaRepository.createMedia({\n //@ts-ignore\n entityId: entity.id,\n modelMetadataId: mediaFieldMetadata.model.id,\n relativeUri: fileName,\n mediaStorageProviderMetadataId: mediaFieldMetadata.mediaStorageProvider.id,\n fieldMetadataId: mediaFieldMetadata.id\n }) as unknown as Media;\n this.logger.debug(`Stored media with`, mediaEntity);\n };\n return result;\n }\n\n async delete(entity: T, mediaFieldMetadata: FieldMetadata): Promise<void> {\n // if (!(entity instanceof CommonEntity)) {\n // throw new Error(\"Entity must be an instance of CommonEntity\"); //FIXME This needs to be handled through generics. e.g T extends CommonEntity\n // }\n //@ts-ignore\n const existingMedia = await this.mediaRepository.findByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id, ['mediaStorageProviderMetadata']);\n //@ts-ignore\n this.mediaRepository.deleteByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id);\n\n for (const media of existingMedia) {\n await this.fileService.delete(await this.getFullFilePath(media.relativeUri));\n }\n // existingMedia.forEach(media => {\n // });\n }\n\n private async getFullFilePath(fileName: string): Promise<string> {\n const fileStorageDir = this.settingService.getConfigValue<SolidCoreSetting>(\"fileStorageDir\")\n return `${fileStorageDir}/${fileName}`;\n // return `${this.configService.get('app-builder.fileStorageDir')}/${fileName}`;\n }\n\n private getFileName(file: Express.Multer.File): string {\n return `${file.filename}-${file.originalname}`;\n }\n}"]}
1
+ {"version":3,"file":"file-storage-provider.js","sourceRoot":"","sources":["../../../src/services/mediaStorageProviders/file-storage-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, Logger } from \"@nestjs/common\";\nimport { ConfigService } from \"@nestjs/config\";\nimport { CommonEntity } from \"src/entities/common.entity\";\nimport { FieldMetadata } from \"src/entities/field-metadata.entity\";\nimport { Media } from \"src/entities/media.entity\";\nimport { MediaStorageProvider } from \"src/interfaces\";\nimport { MediaRepository } from \"src/repository/media.repository\";\nimport { DiskFileService } from \"src/services/file\";\nimport { Readable } from \"stream\";\nimport * as path from \"path\";\nimport { SettingService } from \"../setting.service\";\nimport { DEFAULT_MEDIA_FILE_STORAGE_DIR } from \"src/services/settings/default-settings-provider.service\";\nimport type { SolidCoreSetting } from \"src/services/settings/default-settings-provider.service\";\n\n@Injectable()\nexport class FileStorageProvider<T> implements MediaStorageProvider<T> {\n private logger = new Logger(FileStorageProvider.name);\n\n constructor(\n // @Inject(appBuilderConfig.KEY)\n // private readonly appBuilderConfiguration: ConfigType<typeof appBuilderConfig>,\n private readonly configService: ConfigService,\n readonly fileService: DiskFileService,\n readonly mediaRepository: MediaRepository,\n private readonly settingService: SettingService\n\n ) { }\n\n async retrieve(entity: T, mediaFieldMetadata: FieldMetadata): Promise<Media[]> {\n // if (!(entity instanceof CommonEntity)) {\n // throw new Error(\"Entity must be an instance of CommonEntity\"); //FIXME This needs to be handled through generics. e.g T extends CommonEntity\n // }\n //@ts-ignore\n const media = await this.mediaRepository.findByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id, ['mediaStorageProviderMetadata']);\n // Add the full URL to the media\n // media.forEach(m => {\n // });\n for (const m of media) {\n m['_full_url'] = `${this.settingService.getConfigValue<SolidCoreSetting>(\"baseUrl\")}/${this.getFullFilePath(m.relativeUri)}`;\n }\n\n\n return media;\n }\n\n async store(files: Express.Multer.File[], entity: T, mediaFieldMetadata: FieldMetadata): Promise<Media[]> {\n // if (!(entity instanceof CommonEntity)) {\n // throw new Error(\"Entity must be an instance of CommonEntity\"); //FIXME This needs to be handled through generics. e.g T extends CommonEntity\n // }\n const result: Media[] = [];\n for (const file of files) {\n // Store the file in the configured file storage directory\n const fileStoragePath = this.getFullFilePath(this.getFileName(file));\n await this.fileService.copy(file.path, fileStoragePath);\n await this.fileService.delete(file.path);\n\n // Create an entry in the media table\n const mediaEntity = await this.mediaRepository.createMedia({\n //@ts-ignore\n entityId: entity.id,\n modelMetadataId: mediaFieldMetadata.model.id,\n relativeUri: this.getFileName(file),\n mimeType: file.mimetype,\n fileSize: file.size,\n originalFileName: file.originalname,\n mediaStorageProviderMetadataId: mediaFieldMetadata.mediaStorageProvider.id,\n fieldMetadataId: mediaFieldMetadata.id\n }) as unknown as Media;\n result.push(mediaEntity);\n this.logger.debug(`Stored media with`, mediaEntity);\n };\n return result;\n }\n\n async storeStreams(streamPairs: [Readable, string][], entity: T, mediaFieldMetadata: FieldMetadata): Promise<Media[]> {\n // if (!(entity instanceof CommonEntity)) {\n // throw new Error(\"Entity must be an instance of CommonEntity\"); //FIXME This needs to be handled through generics. e.g T extends CommonEntity\n // }\n const result: Media[] = [];\n for (const pair of streamPairs) {\n const stream = pair[0];\n const fileName = pair[1];\n await this.fileService.writeStream(this.getFullFilePath(fileName), stream);\n const mediaEntity = await this.mediaRepository.createMedia({\n //@ts-ignore\n entityId: entity.id,\n modelMetadataId: mediaFieldMetadata.model.id,\n relativeUri: fileName,\n mediaStorageProviderMetadataId: mediaFieldMetadata.mediaStorageProvider.id,\n fieldMetadataId: mediaFieldMetadata.id\n }) as unknown as Media;\n this.logger.debug(`Stored media with`, mediaEntity);\n };\n return result;\n }\n\n async delete(entity: T, mediaFieldMetadata: FieldMetadata): Promise<void> {\n // if (!(entity instanceof CommonEntity)) {\n // throw new Error(\"Entity must be an instance of CommonEntity\"); //FIXME This needs to be handled through generics. e.g T extends CommonEntity\n // }\n //@ts-ignore\n const existingMedia = await this.mediaRepository.findByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id, ['mediaStorageProviderMetadata']);\n //@ts-ignore\n this.mediaRepository.deleteByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id);\n\n for (const media of existingMedia) {\n await this.fileService.delete(this.getFullFilePath(media.relativeUri));\n }\n // existingMedia.forEach(media => {\n // });\n }\n\n private getFullFilePath(fileName: string): string {\n const base = this.settingService.getConfigValue<SolidCoreSetting>(\"fileStorageDir\")\n || DEFAULT_MEDIA_FILE_STORAGE_DIR;\n if (path.isAbsolute(fileName) || fileName.startsWith(`${base}/`)) {\n return fileName;\n }\n return `${base}/${fileName}`;\n }\n\n private getFileName(file: Express.Multer.File): string {\n return `${file.filename}-${file.originalname}`;\n }\n}"]}
@@ -1,7 +1,8 @@
1
1
  import { DataSource, EntityManager } from 'typeorm';
2
2
  import { CreateModuleMetadataDto } from '../dtos/create-module-metadata.dto';
3
3
  import { ModuleMetadata } from '../entities/module-metadata.entity';
4
- import { ConfigService } from '@nestjs/config';
4
+ import { ModuleMetadataHelperService } from 'src/helpers/module-metadata-helper.service';
5
+ import { ModuleMetadataRepository } from 'src/repository/module-metadata.repository';
5
6
  import { PermissionMetadataSeederService } from 'src/seeders/permission-metadata-seeder.service';
6
7
  import { DiskFileService } from 'src/services/file';
7
8
  import { BasicFilterDto } from '../dtos/basic-filters.dto';
@@ -11,15 +12,12 @@ import { SolidRegistry } from '../helpers/solid-registry';
11
12
  import { CodeGenerationOptions } from '../interfaces';
12
13
  import { CrudHelperService } from './crud-helper.service';
13
14
  import { ModelMetadataService } from './model-metadata.service';
14
- import { ModuleMetadataHelperService } from 'src/helpers/module-metadata-helper.service';
15
- import { ModuleMetadataRepository } from 'src/repository/module-metadata.repository';
16
15
  import { SettingService } from './setting.service';
17
16
  export declare class ModuleMetadataService {
18
17
  private readonly dataSource;
19
18
  private readonly moduleMetadataRepo;
20
19
  private readonly crudHelperService;
21
20
  private readonly schematicService;
22
- private readonly configService;
23
21
  private readonly fileService;
24
22
  private readonly settingService;
25
23
  private readonly permissionsSeederService;
@@ -27,7 +25,7 @@ export declare class ModuleMetadataService {
27
25
  private readonly solidRegistry;
28
26
  private readonly moduleMetadataHelperService;
29
27
  private readonly logger;
30
- constructor(dataSource: DataSource, moduleMetadataRepo: ModuleMetadataRepository, crudHelperService: CrudHelperService, schematicService: SchematicService, configService: ConfigService, fileService: DiskFileService, settingService: SettingService, permissionsSeederService: PermissionMetadataSeederService, modelMetadataService: ModelMetadataService, solidRegistry: SolidRegistry, moduleMetadataHelperService: ModuleMetadataHelperService);
28
+ constructor(dataSource: DataSource, moduleMetadataRepo: ModuleMetadataRepository, crudHelperService: CrudHelperService, schematicService: SchematicService, fileService: DiskFileService, settingService: SettingService, permissionsSeederService: PermissionMetadataSeederService, modelMetadataService: ModelMetadataService, solidRegistry: SolidRegistry, moduleMetadataHelperService: ModuleMetadataHelperService);
31
29
  findMany(basicFilterDto: BasicFilterDto): Promise<{
32
30
  meta: {
33
31
  totalRecords: number;
@@ -67,7 +65,7 @@ export declare class ModuleMetadataService {
67
65
  generateCode(options: CodeGenerationOptions): Promise<string>;
68
66
  private generateAddModuleCode;
69
67
  private generateRefreshModuleCode;
70
- private getFileSysytemFullFilePath;
68
+ private getFullFilePathForDisk;
71
69
  private getFileName;
72
70
  }
73
71
  //# sourceMappingURL=module-metadata.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"module-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/module-metadata.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"module-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/module-metadata.service.ts"],"names":[],"mappings":"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"}