diff --git a/packages/server/modules/blobstorage/graph/resolvers/index.ts b/packages/server/modules/blobstorage/graph/resolvers/index.ts index 914e7bca1..90ef02cd0 100644 --- a/packages/server/modules/blobstorage/graph/resolvers/index.ts +++ b/packages/server/modules/blobstorage/graph/resolvers/index.ts @@ -1,9 +1,10 @@ import { db } from '@/db/knex' import { + blobCollectionSummaryFactory, getBlobMetadataCollectionFactory, getBlobMetadataFactory } from '@/modules/blobstorage/repositories' -import { blobCollectionSummary, getFileSizeLimit } from '@/modules/blobstorage/services' +import { getFileSizeLimit } from '@/modules/blobstorage/services' import { ProjectBlobArgs, ProjectBlobsArgs, @@ -20,6 +21,7 @@ import { const getBlobMetadata = getBlobMetadataFactory({ db }) const getBlobMetadataCollection = getBlobMetadataCollectionFactory({ db }) +const blobCollectionSummary = blobCollectionSummaryFactory({ db }) const streamBlobResolvers = { async blobs(parent: StreamGraphQLReturn, args: StreamBlobsArgs | ProjectBlobsArgs) { diff --git a/packages/server/modules/blobstorage/repositories/index.ts b/packages/server/modules/blobstorage/repositories/index.ts index ef80e2a28..88afea69b 100644 --- a/packages/server/modules/blobstorage/repositories/index.ts +++ b/packages/server/modules/blobstorage/repositories/index.ts @@ -16,6 +16,7 @@ import { NotFoundError, ResourceMismatch } from '@/modules/shared/errors' +import { MaybeNullOrUndefined, Nullable } from '@speckle/shared' import { Knex } from 'knex' const BlobStorage = buildTableHelper('blob_storage', [ @@ -122,3 +123,27 @@ export const getBlobMetadataCollectionFactory = cursor: cursorFromRows(rows, cursorTarget) } } + +export const blobCollectionSummaryFactory = + (deps: { db: Knex }) => + async (params: { streamId: string; query?: MaybeNullOrUndefined }) => { + const { streamId, query } = params + + const q = tables + .blobStorage(deps.db) + .where({ [BlobStorage.col.streamId]: streamId }) + .sum('fileSize') + .count('id') + + if (query) q.andWhereLike('fileName', `%${query}%`) + + const [summary] = (await q) as unknown as Array<{ + sum: Nullable + count: string + }> + + return { + totalSize: summary.sum ? parseInt(summary.sum) : 0, + totalCount: parseInt(summary.count) + } + } diff --git a/packages/server/modules/blobstorage/services.js b/packages/server/modules/blobstorage/services.js index 51515504f..986e07ac2 100644 --- a/packages/server/modules/blobstorage/services.js +++ b/packages/server/modules/blobstorage/services.js @@ -6,20 +6,6 @@ const BlobStorage = () => knex('blob_storage') const blobLookup = ({ blobId, streamId }) => BlobStorage().where({ id: blobId, streamId }) -const blobQuery = ({ streamId, query }) => { - let blobs = BlobStorage().where({ streamId }) - if (query) blobs = blobs.andWhereLike('fileName', `%${query}%`) - return blobs -} - -const blobCollectionSummary = async ({ streamId, query }) => { - const [summary] = await blobQuery({ streamId, query }).sum('fileSize').count('id') - return { - totalSize: summary.sum ? parseInt(summary.sum) : 0, - totalCount: parseInt(summary.count) - } -} - const getFileStream = async ({ getObjectStream, streamId, blobId }) => { const { objectKey } = await getBlobMetadataFactory({ db: knex })({ streamId, blobId }) return await getObjectStream({ objectKey }) @@ -64,6 +50,5 @@ module.exports = { markUploadError, getFileStream, deleteBlob, - blobCollectionSummary, getFileSizeLimit } diff --git a/packages/server/modules/blobstorage/tests/blobstorage.spec.js b/packages/server/modules/blobstorage/tests/blobstorage.spec.js index 3593b48b5..7fdfc1c9f 100644 --- a/packages/server/modules/blobstorage/tests/blobstorage.spec.js +++ b/packages/server/modules/blobstorage/tests/blobstorage.spec.js @@ -1,7 +1,6 @@ const expect = require('chai').expect const { beforeEachContext } = require('@/test/hooks') const { - blobCollectionSummary, getFileStream, deleteBlob, markUploadOverFileSizeLimit, @@ -15,7 +14,8 @@ const { upsertBlobFactory, updateBlobFactory, getBlobMetadataFactory, - getBlobMetadataCollectionFactory + getBlobMetadataCollectionFactory, + blobCollectionSummaryFactory } = require('@/modules/blobstorage/repositories') const { db } = require('@/db/knex') const { cursorFromRows, decodeCursor } = require('@/modules/blobstorage/helpers/db') @@ -30,6 +30,7 @@ const uploadFileStream = uploadFileStreamFactory({ }) const getBlobMetadata = getBlobMetadataFactory({ db }) const getBlobMetadataCollection = getBlobMetadataCollectionFactory({ db }) +const blobCollectionSummary = blobCollectionSummaryFactory({ db }) describe('Blob storage @blobstorage', () => { before(async () => {