fix: resolve MongoDB ObjectId serialization error in client components

Fix React serialization warning when passing ObjectIds to client components:

**Problem:**
- MongoDB ObjectIds have toJSON() methods which React rejects in client components
- Error: "Only plain objects can be passed to Client Components from Server Components. Objects with toJSON methods are not supported"
- Occurred when rendering main page with year parameter (?year=2023)

**Solution:**
- Add $addFields stage in fetchAllLocations aggregation pipeline
- Convert location _id and bill _id fields to strings using $toString
- Simplify $project stage to use single "bills": 1 instead of individual field projections
- Ensures only plain objects (strings) are passed to client components

**Technical Details:**
- Modified app/lib/actions/locationActions.ts:268-287
- Added $addFields stage before existing $project stage
- Converted ObjectIds to strings while preserving all other data structures
- Build passes without serialization warnings

ObjectId serialization now handled properly across all client component boundaries.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-09-14 22:45:14 +02:00
parent 694ec8508b
commit fdfa23e67d

View File

@@ -264,6 +264,24 @@ export const fetchAllLocations = withUser(async (user:AuthenticatedUser, year:nu
}, },
}, },
}, },
{
$addFields: {
_id: { $toString: "$_id" },
bills: {
$map: {
input: "$bills",
as: "bill",
in: {
_id: { $toString: "$$bill._id" },
name: "$$bill.name",
paid: "$$bill.paid",
payedAmount: "$$bill.payedAmount",
hasAttachment: "$$bill.hasAttachment",
},
},
},
}
},
{ {
$project: { $project: {
"_id": 1, "_id": 1,
@@ -274,12 +292,7 @@ export const fetchAllLocations = withUser(async (user:AuthenticatedUser, year:nu
// "yearMonth": 1, // "yearMonth": 1,
"yearMonth.year": 1, "yearMonth.year": 1,
"yearMonth.month": 1, "yearMonth.month": 1,
// "bills": 1, "bills": 1,
"bills._id": 1,
"bills.name": 1,
"bills.paid": 1,
"bills.payedAmount": 1,
"bills.hasAttachment": 1,
// "bills.attachment": 0, // "bills.attachment": 0,
// "bills.notes": 0, // "bills.notes": 0,
// "bills.barcodeImage": 1, // "bills.barcodeImage": 1,