У меня есть входящий объект передачи данных (ProductRequestDto), который использует коды/естественные ключи для некоторых отношений (например, imageCodes и CountryCode). Моя внутренняя сущность Entity (Product) использует идентификаторы внешних ключей для тех же отношений (imageIds и CountryId).
Прежде чем сущность Product будет передана в ProductService для сохранения, мне необходимо:
- Перевести/поиск естественных ключей (например, CountryCode) в идентификаторы внешних ключей (например, CountryId). Этот поиск, скорее всего, будет включать отдельный вызов репозитория/службы (например, CountryRepository.findByCode(countryCode)).
- Сопоставьте оставшиеся свойства из ProductRequestDto с сущностью Product.
Должен ли он быть на уровне Mapper, Facade или Service?
Если бы у меня была служба проверки, которая должна была проверять и предупреждать пользователя о том, что у него конфликтующие или слишком много изображений, где бы она находилась?
Спасибо!
@Getter
@Setter
public class ProductRequestDto {
private Long id;
private String code;
private String name;
private String description;
private BigDecimal price;
private Set imageCodes; //Here as codes
private String countryCode; //Here as code
private Boolean active;
private Instant createdAt;
private Instant updatedAt;
}
@Getter
@Setter
public class Product {
private Long id;
private String code;
private String name;
private String description;
private BigDecimal price;
private Set imageIds; //Here as image ids (fk)
private Long countryId; //Here as country Id (fk)
private Boolean active;
private Instant createdAt;
private Instant updatedAt;
}
@RestController
@RequestMapping("/api")
public class ProductResource {
private final ProductFacade productFacade;
@Autowired
public ProductResource(ProductFacade productFacade) {
this.productFacade = productFacade;
}
@PostMapping("/v1/products")
public ProductResponseDto createProduct(@RequestBody CreateProductDto createProductDto){
return productFacade.createProduct(createProductDto);
}
}
@Component
public class ProductFacade {
private final ProductService productService;
private final ProductMapper productMapper;
@Autowired
public ProductFacade(ProductService productService, ProductMapper productMapper) {
this.productService = productService;
this.productMapper = productMapper;
}
public ProductResponseDto createProduct(ProductRequestDto dto) {
Product product = productMapper.toProduct(dto);
Product createdProduct = productService.createProduct(product);
return productMapper.toProductDto(createdProduct);
}
}
@Component
public class ProductService {
private final ProductRepository productRepository;
@Autowired
public ProductService(ProductRepository productRepository) {
this.productRepository = productRepository;
}
public Product createProduct(Product product) {
return productRepository.createProduct(product);
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... layered-sp
Мобильная версия