Skip to content
This repository was archived by the owner on Dec 18, 2024. It is now read-only.

fix(mongoose): transform _all_ objectID fields to string #507

Merged
merged 2 commits into from
May 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -94,9 +94,7 @@ export class MatchTransferItemOperation implements Operation {
const customerItem = activeCustomerItems[0];

const receiverUserMatch = receiverUserMatches.find((userMatch) =>
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
userMatch.expectedItems.includes(String(customerItem.item)),
userMatch.expectedItems.includes(customerItem?.item as string),
);

if (!receiverUserMatch) {
Expand Down
34 changes: 34 additions & 0 deletions src/storage/mongoDb/mongoDb.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import "mocha";
import chai from "chai";
import chaiAsPromised from "chai-as-promised";
import { expect } from "chai";
import { MongooseModelCreator } from "./mongoose-schema-creator";
import { ObjectId } from "mongodb";

chai.use(chaiAsPromised);

describe("MongooseModelCreator", () => {
describe("transformObject", () => {
it("should convert objectIDs in objects to strings", () => {
const input = {
_id: new ObjectId(),
user: new ObjectId(),
items: [new ObjectId(), new ObjectId()],
};
const expectedOutput = {
id: input._id.toString(),
user: input.user.toString(),
items: input.items.map((item) => item.toString()),
};
MongooseModelCreator.transformObject(input, undefined);
expect(input).to.deep.eq(expectedOutput);
});

it("should convert objectIDs in an array to strings", () => {
const input = [new ObjectId(), new ObjectId()];
const expectedOutput = input.map((item) => item.toString());
MongooseModelCreator.transformObject(input, undefined);
expect(input).to.deep.eq(expectedOutput);
});
});
});
20 changes: 17 additions & 3 deletions src/storage/mongoDb/mongoose-schema-creator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,17 +81,31 @@ export class MongooseModelCreator<T> {
ret.forEach((document) =>
MongooseModelCreator.transformObject({}, document),
);
for (let i = 0; i < ret.length; i++) {
const value = ret[i];
if (value instanceof mongoose.Types.ObjectId) {
ret[i] = value.toString();
}
}
} else if (typeof ret === "object") {
const document = ret as Record<string, unknown>;
// Translate _id to id only if id does not already exist
// (embedded documents such as BlDocument.user may have an id field which is different from the _id field)
if ("_id" in document && !("id" in document))
document["id"] = document["_id"];
if (document["id"] instanceof mongoose.Types.ObjectId) {
document["id"] = document["id"].toString();
}
delete document["_id"];
delete document["__v"];
for (const key of Object.keys(document)) {
const value = document[key];
if (value instanceof mongoose.Types.ObjectId) {
document[key] = value.toString();
}
if (Array.isArray(value)) {
document[key] = value.map((entry) =>
entry instanceof mongoose.Types.ObjectId ? entry.toString() : entry,
);
}
}
}
}
}
Loading