feat: complete MongoDB to CouchDB migration
- Migrate Report model to CouchDB with embedded street/user data - Migrate UserBadge model to CouchDB with badge population - Update all remaining routes (reports, users, badges, payments) to use CouchDB - Add CouchDB health check and graceful shutdown to server.js - Add missing methods to couchdbService (checkConnection, findWithPagination, etc.) - Update Kubernetes deployment manifests for CouchDB support - Add comprehensive CouchDB setup documentation All core functionality now uses CouchDB as primary database while maintaining MongoDB for backward compatibility during transition period. 🤖 Generated with [AI Assistant] Co-Authored-By: AI Assistant <noreply@ai-assistant.com>
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
const express = require("express");
|
||||
const User = require("../models/User");
|
||||
const Street = require("../models/Street");
|
||||
const auth = require("../middleware/auth");
|
||||
const { asyncHandler } = require("../middleware/errorHandler");
|
||||
const { userIdValidation } = require("../middleware/validators/userValidator");
|
||||
@@ -14,11 +15,34 @@ router.get(
|
||||
auth,
|
||||
userIdValidation,
|
||||
asyncHandler(async (req, res) => {
|
||||
const user = await User.findById(req.params.id).populate("adoptedStreets");
|
||||
const user = await User.findById(req.params.id);
|
||||
if (!user) {
|
||||
return res.status(404).json({ msg: "User not found" });
|
||||
}
|
||||
res.json(user);
|
||||
|
||||
// Get adopted streets data
|
||||
let adoptedStreets = [];
|
||||
if (user.adoptedStreets && user.adoptedStreets.length > 0) {
|
||||
adoptedStreets = await Promise.all(
|
||||
user.adoptedStreets.map(async (streetId) => {
|
||||
const street = await Street.findById(streetId);
|
||||
return street ? {
|
||||
_id: street._id,
|
||||
name: street.name,
|
||||
location: street.location,
|
||||
status: street.status,
|
||||
} : null;
|
||||
})
|
||||
);
|
||||
adoptedStreets = adoptedStreets.filter(Boolean);
|
||||
}
|
||||
|
||||
const userWithStreets = {
|
||||
...user,
|
||||
adoptedStreets,
|
||||
};
|
||||
|
||||
res.json(userWithStreets);
|
||||
}),
|
||||
);
|
||||
|
||||
@@ -50,13 +74,14 @@ router.post(
|
||||
);
|
||||
|
||||
// Update user with new profile picture
|
||||
user.profilePicture = result.url;
|
||||
user.cloudinaryPublicId = result.publicId;
|
||||
await user.save();
|
||||
const updatedUser = await User.update(req.user.id, {
|
||||
profilePicture: result.url,
|
||||
cloudinaryPublicId: result.publicId,
|
||||
});
|
||||
|
||||
res.json({
|
||||
msg: "Profile picture updated successfully",
|
||||
profilePicture: user.profilePicture,
|
||||
profilePicture: updatedUser.profilePicture,
|
||||
});
|
||||
}),
|
||||
);
|
||||
@@ -79,9 +104,10 @@ router.delete(
|
||||
await deleteImage(user.cloudinaryPublicId);
|
||||
|
||||
// Remove from user
|
||||
user.profilePicture = undefined;
|
||||
user.cloudinaryPublicId = undefined;
|
||||
await user.save();
|
||||
await User.update(req.user.id, {
|
||||
profilePicture: undefined,
|
||||
cloudinaryPublicId: undefined,
|
||||
});
|
||||
|
||||
res.json({ msg: "Profile picture deleted successfully" });
|
||||
}),
|
||||
|
||||
Reference in New Issue
Block a user