ProductController.java
package com.newbit.product.command.controller;
import java.util.List;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping;
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.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.newbit.common.dto.ApiResponse;
import com.newbit.product.command.application.dto.request.ProductCreateRequest;
import com.newbit.product.command.application.dto.request.ProductStatusRequest;
import com.newbit.product.command.application.dto.request.ProductUpdateRequest;
import com.newbit.product.command.application.dto.response.ProductResponse;
import com.newbit.product.command.application.service.ProductService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
@RestController
@RequestMapping("/api/v1/products")
@RequiredArgsConstructor
@Tag(name = "상품 관리 API", description = "상품 관리 API(조회,등록,수정,활성화,비활성화)")
public class ProductController {
private final ProductService productService;
@Operation(summary = "전체 상품 목록 조회", description = "모든 상품 정보를 조회합니다.")
@GetMapping
public ResponseEntity<ApiResponse<List<ProductResponse>>> getAllProducts() {
List<ProductResponse> products = productService.getAllProducts();
return ResponseEntity.ok(ApiResponse.success(products));
}
@Operation(summary = "상품 단일 조회", description = "ID로 특정 상품 정보를 조회합니다.")
@GetMapping("/{id}")
public ResponseEntity<ApiResponse<ProductResponse>> getProductById(
@Parameter(description = "상품 ID") @PathVariable("id") Long productId) {
ProductResponse product = productService.getProductById(productId);
return ResponseEntity.ok(ApiResponse.success(product));
}
@Operation(summary = "상품 생성", description = "새로운 상품을 생성합니다. 관리자만 접근 가능합니다.")
@PostMapping
@PreAuthorize("hasRole('ADMIN')")
public ResponseEntity<ApiResponse<ProductResponse>> createProduct(
@RequestBody ProductCreateRequest request) {
ProductResponse product = productService.createProduct(request);
return ResponseEntity.status(HttpStatus.CREATED).body(ApiResponse.success(product));
}
@Operation(summary = "상품 정보 수정", description = "기존 상품 정보를 수정합니다. 관리자만 접근 가능합니다.")
@PutMapping("/{id}")
@PreAuthorize("hasRole('ADMIN')")
public ResponseEntity<ApiResponse<ProductResponse>> updateProduct(
@Parameter(description = "상품 ID") @PathVariable("id") Long productId,
@RequestBody ProductUpdateRequest request) {
ProductResponse updatedProduct = productService.updateProduct(productId, request);
return ResponseEntity.ok(ApiResponse.success(updatedProduct));
}
@Operation(summary = "상품 활성화/비활성화", description = "상품의 활성화 상태를 변경합니다. 관리자만 접근 가능합니다.")
@PutMapping("/{id}/activation")
@PreAuthorize("hasRole('ADMIN')")
public ResponseEntity<ApiResponse<ProductResponse>> toggleProductActivation(
@Parameter(description = "상품 ID") @PathVariable("id") Long productId,
@RequestBody ProductStatusRequest request) {
ProductResponse product = productService.toggleProductActivation(productId, request.isActive());
return ResponseEntity.ok(ApiResponse.success(product));
}
@Operation(summary = "상품 삭제", description = "상품을 삭제합니다. 관리자만 접근 가능합니다.")
@DeleteMapping("/{id}")
@PreAuthorize("hasRole('ADMIN')")
public ResponseEntity<ApiResponse<Void>> deleteProduct(
@Parameter(description = "상품 ID") @PathVariable("id") Long productId) {
productService.deleteProduct(productId);
return ResponseEntity.ok(ApiResponse.success(null));
}
}