package com.recipeapp.household; import com.recipeapp.auth.AuthService; import com.recipeapp.common.ApiResponse; import com.recipeapp.household.dto.*; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.security.Principal; import java.util.List; import java.util.Optional; import java.util.UUID; @RestController @RequestMapping("/v1") public class HouseholdController { private final HouseholdService householdService; private final AuthService authService; public HouseholdController(HouseholdService householdService, AuthService authService) { this.householdService = householdService; this.authService = authService; } @PostMapping("/households") public ResponseEntity> createHousehold( Principal principal, @Valid @RequestBody CreateHouseholdRequest request) { HouseholdResponse response = householdService.createHousehold(principal.getName(), request); return ResponseEntity.status(HttpStatus.CREATED).body(ApiResponse.success(response)); } @GetMapping("/households/mine") public ResponseEntity> getMyHousehold(Principal principal) { HouseholdResponse response = householdService.getMyHousehold(principal.getName()); return ResponseEntity.ok(ApiResponse.success(response)); } @GetMapping("/households/mine/members") public ResponseEntity> getMembers(Principal principal) { List members = householdService.getMembers(principal.getName()); return ResponseEntity.ok(members); } @GetMapping("/households/mine/invites") public ResponseEntity> getActiveInvite(Principal principal) { Optional invite = householdService.getActiveInvite(principal.getName()); return invite .map(r -> ResponseEntity.ok(ApiResponse.success(r))) .orElse(ResponseEntity.noContent().build()); } @PostMapping("/households/mine/invites") public ResponseEntity> createInvite(Principal principal) { InviteResponse response = householdService.createInvite(principal.getName()); return ResponseEntity.status(HttpStatus.CREATED).body(ApiResponse.success(response)); } @DeleteMapping("/households/mine/members/{userId}") public ResponseEntity removeMember(Principal principal, @PathVariable UUID userId) { householdService.removeMember(principal.getName(), userId); return ResponseEntity.noContent().build(); } @PatchMapping("/households/mine/members/{userId}") public ResponseEntity> changeMemberRole( Principal principal, @PathVariable UUID userId, @Valid @RequestBody ChangeRoleRequest request) { MemberResponse response = householdService.changeMemberRole(principal.getName(), userId, request.role()); return ResponseEntity.ok(ApiResponse.success(response)); } @GetMapping("/invites/{code}") public ResponseEntity> getInviteInfo(@PathVariable String code) { InviteInfoResponse response = householdService.getInviteInfo(code); return ResponseEntity.ok(ApiResponse.success(response)); } @PostMapping("/invites/{code}/accept") public ResponseEntity> acceptInvite( @PathVariable String code, @Valid @RequestBody AcceptInviteRequest request, HttpServletRequest httpRequest) { AcceptInviteResponse response = householdService.acceptInvite( code, request.name(), request.email(), request.password()); authService.authenticateInSession(request.email(), "user", httpRequest); return ResponseEntity.ok(ApiResponse.success(response)); } }