ProductController.java
package com.flogin.backend.controller;
import com.flogin.backend.dto.ProductRequest;
import com.flogin.backend.dto.ProductResponse;
import com.flogin.backend.service.product.IProductService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/products")
@RequiredArgsConstructor
public class ProductController {
private final IProductService productService;
// --- Create product ---
@PostMapping
@PreAuthorize("hasRole('ADMIN')")
public ResponseEntity<ProductResponse> createProduct(@Valid @RequestBody ProductRequest request) {
ProductResponse response = productService.createProduct(request);
return ResponseEntity.ok(response);
}
// --- Update product ---
@PutMapping("/{id}")
@PreAuthorize("hasRole('ADMIN')")
public ResponseEntity<ProductResponse> updateProduct(@PathVariable Long id, @Valid @RequestBody ProductRequest request) {
ProductResponse response = productService.updateProduct(id, request);
return ResponseEntity.ok(response);
}
// --- Product by id ---
@GetMapping("/{id}")
@PreAuthorize("hasRole('USER')")
public ResponseEntity<ProductResponse> getProductById(@PathVariable Long id) {
ProductResponse response = productService.getProductById(id);
return ResponseEntity.ok(response);
}
// --- List products with filters and paging ---
@GetMapping
@PreAuthorize("hasRole('USER')")
public ResponseEntity<Page<ProductResponse>> listProducts(@RequestParam(required = false) String name, @RequestParam(required = false) String category, @RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "10") int size) {
Page<ProductResponse> products = productService.getProducts(name, category, page, size);
return ResponseEntity.ok(products);
}
// --- Delete product ---
@DeleteMapping("/{id}")
@PreAuthorize("hasRole('ADMIN')")
public ResponseEntity<Void> deleteProduct(@PathVariable Long id) {
productService.deleteProduct(id);
return ResponseEntity.noContent().build();
}
}