diff --git a/LocationDTO.java b/LocationDTO.java new file mode 100644 index 0000000..e13247b --- /dev/null +++ b/LocationDTO.java @@ -0,0 +1,81 @@ +package de.avatic.lcc.dto.generic; + +import java.util.Objects; + +/** + * Represents a geographical location with latitude and longitude. + * This immutable DTO (Data Transfer Object) is used to transfer location data across system layers. + */ +public class LocationDTO { + + /** + * The latitude of the location. + * Positive values indicate north and negative values indicate south. + */ + private final double latitude; + + /** + * The longitude of the location. + * Positive values indicate east and negative values indicate west. + */ + private final double longitude; + + /** + * Constructs a new {@code LocationDTO} with the specified latitude and longitude. + * + * @param latitude the latitude of the location, where north is positive and south is negative + * @param longitude the longitude of the location, where east is positive and west is negative + */ + public LocationDTO(double latitude, double longitude) { + this.latitude = latitude; + this.longitude = longitude; + } + + /** + * Default constructor for creating a {@code LocationDTO} at origin (0,0). + * Required for frameworks that use default constructors. + */ + public LocationDTO() { + this(0.0, 0.0); + } + + /** + * Gets the latitude of the location. + * + * @return the latitude, where positive values indicate north and negative values indicate south + */ + public double getLatitude() { + return latitude; + } + + /** + * Gets the longitude of the location. + * + * @return the longitude, where positive values indicate east and negative values indicate west + */ + public double getLongitude() { + return longitude; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + LocationDTO that = (LocationDTO) o; + return Double.compare(that.latitude, latitude) == 0 && + Double.compare(that.longitude, longitude) == 0; + } + + @Override + public int hashCode() { + return Objects.hash(latitude, longitude); + } + + @Override + public String toString() { + return "LocationDTO{" + + "latitude=" + latitude + + ", longitude=" + longitude + + '}'; + } +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index b1c9d2f..8113385 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ org.springframework.boot - spring-boot-starter-data-jdbc + spring-boot-starter-jdbc org.springframework.boot @@ -80,6 +80,14 @@ spring-security-test test + + org.apache.poi + poi + + + org.apache.poi + poi-ooxml + diff --git a/src/main/java/de/avatic/lcc/LccConfig.java b/src/main/java/de/avatic/lcc/LccConfig.java new file mode 100644 index 0000000..5f4c41a --- /dev/null +++ b/src/main/java/de/avatic/lcc/LccConfig.java @@ -0,0 +1,10 @@ +package de.avatic.lcc; + +import org.springframework.context.annotation.Configuration; + +@Configuration +public class LccConfig { + + + +} diff --git a/src/main/java/de/avatic/lcc/config/ControllerConfig.java b/src/main/java/de/avatic/lcc/config/ControllerConfig.java new file mode 100644 index 0000000..593a0a0 --- /dev/null +++ b/src/main/java/de/avatic/lcc/config/ControllerConfig.java @@ -0,0 +1,17 @@ +package de.avatic.lcc.config; + +import org.springframework.beans.propertyeditors.StringTrimmerEditor; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.InitBinder; + + +@ControllerAdvice +public class ControllerConfig { + + @InitBinder + public void initBinder(final WebDataBinder binder) { + binder.registerCustomEditor(String.class, new StringTrimmerEditor(true)); + } + +} diff --git a/src/main/java/de/avatic/lcc/controller/GlobalExceptionHandler.java b/src/main/java/de/avatic/lcc/controller/GlobalExceptionHandler.java index 1dd8b50..22b8183 100644 --- a/src/main/java/de/avatic/lcc/controller/GlobalExceptionHandler.java +++ b/src/main/java/de/avatic/lcc/controller/GlobalExceptionHandler.java @@ -2,7 +2,7 @@ package de.avatic.lcc.controller; import de.avatic.lcc.dto.error.ErrorDTO; import de.avatic.lcc.dto.error.ErrorResponseDTO; -import de.avatic.lcc.util.InvalidArgumentException; +import de.avatic.lcc.util.exception.clienterror.InvalidArgumentException; import jakarta.validation.ConstraintViolationException; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -50,9 +50,17 @@ public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(ConstraintViolationException.class) - public String handleConstraintViolation(ConstraintViolationException exception) { // - // TODO you can choose to return your custom object here, which will then get transformed to json/xml etc. - return "Sorry, that was not quite right: " + exception.getMessage(); + public ResponseEntity handleConstraintViolation(ConstraintViolationException exception) { // + + ErrorDTO error = new ErrorDTO( + "BAD_REQUEST", + exception.getMessage(), + new HashMap<>() {{ + put("errorMessage", exception.getStackTrace()); + }} + ); + + return new ResponseEntity<>(new ErrorResponseDTO(error), HttpStatus.BAD_REQUEST); } @ExceptionHandler(Exception.class) diff --git a/src/main/java/de/avatic/lcc/controller/bulk/BulkOperationController.java b/src/main/java/de/avatic/lcc/controller/bulk/BulkOperationController.java new file mode 100644 index 0000000..265d52c --- /dev/null +++ b/src/main/java/de/avatic/lcc/controller/bulk/BulkOperationController.java @@ -0,0 +1,62 @@ +package de.avatic.lcc.controller.bulk; + + +import de.avatic.lcc.dto.bulk.BulkFileType; +import de.avatic.lcc.service.bulk.BulkExportService; +import de.avatic.lcc.service.bulk.BulkFileProcessingService; +import de.avatic.lcc.service.bulk.TemplateGenerationService; +import org.springframework.core.io.InputStreamResource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +@RestController +@RequestMapping("/api/bulk") +public class BulkOperationController { + + private final BulkFileProcessingService bulkProcessingService; + private final TemplateGenerationService templateGenerationService; + private final BulkExportService bulkExportService; + + public BulkOperationController(BulkFileProcessingService bulkProcessingService, TemplateGenerationService templateGenerationService, BulkExportService bulkExportService) { + this.bulkProcessingService = bulkProcessingService; + this.templateGenerationService = templateGenerationService; + this.bulkExportService = bulkExportService; + } + + @GetMapping("/status/{id}") + public ResponseEntity getUploadStatus(@PathVariable Integer id) { + return ResponseEntity.ok().build(); + } + + @PostMapping("/upload/{type}") + public ResponseEntity uploadFile(@PathVariable String type, @RequestParam("file") MultipartFile file) { + return ResponseEntity.ok().build(); + } + + @GetMapping("/templates/{type}") + public ResponseEntity generateTemplate(@PathVariable String type) { + HttpHeaders headers = new HttpHeaders(); + headers.add("Content-Disposition", "attachment; filename=lcc_template_"+type.toLowerCase()+".xlsx"); + + return ResponseEntity + .ok() + .headers(headers) + .contentType(MediaType.parseMediaType("application/vnd.ms-excel")) + .body(new InputStreamResource(templateGenerationService.generateTemplate(BulkFileType.valueOf(type.toUpperCase())))); + } + + @GetMapping("/download/{type}") + public ResponseEntity downloadFile(@PathVariable String type) { + HttpHeaders headers = new HttpHeaders(); + headers.add("Content-Disposition", "attachment; filename=lcc_export_"+type.toLowerCase()+".xlsx"); + + return ResponseEntity + .ok() + .headers(headers) + .contentType(MediaType.parseMediaType("application/vnd.ms-excel")) + .body(new InputStreamResource(bulkExportService.generateExport(BulkFileType.valueOf(type.toUpperCase())))); + } +} diff --git a/src/main/java/de/avatic/lcc/controller/calculation/PremiseController.java b/src/main/java/de/avatic/lcc/controller/calculation/PremiseController.java new file mode 100644 index 0000000..7a1828b --- /dev/null +++ b/src/main/java/de/avatic/lcc/controller/calculation/PremiseController.java @@ -0,0 +1,55 @@ +package de.avatic.lcc.controller.calculation; + + +import de.avatic.lcc.dto.calculation.PremiseDTO; +import de.avatic.lcc.dto.calculation.SearchDTO; +import de.avatic.lcc.dto.calculation.view.PremiseViewDTO; +import de.avatic.lcc.service.calculation.CalclationSearchStringAnalyzerService; +import de.avatic.lcc.service.calculation.CalculationCreationService; +import de.avatic.lcc.service.calculation.PremisesService; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/api/calculation") +public class PremiseController { + + private final CalclationSearchStringAnalyzerService calclationSearchStringAnalyzerService; + private final PremisesService premisesServices; + private final CalculationCreationService calculationCreationService; + + public PremiseController(CalclationSearchStringAnalyzerService calclationSearchStringAnalyzerService, PremisesService premisesServices, CalculationCreationService calculationCreationService) { + this.calclationSearchStringAnalyzerService = calclationSearchStringAnalyzerService; + this.premisesServices = premisesServices; + this.calculationCreationService = calculationCreationService; + } + + @GetMapping("/view") + public ResponseEntity> listPremises(@RequestParam String filter, @RequestParam(required = false) Integer page, @RequestParam(required = false) Integer limit, @RequestParam(name = "user", required = false) Integer userId, @RequestParam(required = false) Boolean deleted, @RequestParam(required = false) Boolean archived, @RequestParam(required = false) Boolean done) { + return ResponseEntity.ok(premisesServices.listCalculation(filter, page, limit, userId, deleted, archived, done)); + } + + @GetMapping("/search") + public ResponseEntity findMaterialsAndSuppliers(@RequestParam String search) { + return ResponseEntity.ok(calclationSearchStringAnalyzerService.findMaterialAndSuppliers(search)); + } + + @GetMapping("/create") + public ResponseEntity> createCalculation(@RequestParam("material") List materialIds, @RequestParam("supplier") List supplierIds, @RequestParam("user_supplier") List userSupplierIds, @RequestParam("from_scratch") boolean createEmpty ) { + return ResponseEntity.ok(calculationCreationService.createCalculations(materialIds, supplierIds, userSupplierIds, createEmpty)); + } + + @GetMapping("/edit") + public ResponseEntity> getPremises(@RequestParam("premiss_ids") List premissIds) { + return ResponseEntity.ok(premisesServices.getPremises(premissIds)); + } + + @PutMapping("/edit") + public ResponseEntity savePremises(@RequestBody List premises ) { + premisesServices.savePremises(premises); + return ResponseEntity.ok().build(); + } + +} diff --git a/src/main/java/de/avatic/lcc/controller/configuration/ContainerRateController.java b/src/main/java/de/avatic/lcc/controller/configuration/ContainerRateController.java new file mode 100644 index 0000000..6249cf6 --- /dev/null +++ b/src/main/java/de/avatic/lcc/controller/configuration/ContainerRateController.java @@ -0,0 +1,16 @@ +package de.avatic.lcc.controller.configuration; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/rates/container") +public class ContainerRateController { + + @GetMapping("/") + public ResponseEntity getRates() { + return "Container rates"; + } +} diff --git a/src/main/java/de/avatic/lcc/controller/CountryController.java b/src/main/java/de/avatic/lcc/controller/configuration/CountryController.java similarity index 54% rename from src/main/java/de/avatic/lcc/controller/CountryController.java rename to src/main/java/de/avatic/lcc/controller/configuration/CountryController.java index da2b0e7..4c61f4a 100644 --- a/src/main/java/de/avatic/lcc/controller/CountryController.java +++ b/src/main/java/de/avatic/lcc/controller/configuration/CountryController.java @@ -1,10 +1,10 @@ -package de.avatic.lcc.controller; +package de.avatic.lcc.controller.configuration; -import de.avatic.lcc.dto.countries.get.CountryGetDTO; -import de.avatic.lcc.dto.countries.get.CountryListGetDTO; -import de.avatic.lcc.dto.countries.post.CountryPostDTO; +import de.avatic.lcc.dto.configuration.countries.view.CountryViewDTO; +import de.avatic.lcc.dto.configuration.countries.update.CountryUpdateDTO; +import de.avatic.lcc.dto.generic.CountryDTO; import de.avatic.lcc.repositories.pagination.SearchQueryResult; -import de.avatic.lcc.service.CountryService; +import de.avatic.lcc.service.configuration.CountryService; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -21,11 +21,11 @@ public class CountryController { } @GetMapping("/") - public ResponseEntity> listCountries(@RequestParam(defaultValue = "20") int limit, - @RequestParam(defaultValue = "0") int page, - @RequestParam(required = false, defaultValue = "") String filter) { + public ResponseEntity> listCountries(@RequestParam(defaultValue = "20") int limit, + @RequestParam(defaultValue = "0") int page, + @RequestParam(required = false, defaultValue = "") String filter) { - SearchQueryResult countries = countryService.listMaterial(filter, page, limit); + SearchQueryResult countries = countryService.listCountries(filter, page, limit); return ResponseEntity.ok() .header("X-Total-Count", String.valueOf(countries.getTotalElements())) @@ -36,11 +36,12 @@ public class CountryController { } @GetMapping("/{id}") - public ResponseEntity getCountryDetails(@PathVariable Integer id) { + public ResponseEntity getCountryDetails(@PathVariable Integer id) { return ResponseEntity.ok(countryService.getCountry(id)); } - public ResponseEntity updateCountry(@PathVariable Integer id, @RequestBody CountryPostDTO country) { + @PostMapping("/{id}") + public ResponseEntity updateCountry(@PathVariable Integer id, @RequestBody CountryUpdateDTO country) { countryService.updateCountry(id, country); return ResponseEntity.noContent().build(); } diff --git a/src/main/java/de/avatic/lcc/controller/MaterialController.java b/src/main/java/de/avatic/lcc/controller/configuration/MaterialController.java similarity index 76% rename from src/main/java/de/avatic/lcc/controller/MaterialController.java rename to src/main/java/de/avatic/lcc/controller/configuration/MaterialController.java index 2166ccd..e879357 100644 --- a/src/main/java/de/avatic/lcc/controller/MaterialController.java +++ b/src/main/java/de/avatic/lcc/controller/configuration/MaterialController.java @@ -1,11 +1,11 @@ -package de.avatic.lcc.controller; +package de.avatic.lcc.controller.configuration; -import de.avatic.lcc.dto.material.get.MaterialGetDTO; -import de.avatic.lcc.dto.material.post.MaterialPostDTO; -import de.avatic.lcc.model.materials.Material; -import de.avatic.lcc.dto.material.get.MaterialListGetDTO; +import de.avatic.lcc.dto.configuration.material.view.MaterialViewDTO; +import de.avatic.lcc.dto.configuration.material.update.MaterialUpdateDTO; +import de.avatic.lcc.dto.generic.MaterialDTO; import de.avatic.lcc.repositories.pagination.SearchQueryResult; -import de.avatic.lcc.service.MaterialService; +import de.avatic.lcc.service.configuration.MaterialService; +import de.avatic.lcc.util.Check; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -34,12 +34,12 @@ public class MaterialController { * X-Total-Count (total elements), X-Page-Count (total pages), and X-Current-Page (current page). */ @GetMapping("/") - public ResponseEntity> listMaterials( + public ResponseEntity> listMaterials( @RequestParam(defaultValue = "20") int limit, @RequestParam(defaultValue = "0") int page, @RequestParam(required = false, defaultValue = "") String filter) { - SearchQueryResult materials = materialService.listMaterial(filter, page, limit); + SearchQueryResult materials = materialService.listMaterial(filter, page, limit); return ResponseEntity.ok() .header("X-Total-Count", String.valueOf(materials.getTotalElements())) @@ -56,7 +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)); } @@ -68,11 +68,11 @@ public class MaterialController { * @return The updated material */ @PutMapping("/{id}") - public ResponseEntity updateMaterial( + public ResponseEntity updateMaterial( @PathVariable Integer id, - @RequestBody MaterialPostDTO material) { - materialService.updateMaterial(id, material); - return ResponseEntity.noContent().build(); + @RequestBody MaterialUpdateDTO material) { + Check.equals(id, material.getId()); + return ResponseEntity.ok(materialService.updateMaterial(id, material)); } /** @@ -88,7 +88,7 @@ public class MaterialController { } @PostMapping("/") - public ResponseEntity createMaterial(@RequestBody MaterialPostDTO material) { + 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/MatrixRateController.java b/src/main/java/de/avatic/lcc/controller/configuration/MatrixRateController.java new file mode 100644 index 0000000..eba1ef0 --- /dev/null +++ b/src/main/java/de/avatic/lcc/controller/configuration/MatrixRateController.java @@ -0,0 +1,16 @@ +package de.avatic.lcc.controller.configuration; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/rates/matrix") +public class MatrixRateController { + + @GetMapping("/") + public String getRates() { + return "Matrix rates"; + } + +} diff --git a/src/main/java/de/avatic/lcc/controller/configuration/NodeController.java b/src/main/java/de/avatic/lcc/controller/configuration/NodeController.java new file mode 100644 index 0000000..eca4772 --- /dev/null +++ b/src/main/java/de/avatic/lcc/controller/configuration/NodeController.java @@ -0,0 +1,53 @@ +package de.avatic.lcc.controller.configuration; + +import de.avatic.lcc.dto.generic.NodeDTO; +import de.avatic.lcc.dto.configuration.nodes.view.NodeViewDTO; +import de.avatic.lcc.dto.configuration.nodes.update.NodeUpdateDTO; +import de.avatic.lcc.repositories.pagination.SearchQueryResult; +import de.avatic.lcc.service.configuration.NodeService; +import de.avatic.lcc.util.Check; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/api/nodes") +public class NodeController { + + + private final NodeService nodeService; + + public NodeController(NodeService nodeService) { + this.nodeService = nodeService; + } + + @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); + + return ResponseEntity.ok() + .header("X-Total-Count", String.valueOf(countries.getTotalElements())) + .header("X-Page-Count", String.valueOf(countries.getTotalPages())) + .header("X-Current-Page", String.valueOf(page)) + .body(countries.toList()); + } + + @GetMapping("/{id}") + public ResponseEntity getNode(@PathVariable Integer id) { + return ResponseEntity.ok(nodeService.getNode(id)); + } + + @DeleteMapping("/{id}") + public ResponseEntity deleteNode(@PathVariable Integer id) { + return ResponseEntity.ok(nodeService.deleteNode(id)); + } + + @PutMapping("/{id}") + public ResponseEntity updateNode(@PathVariable Integer id, @RequestBody NodeUpdateDTO node) { + Check.equals(id, node.getId()); + return ResponseEntity.ok(nodeService.updateNode(node)); + } +} diff --git a/src/main/java/de/avatic/lcc/controller/PackagingController.java b/src/main/java/de/avatic/lcc/controller/configuration/PackagingController.java similarity index 76% rename from src/main/java/de/avatic/lcc/controller/PackagingController.java rename to src/main/java/de/avatic/lcc/controller/configuration/PackagingController.java index 81b6a9d..9f859e7 100644 --- a/src/main/java/de/avatic/lcc/controller/PackagingController.java +++ b/src/main/java/de/avatic/lcc/controller/configuration/PackagingController.java @@ -1,10 +1,10 @@ -package de.avatic.lcc.controller; +package de.avatic.lcc.controller.configuration; -import de.avatic.lcc.dto.packaging.get.PackagingGetDTO; -import de.avatic.lcc.dto.packaging.post.PackagingPostDTO; +import de.avatic.lcc.dto.configuration.packaging.view.PackagingViewDTO; +import de.avatic.lcc.dto.configuration.packaging.update.PackagingUpdateDTO; import de.avatic.lcc.repositories.packaging.PackagingRepository; import de.avatic.lcc.repositories.pagination.SearchQueryResult; -import de.avatic.lcc.service.PackagingService; +import de.avatic.lcc.service.configuration.PackagingService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -25,13 +25,13 @@ public class PackagingController { } @GetMapping("/") - public ResponseEntity> listPackaging( + public ResponseEntity> listPackaging( @RequestParam(defaultValue = "20") int limit, @RequestParam(defaultValue = "0") int page, @RequestParam(required = false) Integer materialId, @RequestParam(required = false) Integer supplierId) { - SearchQueryResult listEntries = packagingService.listPackaging(materialId, supplierId, page, limit); + SearchQueryResult listEntries = packagingService.listPackaging(materialId, supplierId, page, limit); return ResponseEntity.ok() .header("X-Total-Count", String.valueOf(listEntries.getTotalElements())) @@ -43,13 +43,13 @@ public class PackagingController { } @GetMapping("/{id}") - public ResponseEntity getPackagingDetails(@PathVariable Integer id) { + public ResponseEntity getPackagingDetails(@PathVariable Integer id) { return ResponseEntity.ok(packagingService.getPackaging(id)); } @PutMapping("/{id}") - public ResponseEntity updatePackaging(@PathVariable Integer id, @RequestBody PackagingPostDTO packaging) { + public ResponseEntity updatePackaging(@PathVariable Integer id, @RequestBody PackagingUpdateDTO packaging) { packagingService.updatePackaging(id, packaging); return ResponseEntity.noContent().build(); } @@ -61,7 +61,7 @@ public class PackagingController { } @PostMapping("/") - public ResponseEntity addPackaging(@RequestBody PackagingPostDTO packaging) { + public ResponseEntity addPackaging(@RequestBody PackagingUpdateDTO packaging) { return ResponseEntity.ok(packagingService.createPackaging(packaging)); } diff --git a/src/main/java/de/avatic/lcc/controller/PropertiesController.java b/src/main/java/de/avatic/lcc/controller/configuration/PropertiesController.java similarity index 82% rename from src/main/java/de/avatic/lcc/controller/PropertiesController.java rename to src/main/java/de/avatic/lcc/controller/configuration/PropertiesController.java index 2b4392b..de15320 100644 --- a/src/main/java/de/avatic/lcc/controller/PropertiesController.java +++ b/src/main/java/de/avatic/lcc/controller/configuration/PropertiesController.java @@ -1,10 +1,9 @@ -package de.avatic.lcc.controller; +package de.avatic.lcc.controller.configuration; -import de.avatic.lcc.dto.properties.post.PropertiesPostDTO; -import de.avatic.lcc.service.PropertiesService; +import de.avatic.lcc.dto.configuration.properties.post.PropertiesPostDTO; +import de.avatic.lcc.service.configuration.PropertiesService; import org.springframework.web.bind.annotation.*; -import java.util.Collection; import java.util.List; @RestController diff --git a/src/main/java/de/avatic/lcc/controller/report/ReportingController.java b/src/main/java/de/avatic/lcc/controller/report/ReportingController.java new file mode 100644 index 0000000..da97127 --- /dev/null +++ b/src/main/java/de/avatic/lcc/controller/report/ReportingController.java @@ -0,0 +1,52 @@ +package de.avatic.lcc.controller.report; + +import de.avatic.lcc.dto.generic.NodeDTO; +import de.avatic.lcc.dto.report.ReportDTO; +import de.avatic.lcc.service.report.ExcelReportingService; +import de.avatic.lcc.service.report.ReportFinderService; +import de.avatic.lcc.service.report.ReportingService; +import org.springframework.core.io.InputStreamResource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/api/reports") +public class ReportingController { + + private final ReportingService reportingService; + private final ExcelReportingService excelReportingService; + private final ReportFinderService reportFinderService; + + public ReportingController(ReportingService reportingService, ExcelReportingService excelReportingService, ReportFinderService reportFinderService) { + this.reportingService = reportingService; + this.excelReportingService = excelReportingService; + this.reportFinderService = reportFinderService; + } + + @GetMapping("/search") + public ResponseEntity>> findSupplierForReporting(@RequestParam(value = "material") Integer materialId) { + return ResponseEntity.ok(reportFinderService.findSupplierForReporting(materialId)); + } + + @GetMapping("/view") + public ResponseEntity getReport(@RequestParam(value = "material") Integer materialId, @RequestParam(value = "sources") List nodeIds) { + return ResponseEntity.ok(reportingService.getReport(materialId, nodeIds)); + } + + @GetMapping("/download") + public ResponseEntity downloadReport(@RequestParam(value = "material") Integer materialId, @RequestParam(value = "sources") List nodeIds) { + + HttpHeaders headers = new HttpHeaders(); + headers.add("Content-Disposition", "attachment; filename=lcc_report.xlsx"); + + return ResponseEntity + .ok() + .headers(headers) + .contentType(MediaType.parseMediaType("application/vnd.ms-excel")) + .body(new InputStreamResource(excelReportingService.generateExcelReport(materialId, nodeIds))); + } +} diff --git a/src/main/java/de/avatic/lcc/controller/users/GroupController.java b/src/main/java/de/avatic/lcc/controller/users/GroupController.java new file mode 100644 index 0000000..256fa0c --- /dev/null +++ b/src/main/java/de/avatic/lcc/controller/users/GroupController.java @@ -0,0 +1,39 @@ +package de.avatic.lcc.controller.users; + +import de.avatic.lcc.dto.users.GroupDTO; +import de.avatic.lcc.repositories.pagination.SearchQueryResult; +import de.avatic.lcc.service.users.GroupService; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/api/groups") +public class GroupController { + + private final GroupService groupService; + + public GroupController(GroupService groupService) { + this.groupService = groupService; + } + + @GetMapping("/") + public ResponseEntity> listGroups(@RequestParam(defaultValue = "20") int limit, + @RequestParam(defaultValue = "0") int page) { + + SearchQueryResult groups = groupService.listGroups(page, limit); + + return ResponseEntity.ok() + .header("X-Total-Count", String.valueOf(groups.getTotalElements())) + .header("X-Page-Count", String.valueOf(groups.getTotalPages())) + .header("X-Current-Page", String.valueOf(page)) + .body(groups.toList()); + } + + @PutMapping("/") + public void updateGroup(GroupDTO group) { + return groupService.updateGroup(group); + } + +} diff --git a/src/main/java/de/avatic/lcc/controller/users/UserController.java b/src/main/java/de/avatic/lcc/controller/users/UserController.java new file mode 100644 index 0000000..dd0f321 --- /dev/null +++ b/src/main/java/de/avatic/lcc/controller/users/UserController.java @@ -0,0 +1,42 @@ +package de.avatic.lcc.controller.users; + + +import de.avatic.lcc.dto.generic.MaterialDTO; +import de.avatic.lcc.dto.users.UserDTO; +import de.avatic.lcc.repositories.pagination.SearchQueryResult; +import de.avatic.lcc.service.users.UserService; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/api/users") +public class UserController { + + + private final UserService userService; + + public UserController(UserService userService) { + this.userService = userService; + } + + @GetMapping("/") + public ResponseEntity> listUsers( + @RequestParam(defaultValue = "20") int limit, + @RequestParam(defaultValue = "0") int page) { + + SearchQueryResult users = userService.listUsers(page, limit); + + return ResponseEntity.ok() + .header("X-Total-Count", String.valueOf(users.getTotalElements())) + .header("X-Page-Count", String.valueOf(users.getTotalPages())) + .header("X-Current-Page", String.valueOf(page)) + .body(users.toList()); + } + + @PutMapping("/") + public void udateUser(UserDTO user) { + userService.updateUser(user); + } +} diff --git a/src/main/java/de/avatic/lcc/dto/bulk/BulkFileType.java b/src/main/java/de/avatic/lcc/dto/bulk/BulkFileType.java new file mode 100644 index 0000000..5ac102b --- /dev/null +++ b/src/main/java/de/avatic/lcc/dto/bulk/BulkFileType.java @@ -0,0 +1,5 @@ +package de.avatic.lcc.dto.bulk; + +public enum BulkFileType { + CONTAINER_RATE, COUNTRY_MATRIX, MATERIAL, PACKAGING, NODE +} diff --git a/src/main/java/de/avatic/lcc/dto/calculation/PremiseDTO.java b/src/main/java/de/avatic/lcc/dto/calculation/PremiseDTO.java new file mode 100644 index 0000000..8aac222 --- /dev/null +++ b/src/main/java/de/avatic/lcc/dto/calculation/PremiseDTO.java @@ -0,0 +1,4 @@ +package de.avatic.lcc.dto.calculation; + +public class PremiseDTO { +} diff --git a/src/main/java/de/avatic/lcc/dto/calculation/SearchDTO.java b/src/main/java/de/avatic/lcc/dto/calculation/SearchDTO.java new file mode 100644 index 0000000..d93d27c --- /dev/null +++ b/src/main/java/de/avatic/lcc/dto/calculation/SearchDTO.java @@ -0,0 +1,40 @@ +package de.avatic.lcc.dto.calculation; + +import de.avatic.lcc.dto.generic.MaterialDTO; +import de.avatic.lcc.dto.generic.NodeDTO; + +import java.util.List; + +public class SearchDTO { + + private List materials; + private List supplier; + + + public List getMaterials() { + return materials; + } + + public void setMaterials(List materials) { + this.materials = materials; + } + + public List getSupplier() { + return supplier; + } + + public void setSupplier(List supplier) { + this.supplier = supplier; + } + + public List getUser_supplier() { + return user_supplier; + } + + public void setUser_supplier(List user_supplier) { + this.user_supplier = user_supplier; + } + + private List user_supplier; + +} diff --git a/src/main/java/de/avatic/lcc/dto/calculation/view/PremiseViewDTO.java b/src/main/java/de/avatic/lcc/dto/calculation/view/PremiseViewDTO.java new file mode 100644 index 0000000..b6232b8 --- /dev/null +++ b/src/main/java/de/avatic/lcc/dto/calculation/view/PremiseViewDTO.java @@ -0,0 +1,4 @@ +package de.avatic.lcc.dto.calculation.view; + +public class PremiseViewDTO { +} diff --git a/src/main/java/de/avatic/lcc/dto/countries/post/CountryPostDTO.java b/src/main/java/de/avatic/lcc/dto/configuration/countries/update/CountryUpdateDTO.java similarity index 81% rename from src/main/java/de/avatic/lcc/dto/countries/post/CountryPostDTO.java rename to src/main/java/de/avatic/lcc/dto/configuration/countries/update/CountryUpdateDTO.java index 788b72e..3151ac0 100644 --- a/src/main/java/de/avatic/lcc/dto/countries/post/CountryPostDTO.java +++ b/src/main/java/de/avatic/lcc/dto/configuration/countries/update/CountryUpdateDTO.java @@ -1,8 +1,8 @@ -package de.avatic.lcc.dto.countries.post; +package de.avatic.lcc.dto.configuration.countries.update; import java.util.Map; -public class CountryPostDTO { +public class CountryUpdateDTO { String id; diff --git a/src/main/java/de/avatic/lcc/dto/countries/get/CountryGetDTO.java b/src/main/java/de/avatic/lcc/dto/configuration/countries/view/CountryViewDTO.java similarity index 75% rename from src/main/java/de/avatic/lcc/dto/countries/get/CountryGetDTO.java rename to src/main/java/de/avatic/lcc/dto/configuration/countries/view/CountryViewDTO.java index c3f6377..a9fe943 100644 --- a/src/main/java/de/avatic/lcc/dto/countries/get/CountryGetDTO.java +++ b/src/main/java/de/avatic/lcc/dto/configuration/countries/view/CountryViewDTO.java @@ -1,10 +1,10 @@ -package de.avatic.lcc.dto.countries.get; +package de.avatic.lcc.dto.configuration.countries.view; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.Collection; -public class CountryGetDTO { +public class CountryViewDTO { private Integer id; @@ -16,7 +16,7 @@ public class CountryGetDTO { @JsonProperty("region_code") private String regionCode; - private Collection properties; + private Collection properties; public Integer getId() { return id; @@ -50,11 +50,11 @@ public class CountryGetDTO { this.regionCode = regionCode; } - public Collection getProperties() { + public Collection getProperties() { return properties; } - public void setProperties(Collection properties) { + public void setProperties(Collection properties) { this.properties = properties; } } diff --git a/src/main/java/de/avatic/lcc/dto/countries/get/CountryPropertyGetDTO.java b/src/main/java/de/avatic/lcc/dto/configuration/countries/view/CountryViewPropertyDTO.java similarity index 94% rename from src/main/java/de/avatic/lcc/dto/countries/get/CountryPropertyGetDTO.java rename to src/main/java/de/avatic/lcc/dto/configuration/countries/view/CountryViewPropertyDTO.java index 0cdd866..fe57068 100644 --- a/src/main/java/de/avatic/lcc/dto/countries/get/CountryPropertyGetDTO.java +++ b/src/main/java/de/avatic/lcc/dto/configuration/countries/view/CountryViewPropertyDTO.java @@ -1,8 +1,8 @@ -package de.avatic.lcc.dto.countries.get; +package de.avatic.lcc.dto.configuration.countries.view; import com.fasterxml.jackson.annotation.JsonProperty; -public class CountryPropertyGetDTO { +public class CountryViewPropertyDTO { private String name; diff --git a/src/main/java/de/avatic/lcc/dto/material/get/MaterialListGetDTO.java b/src/main/java/de/avatic/lcc/dto/configuration/material/update/MaterialUpdateDTO.java similarity index 85% rename from src/main/java/de/avatic/lcc/dto/material/get/MaterialListGetDTO.java rename to src/main/java/de/avatic/lcc/dto/configuration/material/update/MaterialUpdateDTO.java index 430b55d..a67f1c1 100644 --- a/src/main/java/de/avatic/lcc/dto/material/get/MaterialListGetDTO.java +++ b/src/main/java/de/avatic/lcc/dto/configuration/material/update/MaterialUpdateDTO.java @@ -1,22 +1,20 @@ -package de.avatic.lcc.dto.material.get; - +package de.avatic.lcc.dto.configuration.material.update; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.Objects; -public class MaterialListGetDTO { - +public class MaterialUpdateDTO { private Integer id; @JsonProperty("part_number") private String partNumber; private String name; private String hsCode; - public MaterialListGetDTO() { + public MaterialUpdateDTO() { } - public MaterialListGetDTO(Integer id, String partNumber, String name, String hsCode) { + public MaterialUpdateDTO(Integer id, String partNumber, String name, String hsCode) { this.id = id; this.partNumber = partNumber; this.name = name; @@ -68,7 +66,7 @@ public class MaterialListGetDTO { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - MaterialListGetDTO that = (MaterialListGetDTO) o; + MaterialUpdateDTO that = (MaterialUpdateDTO) 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/material/get/MaterialGetDTO.java b/src/main/java/de/avatic/lcc/dto/configuration/material/view/MaterialViewDTO.java similarity index 81% rename from src/main/java/de/avatic/lcc/dto/material/get/MaterialGetDTO.java rename to src/main/java/de/avatic/lcc/dto/configuration/material/view/MaterialViewDTO.java index fac8c39..a377395 100644 --- a/src/main/java/de/avatic/lcc/dto/material/get/MaterialGetDTO.java +++ b/src/main/java/de/avatic/lcc/dto/configuration/material/view/MaterialViewDTO.java @@ -1,11 +1,11 @@ -package de.avatic.lcc.dto.material.get; +package de.avatic.lcc.dto.configuration.material.view; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; import java.util.Objects; -public class MaterialGetDTO { +public class MaterialViewDTO { private Integer id; @JsonProperty("part_number") @@ -18,12 +18,12 @@ public class MaterialGetDTO { @JsonProperty("packaging") - private List handlingUnits; + private List handlingUnits; - public MaterialGetDTO() { + public MaterialViewDTO() { } - public MaterialGetDTO(Integer id, String partNumber, String name, String hs_code, List handling_units) { + public MaterialViewDTO(Integer id, String partNumber, String name, String hs_code, List handling_units) { this.id = id; this.partNumber = partNumber; this.name = name; @@ -68,11 +68,11 @@ public class MaterialGetDTO { } @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 +91,7 @@ public class MaterialGetDTO { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - MaterialGetDTO that = (MaterialGetDTO) o; + MaterialViewDTO that = (MaterialViewDTO) 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/material/get/MaterialPackagingGetDTO.java b/src/main/java/de/avatic/lcc/dto/configuration/material/view/MaterialViewPackagingDTO.java similarity index 57% rename from src/main/java/de/avatic/lcc/dto/material/get/MaterialPackagingGetDTO.java rename to src/main/java/de/avatic/lcc/dto/configuration/material/view/MaterialViewPackagingDTO.java index 34a7224..2150b2b 100644 --- a/src/main/java/de/avatic/lcc/dto/material/get/MaterialPackagingGetDTO.java +++ b/src/main/java/de/avatic/lcc/dto/configuration/material/view/MaterialViewPackagingDTO.java @@ -1,21 +1,23 @@ -package de.avatic.lcc.dto.material.get; +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; -public class MaterialPackagingGetDTO { +public class MaterialViewPackagingDTO { private Integer id; @JsonProperty("is_deprecated") private Boolean isDeprecated; - private MaterialSupplierGetDTO supplier; + private NodeDTO supplier; @JsonProperty("handling_unit") - private MaterialDimensionGetDTO hu; + private DimensionDTO hu; @JsonProperty("small_handling_unit") - private MaterialDimensionGetDTO shu; + private DimensionDTO shu; public Integer getId() { return id; @@ -33,27 +35,27 @@ public class MaterialPackagingGetDTO { isDeprecated = deprecated; } - public MaterialSupplierGetDTO getSupplier() { + public NodeDTO getSupplier() { return supplier; } - public void setSupplier(MaterialSupplierGetDTO supplier) { + public void setSupplier(NodeDTO supplier) { this.supplier = supplier; } - public MaterialDimensionGetDTO getHu() { + public DimensionDTO getHu() { return hu; } - public void setHu(MaterialDimensionGetDTO hu) { + public void setHu(DimensionDTO hu) { this.hu = hu; } - public MaterialDimensionGetDTO getShu() { + public DimensionDTO getShu() { return shu; } - public void setShu(MaterialDimensionGetDTO shu) { + public void setShu(DimensionDTO shu) { this.shu = shu; } } \ No newline at end of file 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 new file mode 100644 index 0000000..19ee3ff --- /dev/null +++ b/src/main/java/de/avatic/lcc/dto/configuration/nodes/update/NodeUpdateDTO.java @@ -0,0 +1,29 @@ +package de.avatic.lcc.dto.configuration.nodes.update; + +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 java.util.List; +import java.util.Map; + +public class NodeUpdateDTO { + + private Integer id; + private String name; + private CountryDTO country; + private String address; + private List types; + private LocationDTO location; + @JsonProperty("is_deprecated") + private Boolean isDeprecated; + private Map predecessors; + @JsonProperty("outbound_countries") + private List outboundCountries; + + public Integer getId() { + return null; + } +} diff --git a/src/main/java/de/avatic/lcc/dto/configuration/nodes/view/NodeViewDTO.java b/src/main/java/de/avatic/lcc/dto/configuration/nodes/view/NodeViewDTO.java new file mode 100644 index 0000000..63c998e --- /dev/null +++ b/src/main/java/de/avatic/lcc/dto/configuration/nodes/view/NodeViewDTO.java @@ -0,0 +1,98 @@ +package de.avatic.lcc.dto.configuration.nodes.view; + +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 java.util.List; +import java.util.Map; + +public class NodeViewDTO { + + private Integer id; + private String name; + private CountryDTO country; + private String address; + private List types; + private LocationDTO location; + @JsonProperty("is_deprecated") + private Boolean isDeprecated; + private Map predecessors; + @JsonProperty("outbound_countries") + private List outboundCountries; + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public CountryDTO getCountry() { + return country; + } + + public void setCountry(CountryDTO country) { + this.country = country; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public List getTypes() { + return types; + } + + public void setTypes(List types) { + this.types = types; + } + + public LocationDTO getLocation() { + return location; + } + + public void setLocation(LocationDTO location) { + this.location = location; + } + + public Boolean getDeprecated() { + return isDeprecated; + } + + public void setDeprecated(Boolean deprecated) { + isDeprecated = deprecated; + } + + public Map getPredecessors() { + return predecessors; + } + + public void setPredecessors(Map predecessors) { + this.predecessors = predecessors; + } + + public List getOutboundCountries() { + return outboundCountries; + } + + public void setOutboundCountries(List outboundCountries) { + this.outboundCountries = outboundCountries; + } +} diff --git a/src/main/java/de/avatic/lcc/dto/packaging/post/PackagingPostDTO.java b/src/main/java/de/avatic/lcc/dto/configuration/packaging/update/PackagingUpdateDTO.java similarity index 77% rename from src/main/java/de/avatic/lcc/dto/packaging/post/PackagingPostDTO.java rename to src/main/java/de/avatic/lcc/dto/configuration/packaging/update/PackagingUpdateDTO.java index 5e1af3e..ee4b558 100644 --- a/src/main/java/de/avatic/lcc/dto/packaging/post/PackagingPostDTO.java +++ b/src/main/java/de/avatic/lcc/dto/configuration/packaging/update/PackagingUpdateDTO.java @@ -1,12 +1,12 @@ -package de.avatic.lcc.dto.packaging.post; +package de.avatic.lcc.dto.configuration.packaging.update; import com.fasterxml.jackson.annotation.JsonProperty; +import de.avatic.lcc.dto.generic.DimensionDTO; -import java.util.List; import java.util.Map; -public class PackagingPostDTO { +public class PackagingUpdateDTO { private Integer id; @@ -18,10 +18,10 @@ public class PackagingPostDTO { private Integer materialId; @JsonProperty("handling_unit") - private PackagingDimensionPostDTO hu; + private DimensionDTO hu; @JsonProperty("small_handling_unit") - private PackagingDimensionPostDTO shu; + private DimensionDTO shu; @JsonProperty("properties") private Map properties; @@ -58,19 +58,19 @@ public class PackagingPostDTO { this.materialId = materialId; } - public PackagingDimensionPostDTO getHu() { + public DimensionDTO getHu() { return hu; } - public void setHu(PackagingDimensionPostDTO hu) { + public void setHu(DimensionDTO hu) { this.hu = hu; } - public PackagingDimensionPostDTO getShu() { + public DimensionDTO getShu() { return shu; } - public void setShu(PackagingDimensionPostDTO shu) { + public void setShu(DimensionDTO shu) { this.shu = shu; } diff --git a/src/main/java/de/avatic/lcc/dto/packaging/get/PackagingGetDTO.java b/src/main/java/de/avatic/lcc/dto/configuration/packaging/view/PackagingViewDTO.java similarity index 50% rename from src/main/java/de/avatic/lcc/dto/packaging/get/PackagingGetDTO.java rename to src/main/java/de/avatic/lcc/dto/configuration/packaging/view/PackagingViewDTO.java index f30d34c..0095f05 100644 --- a/src/main/java/de/avatic/lcc/dto/packaging/get/PackagingGetDTO.java +++ b/src/main/java/de/avatic/lcc/dto/configuration/packaging/view/PackagingViewDTO.java @@ -1,28 +1,31 @@ -package de.avatic.lcc.dto.packaging.get; +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 PackagingGetDTO { +public class PackagingViewDTO { private Integer id; @JsonProperty("is_deprecated") private Boolean isDeprecated; - private PackagingSupplierGetDTO supplier; + private NodeDTO supplier; - private PackagingMaterialGetDTO material; + private MaterialDTO material; @JsonProperty("handling_unit") - private PackagingDimensionGetDTO hu; + private DimensionDTO hu; @JsonProperty("small_handling_unit") - private PackagingDimensionGetDTO shu; + private DimensionDTO shu; - private List properties; + private List properties; public Integer getId() { return id; @@ -40,43 +43,43 @@ public class PackagingGetDTO { isDeprecated = deprecated; } - public PackagingSupplierGetDTO getSupplier() { + public NodeDTO getSupplier() { return supplier; } - public void setSupplier(PackagingSupplierGetDTO supplier) { + public void setSupplier(NodeDTO supplier) { this.supplier = supplier; } - public PackagingMaterialGetDTO getMaterial() { + public MaterialDTO getMaterial() { return material; } - public void setMaterial(PackagingMaterialGetDTO material) { + public void setMaterial(MaterialDTO material) { this.material = material; } - public PackagingDimensionGetDTO getHu() { + public DimensionDTO getHu() { return hu; } - public void setHu(PackagingDimensionGetDTO hu) { + public void setHu(DimensionDTO hu) { this.hu = hu; } - public PackagingDimensionGetDTO getShu() { + public DimensionDTO getShu() { return shu; } - public void setShu(PackagingDimensionGetDTO shu) { + public void setShu(DimensionDTO shu) { this.shu = shu; } - public List getProperties() { + public List getProperties() { return properties; } - public void setProperties(List properties) { + public void setProperties(List properties) { this.properties = properties; } } diff --git a/src/main/java/de/avatic/lcc/dto/packaging/get/PackagingPropertyGetDTO.java b/src/main/java/de/avatic/lcc/dto/configuration/packaging/view/PackagingViewPropertyDTO.java similarity index 93% rename from src/main/java/de/avatic/lcc/dto/packaging/get/PackagingPropertyGetDTO.java rename to src/main/java/de/avatic/lcc/dto/configuration/packaging/view/PackagingViewPropertyDTO.java index 36d0757..219a0b6 100644 --- a/src/main/java/de/avatic/lcc/dto/packaging/get/PackagingPropertyGetDTO.java +++ b/src/main/java/de/avatic/lcc/dto/configuration/packaging/view/PackagingViewPropertyDTO.java @@ -1,8 +1,8 @@ -package de.avatic.lcc.dto.packaging.get; +package de.avatic.lcc.dto.configuration.packaging.view; import com.fasterxml.jackson.annotation.JsonProperty; -public class PackagingPropertyGetDTO { +public class PackagingViewPropertyDTO { private String name; diff --git a/src/main/java/de/avatic/lcc/dto/properties/post/PropertiesPostDTO.java b/src/main/java/de/avatic/lcc/dto/configuration/properties/post/PropertiesPostDTO.java similarity index 59% rename from src/main/java/de/avatic/lcc/dto/properties/post/PropertiesPostDTO.java rename to src/main/java/de/avatic/lcc/dto/configuration/properties/post/PropertiesPostDTO.java index 8cb67c7..28c7e04 100644 --- a/src/main/java/de/avatic/lcc/dto/properties/post/PropertiesPostDTO.java +++ b/src/main/java/de/avatic/lcc/dto/configuration/properties/post/PropertiesPostDTO.java @@ -1,4 +1,4 @@ -package de.avatic.lcc.dto.properties.post; +package de.avatic.lcc.dto.configuration.properties.post; public class PropertiesPostDTO { diff --git a/src/main/java/de/avatic/lcc/dto/countries/get/CountryListGetDTO.java b/src/main/java/de/avatic/lcc/dto/countries/get/CountryListGetDTO.java deleted file mode 100644 index fa7dd24..0000000 --- a/src/main/java/de/avatic/lcc/dto/countries/get/CountryListGetDTO.java +++ /dev/null @@ -1,56 +0,0 @@ -package de.avatic.lcc.dto.countries.get; - -import com.fasterxml.jackson.annotation.JsonProperty; - -public class CountryListGetDTO { - - private Integer id; - - private String name; - - @JsonProperty("iso_code") - private String isoCode; - - @JsonProperty("region_code") - private String regionCode; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getIsoCode() { - return isoCode; - } - - public void setIsoCode(String isoCode) { - this.isoCode = isoCode; - } - - public String getRegionCode() { - return regionCode; - } - - public void setRegionCode(String regionCode) { - this.regionCode = regionCode; - } - - @Override - public String toString() { - return "CountryListGetDTO{" + - "id=" + id + - ", isoCode='" + isoCode + '\'' + - '}'; - } -} diff --git a/src/main/java/de/avatic/lcc/dto/packaging/get/PackagingCountryGetDTO.java b/src/main/java/de/avatic/lcc/dto/generic/CountryDTO.java similarity index 75% rename from src/main/java/de/avatic/lcc/dto/packaging/get/PackagingCountryGetDTO.java rename to src/main/java/de/avatic/lcc/dto/generic/CountryDTO.java index a866aa8..6c6ad66 100644 --- a/src/main/java/de/avatic/lcc/dto/packaging/get/PackagingCountryGetDTO.java +++ b/src/main/java/de/avatic/lcc/dto/generic/CountryDTO.java @@ -1,8 +1,8 @@ -package de.avatic.lcc.dto.packaging.get; +package de.avatic.lcc.dto.generic; import com.fasterxml.jackson.annotation.JsonProperty; -public class PackagingCountryGetDTO { +public class CountryDTO { @JsonProperty("id") private Integer id; @@ -13,6 +13,7 @@ public class PackagingCountryGetDTO { @JsonProperty("region_code") private String regionCode; + private String name; public Integer getId() { return id; @@ -38,4 +39,11 @@ public class PackagingCountryGetDTO { this.regionCode = regionCode; } + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } } diff --git a/src/main/java/de/avatic/lcc/dto/material/get/MaterialDimensionGetDTO.java b/src/main/java/de/avatic/lcc/dto/generic/DimensionDTO.java similarity index 96% rename from src/main/java/de/avatic/lcc/dto/material/get/MaterialDimensionGetDTO.java rename to src/main/java/de/avatic/lcc/dto/generic/DimensionDTO.java index 3f3af4e..38af0d8 100644 --- a/src/main/java/de/avatic/lcc/dto/material/get/MaterialDimensionGetDTO.java +++ b/src/main/java/de/avatic/lcc/dto/generic/DimensionDTO.java @@ -1,11 +1,11 @@ -package de.avatic.lcc.dto.material.get; +package de.avatic.lcc.dto.generic; import com.fasterxml.jackson.annotation.JsonProperty; import de.avatic.lcc.model.packaging.PackagingType; import de.avatic.lcc.model.utils.DimensionUnit; import de.avatic.lcc.model.utils.WeightUnit; -public class MaterialDimensionGetDTO { +public class DimensionDTO { private Integer id; diff --git a/src/main/java/de/avatic/lcc/dto/generic/LocationDTO.java b/src/main/java/de/avatic/lcc/dto/generic/LocationDTO.java new file mode 100644 index 0000000..02771de --- /dev/null +++ b/src/main/java/de/avatic/lcc/dto/generic/LocationDTO.java @@ -0,0 +1,81 @@ +package de.avatic.lcc.dto.generic; + +import java.util.Objects; + +/** + * Represents a geographical location with latitude and longitude. + * This immutable DTO (Data Transfer Object) is used to transfer location data across system layers. + */ +public class LocationDTO { + + /** + * The latitude of the location. + * Positive values indicate north and negative values indicate south. + */ + private final double latitude; + + /** + * The longitude of the location. + * Positive values indicate east and negative values indicate west. + */ + private final double longitude; + + /** + * Constructs a new {@code LocationDTO} with the specified latitude and longitude. + * + * @param latitude the latitude of the location, where north is positive and south is negative + * @param longitude the longitude of the location, where east is positive and west is negative + */ + public LocationDTO(double latitude, double longitude) { + this.latitude = latitude; + this.longitude = longitude; + } + + /** + * Default constructor for creating a {@code LocationDTO} at origin (0,0). + * Required for frameworks that use default constructors. + */ + public LocationDTO() { + this(0.0, 0.0); + } + + /** + * Gets the latitude of the location. + * + * @return the latitude, where positive values indicate north and negative values indicate south + */ + public double getLatitude() { + return latitude; + } + + /** + * Gets the longitude of the location. + * + * @return the longitude, where positive values indicate east and negative values indicate west + */ + public double getLongitude() { + return longitude; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + LocationDTO that = (LocationDTO) o; + return Double.compare(that.latitude, latitude) == 0 && + Double.compare(that.longitude, longitude) == 0; + } + + @Override + public int hashCode() { + return Objects.hash(latitude, longitude); + } + + @Override + public String toString() { + return "LocationDTO{" + + "latitude=" + latitude + + ", longitude=" + longitude + + '}'; + } +} diff --git a/src/main/java/de/avatic/lcc/dto/material/post/MaterialPostDTO.java b/src/main/java/de/avatic/lcc/dto/generic/MaterialDTO.java similarity index 86% rename from src/main/java/de/avatic/lcc/dto/material/post/MaterialPostDTO.java rename to src/main/java/de/avatic/lcc/dto/generic/MaterialDTO.java index a4a50df..6ac5776 100644 --- a/src/main/java/de/avatic/lcc/dto/material/post/MaterialPostDTO.java +++ b/src/main/java/de/avatic/lcc/dto/generic/MaterialDTO.java @@ -1,20 +1,22 @@ -package de.avatic.lcc.dto.material.post; +package de.avatic.lcc.dto.generic; + import com.fasterxml.jackson.annotation.JsonProperty; import java.util.Objects; -public class MaterialPostDTO { +public class MaterialDTO { + private Integer id; @JsonProperty("part_number") private String partNumber; private String name; private String hsCode; - public MaterialPostDTO() { + public MaterialDTO() { } - public MaterialPostDTO(Integer id, String partNumber, String name, String hsCode) { + public MaterialDTO(Integer id, String partNumber, String name, String hsCode) { this.id = id; this.partNumber = partNumber; this.name = name; @@ -66,7 +68,7 @@ public class MaterialPostDTO { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - MaterialPostDTO that = (MaterialPostDTO) o; + MaterialDTO that = (MaterialDTO) 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/material/get/MaterialSupplierGetDTO.java b/src/main/java/de/avatic/lcc/dto/generic/NodeDTO.java similarity index 73% rename from src/main/java/de/avatic/lcc/dto/material/get/MaterialSupplierGetDTO.java rename to src/main/java/de/avatic/lcc/dto/generic/NodeDTO.java index 15bc3af..f8866f3 100644 --- a/src/main/java/de/avatic/lcc/dto/material/get/MaterialSupplierGetDTO.java +++ b/src/main/java/de/avatic/lcc/dto/generic/NodeDTO.java @@ -1,18 +1,17 @@ -package de.avatic.lcc.dto.material.get; +package de.avatic.lcc.dto.generic; import com.fasterxml.jackson.annotation.JsonProperty; -import de.avatic.lcc.dto.generic.NodeTypeDTO; -import de.avatic.lcc.dto.packaging.get.PackagingCountryGetDTO; import java.util.List; -public class MaterialSupplierGetDTO { +public class NodeDTO { private Integer id; private String name; - private MaterialCountryGetDTO country; + private CountryDTO country; private String address; private List types; + private LocationDTO location; @JsonProperty("is_deprecated") private Boolean isDeprecated; @@ -33,11 +32,11 @@ public class MaterialSupplierGetDTO { this.name = name; } - public MaterialCountryGetDTO getCountry() { + public CountryDTO getCountry() { return country; } - public void setCountry(MaterialCountryGetDTO country) { + public void setCountry(CountryDTO country) { this.country = country; } @@ -64,4 +63,12 @@ public class MaterialSupplierGetDTO { public void setDeprecated(Boolean deprecated) { isDeprecated = deprecated; } + + public LocationDTO getLocation() { + return location; + } + + public void setLocation(LocationDTO location) { + this.location = location; + } } diff --git a/src/main/java/de/avatic/lcc/dto/material/get/MaterialCountryGetDTO.java b/src/main/java/de/avatic/lcc/dto/material/get/MaterialCountryGetDTO.java deleted file mode 100644 index 2f9bfbc..0000000 --- a/src/main/java/de/avatic/lcc/dto/material/get/MaterialCountryGetDTO.java +++ /dev/null @@ -1,40 +0,0 @@ -package de.avatic.lcc.dto.material.get; - -import com.fasterxml.jackson.annotation.JsonProperty; - -public class MaterialCountryGetDTO { - - @JsonProperty("id") - private Integer id; - - @JsonProperty("iso_code") - private String isoCode; - - @JsonProperty("region_code") - private String regionCode; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public String getIsoCode() { - return isoCode; - } - - public void setIsoCode(String isoCode) { - this.isoCode = isoCode; - } - - public String getRegionCode() { - return regionCode; - } - - public void setRegionCode(String regionCode) { - this.regionCode = regionCode; - } - -} diff --git a/src/main/java/de/avatic/lcc/dto/nodes/NodeDTO.java b/src/main/java/de/avatic/lcc/dto/nodes/NodeDTO.java deleted file mode 100644 index 5698546..0000000 --- a/src/main/java/de/avatic/lcc/dto/nodes/NodeDTO.java +++ /dev/null @@ -1,7 +0,0 @@ -package de.avatic.lcc.dto.nodes; - -public class NodeDTO { - - // TODO - -} diff --git a/src/main/java/de/avatic/lcc/dto/packaging/get/PackagingDimensionGetDTO.java b/src/main/java/de/avatic/lcc/dto/packaging/get/PackagingDimensionGetDTO.java deleted file mode 100644 index 6a2bd25..0000000 --- a/src/main/java/de/avatic/lcc/dto/packaging/get/PackagingDimensionGetDTO.java +++ /dev/null @@ -1,113 +0,0 @@ -package de.avatic.lcc.dto.packaging.get; - -import com.fasterxml.jackson.annotation.JsonProperty; -import de.avatic.lcc.model.packaging.PackagingType; -import de.avatic.lcc.model.utils.DimensionUnit; -import de.avatic.lcc.model.utils.WeightUnit; - -public class PackagingDimensionGetDTO { - - private Integer id; - - private PackagingType type; - - private Double length; - - private Double width; - - private Double height; - - @JsonProperty("dimension_unit") - private DimensionUnit dimensionUnit; - - private Double weight; - - @JsonProperty("weight_unit") - private WeightUnit weightUnit; - - @JsonProperty("content_unit_count") - private Integer contentUnitCount; - - @JsonProperty("is_deprecated") - private Boolean isDeprecated; - - public PackagingType getType() { - return type; - } - - public void setType(PackagingType type) { - this.type = type; - } - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Double getLength() { - return length; - } - - public void setLength(Double length) { - this.length = length; - } - - public Double getWidth() { - return width; - } - - public void setWidth(Double width) { - this.width = width; - } - - public Double getHeight() { - return height; - } - - public void setHeight(Double height) { - this.height = height; - } - - public DimensionUnit getDimensionUnit() { - return dimensionUnit; - } - - public void setDimensionUnit(DimensionUnit dimensionUnit) { - this.dimensionUnit = dimensionUnit; - } - - public Double getWeight() { - return weight; - } - - public void setWeight(Double weight) { - this.weight = weight; - } - - public WeightUnit getWeightUnit() { - return weightUnit; - } - - public void setWeightUnit(WeightUnit weightUnit) { - this.weightUnit = weightUnit; - } - - public Integer getContentUnitCount() { - return contentUnitCount; - } - - public void setContentUnitCount(Integer contentUnitCount) { - this.contentUnitCount = contentUnitCount; - } - - public Boolean getDeprecated() { - return isDeprecated; - } - - public void setDeprecated(Boolean deprecated) { - isDeprecated = deprecated; - } -} diff --git a/src/main/java/de/avatic/lcc/dto/packaging/get/PackagingMaterialGetDTO.java b/src/main/java/de/avatic/lcc/dto/packaging/get/PackagingMaterialGetDTO.java deleted file mode 100644 index eef3847..0000000 --- a/src/main/java/de/avatic/lcc/dto/packaging/get/PackagingMaterialGetDTO.java +++ /dev/null @@ -1,44 +0,0 @@ -package de.avatic.lcc.dto.packaging.get; - -import com.fasterxml.jackson.annotation.JsonProperty; - -public class PackagingMaterialGetDTO { - - private Integer id; - @JsonProperty("part_number") - private String partNumber; - private String name; - private String hsCode; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public String getPartNumber() { - return partNumber; - } - - public void setPartNumber(String partNumber) { - this.partNumber = partNumber; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getHsCode() { - return hsCode; - } - - public void setHsCode(String hsCode) { - this.hsCode = hsCode; - } -} diff --git a/src/main/java/de/avatic/lcc/dto/packaging/get/PackagingSupplierGetDTO.java b/src/main/java/de/avatic/lcc/dto/packaging/get/PackagingSupplierGetDTO.java deleted file mode 100644 index afbc35b..0000000 --- a/src/main/java/de/avatic/lcc/dto/packaging/get/PackagingSupplierGetDTO.java +++ /dev/null @@ -1,62 +0,0 @@ -package de.avatic.lcc.dto.packaging.get; - -import com.fasterxml.jackson.annotation.JsonProperty; -import de.avatic.lcc.dto.generic.NodeTypeDTO; - -import java.util.List; - -public class PackagingSupplierGetDTO { - - private Integer id; - private String name; - private PackagingCountryGetDTO country; - private String address; - private List types; - - @JsonProperty("is_deprecated") - private Boolean isDeprecated; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public PackagingCountryGetDTO getCountry() { - return country; - } - - public void setCountry(PackagingCountryGetDTO country) { - this.country = country; - } - - public String getAddress() { - return address; - } - - public void setAddress(String address) { - this.address = address; - } - - public List getTypes() { - return types; - } - - public void setTypes(List types) { - this.types = types; - } - - public void setDeprecated(Boolean isDeprecated) { - this.isDeprecated = isDeprecated; - } -} diff --git a/src/main/java/de/avatic/lcc/dto/packaging/post/PackagingDimensionPostDTO.java b/src/main/java/de/avatic/lcc/dto/packaging/post/PackagingDimensionPostDTO.java deleted file mode 100644 index 64e7db3..0000000 --- a/src/main/java/de/avatic/lcc/dto/packaging/post/PackagingDimensionPostDTO.java +++ /dev/null @@ -1,113 +0,0 @@ -package de.avatic.lcc.dto.packaging.post; - -import com.fasterxml.jackson.annotation.JsonProperty; -import de.avatic.lcc.model.packaging.PackagingType; -import de.avatic.lcc.model.utils.DimensionUnit; -import de.avatic.lcc.model.utils.WeightUnit; - -public class PackagingDimensionPostDTO { - - private Integer id; - - private PackagingType type; - - private Double length; - - private Double width; - - private Double height; - - @JsonProperty("dimension_unit") - private DimensionUnit dimensionUnit; - - private Double weight; - - @JsonProperty("weight_unit") - private WeightUnit weightUnit; - - @JsonProperty("content_unit_count") - private Integer contentUnitCount; - - @JsonProperty("is_deprecated") - private Boolean isDeprecated; - - public PackagingType getType() { - return type; - } - - public void setType(PackagingType type) { - this.type = type; - } - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Double getLength() { - return length; - } - - public void setLength(Double length) { - this.length = length; - } - - public Double getWidth() { - return width; - } - - public void setWidth(Double width) { - this.width = width; - } - - public Double getHeight() { - return height; - } - - public void setHeight(Double height) { - this.height = height; - } - - public DimensionUnit getDimensionUnit() { - return dimensionUnit; - } - - public void setDimensionUnit(DimensionUnit dimensionUnit) { - this.dimensionUnit = dimensionUnit; - } - - public Double getWeight() { - return weight; - } - - public void setWeight(Double weight) { - this.weight = weight; - } - - public WeightUnit getWeightUnit() { - return weightUnit; - } - - public void setWeightUnit(WeightUnit weightUnit) { - this.weightUnit = weightUnit; - } - - public Integer getContentUnitCount() { - return contentUnitCount; - } - - public void setContentUnitCount(Integer contentUnitCount) { - this.contentUnitCount = contentUnitCount; - } - - public Boolean getDeprecated() { - return isDeprecated; - } - - public void setDeprecated(Boolean deprecated) { - isDeprecated = deprecated; - } -} diff --git a/src/main/java/de/avatic/lcc/dto/report/ReportDTO.java b/src/main/java/de/avatic/lcc/dto/report/ReportDTO.java new file mode 100644 index 0000000..e1086f4 --- /dev/null +++ b/src/main/java/de/avatic/lcc/dto/report/ReportDTO.java @@ -0,0 +1,4 @@ +package de.avatic.lcc.dto.report; + +public class ReportDTO { +} diff --git a/src/main/java/de/avatic/lcc/dto/users/GroupDTO.java b/src/main/java/de/avatic/lcc/dto/users/GroupDTO.java new file mode 100644 index 0000000..39fec00 --- /dev/null +++ b/src/main/java/de/avatic/lcc/dto/users/GroupDTO.java @@ -0,0 +1,29 @@ +package de.avatic.lcc.dto.users; + + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class GroupDTO { + + @JsonProperty("group_name") + private String name; + + @JsonProperty("group_description") + private String description; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/src/main/java/de/avatic/lcc/dto/users/UserDTO.java b/src/main/java/de/avatic/lcc/dto/users/UserDTO.java new file mode 100644 index 0000000..c645b9d --- /dev/null +++ b/src/main/java/de/avatic/lcc/dto/users/UserDTO.java @@ -0,0 +1,75 @@ +package de.avatic.lcc.dto.users; + + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; + +public class UserDTO { + + @JsonProperty("firstname") + private String firstName; + + @JsonProperty("lastname") + private String lastName; + + @JsonProperty("mail") + private String email; + + @JsonProperty("workday_id") + private String workdayId; + + @JsonProperty("is_active") + private boolean isActive; + + @JsonProperty("groups") + private List groups; + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getWorkdayId() { + return workdayId; + } + + public void setWorkdayId(String workdayId) { + this.workdayId = workdayId; + } + + public boolean isActive() { + return isActive; + } + + public void setActive(boolean active) { + isActive = active; + } + + public List getGroups() { + return groups; + } + + public void setGroups(List groups) { + this.groups = groups; + } +} diff --git a/src/main/java/de/avatic/lcc/model/materials/MaterialPackaging.java b/src/main/java/de/avatic/lcc/model/materials/MaterialPackaging.java index 23d66a4..64856f8 100644 --- a/src/main/java/de/avatic/lcc/model/materials/MaterialPackaging.java +++ b/src/main/java/de/avatic/lcc/model/materials/MaterialPackaging.java @@ -1,7 +1,7 @@ package de.avatic.lcc.model.materials; import com.fasterxml.jackson.annotation.JsonProperty; -import de.avatic.lcc.dto.packaging.get.PackagingDimensionGetDTO; +import de.avatic.lcc.dto.generic.DimensionDTO; public class MaterialPackaging { @@ -10,7 +10,7 @@ public class MaterialPackaging { private MaterialSupplier supplier; @JsonProperty("handling_unit") - private PackagingDimensionGetDTO hu; + private DimensionDTO hu; public Integer getId() { @@ -29,11 +29,11 @@ public class MaterialPackaging { this.supplier = supplier; } - public PackagingDimensionGetDTO getHu() { + public DimensionDTO getHu() { return hu; } - public void setHu(PackagingDimensionGetDTO hu) { + public void setHu(DimensionDTO hu) { this.hu = hu; } } diff --git a/src/main/java/de/avatic/lcc/model/nodes/Node.java b/src/main/java/de/avatic/lcc/model/nodes/Node.java index 8e827f4..8a9d534 100644 --- a/src/main/java/de/avatic/lcc/model/nodes/Node.java +++ b/src/main/java/de/avatic/lcc/model/nodes/Node.java @@ -6,6 +6,7 @@ import java.math.BigDecimal; import java.time.OffsetDateTime; import java.util.Collection; import java.util.List; +import java.util.Map; public class Node { @@ -48,7 +49,7 @@ public class Node { private Integer countryId; - private List nodePredecessors; + private Map nodePredecessors; private Collection outboundCountries; @@ -156,11 +157,11 @@ public class Node { this.countryId = countryId; } - public List getNodePredecessors() { + public Map getNodePredecessors() { return nodePredecessors; } - public void setNodePredecessors(List nodePredecessors) { + public void setNodePredecessors(Map nodePredecessors) { this.nodePredecessors = nodePredecessors; } diff --git a/src/main/java/de/avatic/lcc/model/nodes/NodeListEntry.java b/src/main/java/de/avatic/lcc/model/nodes/NodeListEntry.java index 735f3f1..18b6e3e 100644 --- a/src/main/java/de/avatic/lcc/model/nodes/NodeListEntry.java +++ b/src/main/java/de/avatic/lcc/model/nodes/NodeListEntry.java @@ -1,18 +1,17 @@ package de.avatic.lcc.model.nodes; -import de.avatic.lcc.dto.generic.NodeTypeDTO; import de.avatic.lcc.model.country.CountryListEntry; -import java.util.List; - public class NodeListEntry { private Integer id; private String name; private CountryListEntry country; private String address; - private List types; - + private Boolean isSink; + private Boolean isSource; + private Boolean isIntermediate; + private Boolean isDeprecated; public String getName() { return name; @@ -46,11 +45,35 @@ public class NodeListEntry { this.address = address; } - public List getTypes() { - return types; + public Boolean getSink() { + return isSink; } - public void setTypes(List types) { - this.types = types; + public void setSink(Boolean sink) { + isSink = sink; + } + + public Boolean getSource() { + return isSource; + } + + public void setSource(Boolean source) { + isSource = source; + } + + public Boolean getIntermediate() { + return isIntermediate; + } + + public void setIntermediate(Boolean intermediate) { + isIntermediate = intermediate; + } + + public Boolean getDeprecated() { + return isDeprecated; + } + + public void setDeprecated(Boolean deprecated) { + isDeprecated = deprecated; } } diff --git a/src/main/java/de/avatic/lcc/model/packaging/PackagingType.java b/src/main/java/de/avatic/lcc/model/packaging/PackagingType.java index 602c0df..f78616f 100644 --- a/src/main/java/de/avatic/lcc/model/packaging/PackagingType.java +++ b/src/main/java/de/avatic/lcc/model/packaging/PackagingType.java @@ -1,7 +1,7 @@ package de.avatic.lcc.model.packaging; -import de.avatic.lcc.dto.packaging.get.PackagingDimensionGetDTO; +import de.avatic.lcc.dto.generic.DimensionDTO; /** * Represents the type of packaging used in the system. @@ -11,7 +11,7 @@ import de.avatic.lcc.dto.packaging.get.PackagingDimensionGetDTO; * - HU: Handling Unit. * * It is commonly utilized in packaging-related entities such as - * {@link PackagingDimensionGetDTO} to specify the type + * {@link DimensionDTO} to specify the type * of a particular packaging instance. */ public enum PackagingType { 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 01913ac..32b2208 100644 --- a/src/main/java/de/avatic/lcc/model/premisses/Premiss.java +++ b/src/main/java/de/avatic/lcc/model/premisses/Premiss.java @@ -3,7 +3,7 @@ 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.utils.DimensionUnit; -import de.avatic.lcc.dto.packaging.get.PackagingGetDTO; +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 AggregateReference packaging; @NotNull private AggregateReference user; @@ -273,11 +273,11 @@ public class Premiss { this.userSupplierNode = userSupplierNode; } - public AggregateReference getPackaging() { + public AggregateReference getPackaging() { return packaging; } - public void setPackaging(AggregateReference packaging) { + public void setPackaging(AggregateReference packaging) { this.packaging = packaging; } diff --git a/src/main/java/de/avatic/lcc/model/users/User.java b/src/main/java/de/avatic/lcc/model/users/User.java new file mode 100644 index 0000000..bc68887 --- /dev/null +++ b/src/main/java/de/avatic/lcc/model/users/User.java @@ -0,0 +1,4 @@ +package de.avatic.lcc.model.users; + +public class User { +} diff --git a/src/main/java/de/avatic/lcc/repositories/country/CountryRepository.java b/src/main/java/de/avatic/lcc/repositories/CountryRepository.java similarity index 97% rename from src/main/java/de/avatic/lcc/repositories/country/CountryRepository.java rename to src/main/java/de/avatic/lcc/repositories/CountryRepository.java index 5507bd5..8ca6ff5 100644 --- a/src/main/java/de/avatic/lcc/repositories/country/CountryRepository.java +++ b/src/main/java/de/avatic/lcc/repositories/CountryRepository.java @@ -1,4 +1,4 @@ -package de.avatic.lcc.repositories.country; +package de.avatic.lcc.repositories; import de.avatic.lcc.model.country.Country; import de.avatic.lcc.model.country.IsoCode; @@ -88,7 +88,7 @@ public class CountryRepository { if (filter != null) { queryBuilder.append(" AND (iso_code LIKE ? OR region_code LIKE ?) "); } - queryBuilder.append(" LIMIT ? OFFSET ?"); + queryBuilder.append("ORDER BY iso_code LIMIT ? OFFSET ?"); return queryBuilder.toString(); } diff --git a/src/main/java/de/avatic/lcc/repositories/MaterialRepository.java b/src/main/java/de/avatic/lcc/repositories/MaterialRepository.java index 6b2021e..883d28c 100644 --- a/src/main/java/de/avatic/lcc/repositories/MaterialRepository.java +++ b/src/main/java/de/avatic/lcc/repositories/MaterialRepository.java @@ -72,7 +72,7 @@ public class MaterialRepository { if (filter != null) { queryBuilder.append(" AND (name LIKE ? OR part_number LIKE ?) "); } - queryBuilder.append(" LIMIT ? OFFSET ?"); + queryBuilder.append("ORDER BY normalized_part_number LIMIT ? OFFSET ?"); return queryBuilder.toString(); } @@ -114,10 +114,9 @@ public class MaterialRepository { } @Transactional - public Material update(Material material) { + public Optional update(Material material) { String updateQuery = "UPDATE material SET name = ?, part_number = ?, normalized_part_number = ?, hs_code = ? WHERE id = ?"; - jdbcTemplate.update(updateQuery, material.getName(), material.getPartNumber(), material.getNormalizedPartNumber(), material.getHsCode(), material.getId()); - return material; + return Optional.ofNullable(jdbcTemplate.update(updateQuery, material.getName(), material.getPartNumber(), material.getNormalizedPartNumber(), material.getHsCode(), material.getId()) == 0 ? null : material.getId()); } @Transactional diff --git a/src/main/java/de/avatic/lcc/repositories/NodeRepository.java b/src/main/java/de/avatic/lcc/repositories/NodeRepository.java index eae08bc..a2d04fc 100644 --- a/src/main/java/de/avatic/lcc/repositories/NodeRepository.java +++ b/src/main/java/de/avatic/lcc/repositories/NodeRepository.java @@ -1,13 +1,16 @@ package de.avatic.lcc.repositories; import de.avatic.lcc.model.nodes.Node; +import de.avatic.lcc.repositories.pagination.SearchQueryPagination; +import de.avatic.lcc.repositories.pagination.SearchQueryResult; import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; -import java.util.Collection; -import java.util.List; -import java.util.Optional; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.*; @Repository public class NodeRepository { @@ -28,7 +31,98 @@ public class NodeRepository { FROM node WHERE node.id = ?"""; - var node = jdbcTemplate.queryForObject(query, (rs, rowNum) -> { + var node = jdbcTemplate.queryForObject(query, new NodeMapper(), id); + + return Optional.ofNullable(node); + } + + private Map getPredecessorsOf(Integer id) { + String query = """ + SELECT node_predecessor.predecessor_node_id, node_predecessor.sequence_number + FROM node_predecessor + WHERE node_predecessor.node_id = ? ORDER BY node_predecessor.sequence_number"""; + + return jdbcTemplate.query(query, rs -> { + Map predecessors = new HashMap<>(); + + while(rs.next()) { + predecessors.put(rs.getInt("sequence_number"), rs.getInt("predecessor_node_id")); + } + + return predecessors; + }, id); + } + + private Collection getOutboundCountriesOf(Integer id) { + String query = """ + SELECT outbound_country_mapping.country_id + FROM outbound_country_mapping + WHERE outbound_country_mapping.node_id = ?"""; + + return jdbcTemplate.queryForList(query, Integer.class, id); + } + + @Transactional + public SearchQueryResult listNodes(String filter, Boolean excludeDeprecated, SearchQueryPagination pagination) { + String query = buildQuery(filter, excludeDeprecated, pagination); + + 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()); + } + + private String buildCountQuery(String filter, boolean excludeDeprecated) { + StringBuilder queryBuilder = new StringBuilder(""" + SELECT COUNT(*) + FROM WHERE 1=1"""); + + if (excludeDeprecated) { + queryBuilder.append(" AND is_deprecated = FALSE"); + } + if (filter != null) { + queryBuilder.append(" AND (name LIKE ? OR address LIKE ? OR country_iso_code LIKE ?)"); + } + + return queryBuilder.toString(); + } + + private String buildQuery(String filter, Boolean excludeDeprecated, SearchQueryPagination searchQueryPagination) { + StringBuilder queryBuilder = new StringBuilder(""" + SELECT node.id AS id, node.name AS name, node.address as address, node.is_source as is_source, + node.is_sink as is_sink, node.is_intermediate as is_intermediate, node.country_id as country_id, node.predecessor_required as predecessor_required, + country.iso_code AS country_iso_code, country.region_code AS country_region_code, country.name AS country_name, country.is_deprecated AS country_is_deprecated + FROM node + LEFT JOIN country ON country.id = node.country_id + """); + + if (excludeDeprecated) { + queryBuilder.append(" AND is_deprecated = FALSE"); + } + if (filter != null) { + queryBuilder.append(" AND (name LIKE ? OR address LIKE ? OR country_iso_code LIKE ?)"); + } + queryBuilder.append(" ORDER BY id LIMIT ? OFFSET ?"); + return queryBuilder.toString(); + } + + @Transactional + public Optional setDeprecatedById(Integer id) { + String query = "UPDATE node SET is_deprecated = TRUE WHERE id = ?"; + return Optional.ofNullable(jdbcTemplate.update(query, id) == 0 ? null : id); + } + + @Transactional + public Optional update(Node node) { + //TODO update predecessors and outbound_countries too + String query = "UPDATE node SET"; + return Optional.ofNullable(jdbcTemplate.update(query, node.getId()) == 0 ? null : node.getId()); + } + + private class NodeMapper implements RowMapper { + + @Override + public Node mapRow(ResultSet rs, int rowNum) throws SQLException { var data = new Node(); data.setId(rs.getInt("id")); @@ -41,29 +135,9 @@ public class NodeRepository { data.setPredecessorRequired(rs.getBoolean("predecessor_required")); data.setNodePredecessors(getPredecessorsOf(data.getId())); + data.setOutboundCountries(getOutboundCountriesOf(data.getId())); return data; - }, id); - - return Optional.ofNullable(node); - } - - private List getPredecessorsOf(Integer id) { - String query = """ - SELECT node_predecessor.predecessor_node_id - FROM node_predecessor - WHERE node_predecessor.node_id = ? ORDER BY node_predecessor.sequence_number"""; - - return jdbcTemplate.queryForList(query, Integer.class, id); - - } - - private Collection getOutboundCountriesOf(Integer id) { - String query = """ - SELECT outbound_country_mapping.country_id - FROM outbound_country_mapping - WHERE outbound_country_mapping.node_id = ?"""; - - return jdbcTemplate.queryForList(query, Integer.class, id); + } } } diff --git a/src/main/java/de/avatic/lcc/repositories/packaging/PackagingRepository.java b/src/main/java/de/avatic/lcc/repositories/packaging/PackagingRepository.java index e3b131a..31db385 100644 --- a/src/main/java/de/avatic/lcc/repositories/packaging/PackagingRepository.java +++ b/src/main/java/de/avatic/lcc/repositories/packaging/PackagingRepository.java @@ -81,7 +81,7 @@ public class PackagingRepository { if (supplierId != null) { queryBuilder.append(" AND supplier_node_id = ?"); } - queryBuilder.append(" LIMIT ? OFFSET ?"); + queryBuilder.append("ORDER BY id LIMIT ? OFFSET ?"); return queryBuilder.toString(); } diff --git a/src/main/java/de/avatic/lcc/repositories/pagination/SearchQueryResult.java b/src/main/java/de/avatic/lcc/repositories/pagination/SearchQueryResult.java index 96b5bf6..43cc7dd 100644 --- a/src/main/java/de/avatic/lcc/repositories/pagination/SearchQueryResult.java +++ b/src/main/java/de/avatic/lcc/repositories/pagination/SearchQueryResult.java @@ -1,6 +1,7 @@ package de.avatic.lcc.repositories.pagination; import java.util.List; +import java.util.function.Function; /** @@ -74,4 +75,11 @@ public class SearchQueryResult { public Integer getElementsPerPage() { return elementsPerPage; } + + public static SearchQueryResult map(SearchQueryResult queryResult, Function mapper) { + return new SearchQueryResult<>(queryResult.toList().stream().map(mapper).toList(), + queryResult.getPage(), + queryResult.getTotalElements(), + queryResult.getElementsPerPage()); + } } diff --git a/src/main/java/de/avatic/lcc/repositories/users/GroupRepository.java b/src/main/java/de/avatic/lcc/repositories/users/GroupRepository.java new file mode 100644 index 0000000..a4d9fc8 --- /dev/null +++ b/src/main/java/de/avatic/lcc/repositories/users/GroupRepository.java @@ -0,0 +1,9 @@ +package de.avatic.lcc.repositories.users; + +import org.springframework.stereotype.Repository; + +@Repository +public class GroupRepository { + public listGroups() { + } +} diff --git a/src/main/java/de/avatic/lcc/repositories/users/UserRepository.java b/src/main/java/de/avatic/lcc/repositories/users/UserRepository.java new file mode 100644 index 0000000..7a7b17d --- /dev/null +++ b/src/main/java/de/avatic/lcc/repositories/users/UserRepository.java @@ -0,0 +1,23 @@ +package de.avatic.lcc.repositories.users; + +import de.avatic.lcc.model.users.User; +import de.avatic.lcc.repositories.pagination.SearchQueryPagination; +import de.avatic.lcc.repositories.pagination.SearchQueryResult; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Repository +public class UserRepository { + + @Transactional + public SearchQueryResult listUsers(SearchQueryPagination pagination) { + String query = "SELECT * FROM users"; + } + + @Transactional + public void update(User user) { + + } +} diff --git a/src/main/java/de/avatic/lcc/service/MaterialService.java b/src/main/java/de/avatic/lcc/service/MaterialService.java deleted file mode 100644 index 22872b2..0000000 --- a/src/main/java/de/avatic/lcc/service/MaterialService.java +++ /dev/null @@ -1,80 +0,0 @@ -package de.avatic.lcc.service; - -import de.avatic.lcc.dto.material.get.MaterialGetDTO; -import de.avatic.lcc.dto.material.get.MaterialPackagingGetDTO; -import de.avatic.lcc.dto.material.post.MaterialPostDTO; -import de.avatic.lcc.model.country.Country; -import de.avatic.lcc.model.materials.Material; -import de.avatic.lcc.dto.material.get.MaterialListGetDTO; -import de.avatic.lcc.model.nodes.Node; -import de.avatic.lcc.model.packaging.PackagingDimension; -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.service.transformer.MaterialTransformerService; -import de.avatic.lcc.util.Check; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.Optional; - -@Service -public class MaterialService { - - private final MaterialTransformerService materialTransformerService; - private final PackagingRepository packagingRepository; - private final CountryRepository countryRepository; - private final NodeRepository nodeRepository; - private final PackagingDimensionRepository packagingDimensionRepository; - private final MaterialRepository materialRepository; - - public MaterialService(MaterialRepository materialRepository, MaterialTransformerService materialTransformerService, PackagingRepository packagingRepository, CountryRepository countryRepository, NodeRepository nodeRepository, PackagingDimensionRepository packagingDimensionRepository) { - this.materialRepository = materialRepository; - this.materialTransformerService = materialTransformerService; - this.packagingRepository = packagingRepository; - this.countryRepository = countryRepository; - this.nodeRepository = nodeRepository; - this.packagingDimensionRepository = packagingDimensionRepository; - } - - public SearchQueryResult listMaterial(String filter, int page, int limit) { - SearchQueryResult queryResult = materialRepository.listMaterials(filter, true, new SearchQueryPagination(page, limit)); - List dto = queryResult.toList().stream().map(materialTransformerService::convertToMaterialListGetDTO).toList(); - return new SearchQueryResult<>(dto, queryResult.getPage(), queryResult.getTotalElements(), queryResult.getElementsPerPage()); - } - - public MaterialGetDTO getMaterial(Integer id) { - - List packaging = packagingRepository.getByMaterialId(id).stream().map(p -> { - - Optional supplier = nodeRepository.getById(p.getSupplierId()); - Optional country = countryRepository.getById(supplier.orElseThrow().getCountryId()); - Optional hu = packagingDimensionRepository.getById(p.getHuId()); - Optional shu = packagingDimensionRepository.getById(p.getShuId()); - - return materialTransformerService.convertToMaterialPackagingGetDTO(p, supplier, country, hu, shu); - }).toList(); - - return materialTransformerService.convertToMaterialGetDTO(materialRepository.getById(id)).orElseThrow(() -> new RuntimeException("Material not found with id " + id)); - } - - public void updateMaterial(Integer id, MaterialPostDTO dto) { - - //check consistency - Check.equals(id, dto.getId()); - materialRepository.update(materialTransformerService.convertFromMaterialPostDTO(dto)); - } - - public Integer createMaterial(MaterialPostDTO dto) { - return materialRepository.create(materialTransformerService.convertFromMaterialPostDTO(dto)).orElseThrow(() -> new RuntimeException("Unable to create Material " + dto)); - } - - public Integer deleteMaterial(Integer id) { - return materialRepository.setDeprecatedById(id).orElseThrow(() -> new RuntimeException("Packaging does not exists " + id)); - - } -} diff --git a/src/main/java/de/avatic/lcc/service/bulk/BulkExportService.java b/src/main/java/de/avatic/lcc/service/bulk/BulkExportService.java new file mode 100644 index 0000000..eb2b25f --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/bulk/BulkExportService.java @@ -0,0 +1,12 @@ +package de.avatic.lcc.service.bulk; + +import de.avatic.lcc.dto.bulk.BulkFileType; +import org.springframework.core.io.InputStreamSource; +import org.springframework.stereotype.Service; + +@Service +public class BulkExportService { + public InputStreamSource generateExport(BulkFileType bulkFileType) { + return null; + } +} diff --git a/src/main/java/de/avatic/lcc/service/bulk/BulkFileProcessingService.java b/src/main/java/de/avatic/lcc/service/bulk/BulkFileProcessingService.java new file mode 100644 index 0000000..2ba9994 --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/bulk/BulkFileProcessingService.java @@ -0,0 +1,13 @@ +package de.avatic.lcc.service.bulk; + +import de.avatic.lcc.dto.bulk.BulkFileType; +import org.springframework.core.io.InputStreamSource; +import org.springframework.stereotype.Service; + +@Service +public class BulkFileProcessingService { + + public InputStreamSource generateExport(BulkFileType type) { + return null; + } +} diff --git a/src/main/java/de/avatic/lcc/service/bulk/TemplateGenerationService.java b/src/main/java/de/avatic/lcc/service/bulk/TemplateGenerationService.java new file mode 100644 index 0000000..8bd616b --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/bulk/TemplateGenerationService.java @@ -0,0 +1,12 @@ +package de.avatic.lcc.service.bulk; + +import de.avatic.lcc.dto.bulk.BulkFileType; +import org.springframework.core.io.InputStreamSource; +import org.springframework.stereotype.Service; + +@Service +public class TemplateGenerationService { + + public InputStreamSource generateTemplate(BulkFileType bulkFileType) { + } +} diff --git a/src/main/java/de/avatic/lcc/service/calculation/CalclationSearchStringAnalyzerService.java b/src/main/java/de/avatic/lcc/service/calculation/CalclationSearchStringAnalyzerService.java new file mode 100644 index 0000000..f0f4941 --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/calculation/CalclationSearchStringAnalyzerService.java @@ -0,0 +1,12 @@ +package de.avatic.lcc.service.calculation; + +import de.avatic.lcc.dto.calculation.SearchDTO; +import org.springframework.stereotype.Service; + +@Service +public class CalclationSearchStringAnalyzerService { + + public SearchDTO findMaterialAndSuppliers(String search) { + return null; + } +} diff --git a/src/main/java/de/avatic/lcc/service/calculation/CalculationCreationService.java b/src/main/java/de/avatic/lcc/service/calculation/CalculationCreationService.java new file mode 100644 index 0000000..5ade25f --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/calculation/CalculationCreationService.java @@ -0,0 +1,13 @@ +package de.avatic.lcc.service.calculation; + +import de.avatic.lcc.dto.calculation.view.PremiseViewDTO; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class CalculationCreationService { + public List createCalculations(List materialIds, List supplierIds, List userSupplierIds, boolean createEmpty) { + return null; + } +} diff --git a/src/main/java/de/avatic/lcc/service/calculation/PremisesService.java b/src/main/java/de/avatic/lcc/service/calculation/PremisesService.java new file mode 100644 index 0000000..7d58fdc --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/calculation/PremisesService.java @@ -0,0 +1,23 @@ +package de.avatic.lcc.service.calculation; + +import de.avatic.lcc.dto.calculation.PremiseDTO; +import de.avatic.lcc.dto.calculation.view.PremiseViewDTO; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class PremisesService { + + public List listCalculation(String filter, Integer page, Integer limit, Integer userId, Boolean deleted, Boolean archived, Boolean done) { + return null; + }; + + public List getPremises(List premissIds) { + return null; + } + + public void savePremises(List premises) { + + } +} diff --git a/src/main/java/de/avatic/lcc/service/CountryService.java b/src/main/java/de/avatic/lcc/service/configuration/CountryService.java similarity index 60% rename from src/main/java/de/avatic/lcc/service/CountryService.java rename to src/main/java/de/avatic/lcc/service/configuration/CountryService.java index c8cade0..6d816f4 100644 --- a/src/main/java/de/avatic/lcc/service/CountryService.java +++ b/src/main/java/de/avatic/lcc/service/configuration/CountryService.java @@ -1,18 +1,18 @@ -package de.avatic.lcc.service; +package de.avatic.lcc.service.configuration; -import de.avatic.lcc.dto.countries.get.CountryGetDTO; -import de.avatic.lcc.dto.countries.get.CountryListGetDTO; -import de.avatic.lcc.dto.countries.post.CountryPostDTO; -import de.avatic.lcc.model.country.Country; +import de.avatic.lcc.dto.configuration.countries.view.CountryViewDTO; +import de.avatic.lcc.dto.configuration.countries.update.CountryUpdateDTO; +import de.avatic.lcc.dto.generic.CountryDTO; import de.avatic.lcc.model.properties.CountryProperty; import de.avatic.lcc.model.properties.CountryPropertyType; import de.avatic.lcc.model.properties.PropertySet; import de.avatic.lcc.repositories.properties.CountryPropertiesRepository; -import de.avatic.lcc.repositories.country.CountryRepository; +import de.avatic.lcc.repositories.CountryRepository; import de.avatic.lcc.repositories.pagination.SearchQueryPagination; import de.avatic.lcc.repositories.pagination.SearchQueryResult; import de.avatic.lcc.repositories.properties.SystemPropertiesRepository; -import de.avatic.lcc.service.transformer.CountryTransformerService; +import de.avatic.lcc.service.transformer.country.CountryTransformerService; +import de.avatic.lcc.service.transformer.generic.CountryDTOTransformer; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -25,38 +25,28 @@ public class CountryService { private final CountryTransformerService countryTransformerService; private final CountryPropertiesRepository countryPropertiesRepository; private final SystemPropertiesRepository systemPropertiesRepository; + private final CountryDTOTransformer countryDTOTransformer; - public CountryService(CountryRepository countryRepository, CountryTransformerService countryTransformerService, CountryPropertiesRepository countryPropertiesRepository, SystemPropertiesRepository systemPropertiesRepository) { + public CountryService(CountryRepository countryRepository, CountryTransformerService countryTransformerService, CountryPropertiesRepository countryPropertiesRepository, SystemPropertiesRepository systemPropertiesRepository, CountryDTOTransformer countryDTOTransformer) { this.countryRepository = countryRepository; this.countryTransformerService = countryTransformerService; this.countryPropertiesRepository = countryPropertiesRepository; this.systemPropertiesRepository = systemPropertiesRepository; + this.countryDTOTransformer = countryDTOTransformer; } - public SearchQueryResult listMaterial(String filter, int page, int limit) { - SearchQueryResult queryResult = countryRepository.listCountries(filter, true, new SearchQueryPagination(page, limit)); - - List dto = queryResult.toList().stream().map(country -> { - CountryListGetDTO dtoEntry = new CountryListGetDTO(); - - dtoEntry.setId(country.getId()); - dtoEntry.setIsoCode(country.getIsoCode().getCode()); - dtoEntry.setName(country.getIsoCode().getFullName()); - dtoEntry.setRegionCode(country.getRegionCode().getCode()); - - return dtoEntry; - }).toList(); - - return new SearchQueryResult<>(dto, queryResult.getPage(), queryResult.getTotalElements(), queryResult.getElementsPerPage() ); + public SearchQueryResult listCountries(String filter, int page, int limit) { + return SearchQueryResult.map(countryRepository.listCountries(filter, true, new SearchQueryPagination(page, limit)), countryDTOTransformer::toCountryDTO); } - public CountryGetDTO getCountry(Integer id) { + @Transactional + public CountryViewDTO getCountry(Integer id) { List properties = countryPropertiesRepository.listByCountryId(id); return countryTransformerService.convertToCountryGetDTO(countryRepository.getById(id), properties).orElseThrow(); } @Transactional - public void updateCountry(Integer id, CountryPostDTO dto) { + public void updateCountry(Integer id, CountryUpdateDTO dto) { List types = countryPropertiesRepository.listTypes(); PropertySet set = systemPropertiesRepository.getDraftSet(); diff --git a/src/main/java/de/avatic/lcc/service/configuration/MaterialService.java b/src/main/java/de/avatic/lcc/service/configuration/MaterialService.java new file mode 100644 index 0000000..3b2eb6c --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/configuration/MaterialService.java @@ -0,0 +1,69 @@ +package de.avatic.lcc.service.configuration; + +import de.avatic.lcc.dto.configuration.material.view.MaterialViewDTO; +import de.avatic.lcc.dto.configuration.material.update.MaterialUpdateDTO; +import de.avatic.lcc.model.materials.Material; +import de.avatic.lcc.dto.generic.MaterialDTO; +import de.avatic.lcc.repositories.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.service.transformer.material.MaterialUpdateDTOTransformer; +import de.avatic.lcc.service.transformer.material.MaterialViewDTOTransformer; +import de.avatic.lcc.service.transformer.generic.DimensionDTOTransformer; +import de.avatic.lcc.service.transformer.generic.MaterialDTOTransformer; +import de.avatic.lcc.service.transformer.generic.NodeDTOTransformer; +import de.avatic.lcc.util.exception.clienterror.MaterialNotFoundException; +import org.springframework.stereotype.Service; + +@Service +public class MaterialService { + + private final MaterialUpdateDTOTransformer materialUpdateDTOTransformer; + private final PackagingRepository packagingRepository; + private final CountryRepository countryRepository; + private final NodeRepository nodeRepository; + private final PackagingDimensionRepository packagingDimensionRepository; + private final MaterialRepository materialRepository; + private final MaterialDTOTransformer materialDTOTransformer; + private final DimensionDTOTransformer dimensionDTOTransformer; + private final NodeDTOTransformer nodeDTOTransformer; + private final MaterialViewDTOTransformer materialViewDTOTransformer; + + public MaterialService(MaterialRepository materialRepository, MaterialUpdateDTOTransformer materialUpdateDTOTransformer, PackagingRepository packagingRepository, CountryRepository countryRepository, NodeRepository nodeRepository, PackagingDimensionRepository packagingDimensionRepository, MaterialDTOTransformer materialDTOTransformer, DimensionDTOTransformer dimensionDTOTransformer, NodeDTOTransformer nodeDTOTransformer, MaterialViewDTOTransformer materialViewDTOTransformer) { + this.materialRepository = materialRepository; + this.materialUpdateDTOTransformer = materialUpdateDTOTransformer; + this.packagingRepository = packagingRepository; + this.countryRepository = countryRepository; + this.nodeRepository = nodeRepository; + this.packagingDimensionRepository = packagingDimensionRepository; + this.materialDTOTransformer = materialDTOTransformer; + this.dimensionDTOTransformer = dimensionDTOTransformer; + this.nodeDTOTransformer = nodeDTOTransformer; + this.materialViewDTOTransformer = materialViewDTOTransformer; + } + + public SearchQueryResult listMaterial(String filter, int page, int limit) { + SearchQueryResult queryResult = materialRepository.listMaterials(filter, true, new SearchQueryPagination(page, limit)); + return SearchQueryResult.map(queryResult, materialDTOTransformer::toMaterialDTO); + } + + public MaterialViewDTO getMaterial(Integer id) { + return materialViewDTOTransformer.toMaterialViewDTO(materialRepository.getById(id).orElseThrow(() -> new MaterialNotFoundException(id))); + } + + public Integer updateMaterial(Integer id, MaterialUpdateDTO dto) { + return materialRepository.update(materialUpdateDTOTransformer.fromMaterialUpdateDTO(dto)).orElseThrow(() -> new MaterialNotFoundException(id)); + } + + public Integer createMaterial(MaterialUpdateDTO dto) { + return materialRepository.create(materialUpdateDTOTransformer.fromMaterialUpdateDTO(dto)).orElseThrow(() -> new RuntimeException("Unable to create Material " + dto)); + } + + 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 new file mode 100644 index 0000000..911f67b --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/configuration/NodeService.java @@ -0,0 +1,49 @@ +package de.avatic.lcc.service.configuration; + +import de.avatic.lcc.dto.generic.NodeDTO; +import de.avatic.lcc.dto.configuration.nodes.view.NodeViewDTO; +import de.avatic.lcc.dto.configuration.nodes.update.NodeUpdateDTO; +import de.avatic.lcc.repositories.NodeRepository; +import de.avatic.lcc.repositories.pagination.SearchQueryPagination; +import de.avatic.lcc.repositories.pagination.SearchQueryResult; +import de.avatic.lcc.service.transformer.nodes.NodeUpdateDTOTransformer; +import de.avatic.lcc.service.transformer.nodes.NodeViewDTOTransformer; +import de.avatic.lcc.service.transformer.generic.NodeDTOTransformer; +import de.avatic.lcc.util.exception.clienterror.NodeNotFoundException; +import org.springframework.stereotype.Service; + +@Service +public class NodeService { + + private final NodeRepository nodeRepository; + private final NodeDTOTransformer nodeDTOTransformer; + private final NodeViewDTOTransformer nodeViewDTOTransformer; + private final NodeUpdateDTOTransformer nodeUpdateDTOTransformer; + + public NodeService(NodeRepository nodeRepository, NodeDTOTransformer nodeDTOTransformer, NodeViewDTOTransformer nodeViewDTOTransformer, NodeUpdateDTOTransformer nodeUpdateDTOTransformer) { + this.nodeRepository = nodeRepository; + this.nodeDTOTransformer = nodeDTOTransformer; + this.nodeViewDTOTransformer = nodeViewDTOTransformer; + this.nodeUpdateDTOTransformer = nodeUpdateDTOTransformer; + } + + public SearchQueryResult listNodes(String filter, int page, int limit) { + return SearchQueryResult.map(nodeRepository.listNodes(filter, true, new SearchQueryPagination(page, limit)), nodeDTOTransformer::toNodeDTO); + } + + public SearchQueryResult listNodesView(String filter, int page, int limit) { + return SearchQueryResult.map(nodeRepository.listNodes(filter, true, new SearchQueryPagination(page, limit)), nodeViewDTOTransformer::toNodeViewDTO); + } + + public NodeViewDTO getNode(Integer id) { + return nodeViewDTOTransformer.toNodeViewDTO(nodeRepository.getById(id).orElseThrow(() -> new NodeNotFoundException(id))); + } + + public Integer deleteNode(Integer id) { + return nodeRepository.setDeprecatedById(id).orElseThrow(() -> new NodeNotFoundException(id)); + } + + public Integer updateNode(NodeUpdateDTO dto) { + return nodeRepository.update(nodeUpdateDTOTransformer.fromNodeUpdateDTO(dto)).orElseThrow(() -> new NodeNotFoundException(dto.getId())); + } +} diff --git a/src/main/java/de/avatic/lcc/service/PackagingService.java b/src/main/java/de/avatic/lcc/service/configuration/PackagingService.java similarity index 61% rename from src/main/java/de/avatic/lcc/service/PackagingService.java rename to src/main/java/de/avatic/lcc/service/configuration/PackagingService.java index 82866b2..8608a62 100644 --- a/src/main/java/de/avatic/lcc/service/PackagingService.java +++ b/src/main/java/de/avatic/lcc/service/configuration/PackagingService.java @@ -1,7 +1,7 @@ -package de.avatic.lcc.service; +package de.avatic.lcc.service.configuration; -import de.avatic.lcc.dto.packaging.get.PackagingGetDTO; -import de.avatic.lcc.dto.packaging.post.PackagingPostDTO; +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; @@ -9,19 +9,18 @@ import de.avatic.lcc.model.packaging.Packaging; import de.avatic.lcc.model.packaging.PackagingDimension; import de.avatic.lcc.model.packaging.PackagingProperty; import de.avatic.lcc.model.packaging.PackagingPropertyType; -import de.avatic.lcc.model.properties.CountryPropertyType; -import de.avatic.lcc.model.properties.PropertySet; +import de.avatic.lcc.repositories.CountryRepository; import de.avatic.lcc.repositories.MaterialRepository; import de.avatic.lcc.repositories.NodeRepository; -import de.avatic.lcc.repositories.country.CountryRepository; 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.properties.PackagingPropertiesRepository; -import de.avatic.lcc.service.transformer.DimensionTransformerService; -import de.avatic.lcc.service.transformer.NodeTransformerService; -import de.avatic.lcc.service.transformer.PackagingTransformerService; +import de.avatic.lcc.service.transformer.packaging.PackagingTransformerService; +import de.avatic.lcc.service.transformer.generic.DimensionDTOTransformer; +import de.avatic.lcc.service.transformer.generic.MaterialDTOTransformer; +import de.avatic.lcc.service.transformer.generic.NodeDTOTransformer; import de.avatic.lcc.util.Check; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -38,8 +37,11 @@ public class PackagingService { private final CountryRepository countryRepository; private final PackagingTransformerService packagingTransformerService; private final PackagingPropertiesRepository packagingPropertiesRepository; + private final MaterialDTOTransformer materialDTOTransformer; + private final NodeDTOTransformer nodeDTOTransformer; + private final DimensionDTOTransformer dimensionDTOTransformer; - public PackagingService(PackagingRepository packagingRepository, PackagingDimensionRepository packagingDimensionRepository, NodeRepository nodeRepository, MaterialRepository materialRepository, DimensionTransformerService dimensionTransformerService, NodeTransformerService nodeTransformerService, CountryRepository countryRepository, PackagingTransformerService packagingTransformerService, PackagingPropertiesRepository packagingPropertiesRepository) { + public PackagingService(PackagingRepository packagingRepository, PackagingDimensionRepository packagingDimensionRepository, NodeRepository nodeRepository, MaterialRepository materialRepository, CountryRepository countryRepository, PackagingTransformerService packagingTransformerService, PackagingPropertiesRepository packagingPropertiesRepository, MaterialDTOTransformer materialDTOTransformer, NodeDTOTransformer nodeDTOTransformer, DimensionDTOTransformer dimensionDTOTransformer) { this.packagingRepository = packagingRepository; this.packagingDimensionRepository = packagingDimensionRepository; this.nodeRepository = nodeRepository; @@ -47,33 +49,29 @@ public class PackagingService { this.countryRepository = countryRepository; this.packagingTransformerService = packagingTransformerService; this.packagingPropertiesRepository = packagingPropertiesRepository; + this.materialDTOTransformer = materialDTOTransformer; + this.nodeDTOTransformer = nodeDTOTransformer; + this.dimensionDTOTransformer = dimensionDTOTransformer; } @Transactional - public SearchQueryResult listPackaging(Integer materialId, Integer supplierId, int page, int limit) { - SearchQueryResult queryResult = packagingRepository.listPackaging(materialId, supplierId, true, new SearchQueryPagination(page, limit)); + 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); + } - List dto = queryResult.toList().stream().map(packaging -> { - PackagingGetDTO dtoEntry = new PackagingGetDTO(); - - Optional node = nodeRepository.getById(packaging.getSupplierId()); - Optional country = countryRepository.getById(node.orElseThrow().getCountryId()); - Optional material = materialRepository.getById(packaging.getMaterialId()); - - dtoEntry.setHu(packagingTransformerService.convertToPackagingDimensionDTO(packagingDimensionRepository.getById(packaging.getHuId())).orElseThrow()); - dtoEntry.setShu(packagingTransformerService.convertToPackagingDimensionDTO(packagingDimensionRepository.getById(packaging.getShuId())).orElseThrow()); - dtoEntry.setSupplier(packagingTransformerService.convertToPackagingSupplierDTO(node, country).orElseThrow()); - dtoEntry.setMaterial(packagingTransformerService.convertToPackagingMaterialDTO(material).orElseThrow()); - - return dtoEntry; - - }).toList(); - - return new SearchQueryResult<>(dto, queryResult.getPage(), queryResult.getTotalElements(), queryResult.getElementsPerPage()); + private PackagingViewDTO toPackagingGetDTO(Packaging packaging) { + PackagingViewDTO dtoEntry = new PackagingViewDTO(); + Optional node = nodeRepository.getById(packaging.getSupplierId()); + Optional material = materialRepository.getById(packaging.getMaterialId()); + dtoEntry.setHu(dimensionDTOTransformer.toDimensionDTO(packagingDimensionRepository.getById(packaging.getHuId()).orElseThrow())); + dtoEntry.setShu(dimensionDTOTransformer.toDimensionDTO(packagingDimensionRepository.getById(packaging.getShuId()).orElseThrow())); + dtoEntry.setSupplier(nodeDTOTransformer.toNodeDTO(node.orElseThrow())); + dtoEntry.setMaterial(materialDTOTransformer.toMaterialDTO(material.orElseThrow())); + return dtoEntry; } @Transactional - public PackagingGetDTO getPackaging(Integer id) { + public PackagingViewDTO getPackaging(Integer id) { Optional packaging = packagingRepository.getById(id); Optional material = materialRepository.getById(packaging.orElseThrow().getMaterialId()); @@ -88,7 +86,7 @@ public class PackagingService { } @Transactional - public void updatePackaging(Integer id, PackagingPostDTO dto) { + public void updatePackaging(Integer id, PackagingUpdateDTO dto) { Optional entity = packagingRepository.getById(id); if (entity.isEmpty()) throw new RuntimeException("Packaging does not exists " + id); @@ -98,8 +96,8 @@ public class PackagingService { Check.equals(dto.getHu().getId(), entity.get().getHuId()); Check.equals(dto.getId(), id); - packagingDimensionRepository.update(packagingTransformerService.convertFromPackagingDimensionPostDTO(dto.getHu())); - packagingDimensionRepository.update(packagingTransformerService.convertFromPackagingDimensionPostDTO(dto.getShu())); + packagingDimensionRepository.update(dimensionDTOTransformer.toDimensionEntity(dto.getHu())); + packagingDimensionRepository.update(dimensionDTOTransformer.toDimensionEntity(dto.getShu())); List types = packagingPropertiesRepository.listTypes(); @@ -119,10 +117,10 @@ public class PackagingService { } @Transactional - public Integer createPackaging(PackagingPostDTO dto) { + public Integer createPackaging(PackagingUpdateDTO dto) { - Optional huId = packagingDimensionRepository.insert(packagingTransformerService.convertFromPackagingDimensionPostDTO(dto.getHu())); - Optional shuId = packagingDimensionRepository.insert(packagingTransformerService.convertFromPackagingDimensionPostDTO(dto.getShu())); + Optional huId = packagingDimensionRepository.insert(dimensionDTOTransformer.toDimensionEntity(dto.getHu())); + Optional shuId = packagingDimensionRepository.insert(dimensionDTOTransformer.toDimensionEntity(dto.getShu())); Packaging entity = packagingTransformerService.convertFromPackagingPostDTO(dto); diff --git a/src/main/java/de/avatic/lcc/service/PropertiesService.java b/src/main/java/de/avatic/lcc/service/configuration/PropertiesService.java similarity index 81% rename from src/main/java/de/avatic/lcc/service/PropertiesService.java rename to src/main/java/de/avatic/lcc/service/configuration/PropertiesService.java index ee9ee26..bf492dd 100644 --- a/src/main/java/de/avatic/lcc/service/PropertiesService.java +++ b/src/main/java/de/avatic/lcc/service/configuration/PropertiesService.java @@ -1,6 +1,6 @@ -package de.avatic.lcc.service; +package de.avatic.lcc.service.configuration; -import de.avatic.lcc.dto.properties.post.PropertiesPostDTO; +import de.avatic.lcc.dto.configuration.properties.post.PropertiesPostDTO; import de.avatic.lcc.model.properties.PropertyType; import org.springframework.stereotype.Service; diff --git a/src/main/java/de/avatic/lcc/service/report/ExcelReportingService.java b/src/main/java/de/avatic/lcc/service/report/ExcelReportingService.java new file mode 100644 index 0000000..455b624 --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/report/ExcelReportingService.java @@ -0,0 +1,17 @@ +package de.avatic.lcc.service.report; + +import org.springframework.stereotype.Service; + +import java.io.ByteArrayInputStream; +import java.util.List; + +@Service +public class ExcelReportingService { + + + public ByteArrayInputStream generateExcelReport(Integer materialId, List nodeIds) { + + return null; + } + +} diff --git a/src/main/java/de/avatic/lcc/service/report/ReportFinderService.java b/src/main/java/de/avatic/lcc/service/report/ReportFinderService.java new file mode 100644 index 0000000..002a45e --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/report/ReportFinderService.java @@ -0,0 +1,16 @@ +package de.avatic.lcc.service.report; + + +import de.avatic.lcc.dto.generic.NodeDTO; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class ReportFinderService { + + + public List> findSupplierForReporting(Integer materialId) { + return null; + } +} diff --git a/src/main/java/de/avatic/lcc/service/report/ReportingService.java b/src/main/java/de/avatic/lcc/service/report/ReportingService.java new file mode 100644 index 0000000..e26e086 --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/report/ReportingService.java @@ -0,0 +1,13 @@ +package de.avatic.lcc.service.report; + +import de.avatic.lcc.dto.report.ReportDTO; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class ReportingService { + public ReportDTO getReport(Integer materialId, List nodeIds) { + return null; + } +} diff --git a/src/main/java/de/avatic/lcc/service/transformer/DimensionTransformerService.java b/src/main/java/de/avatic/lcc/service/transformer/DimensionTransformerService.java deleted file mode 100644 index b9c0469..0000000 --- a/src/main/java/de/avatic/lcc/service/transformer/DimensionTransformerService.java +++ /dev/null @@ -1,10 +0,0 @@ -package de.avatic.lcc.service.transformer; - -import org.springframework.stereotype.Service; - -@Service -public class DimensionTransformerService { - - - -} diff --git a/src/main/java/de/avatic/lcc/service/transformer/MaterialTransformerService.java b/src/main/java/de/avatic/lcc/service/transformer/MaterialTransformerService.java deleted file mode 100644 index 3bae441..0000000 --- a/src/main/java/de/avatic/lcc/service/transformer/MaterialTransformerService.java +++ /dev/null @@ -1,141 +0,0 @@ -package de.avatic.lcc.service.transformer; - -import de.avatic.lcc.dto.generic.NodeTypeDTO; -import de.avatic.lcc.dto.material.get.*; -import de.avatic.lcc.dto.material.post.MaterialPostDTO; -import de.avatic.lcc.dto.packaging.get.PackagingCountryGetDTO; -import de.avatic.lcc.dto.packaging.get.PackagingDimensionGetDTO; -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 org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.Optional; - -@Service -public class MaterialTransformerService { - - public Material convertFromMaterialPostDTO(MaterialPostDTO dto) { - Material entity = new Material(); - - entity.setNormalizedPartNumber(normalizePartNumber(dto.getPartNumber())); - entity.setPartNumber(dto.getPartNumber()); - entity.setName(dto.getName()); - entity.setDeprecated(false); - entity.setId(dto.getId()); - entity.setHsCode(dto.getHsCode()); - - return entity; - } - - private String normalizePartNumber(String partNumber) { - if (partNumber.length() > 12) throw new IllegalArgumentException("Part number must be less than 12 characters"); - return "000000000000".concat(partNumber).substring(partNumber.length()); - } - - public Optional convertToMaterialGetDTO(Optional material) { - - if (material.isEmpty()) return Optional.empty(); - Material entity = material.get(); - - MaterialGetDTO dtoEntry = new MaterialGetDTO(); - - dtoEntry.setId(entity.getId()); - dtoEntry.setPartNumber(entity.getPartNumber()); - dtoEntry.setName(entity.getName()); - dtoEntry.setHsCode(entity.getHsCode()); - - return Optional.of(dtoEntry); - - } - - public MaterialListGetDTO convertToMaterialListGetDTO(Material entity) { - - MaterialListGetDTO dtoEntry = new MaterialListGetDTO(); - - dtoEntry.setId(entity.getId()); - dtoEntry.setPartNumber(entity.getPartNumber()); - dtoEntry.setName(entity.getName()); - dtoEntry.setHsCode(entity.getHsCode()); - - return dtoEntry; - - - } - - public MaterialPackagingGetDTO convertToMaterialPackagingGetDTO(Packaging entity, Optional supplier, Optional country, Optional hu, Optional shu) { - - MaterialPackagingGetDTO dto = new MaterialPackagingGetDTO(); - - dto.setId(entity.getId()); - dto.setDeprecated(entity.getDeprecated()); - dto.setHu(convertToMaterialDimensionGetDTO(hu).orElseThrow()); - dto.setShu(convertToMaterialDimensionGetDTO(shu).orElseThrow()); - dto.setSupplier(convertToMaterialSupplierGetDTO(supplier, country).orElseThrow()); - - return dto; - - } - - private Optional convertToMaterialSupplierGetDTO(Optional entity, Optional country) { - - if(entity.isEmpty()) return Optional.empty(); - Node data = entity.get(); - - MaterialSupplierGetDTO dto = new MaterialSupplierGetDTO(); - - dto.setId(data.getId()); - dto.setAddress(data.getAddress()); - dto.setName(data.getName()); - dto.setDeprecated(data.getDeprecated()); - dto.setTypes(toNodeTypeArrayList(data)); - dto.setCountry(convertToMaterialCountryGetDTO(country).orElseThrow()); - - return Optional.of(dto); - } - - private Optional convertToMaterialCountryGetDTO(Optional country) { - if (country.isEmpty()) return Optional.empty(); - - Country data = country.get(); - MaterialCountryGetDTO dto = new MaterialCountryGetDTO(); - - dto.setId(data.getId()); - dto.setRegionCode(data.getRegionCode().name()); - dto.setIsoCode(data.getIsoCode().name()); - - return Optional.of(dto); - } - - private ArrayList toNodeTypeArrayList(Node entity) { - ArrayList types = new ArrayList<>(); - if (entity.getSink()) types.add(NodeTypeDTO.SINK); - if (entity.getSource()) types.add(NodeTypeDTO.SOURCE); - if (entity.getIntermediate()) types.add(NodeTypeDTO.INTERMEDIATE); - return types; - } - - private Optional convertToMaterialDimensionGetDTO(Optional data) { - if (data.isEmpty()) return Optional.empty(); - - PackagingDimension dimension = data.get(); - MaterialDimensionGetDTO dto = new MaterialDimensionGetDTO(); - - dto.setId(dimension.getId()); - dto.setType(dimension.getType()); - dto.setLength(dimension.getDimensionUnit().convertFromMM(dimension.getLength()).doubleValue()); - dto.setWidth(dimension.getDimensionUnit().convertFromMM(dimension.getWidth()).doubleValue()); - dto.setHeight(dimension.getDimensionUnit().convertFromMM(dimension.getHeight()).doubleValue()); - dto.setDimensionUnit(dimension.getDimensionUnit()); - dto.setWeight(dimension.getWeightUnit().convertFromG(dimension.getWeight()).doubleValue()); - dto.setWeightUnit(dimension.getWeightUnit()); - dto.setContentUnitCount(dimension.getContentUnitCount()); - dto.setDeprecated(dimension.getDeprecated()); - - return Optional.of(dto); - - } -} diff --git a/src/main/java/de/avatic/lcc/service/transformer/NodeTransformerService.java b/src/main/java/de/avatic/lcc/service/transformer/NodeTransformerService.java deleted file mode 100644 index 638db55..0000000 --- a/src/main/java/de/avatic/lcc/service/transformer/NodeTransformerService.java +++ /dev/null @@ -1,16 +0,0 @@ -package de.avatic.lcc.service.transformer; - -import org.springframework.stereotype.Service; - -@Service -public class NodeTransformerService { - - private final CountryTransformerService countryTransformerService; - - public NodeTransformerService(CountryTransformerService countryTransformerService) { - this.countryTransformerService = countryTransformerService; - } - - - -} diff --git a/src/main/java/de/avatic/lcc/service/transformer/PackagingTransformerService.java b/src/main/java/de/avatic/lcc/service/transformer/PackagingTransformerService.java deleted file mode 100644 index 214f2c0..0000000 --- a/src/main/java/de/avatic/lcc/service/transformer/PackagingTransformerService.java +++ /dev/null @@ -1,186 +0,0 @@ -package de.avatic.lcc.service.transformer; - -import de.avatic.lcc.dto.generic.NodeTypeDTO; -import de.avatic.lcc.dto.packaging.get.*; -import de.avatic.lcc.dto.packaging.post.PackagingDimensionPostDTO; -import de.avatic.lcc.dto.packaging.post.PackagingPostDTO; -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.packaging.PackagingProperty; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; - -@Service -public class PackagingTransformerService { - - - public Optional convertToPackagingDimensionDTO(Optional data) { - - if (data.isEmpty()) return Optional.empty(); - - PackagingDimension dimension = data.get(); - PackagingDimensionGetDTO dto = new PackagingDimensionGetDTO(); - - dto.setId(dimension.getId()); - dto.setType(dimension.getType()); - dto.setLength(dimension.getDimensionUnit().convertFromMM(dimension.getLength()).doubleValue()); - dto.setWidth(dimension.getDimensionUnit().convertFromMM(dimension.getWidth()).doubleValue()); - dto.setHeight(dimension.getDimensionUnit().convertFromMM(dimension.getHeight()).doubleValue()); - dto.setDimensionUnit(dimension.getDimensionUnit()); - dto.setWeight(dimension.getWeightUnit().convertFromG(dimension.getWeight()).doubleValue()); - dto.setWeightUnit(dimension.getWeightUnit()); - dto.setContentUnitCount(dimension.getContentUnitCount()); - dto.setDeprecated(dimension.getDeprecated()); - - return Optional.of(dto); - } - - public Optional convertToPackagingCountryDTO(Optional country) { - - if (country.isEmpty()) return Optional.empty(); - - Country data = country.get(); - PackagingCountryGetDTO dto = new PackagingCountryGetDTO(); - - dto.setId(data.getId()); - dto.setRegionCode(data.getRegionCode().name()); - dto.setIsoCode(data.getIsoCode().name()); - - return Optional.of(dto); - } - - - public Optional convertToPackagingSupplierDTO(Optional node, Optional country) { - - if (node.isEmpty() || country.isEmpty()) { - return Optional.empty(); - } - - Node data = node.get(); - PackagingSupplierGetDTO dto = new PackagingSupplierGetDTO(); - - ArrayList types = new ArrayList<>(); - if (data.getSink()) types.add(NodeTypeDTO.SINK); - if (data.getSource()) types.add(NodeTypeDTO.SOURCE); - if (data.getIntermediate()) types.add(NodeTypeDTO.INTERMEDIATE); - - dto.setId(data.getId()); - dto.setName(data.getName()); - dto.setAddress(data.getAddress()); - dto.setCountry(convertToPackagingCountryDTO(country).orElseThrow()); - dto.setTypes(types); - dto.setDeprecated(data.getDeprecated()); - - return Optional.of(dto); - } - - - public Optional convertToPackagingMaterialDTO(Optional material) { - if(material.isEmpty()) return Optional.empty(); - - Material data = material.get(); - var dto = new PackagingMaterialGetDTO(); - - dto.setName(data.getName()); - dto.setHsCode(data.getHsCode()); - dto.setPartNumber(data.getPartNumber()); - dto.setId(data.getId()); - - return Optional.of(dto); - } - - 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 PackagingGetDTO(); - - dto.setId(data.getId()); - dto.setMaterial(convertToPackagingMaterialDTO(material).orElseThrow()); - dto.setSupplier(convertToPackagingSupplierDTO(supplier, country).orElseThrow()); - dto.setHu(convertToPackagingDimensionDTO(hu).orElseThrow()); - dto.setShu(convertToPackagingDimensionDTO(shu).orElseThrow()); - dto.setDeprecated(data.getDeprecated()); - dto.setProperties(properties.stream().map(this::convertToPackagingPropertyGetDTO).toList()); - - return Optional.of(dto); - } - - private PackagingPropertyGetDTO convertToPackagingPropertyGetDTO(PackagingProperty property) { - PackagingPropertyGetDTO dto = new PackagingPropertyGetDTO(); - - dto.setCurrentValue(property.getPropertyValue()); - dto.setDataType(property.getPackagingPropertyType().getDataType().name()); - dto.setRequired(property.getPackagingPropertyType().getRequired()); - dto.setName(property.getPackagingPropertyType().getName()); - dto.setExternalMappingId(property.getPackagingPropertyType().getExternalMappingId()); - dto.setValidationRule(property.getPackagingPropertyType().getValidationRule()); - - return dto; - } - - public Packaging convertFromPackagingPostDTO(PackagingPostDTO 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; - } - - public PackagingDimension convertFromPackagingDimensionGetDTO(PackagingDimensionGetDTO dto) { - - var entity = new PackagingDimension(); - entity.setId(dto.getId()); - entity.setType(dto.getType()); - entity.setLength(dto.getDimensionUnit().convertToMM(dto.getLength()).intValue()); - entity.setWidth(dto.getDimensionUnit().convertToMM(dto.getWidth()).intValue()); - entity.setHeight(dto.getDimensionUnit().convertToMM(dto.getHeight()).intValue()); - entity.setDimensionUnit(dto.getDimensionUnit()); - entity.setWeight(dto.getWeightUnit().convertToG(dto.getWeight()).intValue()); - entity.setWeightUnit(dto.getWeightUnit()); - entity.setContentUnitCount(dto.getContentUnitCount()); - entity.setDeprecated(dto.getDeprecated()); - - return entity; - } - - public PackagingDimension convertFromPackagingDimensionPostDTO(PackagingDimensionPostDTO dto) { - - var entity = new PackagingDimension(); - entity.setId(dto.getId()); - entity.setType(dto.getType()); - entity.setLength(dto.getDimensionUnit().convertToMM(dto.getLength()).intValue()); - entity.setWidth(dto.getDimensionUnit().convertToMM(dto.getWidth()).intValue()); - entity.setHeight(dto.getDimensionUnit().convertToMM(dto.getHeight()).intValue()); - entity.setDimensionUnit(dto.getDimensionUnit()); - entity.setWeight(dto.getWeightUnit().convertToG(dto.getWeight()).intValue()); - entity.setWeightUnit(dto.getWeightUnit()); - entity.setContentUnitCount(dto.getContentUnitCount()); - entity.setDeprecated(dto.getDeprecated()); - - return entity; - } - - - public List convertFromPackagingPropertyPostDTO(PackagingPropertiesPostDTO properties) { - - return properties.stream().map(p -> { - PackagingProperty entity = new PackagingProperty(); - - entity.set(); - - }).toList() - - } -} diff --git a/src/main/java/de/avatic/lcc/service/transformer/CountryTransformerService.java b/src/main/java/de/avatic/lcc/service/transformer/country/CountryTransformerService.java similarity index 77% rename from src/main/java/de/avatic/lcc/service/transformer/CountryTransformerService.java rename to src/main/java/de/avatic/lcc/service/transformer/country/CountryTransformerService.java index 3e0c9e1..63f39f1 100644 --- a/src/main/java/de/avatic/lcc/service/transformer/CountryTransformerService.java +++ b/src/main/java/de/avatic/lcc/service/transformer/country/CountryTransformerService.java @@ -1,8 +1,8 @@ -package de.avatic.lcc.service.transformer; +package de.avatic.lcc.service.transformer.country; -import de.avatic.lcc.dto.countries.get.CountryGetDTO; -import de.avatic.lcc.dto.countries.get.CountryPropertyGetDTO; +import de.avatic.lcc.dto.configuration.countries.view.CountryViewDTO; +import de.avatic.lcc.dto.configuration.countries.view.CountryViewPropertyDTO; import de.avatic.lcc.model.country.Country; import de.avatic.lcc.model.properties.CountryProperty; import de.avatic.lcc.model.properties.PropertySetState; @@ -15,11 +15,11 @@ import java.util.Optional; public class CountryTransformerService { - public Optional convertToCountryGetDTO(Optional country, List properties) { + public Optional convertToCountryGetDTO(Optional country, List properties) { if (country.isEmpty()) return Optional.empty(); - CountryGetDTO dto = new CountryGetDTO(); + CountryViewDTO dto = new CountryViewDTO(); Country entity = country.get(); dto.setIsoCode(entity.getIsoCode().getCode()); @@ -28,7 +28,7 @@ public class CountryTransformerService { dto.setId(entity.getId()); dto.setProperties(properties.stream().filter(p -> p.getPropertySet().getState().equals(PropertySetState.VALID)).map(p -> { - CountryPropertyGetDTO dtoEntry = new CountryPropertyGetDTO(); + CountryViewPropertyDTO dtoEntry = new CountryViewPropertyDTO(); Optional draft = properties.stream().filter(d -> d.getPropertySet().getState().equals(PropertySetState.DRAFT) && d.getType().getExternalMappingId().equals(p.getType().getExternalMappingId())).findFirst(); @@ -47,4 +47,7 @@ public class CountryTransformerService { } + + + } diff --git a/src/main/java/de/avatic/lcc/service/transformer/generic/CountryDTOTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/generic/CountryDTOTransformer.java new file mode 100644 index 0000000..f21284d --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/transformer/generic/CountryDTOTransformer.java @@ -0,0 +1,22 @@ +package de.avatic.lcc.service.transformer.generic; + +import de.avatic.lcc.dto.generic.CountryDTO; +import de.avatic.lcc.model.country.Country; +import org.springframework.stereotype.Service; + +@Service +public class CountryDTOTransformer { + + public CountryDTO toCountryDTO(Country entity) { + + CountryDTO dto = new CountryDTO(); + + dto.setIsoCode(entity.getIsoCode().getCode()); + dto.setRegionCode(entity.getRegionCode().getCode()); + dto.setName(entity.getIsoCode().getFullName()); + dto.setId(entity.getId()); + + return dto; + + } +} diff --git a/src/main/java/de/avatic/lcc/service/transformer/generic/DimensionDTOTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/generic/DimensionDTOTransformer.java new file mode 100644 index 0000000..daa98f9 --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/transformer/generic/DimensionDTOTransformer.java @@ -0,0 +1,43 @@ +package de.avatic.lcc.service.transformer.generic; + +import de.avatic.lcc.dto.generic.DimensionDTO; +import de.avatic.lcc.model.packaging.PackagingDimension; +import org.springframework.stereotype.Service; + +@Service +public class DimensionDTOTransformer { + + public DimensionDTO toDimensionDTO(PackagingDimension entity) { + DimensionDTO dto = new DimensionDTO(); + + dto.setId(entity.getId()); + dto.setType(entity.getType()); + dto.setLength(entity.getDimensionUnit().convertFromMM(entity.getLength()).doubleValue()); + dto.setWidth(entity.getDimensionUnit().convertFromMM(entity.getWidth()).doubleValue()); + dto.setHeight(entity.getDimensionUnit().convertFromMM(entity.getHeight()).doubleValue()); + dto.setDimensionUnit(entity.getDimensionUnit()); + dto.setWeight(entity.getWeightUnit().convertFromG(entity.getWeight()).doubleValue()); + dto.setWeightUnit(entity.getWeightUnit()); + dto.setContentUnitCount(entity.getContentUnitCount()); + dto.setDeprecated(entity.getDeprecated()); + + return dto; + } + + public PackagingDimension toDimensionEntity(DimensionDTO dto) { + var entity = new PackagingDimension(); + entity.setId(dto.getId()); + entity.setType(dto.getType()); + entity.setLength(dto.getDimensionUnit().convertToMM(dto.getLength()).intValue()); + entity.setWidth(dto.getDimensionUnit().convertToMM(dto.getWidth()).intValue()); + entity.setHeight(dto.getDimensionUnit().convertToMM(dto.getHeight()).intValue()); + entity.setDimensionUnit(dto.getDimensionUnit()); + entity.setWeight(dto.getWeightUnit().convertToG(dto.getWeight()).intValue()); + entity.setWeightUnit(dto.getWeightUnit()); + entity.setContentUnitCount(dto.getContentUnitCount()); + entity.setDeprecated(dto.getDeprecated()); + + return entity; + } + +} diff --git a/src/main/java/de/avatic/lcc/service/transformer/generic/LocationDTOTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/generic/LocationDTOTransformer.java new file mode 100644 index 0000000..af4e0e9 --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/transformer/generic/LocationDTOTransformer.java @@ -0,0 +1,12 @@ +package de.avatic.lcc.service.transformer.generic; + +import de.avatic.lcc.dto.generic.LocationDTO; +import de.avatic.lcc.model.nodes.Node; +import org.springframework.stereotype.Service; + +@Service +public class LocationDTOTransformer { + public LocationDTO toLocationDTO(Node entity) { + return new LocationDTO(entity.getGeoLat().doubleValue(), entity.getGeoLng().doubleValue()); + } +} diff --git a/src/main/java/de/avatic/lcc/service/transformer/generic/MaterialDTOTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/generic/MaterialDTOTransformer.java new file mode 100644 index 0000000..8904181 --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/transformer/generic/MaterialDTOTransformer.java @@ -0,0 +1,23 @@ +package de.avatic.lcc.service.transformer.generic; + +import de.avatic.lcc.dto.generic.MaterialDTO; +import de.avatic.lcc.model.materials.Material; +import org.springframework.stereotype.Service; + +@Service +public class MaterialDTOTransformer { + + public MaterialDTO toMaterialDTO(Material entity) { + + MaterialDTO dtoEntry = new MaterialDTO(); + + dtoEntry.setId(entity.getId()); + dtoEntry.setPartNumber(entity.getPartNumber()); + dtoEntry.setName(entity.getName()); + dtoEntry.setHsCode(entity.getHsCode()); + + return dtoEntry; + + + } +} diff --git a/src/main/java/de/avatic/lcc/service/transformer/generic/NodeDTOTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/generic/NodeDTOTransformer.java new file mode 100644 index 0000000..cadd260 --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/transformer/generic/NodeDTOTransformer.java @@ -0,0 +1,43 @@ +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.model.nodes.Node; +import de.avatic.lcc.repositories.CountryRepository; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; + +@Service +public class NodeDTOTransformer { + + private final CountryDTOTransformer countryTransformerService; + private final CountryRepository countryRepository; + private final LocationDTOTransformer locationDTOTransformer; + + public NodeDTOTransformer(CountryDTOTransformer countryTransformerService, CountryRepository countryRepository, LocationDTOTransformer locationDTOTransformer) { + this.countryTransformerService = countryTransformerService; + this.countryRepository = countryRepository; + this.locationDTOTransformer = locationDTOTransformer; + } + + public NodeDTO toNodeDTO(Node entity) { + NodeDTO dto = new NodeDTO(); + + ArrayList types = new ArrayList<>(); + if (entity.getSink()) types.add(NodeTypeDTO.SINK); + if (entity.getSource()) types.add(NodeTypeDTO.SOURCE); + if (entity.getIntermediate()) types.add(NodeTypeDTO.INTERMEDIATE); + + dto.setId(entity.getId()); + dto.setName(entity.getName()); + dto.setAddress(entity.getAddress()); + dto.setCountry(countryTransformerService.toCountryDTO(countryRepository.getById(entity.getCountryId())).orElseThrow()); + dto.setTypes(types); + dto.setDeprecated(entity.getDeprecated()); + dto.setLocation(locationDTOTransformer.toLocationDTO(entity)); + + 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 new file mode 100644 index 0000000..9144124 --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/transformer/material/MaterialUpdateDTOTransformer.java @@ -0,0 +1,29 @@ +package de.avatic.lcc.service.transformer.material; + +import de.avatic.lcc.dto.configuration.material.update.MaterialUpdateDTO; +import de.avatic.lcc.model.materials.Material; +import org.springframework.stereotype.Service; + +@Service +public class MaterialUpdateDTOTransformer { + + + public Material fromMaterialUpdateDTO(MaterialUpdateDTO dto) { + Material entity = new Material(); + + entity.setNormalizedPartNumber(normalizePartNumber(dto.getPartNumber())); + entity.setPartNumber(dto.getPartNumber()); + entity.setName(dto.getName()); + entity.setDeprecated(false); + entity.setId(dto.getId()); + entity.setHsCode(dto.getHsCode()); + + return entity; + } + + private String normalizePartNumber(String partNumber) { + if (partNumber.length() > 12) throw new IllegalArgumentException("Part number must be less than 12 characters"); + return "000000000000".concat(partNumber).substring(partNumber.length()); + } + +} 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 new file mode 100644 index 0000000..865ee78 --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/transformer/material/MaterialViewDTOTransformer.java @@ -0,0 +1,27 @@ +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 new file mode 100644 index 0000000..9b0e7b5 --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/transformer/material/MaterialViewPackagingDTOTransformer.java @@ -0,0 +1,45 @@ +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.DimensionDTOTransformer; +import de.avatic.lcc.service.transformer.generic.NodeDTOTransformer; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +@Service +public class MaterialViewPackagingDTOTransformer { + + private final NodeRepository nodeRepository; + private final PackagingDimensionRepository packagingDimensionRepository; + private final DimensionDTOTransformer dimensionDTOTransformer; + private final NodeDTOTransformer nodeDTOTransformer; + + public MaterialViewPackagingDTOTransformer(NodeRepository nodeRepository, PackagingDimensionRepository packagingDimensionRepository, DimensionDTOTransformer dimensionDTOTransformer, NodeDTOTransformer nodeDTOTransformer) { + this.nodeRepository = nodeRepository; + this.packagingDimensionRepository = packagingDimensionRepository; + this.dimensionDTOTransformer = dimensionDTOTransformer; + this.nodeDTOTransformer = nodeDTOTransformer; + } + + 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(dimensionDTOTransformer.toDimensionDTO(hu.orElseThrow())); + dto.setShu(dimensionDTOTransformer.toDimensionDTO(shu.orElseThrow())); + dto.setSupplier(nodeDTOTransformer.toNodeDTO(supplier.orElseThrow())); + + return dto; + } + +} 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 new file mode 100644 index 0000000..fe50726 --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/transformer/nodes/NodeUpdateDTOTransformer.java @@ -0,0 +1,21 @@ +package de.avatic.lcc.service.transformer.nodes; + +import de.avatic.lcc.dto.configuration.nodes.update.NodeUpdateDTO; +import de.avatic.lcc.model.nodes.Node; +import org.springframework.stereotype.Service; + +@Service +public class NodeUpdateDTOTransformer { + + + public Node fromNodeUpdateDTO(NodeUpdateDTO dto) { + + Node entity = new Node(); + + entity.setId(dto.getId()); + entity.setSink(dto.get); + + return entity; + } + +} diff --git a/src/main/java/de/avatic/lcc/service/transformer/nodes/NodeViewDTOTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/nodes/NodeViewDTOTransformer.java new file mode 100644 index 0000000..bd8f861 --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/transformer/nodes/NodeViewDTOTransformer.java @@ -0,0 +1,64 @@ +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.configuration.nodes.view.NodeViewDTO; +import de.avatic.lcc.model.nodes.Node; +import de.avatic.lcc.repositories.CountryRepository; +import de.avatic.lcc.repositories.NodeRepository; +import de.avatic.lcc.service.transformer.generic.CountryDTOTransformer; +import de.avatic.lcc.service.transformer.generic.LocationDTOTransformer; +import de.avatic.lcc.service.transformer.generic.NodeDTOTransformer; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +@Service +public class NodeViewDTOTransformer { + + private final CountryDTOTransformer countryDTOTransformer; + private final CountryRepository countryRepository; + private final LocationDTOTransformer locationDTOTransformer; + private final NodeDTOTransformer nodeDTOTransformer; + private final NodeRepository nodeRepository; + + public NodeViewDTOTransformer(CountryDTOTransformer countryDTOTransformer, CountryRepository countryRepository, LocationDTOTransformer locationDTOTransformer, NodeDTOTransformer nodeDTOTransformer, NodeRepository nodeRepository) { + this.countryDTOTransformer = countryDTOTransformer; + this.countryRepository = countryRepository; + this.locationDTOTransformer = locationDTOTransformer; + this.nodeDTOTransformer = nodeDTOTransformer; + this.nodeRepository = nodeRepository; + } + + public NodeViewDTO toNodeViewDTO(Node node) { + NodeViewDTO dto = new NodeViewDTO(); + + Map predecessors = new HashMap<>(); + + for (Integer seq : node.getNodePredecessors().keySet()) + predecessors.put(seq, nodeDTOTransformer.toNodeDTO(nodeRepository.getById(node.getNodePredecessors().get(seq)).orElseThrow())); + + dto.setId(node.getId()); + dto.setDeprecated(node.getDeprecated()); + dto.setCountry(countryDTOTransformer.toCountryDTO(countryRepository.getById(node.getCountryId()).orElseThrow())); + dto.setName(node.getName()); + dto.setAddress(node.getAddress()); + dto.setLocation(locationDTOTransformer.toLocationDTO(node)); + dto.setTypes(toNodeTypeArrayList(node)); + dto.setPredecessors(predecessors); + dto.setOutboundCountries(node.getOutboundCountries().stream().map(id -> countryDTOTransformer.toCountryDTO(countryRepository.getById(id).orElseThrow())).toList()); + + return dto; + } + + private ArrayList toNodeTypeArrayList(Node entity) { + ArrayList types = new ArrayList<>(); + if (entity.getSink()) types.add(NodeTypeDTO.SINK); + if (entity.getSource()) types.add(NodeTypeDTO.SOURCE); + if (entity.getIntermediate()) types.add(NodeTypeDTO.INTERMEDIATE); + return types; + } + +} 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 new file mode 100644 index 0000000..2b8b6b5 --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/transformer/packaging/PackagingTransformerService.java @@ -0,0 +1,69 @@ +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.packaging.PackagingProperty; +import de.avatic.lcc.service.transformer.generic.DimensionDTOTransformer; +import de.avatic.lcc.service.transformer.generic.MaterialDTOTransformer; +import de.avatic.lcc.service.transformer.generic.NodeDTOTransformer; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +@Service +public class PackagingTransformerService { + + //TODO refactor to new format + + private final MaterialDTOTransformer materialDTOTransformer; + private final DimensionDTOTransformer dimensionDTOTransformer; + private final NodeDTOTransformer nodeDTOTransformer; + private final PackagingViewPropertyDTOTransformer packagingViewPropertyDTOTransformer; + + public PackagingTransformerService(MaterialDTOTransformer materialDTOTransformer, DimensionDTOTransformer dimensionDTOTransformer, NodeDTOTransformer nodeDTOTransformer, PackagingViewPropertyDTOTransformer packagingViewPropertyDTOTransformer) { + this.materialDTOTransformer = materialDTOTransformer; + this.dimensionDTOTransformer = dimensionDTOTransformer; + this.nodeDTOTransformer = nodeDTOTransformer; + 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(materialDTOTransformer.toMaterialDTO(material.orElseThrow())); + dto.setSupplier(nodeDTOTransformer.toNodeDTO(supplier.orElseThrow())); + dto.setHu(dimensionDTOTransformer.toDimensionDTO(hu.orElseThrow())); + dto.setShu(dimensionDTOTransformer.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 new file mode 100644 index 0000000..18688f3 --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/transformer/packaging/PackagingViewPropertyDTOTransformer.java @@ -0,0 +1,22 @@ +package de.avatic.lcc.service.transformer.packaging; + +import de.avatic.lcc.dto.configuration.packaging.view.PackagingViewPropertyDTO; +import de.avatic.lcc.model.packaging.PackagingProperty; +import org.springframework.stereotype.Service; + +@Service +public class PackagingViewPropertyDTOTransformer { + + public PackagingViewPropertyDTO toPackagingViewPropertyDTO(PackagingProperty property) { + PackagingViewPropertyDTO dto = new PackagingViewPropertyDTO(); + + dto.setCurrentValue(property.getPropertyValue()); + dto.setDataType(property.getPackagingPropertyType().getDataType().name()); + dto.setRequired(property.getPackagingPropertyType().getRequired()); + dto.setName(property.getPackagingPropertyType().getName()); + dto.setExternalMappingId(property.getPackagingPropertyType().getExternalMappingId()); + dto.setValidationRule(property.getPackagingPropertyType().getValidationRule()); + + return dto; + } +} diff --git a/src/main/java/de/avatic/lcc/service/transformer/users/UserDTOTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/users/UserDTOTransformer.java new file mode 100644 index 0000000..1015f92 --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/transformer/users/UserDTOTransformer.java @@ -0,0 +1,18 @@ +package de.avatic.lcc.service.transformer.users; + +import de.avatic.lcc.dto.users.UserDTO; +import de.avatic.lcc.model.users.User; +import org.springframework.stereotype.Service; + +@Service +public class UserDTOTransformer { + + public UserDTO toUserDTO(User entity) { + UserDTO dto = new UserDTO(); + + // todo implement + + return dto; + + } +} diff --git a/src/main/java/de/avatic/lcc/service/users/GroupService.java b/src/main/java/de/avatic/lcc/service/users/GroupService.java new file mode 100644 index 0000000..5ecfe1f --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/users/GroupService.java @@ -0,0 +1,28 @@ +package de.avatic.lcc.service.users; + +import de.avatic.lcc.dto.users.GroupDTO; +import de.avatic.lcc.dto.users.UserDTO; +import de.avatic.lcc.repositories.pagination.SearchQueryResult; +import de.avatic.lcc.repositories.users.GroupRepository; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class GroupService { + private final GroupRepository groupRepository; + + public GroupService(GroupRepository groupRepository) { + this.groupRepository = groupRepository; + } + + + + public void updateGroup(GroupDTO group) { + + } + + public SearchQueryResult listGroups(int page, int limit) { + groupRepository.listGroups() + } +} diff --git a/src/main/java/de/avatic/lcc/service/users/UserService.java b/src/main/java/de/avatic/lcc/service/users/UserService.java new file mode 100644 index 0000000..8f225ee --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/users/UserService.java @@ -0,0 +1,37 @@ +package de.avatic.lcc.service.users; + +import de.avatic.lcc.dto.users.UserDTO; +import de.avatic.lcc.model.users.User; +import de.avatic.lcc.repositories.pagination.SearchQueryPagination; +import de.avatic.lcc.repositories.pagination.SearchQueryResult; +import de.avatic.lcc.repositories.users.UserRepository; +import de.avatic.lcc.service.transformer.users.UserDTOTransformer; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class UserService { + + private final UserRepository userRepository; + private final UserDTOTransformer userDTOTransformer; + + public UserService(UserRepository userRepository, UserDTOTransformer userDTOTransformer) { + this.userRepository = userRepository; + this.userDTOTransformer = userDTOTransformer; + } + + public SearchQueryResult listUsers(int page, int limit) { + return SearchQueryResult.map(userRepository.listUsers(new SearchQueryPagination(page, limit)), userDTOTransformer::toUserDTO); + } + + public void updateUser(UserDTO user) { + + groupRepository.update + userRepository.update(fromUserDTO(user)); + } + + private User fromUserDTO(UserDTO dto) { + return new User(); + } +} diff --git a/src/main/java/de/avatic/lcc/util/Check.java b/src/main/java/de/avatic/lcc/util/Check.java index a9a0706..29766d3 100644 --- a/src/main/java/de/avatic/lcc/util/Check.java +++ b/src/main/java/de/avatic/lcc/util/Check.java @@ -1,5 +1,7 @@ package de.avatic.lcc.util; +import de.avatic.lcc.util.exception.clienterror.InvalidArgumentException; + public class Check { diff --git a/src/main/java/de/avatic/lcc/util/NotFoundException.java b/src/main/java/de/avatic/lcc/util/NotFoundException.java new file mode 100644 index 0000000..21bd7f2 --- /dev/null +++ b/src/main/java/de/avatic/lcc/util/NotFoundException.java @@ -0,0 +1,18 @@ +package de.avatic.lcc.util; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + + +@ResponseStatus(HttpStatus.NOT_FOUND) +public class NotFoundException extends RuntimeException { + + public NotFoundException() { + super(); + } + + public NotFoundException(final String message) { + super(message); + } + +} diff --git a/src/main/java/de/avatic/lcc/util/ReferencedException.java b/src/main/java/de/avatic/lcc/util/ReferencedException.java new file mode 100644 index 0000000..e1d9ec0 --- /dev/null +++ b/src/main/java/de/avatic/lcc/util/ReferencedException.java @@ -0,0 +1,18 @@ +package de.avatic.lcc.util; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + + +@ResponseStatus(HttpStatus.CONFLICT) +public class ReferencedException extends RuntimeException { + + public ReferencedException() { + super(); + } + + public ReferencedException(final ReferencedWarning referencedWarning) { + super(referencedWarning.toMessage()); + } + +} diff --git a/src/main/java/de/avatic/lcc/util/ReferencedWarning.java b/src/main/java/de/avatic/lcc/util/ReferencedWarning.java new file mode 100644 index 0000000..1464404 --- /dev/null +++ b/src/main/java/de/avatic/lcc/util/ReferencedWarning.java @@ -0,0 +1,42 @@ +package de.avatic.lcc.util; + +import java.util.ArrayList; +import java.util.stream.Collectors; + + +public class ReferencedWarning { + + private String key = null; + private ArrayList params = new ArrayList<>(); + + public void addParam(final Object param) { + params.add(param); + } + + public String toMessage() { + String message = key; + if (!params.isEmpty()) { + message += "," + params.stream() + .map(Object::toString) + .collect(Collectors.joining(",")); + } + return message; + } + + public String getKey() { + return key; + } + + public void setKey(final String key) { + this.key = key; + } + + public ArrayList getParams() { + return params; + } + + public void setParams(final ArrayList params) { + this.params = params; + } + +} diff --git a/src/main/java/de/avatic/lcc/util/InvalidArgumentException.java b/src/main/java/de/avatic/lcc/util/exception/clienterror/InvalidArgumentException.java similarity index 66% rename from src/main/java/de/avatic/lcc/util/InvalidArgumentException.java rename to src/main/java/de/avatic/lcc/util/exception/clienterror/InvalidArgumentException.java index e7a730d..b290d37 100644 --- a/src/main/java/de/avatic/lcc/util/InvalidArgumentException.java +++ b/src/main/java/de/avatic/lcc/util/exception/clienterror/InvalidArgumentException.java @@ -1,4 +1,4 @@ -package de.avatic.lcc.util; +package de.avatic.lcc.util.exception.clienterror; public class InvalidArgumentException extends RuntimeException{ @@ -11,4 +11,6 @@ public class InvalidArgumentException extends RuntimeException{ } + public InvalidArgumentException(String nodeDoesNotExists, String s) { + } } diff --git a/src/main/java/de/avatic/lcc/util/exception/clienterror/MaterialNotFoundException.java b/src/main/java/de/avatic/lcc/util/exception/clienterror/MaterialNotFoundException.java new file mode 100644 index 0000000..22c447b --- /dev/null +++ b/src/main/java/de/avatic/lcc/util/exception/clienterror/MaterialNotFoundException.java @@ -0,0 +1,7 @@ +package de.avatic.lcc.util.exception.clienterror; + +public class MaterialNotFoundException extends InvalidArgumentException { + public MaterialNotFoundException(Integer id) { + super("Material does not exists", "Material id "+id); + } +} diff --git a/src/main/java/de/avatic/lcc/util/exception/clienterror/NodeNotFoundException.java b/src/main/java/de/avatic/lcc/util/exception/clienterror/NodeNotFoundException.java new file mode 100644 index 0000000..7df2020 --- /dev/null +++ b/src/main/java/de/avatic/lcc/util/exception/clienterror/NodeNotFoundException.java @@ -0,0 +1,9 @@ +package de.avatic.lcc.util.exception.clienterror; + +public class NodeNotFoundException extends InvalidArgumentException { + + public NodeNotFoundException(final Integer nodeId) { + super("Node does not exists", "Node id "+nodeId); + } + +}