@unchainedshop/core-files 2.0.0-beta7 → 2.0.0-beta9

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.
package/jest.config.js CHANGED
@@ -2,4 +2,13 @@
2
2
  export default {
3
3
  preset: 'ts-jest',
4
4
  testEnvironment: 'node',
5
+ extensionsToTreatAsEsm: ['.ts'],
6
+ transform: {
7
+ '^.+\\.tsx?$': [
8
+ 'ts-jest',
9
+ {
10
+ useESM: true,
11
+ },
12
+ ],
13
+ },
5
14
  };
@@ -28,7 +28,7 @@ export const configureFilesModule = async ({ db, options: filesOptions = {}, })
28
28
  const finalURL = new URL(transformedURLString, process.env.ROOT_URL);
29
29
  return finalURL.href;
30
30
  }
31
- catch (err) {
31
+ catch (e2) {
32
32
  // else return the transformed string because it's not an URL
33
33
  return transformedURLString;
34
34
  }
@@ -37,38 +37,26 @@ export const configureFilesModule = async ({ db, options: filesOptions = {}, })
37
37
  findFile: async ({ fileId }, options) => {
38
38
  return Files.findOne(generateDbFilterById(fileId), options);
39
39
  },
40
- findFiles: async (selector) => {
41
- return Files.find(selector).toArray();
40
+ findFiles: async (selector, options) => {
41
+ return Files.find(selector, options).toArray();
42
42
  },
43
43
  deleteMany: async (fileIds) => {
44
- await Files.deleteMany({ _id: { $in: fileIds } });
44
+ const deletionResult = await Files.deleteMany({ _id: { $in: fileIds } });
45
+ return deletionResult.deletedCount;
45
46
  },
46
- findFilesByMetaData: async ({ meta }, options) => {
47
- const metaKeys = Object.keys(meta);
48
- if (metaKeys.length === 0)
49
- return [];
50
- const selector = metaKeys.reduce((currentSelector, key) => meta[key] !== undefined
51
- ? {
52
- ...currentSelector,
53
- [`meta.${key}`]: meta[key],
54
- }
55
- : currentSelector, {});
56
- const files = Files.find(selector, options);
57
- return files.toArray();
58
- },
59
- create: async (doc, userId) => {
60
- const fileId = await mutations.create(doc, userId);
61
- emit('FILE_CREATE', { fileId });
47
+ create: async (doc) => {
48
+ const fileId = await mutations.create(doc);
49
+ await emit('FILE_CREATE', { fileId });
62
50
  return fileId;
63
51
  },
64
- update: async (_id, doc, userId) => {
65
- const fileId = await mutations.update(_id, { $set: doc }, userId);
66
- emit('FILE_UPDATE', { fileId });
52
+ update: async (_id, doc) => {
53
+ const fileId = await mutations.update(_id, { $set: doc });
54
+ await emit('FILE_UPDATE', { fileId });
67
55
  return fileId;
68
56
  },
69
- delete: async (fileId, userId) => {
70
- const deletedCount = await mutations.delete(fileId, userId);
71
- emit('FILE_REMOVE', { fileId });
57
+ delete: async (fileId) => {
58
+ const deletedCount = await mutations.delete(fileId);
59
+ await emit('FILE_REMOVE', { fileId });
72
60
  return deletedCount;
73
61
  },
74
62
  deletePermanently: mutations.deletePermanently,
@@ -1 +1 @@
1
- {"version":3,"file":"configureFilesModule.js","sourceRoot":"","sources":["../../src/module/configureFilesModule.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"configureFilesModule.js","sourceRoot":"","sources":["../../src/module/configureFilesModule.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,11 @@
1
1
  import { getFileAdapter } from '../utils/getFileAdapter';
2
2
  import { getFileFromFileData } from '../utils/getFileFromFileData';
3
- export const createSignedURLService = async ({ directoryName, fileName, meta, userId }, unchainedContext) => {
3
+ export const createSignedURLService = async ({ directoryName, fileName, meta }, unchainedContext) => {
4
4
  const { modules: { files }, } = unchainedContext;
5
5
  const fileUploadAdapter = getFileAdapter();
6
6
  const preparedFileData = await fileUploadAdapter.createSignedURL(directoryName, fileName, unchainedContext);
7
7
  const fileData = getFileFromFileData(preparedFileData, meta);
8
- const fileId = await files.create(fileData, userId);
8
+ const fileId = await files.create(fileData);
9
9
  const file = await files.findFile({ fileId });
10
10
  return {
11
11
  ...file,
@@ -1 +1 @@
1
- {"version":3,"file":"createSignedURLService.js","sourceRoot":"","sources":["../../src/service/createSignedURLService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEnE,MAAM,CAAC,MAAM,sBAAsB,GAA2B,KAAK,EACjE,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EACzC,gBAAgB,EAChB,EAAE;IACF,MAAM,EACJ,OAAO,EAAE,EAAE,KAAK,EAAE,GACnB,GAAG,gBAAgB,CAAC;IACrB,MAAM,iBAAiB,GAAG,cAAc,EAAE,CAAC;IAC3C,MAAM,gBAAgB,GAAG,MAAM,iBAAiB,CAAC,eAAe,CAC9D,aAAa,EACb,QAAQ,EACR,gBAAgB,CACjB,CAAC;IACF,MAAM,QAAQ,GAAG,mBAAmB,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAE9C,OAAO;QACL,GAAG,IAAI;QACP,MAAM,EAAE,gBAAgB,CAAC,MAAgB;KAC1C,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"createSignedURLService.js","sourceRoot":"","sources":["../../src/service/createSignedURLService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEnE,MAAM,CAAC,MAAM,sBAAsB,GAA2B,KAAK,EACjE,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,EACjC,gBAAgB,EAChB,EAAE;IACF,MAAM,EACJ,OAAO,EAAE,EAAE,KAAK,EAAE,GACnB,GAAG,gBAAgB,CAAC;IACrB,MAAM,iBAAiB,GAAG,cAAc,EAAE,CAAC;IAC3C,MAAM,gBAAgB,GAAG,MAAM,iBAAiB,CAAC,eAAe,CAC9D,aAAa,EACb,QAAQ,EACR,gBAAgB,CACjB,CAAC;IACF,MAAM,QAAQ,GAAG,mBAAmB,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAE9C,OAAO;QACL,GAAG,IAAI;QACP,MAAM,EAAE,gBAAgB,CAAC,MAAgB;KAC1C,CAAC;AACJ,CAAC,CAAC"}
@@ -1,11 +1,11 @@
1
1
  import { FileDirector } from '@unchainedshop/file-upload';
2
- export const linkFileService = async ({ fileId, size, type }, requestContext) => {
3
- const { modules: { files }, userId, } = requestContext;
2
+ export const linkFileService = async ({ fileId, size, type }, unchainedAPI) => {
3
+ const { modules: { files }, } = unchainedAPI;
4
4
  const file = await files.findFile({ fileId });
5
5
  if (!file)
6
6
  throw new Error(`Media with id ${fileId} Not found`);
7
- await files.update(file._id, { size, type, expires: null }, userId);
8
- await FileDirector.getFileUploadCallback(file.path)(file, requestContext);
7
+ await files.update(file._id, { size, type, expires: null });
8
+ await FileDirector.getFileUploadCallback(file.path)(file, unchainedAPI);
9
9
  return files.findFile({ fileId });
10
10
  };
11
11
  //# sourceMappingURL=linkFileService.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"linkFileService.js","sourceRoot":"","sources":["../../src/service/linkFileService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,MAAM,CAAC,MAAM,eAAe,GAAoB,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,cAAc,EAAE,EAAE;IAC/F,MAAM,EACJ,OAAO,EAAE,EAAE,KAAK,EAAE,EAClB,MAAM,GACP,GAAG,cAAc,CAAC;IACnB,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9C,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,MAAM,YAAY,CAAC,CAAC;IAChE,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;IACpE,MAAM,YAAY,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAC1E,OAAO,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AACpC,CAAC,CAAC"}
1
+ {"version":3,"file":"linkFileService.js","sourceRoot":"","sources":["../../src/service/linkFileService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,MAAM,CAAC,MAAM,eAAe,GAAoB,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,YAAY,EAAE,EAAE;IAC7F,MAAM,EACJ,OAAO,EAAE,EAAE,KAAK,EAAE,GACnB,GAAG,YAAY,CAAC;IACjB,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9C,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,MAAM,YAAY,CAAC,CAAC;IAChE,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,YAAY,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACxE,OAAO,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AACpC,CAAC,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { getFileAdapter } from '../utils/getFileAdapter';
2
- export const removeFilesService = async ({ fileIds }, requestContext) => {
3
- const { modules: { files }, } = requestContext;
2
+ export const removeFilesService = async ({ fileIds }, unchainedAPI) => {
3
+ const { modules: { files }, } = unchainedAPI;
4
4
  if (fileIds && typeof fileIds !== 'string' && !Array.isArray(fileIds))
5
5
  throw Error('Media id/s to be removed not provided as a string or array');
6
6
  const selector = {
@@ -9,7 +9,7 @@ export const removeFilesService = async ({ fileIds }, requestContext) => {
9
9
  const fileUploadAdapter = getFileAdapter();
10
10
  const fileObjects = await files.findFiles(selector);
11
11
  try {
12
- await fileUploadAdapter.removeFiles(fileObjects, requestContext);
12
+ await fileUploadAdapter.removeFiles(fileObjects, unchainedAPI);
13
13
  }
14
14
  catch (e) {
15
15
  console.warn(e); // eslint-disable-line
@@ -1 +1 @@
1
- {"version":3,"file":"removeFilesService.js","sourceRoot":"","sources":["../../src/service/removeFilesService.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,MAAM,CAAC,MAAM,kBAAkB,GAAuB,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,EAAE;IAC1F,MAAM,EACJ,OAAO,EAAE,EAAE,KAAK,EAAE,GACnB,GAAG,cAAc,CAAC;IAEnB,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QACnE,MAAM,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAE5E,MAAM,QAAQ,GAAU;QACtB,GAAG,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;KACtB,CAAC;IAEF,MAAM,iBAAiB,GAAG,cAAc,EAAE,CAAC;IAE3C,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAEpD,IAAI;QACF,MAAM,iBAAiB,CAAC,WAAW,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;KAClE;IAAC,OAAO,CAAC,EAAE;QACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,sBAAsB;KACxC;IAED,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEtE,MAAM,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;IAExC,OAAO,eAAe,CAAC,MAAM,CAAC;AAChC,CAAC,CAAC"}
1
+ {"version":3,"file":"removeFilesService.js","sourceRoot":"","sources":["../../src/service/removeFilesService.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,MAAM,CAAC,MAAM,kBAAkB,GAAuB,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,YAAY,EAAE,EAAE;IACxF,MAAM,EACJ,OAAO,EAAE,EAAE,KAAK,EAAE,GACnB,GAAG,YAAY,CAAC;IAEjB,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QACnE,MAAM,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAE5E,MAAM,QAAQ,GAAU;QACtB,GAAG,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;KACtB,CAAC;IAEF,MAAM,iBAAiB,GAAG,cAAc,EAAE,CAAC;IAE3C,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAEpD,IAAI;QACF,MAAM,iBAAiB,CAAC,WAAW,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;KAChE;IAAC,OAAO,CAAC,EAAE;QACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,sBAAsB;KACxC;IAED,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEtE,MAAM,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;IAExC,OAAO,eAAe,CAAC,MAAM,CAAC;AAChC,CAAC,CAAC"}
@@ -1,11 +1,11 @@
1
1
  import { getFileAdapter } from '../utils/getFileAdapter';
2
2
  import { getFileFromFileData } from '../utils/getFileFromFileData';
3
- export const uploadFileFromStreamService = async ({ directoryName, rawFile, meta, userId }, unchainedContext) => {
3
+ export const uploadFileFromStreamService = async ({ directoryName, rawFile, meta }, unchainedContext) => {
4
4
  const { modules: { files }, } = unchainedContext;
5
5
  const fileUploadAdapter = getFileAdapter();
6
6
  const uploadFileData = await fileUploadAdapter.uploadFileFromStream(directoryName, rawFile, unchainedContext);
7
7
  const fileData = getFileFromFileData(uploadFileData, meta);
8
- const fileId = await files.create(fileData, userId);
8
+ const fileId = await files.create(fileData);
9
9
  return files.findFile({ fileId });
10
10
  };
11
11
  //# sourceMappingURL=uploadFileFromStreamService.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"uploadFileFromStreamService.js","sourceRoot":"","sources":["../../src/service/uploadFileFromStreamService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEnE,MAAM,CAAC,MAAM,2BAA2B,GAAgC,KAAK,EAC3E,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EACxC,gBAAgB,EAChB,EAAE;IACF,MAAM,EACJ,OAAO,EAAE,EAAE,KAAK,EAAE,GACnB,GAAG,gBAAgB,CAAC;IACrB,MAAM,iBAAiB,GAAG,cAAc,EAAE,CAAC;IAC3C,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,oBAAoB,CACjE,aAAa,EACb,OAAO,EACP,gBAAgB,CACjB,CAAC;IACF,MAAM,QAAQ,GAAG,mBAAmB,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACpD,OAAO,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AACpC,CAAC,CAAC"}
1
+ {"version":3,"file":"uploadFileFromStreamService.js","sourceRoot":"","sources":["../../src/service/uploadFileFromStreamService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEnE,MAAM,CAAC,MAAM,2BAA2B,GAAgC,KAAK,EAC3E,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,EAChC,gBAAgB,EAChB,EAAE;IACF,MAAM,EACJ,OAAO,EAAE,EAAE,KAAK,EAAE,GACnB,GAAG,gBAAgB,CAAC;IACrB,MAAM,iBAAiB,GAAG,cAAc,EAAE,CAAC;IAC3C,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,oBAAoB,CACjE,aAAa,EACb,OAAO,EACP,gBAAgB,CACjB,CAAC;IACF,MAAM,QAAQ,GAAG,mBAAmB,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5C,OAAO,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AACpC,CAAC,CAAC"}
@@ -1,11 +1,11 @@
1
1
  import { getFileAdapter } from '../utils/getFileAdapter';
2
2
  import { getFileFromFileData } from '../utils/getFileFromFileData';
3
- export const uploadFileFromURLService = async ({ directoryName, fileInput, meta, userId }, unchainedContext) => {
3
+ export const uploadFileFromURLService = async ({ directoryName, fileInput, meta }, unchainedContext) => {
4
4
  const { modules: { files }, } = unchainedContext;
5
5
  const fileUploadAdapter = getFileAdapter();
6
6
  const uploadFileData = await fileUploadAdapter.uploadFileFromURL(directoryName, fileInput, unchainedContext);
7
7
  const fileData = getFileFromFileData(uploadFileData, meta);
8
- const fileId = await files.create(fileData, userId);
8
+ const fileId = await files.create(fileData);
9
9
  return files.findFile({ fileId });
10
10
  };
11
11
  //# sourceMappingURL=uploadFileFromURLService.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"uploadFileFromURLService.js","sourceRoot":"","sources":["../../src/service/uploadFileFromURLService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEnE,MAAM,CAAC,MAAM,wBAAwB,GAA6B,KAAK,EACrE,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,EAC1C,gBAAgB,EAChB,EAAE;IACF,MAAM,EACJ,OAAO,EAAE,EAAE,KAAK,EAAE,GACnB,GAAG,gBAAgB,CAAC;IACrB,MAAM,iBAAiB,GAAG,cAAc,EAAE,CAAC;IAE3C,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,iBAAiB,CAC9D,aAAa,EACb,SAAS,EACT,gBAAgB,CACjB,CAAC;IACF,MAAM,QAAQ,GAAG,mBAAmB,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACpD,OAAO,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AACpC,CAAC,CAAC"}
1
+ {"version":3,"file":"uploadFileFromURLService.js","sourceRoot":"","sources":["../../src/service/uploadFileFromURLService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEnE,MAAM,CAAC,MAAM,wBAAwB,GAA6B,KAAK,EACrE,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,EAAE,EAClC,gBAAgB,EAChB,EAAE;IACF,MAAM,EACJ,OAAO,EAAE,EAAE,KAAK,EAAE,GACnB,GAAG,gBAAgB,CAAC;IACrB,MAAM,iBAAiB,GAAG,cAAc,EAAE,CAAC;IAE3C,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,iBAAiB,CAC9D,aAAa,EACb,SAAS,EACT,gBAAgB,CACjB,CAAC;IACF,MAAM,QAAQ,GAAG,mBAAmB,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5C,OAAO,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AACpC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unchainedshop/core-files",
3
- "version": "2.0.0-beta7",
3
+ "version": "2.0.0-beta9",
4
4
  "main": "lib/files-index.js",
5
5
  "exports": {
6
6
  ".": "./lib/files-index.js",
@@ -12,7 +12,8 @@
12
12
  "clean": "rm -rf lib",
13
13
  "build": "npm run clean && tsc",
14
14
  "watch": "tsc -w",
15
- "test": "jest --watch"
15
+ "test": "NODE_OPTIONS=--experimental-vm-modules jest --detectOpenHandles --forceExit",
16
+ "test:watch": "NODE_OPTIONS=--experimental-vm-modules jest --watch --detectOpenHandles --forceExit"
16
17
  },
17
18
  "repository": {
18
19
  "type": "git",
@@ -30,20 +31,20 @@
30
31
  },
31
32
  "homepage": "https://github.com/unchainedshop/unchained#readme",
32
33
  "dependencies": {
33
- "@unchainedshop/events": "^2.0.0-beta7",
34
- "@unchainedshop/file-upload": "^2.0.0-beta7",
35
- "@unchainedshop/logger": "^2.0.0-beta7",
36
- "@unchainedshop/utils": "^2.0.0-beta7",
34
+ "@unchainedshop/events": "^2.0.0-beta9",
35
+ "@unchainedshop/file-upload": "^2.0.0-beta9",
36
+ "@unchainedshop/logger": "^2.0.0-beta9",
37
+ "@unchainedshop/utils": "^2.0.0-beta9",
37
38
  "mime-types": "^2.1.35",
38
39
  "minio": "^7.0.32",
39
- "simpl-schema": "^3.0.1"
40
+ "simpl-schema": "^3.2.0"
40
41
  },
41
42
  "devDependencies": {
42
- "@types/minio": "^7.0.14",
43
- "@types/node": "^18.11.9",
44
- "@unchainedshop/types": "^2.0.0-beta7",
43
+ "@types/minio": "^7.0.15",
44
+ "@types/node": "^18.11.12",
45
+ "@unchainedshop/types": "^2.0.0-beta9",
45
46
  "jest": "^29.3.1",
46
47
  "ts-jest": "^29.0.3",
47
- "typescript": "^4.8.4"
48
+ "typescript": "^4.9.4"
48
49
  }
49
50
  }
@@ -1,4 +1,3 @@
1
- import { Query } from '@unchainedshop/types/common';
2
1
  import { ModuleInput, ModuleMutations } from '@unchainedshop/types/core';
3
2
  import { File, FilesModule, FilesSettingsOptions } from '@unchainedshop/types/files';
4
3
  import { emit, registerEvents } from '@unchainedshop/events';
@@ -37,7 +36,7 @@ export const configureFilesModule = async ({
37
36
  // else try to fix by using ROOT_URL env
38
37
  const finalURL = new URL(transformedURLString, process.env.ROOT_URL);
39
38
  return finalURL.href;
40
- } catch (err) {
39
+ } catch (e2) {
41
40
  // else return the transformed string because it's not an URL
42
41
  return transformedURLString;
43
42
  }
@@ -48,48 +47,28 @@ export const configureFilesModule = async ({
48
47
  return Files.findOne(generateDbFilterById(fileId), options);
49
48
  },
50
49
 
51
- findFiles: async (selector) => {
52
- return Files.find(selector).toArray();
50
+ findFiles: async (selector, options) => {
51
+ return Files.find(selector, options).toArray();
53
52
  },
54
53
 
55
54
  deleteMany: async (fileIds) => {
56
- await Files.deleteMany({ _id: { $in: fileIds } });
55
+ const deletionResult = await Files.deleteMany({ _id: { $in: fileIds } });
56
+ return deletionResult.deletedCount;
57
57
  },
58
58
 
59
- findFilesByMetaData: async ({ meta }, options) => {
60
- const metaKeys = Object.keys(meta);
61
-
62
- if (metaKeys.length === 0) return [];
63
-
64
- const selector: Query = metaKeys.reduce(
65
- (currentSelector, key) =>
66
- meta[key] !== undefined
67
- ? {
68
- ...currentSelector,
69
- [`meta.${key}`]: meta[key],
70
- }
71
- : currentSelector,
72
- {},
73
- );
74
-
75
- const files = Files.find(selector, options);
76
-
77
- return files.toArray();
78
- },
79
-
80
- create: async (doc: File, userId: string) => {
81
- const fileId = await mutations.create(doc, userId);
82
- emit('FILE_CREATE', { fileId });
59
+ create: async (doc: File) => {
60
+ const fileId = await mutations.create(doc);
61
+ await emit('FILE_CREATE', { fileId });
83
62
  return fileId;
84
63
  },
85
- update: async (_id: string, doc: File, userId: string) => {
86
- const fileId = await mutations.update(_id, { $set: doc }, userId);
87
- emit('FILE_UPDATE', { fileId });
64
+ update: async (_id: string, doc: File) => {
65
+ const fileId = await mutations.update(_id, { $set: doc });
66
+ await emit('FILE_UPDATE', { fileId });
88
67
  return fileId;
89
68
  },
90
- delete: async (fileId: string, userId: string) => {
91
- const deletedCount = await mutations.delete(fileId, userId);
92
- emit('FILE_REMOVE', { fileId });
69
+ delete: async (fileId: string) => {
70
+ const deletedCount = await mutations.delete(fileId);
71
+ await emit('FILE_REMOVE', { fileId });
93
72
  return deletedCount;
94
73
  },
95
74
  deletePermanently: mutations.deletePermanently,
@@ -3,7 +3,7 @@ import { getFileAdapter } from '../utils/getFileAdapter';
3
3
  import { getFileFromFileData } from '../utils/getFileFromFileData';
4
4
 
5
5
  export const createSignedURLService: CreateSignedURLService = async (
6
- { directoryName, fileName, meta, userId },
6
+ { directoryName, fileName, meta },
7
7
  unchainedContext,
8
8
  ) => {
9
9
  const {
@@ -16,7 +16,7 @@ export const createSignedURLService: CreateSignedURLService = async (
16
16
  unchainedContext,
17
17
  );
18
18
  const fileData = getFileFromFileData(preparedFileData, meta);
19
- const fileId = await files.create(fileData, userId);
19
+ const fileId = await files.create(fileData);
20
20
  const file = await files.findFile({ fileId });
21
21
 
22
22
  return {
@@ -1,14 +1,13 @@
1
1
  import { LinkFileService } from '@unchainedshop/types/files';
2
2
  import { FileDirector } from '@unchainedshop/file-upload';
3
3
 
4
- export const linkFileService: LinkFileService = async ({ fileId, size, type }, requestContext) => {
4
+ export const linkFileService: LinkFileService = async ({ fileId, size, type }, unchainedAPI) => {
5
5
  const {
6
6
  modules: { files },
7
- userId,
8
- } = requestContext;
7
+ } = unchainedAPI;
9
8
  const file = await files.findFile({ fileId });
10
9
  if (!file) throw new Error(`Media with id ${fileId} Not found`);
11
- await files.update(file._id, { size, type, expires: null }, userId);
12
- await FileDirector.getFileUploadCallback(file.path)(file, requestContext);
10
+ await files.update(file._id, { size, type, expires: null });
11
+ await FileDirector.getFileUploadCallback(file.path)(file, unchainedAPI);
13
12
  return files.findFile({ fileId });
14
13
  };
@@ -2,10 +2,10 @@ import { Query } from '@unchainedshop/types/common';
2
2
  import { RemoveFilesService } from '@unchainedshop/types/files';
3
3
  import { getFileAdapter } from '../utils/getFileAdapter';
4
4
 
5
- export const removeFilesService: RemoveFilesService = async ({ fileIds }, requestContext) => {
5
+ export const removeFilesService: RemoveFilesService = async ({ fileIds }, unchainedAPI) => {
6
6
  const {
7
7
  modules: { files },
8
- } = requestContext;
8
+ } = unchainedAPI;
9
9
 
10
10
  if (fileIds && typeof fileIds !== 'string' && !Array.isArray(fileIds))
11
11
  throw Error('Media id/s to be removed not provided as a string or array');
@@ -19,7 +19,7 @@ export const removeFilesService: RemoveFilesService = async ({ fileIds }, reques
19
19
  const fileObjects = await files.findFiles(selector);
20
20
 
21
21
  try {
22
- await fileUploadAdapter.removeFiles(fileObjects, requestContext);
22
+ await fileUploadAdapter.removeFiles(fileObjects, unchainedAPI);
23
23
  } catch (e) {
24
24
  console.warn(e); // eslint-disable-line
25
25
  }
@@ -3,7 +3,7 @@ import { getFileAdapter } from '../utils/getFileAdapter';
3
3
  import { getFileFromFileData } from '../utils/getFileFromFileData';
4
4
 
5
5
  export const uploadFileFromStreamService: UploadFileFromStreamService = async (
6
- { directoryName, rawFile, meta, userId },
6
+ { directoryName, rawFile, meta },
7
7
  unchainedContext,
8
8
  ) => {
9
9
  const {
@@ -16,6 +16,6 @@ export const uploadFileFromStreamService: UploadFileFromStreamService = async (
16
16
  unchainedContext,
17
17
  );
18
18
  const fileData = getFileFromFileData(uploadFileData, meta);
19
- const fileId = await files.create(fileData, userId);
19
+ const fileId = await files.create(fileData);
20
20
  return files.findFile({ fileId });
21
21
  };
@@ -3,7 +3,7 @@ import { getFileAdapter } from '../utils/getFileAdapter';
3
3
  import { getFileFromFileData } from '../utils/getFileFromFileData';
4
4
 
5
5
  export const uploadFileFromURLService: UploadFileFromURLService = async (
6
- { directoryName, fileInput, meta, userId },
6
+ { directoryName, fileInput, meta },
7
7
  unchainedContext,
8
8
  ) => {
9
9
  const {
@@ -17,6 +17,6 @@ export const uploadFileFromURLService: UploadFileFromURLService = async (
17
17
  unchainedContext,
18
18
  );
19
19
  const fileData = getFileFromFileData(uploadFileData, meta);
20
- const fileId = await files.create(fileData, userId);
20
+ const fileId = await files.create(fileData);
21
21
  return files.findFile({ fileId });
22
22
  };
@@ -1,29 +1,5 @@
1
- import { assert } from 'chai';
2
- import { initDb } from '@unchainedshop/mongodb';
3
- import {
4
- configureFilesModule,
5
- fileServices,
6
- } from '@unchainedshop/core-files';
7
- import { FilesModule } from '@unchainedshop/types/files';
8
-
9
- describe('Test exports', () => {
10
- let module: FilesModule;
11
-
12
- before(async () => {
13
- const db = await initDb();
14
- module = await configureFilesModule({ db });
15
- });
16
-
17
- it('Check files module', () => {
18
- assert.ok(module);
19
- assert.isFunction(module.findFile);
20
- assert.isFunction(module.create);
21
- assert.isFunction(module.update);
22
- assert.isFunction(module.delete);
23
- });
24
-
25
- it('Check file services', () => {
26
- assert.ok(fileServices);
27
- assert.ok(fileServices.linkFileService);
1
+ describe('Files', () => {
2
+ it('Init', async () => {
3
+ expect(true).toBeTruthy()
28
4
  });
29
5
  });