From bc14dc625f5588e2a660bd5bd9da85807c9f65e3 Mon Sep 17 00:00:00 2001 From: Kristaps Fabians Geikins Date: Wed, 11 Sep 2024 14:48:35 +0300 Subject: [PATCH 1/2] chore(server): fileuploads IoC 3 - insertNewUploadAndNotifyFactory --- .../modules/fileuploads/domain/operations.ts | 3 + packages/server/modules/fileuploads/index.js | 13 +++- .../fileuploads/repositories/fileUploads.ts | 36 +++++----- .../fileuploads/services/management.ts | 71 ++++++++++--------- 4 files changed, 72 insertions(+), 51 deletions(-) diff --git a/packages/server/modules/fileuploads/domain/operations.ts b/packages/server/modules/fileuploads/domain/operations.ts index b73a82d43..3a5daa115 100644 --- a/packages/server/modules/fileuploads/domain/operations.ts +++ b/packages/server/modules/fileuploads/domain/operations.ts @@ -1,6 +1,9 @@ import { FileUploadRecord } from '@/modules/fileuploads/helpers/types' +import { SaveUploadFileInput } from '@/modules/fileuploads/repositories/fileUploads' import { Optional } from '@speckle/shared' export type GetFileInfo = (args: { fileId: string }) => Promise> + +export type SaveUploadFile = (args: SaveUploadFileInput) => Promise diff --git a/packages/server/modules/fileuploads/index.js b/packages/server/modules/fileuploads/index.js index b3268625d..6f4e75999 100644 --- a/packages/server/modules/fileuploads/index.js +++ b/packages/server/modules/fileuploads/index.js @@ -1,6 +1,6 @@ /* istanbul ignore file */ const { - insertNewUploadAndNotify + insertNewUploadAndNotifyFactory } = require('@/modules/fileuploads/services/management') const request = require('request') const { streamWritePermissions } = require('@/modules/shared/authz') @@ -9,11 +9,20 @@ const { moduleLogger } = require('@/logging/logging') const { listenForImportUpdatesFactory } = require('@/modules/fileuploads/services/resultListener') -const { getFileInfoFactory } = require('@/modules/fileuploads/repositories/fileUploads') +const { + getFileInfoFactory, + saveUploadFileFactory +} = require('@/modules/fileuploads/repositories/fileUploads') const { db } = require('@/db/knex') const { publish } = require('@/modules/shared/utils/subscriptions') const { getStreamBranchByName } = require('@/modules/core/repositories/branches') +const insertNewUploadAndNotify = insertNewUploadAndNotifyFactory({ + getStreamBranchByName, + saveUploadFile: saveUploadFileFactory({ db }), + publish +}) + const saveFileUploads = async ({ userId, streamId, branchName, uploadResults }) => { await Promise.all( uploadResults.map(async (upload) => { diff --git a/packages/server/modules/fileuploads/repositories/fileUploads.ts b/packages/server/modules/fileuploads/repositories/fileUploads.ts index 6fdb973ff..e58114c70 100644 --- a/packages/server/modules/fileuploads/repositories/fileUploads.ts +++ b/packages/server/modules/fileuploads/repositories/fileUploads.ts @@ -1,5 +1,5 @@ import { Branches, FileUploads, knex } from '@/modules/core/dbSchema' -import { GetFileInfo } from '@/modules/fileuploads/domain/operations' +import { GetFileInfo, SaveUploadFile } from '@/modules/fileuploads/domain/operations' import { FileUploadConvertedStatus, FileUploadRecord @@ -50,28 +50,30 @@ export type SaveUploadFileInput = Pick< 'streamId' | 'branchName' | 'userId' | 'fileName' | 'fileType' | 'fileSize' > & { fileId: string } -export async function saveUploadFile({ - fileId, - streamId, - branchName, - userId, - fileName, - fileType, - fileSize -}: SaveUploadFileInput) { - const dbFile: Partial = { - id: fileId, +export const saveUploadFileFactory = + (deps: { db: Knex }): SaveUploadFile => + async ({ + fileId, streamId, branchName, userId, fileName, fileType, - fileSize, - uploadComplete: true + fileSize + }: SaveUploadFileInput) => { + const dbFile: Partial = { + id: fileId, + streamId, + branchName, + userId, + fileName, + fileType, + fileSize, + uploadComplete: true + } + const [newRecord] = await tables.fileUploads(deps.db).insert(dbFile, '*') + return newRecord as FileUploadRecord } - const [newRecord] = await FileUploads.knex().insert(dbFile, '*') - return newRecord as FileUploadRecord -} const getPendingUploadsBaseQuery = ( streamId: string, diff --git a/packages/server/modules/fileuploads/services/management.ts b/packages/server/modules/fileuploads/services/management.ts index 8809b9828..8f89472da 100644 --- a/packages/server/modules/fileuploads/services/management.ts +++ b/packages/server/modules/fileuploads/services/management.ts @@ -4,43 +4,50 @@ import { ProjectPendingVersionsUpdatedMessageType } from '@/modules/core/graph/generated/graphql' import { getStreamBranchByName } from '@/modules/core/repositories/branches' +import { SaveUploadFile } from '@/modules/fileuploads/domain/operations' +import { SaveUploadFileInput } from '@/modules/fileuploads/repositories/fileUploads' import { - saveUploadFile, - SaveUploadFileInput -} from '@/modules/fileuploads/repositories/fileUploads' -import { FileImportSubscriptions, publish } from '@/modules/shared/utils/subscriptions' + FileImportSubscriptions, + PublishSubscription +} from '@/modules/shared/utils/subscriptions' -export async function insertNewUploadAndNotify(upload: SaveUploadFileInput) { - const branch = await getStreamBranchByName(upload.streamId, upload.branchName) - const file = await saveUploadFile(upload) +export const insertNewUploadAndNotifyFactory = + (deps: { + getStreamBranchByName: typeof getStreamBranchByName + saveUploadFile: SaveUploadFile + publish: PublishSubscription + }) => + async (upload: SaveUploadFileInput) => { + const branch = await deps.getStreamBranchByName(upload.streamId, upload.branchName) + const file = await deps.saveUploadFile(upload) - if (!branch) { - await publish(FileImportSubscriptions.ProjectPendingModelsUpdated, { - projectPendingModelsUpdated: { + if (!branch) { + await deps.publish(FileImportSubscriptions.ProjectPendingModelsUpdated, { + projectPendingModelsUpdated: { + id: file.id, + type: ProjectPendingModelsUpdatedMessageType.Created, + model: file + }, + projectId: file.streamId + }) + } else { + await deps.publish(FileImportSubscriptions.ProjectPendingVersionsUpdated, { + projectPendingVersionsUpdated: { + id: file.id, + type: ProjectPendingVersionsUpdatedMessageType.Created, + version: file + }, + projectId: file.streamId, + branchName: file.branchName + }) + } + + await deps.publish(FileImportSubscriptions.ProjectFileImportUpdated, { + projectFileImportUpdated: { id: file.id, - type: ProjectPendingModelsUpdatedMessageType.Created, - model: file + type: ProjectFileImportUpdatedMessageType.Created, + upload: file }, projectId: file.streamId }) - } else { - await publish(FileImportSubscriptions.ProjectPendingVersionsUpdated, { - projectPendingVersionsUpdated: { - id: file.id, - type: ProjectPendingVersionsUpdatedMessageType.Created, - version: file - }, - projectId: file.streamId, - branchName: file.branchName - }) } - - await publish(FileImportSubscriptions.ProjectFileImportUpdated, { - projectFileImportUpdated: { - id: file.id, - type: ProjectFileImportUpdatedMessageType.Created, - upload: file - }, - projectId: file.streamId - }) -} From 675bec46a02576afb5da247bfb6b0cad81e847e0 Mon Sep 17 00:00:00 2001 From: Kristaps Fabians Geikins Date: Wed, 11 Sep 2024 14:51:51 +0300 Subject: [PATCH 2/2] module index ts refactor --- .../fileuploads/{index.js => index.ts} | 51 +++++++++++-------- packages/server/package.json | 1 + yarn.lock | 3 +- 3 files changed, 33 insertions(+), 22 deletions(-) rename packages/server/modules/fileuploads/{index.js => index.ts} (66%) diff --git a/packages/server/modules/fileuploads/index.js b/packages/server/modules/fileuploads/index.ts similarity index 66% rename from packages/server/modules/fileuploads/index.js rename to packages/server/modules/fileuploads/index.ts index 6f4e75999..f2cb33ec8 100644 --- a/packages/server/modules/fileuploads/index.js +++ b/packages/server/modules/fileuploads/index.ts @@ -1,21 +1,18 @@ /* istanbul ignore file */ -const { - insertNewUploadAndNotifyFactory -} = require('@/modules/fileuploads/services/management') -const request = require('request') -const { streamWritePermissions } = require('@/modules/shared/authz') -const { authMiddlewareCreator } = require('@/modules/shared/middleware') -const { moduleLogger } = require('@/logging/logging') -const { - listenForImportUpdatesFactory -} = require('@/modules/fileuploads/services/resultListener') -const { +import { insertNewUploadAndNotifyFactory } from '@/modules/fileuploads/services/management' +import request from 'request' +import { streamWritePermissions } from '@/modules/shared/authz' +import { authMiddlewareCreator } from '@/modules/shared/middleware' +import { moduleLogger } from '@/logging/logging' +import { listenForImportUpdatesFactory } from '@/modules/fileuploads/services/resultListener' +import { getFileInfoFactory, saveUploadFileFactory -} = require('@/modules/fileuploads/repositories/fileUploads') -const { db } = require('@/db/knex') -const { publish } = require('@/modules/shared/utils/subscriptions') -const { getStreamBranchByName } = require('@/modules/core/repositories/branches') +} from '@/modules/fileuploads/repositories/fileUploads' +import { db } from '@/db/knex' +import { publish } from '@/modules/shared/utils/subscriptions' +import { getStreamBranchByName } from '@/modules/core/repositories/branches' +import { SpeckleModule } from '@/modules/shared/helpers/typeHelper' const insertNewUploadAndNotify = insertNewUploadAndNotifyFactory({ getStreamBranchByName, @@ -23,7 +20,21 @@ const insertNewUploadAndNotify = insertNewUploadAndNotifyFactory({ publish }) -const saveFileUploads = async ({ userId, streamId, branchName, uploadResults }) => { +const saveFileUploads = async ({ + userId, + streamId, + branchName, + uploadResults +}: { + userId: string + streamId: string + branchName: string + uploadResults: Array<{ + blobId: string + fileName: string + fileSize: number + }> +}) => { await Promise.all( uploadResults.map(async (upload) => { await insertNewUploadAndNotify({ @@ -32,14 +43,14 @@ const saveFileUploads = async ({ userId, streamId, branchName, uploadResults }) branchName, userId, fileName: upload.fileName, - fileType: upload.fileName.split('.').pop(), + fileType: upload.fileName.split('.').pop()!, fileSize: upload.fileSize }) }) ) } -exports.init = async (app, isInitial) => { +export const init: SpeckleModule['init'] = async (app, isInitial) => { if (process.env.DISABLE_FILE_UPLOADS) { moduleLogger.warn('📄 FileUploads module is DISABLED') return @@ -69,7 +80,7 @@ exports.init = async (app, isInitial) => { if (response.statusCode === 201) { const { uploadResults } = JSON.parse(body) await saveFileUploads({ - userId: req.context.userId, + userId: req.context.userId!, streamId: req.params.streamId, branchName, uploadResults @@ -100,5 +111,3 @@ exports.init = async (app, isInitial) => { listenForImportUpdates() } } - -exports.finalize = () => {} diff --git a/packages/server/package.json b/packages/server/package.json index e05d51fb8..c320ace14 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -153,6 +153,7 @@ "@types/passport-google-oauth20": "^2.0.16", "@types/pg": "^8.6.6", "@types/pino-http": "^5.8.4", + "@types/request": "^2.48.12", "@types/sanitize-html": "^2.6.2", "@types/supertest": "^2.0.12", "@types/ua-parser-js": "^0.7.39", diff --git a/yarn.lock b/yarn.lock index 32f1e903b..4a057bf7f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15450,6 +15450,7 @@ __metadata: "@types/passport-google-oauth20": "npm:^2.0.16" "@types/pg": "npm:^8.6.6" "@types/pino-http": "npm:^5.8.4" + "@types/request": "npm:^2.48.12" "@types/sanitize-html": "npm:^2.6.2" "@types/supertest": "npm:^2.0.12" "@types/ua-parser-js": "npm:^0.7.39" @@ -19000,7 +19001,7 @@ __metadata: languageName: node linkType: hard -"@types/request@npm:^2.48.8": +"@types/request@npm:^2.48.12, @types/request@npm:^2.48.8": version: 2.48.12 resolution: "@types/request@npm:2.48.12" dependencies: