lcaohoanq
194 words
1 minute
DTO
DTO (Data Transfer Object)
- I prefer using record (java 16+) for visualize the DTO
public record SubcategoryDTO( @NotNull(message = "Category id is required") @JsonProperty("category_id") Long categoryId, @NotEmpty(message = "Sub Category name is required") Set<String> name) {}@JsonPropertyOrder({ "id", "name", "created_at", "updated_at"})public record CategoryResponse( Long id, String name, TreeSet<Subcategory> subcategories, @JsonIgnore @JsonProperty("created_at") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSSSSS") LocalDateTime createdAt, @JsonIgnore @JsonProperty("updated_at") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSSSSS") LocalDateTime updatedAt) {}@Getter@Setter@SuperBuilder@NoArgsConstructor@AllArgsConstructor@Entity@Table(name = "categories")public class Category extends BaseEntity {
@Id @SequenceGenerator(name = "categories_seq", sequenceName = "categories_id_seq", allocationSize = 1) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "categories_seq") @Column(name="id", unique=true, nullable=false) @JsonProperty("id") private Long id; private String name;
@OneToMany(mappedBy = "category") private Set<Subcategory> subcategories;
} @PostMapping("/sub") @PreAuthorize("hasRole('ROLE_MANAGER')") public ResponseEntity<ApiResponse<CreateNewSubcategoryResponse>> createSubCategory( @Valid @RequestBody SubcategoryDTO subcategoryDTO, BindingResult result ) { if (result.hasErrors()) { throw new MethodArgumentNotValidException(result); } return ResponseEntity.status(HttpStatus.CREATED).body( ApiResponse.<CreateNewSubcategoryResponse>builder() .message("Create sub category successfully") .statusCode(HttpStatus.CREATED.value()) .isSuccess(true) .data(categoryService.createSubCategory(subcategoryDTO)) .build() ); } @Override public CreateNewSubcategoryResponse createSubCategory(SubcategoryDTO subcategoryDTO) throws DataNotFoundException, DataAlreadyExistException {
Category category = categoryRepository.findById(subcategoryDTO.categoryId()) .orElseThrow(() -> new CategoryNotFoundException("Category not found"));
if (subcategoryRepository.existsByCategoryIdAndNameIn(category.getId(), subcategoryDTO.name())) { throw new DataAlreadyExistException("Subcategory already exist in category: " + category.getId()); }
subcategoryDTO.name().forEach(name -> { subcategoryRepository.save( Subcategory.builder() .name(name) .category(category) .build()); });
return new CreateNewSubcategoryResponse(categoryMapper.toCategoryResponse(category)); }