212 lines
5.7 KiB
JavaScript
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" });
|
|
}
|
|
};
|