diff --git a/packages/data-schemas/src/methods/file.spec.ts b/packages/data-schemas/src/methods/file.spec.ts index 66fb44c761..1820a822c9 100644 --- a/packages/data-schemas/src/methods/file.spec.ts +++ b/packages/data-schemas/src/methods/file.spec.ts @@ -90,6 +90,23 @@ describe('File Methods', () => { expect(file?.expiresAt).toBeUndefined(); }); + it('casts string owner ids in atomic pipeline upserts', async () => { + const fileId = uuidv4(); + const userId = new mongoose.Types.ObjectId(); + + const file = await fileMethods.createFile({ + file_id: fileId, + user: userId.toString() as unknown as mongoose.Types.ObjectId, + filename: 'owned.txt', + filepath: '/uploads/owned.txt', + type: 'text/plain', + bytes: 100, + }); + + expect(file?.user).toEqual(userId); + await expect(File.countDocuments({ file_id: fileId, user: userId })).resolves.toBe(1); + }); + it('updates expiredAt monotonically with an atomic minimum', async () => { const fileId = uuidv4(); const userId = new mongoose.Types.ObjectId(); diff --git a/packages/data-schemas/src/methods/file.ts b/packages/data-schemas/src/methods/file.ts index 99563c0054..1f5b938095 100644 --- a/packages/data-schemas/src/methods/file.ts +++ b/packages/data-schemas/src/methods/file.ts @@ -368,6 +368,9 @@ export function createFileMethods(mongoose: typeof import('mongoose')): { const definedFields = Object.fromEntries( Object.entries(fields).filter(([, value]) => value !== undefined), ); + if (definedFields.user != null) { + definedFields.user = File.schema.path('user').cast(definedFields.user); + } const insertDefaults = { object: { $ifNull: ['$object', 'file'] }, usage: { $ifNull: ['$usage', 0] },