InquiryController.java

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

import com.hwhub.backend.application.service.inquiry.InquiryService;
import com.hwhub.backend.domain.enums.InquiryCategory;
import com.hwhub.backend.domain.enums.SenderType;
import com.hwhub.backend.domain.model.inquiry.InquiryId;
import com.hwhub.backend.domain.model.inquiry.InquiryModel;
import com.hwhub.backend.domain.model.inquiry.InquirySummary;
import com.hwhub.backend.presentation.rest.inquiry.dto.InquiryCreateRequest;
import com.hwhub.backend.presentation.rest.inquiry.dto.InquiryDetailResponse;
import com.hwhub.backend.presentation.rest.inquiry.dto.InquiryListResponse;
import com.hwhub.backend.presentation.rest.inquiry.dto.InquiryMessageRequest;
import com.hwhub.backend.security.CurrentUserId;
import jakarta.validation.Valid;
import java.util.List;
import java.util.Map;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/inquiries")
public class InquiryController {

  private final InquiryService inquiryService;

  @PostMapping
  public Map<String, Object> createInquiry(
      @RequestBody @Valid InquiryCreateRequest request, @CurrentUserId Long userId) {
    InquiryCategory category = InquiryCategory.fromCode(request.category());
    InquiryId inquiryId =
        inquiryService.createInquiry(userId, category, request.title(), request.body());
    return Map.of("inquiryId", inquiryId.value());
  }

  @GetMapping
  public InquiryListResponse getInquiries(@CurrentUserId Long userId) {
    List<InquirySummary> summaries = inquiryService.getInquiries(userId);
    return InquiryListResponse.from(summaries);
  }

  @GetMapping("/{inquiryId}")
  public InquiryDetailResponse getInquiry(
      @PathVariable("inquiryId") Long inquiryId, @CurrentUserId Long userId) {
    InquiryModel inquiry = inquiryService.getInquiry(new InquiryId(inquiryId), userId);
    return InquiryDetailResponse.from(inquiry);
  }

  @PostMapping("/{inquiryId}/messages")
  public void addMessage(
      @PathVariable("inquiryId") Long inquiryId,
      @RequestBody @Valid InquiryMessageRequest request,
      @CurrentUserId Long userId) {
    inquiryService.addMessage(new InquiryId(inquiryId), userId, request.body(), SenderType.YOU);
  }

  @PostMapping("/{inquiryId}/close")
  public void closeInquiry(@PathVariable("inquiryId") Long inquiryId, @CurrentUserId Long userId) {
    inquiryService.closeInquiry(new InquiryId(inquiryId), userId);
  }

  @PostMapping("/{inquiryId}/escalate")
  public void escalateToStaff(
      @PathVariable("inquiryId") Long inquiryId, @CurrentUserId Long userId) {
    inquiryService.escalateToStaff(new InquiryId(inquiryId), userId);
  }
}