diff --git a/src/main/java/de/avatic/lcc/controller/configuration/CountryController.java b/src/main/java/de/avatic/lcc/controller/configuration/CountryController.java index 492e9ee..2d65fb2 100644 --- a/src/main/java/de/avatic/lcc/controller/configuration/CountryController.java +++ b/src/main/java/de/avatic/lcc/controller/configuration/CountryController.java @@ -75,7 +75,9 @@ public class CountryController { /** * Retrieves detailed information about a specific country based on its ID. * - * @param id the identifier of the country to retrieve + * @param id the identifier of the country to retrieve + * @param propertySetId an optional query parameter indicating the property set to use for retrieving country properties; + * defaults to 0, which retrieves properties from the current set * @return a {@link ResponseEntity} containing a {@link CountryDetailDTO} with the country's details */ @GetMapping("/{id}") diff --git a/src/main/java/de/avatic/lcc/controller/configuration/MaterialController.java b/src/main/java/de/avatic/lcc/controller/configuration/MaterialController.java index e879357..ce25255 100644 --- a/src/main/java/de/avatic/lcc/controller/configuration/MaterialController.java +++ b/src/main/java/de/avatic/lcc/controller/configuration/MaterialController.java @@ -1,6 +1,6 @@ package de.avatic.lcc.controller.configuration; -import de.avatic.lcc.dto.configuration.material.view.MaterialViewDTO; +import de.avatic.lcc.dto.configuration.material.view.MaterialDetailDTO; import de.avatic.lcc.dto.configuration.material.update.MaterialUpdateDTO; import de.avatic.lcc.dto.generic.MaterialDTO; import de.avatic.lcc.repositories.pagination.SearchQueryResult; @@ -56,39 +56,7 @@ public class MaterialController { * @throws RuntimeException if the material with the given ID is not found. */ @GetMapping("/{id}") - public ResponseEntity getMaterialDetails(@PathVariable Integer id) { + public ResponseEntity getMaterialDetails(@PathVariable Integer id) { return ResponseEntity.ok(materialService.getMaterial(id)); } - - /** - * Update a material with the specified ID. - * - * @param id Material ID to update - * @param material The updated material details - * @return The updated material - */ - @PutMapping("/{id}") - public ResponseEntity updateMaterial( - @PathVariable Integer id, - @RequestBody MaterialUpdateDTO material) { - Check.equals(id, material.getId()); - return ResponseEntity.ok(materialService.updateMaterial(id, material)); - } - - /** - * Soft delete a material by marking it as deprecated. - * - * @param id Material ID - * @return Empty response with status 204 No Content - * @throws RuntimeException if the material with the given ID cannot be found or deleted. - */ - @DeleteMapping("/{id}") - public ResponseEntity deleteMaterial(@PathVariable Integer id) { - ResponseEntity.ok(materialService.deleteMaterial(id)); - } - - @PostMapping("/") - public ResponseEntity createMaterial(@RequestBody MaterialUpdateDTO material) { - return ResponseEntity.ok(materialService.createMaterial(material)); - } } \ No newline at end of file diff --git a/src/main/java/de/avatic/lcc/controller/configuration/NodeController.java b/src/main/java/de/avatic/lcc/controller/configuration/NodeController.java index cf5ba4c..537c2a9 100644 --- a/src/main/java/de/avatic/lcc/controller/configuration/NodeController.java +++ b/src/main/java/de/avatic/lcc/controller/configuration/NodeController.java @@ -1,9 +1,15 @@ package de.avatic.lcc.controller.configuration; +import de.avatic.lcc.dto.configuration.nodes.userNodes.LocateNodeDTO; +import de.avatic.lcc.dto.generic.LocationDTO; import de.avatic.lcc.dto.generic.NodeDTO; import de.avatic.lcc.dto.configuration.nodes.view.NodeDetailDTO; import de.avatic.lcc.dto.configuration.nodes.update.NodeUpdateDTO; +import de.avatic.lcc.dto.generic.NodeType; +import de.avatic.lcc.dto.configuration.nodes.userNodes.AddUserNodeDTO; import de.avatic.lcc.repositories.pagination.SearchQueryResult; +import de.avatic.lcc.repositories.users.UserNodeRepository; +import de.avatic.lcc.service.GeoApiService; import de.avatic.lcc.service.configuration.NodeService; import de.avatic.lcc.util.Check; import org.springframework.http.ResponseEntity; @@ -15,24 +21,32 @@ import java.util.List; @RequestMapping("/api/nodes") public class NodeController { - private final NodeService nodeService; + private final GeoApiService geoApiService; + private final UserNodeRepository userNodeRepository; - public NodeController(NodeService nodeService) { + public NodeController(NodeService nodeService, GeoApiService geoApiService, UserNodeRepository userNodeRepository) { this.nodeService = nodeService; + this.geoApiService = geoApiService; + this.userNodeRepository = userNodeRepository; } @GetMapping("/") public ResponseEntity> listNodes(@RequestParam(required = false) String filter, @RequestParam(required = false) int page, @RequestParam(required = false) int limit) { nodeService.listNodes(filter, page, limit); - SearchQueryResult countries = nodeService.listNodes(filter, page, limit); + SearchQueryResult nodes = nodeService.listNodes(filter, page, limit); return ResponseEntity.ok() - .header("X-Total-Count", String.valueOf(countries.getTotalElements())) - .header("X-Page-Count", String.valueOf(countries.getTotalPages())) + .header("X-Total-Count", String.valueOf(nodes.getTotalElements())) + .header("X-Page-Count", String.valueOf(nodes.getTotalPages())) .header("X-Current-Page", String.valueOf(page)) - .body(countries.toList()); + .body(nodes.toList()); + } + + @GetMapping("/search") + public ResponseEntity> searchNodes(@RequestParam(required = false) String filter, @RequestParam(required = false) int limit, @RequestParam(name = "node_type", required = false) NodeType nodeType, @RequestParam(name = "include_user_node", defaultValue = "false", required = false) boolean includeUserNode) { + return ResponseEntity.ok(nodeService.searchNode(filter, limit, nodeType, includeUserNode)); } @GetMapping("/{id}") @@ -50,4 +64,15 @@ public class NodeController { Check.equals(id, node.getId()); return ResponseEntity.ok(nodeService.updateNode(node)); } + + @GetMapping("/locate") + public ResponseEntity locateNode(@RequestParam String address) { + return ResponseEntity.ok(geoApiService.locate(address)); + } + + @PutMapping("/") + public ResponseEntity addUserNode(@RequestParam AddUserNodeDTO node) { + nodeService.addUserNode(node); + return ResponseEntity.ok().build(); + } } diff --git a/src/main/java/de/avatic/lcc/controller/configuration/PropertyController.java b/src/main/java/de/avatic/lcc/controller/configuration/PropertyController.java index 6133f65..b8aad2f 100644 --- a/src/main/java/de/avatic/lcc/controller/configuration/PropertyController.java +++ b/src/main/java/de/avatic/lcc/controller/configuration/PropertyController.java @@ -1,12 +1,11 @@ package de.avatic.lcc.controller.configuration; -import de.avatic.lcc.dto.configuration.properties.PropertySetDTO; +import de.avatic.lcc.dto.generic.ValidityPeriodDTO; import de.avatic.lcc.dto.generic.PropertyDTO; import de.avatic.lcc.model.country.IsoCode; -import de.avatic.lcc.model.properties.PropertySet; import de.avatic.lcc.service.configuration.CountryService; -import de.avatic.lcc.service.configuration.PropertiesService; -import de.avatic.lcc.service.configuration.StagedChangesService; +import de.avatic.lcc.service.configuration.PropertyService; +import de.avatic.lcc.service.configuration.PropertyStagedChangesService; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -20,19 +19,19 @@ import java.util.List; @RequestMapping("/properties") public class PropertyController { - private final PropertiesService propertiesService; - private final StagedChangesService stagedChangesService; + private final PropertyService propertyService; + private final PropertyStagedChangesService propertyStagedChangesService; private final CountryService countryService; /** * Constructs a new PropertyController with the provided services. * - * @param propertiesService Service for managing properties. - * @param stagedChangesService Service for managing staged changes. + * @param propertyService Service for managing properties. + * @param propertyStagedChangesService Service for managing staged changes. */ - public PropertyController(PropertiesService propertiesService, StagedChangesService stagedChangesService, CountryService countryService) { - this.propertiesService = propertiesService; - this.stagedChangesService = stagedChangesService; + public PropertyController(PropertyService propertyService, PropertyStagedChangesService propertyStagedChangesService, CountryService countryService) { + this.propertyService = propertyService; + this.propertyStagedChangesService = propertyStagedChangesService; this.countryService = countryService; } @@ -43,12 +42,30 @@ public class PropertyController { */ @GetMapping("/") public ResponseEntity> listProperties(@RequestParam(name = "property_set", defaultValue = "0", required = false) Integer propertySetId) { - return ResponseEntity.ok(propertiesService.listProperties(propertySetId)); + return ResponseEntity.ok(propertyService.listProperties(propertySetId)); } + + /** + * Retrieves all validity periods of the application properties. + * + * @return ResponseEntity containing the list of ValidityPeriodDTO objects. + */ @GetMapping("/periods") - public ResponseEntity> listPeriods() { - return ResponseEntity.ok(propertiesService.listPropertySets()); + public ResponseEntity> listPeriods() { + return ResponseEntity.ok(propertyService.listPropertySets()); + } + + /** + * Invalidates a specific validity period by its ID. + * + * @param id The ID of the validity period to invalidate. + * @return ResponseEntity indicating the operation status. + */ + @DeleteMapping("/periods/{id}") + public ResponseEntity invalidatePeriod(@PathVariable Integer id) { + propertyService.invalidate(id); + return ResponseEntity.ok().build(); } /** @@ -74,7 +91,7 @@ public class PropertyController { */ @PutMapping("/system/{external_mapping_id}") public ResponseEntity setProperties(@PathVariable(name = "external_mapping_id") String externalMappingId, @RequestBody String value) { - propertiesService.setProperties(externalMappingId, value); + propertyService.setProperties(externalMappingId, value); return ResponseEntity.ok().build(); } @@ -85,7 +102,7 @@ public class PropertyController { */ @GetMapping("/staged_changes") public ResponseEntity checkPropertiesDrafts() { - return ResponseEntity.ok(stagedChangesService.hasPropertiesDraft()); + return ResponseEntity.ok(propertyStagedChangesService.hasPropertiesDraft()); } /** @@ -95,7 +112,7 @@ public class PropertyController { */ @PutMapping("/staged_changes") public ResponseEntity approvePropertiesDrafts() { - stagedChangesService.approvePropertiesDrafts(); + propertyStagedChangesService.applyDraft(); return ResponseEntity.ok().build(); } diff --git a/src/main/java/de/avatic/lcc/controller/configuration/RateController.java b/src/main/java/de/avatic/lcc/controller/configuration/RateController.java index c6f8306..3c7c83f 100644 --- a/src/main/java/de/avatic/lcc/controller/configuration/RateController.java +++ b/src/main/java/de/avatic/lcc/controller/configuration/RateController.java @@ -5,7 +5,7 @@ import de.avatic.lcc.dto.configuration.rates.ContainerRateDTO; import de.avatic.lcc.repositories.pagination.SearchQueryResult; import de.avatic.lcc.service.configuration.ContainerRateService; import de.avatic.lcc.service.configuration.MatrixRateService; -import de.avatic.lcc.service.configuration.StagedChangesService; +import de.avatic.lcc.service.configuration.PropertyStagedChangesService; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -19,12 +19,12 @@ public class RateController { private final MatrixRateService matrixRateService; private final ContainerRateService containerRateService; - private final StagedChangesService stagedChangesService; + private final PropertyStagedChangesService propertyStagedChangesService; - public RateController(MatrixRateService matrixRateService, ContainerRateService containerRateService, StagedChangesService stagedChangesService) { + public RateController(MatrixRateService matrixRateService, ContainerRateService containerRateService, PropertyStagedChangesService propertyStagedChangesService) { this.matrixRateService = matrixRateService; this.containerRateService = containerRateService; - this.stagedChangesService = stagedChangesService; + this.propertyStagedChangesService = propertyStagedChangesService; } @GetMapping("/container") @@ -90,12 +90,12 @@ public class RateController { @GetMapping("/staged_changes") public ResponseEntity checkRateDrafts() { - return ResponseEntity.ok(stagedChangesService.hasRateDrafts()); + return ResponseEntity.ok(propertyStagedChangesService.hasRateDrafts()); } @PutMapping("/staged_changes") public ResponseEntity approveRateDrafts() { - stagedChangesService.approveRateDrafts(); + propertyStagedChangesService.approveRateDrafts(); return ResponseEntity.ok().build(); } } diff --git a/src/main/java/de/avatic/lcc/dto/configuration/material/view/MaterialViewDTO.java b/src/main/java/de/avatic/lcc/dto/configuration/material/view/MaterialDetailDTO.java similarity index 82% rename from src/main/java/de/avatic/lcc/dto/configuration/material/view/MaterialViewDTO.java rename to src/main/java/de/avatic/lcc/dto/configuration/material/view/MaterialDetailDTO.java index a377395..544b62f 100644 --- a/src/main/java/de/avatic/lcc/dto/configuration/material/view/MaterialViewDTO.java +++ b/src/main/java/de/avatic/lcc/dto/configuration/material/view/MaterialDetailDTO.java @@ -5,7 +5,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; import java.util.Objects; -public class MaterialViewDTO { +public class MaterialDetailDTO { private Integer id; @JsonProperty("part_number") @@ -16,14 +16,13 @@ public class MaterialViewDTO { @JsonProperty("hs_code") private String hsCode; - @JsonProperty("packaging") - private List handlingUnits; + private List handlingUnits; - public MaterialViewDTO() { + public MaterialDetailDTO() { } - public MaterialViewDTO(Integer id, String partNumber, String name, String hs_code, List handling_units) { + public MaterialDetailDTO(Integer id, String partNumber, String name, String hs_code, List handling_units) { this.id = id; this.partNumber = partNumber; this.name = name; @@ -68,11 +67,11 @@ public class MaterialViewDTO { } @JsonProperty("handling_units") - public List getHandlingUnits() { + public List getHandlingUnits() { return handlingUnits; } - public void setHandlingUnits(List handlingUnits) { + public void setHandlingUnits(List handlingUnits) { this.handlingUnits = handlingUnits; } @@ -91,7 +90,7 @@ public class MaterialViewDTO { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - MaterialViewDTO that = (MaterialViewDTO) o; + MaterialDetailDTO that = (MaterialDetailDTO) o; return Objects.equals(id, that.id) && Objects.equals(partNumber, that.partNumber) && Objects.equals(name, that.name) && diff --git a/src/main/java/de/avatic/lcc/dto/configuration/material/view/MaterialViewPackagingDTO.java b/src/main/java/de/avatic/lcc/dto/configuration/material/view/MaterialDetailPackagingDTO.java similarity index 77% rename from src/main/java/de/avatic/lcc/dto/configuration/material/view/MaterialViewPackagingDTO.java rename to src/main/java/de/avatic/lcc/dto/configuration/material/view/MaterialDetailPackagingDTO.java index 2150b2b..67f0d20 100644 --- a/src/main/java/de/avatic/lcc/dto/configuration/material/view/MaterialViewPackagingDTO.java +++ b/src/main/java/de/avatic/lcc/dto/configuration/material/view/MaterialDetailPackagingDTO.java @@ -3,8 +3,11 @@ package de.avatic.lcc.dto.configuration.material.view; import com.fasterxml.jackson.annotation.JsonProperty; import de.avatic.lcc.dto.generic.DimensionDTO; import de.avatic.lcc.dto.generic.NodeDTO; +import de.avatic.lcc.dto.generic.PropertyDTO; -public class MaterialViewPackagingDTO { +import java.util.List; + +public class MaterialDetailPackagingDTO { private Integer id; @@ -19,6 +22,16 @@ public class MaterialViewPackagingDTO { @JsonProperty("small_handling_unit") private DimensionDTO shu; + private List properties; + + public List getProperties() { + return properties; + } + + public void setProperties(List properties) { + this.properties = properties; + } + public Integer getId() { return id; } diff --git a/src/main/java/de/avatic/lcc/dto/configuration/nodes/update/NodeUpdateDTO.java b/src/main/java/de/avatic/lcc/dto/configuration/nodes/update/NodeUpdateDTO.java index 19ee3ff..52c3ecd 100644 --- a/src/main/java/de/avatic/lcc/dto/configuration/nodes/update/NodeUpdateDTO.java +++ b/src/main/java/de/avatic/lcc/dto/configuration/nodes/update/NodeUpdateDTO.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import de.avatic.lcc.dto.generic.CountryDTO; import de.avatic.lcc.dto.generic.LocationDTO; import de.avatic.lcc.dto.generic.NodeDTO; -import de.avatic.lcc.dto.generic.NodeTypeDTO; +import de.avatic.lcc.dto.generic.NodeType; import java.util.List; import java.util.Map; @@ -15,7 +15,7 @@ public class NodeUpdateDTO { private String name; private CountryDTO country; private String address; - private List types; + private List types; private LocationDTO location; @JsonProperty("is_deprecated") private Boolean isDeprecated; diff --git a/src/main/java/de/avatic/lcc/dto/configuration/nodes/userNodes/AddUserNodeDTO.java b/src/main/java/de/avatic/lcc/dto/configuration/nodes/userNodes/AddUserNodeDTO.java new file mode 100644 index 0000000..670be90 --- /dev/null +++ b/src/main/java/de/avatic/lcc/dto/configuration/nodes/userNodes/AddUserNodeDTO.java @@ -0,0 +1,38 @@ +package de.avatic.lcc.dto.configuration.nodes.userNodes; + +import com.fasterxml.jackson.annotation.JsonProperty; +import de.avatic.lcc.dto.generic.LocationDTO; +import de.avatic.lcc.dto.generic.NodeType; + +import java.util.List; + +public class AddUserNodeDTO { + + private String name; + private String address; + private LocationDTO location; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public LocationDTO getLocation() { + return location; + } + + public void setLocation(LocationDTO location) { + this.location = location; + } +} diff --git a/src/main/java/de/avatic/lcc/dto/configuration/nodes/userNodes/LocateNodeDTO.java b/src/main/java/de/avatic/lcc/dto/configuration/nodes/userNodes/LocateNodeDTO.java new file mode 100644 index 0000000..5b2b158 --- /dev/null +++ b/src/main/java/de/avatic/lcc/dto/configuration/nodes/userNodes/LocateNodeDTO.java @@ -0,0 +1,35 @@ +package de.avatic.lcc.dto.configuration.nodes.userNodes; + +import de.avatic.lcc.dto.generic.CountryDTO; +import de.avatic.lcc.dto.generic.LocationDTO; + +public class LocateNodeDTO { + private String address; + private CountryDTO country; + private LocationDTO location; + + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public CountryDTO getCountry() { + return country; + } + + public void setCountry(CountryDTO country) { + this.country = country; + } + + public LocationDTO getLocation() { + return location; + } + + public void setLocation(LocationDTO location) { + this.location = location; + } +} diff --git a/src/main/java/de/avatic/lcc/dto/configuration/nodes/view/NodeDetailDTO.java b/src/main/java/de/avatic/lcc/dto/configuration/nodes/view/NodeDetailDTO.java index 1525259..bb178d7 100644 --- a/src/main/java/de/avatic/lcc/dto/configuration/nodes/view/NodeDetailDTO.java +++ b/src/main/java/de/avatic/lcc/dto/configuration/nodes/view/NodeDetailDTO.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import de.avatic.lcc.dto.generic.CountryDTO; import de.avatic.lcc.dto.generic.LocationDTO; import de.avatic.lcc.dto.generic.NodeDTO; -import de.avatic.lcc.dto.generic.NodeTypeDTO; +import de.avatic.lcc.dto.generic.NodeType; import java.util.List; import java.util.Map; @@ -15,7 +15,7 @@ public class NodeDetailDTO { private String name; private CountryDTO country; private String address; - private List types; + private List types; private LocationDTO location; @JsonProperty("is_deprecated") private Boolean isDeprecated; @@ -56,11 +56,11 @@ public class NodeDetailDTO { this.address = address; } - public List getTypes() { + public List getTypes() { return types; } - public void setTypes(List types) { + public void setTypes(List types) { this.types = types; } diff --git a/src/main/java/de/avatic/lcc/dto/configuration/packaging/update/PackagingUpdateDTO.java b/src/main/java/de/avatic/lcc/dto/configuration/packaging/update/PackagingUpdateDTO.java deleted file mode 100644 index ee4b558..0000000 --- a/src/main/java/de/avatic/lcc/dto/configuration/packaging/update/PackagingUpdateDTO.java +++ /dev/null @@ -1,84 +0,0 @@ -package de.avatic.lcc.dto.configuration.packaging.update; - -import com.fasterxml.jackson.annotation.JsonProperty; -import de.avatic.lcc.dto.generic.DimensionDTO; - -import java.util.Map; - - -public class PackagingUpdateDTO { - - private Integer id; - - @JsonProperty("is_deprecated") - private Boolean isDeprecated; - - private Integer supplierId; - - private Integer materialId; - - @JsonProperty("handling_unit") - private DimensionDTO hu; - - @JsonProperty("small_handling_unit") - private DimensionDTO shu; - - @JsonProperty("properties") - private Map properties; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getDeprecated() { - return isDeprecated; - } - - public void setDeprecated(Boolean deprecated) { - isDeprecated = deprecated; - } - - public Integer getSupplierId() { - return supplierId; - } - - public void setSupplierId(Integer supplierId) { - this.supplierId = supplierId; - } - - public Integer getMaterialId() { - return materialId; - } - - public void setMaterialId(Integer materialId) { - this.materialId = materialId; - } - - public DimensionDTO getHu() { - return hu; - } - - public void setHu(DimensionDTO hu) { - this.hu = hu; - } - - public DimensionDTO getShu() { - return shu; - } - - public void setShu(DimensionDTO shu) { - this.shu = shu; - } - - public Map getProperties() { - return properties; - } - - public void setProperties(Map properties) { - this.properties = properties; - } -} diff --git a/src/main/java/de/avatic/lcc/dto/configuration/packaging/view/PackagingViewDTO.java b/src/main/java/de/avatic/lcc/dto/configuration/packaging/view/PackagingViewDTO.java deleted file mode 100644 index 0095f05..0000000 --- a/src/main/java/de/avatic/lcc/dto/configuration/packaging/view/PackagingViewDTO.java +++ /dev/null @@ -1,85 +0,0 @@ -package de.avatic.lcc.dto.configuration.packaging.view; - -import com.fasterxml.jackson.annotation.JsonProperty; -import de.avatic.lcc.dto.generic.DimensionDTO; -import de.avatic.lcc.dto.generic.MaterialDTO; -import de.avatic.lcc.dto.generic.NodeDTO; - -import java.util.List; - - -public class PackagingViewDTO { - - private Integer id; - - @JsonProperty("is_deprecated") - private Boolean isDeprecated; - - private NodeDTO supplier; - - private MaterialDTO material; - - @JsonProperty("handling_unit") - private DimensionDTO hu; - - @JsonProperty("small_handling_unit") - private DimensionDTO shu; - - private List properties; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Boolean getDeprecated() { - return isDeprecated; - } - - public void setDeprecated(Boolean deprecated) { - isDeprecated = deprecated; - } - - public NodeDTO getSupplier() { - return supplier; - } - - public void setSupplier(NodeDTO supplier) { - this.supplier = supplier; - } - - public MaterialDTO getMaterial() { - return material; - } - - public void setMaterial(MaterialDTO material) { - this.material = material; - } - - public DimensionDTO getHu() { - return hu; - } - - public void setHu(DimensionDTO hu) { - this.hu = hu; - } - - public DimensionDTO getShu() { - return shu; - } - - public void setShu(DimensionDTO shu) { - this.shu = shu; - } - - public List getProperties() { - return properties; - } - - public void setProperties(List properties) { - this.properties = properties; - } -} diff --git a/src/main/java/de/avatic/lcc/dto/configuration/packaging/view/PackagingViewPropertyDTO.java b/src/main/java/de/avatic/lcc/dto/configuration/packaging/view/PackagingViewPropertyDTO.java deleted file mode 100644 index 219a0b6..0000000 --- a/src/main/java/de/avatic/lcc/dto/configuration/packaging/view/PackagingViewPropertyDTO.java +++ /dev/null @@ -1,71 +0,0 @@ -package de.avatic.lcc.dto.configuration.packaging.view; - -import com.fasterxml.jackson.annotation.JsonProperty; - -public class PackagingViewPropertyDTO { - - private String name; - - @JsonProperty("external_mapping_id") - private String externalMappingId; - - @JsonProperty("is_required") - private Boolean isRequired; - - @JsonProperty("data_type") - private String dataType; - - @JsonProperty("current_value") - private String currentValue; - - @JsonProperty("validation_rule") - private String validationRule; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getExternalMappingId() { - return externalMappingId; - } - - public void setExternalMappingId(String externalMappingId) { - this.externalMappingId = externalMappingId; - } - - public Boolean getRequired() { - return isRequired; - } - - public void setRequired(Boolean required) { - isRequired = required; - } - - public String getDataType() { - return dataType; - } - - public void setDataType(String dataType) { - this.dataType = dataType; - } - - public String getCurrentValue() { - return currentValue; - } - - public void setCurrentValue(String currentValue) { - this.currentValue = currentValue; - } - - public String getValidationRule() { - return validationRule; - } - - public void setValidationRule(String validationRule) { - this.validationRule = validationRule; - } -} diff --git a/src/main/java/de/avatic/lcc/dto/generic/NodeDTO.java b/src/main/java/de/avatic/lcc/dto/generic/NodeDTO.java index f8866f3..d03e2c2 100644 --- a/src/main/java/de/avatic/lcc/dto/generic/NodeDTO.java +++ b/src/main/java/de/avatic/lcc/dto/generic/NodeDTO.java @@ -10,12 +10,23 @@ public class NodeDTO { private String name; private CountryDTO country; private String address; - private List types; + private List types; private LocationDTO location; + @JsonProperty("is_user_node") + private Boolean isUserNode; + @JsonProperty("is_deprecated") private Boolean isDeprecated; + public Boolean getUserNode() { + return isUserNode; + } + + public void setUserNode(Boolean userNode) { + isUserNode = userNode; + } + public Integer getId() { return id; } @@ -48,11 +59,11 @@ public class NodeDTO { this.address = address; } - public List getTypes() { + public List getTypes() { return types; } - public void setTypes(List types) { + public void setTypes(List types) { this.types = types; } diff --git a/src/main/java/de/avatic/lcc/dto/generic/NodeTypeDTO.java b/src/main/java/de/avatic/lcc/dto/generic/NodeType.java similarity index 94% rename from src/main/java/de/avatic/lcc/dto/generic/NodeTypeDTO.java rename to src/main/java/de/avatic/lcc/dto/generic/NodeType.java index 1f3bfde..a6ae70a 100644 --- a/src/main/java/de/avatic/lcc/dto/generic/NodeTypeDTO.java +++ b/src/main/java/de/avatic/lcc/dto/generic/NodeType.java @@ -7,7 +7,7 @@ import com.fasterxml.jackson.annotation.JsonValue; * A node can be categorized as SINK, SOURCE, or INTERMEDIATE, depending * on its role within a network or process. */ -public enum NodeTypeDTO { +public enum NodeType { /** * Represents a node that consumes resources or products (end-point of flow). */ @@ -30,7 +30,7 @@ public enum NodeTypeDTO { * * @param displayedType The string representation of the node type. */ - NodeTypeDTO(String displayedType) { + NodeType(String displayedType) { this.displayedType = displayedType; } diff --git a/src/main/java/de/avatic/lcc/dto/configuration/properties/PropertySetDTO.java b/src/main/java/de/avatic/lcc/dto/generic/ValidityPeriodDTO.java similarity index 82% rename from src/main/java/de/avatic/lcc/dto/configuration/properties/PropertySetDTO.java rename to src/main/java/de/avatic/lcc/dto/generic/ValidityPeriodDTO.java index 25a074e..f3f36b5 100644 --- a/src/main/java/de/avatic/lcc/dto/configuration/properties/PropertySetDTO.java +++ b/src/main/java/de/avatic/lcc/dto/generic/ValidityPeriodDTO.java @@ -1,15 +1,18 @@ -package de.avatic.lcc.dto.configuration.properties; +package de.avatic.lcc.dto.generic; +import com.fasterxml.jackson.annotation.JsonProperty; import de.avatic.lcc.model.properties.PropertySetState; import java.time.LocalDateTime; -public class PropertySetDTO { +public class ValidityPeriodDTO { private Integer id; + @JsonProperty("start_date") private LocalDateTime startDate; + @JsonProperty("end_date") private LocalDateTime endDate; private PropertySetState state; diff --git a/src/main/java/de/avatic/lcc/model/materials/MaterialSupplier.java b/src/main/java/de/avatic/lcc/model/materials/MaterialSupplier.java index 423c8b7..9479ad3 100644 --- a/src/main/java/de/avatic/lcc/model/materials/MaterialSupplier.java +++ b/src/main/java/de/avatic/lcc/model/materials/MaterialSupplier.java @@ -1,7 +1,7 @@ package de.avatic.lcc.model.materials; import de.avatic.lcc.model.country.CountryListEntry; -import de.avatic.lcc.dto.generic.NodeTypeDTO; +import de.avatic.lcc.dto.generic.NodeType; import java.util.List; @@ -11,7 +11,7 @@ public class MaterialSupplier { private String name; private CountryListEntry country; private String address; - private List types; + private List types; public String getName() { @@ -46,11 +46,11 @@ public class MaterialSupplier { this.address = address; } - public List getTypes() { + public List getTypes() { return types; } - public void setTypes(List types) { + public void setTypes(List types) { this.types = types; } } diff --git a/src/main/java/de/avatic/lcc/model/premisses/Premiss.java b/src/main/java/de/avatic/lcc/model/premisses/Premiss.java index 32b2208..5c5577f 100644 --- a/src/main/java/de/avatic/lcc/model/premisses/Premiss.java +++ b/src/main/java/de/avatic/lcc/model/premisses/Premiss.java @@ -2,8 +2,8 @@ package de.avatic.lcc.model.premisses; import de.avatic.lcc.model.materials.Material; import de.avatic.lcc.model.nodes.Node; +import de.avatic.lcc.model.packaging.Packaging; import de.avatic.lcc.model.utils.DimensionUnit; -import de.avatic.lcc.dto.configuration.packaging.view.PackagingViewDTO; import de.avatic.lcc.model.utils.WeightUnit; import de.avatic.lcc.model.user.SysUser; import jakarta.validation.constraints.Digits; @@ -89,7 +89,7 @@ public class Premiss { private AggregateReference userSupplierNode; @Column("packaging_id") - private AggregateReference packaging; + private Packaging packaging; @NotNull private AggregateReference user; @@ -273,11 +273,11 @@ public class Premiss { this.userSupplierNode = userSupplierNode; } - public AggregateReference getPackaging() { + public Packaging getPackaging() { return packaging; } - public void setPackaging(AggregateReference packaging) { + public void setPackaging(Packaging packaging) { this.packaging = packaging; } diff --git a/src/main/java/de/avatic/lcc/model/user/SysGroup.java b/src/main/java/de/avatic/lcc/model/user/SysGroup.java index 528360f..b014c43 100644 --- a/src/main/java/de/avatic/lcc/model/user/SysGroup.java +++ b/src/main/java/de/avatic/lcc/model/user/SysGroup.java @@ -5,7 +5,7 @@ import jakarta.validation.constraints.Size; import org.springframework.data.annotation.Id; import org.springframework.data.relational.core.mapping.Table; - +@Deprecated @Table(name = "sys_group") public class SysGroup { diff --git a/src/main/java/de/avatic/lcc/model/user/SysUser.java b/src/main/java/de/avatic/lcc/model/user/SysUser.java index 95f28a5..ac6b339 100644 --- a/src/main/java/de/avatic/lcc/model/user/SysUser.java +++ b/src/main/java/de/avatic/lcc/model/user/SysUser.java @@ -8,7 +8,7 @@ import org.springframework.data.relational.core.mapping.Table; import java.util.Set; - +@Deprecated @Table(name = "sys_user") public class SysUser { diff --git a/src/main/java/de/avatic/lcc/model/user/SysUserGroupMapping.java b/src/main/java/de/avatic/lcc/model/user/SysUserGroupMapping.java index b6d72ea..bb4b580 100644 --- a/src/main/java/de/avatic/lcc/model/user/SysUserGroupMapping.java +++ b/src/main/java/de/avatic/lcc/model/user/SysUserGroupMapping.java @@ -6,7 +6,7 @@ import org.springframework.data.annotation.Id; import org.springframework.data.jdbc.core.mapping.AggregateReference; import org.springframework.data.relational.core.mapping.Column; import org.springframework.data.relational.core.mapping.Table; - +@Deprecated @Table(name = "sys_user_group_mapping") public class SysUserGroupMapping { diff --git a/src/main/java/de/avatic/lcc/model/user/SysUserNode.java b/src/main/java/de/avatic/lcc/model/user/SysUserNode.java index 69086be..5fc11ee 100644 --- a/src/main/java/de/avatic/lcc/model/user/SysUserNode.java +++ b/src/main/java/de/avatic/lcc/model/user/SysUserNode.java @@ -8,7 +8,7 @@ import org.springframework.data.relational.core.mapping.Column; import org.springframework.data.relational.core.mapping.Table; import java.math.BigDecimal; - +@Deprecated @Table(name = "sys_user_node") public class SysUserNode { diff --git a/src/main/java/de/avatic/lcc/repositories/NodeRepository.java b/src/main/java/de/avatic/lcc/repositories/NodeRepository.java index a2d04fc..6b92c50 100644 --- a/src/main/java/de/avatic/lcc/repositories/NodeRepository.java +++ b/src/main/java/de/avatic/lcc/repositories/NodeRepository.java @@ -1,5 +1,6 @@ package de.avatic.lcc.repositories; +import de.avatic.lcc.dto.generic.NodeType; import de.avatic.lcc.model.nodes.Node; import de.avatic.lcc.repositories.pagination.SearchQueryPagination; import de.avatic.lcc.repositories.pagination.SearchQueryResult; @@ -65,9 +66,19 @@ public class NodeRepository { @Transactional public SearchQueryResult listNodes(String filter, Boolean excludeDeprecated, SearchQueryPagination pagination) { String query = buildQuery(filter, excludeDeprecated, pagination); + String countQuery = buildCountQuery(filter, excludeDeprecated); + List entities = null; + Integer totalCount = 0; + + if(filter == null) { + entities = jdbcTemplate.query(query, new NodeMapper(), pagination.getLimit(), pagination.getOffset()); + totalCount = jdbcTemplate.queryForObject(countQuery, Integer.class); + } + else { + entities= jdbcTemplate.query(query, new NodeMapper(), "%" + filter + "%", "%" + filter + "%", "%" + filter + "%", pagination.getLimit(), pagination.getOffset()); + totalCount = jdbcTemplate.queryForObject(countQuery, Integer.class, "%" + filter + "%", "%" + filter + "%", "%" + filter + "%"); + } - List entities = jdbcTemplate.query(query, new NodeMapper(), "%" + filter + "%", "%" + filter + "%", "%" + filter + "%", pagination.getLimit(), pagination.getOffset()); - Integer totalCount = jdbcTemplate.queryForObject(buildCountQuery(filter, excludeDeprecated), Integer.class, "%" + filter + "%", "%" + filter + "%", "%" + filter + "%"); return new SearchQueryResult<>(entities, pagination.getPage(), totalCount, pagination.getLimit()); } @@ -119,6 +130,27 @@ public class NodeRepository { return Optional.ofNullable(jdbcTemplate.update(query, node.getId()) == 0 ? null : node.getId()); } + public List searchNode(String filter, int limit, NodeType nodeType, boolean excludeDeprecated) { + StringBuilder queryBuilder = new StringBuilder().append("SELECT * FROM node WHERE (name LIKE ? OR address LIKE ?)"); + + if(nodeType != null) { + queryBuilder.append(" AND node_type = ?"); + } + + if(excludeDeprecated) { + queryBuilder.append(" AND is_deprecated = false"); + } + + queryBuilder.append(" LIMIT ?"); + + if(nodeType != null) + { + return jdbcTemplate.query(queryBuilder.toString(),new NodeMapper(), "%" + filter + "%", "%" + filter + "%", nodeType.name(), limit); + } + + return jdbcTemplate.query(queryBuilder.toString(),new NodeMapper(), "%" + filter + "%", "%" + filter + "%", limit); + } + private class NodeMapper implements RowMapper { @Override diff --git a/src/main/java/de/avatic/lcc/repositories/country/CountryPropertyRepository.java b/src/main/java/de/avatic/lcc/repositories/country/CountryPropertyRepository.java index cb86be2..3b2244f 100644 --- a/src/main/java/de/avatic/lcc/repositories/country/CountryPropertyRepository.java +++ b/src/main/java/de/avatic/lcc/repositories/country/CountryPropertyRepository.java @@ -89,4 +89,20 @@ public class CountryPropertyRepository { return dto; }, id, propertySetId); } + + public void fillDraft(Integer setId) { + String query = """ + SELECT type.id AS typeId, property.property_value as value, property.country_id AS country_id FROM country_property_type AS type + LEFT JOIN country_property AS property ON property.country_property_type_id = type.id + LEFT JOIN property_set AS propertySet ON propertySet.id = property.property_set_id WHERE propertySet.state = 'VALID'"""; + + + jdbcTemplate.query(query, (rs, rowNum) -> { + String insertQuery = "INSERT IGNORE INTO country_property (property_value, country_id, country_property_type_id, property_set_id) VALUES (?, ?, ?, ?)"; + jdbcTemplate.update(insertQuery, rs.getString("value"), rs.getInt("country_id"), rs.getInt("typeId"), setId); + return null; + }); + + + } } diff --git a/src/main/java/de/avatic/lcc/repositories/properties/PropertyRepository.java b/src/main/java/de/avatic/lcc/repositories/properties/PropertyRepository.java index 27f19d3..89be7f4 100644 --- a/src/main/java/de/avatic/lcc/repositories/properties/PropertyRepository.java +++ b/src/main/java/de/avatic/lcc/repositories/properties/PropertyRepository.java @@ -88,4 +88,20 @@ public class PropertyRepository { return dto; }, propertySetId); } + + + public void fillDraft(Integer setId) { + String query = """ + SELECT type.id AS typeId, property.property_value as value FROM country_property_type AS type + LEFT JOIN system_property AS property ON property.system_property_type_id = type.id + LEFT JOIN property_set AS propertySet ON propertySet.id = property.property_set_id WHERE propertySet.state = 'VALID'"""; + + + jdbcTemplate.query(query, (rs, rowNum) -> { + String insertQuery = "INSERT IGNORE INTO system_property (property_value, system_property_type_id, property_set_id) VALUES (?, ?, ?)"; + jdbcTemplate.update(insertQuery, rs.getString("value"), rs.getInt("country_id"), rs.getInt("typeId"), setId); + return null; + + }); + } } diff --git a/src/main/java/de/avatic/lcc/repositories/properties/PropertySetRepository.java b/src/main/java/de/avatic/lcc/repositories/properties/PropertySetRepository.java index 651a065..048e643 100644 --- a/src/main/java/de/avatic/lcc/repositories/properties/PropertySetRepository.java +++ b/src/main/java/de/avatic/lcc/repositories/properties/PropertySetRepository.java @@ -13,6 +13,10 @@ import java.sql.SQLException; import java.sql.Timestamp; import java.util.List; +/** + * Repository class for managing and querying property sets. + * Provides methods for fetching, updating, and creating property set records in the database. + */ @Repository public class PropertySetRepository { @@ -22,6 +26,11 @@ public class PropertySetRepository { this.jdbcTemplate = jdbcTemplate; } + /** + * Retrieves a list of all property sets from the database. + * + * @return A list of {@link PropertySet} objects containing property set information. + */ @Transactional public List listPropertySets() { String query = "SELECT id, start_date, end_date, state FROM property_set"; @@ -29,49 +38,83 @@ public class PropertySetRepository { return jdbcTemplate.query(query, new PropertySetMapper()); } + /** + * Retrieves the ID of the draft property set. + * If no draft property set exists, a new one is created. + * + * @return The ID of the draft {@link PropertySet}. + */ @Transactional public Integer getDraftSetId() { return getDraftSet().getId(); } + /** + * Retrieves the draft property set. If no draft exists, it creates a new one. + * + * @return The {@link PropertySet} object representing the draft state. + */ @Transactional public PropertySet getDraftSet() { createSet(); return jdbcTemplate.queryForObject("SELECT id, start_date, end_date, state FROM property_set WHERE state = ?", new PropertySetMapper(), PropertySetState.DRAFT.name()); } - @Transactional - public boolean hasDraftSet() { - Integer count = jdbcTemplate.queryForObject("SELECT COUNT(*) FROM property_set WHERE state = ?", Integer.class, PropertySetState.DRAFT.name()); - return !(count == null || count == 0); - } - - private void createSet() { jdbcTemplate.update("INSERT INTO property_set (state) SELECT ? WHERE NOT EXISTS (SELECT 1 FROM property_set WHERE state = ?)", PropertySetState.DRAFT.name(), PropertySetState.DRAFT.name()); } + /** + * Retrieves the currently valid property set. + * + * @return The {@link PropertySet} object in the valid state, or null if none exists. + */ public PropertySet getValidSet() { return jdbcTemplate.queryForObject("SELECT id, start_date, end_date, state FROM property_set WHERE state = ?", new PropertySetMapper(), PropertySetState.VALID.name()); } - @Transactional + + /** + * Applies the draft property set, marking it as valid and expiring the current valid set. + * Updates the timestamps for the draft and valid states accordingly. + */ public void applyDraft() { final Timestamp currentTimestamp = new Timestamp(System.currentTimeMillis()); - if(hasDraftSet()) - { - jdbcTemplate.update("UPDATE property_set SET state = ?, end_date = ? WHERE state = ? ", PropertySetState.EXPIRED.name(), currentTimestamp, PropertySetState.VALID.name()); - jdbcTemplate.update("UPDATE property_set SET state = ?, start_date = ? WHERE id = ? AND state = ? ", PropertySetState.VALID.name(), currentTimestamp, PropertySetState.DRAFT.name()); - //TODO: fill all missing values in draft set! - } + /* set current to expired */ + jdbcTemplate.update("UPDATE property_set SET state = ?, end_date = ? WHERE state = ? ", PropertySetState.EXPIRED.name(), currentTimestamp, PropertySetState.VALID.name()); + jdbcTemplate.update("UPDATE property_set SET state = ?, start_date = ? WHERE id = ? AND state = ? ", PropertySetState.VALID.name(), currentTimestamp, PropertySetState.DRAFT.name()); + } + /** + * Invalidates a specific property set by its ID if its current state is expired. + * + * @param id The ID of the property set to invalidate. + */ @Transactional public void invalidateById(Integer id) { jdbcTemplate.update("UPDATE property_set SET state = ? WHERE id = ? AND state = ? ", PropertySetState.INVALID.name(), id, PropertySetState.EXPIRED.name()); } + /** + * Checks if the current draft property set has any associated properties. + * + * @return {@code true} if properties exist for the draft set, {@code false} otherwise. + */ + @Transactional + public Boolean hasPropertiesDraft() { + var setId = getDraftSetId(); + String query = """ + SELECT (SELECT COUNT(*) FROM system_property WHERE property_set_id = ?) + (SELECT COUNT(*) FROM country_property WHERE property_set_id = ?) AS total_count"""; + + var totalCount = jdbcTemplate.queryForObject(query, Integer.class, setId, setId); + return totalCount != null && totalCount > 0; + } + + /** + * Mapper class for converting SQL query results into {@link PropertySet} objects. + */ private static class PropertySetMapper implements RowMapper { @Override diff --git a/src/main/java/de/avatic/lcc/repositories/users/UserNodeRepository.java b/src/main/java/de/avatic/lcc/repositories/users/UserNodeRepository.java new file mode 100644 index 0000000..0fc6827 --- /dev/null +++ b/src/main/java/de/avatic/lcc/repositories/users/UserNodeRepository.java @@ -0,0 +1,51 @@ +package de.avatic.lcc.repositories.users; + +import de.avatic.lcc.model.nodes.Node; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +import java.util.Collection; + +@Repository +public class UserNodeRepository { + + + private final JdbcTemplate jdbcTemplate; + + public UserNodeRepository(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + public Node getUserNode(String userId) { + + } + + public Collection searchNode(String filter, int limit, int userId, boolean excludeDeprecated) { + + StringBuilder queryBuilder = new StringBuilder().append("SELECT * FROM sys_user_node WHERE user_id = ? AND (name LIKE ? OR address LIKE ?)"); + + if (excludeDeprecated) { + queryBuilder.append(" AND is_deprecated = FALSE"); + } + + queryBuilder.append("LIMIT ?"); + + return jdbcTemplate.query(queryBuilder.toString(), (rs, rowNum) -> { + var node = new Node(); + + node.setId(rs.getInt("id")); + node.setName(rs.getString("name")); + node.setAddress(rs.getString("address")); + node.setGeoLat(rs.getBigDecimal("geo_lat")); + node.setGeoLng(rs.getBigDecimal("geo_lng")); + node.setDeprecated(rs.getBoolean("deprecated")); + node.setCountryId(rs.getInt("country_id")); + + return node; + }, userId, '%'+filter+'%','%'+filter+'%', limit ); + } + + public void add(Node node) { + // todo insert user node + } +} diff --git a/src/main/java/de/avatic/lcc/service/GeoApiService.java b/src/main/java/de/avatic/lcc/service/GeoApiService.java new file mode 100644 index 0000000..6d7c6ff --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/GeoApiService.java @@ -0,0 +1,15 @@ +package de.avatic.lcc.service; + +import de.avatic.lcc.dto.configuration.nodes.userNodes.LocateNodeDTO; +import org.springframework.stereotype.Service; + +@Service +public class GeoApiService { + + + public LocateNodeDTO locate(String address) { + //TODO implementation missing + return null; + } + +} diff --git a/src/main/java/de/avatic/lcc/service/configuration/CountryService.java b/src/main/java/de/avatic/lcc/service/configuration/CountryService.java index 532305e..95e1556 100644 --- a/src/main/java/de/avatic/lcc/service/configuration/CountryService.java +++ b/src/main/java/de/avatic/lcc/service/configuration/CountryService.java @@ -15,6 +15,10 @@ import org.springframework.transaction.annotation.Transactional; import java.util.Optional; +/** + * Service class for managing country-related data and operations. + * Provides methods for setting properties, listing countries, and retrieving country details. + */ @Service public class CountryService { @@ -30,6 +34,15 @@ public class CountryService { this.propertySetRepository = propertySetRepository; } + /** + * Sets a property value for a country identified by its ISO code. + * + * @param isoCode The ISO code identifying the country. + * @param mappingId The identifier for the property to be set. + * @param value The value of the property to be set. + *

+ * This is a transactional operation. + */ @Transactional public void setProperties(IsoCode isoCode, String mappingId, String value) { //todo validate property value! @@ -37,16 +50,44 @@ public class CountryService { countryPropertyRepository.setProperty(propertySetRepository.getDraftSetId(), country.orElseThrow().getId(), mappingId, value); } + /** + * Retrieves a paginated list of countries filtered by the specified criteria. + * + * @param filter The filter criteria for the countries. + * @param page The page number for pagination. + * @param limit The number of countries per page. + * @return A paginated result containing country DTOs that match the filter criteria. + *

+ * This is a transactional operation. + */ @Transactional public SearchQueryResult listCountries(String filter, int page, int limit) { return SearchQueryResult.map(countryRepository.listCountries(filter, true, new SearchQueryPagination(page, limit)), countryTransformer::toCountryDTO); } + /** + * Retrieves a complete list of countries filtered by the specified criteria. + * + * @param filter The filter criteria for the countries. + * @return A result containing country DTOs that match the filter criteria. + *

+ * This is a transactional operation. + */ @Transactional public SearchQueryResult listCountries(String filter) { return SearchQueryResult.map(countryRepository.listCountries(filter, true), countryTransformer::toCountryDTO); } + /** + * Retrieves detailed information about a specific country, including its properties. + * + * @param id The unique identifier of the country. + * @param propertySetId The property set ID for filtering associated properties. + * If set to 0, retrieves all properties for the country. + * @return An optional containing the detailed information of the country, or empty if not found. + *

+ * This is a transactional operation. + */ @Transactional public Optional getCountry(Integer id, Integer propertySetId) { var country = countryRepository.getById(id); @@ -60,14 +101,13 @@ public class CountryService { dto.setName(entity.getIsoCode().getFullName()); dto.setId(entity.getId()); - if(0 == propertySetId) { + if (0 == propertySetId) { dto.setProperties(countryPropertyRepository.listPropertiesByCountryId(entity.getId())); } else { dto.setProperties(countryPropertyRepository.listPropertiesByCountryIdAndPropertySetId(entity.getId(), propertySetId)); } - return Optional.of(dto); } diff --git a/src/main/java/de/avatic/lcc/service/configuration/MaterialService.java b/src/main/java/de/avatic/lcc/service/configuration/MaterialService.java index fa5b3ef..495f80d 100644 --- a/src/main/java/de/avatic/lcc/service/configuration/MaterialService.java +++ b/src/main/java/de/avatic/lcc/service/configuration/MaterialService.java @@ -1,7 +1,7 @@ package de.avatic.lcc.service.configuration; import de.avatic.lcc.dto.configuration.material.update.MaterialUpdateDTO; -import de.avatic.lcc.dto.configuration.material.view.MaterialViewDTO; +import de.avatic.lcc.dto.configuration.material.view.MaterialDetailDTO; import de.avatic.lcc.dto.generic.MaterialDTO; import de.avatic.lcc.model.materials.Material; import de.avatic.lcc.repositories.MaterialRepository; @@ -9,43 +9,90 @@ import de.avatic.lcc.repositories.pagination.SearchQueryPagination; import de.avatic.lcc.repositories.pagination.SearchQueryResult; import de.avatic.lcc.service.transformer.generic.MaterialTransformer; import de.avatic.lcc.service.transformer.material.MaterialUpdateDTOTransformer; -import de.avatic.lcc.service.transformer.material.MaterialViewDTOTransformer; +import de.avatic.lcc.service.transformer.material.MaterialDetailTransformer; import de.avatic.lcc.util.exception.clienterror.MaterialNotFoundException; import org.springframework.stereotype.Service; +/** + * Service class responsible for managing materials. Provides functionality to + * list, retrieve, and manipulate material data. Acts as a bridge between the + * repository and transformer layers. + */ @Service public class MaterialService { - private final MaterialUpdateDTOTransformer materialUpdateDTOTransformer; private final MaterialRepository materialRepository; private final MaterialTransformer materialTransformer; - private final MaterialViewDTOTransformer materialViewDTOTransformer; + private final MaterialDetailTransformer materialDetailTransformer; - public MaterialService(MaterialRepository materialRepository, MaterialUpdateDTOTransformer materialUpdateDTOTransformer, MaterialTransformer materialTransformer, MaterialViewDTOTransformer materialViewDTOTransformer) { + /** + * Constructor for MaterialService. + * + * @param materialRepository repository for accessing material data + * @param materialTransformer transformer to convert material entities to DTOs + * @param materialDetailTransformer transformer to convert material entities to detail DTOs + */ + public MaterialService(MaterialRepository materialRepository, MaterialTransformer materialTransformer, MaterialDetailTransformer materialDetailTransformer) { this.materialRepository = materialRepository; - this.materialUpdateDTOTransformer = materialUpdateDTOTransformer; this.materialTransformer = materialTransformer; - this.materialViewDTOTransformer = materialViewDTOTransformer; + this.materialDetailTransformer = materialDetailTransformer; } + /** + * Lists materials based on a filter and pagination parameters. + * + * @param filter the search filter to apply + * @param page the page number for pagination (zero-based) + * @param limit the maximum number of items per page + * @return a {@link SearchQueryResult} containing a list of material DTOs and pagination details + */ public SearchQueryResult listMaterial(String filter, int page, int limit) { SearchQueryResult queryResult = materialRepository.listMaterials(filter, true, new SearchQueryPagination(page, limit)); return SearchQueryResult.map(queryResult, materialTransformer::toMaterialDTO); } - public MaterialViewDTO getMaterial(Integer id) { - return materialViewDTOTransformer.toMaterialViewDTO(materialRepository.getById(id).orElseThrow(() -> new MaterialNotFoundException(id))); + /** + * Retrieves the details of a specific material by its ID. + * + * @param id the unique identifier of the material + * @return a {@link MaterialDetailDTO} representing the material details + * @throws MaterialNotFoundException if no material with the given ID is found + */ + public MaterialDetailDTO getMaterial(Integer id) { + return materialDetailTransformer.toMaterialDetailDTO(materialRepository.getById(id).orElseThrow(() -> new MaterialNotFoundException(id))); } - public Integer updateMaterial(Integer id, MaterialUpdateDTO dto) { + /** + * Updates an existing material with new data. + * + * @param id the ID of the material to update + * @param dto the data transfer object containing the updated material details + * @return the ID of the updated material + * @throws MaterialNotFoundException if no material with the given ID is found + */ +/* public Integer updateMaterial(Integer id, MaterialUpdateDTO dto) { return materialRepository.update(materialUpdateDTOTransformer.fromMaterialUpdateDTO(dto)).orElseThrow(() -> new MaterialNotFoundException(id)); - } + }*/ - public Integer createMaterial(MaterialUpdateDTO dto) { + /** + * Creates a new material based on the provided data. + * + * @param dto the data transfer object containing the new material details + * @return the ID of the newly created material + * @throws RuntimeException if the material could not be created + */ +/* public Integer createMaterial(MaterialUpdateDTO dto) { return materialRepository.create(materialUpdateDTOTransformer.fromMaterialUpdateDTO(dto)).orElseThrow(() -> new RuntimeException("Unable to create Material " + dto)); - } + }*/ - public Integer deleteMaterial(Integer id) { + /** + * Marks a material as deprecated by its ID. + * + * @param id the ID of the material to deprecate + * @return the ID of the deprecated material + * @throws MaterialNotFoundException if no material with the given ID is found + */ +/* public Integer deleteMaterial(Integer id) { return materialRepository.setDeprecatedById(id).orElseThrow(() -> new MaterialNotFoundException(id)); - } + }*/ } diff --git a/src/main/java/de/avatic/lcc/service/configuration/NodeService.java b/src/main/java/de/avatic/lcc/service/configuration/NodeService.java index 441d6f6..e723f6d 100644 --- a/src/main/java/de/avatic/lcc/service/configuration/NodeService.java +++ b/src/main/java/de/avatic/lcc/service/configuration/NodeService.java @@ -1,30 +1,40 @@ package de.avatic.lcc.service.configuration; +import de.avatic.lcc.dto.configuration.nodes.userNodes.AddUserNodeDTO; import de.avatic.lcc.dto.generic.NodeDTO; import de.avatic.lcc.dto.configuration.nodes.view.NodeDetailDTO; import de.avatic.lcc.dto.configuration.nodes.update.NodeUpdateDTO; +import de.avatic.lcc.dto.generic.NodeType; +import de.avatic.lcc.model.nodes.Node; import de.avatic.lcc.repositories.NodeRepository; import de.avatic.lcc.repositories.pagination.SearchQueryPagination; import de.avatic.lcc.repositories.pagination.SearchQueryResult; +import de.avatic.lcc.repositories.users.UserNodeRepository; import de.avatic.lcc.service.transformer.nodes.NodeUpdateDTOTransformer; -import de.avatic.lcc.service.transformer.nodes.NodeViewDTOTransformer; +import de.avatic.lcc.service.transformer.nodes.NodeDetailTransformer; import de.avatic.lcc.service.transformer.generic.NodeTransformer; import de.avatic.lcc.util.exception.clienterror.NodeNotFoundException; import org.springframework.stereotype.Service; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + @Service public class NodeService { private final NodeRepository nodeRepository; private final NodeTransformer nodeTransformer; - private final NodeViewDTOTransformer nodeViewDTOTransformer; + private final NodeDetailTransformer nodeDetailTransformer; private final NodeUpdateDTOTransformer nodeUpdateDTOTransformer; + private final UserNodeRepository userNodeRepository; - public NodeService(NodeRepository nodeRepository, NodeTransformer nodeTransformer, NodeViewDTOTransformer nodeViewDTOTransformer, NodeUpdateDTOTransformer nodeUpdateDTOTransformer) { + public NodeService(NodeRepository nodeRepository, NodeTransformer nodeTransformer, NodeDetailTransformer nodeDetailTransformer, NodeUpdateDTOTransformer nodeUpdateDTOTransformer, UserNodeRepository userNodeRepository) { this.nodeRepository = nodeRepository; this.nodeTransformer = nodeTransformer; - this.nodeViewDTOTransformer = nodeViewDTOTransformer; + this.nodeDetailTransformer = nodeDetailTransformer; this.nodeUpdateDTOTransformer = nodeUpdateDTOTransformer; + this.userNodeRepository = userNodeRepository; } public SearchQueryResult listNodes(String filter, int page, int limit) { @@ -32,11 +42,11 @@ public class NodeService { } public SearchQueryResult listNodesView(String filter, int page, int limit) { - return SearchQueryResult.map(nodeRepository.listNodes(filter, true, new SearchQueryPagination(page, limit)), nodeViewDTOTransformer::toNodeViewDTO); + return SearchQueryResult.map(nodeRepository.listNodes(filter, true, new SearchQueryPagination(page, limit)), nodeDetailTransformer::toNodeViewDTO); } public NodeDetailDTO getNode(Integer id) { - return nodeViewDTOTransformer.toNodeViewDTO(nodeRepository.getById(id).orElseThrow(() -> new NodeNotFoundException(id))); + return nodeDetailTransformer.toNodeViewDTO(nodeRepository.getById(id).orElseThrow(() -> new NodeNotFoundException(id))); } public Integer deleteNode(Integer id) { @@ -46,4 +56,41 @@ public class NodeService { public Integer updateNode(NodeUpdateDTO dto) { return nodeRepository.update(nodeUpdateDTOTransformer.fromNodeUpdateDTO(dto)).orElseThrow(() -> new NodeNotFoundException(dto.getId())); } + + public List searchNode(String filter, int limit, NodeType nodeType, boolean includeUserNode) { + List nodes = new ArrayList<>(); + int userId = 1; //TODO get current user's id + + if( includeUserNode && NodeType.SOURCE.equals(nodeType)) { + nodes.addAll(userNodeRepository.searchNode(filter, limit, userId, true).stream().map(nodeTransformer::toNodeDTO).toList()); + nodes.forEach(node -> node.setUserNode(true)); + limit -= nodes.size(); + } + + if(limit > 0) { + nodes.addAll(nodeRepository.searchNode(filter, limit, nodeType, true).stream().map(nodeTransformer::toNodeDTO).toList()); + } + + return nodes; + } + + public void addUserNode(AddUserNodeDTO dto) { + + Node node = new Node(); + + node.setName(dto.getName()); + node.setAddress(dto.getAddress()); + node.setGeoLng(BigDecimal.valueOf(dto.getLocation().getLongitude())); + node.setGeoLat(BigDecimal.valueOf(dto.getLocation().getLatitude())); + node.setSink(false); + node.setSource(true); + node.setIntermediate(false); + node.setDeprecated(false); + + //todo resolve country + node.setCountryId(0); + + + userNodeRepository.add(node); + } } diff --git a/src/main/java/de/avatic/lcc/service/configuration/PackagingService.java b/src/main/java/de/avatic/lcc/service/configuration/PackagingService.java deleted file mode 100644 index 477ba46..0000000 --- a/src/main/java/de/avatic/lcc/service/configuration/PackagingService.java +++ /dev/null @@ -1,132 +0,0 @@ -package de.avatic.lcc.service.configuration; - -import de.avatic.lcc.dto.configuration.packaging.update.PackagingUpdateDTO; -import de.avatic.lcc.dto.configuration.packaging.view.PackagingViewDTO; -import de.avatic.lcc.model.country.Country; -import de.avatic.lcc.model.materials.Material; -import de.avatic.lcc.model.nodes.Node; -import de.avatic.lcc.model.packaging.Packaging; -import de.avatic.lcc.model.packaging.PackagingDimension; -import de.avatic.lcc.model.properties.PackagingProperty; -import de.avatic.lcc.model.properties.PropertyType; -import de.avatic.lcc.repositories.country.CountryRepository; -import de.avatic.lcc.repositories.MaterialRepository; -import de.avatic.lcc.repositories.NodeRepository; -import de.avatic.lcc.repositories.packaging.PackagingDimensionRepository; -import de.avatic.lcc.repositories.packaging.PackagingRepository; -import de.avatic.lcc.repositories.pagination.SearchQueryPagination; -import de.avatic.lcc.repositories.pagination.SearchQueryResult; -import de.avatic.lcc.repositories.packaging.PackagingPropertiesRepository; -import de.avatic.lcc.service.transformer.packaging.PackagingTransformerService; -import de.avatic.lcc.service.transformer.generic.DimensionTransformer; -import de.avatic.lcc.service.transformer.generic.MaterialTransformer; -import de.avatic.lcc.service.transformer.generic.NodeTransformer; -import de.avatic.lcc.util.Check; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.Optional; - -@Service -public class PackagingService { - private final PackagingRepository packagingRepository; - private final PackagingDimensionRepository packagingDimensionRepository; - private final NodeRepository nodeRepository; - private final MaterialRepository materialRepository; - private final CountryRepository countryRepository; - private final PackagingTransformerService packagingTransformerService; - private final PackagingPropertiesRepository packagingPropertiesRepository; - private final MaterialTransformer materialTransformer; - private final NodeTransformer nodeTransformer; - private final DimensionTransformer dimensionTransformer; - - public PackagingService(PackagingRepository packagingRepository, PackagingDimensionRepository packagingDimensionRepository, NodeRepository nodeRepository, MaterialRepository materialRepository, CountryRepository countryRepository, PackagingTransformerService packagingTransformerService, PackagingPropertiesRepository packagingPropertiesRepository, MaterialTransformer materialTransformer, NodeTransformer nodeTransformer, DimensionTransformer dimensionTransformer) { - this.packagingRepository = packagingRepository; - this.packagingDimensionRepository = packagingDimensionRepository; - this.nodeRepository = nodeRepository; - this.materialRepository = materialRepository; - this.countryRepository = countryRepository; - this.packagingTransformerService = packagingTransformerService; - this.packagingPropertiesRepository = packagingPropertiesRepository; - this.materialTransformer = materialTransformer; - this.nodeTransformer = nodeTransformer; - this.dimensionTransformer = dimensionTransformer; - } - - @Transactional - public SearchQueryResult listPackaging(Integer materialId, Integer supplierId, int page, int limit) { - return SearchQueryResult.map(packagingRepository.listPackaging(materialId, supplierId, true, new SearchQueryPagination(page, limit)), this::toPackagingGetDTO); - } - - private PackagingViewDTO toPackagingGetDTO(Packaging packaging) { - PackagingViewDTO dtoEntry = new PackagingViewDTO(); - Optional node = nodeRepository.getById(packaging.getSupplierId()); - Optional material = materialRepository.getById(packaging.getMaterialId()); - dtoEntry.setHu(dimensionTransformer.toDimensionDTO(packagingDimensionRepository.getById(packaging.getHuId()).orElseThrow())); - dtoEntry.setShu(dimensionTransformer.toDimensionDTO(packagingDimensionRepository.getById(packaging.getShuId()).orElseThrow())); - dtoEntry.setSupplier(nodeTransformer.toNodeDTO(node.orElseThrow())); - dtoEntry.setMaterial(materialTransformer.toMaterialDTO(material.orElseThrow())); - return dtoEntry; - } - - @Transactional - public PackagingViewDTO getPackaging(Integer id) { - - Optional packaging = packagingRepository.getById(id); - Optional material = materialRepository.getById(packaging.orElseThrow().getMaterialId()); - Optional supplier = nodeRepository.getById(packaging.orElseThrow().getSupplierId()); - Optional country = countryRepository.getById(supplier.orElseThrow().getCountryId()); - Optional hu = packagingDimensionRepository.getById(packaging.orElseThrow().getHuId()); - Optional shu = packagingDimensionRepository.getById(packaging.orElseThrow().getShuId()); - List properties = packagingPropertiesRepository.getByPackagingId(id); - - - return packagingTransformerService.convertToPackagingGetDTO(packaging, material, supplier, country, hu, shu, properties).orElseThrow(); - } - - @Transactional - public void updatePackaging(Integer id, PackagingUpdateDTO dto) { - - Optional entity = packagingRepository.getById(id); - if (entity.isEmpty()) throw new RuntimeException("Packaging does not exists " + id); - - // check integrity - Check.equals(dto.getHu().getId(), entity.get().getHuId()); - Check.equals(dto.getHu().getId(), entity.get().getHuId()); - Check.equals(dto.getId(), id); - - packagingDimensionRepository.update(dimensionTransformer.toDimensionEntity(dto.getHu())); - packagingDimensionRepository.update(dimensionTransformer.toDimensionEntity(dto.getShu())); - - List types = packagingPropertiesRepository.listTypes(); - - - for(PropertyType type : types) { - var value = dto.getProperties().get(type.getExternalMappingId()); - if(value != null) { - packagingPropertiesRepository.update(id, type.getId(), value); - } - } - - packagingRepository.update(packagingTransformerService.convertFromPackagingPostDTO(dto)); - } - - public Integer deletePackaging(Integer id) { - return packagingRepository.setDeprecatedById(id).orElseThrow(() -> new RuntimeException("Packaging does not exists " + id)); - } - - @Transactional - public Integer createPackaging(PackagingUpdateDTO dto) { - - Optional huId = packagingDimensionRepository.insert(dimensionTransformer.toDimensionEntity(dto.getHu())); - Optional shuId = packagingDimensionRepository.insert(dimensionTransformer.toDimensionEntity(dto.getShu())); - - Packaging entity = packagingTransformerService.convertFromPackagingPostDTO(dto); - - entity.setHuId(huId.orElseThrow()); - entity.setShuId(shuId.orElseThrow()); - - return packagingRepository.insert(entity).orElseThrow(() -> new RuntimeException("Unable to create Packaging " + entity)); - } -} diff --git a/src/main/java/de/avatic/lcc/service/configuration/PropertiesService.java b/src/main/java/de/avatic/lcc/service/configuration/PropertiesService.java deleted file mode 100644 index a2f2ff5..0000000 --- a/src/main/java/de/avatic/lcc/service/configuration/PropertiesService.java +++ /dev/null @@ -1,52 +0,0 @@ -package de.avatic.lcc.service.configuration; - -import de.avatic.lcc.dto.configuration.properties.PropertySetDTO; -import de.avatic.lcc.dto.generic.PropertyDTO; -import de.avatic.lcc.model.properties.PropertySet; -import de.avatic.lcc.repositories.properties.PropertyRepository; -import de.avatic.lcc.repositories.properties.PropertySetRepository; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -@Service -public class PropertiesService { - - private final PropertyRepository propertyRepository; - private final PropertySetRepository propertySetRepository; - - - public PropertiesService(PropertyRepository propertyRepository, PropertySetRepository propertySetRepository) { - this.propertyRepository = propertyRepository; - this.propertySetRepository = propertySetRepository; - } - - @Transactional - public void setProperties(String mappingId, String value) { - - //todo validate if property value is set correctly! - - propertyRepository.setProperty(propertySetRepository.getDraftSetId(), mappingId, value); - } - - public List listProperties(Integer propertySetId) { - if(propertySetId == 0) - return propertyRepository.listProperties(); - - return propertyRepository.listPropertiesBySetId(propertySetId); - } - - public List listPropertySets() { - return propertySetRepository.listPropertySets().stream().map(propertySet -> { - PropertySetDTO dto = new PropertySetDTO(); - - dto.setId(propertySet.getId()); - dto.setEndDate(propertySet.getEndDate()); - dto.setStartDate(propertySet.getStartDate()); - dto.setState(propertySet.getState()); - - return dto; - }).toList(); - } -} diff --git a/src/main/java/de/avatic/lcc/service/configuration/PropertyService.java b/src/main/java/de/avatic/lcc/service/configuration/PropertyService.java new file mode 100644 index 0000000..cc1ed8e --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/configuration/PropertyService.java @@ -0,0 +1,85 @@ +package de.avatic.lcc.service.configuration; + +import de.avatic.lcc.dto.generic.ValidityPeriodDTO; +import de.avatic.lcc.dto.generic.PropertyDTO; +import de.avatic.lcc.repositories.properties.PropertyRepository; +import de.avatic.lcc.repositories.properties.PropertySetRepository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +public class PropertyService { + + private final PropertyRepository propertyRepository; + private final PropertySetRepository propertySetRepository; + + + /** + * Constructs the PropertyService with the provided repositories. + * + * @param propertyRepository the repository to manage properties + * @param propertySetRepository the repository to manage property sets + */ + public PropertyService(PropertyRepository propertyRepository, PropertySetRepository propertySetRepository) { + this.propertyRepository = propertyRepository; + this.propertySetRepository = propertySetRepository; + } + + /** + * Sets a property value for a given mapping ID. + * + * @param mappingId the identifier of the property to be updated + * @param value the new value to be set for the property + */ + @Transactional + public void setProperties(String mappingId, String value) { + + //todo validate if property value is set correctly! + + propertyRepository.setProperty(propertySetRepository.getDraftSetId(), mappingId, value); + } + + /** + * Retrieves a list of properties. If a specific property set ID is provided, only + * properties from that set are returned. Otherwise, all properties are returned. + * + * @param propertySetId the ID of the property set (0 for all properties) + * @return a list of properties as {@link PropertyDTO} + */ + public List listProperties(Integer propertySetId) { + if (propertySetId == 0) + return propertyRepository.listProperties(); + + return propertyRepository.listPropertiesBySetId(propertySetId); + } + + /** + * Retrieves a list of all property sets, mapping them to validity period data transfer objects. + * + * @return a list of property sets as {@link ValidityPeriodDTO} + */ + public List listPropertySets() { + return propertySetRepository.listPropertySets().stream().map(propertySet -> { + ValidityPeriodDTO dto = new ValidityPeriodDTO(); + + dto.setId(propertySet.getId()); + dto.setEndDate(propertySet.getEndDate()); + dto.setStartDate(propertySet.getStartDate()); + dto.setState(propertySet.getState()); + + return dto; + }).toList(); + } + + /** + * Invalidates a property set by its ID. + * + * @param id the ID of the property set to invalidate + */ + public void invalidate(Integer id) { + propertySetRepository.invalidateById(id); + + } +} diff --git a/src/main/java/de/avatic/lcc/service/configuration/PropertyStagedChangesService.java b/src/main/java/de/avatic/lcc/service/configuration/PropertyStagedChangesService.java new file mode 100644 index 0000000..64e1522 --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/configuration/PropertyStagedChangesService.java @@ -0,0 +1,56 @@ +package de.avatic.lcc.service.configuration; + +import de.avatic.lcc.repositories.country.CountryPropertyRepository; +import de.avatic.lcc.repositories.properties.PropertyRepository; +import de.avatic.lcc.repositories.properties.PropertySetRepository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * A service class responsible for managing staged changes to properties. + * It provides functionalities to check for property drafts and apply them + * when necessary. + */ +@Service +public class PropertyStagedChangesService { + private final PropertySetRepository propertySetRepository; + private final PropertyRepository propertyRepository; + private final CountryPropertyRepository countryPropertyRepository; + + + /** + * Constructs a new {@code PropertyStagedChangesService} with the required repositories. + * + * @param propertySetRepository the repository for managing property sets + * @param propertyRepository the repository for managing properties + * @param countryPropertyRepository the repository for managing country-specific properties + */ + public PropertyStagedChangesService(PropertySetRepository propertySetRepository, PropertyRepository propertyRepository, CountryPropertyRepository countryPropertyRepository) { + this.propertySetRepository = propertySetRepository; + this.propertyRepository = propertyRepository; + this.countryPropertyRepository = countryPropertyRepository; + } + + /** + * Checks if there are any staged (draft) properties that have not yet been applied. + * + * @return {@code true} if there are property drafts, {@code false} otherwise + */ + public Boolean hasPropertiesDraft() { + return propertySetRepository.hasPropertiesDraft(); + } + + /** + * Applies all staged (draft) properties if there are any present. + * This method is transactional to ensure that all changes are applied atomically. + */ + @Transactional + public void applyDraft() { + if(!propertySetRepository.hasPropertiesDraft()) return; + Integer setId = propertySetRepository.getDraftSetId(); + countryPropertyRepository.fillDraft(setId); + propertyRepository.fillDraft(setId); + propertySetRepository.applyDraft(); + } + +} diff --git a/src/main/java/de/avatic/lcc/service/configuration/StagedChangesService.java b/src/main/java/de/avatic/lcc/service/configuration/StagedChangesService.java deleted file mode 100644 index 280800b..0000000 --- a/src/main/java/de/avatic/lcc/service/configuration/StagedChangesService.java +++ /dev/null @@ -1,35 +0,0 @@ -package de.avatic.lcc.service.configuration; - -import de.avatic.lcc.repositories.properties.PropertyRepository; -import de.avatic.lcc.repositories.properties.PropertySetRepository; -import org.springframework.stereotype.Service; - -@Service -public class StagedChangesService { - private final PropertySetRepository propertySetRepository; - private final PropertyRepository propertyRepository; - - public StagedChangesService(PropertySetRepository propertySetRepository, PropertyRepository propertyRepository) { - this.propertySetRepository = propertySetRepository; - this.propertyRepository = propertyRepository; - } - - public Boolean hasRateDrafts() { - return false; - } - - public void approveRateDrafts() { - - } - - public Boolean hasPropertiesDraft() { - propertyRepository.listPropertiesBySetId(propertySetRepository.getDraftSetId()); - - - return null; - } - - public void approvePropertiesDrafts() { - - } -} diff --git a/src/main/java/de/avatic/lcc/service/transformer/generic/NodeTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/generic/NodeTransformer.java index c6ca766..19b7bd5 100644 --- a/src/main/java/de/avatic/lcc/service/transformer/generic/NodeTransformer.java +++ b/src/main/java/de/avatic/lcc/service/transformer/generic/NodeTransformer.java @@ -1,7 +1,7 @@ package de.avatic.lcc.service.transformer.generic; import de.avatic.lcc.dto.generic.NodeDTO; -import de.avatic.lcc.dto.generic.NodeTypeDTO; +import de.avatic.lcc.dto.generic.NodeType; import de.avatic.lcc.model.nodes.Node; import de.avatic.lcc.repositories.country.CountryRepository; import org.springframework.stereotype.Service; @@ -24,18 +24,19 @@ public class NodeTransformer { public NodeDTO toNodeDTO(Node entity) { NodeDTO dto = new NodeDTO(); - ArrayList types = new ArrayList<>(); - if (entity.getSink()) types.add(NodeTypeDTO.DESTINATION); - if (entity.getSource()) types.add(NodeTypeDTO.SOURCE); - if (entity.getIntermediate()) types.add(NodeTypeDTO.INTERMEDIATE); + ArrayList types = new ArrayList<>(); + if (entity.getSink()) types.add(NodeType.DESTINATION); + if (entity.getSource()) types.add(NodeType.SOURCE); + if (entity.getIntermediate()) types.add(NodeType.INTERMEDIATE); dto.setId(entity.getId()); dto.setName(entity.getName()); dto.setAddress(entity.getAddress()); - dto.setCountry(countryTransformerService.toCountryDTO(countryRepository.getById(entity.getCountryId())).orElseThrow()); + dto.setCountry(countryTransformerService.toCountryDTO(countryRepository.getById(entity.getCountryId()).orElseThrow())); dto.setTypes(types); dto.setDeprecated(entity.getDeprecated()); dto.setLocation(locationTransformer.toLocationDTO(entity)); + dto.setUserNode(false); return dto; } diff --git a/src/main/java/de/avatic/lcc/service/transformer/material/MaterialDetailPackagingPropertyTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/material/MaterialDetailPackagingPropertyTransformer.java new file mode 100644 index 0000000..3cd00df --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/transformer/material/MaterialDetailPackagingPropertyTransformer.java @@ -0,0 +1,36 @@ +package de.avatic.lcc.service.transformer.material; + + +import de.avatic.lcc.dto.generic.PropertyDTO; +import de.avatic.lcc.model.properties.PackagingProperty; +import org.springframework.stereotype.Service; + +/** + * Service that transforms {@link PackagingProperty} objects into {@link PropertyDTO} objects. + * This transformer handles the conversion of material packaging properties into a format + * that can be used in other application layers. + */ +@Service +public class MaterialDetailPackagingPropertyTransformer { + + /** + * Converts a {@link PackagingProperty} object to a {@link PropertyDTO}. + * This method maps the values and metadata of packaging properties for external consumption. + * + * @param property the {@link PackagingProperty} to transform + * @return the transformed {@link PropertyDTO} object with mapped values + */ + public PropertyDTO toPropertyDTO(PackagingProperty property) { + PropertyDTO dto = new PropertyDTO(); + + dto.setCurrentValue(property.getValue()); + dto.setDataType(property.getType().getDataType().name()); + dto.setRequired(property.getType().getRequired()); + dto.setName(property.getType().getName()); + dto.setExternalMappingId(property.getType().getExternalMappingId()); + dto.setValidationRule(property.getType().getValidationRule()); + + return dto; + } + +} diff --git a/src/main/java/de/avatic/lcc/service/transformer/material/MaterialDetailPackagingTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/material/MaterialDetailPackagingTransformer.java new file mode 100644 index 0000000..42c79a0 --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/transformer/material/MaterialDetailPackagingTransformer.java @@ -0,0 +1,78 @@ +package de.avatic.lcc.service.transformer.material; + +import de.avatic.lcc.dto.configuration.material.view.MaterialDetailPackagingDTO; +import de.avatic.lcc.model.nodes.Node; +import de.avatic.lcc.model.packaging.Packaging; +import de.avatic.lcc.model.packaging.PackagingDimension; +import de.avatic.lcc.model.properties.PackagingProperty; +import de.avatic.lcc.repositories.NodeRepository; +import de.avatic.lcc.repositories.packaging.PackagingDimensionRepository; +import de.avatic.lcc.repositories.packaging.PackagingPropertiesRepository; +import de.avatic.lcc.service.transformer.generic.DimensionTransformer; +import de.avatic.lcc.service.transformer.generic.NodeTransformer; +import org.springframework.data.mapping.model.Property; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +import static java.util.stream.Collectors.toList; + +/** + * Transformer service to convert {@link Packaging} entities into {@link MaterialDetailPackagingDTO} objects. + * This service includes logic for mapping associated supplier, dimensions, and properties. + */ +@Service +public class MaterialDetailPackagingTransformer { + + private final NodeRepository nodeRepository; + private final PackagingDimensionRepository packagingDimensionRepository; + private final DimensionTransformer dimensionTransformer; + private final NodeTransformer nodeTransformer; + private final PackagingPropertiesRepository packagingPropertiesRepository; + private final MaterialDetailPackagingPropertyTransformer materialDetailPackagingPropertyTransformer; + + /** + * Constructs a MaterialDetailPackagingTransformer with required dependencies. + * + * @param nodeRepository Repository for managing {@link Node} entities + * @param packagingDimensionRepository Repository for managing {@link PackagingDimension} entities + * @param dimensionTransformer Transformer for converting dimensions into DTOs + * @param nodeTransformer Transformer for converting nodes into DTOs + * @param packagingPropertiesRepository Repository for managing packaging properties + * @param materialDetailPackagingPropertyTransformer Transformer for converting packaging properties into DTOs + */ + public MaterialDetailPackagingTransformer(NodeRepository nodeRepository, PackagingDimensionRepository packagingDimensionRepository, DimensionTransformer dimensionTransformer, NodeTransformer nodeTransformer, PackagingPropertiesRepository packagingPropertiesRepository, MaterialDetailPackagingPropertyTransformer materialDetailPackagingPropertyTransformer) { + this.nodeRepository = nodeRepository; + this.packagingDimensionRepository = packagingDimensionRepository; + this.dimensionTransformer = dimensionTransformer; + this.nodeTransformer = nodeTransformer; + this.packagingPropertiesRepository = packagingPropertiesRepository; + this.materialDetailPackagingPropertyTransformer = materialDetailPackagingPropertyTransformer; + } + + /** + * Converts a {@link Packaging} entity into a {@link MaterialDetailPackagingDTO}. + * + * @param entity The {@link Packaging} entity to transform + * @return The transformed {@link MaterialDetailPackagingDTO} object + * @throws java.util.NoSuchElementException if any referenced related entity is not found + */ + public MaterialDetailPackagingDTO toMaterialViewPackagingDTO(Packaging entity) { + Optional supplier = nodeRepository.getById(entity.getSupplierId()); + Optional hu = packagingDimensionRepository.getById(entity.getHuId()); + Optional shu = packagingDimensionRepository.getById(entity.getShuId()); + List properties = packagingPropertiesRepository.getByPackagingId(entity.getId()); + + MaterialDetailPackagingDTO dto = new MaterialDetailPackagingDTO(); + dto.setId(entity.getId()); + dto.setDeprecated(entity.getDeprecated()); + dto.setHu(dimensionTransformer.toDimensionDTO(hu.orElseThrow())); + dto.setShu(dimensionTransformer.toDimensionDTO(shu.orElseThrow())); + dto.setSupplier(nodeTransformer.toNodeDTO(supplier.orElseThrow())); + dto.setProperties(properties.stream().map(materialDetailPackagingPropertyTransformer::toPropertyDTO).toList()); + + return dto; + } + +} diff --git a/src/main/java/de/avatic/lcc/service/transformer/material/MaterialDetailTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/material/MaterialDetailTransformer.java new file mode 100644 index 0000000..ef4a103 --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/transformer/material/MaterialDetailTransformer.java @@ -0,0 +1,47 @@ +package de.avatic.lcc.service.transformer.material; + +import de.avatic.lcc.dto.configuration.material.view.MaterialDetailDTO; +import de.avatic.lcc.dto.configuration.material.view.MaterialDetailPackagingDTO; +import de.avatic.lcc.model.materials.Material; +import de.avatic.lcc.repositories.packaging.PackagingRepository; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * Transforms {@link Material} entities into {@link MaterialDetailDTO} objects. + * This is used to map material entity data to a DTO for viewing material details. + */ +@Service +public class MaterialDetailTransformer { + + private final PackagingRepository packagingRepository; + private final MaterialDetailPackagingTransformer materialDetailPackagingTransformer; + + public MaterialDetailTransformer(PackagingRepository packagingRepository, MaterialDetailPackagingTransformer materialDetailPackagingTransformer) { + this.packagingRepository = packagingRepository; + this.materialDetailPackagingTransformer = materialDetailPackagingTransformer; + } + + /** + * Converts a {@link Material} entity into a {@link MaterialDetailDTO}. + * + * @param entity the material entity to convert + * @return a {@link MaterialDetailDTO} containing detailed information about the material + */ + public MaterialDetailDTO toMaterialDetailDTO(Material entity) { + MaterialDetailDTO dto = new MaterialDetailDTO(); + List packaging = packagingRepository.getByMaterialId(entity.getId()).stream().map(materialDetailPackagingTransformer::toMaterialViewPackagingDTO).toList(); + + dto.setId(entity.getId()); + dto.setPartNumber(entity.getPartNumber()); + dto.setName(entity.getName()); + dto.setHsCode(entity.getHsCode()); + dto.setHandlingUnits(packaging); + + return dto; + + + } + +} diff --git a/src/main/java/de/avatic/lcc/service/transformer/material/MaterialUpdateDTOTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/material/MaterialUpdateDTOTransformer.java index 9144124..e5658c9 100644 --- a/src/main/java/de/avatic/lcc/service/transformer/material/MaterialUpdateDTOTransformer.java +++ b/src/main/java/de/avatic/lcc/service/transformer/material/MaterialUpdateDTOTransformer.java @@ -4,6 +4,7 @@ import de.avatic.lcc.dto.configuration.material.update.MaterialUpdateDTO; import de.avatic.lcc.model.materials.Material; import org.springframework.stereotype.Service; +@Deprecated @Service public class MaterialUpdateDTOTransformer { diff --git a/src/main/java/de/avatic/lcc/service/transformer/material/MaterialViewDTOTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/material/MaterialViewDTOTransformer.java deleted file mode 100644 index 865ee78..0000000 --- a/src/main/java/de/avatic/lcc/service/transformer/material/MaterialViewDTOTransformer.java +++ /dev/null @@ -1,27 +0,0 @@ -package de.avatic.lcc.service.transformer.material; - -import de.avatic.lcc.dto.configuration.material.view.MaterialViewDTO; -import de.avatic.lcc.dto.configuration.material.view.MaterialViewPackagingDTO; -import de.avatic.lcc.model.materials.Material; -import de.avatic.lcc.repositories.packaging.PackagingRepository; -import org.springframework.stereotype.Service; - -import java.util.List; - -@Service -public class MaterialViewDTOTransformer { - - private final PackagingRepository packagingRepository; - private final MaterialViewPackagingDTOTransformer materialViewPackagingDTOTransformer; - - public MaterialViewDTOTransformer(PackagingRepository packagingRepository, MaterialViewPackagingDTOTransformer materialViewPackagingDTOTransformer) { - this.packagingRepository = packagingRepository; - this.materialViewPackagingDTOTransformer = materialViewPackagingDTOTransformer; - } - - public MaterialViewDTO toMaterialViewDTO(Material material) { - List packaging = packagingRepository.getByMaterialId(material.getId()).stream().map(materialViewPackagingDTOTransformer::toMaterialViewPackagingDTO).toList(); - - } - -} diff --git a/src/main/java/de/avatic/lcc/service/transformer/material/MaterialViewPackagingDTOTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/material/MaterialViewPackagingDTOTransformer.java deleted file mode 100644 index 3783d76..0000000 --- a/src/main/java/de/avatic/lcc/service/transformer/material/MaterialViewPackagingDTOTransformer.java +++ /dev/null @@ -1,45 +0,0 @@ -package de.avatic.lcc.service.transformer.material; - -import de.avatic.lcc.dto.configuration.material.view.MaterialViewPackagingDTO; -import de.avatic.lcc.model.nodes.Node; -import de.avatic.lcc.model.packaging.Packaging; -import de.avatic.lcc.model.packaging.PackagingDimension; -import de.avatic.lcc.repositories.NodeRepository; -import de.avatic.lcc.repositories.packaging.PackagingDimensionRepository; -import de.avatic.lcc.service.transformer.generic.DimensionTransformer; -import de.avatic.lcc.service.transformer.generic.NodeTransformer; -import org.springframework.stereotype.Service; - -import java.util.Optional; - -@Service -public class MaterialViewPackagingDTOTransformer { - - private final NodeRepository nodeRepository; - private final PackagingDimensionRepository packagingDimensionRepository; - private final DimensionTransformer dimensionTransformer; - private final NodeTransformer nodeTransformer; - - public MaterialViewPackagingDTOTransformer(NodeRepository nodeRepository, PackagingDimensionRepository packagingDimensionRepository, DimensionTransformer dimensionTransformer, NodeTransformer nodeTransformer) { - this.nodeRepository = nodeRepository; - this.packagingDimensionRepository = packagingDimensionRepository; - this.dimensionTransformer = dimensionTransformer; - this.nodeTransformer = nodeTransformer; - } - - public MaterialViewPackagingDTO toMaterialViewPackagingDTO(Packaging entity) { - Optional supplier = nodeRepository.getById(entity.getSupplierId()); - Optional hu = packagingDimensionRepository.getById(entity.getHuId()); - Optional shu = packagingDimensionRepository.getById(entity.getShuId()); - - MaterialViewPackagingDTO dto = new MaterialViewPackagingDTO(); - dto.setId(entity.getId()); - dto.setDeprecated(entity.getDeprecated()); - dto.setHu(dimensionTransformer.toDimensionDTO(hu.orElseThrow())); - dto.setShu(dimensionTransformer.toDimensionDTO(shu.orElseThrow())); - dto.setSupplier(nodeTransformer.toNodeDTO(supplier.orElseThrow())); - - return dto; - } - -} diff --git a/src/main/java/de/avatic/lcc/service/transformer/nodes/NodeViewDTOTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/nodes/NodeDetailTransformer.java similarity index 77% rename from src/main/java/de/avatic/lcc/service/transformer/nodes/NodeViewDTOTransformer.java rename to src/main/java/de/avatic/lcc/service/transformer/nodes/NodeDetailTransformer.java index 2e61df0..e1d5728 100644 --- a/src/main/java/de/avatic/lcc/service/transformer/nodes/NodeViewDTOTransformer.java +++ b/src/main/java/de/avatic/lcc/service/transformer/nodes/NodeDetailTransformer.java @@ -1,7 +1,7 @@ package de.avatic.lcc.service.transformer.nodes; import de.avatic.lcc.dto.generic.NodeDTO; -import de.avatic.lcc.dto.generic.NodeTypeDTO; +import de.avatic.lcc.dto.generic.NodeType; import de.avatic.lcc.dto.configuration.nodes.view.NodeDetailDTO; import de.avatic.lcc.model.nodes.Node; import de.avatic.lcc.repositories.country.CountryRepository; @@ -16,7 +16,7 @@ import java.util.HashMap; import java.util.Map; @Service -public class NodeViewDTOTransformer { +public class NodeDetailTransformer { private final CountryTransformer countryTransformer; private final CountryRepository countryRepository; @@ -24,7 +24,7 @@ public class NodeViewDTOTransformer { private final NodeTransformer nodeTransformer; private final NodeRepository nodeRepository; - public NodeViewDTOTransformer(CountryTransformer countryTransformer, CountryRepository countryRepository, LocationTransformer locationTransformer, NodeTransformer nodeTransformer, NodeRepository nodeRepository) { + public NodeDetailTransformer(CountryTransformer countryTransformer, CountryRepository countryRepository, LocationTransformer locationTransformer, NodeTransformer nodeTransformer, NodeRepository nodeRepository) { this.countryTransformer = countryTransformer; this.countryRepository = countryRepository; this.locationTransformer = locationTransformer; @@ -53,11 +53,11 @@ public class NodeViewDTOTransformer { return dto; } - private ArrayList toNodeTypeArrayList(Node entity) { - ArrayList types = new ArrayList<>(); - if (entity.getSink()) types.add(NodeTypeDTO.DESTINATION); - if (entity.getSource()) types.add(NodeTypeDTO.SOURCE); - if (entity.getIntermediate()) types.add(NodeTypeDTO.INTERMEDIATE); + private ArrayList toNodeTypeArrayList(Node entity) { + ArrayList types = new ArrayList<>(); + if (entity.getSink()) types.add(NodeType.DESTINATION); + if (entity.getSource()) types.add(NodeType.SOURCE); + if (entity.getIntermediate()) types.add(NodeType.INTERMEDIATE); return types; } diff --git a/src/main/java/de/avatic/lcc/service/transformer/nodes/NodeUpdateDTOTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/nodes/NodeUpdateDTOTransformer.java index fe50726..b5cfbac 100644 --- a/src/main/java/de/avatic/lcc/service/transformer/nodes/NodeUpdateDTOTransformer.java +++ b/src/main/java/de/avatic/lcc/service/transformer/nodes/NodeUpdateDTOTransformer.java @@ -13,7 +13,7 @@ public class NodeUpdateDTOTransformer { Node entity = new Node(); entity.setId(dto.getId()); - entity.setSink(dto.get); + //entity.setSink(dto.get); return entity; } diff --git a/src/main/java/de/avatic/lcc/service/transformer/packaging/PackagingTransformerService.java b/src/main/java/de/avatic/lcc/service/transformer/packaging/PackagingTransformerService.java deleted file mode 100644 index c3c621b..0000000 --- a/src/main/java/de/avatic/lcc/service/transformer/packaging/PackagingTransformerService.java +++ /dev/null @@ -1,69 +0,0 @@ -package de.avatic.lcc.service.transformer.packaging; - -import de.avatic.lcc.dto.configuration.packaging.view.PackagingViewDTO; -import de.avatic.lcc.dto.configuration.packaging.update.PackagingUpdateDTO; -import de.avatic.lcc.model.country.Country; -import de.avatic.lcc.model.materials.Material; -import de.avatic.lcc.model.nodes.Node; -import de.avatic.lcc.model.packaging.Packaging; -import de.avatic.lcc.model.packaging.PackagingDimension; -import de.avatic.lcc.model.properties.PackagingProperty; -import de.avatic.lcc.service.transformer.generic.DimensionTransformer; -import de.avatic.lcc.service.transformer.generic.MaterialTransformer; -import de.avatic.lcc.service.transformer.generic.NodeTransformer; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.Optional; - -@Service -public class PackagingTransformerService { - - //TODO refactor to new format - - private final MaterialTransformer materialTransformer; - private final DimensionTransformer dimensionTransformer; - private final NodeTransformer nodeTransformer; - private final PackagingViewPropertyDTOTransformer packagingViewPropertyDTOTransformer; - - public PackagingTransformerService(MaterialTransformer materialTransformer, DimensionTransformer dimensionTransformer, NodeTransformer nodeTransformer, PackagingViewPropertyDTOTransformer packagingViewPropertyDTOTransformer) { - this.materialTransformer = materialTransformer; - this.dimensionTransformer = dimensionTransformer; - this.nodeTransformer = nodeTransformer; - this.packagingViewPropertyDTOTransformer = packagingViewPropertyDTOTransformer; - } - - - public Optional convertToPackagingGetDTO(Optional packaging, Optional material, Optional supplier, Optional country, Optional hu, Optional shu, List properties) { - if(packaging.isEmpty()) return Optional.empty(); - - Packaging data = packaging.get(); - var dto = new PackagingViewDTO(); - - dto.setId(data.getId()); - dto.setMaterial(materialTransformer.toMaterialDTO(material.orElseThrow())); - dto.setSupplier(nodeTransformer.toNodeDTO(supplier.orElseThrow())); - dto.setHu(dimensionTransformer.toDimensionDTO(hu.orElseThrow())); - dto.setShu(dimensionTransformer.toDimensionDTO(shu.orElseThrow())); - dto.setDeprecated(data.getDeprecated()); - dto.setProperties(properties.stream().map(packagingViewPropertyDTOTransformer::toPackagingViewPropertyDTO).toList()); - - return Optional.of(dto); - } - - - - public Packaging convertFromPackagingPostDTO(PackagingUpdateDTO dto) { - - var entity = new Packaging(); - entity.setId(dto.getId()); - entity.setDeprecated(dto.getDeprecated()); - entity.setSupplierId(dto.getSupplierId()); - entity.setMaterialId(dto.getMaterialId()); - entity.setHuId(dto.getHu().getId()); - entity.setShuId(dto.getShu().getId()); - - return entity; - } - -} diff --git a/src/main/java/de/avatic/lcc/service/transformer/packaging/PackagingViewPropertyDTOTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/packaging/PackagingViewPropertyDTOTransformer.java deleted file mode 100644 index f354b26..0000000 --- a/src/main/java/de/avatic/lcc/service/transformer/packaging/PackagingViewPropertyDTOTransformer.java +++ /dev/null @@ -1,22 +0,0 @@ -package de.avatic.lcc.service.transformer.packaging; - -import de.avatic.lcc.dto.configuration.packaging.view.PackagingViewPropertyDTO; -import de.avatic.lcc.model.properties.PackagingProperty; -import org.springframework.stereotype.Service; - -@Service -public class PackagingViewPropertyDTOTransformer { - - public PackagingViewPropertyDTO toPackagingViewPropertyDTO(PackagingProperty property) { - PackagingViewPropertyDTO dto = new PackagingViewPropertyDTO(); - - dto.setCurrentValue(property.getValue()); - dto.setDataType(property.getType().getDataType().name()); - dto.setRequired(property.getType().getRequired()); - dto.setName(property.getType().getName()); - dto.setExternalMappingId(property.getType().getExternalMappingId()); - dto.setValidationRule(property.getType().getValidationRule()); - - return dto; - } -} diff --git a/src/main/java/de/avatic/lcc/service/transformer/users/UserTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/users/UserTransformer.java index f44eecd..14b56ab 100644 --- a/src/main/java/de/avatic/lcc/service/transformer/users/UserTransformer.java +++ b/src/main/java/de/avatic/lcc/service/transformer/users/UserTransformer.java @@ -22,7 +22,6 @@ public class UserTransformer { } - public User fromUserDTO(UserDTO dto) { User entity = new User(); diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index bda299d..6be5cef 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -35,7 +35,8 @@ CREATE TABLE IF NOT EXISTS `system_property` FOREIGN KEY (`property_set_id`) REFERENCES `property_set` (`id`), FOREIGN KEY (`system_property_type_id`) REFERENCES `system_property_type` (`id`), INDEX `idx_system_property_type_id` (system_property_type_id), - INDEX `idx_property_set_id` (id) + INDEX `idx_property_set_id` (id), + UNIQUE KEY `idx_country_property` (`system_property_type_id`, `property_set_id`) ) COMMENT 'Stores system-wide configuration properties'; -- country