g2g-transfer.ts 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import { Readable } from 'stream';
  2. import { Types as MongooseTypes } from 'mongoose';
  3. import TransferKeyModel from '~/server/models/transfer-key';
  4. import loggerFactory from '~/utils/logger';
  5. import { TransferKey } from '~/utils/vo/transfer-key';
  6. const logger = loggerFactory('growi:service:g2g-transfer');
  7. /**
  8. * Data used for comparing to/from GROWI information
  9. */
  10. export type IDataFromGROWIInfo = {
  11. version: string
  12. userLimit: number
  13. }
  14. interface Pusher {
  15. /**
  16. * Start transfer data between GROWIs
  17. * @param {string} key Transfer key
  18. */
  19. startTransfer(key: string): Promise<Readable>
  20. }
  21. interface Receiver {
  22. /**
  23. * Check if key is not expired
  24. * @param {string} key Transfer key
  25. */
  26. validateTransferKey(key: string): Promise<boolean>
  27. /**
  28. * Check if transfering is proceedable
  29. * @param {IDataFromGROWIInfo} fromGROWIInfo
  30. */
  31. canTransfer(fromGROWIInfo: IDataFromGROWIInfo): Promise<boolean>
  32. }
  33. export class G2GTransferService implements Pusher, Receiver {
  34. crowi: any;
  35. // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
  36. constructor(crowi: any) {
  37. this.crowi = crowi;
  38. }
  39. public async canTransfer(fromGROWIInfo: IDataFromGROWIInfo): Promise<boolean> { return true }
  40. public async startTransfer(key: string): Promise<Readable> { return new Readable() }
  41. public async validateTransferKey(key: string): Promise<boolean> { return true }
  42. /**
  43. * This method receives appSiteUrl to create a TransferKey document and returns generated transfer key string.
  44. * UUID is the same value as the created document's _id.
  45. * @param {URL} appSiteUrl URL type appSiteUrl
  46. * @returns {string} Transfer key string (e.g. http://localhost:3000__grw_internal_tranferkey__<uuid>)
  47. */
  48. public async createTransferKey(appSiteUrl: URL): Promise<string> {
  49. const uuid = new MongooseTypes.ObjectId().toString();
  50. // Generate transfer key string
  51. let transferKeyString: string;
  52. try {
  53. transferKeyString = TransferKey.generateKeyString(appSiteUrl, uuid);
  54. }
  55. catch (err) {
  56. logger.error(err);
  57. throw err;
  58. }
  59. // Save TransferKey document
  60. try {
  61. await TransferKeyModel.create({ _id: uuid, appSiteUrl, value: transferKeyString });
  62. }
  63. catch (err) {
  64. logger.error(err);
  65. throw err;
  66. }
  67. return transferKeyString;
  68. }
  69. private onCompleteTransfer(): void { return }
  70. }