HouseworkController.java

package com.hwhub.backend.presentation.rest.housework;

import com.hwhub.backend.application.service.HouseholdAuthorizationService;
import com.hwhub.backend.application.service.HouseworkService;
import com.hwhub.backend.domain.model.HouseworkModel;
import com.hwhub.backend.presentation.rest.housework.dto.HouseworkDto;
import com.hwhub.backend.presentation.rest.housework.dto.HouseworkSaveRequest;
import com.hwhub.backend.security.CurrentUserId;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/houseworks")
@RequiredArgsConstructor
@Validated
public class HouseworkController {

  private final HouseworkService houseworkService;
  private final HouseholdAuthorizationService householdAuthorizationService;

  /** 家事マスタの一覧取得。 GET api/houseworks?householdId=1 */
  @GetMapping
  public List<HouseworkDto> list(
      @RequestParam("householdId") @NotNull @Positive Long householdId,
      @CurrentUserId Long loginUserId) {
    // 認可チェック
    householdAuthorizationService.assertUserBelongsToHousehold(householdId, loginUserId);

    return houseworkService.listByHousehold(householdId).stream()
        .map(HouseworkDto::fromModel)
        .toList();
  }

  /** 家事マスタの単一取得。 GET /api/houseworks */
  // GET /api/houseworks/{houseworkId}
  @GetMapping("/{houseworkId}")
  public HouseworkDto getOne(
      @PathVariable("houseworkId") Long houseworkId, @CurrentUserId Long loginUserId) {
    HouseworkModel model = houseworkService.findById(houseworkId);
    householdAuthorizationService.assertUserBelongsToHousehold(model.getHouseholdId(), loginUserId);

    return HouseworkDto.fromModel(model);
  }

  /** 家事マスタ登録 POST /api/houseworks */
  @PostMapping
  @ResponseStatus(HttpStatus.CREATED)
  public HouseworkDto createHousework(
      @Valid @RequestBody HouseworkSaveRequest request, @CurrentUserId Long loginUserId) {
    HouseworkModel model = request.toModelForCreate();
    HouseworkModel created = houseworkService.createHousework(model, loginUserId);
    return HouseworkDto.fromModel(created);
  }

  /** 家事マスタ更新 PUT /api/houseworks/{houseworkId} */
  @PutMapping("/{houseworkId}")
  public HouseworkDto updateHousework(
      @PathVariable("houseworkId") Long houseworkId,
      @Valid @RequestBody HouseworkSaveRequest request,
      @CurrentUserId Long loginUserId) {
    // 認可チェック
    householdAuthorizationService.assertUserBelongsToHousehold(
        request.getHouseholdId(), loginUserId);

    HouseworkModel model = request.toModelForCreate();
    HouseworkModel updated = houseworkService.updateHousework(houseworkId, model, loginUserId);
    return HouseworkDto.fromModel(updated);
  }
}