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" }); } };