From 7b94f301082441231a602d6e290e9cf3e26fac9d Mon Sep 17 00:00:00 2001 From: WuYongJie Date: Tue, 16 Jun 2026 16:12:55 +0800 Subject: [PATCH] =?UTF-8?q?fix(storage):=20=E5=BB=B6=E9=95=BF=E4=B8=83?= =?UTF-8?q?=E7=89=9B=E7=A7=81=E6=9C=89=E8=AF=BB=E9=93=BE=E6=8E=A5=E6=9C=89?= =?UTF-8?q?=E6=95=88=E6=9C=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- furniture-3d-system/src/lib/config.ts | 2 +- furniture-3d-system/src/lib/storage.test.ts | 62 ++++++++++++--------- furniture-3d-system/src/lib/storage.ts | 2 +- 3 files changed, 37 insertions(+), 29 deletions(-) diff --git a/furniture-3d-system/src/lib/config.ts b/furniture-3d-system/src/lib/config.ts index 3329663f..a0ddcf03 100644 --- a/furniture-3d-system/src/lib/config.ts +++ b/furniture-3d-system/src/lib/config.ts @@ -79,7 +79,7 @@ export const config = { filePath: process.env.QINIU_FILE_PATH, useHttps: process.env.QINIU_USE_HTTPS !== 'false', privateBucket: process.env.QINIU_PRIVATE_BUCKET === 'true', - privateUrlExpiresSeconds: Number(process.env.QINIU_PRIVATE_URL_EXPIRES_SECONDS || 3600), + privateUrlExpiresSeconds: Number(process.env.QINIU_PRIVATE_URL_EXPIRES_SECONDS || 7200), }, auth: { secret: process.env.NEXTAUTH_SECRET, diff --git a/furniture-3d-system/src/lib/storage.test.ts b/furniture-3d-system/src/lib/storage.test.ts index d4744491..d4d90d48 100644 --- a/furniture-3d-system/src/lib/storage.test.ts +++ b/furniture-3d-system/src/lib/storage.test.ts @@ -262,36 +262,44 @@ describe('storage object provider', () => { data: {}, }) - const storage = await import('./storage') - const buffer = Buffer.from('private-glb') + const nowSpy = jest.spyOn(Date, 'now').mockReturnValue(1_700_000_000_000) - await expect( - storage.uploadBufferToObjectStorage( - buffer, - '/models/table.glb', - 'model/gltf-binary', - ), - ).resolves.toBe( - '/api/storage/object?key=prod-assets%2Fmodels%2Ftable.glb', - ) + try { + const storage = await import('./storage') + const buffer = Buffer.from('private-glb') - expect(storage.getStorageAccessMode()).toBe('private') - expect(storage.createObjectReadUrl('models/table.glb')).toContain( - 'http://tevepd6od.hd-bkt.clouddn.com/prod-assets/models/table.glb?e=', - ) - expect( - storage.resolveObjectStorageUrlForServerAccess( + await expect( + storage.uploadBufferToObjectStorage( + buffer, + '/models/table.glb', + 'model/gltf-binary', + ), + ).resolves.toBe( '/api/storage/object?key=prod-assets%2Fmodels%2Ftable.glb', - ), - ).toContain( - 'http://tevepd6od.hd-bkt.clouddn.com/prod-assets/models/table.glb?e=', - ) - expect( - storage.resolveObjectStorageUrlForClientAccess( - '/api/storage/object?key=prod-assets%2Fmodels%2Ftable.glb', - ), - ).toBe('/api/storage/object?key=prod-assets%2Fmodels%2Ftable.glb') - expect(mockQiniuPrivateDownloadUrl).not.toHaveBeenCalled() + ) + + expect(storage.getStorageAccessMode()).toBe('private') + const signedReadUrl = storage.createObjectReadUrl('models/table.glb') + expect(signedReadUrl).toContain( + 'http://tevepd6od.hd-bkt.clouddn.com/prod-assets/models/table.glb?e=', + ) + expect(signedReadUrl).toContain('?e=1700007200&token=') + expect( + storage.resolveObjectStorageUrlForServerAccess( + '/api/storage/object?key=prod-assets%2Fmodels%2Ftable.glb', + ), + ).toContain( + 'http://tevepd6od.hd-bkt.clouddn.com/prod-assets/models/table.glb?e=', + ) + expect( + storage.resolveObjectStorageUrlForClientAccess( + '/api/storage/object?key=prod-assets%2Fmodels%2Ftable.glb', + ), + ).toBe('/api/storage/object?key=prod-assets%2Fmodels%2Ftable.glb') + expect(mockQiniuPrivateDownloadUrl).not.toHaveBeenCalled() + } finally { + nowSpy.mockRestore() + } }) it('returns direct HTTPS Qiniu read URLs to clients for non-protected assets', async () => { diff --git a/furniture-3d-system/src/lib/storage.ts b/furniture-3d-system/src/lib/storage.ts index 22d2b8a8..f00df67d 100644 --- a/furniture-3d-system/src/lib/storage.ts +++ b/furniture-3d-system/src/lib/storage.ts @@ -484,7 +484,7 @@ function createQiniuStorageAdapter(): ObjectStorageAdapter { const useHttps = readBooleanEnv(process.env.QINIU_USE_HTTPS, true) const privateBucket = readBooleanEnv(process.env.QINIU_PRIVATE_BUCKET, false) const privateUrlExpiresSeconds = Math.max( - Number(process.env.QINIU_PRIVATE_URL_EXPIRES_SECONDS) || 3600, + Number(process.env.QINIU_PRIVATE_URL_EXPIRES_SECONDS) || 7200, 60, )