costco-grocery-list/backend/controllers/households.controller.js

212 lines
5.7 KiB
JavaScript

const householdModel = require("../models/household.model");
// Get all households user belongs to
exports.getUserHouseholds = async (req, res) => {
try {
const households = await householdModel.getUserHouseholds(req.user.id);
res.json(households);
} catch (error) {
console.error("Get user households error:", error);
res.status(500).json({ error: "Failed to fetch households" });
}
};
// Get household details
exports.getHousehold = async (req, res) => {
try {
const household = await householdModel.getHouseholdById(
req.params.householdId,
req.user.id
);
if (!household) {
return res.status(404).json({ error: "Household not found" });
}
res.json(household);
} catch (error) {
console.error("Get household error:", error);
res.status(500).json({ error: "Failed to fetch household" });
}
};
// Create new household
exports.createHousehold = async (req, res) => {
try {
const { name } = req.body;
if (!name || name.trim().length === 0) {
return res.status(400).json({ error: "Household name is required" });
}
if (name.length > 100) {
return res.status(400).json({ error: "Household name must be 100 characters or less" });
}
const household = await householdModel.createHousehold(
name.trim(),
req.user.id
);
res.status(201).json({
message: "Household created successfully",
household
});
} catch (error) {
console.error("Create household error:", error);
res.status(500).json({ error: "Failed to create household" });
}
};
// Update household
exports.updateHousehold = async (req, res) => {
try {
const { name } = req.body;
if (!name || name.trim().length === 0) {
return res.status(400).json({ error: "Household name is required" });
}
if (name.length > 100) {
return res.status(400).json({ error: "Household name must be 100 characters or less" });
}
const household = await householdModel.updateHousehold(
req.params.householdId,
{ name: name.trim() }
);
res.json({
message: "Household updated successfully",
household
});
} catch (error) {
console.error("Update household error:", error);
res.status(500).json({ error: "Failed to update household" });
}
};
// Delete household
exports.deleteHousehold = async (req, res) => {
try {
await householdModel.deleteHousehold(req.params.householdId);
res.json({ message: "Household deleted successfully" });
} catch (error) {
console.error("Delete household error:", error);
res.status(500).json({ error: "Failed to delete household" });
}
};
// Refresh invite code
exports.refreshInviteCode = async (req, res) => {
try {
const household = await householdModel.refreshInviteCode(req.params.householdId);
res.json({
message: "Invite code refreshed successfully",
household
});
} catch (error) {
console.error("Refresh invite code error:", error);
res.status(500).json({ error: "Failed to refresh invite code" });
}
};
// Join household via invite code
exports.joinHousehold = async (req, res) => {
try {
const { inviteCode } = req.params;
if (!inviteCode) {
return res.status(400).json({ error: "Invite code is required" });
}
const result = await householdModel.joinHousehold(
inviteCode.toUpperCase(),
req.user.id
);
if (!result) {
return res.status(404).json({ error: "Invalid or expired invite code" });
}
if (result.alreadyMember) {
return res.status(200).json({
message: "You are already a member of this household",
household: { id: result.id, name: result.name }
});
}
res.status(200).json({
message: `Successfully joined ${result.name}`,
household: { id: result.id, name: result.name }
});
} catch (error) {
console.error("Join household error:", error);
res.status(500).json({ error: "Failed to join household" });
}
};
// Get household members
exports.getMembers = async (req, res) => {
try {
const members = await householdModel.getHouseholdMembers(req.params.householdId);
res.json(members);
} catch (error) {
console.error("Get members error:", error);
res.status(500).json({ error: "Failed to fetch members" });
}
};
// Update member role
exports.updateMemberRole = async (req, res) => {
try {
const { userId } = req.params;
const { role } = req.body;
if (!role || !['admin', 'user'].includes(role)) {
return res.status(400).json({ error: "Invalid role. Must be 'admin' or 'user'" });
}
// Can't change own role
if (parseInt(userId) === req.user.id) {
return res.status(400).json({ error: "Cannot change your own role" });
}
const updated = await householdModel.updateMemberRole(
req.params.householdId,
userId,
role
);
res.json({
message: "Member role updated successfully",
member: updated
});
} catch (error) {
console.error("Update member role error:", error);
res.status(500).json({ error: "Failed to update member role" });
}
};
// Remove member
exports.removeMember = async (req, res) => {
try {
const { userId } = req.params;
const targetUserId = parseInt(userId);
// Allow users to remove themselves, or admins to remove others
if (targetUserId !== req.user.id && req.household.role !== 'admin') {
return res.status(403).json({
error: "Only admins can remove other members"
});
}
await householdModel.removeMember(req.params.householdId, userId);
res.json({ message: "Member removed successfully" });
} catch (error) {
console.error("Remove member error:", error);
res.status(500).json({ error: "Failed to remove member" });
}
};