diff --git a/bruno/propify/Projects/Get one by ID.bru b/bruno/propify/Projects/Get one by ID.bru index d594922..d65ddc9 100644 --- a/bruno/propify/Projects/Get one by ID.bru +++ b/bruno/propify/Projects/Get one by ID.bru @@ -5,7 +5,7 @@ meta { } get { - url: {{API_BASE_URL}}/api/{{API_VERSION}}/projects/5dba067e-d7fd-4d79-a08a-ec379834938a + url: {{API_BASE_URL}}/api/{{API_VERSION}}/projects/7da12113-de78-438d-8030-f117c0675acc body: none auth: bearer } diff --git a/src/main/java/de/iwomm/propify_api/controller/ProjectController.java b/src/main/java/de/iwomm/propify_api/controller/ProjectController.java index a7524d1..b9991a1 100644 --- a/src/main/java/de/iwomm/propify_api/controller/ProjectController.java +++ b/src/main/java/de/iwomm/propify_api/controller/ProjectController.java @@ -1,10 +1,11 @@ package de.iwomm.propify_api.controller; +import de.iwomm.propify_api.dto.NewProjectDTO; import de.iwomm.propify_api.dto.ProjectDTO; +import de.iwomm.propify_api.dto.ProjectDetailsDTO; import de.iwomm.propify_api.dto.ProjectStatsDTO; -import de.iwomm.propify_api.dto.PropertyDTO; import de.iwomm.propify_api.entity.Project; -import de.iwomm.propify_api.entity.Property; +import de.iwomm.propify_api.mapper.ProjectMapper; import de.iwomm.propify_api.service.ProjectService; import jakarta.persistence.EntityNotFoundException; import org.springframework.http.ResponseEntity; @@ -19,10 +20,12 @@ import java.util.UUID; @RestController @RequestMapping("/api/v1/projects") public class ProjectController { - private ProjectService projectService; + private final ProjectService projectService; + private final ProjectMapper projectMapper; - public ProjectController(ProjectService projectService) { + public ProjectController(ProjectService projectService, ProjectMapper projectMapper) { this.projectService = projectService; + this.projectMapper = projectMapper; } @GetMapping @@ -38,7 +41,8 @@ public class ProjectController { @PreAuthorize("hasAnyRole('ADMIN', 'USER')") public ResponseEntity getById(@PathVariable UUID id) { try { - ProjectDTO projectDTO = projectService.toDTO(projectService.findById(id).orElseThrow(EntityNotFoundException::new)); + Project project = projectService.findById(id).orElseThrow(EntityNotFoundException::new); + ProjectDetailsDTO projectDTO = this.projectMapper.projectToProjectDetailsDTO(project); return ResponseEntity .ok(projectDTO); @@ -68,9 +72,9 @@ public class ProjectController { @PostMapping @PreAuthorize("hasRole('ADMIN')") - public ResponseEntity create(@RequestBody ProjectDTO projectDTO) { + public ResponseEntity create(@RequestBody NewProjectDTO newProjectDTO) { try { - Project newItem = projectService.save(projectDTO); + Project newItem = projectService.save(newProjectDTO); URI location = ServletUriComponentsBuilder.fromCurrentRequest() .path("/{id}") diff --git a/src/main/java/de/iwomm/propify_api/controller/ProjectStatusController.java b/src/main/java/de/iwomm/propify_api/controller/ProjectStatusController.java new file mode 100644 index 0000000..9f12e60 --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/controller/ProjectStatusController.java @@ -0,0 +1,31 @@ +package de.iwomm.propify_api.controller; + +import de.iwomm.propify_api.dto.ProjectStatusDTO; +import de.iwomm.propify_api.service.ProjectStatusService; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/api/v1/project-statuses") +public class ProjectStatusController { + + private final ProjectStatusService projectStatusService; + + public ProjectStatusController(ProjectStatusService projectStatusService) { + this.projectStatusService = projectStatusService; + } + + @GetMapping + @PreAuthorize("hasAnyRole('ROLE_USER')") + public ResponseEntity getAll() { + List projectStatusDTO = projectStatusService.toDTOs(projectStatusService.findAll()); + + return ResponseEntity + .ok(projectStatusDTO); + } +} diff --git a/src/main/java/de/iwomm/propify_api/controller/ProjectTypeController.java b/src/main/java/de/iwomm/propify_api/controller/ProjectTypeController.java new file mode 100644 index 0000000..4c21701 --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/controller/ProjectTypeController.java @@ -0,0 +1,34 @@ +package de.iwomm.propify_api.controller; + +import de.iwomm.propify_api.dto.ProjectStatusDTO; +import de.iwomm.propify_api.dto.ProjectTypeDTO; +import de.iwomm.propify_api.entity.ProjectType; +import de.iwomm.propify_api.service.ProjectStatusService; +import de.iwomm.propify_api.service.ProjectTypeService; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/api/v1/project-types") +public class ProjectTypeController { + + private final ProjectTypeService projectTypeService; + + public ProjectTypeController(ProjectTypeService projectTypeService) { + this.projectTypeService = projectTypeService; + } + + @GetMapping + @PreAuthorize("hasAnyRole('ROLE_USER')") + public ResponseEntity getAll() { + List projectTypeDTO = projectTypeService.toDTOs(projectTypeService.findAll()); + + return ResponseEntity + .ok(projectTypeDTO); + } +} diff --git a/src/main/java/de/iwomm/propify_api/database/DatabaseSeeder.java b/src/main/java/de/iwomm/propify_api/database/DatabaseSeeder.java index 5c46d2b..1bf87b2 100644 --- a/src/main/java/de/iwomm/propify_api/database/DatabaseSeeder.java +++ b/src/main/java/de/iwomm/propify_api/database/DatabaseSeeder.java @@ -1,29 +1,302 @@ package de.iwomm.propify_api.database; -import de.iwomm.propify_api.entity.Property; -import de.iwomm.propify_api.repository.PropertyRepository; +import de.iwomm.propify_api.entity.*; +import de.iwomm.propify_api.repository.*; +import jakarta.persistence.EntityNotFoundException; import org.springframework.boot.CommandLineRunner; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + @Component @Profile("dev") // Runs only in "dev" environments public class DatabaseSeeder implements CommandLineRunner { private final PropertyRepository propertyRepository; + private final PropertyStatusRepository propertyStatusRepository; + private final ProjectRepository projectRepository; + private final CountryRepository countryRepository; + private final FederalStateRepository federalStateRepository; + private final ProjectTypeRepository projectTypeRepository; + private final ProjectStatusRepository projectStatusRepository; + private final ProjectTimelineEventTypeRepository projectTimelineEventTypeRepository; + private final ProjectTimelineEventRepository projectTimelineEventRepository; - public DatabaseSeeder(PropertyRepository propertyRepository) { + public DatabaseSeeder( + PropertyRepository propertyRepository, + PropertyStatusRepository propertyStatusRepository, + ProjectRepository projectRepository, + CountryRepository countryRepository, + FederalStateRepository federalStateRepository, + ProjectTypeRepository projectTypeRepository, + ProjectStatusRepository projectStatusRepository, + ProjectTimelineEventTypeRepository projectTimelineEventTypeRepository, + ProjectTimelineEventRepository projectTimelineEventRepository + ) { this.propertyRepository = propertyRepository; + this.propertyStatusRepository = propertyStatusRepository; + this.projectRepository = projectRepository; + this.countryRepository = countryRepository; + this.federalStateRepository = federalStateRepository; + this.projectTypeRepository = projectTypeRepository; + this.projectStatusRepository = projectStatusRepository; + this.projectTimelineEventTypeRepository = projectTimelineEventTypeRepository; + this.projectTimelineEventRepository = projectTimelineEventRepository; } @Override public void run(String... args) throws Exception { - if (propertyRepository.count() == 0) { - propertyRepository.save(new Property("Mustergebäude 1", "Musterstraße", "1", "12345", "Musterstadt", "DE", "Musterbemerkung 1")); - propertyRepository.save(new Property("Mustergebäude 2", "Dagobertstraße", "2", "22345", "Entenhausen", "AT", "Musterbemerkung 2")); - propertyRepository.save(new Property("Mustergebäude 3", "Mustersteet", "3", "32345", "New York", "CH", "Musterbemerkung 3")); + int i; + + // Seed countries and federal states + Country countryDe; + Country countryAt; + Country countryCh; + if (this.countryRepository.count() == 0) { + countryDe = this.countryRepository.save(new Country("Deutschland", "DE")); + countryAt = this.countryRepository.save(new Country("Österreich", "AT")); + countryCh = this.countryRepository.save(new Country("Schweiz", "CH")); + System.out.println("Countries seeded."); } else { + countryDe = this.countryRepository.findByCode("DE"); + countryAt = this.countryRepository.findByCode("AT"); + countryCh = this.countryRepository.findByCode("CH"); + System.out.println("Countries already seeded."); } + + // seed federal states + FederalState federalStateDeRp; + FederalState federalStateChAg; + FederalState federalStateAtSt; + if (this.federalStateRepository.count() == 0) { + this.federalStateRepository.save(new FederalState("Baden-Württemberg", "BW", countryDe)); + this.federalStateRepository.save(new FederalState("Bayern", "BY", countryDe)); + this.federalStateRepository.save(new FederalState("Berlin", "BE", countryDe)); + this.federalStateRepository.save(new FederalState("Brandenburg", "BB", countryDe)); + this.federalStateRepository.save(new FederalState("Bremen", "HB", countryDe)); + this.federalStateRepository.save(new FederalState("Hamburg", "HH", countryDe)); + this.federalStateRepository.save(new FederalState("Hessen", "HE", countryDe)); + this.federalStateRepository.save(new FederalState("Mecklenburg-Vorpommern", "MV", countryDe)); + this.federalStateRepository.save(new FederalState("Niedersachsen", "NI", countryDe)); + this.federalStateRepository.save(new FederalState("Nordrhein-Westfalen", "NW", countryDe)); + federalStateDeRp = this.federalStateRepository.save(new FederalState("Rheinland-Pfalz", "RP", countryDe)); + this.federalStateRepository.save(new FederalState("Saarland", "SL", countryDe)); + this.federalStateRepository.save(new FederalState("Sachsen", "SN", countryDe)); + this.federalStateRepository.save(new FederalState("Sachsen-Anhalt", "ST", countryDe)); + this.federalStateRepository.save(new FederalState("Schleswig-Holstein", "SH", countryDe)); + this.federalStateRepository.save(new FederalState("Thüringen", "TH", countryDe)); + + + federalStateChAg = this.federalStateRepository.save(new FederalState("Aargau", "AG", countryCh)); + this.federalStateRepository.save(new FederalState("Appenzell Ausserrhoden", "AR", countryCh)); + this.federalStateRepository.save(new FederalState("Appenzell Innerrhoden", "AI", countryCh)); + this.federalStateRepository.save(new FederalState("Basel-Landschaft", "BL", countryCh)); + this.federalStateRepository.save(new FederalState("Basel-Stadt", "BS", countryCh)); + this.federalStateRepository.save(new FederalState("Bern", "BE", countryCh)); + this.federalStateRepository.save(new FederalState("Freiburg", "FR", countryCh)); + this.federalStateRepository.save(new FederalState("Genf", "GE", countryCh)); + this.federalStateRepository.save(new FederalState("Glarus", "GL", countryCh)); + this.federalStateRepository.save(new FederalState("Graubünden", "GR", countryCh)); + this.federalStateRepository.save(new FederalState("Jura", "JU", countryCh)); + this.federalStateRepository.save(new FederalState("Luzern", "LU", countryCh)); + this.federalStateRepository.save(new FederalState("Neuenburg", "NE", countryCh)); + this.federalStateRepository.save(new FederalState("Nidwalden", "NW", countryCh)); + this.federalStateRepository.save(new FederalState("Obwalden", "OW", countryCh)); + this.federalStateRepository.save(new FederalState("Schaffhausen", "SH", countryCh)); + this.federalStateRepository.save(new FederalState("Schwyz", "SZ", countryCh)); + this.federalStateRepository.save(new FederalState("Solothurn", "SO", countryCh)); + this.federalStateRepository.save(new FederalState("St. Gallen", "SG", countryCh)); + this.federalStateRepository.save(new FederalState("Tessin", "TI", countryCh)); + this.federalStateRepository.save(new FederalState("Thurgau", "TG", countryCh)); + this.federalStateRepository.save(new FederalState("Uri", "UR", countryCh)); + this.federalStateRepository.save(new FederalState("Waadt", "VD", countryCh)); + this.federalStateRepository.save(new FederalState("Wallis", "VS", countryCh)); + this.federalStateRepository.save(new FederalState("Zug", "ZG", countryCh)); + this.federalStateRepository.save(new FederalState("Zürich", "ZH", countryCh)); + + this.federalStateRepository.save(new FederalState("Burgenland", "B", countryAt)); + this.federalStateRepository.save(new FederalState("Kärnten", "K", countryAt)); + this.federalStateRepository.save(new FederalState("Niederösterreich", "N", countryAt)); + this.federalStateRepository.save(new FederalState("Oberösterreich", "O", countryAt)); + this.federalStateRepository.save(new FederalState("Salzburg", "S", countryAt)); + federalStateAtSt = this.federalStateRepository.save(new FederalState("Steiermark", "ST", countryAt)); + this.federalStateRepository.save(new FederalState("Tirol", "T", countryAt)); + this.federalStateRepository.save(new FederalState("Vorarlberg", "V", countryAt)); + this.federalStateRepository.save(new FederalState("Wien", "W", countryAt)); + System.out.println("FederalStates seeded."); + } else { + federalStateDeRp = this.federalStateRepository.findByAbbreviationAndCountry("RP", countryDe); + federalStateAtSt = this.federalStateRepository.findByAbbreviationAndCountry("ST", countryAt); + federalStateChAg = this.federalStateRepository.findByAbbreviationAndCountry("RP", countryCh); + + System.out.println("FederalStates already seeded."); + } + + // seed property statuses + PropertyStatus ps1; + PropertyStatus ps2; + PropertyStatus ps3; + if (this.propertyStatusRepository.count() == 0) { + i = 1; + ps1 = this.propertyStatusRepository.save(new PropertyStatus("Datenerfassung", i++)); + ps2 = this.propertyStatusRepository.save(new PropertyStatus("Vor-Ort-Aufnahme", i++)); + ps3 = this.propertyStatusRepository.save(new PropertyStatus("CAD-Modellierung", i++)); + this.propertyStatusRepository.save(new PropertyStatus("Bilanzierung", i++)); + this.propertyStatusRepository.save(new PropertyStatus("Erfasst", i++)); + this.propertyStatusRepository.save(new PropertyStatus("Problem", i++)); + + System.out.println("PropertyStatuses seeded."); + } else { + ps1 = this.propertyStatusRepository.findByName("Datenerfassung"); + ps2 = this.propertyStatusRepository.findByName("Vor-Ort-Aufnahme"); + ps3 = this.propertyStatusRepository.findByName("CAD-Modellierung"); + + System.out.println("PropertyStatuses already seeded."); + } + + + Property prop1; + Property prop2; + Property prop3; + if (propertyRepository.count() == 0) { + prop1 = propertyRepository.save(new Property("Mustergebäude 1", "Musterstraße", "1", "12345", "Musterstadt", federalStateDeRp, "Musterbemerkung 1", ps1)); + prop2 = propertyRepository.save(new Property("Mustergebäude 2", "Dagobertstraße", "2", "22345", "Entenhausen", federalStateAtSt, "Musterbemerkung 2", ps2)); + prop3 = propertyRepository.save(new Property("Mustergebäude 3", "Mustersteet", "3", "32345", "New York", federalStateChAg, "Musterbemerkung 3", ps3)); + + System.out.println("Properties seeded."); + } else { + prop1 = this.propertyRepository.findByName("Mustergebäude 1").orElseThrow(EntityNotFoundException::new); + prop2 = this.propertyRepository.findByName("Mustergebäude 2").orElseThrow(EntityNotFoundException::new); + prop3 = this.propertyRepository.findByName("Mustergebäude 3").orElseThrow(EntityNotFoundException::new); + + System.out.println("Properties already seeded."); + } + + + // seed project statuses + i = 1; + ProjectStatus projectStatus1; + ProjectStatus projectStatus2; + ProjectStatus projectStatus3; + ProjectStatus projectStatus4; + if (this.projectStatusRepository.count() == 0) { + projectStatus1 = this.projectStatusRepository.save(new ProjectStatus("Vorbereitung", i++)); + projectStatus2 = this.projectStatusRepository.save(new ProjectStatus("Aktiv", i++)); + projectStatus3 = this.projectStatusRepository.save(new ProjectStatus("Abgeschlossen", i++)); + projectStatus4 = this.projectStatusRepository.save(new ProjectStatus("Problem", i++)); + + System.out.println("ProjectStatus already seeded."); + } else { + projectStatus1 = this.projectStatusRepository.findByName("Vorbereitung").orElseThrow(EntityNotFoundException::new); + projectStatus2 = this.projectStatusRepository.findByName("Aktiv").orElseThrow(EntityNotFoundException::new); + projectStatus3 = this.projectStatusRepository.findByName("Abgeschlossen").orElseThrow(EntityNotFoundException::new); + projectStatus4 = this.projectStatusRepository.findByName("Problem").orElseThrow(EntityNotFoundException::new); + + System.out.println("ProjectStatus already seeded."); + } + + // seed project types + i = 1; + ProjectType projType1; + ProjectType projType2; + ProjectType projType3; + ProjectType projType4; + ProjectType projType5; + ProjectType projType6; + ProjectType projType7; + ProjectType projType8; + ProjectType projType9; + + if (this.projectTypeRepository.count() == 0) { + projType1 = this.projectTypeRepository.save(new ProjectType("Energieberatung WG (iSFP)", i++)); + projType2 = this.projectTypeRepository.save(new ProjectType("Energieberatung NWG (Modul2)", i++)); + projType3 = this.projectTypeRepository.save(new ProjectType("Einzelmaßnahmen", i++)); + projType4 = this.projectTypeRepository.save(new ProjectType("Effizienzhaus Sanierung", i++)); + projType5 = this.projectTypeRepository.save(new ProjectType("Effizienzhaus Neubau", i++)); + projType6 = this.projectTypeRepository.save(new ProjectType("Energieausweis", i++)); + projType7 = this.projectTypeRepository.save(new ProjectType("Fachplanung Bauphysik", i++)); + projType8 = this.projectTypeRepository.save(new ProjectType("Fachplanung Heizung", i++)); + projType9 = this.projectTypeRepository.save(new ProjectType("Zertifizierung", i++)); + + System.out.println("Properties seeded."); + } else { + projType1 = this.projectTypeRepository.findByName("Energieberatung WG (iSFP)").orElseThrow(EntityNotFoundException::new); + projType2 = this.projectTypeRepository.findByName("Energieberatung NWG (Modul2)").orElseThrow(EntityNotFoundException::new); + projType3 = this.projectTypeRepository.findByName("Einzelmaßnahmen").orElseThrow(EntityNotFoundException::new); + projType4 = this.projectTypeRepository.findByName("Effizienzhaus Sanierung").orElseThrow(EntityNotFoundException::new); + projType5 = this.projectTypeRepository.findByName("Effizienzhaus Neubau").orElseThrow(EntityNotFoundException::new); + projType6 = this.projectTypeRepository.findByName("Energieausweis").orElseThrow(EntityNotFoundException::new); + projType7 = this.projectTypeRepository.findByName("Fachplanung Bauphysik").orElseThrow(EntityNotFoundException::new); + projType8 = this.projectTypeRepository.findByName("Fachplanung Heizung").orElseThrow(EntityNotFoundException::new); + projType9 = this.projectTypeRepository.findByName("Zertifizierung").orElseThrow(EntityNotFoundException::new); + + System.out.println("Properties already seeded."); + } + + // seed project timeline event types + ProjectTimelineEventType type1; + ProjectTimelineEventType type2; + ProjectTimelineEventType type3; + ProjectTimelineEventType type4; + ProjectTimelineEventType type5; + ProjectTimelineEventType type6; + if (this.projectTimelineEventTypeRepository.count() == 0) { + type1 = this.projectTimelineEventTypeRepository.save(new ProjectTimelineEventType("Allgemeines Ereignis", "#df3422", "")); + type2 = this.projectTimelineEventTypeRepository.save(new ProjectTimelineEventType("Termin (wird im Kalender angezeigt)", "#df3422", "")); + type3 = this.projectTimelineEventTypeRepository.save(new ProjectTimelineEventType("Meilenstein", "#df3422", "")); + type4 = this.projectTimelineEventTypeRepository.save(new ProjectTimelineEventType("Besprechung", "#df3422", "")); + type5 = this.projectTimelineEventTypeRepository.save(new ProjectTimelineEventType("Begehung", "#df3422", "")); + type6 = this.projectTimelineEventTypeRepository.save(new ProjectTimelineEventType("Benutzer definiert", "#df3422", "")); + + System.out.println("ProjectTimelineEventTypes seeded."); + } else { + type1 = this.projectTimelineEventTypeRepository.findByName("Allgemeines Ereignis"); + type2 = this.projectTimelineEventTypeRepository.findByName("Termin (wird im Kalender angezeigt)"); + type3 = this.projectTimelineEventTypeRepository.findByName("Meilenstein"); + type4 = this.projectTimelineEventTypeRepository.findByName("Besprechung"); + type5 = this.projectTimelineEventTypeRepository.findByName("Begehung"); + type6 = this.projectTimelineEventTypeRepository.findByName("Benutzer definiert"); + + System.out.println("ProjectTimelineEventTypes already seeded."); + } + + // seed projects + Project proj1; + if (this.projectRepository.count() == 0) { + LocalDate startDate = LocalDate.now().minusDays(13); + LocalDate endDate = LocalDate.now().plusDays(700); + + + proj1 = new Project( + "Projekt 1", "2024-001", "Dies ist die erste Projektbeschreibung", projType1, projectStatus2, prop2, + 27000, startDate, endDate + ); + proj1.addTimelineEvent(new ProjectTimelineEvent("Geplantes Ende", LocalDateTime.now().minusDays(3), "Description 1", type1, new ArrayList<>())); + proj1.addTimelineEvent(new ProjectTimelineEvent("Vor Ort Aufnahme", LocalDateTime.now().minusDays(3), "Alles in Ordnung", type5, new ArrayList<>())); + proj1.addTimelineEvent(new ProjectTimelineEvent("Projekt erstellt", LocalDateTime.now().minusDays(3), "Projekt wurde erfolgreich erstellt.", type5, new ArrayList<>())); + proj1.addTimelineEvent(new ProjectTimelineEvent("Projekt gestartet", LocalDateTime.now().minusDays(3), "Projekt wurde gestartet.", type5, new ArrayList<>(List.of("/path/to/file.pdf")))); + + proj1 = this.projectRepository.save(proj1); + + this.projectRepository.save(new Project( + "Projekt 2", "2024-002", "Dies ist die zweite Projektbeschreibung", projType2, projectStatus3, prop1, + 31000, startDate, endDate + )); + + System.out.println("Projects seeded."); + } else { + proj1 = this.projectRepository.findByName("Projekt 1").orElseThrow(EntityNotFoundException::new); + + System.out.println("Projects already seeded."); + } + + + + System.out.println("Database seeding completed."); } } \ No newline at end of file diff --git a/src/main/java/de/iwomm/propify_api/dto/NewProjectDTO.java b/src/main/java/de/iwomm/propify_api/dto/NewProjectDTO.java new file mode 100644 index 0000000..606789b --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/dto/NewProjectDTO.java @@ -0,0 +1,88 @@ +package de.iwomm.propify_api.dto; + +import java.time.LocalDate; +import java.util.UUID; + +public class NewProjectDTO { + private int amountRequested; + private String description; + private LocalDate startDate; + private LocalDate endDate; + private String eventNumber; + private String name; + private UUID projectTypeId; + private UUID statusId; + private UUID propertyId; + + public int getAmountRequested() { + return amountRequested; + } + + public void setAmountRequested(int amountRequested) { + this.amountRequested = amountRequested; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public LocalDate getStartDate() { + return startDate; + } + + public void setStartDate(LocalDate startDate) { + this.startDate = startDate; + } + + public LocalDate getEndDate() { + return endDate; + } + + public void setEndDate(LocalDate endDate) { + this.endDate = endDate; + } + + public String getEventNumber() { + return eventNumber; + } + + public void setEventNumber(String eventNumber) { + this.eventNumber = eventNumber; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public UUID getProjectTypeId() { + return projectTypeId; + } + + public void setProjectTypeId(UUID projectTypeId) { + this.projectTypeId = projectTypeId; + } + + public UUID getStatusId() { + return statusId; + } + + public void setStatusId(UUID statusId) { + this.statusId = statusId; + } + + public UUID getPropertyId() { + return propertyId; + } + + public void setPropertyId(UUID propertyId) { + this.propertyId = propertyId; + } +} diff --git a/src/main/java/de/iwomm/propify_api/dto/ProjectDTO.java b/src/main/java/de/iwomm/propify_api/dto/ProjectDTO.java index 5cd538f..f3f1089 100644 --- a/src/main/java/de/iwomm/propify_api/dto/ProjectDTO.java +++ b/src/main/java/de/iwomm/propify_api/dto/ProjectDTO.java @@ -11,8 +11,10 @@ public class ProjectDTO { private String name; private String eventNumber; private String description; - private String projectType; - private String status; + private ProjectTypeDTO projectType; + private UUID projectTypeId; + private ProjectStatusDTO status; + private UUID statusId; private UUID propertyId; private int amountRequested; private LocalDate startDate; @@ -20,9 +22,19 @@ public class ProjectDTO { private PropertyDTO property; private LocalDateTime createdAt; - public ProjectDTO(UUID id, String name, String eventNumber, String description, String projectType, - String status, UUID propertyId, int amountRequested, - LocalDate startDate, LocalDate endDate, LocalDateTime createdAt, PropertyDTO propertyDTO) { + public ProjectDTO(UUID id, + String name, + String eventNumber, + String description, + ProjectTypeDTO projectType, + ProjectStatusDTO status, + UUID propertyId, + int amountRequested, + LocalDate startDate, + LocalDate endDate, + LocalDateTime createdAt, + PropertyDTO propertyDTO + ) { this.id = id; this.name = name; this.eventNumber = eventNumber; @@ -69,19 +81,19 @@ public class ProjectDTO { this.description = description; } - public String getProjectType() { + public ProjectTypeDTO getProjectType() { return projectType; } - public void setProjectType(String projectType) { + public void setProjectType(ProjectTypeDTO projectType) { this.projectType = projectType; } - public String getStatus() { + public ProjectStatusDTO getStatus() { return status; } - public void setStatus(String status) { + public void setStatus(ProjectStatusDTO status) { this.status = status; } diff --git a/src/main/java/de/iwomm/propify_api/dto/ProjectDetailsDTO.java b/src/main/java/de/iwomm/propify_api/dto/ProjectDetailsDTO.java new file mode 100644 index 0000000..2b83dcb --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/dto/ProjectDetailsDTO.java @@ -0,0 +1,20 @@ +package de.iwomm.propify_api.dto; + +import java.time.LocalDate; +import java.util.List; +import java.util.UUID; + +public record ProjectDetailsDTO( + UUID id, + String name, + String eventNumber, + String status, + String projectType, + String description, + int amountRequested, + String address, + LocalDate startDate, + LocalDate endDate, + List timelineEvents +) { +} diff --git a/src/main/java/de/iwomm/propify_api/dto/ProjectStatusDTO.java b/src/main/java/de/iwomm/propify_api/dto/ProjectStatusDTO.java new file mode 100644 index 0000000..038eae1 --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/dto/ProjectStatusDTO.java @@ -0,0 +1,39 @@ +package de.iwomm.propify_api.dto; + +import de.iwomm.propify_api.entity.ProjectStatus; + +import java.util.UUID; + +public class ProjectStatusDTO { + private UUID id; + private String name; + + public ProjectStatusDTO() { + } + + public ProjectStatusDTO(ProjectStatus status) { + this.id = status.getId(); + this.name = status.getName(); + } + + public ProjectStatusDTO(UUID id, String name) { + this.id = id; + this.name = name; + } + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/src/main/java/de/iwomm/propify_api/dto/ProjectTimelineEventDTO.java b/src/main/java/de/iwomm/propify_api/dto/ProjectTimelineEventDTO.java new file mode 100644 index 0000000..1b39408 --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/dto/ProjectTimelineEventDTO.java @@ -0,0 +1,15 @@ +package de.iwomm.propify_api.dto; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.UUID; + +public record ProjectTimelineEventDTO( + UUID id, + ProjectTimelineEventTypeDTO projectEventType, + String title, + LocalDateTime date, + String description, + List documents +) { +} diff --git a/src/main/java/de/iwomm/propify_api/dto/ProjectTimelineEventTypeDTO.java b/src/main/java/de/iwomm/propify_api/dto/ProjectTimelineEventTypeDTO.java new file mode 100644 index 0000000..1930e29 --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/dto/ProjectTimelineEventTypeDTO.java @@ -0,0 +1,11 @@ +package de.iwomm.propify_api.dto; + +import java.util.UUID; + +public record ProjectTimelineEventTypeDTO( + UUID id, + String name, + String color, + String icon +) { +} diff --git a/src/main/java/de/iwomm/propify_api/dto/ProjectTypeDTO.java b/src/main/java/de/iwomm/propify_api/dto/ProjectTypeDTO.java new file mode 100644 index 0000000..3bc708c --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/dto/ProjectTypeDTO.java @@ -0,0 +1,34 @@ +package de.iwomm.propify_api.dto; + +import de.iwomm.propify_api.entity.ProjectType; + +import java.util.UUID; + +public class ProjectTypeDTO { + private UUID id; + private String name; + + public ProjectTypeDTO() { + } + + public ProjectTypeDTO(ProjectType projectType) { + this.id = projectType.getId(); + this.name = projectType.getName(); + } + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/src/main/java/de/iwomm/propify_api/dto/PropertyDTO.java b/src/main/java/de/iwomm/propify_api/dto/PropertyDTO.java index d12d9fe..6630be8 100644 --- a/src/main/java/de/iwomm/propify_api/dto/PropertyDTO.java +++ b/src/main/java/de/iwomm/propify_api/dto/PropertyDTO.java @@ -1,5 +1,8 @@ package de.iwomm.propify_api.dto; +import de.iwomm.propify_api.entity.FederalState; +import de.iwomm.propify_api.entity.PropertyStatus; + import java.util.List; import java.util.UUID; @@ -10,21 +13,25 @@ public class PropertyDTO { private String houseNumber; private String zipCode; private String city; - private String country; + private FederalState federalState; private String notes; private List attachments; + private PropertyStatusDTO propertyStatus; - public PropertyDTO(UUID id, String name, String street, String houseNumber, String zipCode, String city, String country, String notes, List attachments) { + public PropertyDTO(UUID id, String name, String street, String houseNumber, + String zipCode, String city, FederalState federalState, String notes, + List attachments, PropertyStatusDTO propertyStatus) { this.id = id; this.name = name; this.street = street; this.houseNumber = houseNumber; this.zipCode = zipCode; this.city = city; - this.country = country; + this.federalState = federalState; this.notes = notes; this.attachments = attachments; + this.propertyStatus = propertyStatus; } public UUID getId() { @@ -83,14 +90,6 @@ public class PropertyDTO { this.notes = notes; } - public String getCountry() { - return country; - } - - public void setCountry(String country) { - this.country = country; - } - public List getAttachments() { return attachments; } @@ -98,4 +97,20 @@ public class PropertyDTO { public void setAttachments(List attachments) { this.attachments = attachments; } + + public PropertyStatusDTO getPropertyStatus() { + return propertyStatus; + } + + public void setPropertyStatus(PropertyStatusDTO propertyStatus) { + this.propertyStatus = propertyStatus; + } + + public FederalState getFederalState() { + return federalState; + } + + public void setFederalState(FederalState federalState) { + this.federalState = federalState; + } } diff --git a/src/main/java/de/iwomm/propify_api/dto/PropertyStatusDTO.java b/src/main/java/de/iwomm/propify_api/dto/PropertyStatusDTO.java new file mode 100644 index 0000000..ac8d6dd --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/dto/PropertyStatusDTO.java @@ -0,0 +1,47 @@ +package de.iwomm.propify_api.dto; + +import java.util.UUID; + +public class PropertyStatusDTO { + private UUID id; + private String name; + private int order; + + public PropertyStatusDTO() { + } + + public PropertyStatusDTO(UUID id, String name, int order) { + this.id = id; + this.name = name; + this.order = order; + } + + public PropertyStatusDTO(String name, int order) { + this.name = name; + this.order = order; + } + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getOrder() { + return order; + } + + public void setOrder(int order) { + this.order = order; + } +} diff --git a/src/main/java/de/iwomm/propify_api/entity/Country.java b/src/main/java/de/iwomm/propify_api/entity/Country.java new file mode 100644 index 0000000..725ab0a --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/entity/Country.java @@ -0,0 +1,50 @@ +package de.iwomm.propify_api.entity; + +import jakarta.persistence.*; + +import java.util.Set; +import java.util.UUID; + +@Entity +public class Country { + @Id + @GeneratedValue(strategy = GenerationType.UUID) + @Column(nullable = false) + private UUID id; + + private String name; + + private String code; + + public Country() { + } + + public Country(String name, String code) { + this.name = name; + this.code = code; + } + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } +} diff --git a/src/main/java/de/iwomm/propify_api/entity/EntityTemplate.java b/src/main/java/de/iwomm/propify_api/entity/EntityTemplate.java new file mode 100644 index 0000000..b96e4a0 --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/entity/EntityTemplate.java @@ -0,0 +1,49 @@ +package de.iwomm.propify_api.entity; + +import jakarta.persistence.*; + +import java.time.LocalDateTime; +import java.util.UUID; + +// @Entity +public class EntityTemplate { + @Id + @GeneratedValue(strategy = GenerationType.UUID) + @Column(nullable = false) + private UUID id; + + // insert other properties here + + @Column(nullable = false) + private LocalDateTime createdAt; + + private LocalDateTime updatedAt; + + @PrePersist + protected void onCreate() { + this.createdAt = LocalDateTime.now(); + this.updatedAt = LocalDateTime.now(); + } + + @PreUpdate + protected void onUpdate() { + this.updatedAt = LocalDateTime.now(); + } + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + + public LocalDateTime getUpdatedAt() { + return updatedAt; + } +} diff --git a/src/main/java/de/iwomm/propify_api/entity/FederalState.java b/src/main/java/de/iwomm/propify_api/entity/FederalState.java new file mode 100644 index 0000000..df3255e --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/entity/FederalState.java @@ -0,0 +1,96 @@ +package de.iwomm.propify_api.entity; + +import jakarta.persistence.*; + +import java.time.LocalDateTime; +import java.util.UUID; + +@Entity +public class FederalState { + @Id + @GeneratedValue(strategy = GenerationType.UUID) + @Column(nullable = false) + private UUID id; + + private String name; + + private String abbreviation; + + + @ManyToOne(cascade = CascadeType.REMOVE, optional = false) + @JoinColumn(nullable = false) + private Country country; + + private LocalDateTime createdAt; + + private LocalDateTime updatedAt; + + public FederalState(String name, String abbreviation, Country country) { + this.name = name; + this.abbreviation = abbreviation; + this.country = country; + } + + public FederalState() { + + } + + public void setCountry(Country country) { + this.country = country; + } + + public Country getCountry() { + return country; + } + + @PrePersist + protected void onCreate() { + this.createdAt = LocalDateTime.now(); + this.updatedAt = LocalDateTime.now(); + } + + @PreUpdate + protected void onUpdate() { + this.updatedAt = LocalDateTime.now(); + } + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(LocalDateTime createdAt) { + this.createdAt = createdAt; + } + + public LocalDateTime getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(LocalDateTime updatedAt) { + this.updatedAt = updatedAt; + } + + public String getAbbreviation() { + return abbreviation; + } + + public void setAbbreviation(String abbreviation) { + this.abbreviation = abbreviation; + } +} diff --git a/src/main/java/de/iwomm/propify_api/entity/Person.java b/src/main/java/de/iwomm/propify_api/entity/Person.java new file mode 100644 index 0000000..4f8138a --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/entity/Person.java @@ -0,0 +1,4 @@ +package de.iwomm.propify_api.entity; + +import jakarta.persistence.Entity; + diff --git a/src/main/java/de/iwomm/propify_api/entity/Project.java b/src/main/java/de/iwomm/propify_api/entity/Project.java index 4c2e343..8743ddb 100644 --- a/src/main/java/de/iwomm/propify_api/entity/Project.java +++ b/src/main/java/de/iwomm/propify_api/entity/Project.java @@ -5,6 +5,8 @@ import jakarta.persistence.*; import java.time.LocalDate; import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; import java.util.UUID; @Entity @@ -14,11 +16,21 @@ public class Project { @Column(nullable = false) private UUID id; + @Column(nullable = false) private String name; - private String eventNumber; + + private String eventNumber; // Vorgangsnummer private String description; - private String projectType; - private String status; + + + @ManyToOne(optional = false) + @JoinColumn(nullable = false) + private ProjectType projectType; + + + @ManyToOne(optional = false) + @JoinColumn(nullable = false) + private ProjectStatus projectStatus; @Column(nullable = false) private int amountRequested; @@ -34,23 +46,26 @@ public class Project { private LocalDateTime updatedAt; - @ManyToOne(cascade = CascadeType.PERSIST, optional = false) + @ManyToOne(optional = false) @JoinColumn(name = "property_id", nullable = false) @JsonManagedReference private Property property; + @OneToMany(mappedBy = "project", cascade = CascadeType.ALL, orphanRemoval = true) + private List timelineEvents = new ArrayList<>(); + public Project() { this.amountRequested = 0; } - public Project(String name, String eventNumber, String description, String projectType, - String status, Property property, int amountRequested, + public Project(String name, String eventNumber, String description, ProjectType projectType, + ProjectStatus status, Property property, int amountRequested, LocalDate startDate, LocalDate endDate) { this.name = name; this.eventNumber = eventNumber; this.description = description; this.projectType = projectType; - this.status = status; + this.projectStatus = status; this.property = property; this.amountRequested = amountRequested; this.startDate = startDate; @@ -100,22 +115,6 @@ public class Project { this.description = description; } - public String getProjectType() { - return projectType; - } - - public void setProjectType(String projectType) { - this.projectType = projectType; - } - - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - public int getAmountRequested() { return amountRequested; } @@ -163,4 +162,34 @@ public class Project { public void setUpdatedAt(LocalDateTime updatedAt) { this.updatedAt = updatedAt; } + + public ProjectType getProjectType() { + return projectType; + } + + public void setProjectType(ProjectType projectType) { + this.projectType = projectType; + } + + public ProjectStatus getProjectStatus() { + return projectStatus; + } + + public void setProjectStatus(ProjectStatus status) { + this.projectStatus = status; + } + + public List getTimelineEvents() { + return timelineEvents; + } + + public void setTimelineEvents(List timelineEvents) { + this.timelineEvents = timelineEvents; + } + + public void addTimelineEvent(ProjectTimelineEvent projectTimelineEvent) { + projectTimelineEvent.setProject(this); + + this.timelineEvents.add(projectTimelineEvent); + } } diff --git a/src/main/java/de/iwomm/propify_api/entity/ProjectStatus.java b/src/main/java/de/iwomm/propify_api/entity/ProjectStatus.java new file mode 100644 index 0000000..ad32965 --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/entity/ProjectStatus.java @@ -0,0 +1,77 @@ +package de.iwomm.propify_api.entity; + +import jakarta.persistence.*; + +import java.time.LocalDateTime; +import java.util.UUID; + +@Entity +public class ProjectStatus { + @Id + @GeneratedValue(strategy = GenerationType.UUID) + @Column(nullable = false) + private UUID id; + + @Column(nullable = false) + private String name; + + @Column(nullable = false) + private int sortOrder; + + @Column(nullable = false) + private LocalDateTime createdAt; + + private LocalDateTime updatedAt; + + public ProjectStatus() { + } + + public ProjectStatus(String name, int sortOrder) { + this.name = name; + this.sortOrder = sortOrder; + } + + @PrePersist + protected void onCreate() { + this.createdAt = LocalDateTime.now(); + this.updatedAt = LocalDateTime.now(); + } + + @PreUpdate + protected void onUpdate() { + this.updatedAt = LocalDateTime.now(); + } + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + + public LocalDateTime getUpdatedAt() { + return updatedAt; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getSortOrder() { + return sortOrder; + } + + public void setSortOrder(int sortOrder) { + this.sortOrder = sortOrder; + } +} diff --git a/src/main/java/de/iwomm/propify_api/entity/ProjectTimelineEvent.java b/src/main/java/de/iwomm/propify_api/entity/ProjectTimelineEvent.java new file mode 100644 index 0000000..ad12c35 --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/entity/ProjectTimelineEvent.java @@ -0,0 +1,133 @@ +package de.iwomm.propify_api.entity; + +import jakarta.persistence.*; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.type.SqlTypes; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.UUID; + +@Entity +public class ProjectTimelineEvent { + @Id + @GeneratedValue(strategy = GenerationType.UUID) + @Column(nullable = false) + private UUID id; + + String title; + LocalDateTime date; + String description; + + @ManyToOne + @JoinColumn(name = "project_timeline_event_type_id") + ProjectTimelineEventType projectTimelineEventType; + + @ManyToOne(optional = false, fetch = FetchType.LAZY) + @JoinColumn(name = "project_id", nullable = false) + Project project; + + @JdbcTypeCode(SqlTypes.JSON) + @Column(columnDefinition = "jsonb") + List documents; + + @Column(nullable = false) + private LocalDateTime createdAt; + + private LocalDateTime updatedAt; + + public ProjectTimelineEvent() { + } + + public ProjectTimelineEvent( + String title, + LocalDateTime date, + String description, + ProjectTimelineEventType projectTimelineEventType, + List documents + ) { + this.title = title; + this.date = date; + this.description = description; + this.projectTimelineEventType = projectTimelineEventType; + this.documents = documents; + } + + public ProjectTimelineEventType getProjectTimelineEventType() { + return projectTimelineEventType; + } + + public void setProjectTimelineEventType(ProjectTimelineEventType projectTimelineEventType) { + this.projectTimelineEventType = projectTimelineEventType; + } + + public void setProject(Project project) { + this.project = project; + } + + public Project getProject() { + return project; + } + + @PrePersist + protected void onCreate() { + this.createdAt = LocalDateTime.now(); + this.updatedAt = LocalDateTime.now(); + } + + @PreUpdate + protected void onUpdate() { + this.updatedAt = LocalDateTime.now(); + } + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + + public LocalDateTime getUpdatedAt() { + return updatedAt; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public LocalDateTime getDate() { + return date; + } + + public void setDate(LocalDateTime date) { + this.date = date; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public List getDocuments() { + return documents; + } + + public void setDocuments(List documents) { + this.documents = documents; + } + + +} diff --git a/src/main/java/de/iwomm/propify_api/entity/ProjectTimelineEventType.java b/src/main/java/de/iwomm/propify_api/entity/ProjectTimelineEventType.java new file mode 100644 index 0000000..b06285d --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/entity/ProjectTimelineEventType.java @@ -0,0 +1,84 @@ +package de.iwomm.propify_api.entity; + +import jakarta.persistence.*; + +import java.time.LocalDateTime; +import java.util.UUID; + +@Entity +public class ProjectTimelineEventType { + @Id + @GeneratedValue(strategy = GenerationType.UUID) + @Column(nullable = false) + private UUID id; + + String name; + String color; + String icon; + + @Column(nullable = false) + private LocalDateTime createdAt; + + private LocalDateTime updatedAt; + + public ProjectTimelineEventType() { + } + + public ProjectTimelineEventType(String name, String color, String icon) { + this.name = name; + this.color = color; + this.icon = icon; + } + + @PrePersist + protected void onCreate() { + this.createdAt = LocalDateTime.now(); + this.updatedAt = LocalDateTime.now(); + } + + @PreUpdate + protected void onUpdate() { + this.updatedAt = LocalDateTime.now(); + } + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + + public LocalDateTime getUpdatedAt() { + return updatedAt; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } +} diff --git a/src/main/java/de/iwomm/propify_api/entity/ProjectType.java b/src/main/java/de/iwomm/propify_api/entity/ProjectType.java new file mode 100644 index 0000000..f5eeeb2 --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/entity/ProjectType.java @@ -0,0 +1,75 @@ +package de.iwomm.propify_api.entity; + +import jakarta.persistence.*; + +import java.time.LocalDateTime; +import java.util.UUID; + +@Entity +public class ProjectType { + @Id + @GeneratedValue(strategy = GenerationType.UUID) + @Column(nullable = false) + private UUID id; + + private String name; + + private int sortOrder; + + public ProjectType() { + } + + public ProjectType(String name, int sortOrder) { + this.name = name; + this.sortOrder = sortOrder; + } + + @Column(nullable = false) + private LocalDateTime createdAt; + + private LocalDateTime updatedAt; + + @PrePersist + protected void onCreate() { + this.createdAt = LocalDateTime.now(); + this.updatedAt = LocalDateTime.now(); + } + + @PreUpdate + protected void onUpdate() { + this.updatedAt = LocalDateTime.now(); + } + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + + public LocalDateTime getUpdatedAt() { + return updatedAt; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getSortOrder() { + return sortOrder; + } + + public void setSortOrder(int sortOrder) { + this.sortOrder = sortOrder; + } +} diff --git a/src/main/java/de/iwomm/propify_api/entity/Property.java b/src/main/java/de/iwomm/propify_api/entity/Property.java index 73fbbe5..f960f6b 100644 --- a/src/main/java/de/iwomm/propify_api/entity/Property.java +++ b/src/main/java/de/iwomm/propify_api/entity/Property.java @@ -2,6 +2,7 @@ package de.iwomm.propify_api.entity; import com.fasterxml.jackson.annotation.JsonBackReference; import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; import java.time.LocalDateTime; import java.util.ArrayList; @@ -17,6 +18,8 @@ public class Property { @Column(nullable = false) private String name; + private String owner; + @Column(nullable = false) private String street; @@ -29,10 +32,18 @@ public class Property { @Column(nullable = false) private String city; + + @ManyToOne + @JoinColumn(name = "federal_state_id") + private FederalState federalState; + private String notes; @Column(nullable = false) - private String country; + private int yearOfConstruction; // baujahr + + @Column(nullable = false) + private int unitCount; // anzahl einheiten @OneToMany(mappedBy = "property", orphanRemoval = true) @OrderBy("fileName") @@ -48,6 +59,18 @@ public class Property { @JsonBackReference private List projects = new ArrayList<>(); + @ManyToOne(optional = false) + @JoinColumn(name = "property_status_id", nullable = false) + private PropertyStatus propertyStatus; + + public PropertyStatus getPropertyStatus() { + return propertyStatus; + } + + public void setPropertyStatus(PropertyStatus propertyStatus) { + this.propertyStatus = propertyStatus; + } + public List getProjects() { return projects; } @@ -67,14 +90,19 @@ public class Property { public Property() {} - public Property(String name, String street, String houseNumber, String zipCode, String city, String country, String notes) { + public Property( + String name, String street, String houseNumber, + String zipCode, String city, + FederalState federalState, + String notes, PropertyStatus propertyStatus) { this.name = name; this.street = street; this.houseNumber = houseNumber; this.zipCode = zipCode; this.city = city; - this.country = country; + this.federalState = federalState; this.notes = notes; + this.propertyStatus = propertyStatus; } @PrePersist @@ -152,14 +180,6 @@ public class Property { this.city = city; } - public String getCountry() { - return country; - } - - public void setCountry(String country) { - this.country = country; - } - public String getNotes() { return this.notes; } @@ -167,4 +187,36 @@ public class Property { public void setNotes(String notes) { this.notes = notes; } + + public String getOwner() { + return owner; + } + + public void setOwner(String owner) { + this.owner = owner; + } + + public int getYearOfConstruction() { + return yearOfConstruction; + } + + public void setYearOfConstruction(int yearOfConstruction) { + this.yearOfConstruction = yearOfConstruction; + } + + public int getUnitCount() { + return unitCount; + } + + public void setUnitCount(int unitCount) { + this.unitCount = unitCount; + } + + public FederalState getFederalState() { + return federalState; + } + + public void setFederalState(FederalState federalState) { + this.federalState = federalState; + } } diff --git a/src/main/java/de/iwomm/propify_api/entity/PropertyStatus.java b/src/main/java/de/iwomm/propify_api/entity/PropertyStatus.java new file mode 100644 index 0000000..bd4da24 --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/entity/PropertyStatus.java @@ -0,0 +1,65 @@ +package de.iwomm.propify_api.entity; + +import jakarta.persistence.*; + +import java.util.LinkedHashSet; +import java.util.Set; +import java.util.UUID; + +@Entity +public class PropertyStatus { + @Id + @GeneratedValue(strategy = GenerationType.UUID) + @Column(nullable = false) + private UUID id; + + @Column(nullable = false) + private String name; + + @Column(nullable = false) + private int sortOrder; + + @OneToMany(mappedBy = "propertyStatus", orphanRemoval = true) + private Set properties = new LinkedHashSet<>(); + + public PropertyStatus() { + + } + + public Set getProperties() { + return properties; + } + + public void setProperties(Set properties) { + this.properties = properties; + } + + public PropertyStatus(String name, int sortOrder) { + this.name = name; + this.sortOrder = sortOrder; + } + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getSortOrder() { + return sortOrder; + } + + public void setSortOrder(int order) { + this.sortOrder = order; + } +} diff --git a/src/main/java/de/iwomm/propify_api/mapper/ProjectMapper.java b/src/main/java/de/iwomm/propify_api/mapper/ProjectMapper.java new file mode 100644 index 0000000..8977078 --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/mapper/ProjectMapper.java @@ -0,0 +1,47 @@ +package de.iwomm.propify_api.mapper; + +import de.iwomm.propify_api.dto.ProjectDetailsDTO; +import de.iwomm.propify_api.dto.ProjectTimelineEventDTO; +import de.iwomm.propify_api.entity.Project; +import de.iwomm.propify_api.entity.Property; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class ProjectMapper { + + private final TimelineEventMapper timelineEventMapper; + + public ProjectMapper(TimelineEventMapper timelineEventMapper) { + this.timelineEventMapper = timelineEventMapper; + } + + /** + * Maps Project -> ProjectDetailsDTO + */ + public ProjectDetailsDTO projectToProjectDetailsDTO(Project project) { + Property property = project.getProperty(); + String address = property.getStreet() + " " + property.getHouseNumber() + ", " + + property.getZipCode() + " " + property.getCity(); + + List timelineEvents = this.timelineEventMapper.projectTimelineEventToDTO(project.getTimelineEvents()); + + ProjectDetailsDTO projectDetailsDTO = new ProjectDetailsDTO( + project.getId(), + project.getName(), + project.getEventNumber(), + project.getProjectStatus().getName(), + project.getProjectType().getName(), + project.getDescription(), + project.getAmountRequested(), + address, + project.getStartDate(), + project.getEndDate(), + timelineEvents + ); + + return projectDetailsDTO; + } +} diff --git a/src/main/java/de/iwomm/propify_api/mapper/TimelineEventMapper.java b/src/main/java/de/iwomm/propify_api/mapper/TimelineEventMapper.java new file mode 100644 index 0000000..c7ab3d5 --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/mapper/TimelineEventMapper.java @@ -0,0 +1,47 @@ +package de.iwomm.propify_api.mapper; + +import de.iwomm.propify_api.dto.ProjectTimelineEventDTO; +import de.iwomm.propify_api.dto.ProjectTimelineEventTypeDTO; +import de.iwomm.propify_api.entity.ProjectTimelineEvent; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +@Service +public class TimelineEventMapper { + + private final TimelineEventTypeMapper timelineEventTypeMapper; + + public TimelineEventMapper(TimelineEventTypeMapper timelineEventTypeMapper) { + this.timelineEventTypeMapper = timelineEventTypeMapper; + } + + /** + * Maps List -> List + */ + public List projectTimelineEventToDTO(List timelineEvents) { + List timelineEventDTOs = new ArrayList<>(); + + timelineEvents.forEach(timelineEvent -> { + timelineEventDTOs.add(this.projectTimelineEventToDTO(timelineEvent)); + }); + + return timelineEventDTOs; + } + + /** + * Maps ProjectTimelineEvent -> ProjectTimelineEventDTO + */ + public ProjectTimelineEventDTO projectTimelineEventToDTO(ProjectTimelineEvent projectTimelineEvent) { + return new ProjectTimelineEventDTO( + projectTimelineEvent.getId(), + this.timelineEventTypeMapper.projectTimelineEventTypeToDTO(projectTimelineEvent.getProjectTimelineEventType()), + projectTimelineEvent.getTitle(), + projectTimelineEvent.getDate(), + projectTimelineEvent.getDescription(), + projectTimelineEvent.getDocuments() + ); + } +} diff --git a/src/main/java/de/iwomm/propify_api/mapper/TimelineEventTypeMapper.java b/src/main/java/de/iwomm/propify_api/mapper/TimelineEventTypeMapper.java new file mode 100644 index 0000000..b5b284e --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/mapper/TimelineEventTypeMapper.java @@ -0,0 +1,22 @@ +package de.iwomm.propify_api.mapper; + +import de.iwomm.propify_api.dto.ProjectTimelineEventTypeDTO; +import de.iwomm.propify_api.entity.ProjectTimelineEventType; +import org.springframework.stereotype.Service; + +@Service +public class TimelineEventTypeMapper { + + /** + * Maps ProjectTimelineEventType -> ProjectTimelineEventTypeDTO + */ + public ProjectTimelineEventTypeDTO projectTimelineEventTypeToDTO(ProjectTimelineEventType projectTimelineEventType) { + return new ProjectTimelineEventTypeDTO( + projectTimelineEventType.getId(), + projectTimelineEventType.getName(), + projectTimelineEventType.getColor(), + projectTimelineEventType.getIcon() + ); + } + +} diff --git a/src/main/java/de/iwomm/propify_api/repository/CountryRepository.java b/src/main/java/de/iwomm/propify_api/repository/CountryRepository.java new file mode 100644 index 0000000..333a523 --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/repository/CountryRepository.java @@ -0,0 +1,10 @@ +package de.iwomm.propify_api.repository; + +import de.iwomm.propify_api.entity.Country; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.UUID; + +public interface CountryRepository extends JpaRepository { + Country findByCode(String code); +} diff --git a/src/main/java/de/iwomm/propify_api/repository/FederalStateRepository.java b/src/main/java/de/iwomm/propify_api/repository/FederalStateRepository.java new file mode 100644 index 0000000..b39c68a --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/repository/FederalStateRepository.java @@ -0,0 +1,13 @@ +package de.iwomm.propify_api.repository; + +import de.iwomm.propify_api.entity.Country; +import de.iwomm.propify_api.entity.FederalState; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.UUID; + +public interface FederalStateRepository extends JpaRepository { + FederalState findByAbbreviation(String abbreviation); + + FederalState findByAbbreviationAndCountry(String abbreviation, Country country); +} diff --git a/src/main/java/de/iwomm/propify_api/repository/ProjectRepository.java b/src/main/java/de/iwomm/propify_api/repository/ProjectRepository.java index bb31f09..71aabbf 100644 --- a/src/main/java/de/iwomm/propify_api/repository/ProjectRepository.java +++ b/src/main/java/de/iwomm/propify_api/repository/ProjectRepository.java @@ -1,9 +1,11 @@ package de.iwomm.propify_api.repository; import de.iwomm.propify_api.entity.Project; +import de.iwomm.propify_api.entity.ProjectStatus; import de.iwomm.propify_api.entity.Property; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.util.Optional; import java.util.UUID; @@ -14,5 +16,8 @@ public interface ProjectRepository extends JpaRepository { @Query("SELECT SUM(p.amountRequested) FROM Project p") long sumAmountRequested(); - long countProjectByStatus(String status); + long countProjectByProjectStatus(ProjectStatus status); + + @Query("SELECT COUNT(p) FROM Project p WHERE p.projectStatus.name = :statusName") + long countProjectByStatus(@Param("statusName") String statusName); } diff --git a/src/main/java/de/iwomm/propify_api/repository/ProjectStatusRepository.java b/src/main/java/de/iwomm/propify_api/repository/ProjectStatusRepository.java new file mode 100644 index 0000000..3afbe6f --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/repository/ProjectStatusRepository.java @@ -0,0 +1,11 @@ +package de.iwomm.propify_api.repository; + +import de.iwomm.propify_api.entity.ProjectStatus; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; +import java.util.UUID; + +public interface ProjectStatusRepository extends JpaRepository { + public Optional findByName(String name); +} diff --git a/src/main/java/de/iwomm/propify_api/repository/ProjectTimelineEventRepository.java b/src/main/java/de/iwomm/propify_api/repository/ProjectTimelineEventRepository.java new file mode 100644 index 0000000..a24cb8f --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/repository/ProjectTimelineEventRepository.java @@ -0,0 +1,10 @@ +package de.iwomm.propify_api.repository; + +import de.iwomm.propify_api.entity.ProjectTimelineEvent; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.UUID; + +public interface ProjectTimelineEventRepository extends JpaRepository { + public ProjectTimelineEvent findByTitle(String title); +} diff --git a/src/main/java/de/iwomm/propify_api/repository/ProjectTimelineEventTypeRepository.java b/src/main/java/de/iwomm/propify_api/repository/ProjectTimelineEventTypeRepository.java new file mode 100644 index 0000000..1994213 --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/repository/ProjectTimelineEventTypeRepository.java @@ -0,0 +1,10 @@ +package de.iwomm.propify_api.repository; + +import de.iwomm.propify_api.entity.ProjectTimelineEventType; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.UUID; + +public interface ProjectTimelineEventTypeRepository extends JpaRepository { + public ProjectTimelineEventType findByName(String name); +} diff --git a/src/main/java/de/iwomm/propify_api/repository/ProjectTypeRepository.java b/src/main/java/de/iwomm/propify_api/repository/ProjectTypeRepository.java new file mode 100644 index 0000000..c20256a --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/repository/ProjectTypeRepository.java @@ -0,0 +1,11 @@ +package de.iwomm.propify_api.repository; + +import de.iwomm.propify_api.entity.ProjectType; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; +import java.util.UUID; + +public interface ProjectTypeRepository extends JpaRepository { + public Optional findByName(String name); +} diff --git a/src/main/java/de/iwomm/propify_api/repository/PropertyStatusRepository.java b/src/main/java/de/iwomm/propify_api/repository/PropertyStatusRepository.java new file mode 100644 index 0000000..2380dc4 --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/repository/PropertyStatusRepository.java @@ -0,0 +1,10 @@ +package de.iwomm.propify_api.repository; + +import de.iwomm.propify_api.entity.PropertyStatus; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.UUID; + +public interface PropertyStatusRepository extends JpaRepository { + PropertyStatus findByName(String name); +} diff --git a/src/main/java/de/iwomm/propify_api/service/ProjectService.java b/src/main/java/de/iwomm/propify_api/service/ProjectService.java index d5ae421..2cf7826 100644 --- a/src/main/java/de/iwomm/propify_api/service/ProjectService.java +++ b/src/main/java/de/iwomm/propify_api/service/ProjectService.java @@ -1,11 +1,13 @@ package de.iwomm.propify_api.service; -import de.iwomm.propify_api.dto.ProjectDTO; -import de.iwomm.propify_api.dto.ProjectStatsDTO; -import de.iwomm.propify_api.dto.PropertyDTO; +import de.iwomm.propify_api.dto.*; import de.iwomm.propify_api.entity.Project; +import de.iwomm.propify_api.entity.ProjectStatus; +import de.iwomm.propify_api.entity.ProjectType; import de.iwomm.propify_api.entity.Property; import de.iwomm.propify_api.repository.ProjectRepository; +import de.iwomm.propify_api.repository.ProjectStatusRepository; +import de.iwomm.propify_api.repository.ProjectTypeRepository; import jakarta.persistence.EntityNotFoundException; import org.springframework.stereotype.Service; @@ -19,10 +21,19 @@ public class ProjectService { private final ProjectRepository projectRepository; private final PropertyService propertyService; + private final ProjectTypeRepository projectTypeRepository; + private final ProjectStatusRepository projectStatusRepository; - public ProjectService(ProjectRepository projectRepository, PropertyService propertyService) { + public ProjectService( + ProjectRepository projectRepository, + PropertyService propertyService, + ProjectTypeRepository projectTypeRepository, + ProjectStatusRepository projectStatusRepository + ) { this.projectRepository = projectRepository; this.propertyService = propertyService; + this.projectTypeRepository = projectTypeRepository; + this.projectStatusRepository = projectStatusRepository; } public List findAll() { @@ -33,16 +44,17 @@ public class ProjectService { return projectRepository.findById(id); } - public Project save(ProjectDTO dto) { - + public Project save(NewProjectDTO dto) { Property property = this.propertyService.findById(dto.getPropertyId()).orElseThrow(EntityNotFoundException::new); + ProjectType projectType = this.projectTypeRepository.findById(dto.getProjectTypeId()).orElseThrow(EntityNotFoundException::new); + ProjectStatus projectStatus = this.projectStatusRepository.findById(dto.getStatusId()).orElseThrow(EntityNotFoundException::new); return this.projectRepository.save(new Project( dto.getName(), dto.getEventNumber(), dto.getDescription(), - dto.getProjectType(), - dto.getStatus(), + projectType, + projectStatus, property, dto.getAmountRequested(), dto.getStartDate(), @@ -56,8 +68,8 @@ public class ProjectService { project.getName(), project.getEventNumber(), project.getDescription(), - project.getProjectType(), - project.getStatus(), + new ProjectTypeDTO(project.getProjectType()), + new ProjectStatusDTO(project.getProjectStatus()), project.getProperty().getId(), project.getAmountRequested(), project.getStartDate(), @@ -70,9 +82,14 @@ public class ProjectService { project.getProperty().getHouseNumber(), project.getProperty().getZipCode(), project.getProperty().getCity(), - project.getProperty().getCountry(), + project.getProperty().getFederalState(), project.getProperty().getNotes(), - new ArrayList<>() + new ArrayList<>(), + new PropertyStatusDTO( + project.getProperty().getPropertyStatus().getId(), + project.getProperty().getPropertyStatus().getName(), + project.getProperty().getPropertyStatus().getSortOrder() + ) ) ); } @@ -92,8 +109,12 @@ public class ProjectService { projectStatsDTO.setAmountRequestedInTotal(this.projectRepository.sumAmountRequested()); projectStatsDTO.setProjectsCountTotal(this.projectRepository.count()); - projectStatsDTO.setProjectsCountActive(this.projectRepository.countProjectByStatus("active")); - projectStatsDTO.setProjectsCountCompleted(this.projectRepository.countProjectByStatus("completed")); + projectStatsDTO.setProjectsCountActive(this.projectRepository.countProjectByStatus("Aktiv")); + projectStatsDTO.setProjectsCountCompleted(this.projectRepository.countProjectByStatus("Abgeschlossen")); + + System.out.println(projectStatsDTO.getProjectsCountCompleted()); + System.out.println(projectStatsDTO.getProjectsCountActive()); + System.out.println(projectStatsDTO.getProjectsCountCompleted()); return projectStatsDTO; } diff --git a/src/main/java/de/iwomm/propify_api/service/ProjectStatusService.java b/src/main/java/de/iwomm/propify_api/service/ProjectStatusService.java new file mode 100644 index 0000000..b12d39e --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/service/ProjectStatusService.java @@ -0,0 +1,33 @@ +package de.iwomm.propify_api.service; + +import de.iwomm.propify_api.dto.ProjectStatusDTO; +import de.iwomm.propify_api.entity.ProjectStatus; +import de.iwomm.propify_api.repository.ProjectStatusRepository; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class ProjectStatusService { + + private final ProjectStatusRepository projectStatusRepository; + + public ProjectStatusService(ProjectStatusRepository projectStatusRepository) { + this.projectStatusRepository = projectStatusRepository; + } + + public List toDTOs(List projectStatuses) { + List dtos = new ArrayList<>(); + + projectStatuses.forEach(projectStatus -> { + dtos.add(new ProjectStatusDTO(projectStatus)); + }); + + return dtos; + } + + public List findAll() { + return projectStatusRepository.findAll(); + } +} diff --git a/src/main/java/de/iwomm/propify_api/service/ProjectTimelineEventService.java b/src/main/java/de/iwomm/propify_api/service/ProjectTimelineEventService.java new file mode 100644 index 0000000..4a86760 --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/service/ProjectTimelineEventService.java @@ -0,0 +1,19 @@ +package de.iwomm.propify_api.service; + +import de.iwomm.propify_api.entity.ProjectTimelineEvent; +import de.iwomm.propify_api.repository.ProjectTimelineEventRepository; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.UUID; + +@Service +public class ProjectTimelineEventService { + + private final ProjectTimelineEventRepository projectTimelineEventRepository; + + public ProjectTimelineEventService(ProjectTimelineEventRepository projectTimelineEventRepository) { + this.projectTimelineEventRepository = projectTimelineEventRepository; + } + +} diff --git a/src/main/java/de/iwomm/propify_api/service/ProjectTimelineEventTypeService.java b/src/main/java/de/iwomm/propify_api/service/ProjectTimelineEventTypeService.java new file mode 100644 index 0000000..a35efb5 --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/service/ProjectTimelineEventTypeService.java @@ -0,0 +1,25 @@ +package de.iwomm.propify_api.service; + +import de.iwomm.propify_api.entity.ProjectTimelineEventType; +import de.iwomm.propify_api.repository.ProjectTimelineEventTypeRepository; +import org.springframework.stereotype.Service; + +import java.util.Optional; +import java.util.UUID; + +@Service +public class ProjectTimelineEventTypeService { + private final ProjectTimelineEventTypeRepository projectTimelineEventTypeRepository; + + public ProjectTimelineEventTypeService(ProjectTimelineEventTypeRepository projectTimelineEventTypeRepository) { + this.projectTimelineEventTypeRepository = projectTimelineEventTypeRepository; + } + + public void save(ProjectTimelineEventType projectTimelineEventType) { + this.projectTimelineEventTypeRepository.save(projectTimelineEventType); + } + + public Optional getById(UUID id) { + return this.projectTimelineEventTypeRepository.findById(id); + } +} diff --git a/src/main/java/de/iwomm/propify_api/service/ProjectTypeService.java b/src/main/java/de/iwomm/propify_api/service/ProjectTypeService.java new file mode 100644 index 0000000..c14f237 --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/service/ProjectTypeService.java @@ -0,0 +1,34 @@ +package de.iwomm.propify_api.service; + +import de.iwomm.propify_api.dto.ProjectStatusDTO; +import de.iwomm.propify_api.dto.ProjectTypeDTO; +import de.iwomm.propify_api.entity.ProjectStatus; +import de.iwomm.propify_api.entity.ProjectType; +import de.iwomm.propify_api.repository.ProjectTypeRepository; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class ProjectTypeService { + private final ProjectTypeRepository projectTypeRepository; + + public ProjectTypeService(ProjectTypeRepository projectTypeRepository) { + this.projectTypeRepository = projectTypeRepository; + } + + public List toDTOs(List projectTypes) { + List dtos = new ArrayList<>(); + + projectTypes.forEach(projectType -> { + dtos.add(new ProjectTypeDTO(projectType)); + }); + + return dtos; + } + + public List findAll() { + return projectTypeRepository.findAll(); + } +} diff --git a/src/main/java/de/iwomm/propify_api/service/PropertyService.java b/src/main/java/de/iwomm/propify_api/service/PropertyService.java index 82881c3..865be71 100644 --- a/src/main/java/de/iwomm/propify_api/service/PropertyService.java +++ b/src/main/java/de/iwomm/propify_api/service/PropertyService.java @@ -5,6 +5,7 @@ import de.iwomm.propify_api.dto.BulkDeletePropertyIdsDTO; import de.iwomm.propify_api.dto.PropertyDTO; import de.iwomm.propify_api.entity.Property; import de.iwomm.propify_api.repository.PropertyRepository; +import de.iwomm.propify_api.repository.PropertyStatusRepository; import jakarta.persistence.EntityNotFoundException; import org.springframework.stereotype.Service; @@ -16,9 +17,16 @@ import java.util.UUID; @Service public class PropertyService { private final PropertyRepository propertyRepository; + private final PropertyStatusRepository propertyStatusRepository; + private final PropertyStatusService propertyStatusService; - public PropertyService(PropertyRepository propertyRepository) { + public PropertyService( + PropertyRepository propertyRepository, + PropertyStatusRepository propertyStatusRepository, + PropertyStatusService propertyStatusService) { this.propertyRepository = propertyRepository; + this.propertyStatusRepository = propertyStatusRepository; + this.propertyStatusService = propertyStatusService; } public List findAll() { @@ -54,7 +62,6 @@ public class PropertyService { updated.setHouseNumber(propertyDto.getHouseNumber()); updated.setZipCode(propertyDto.getZipCode()); updated.setCity(propertyDto.getCity()); - updated.setCountry(propertyDto.getCountry()); updated.setNotes(propertyDto.getNotes()); propertyRepository.save(updated); @@ -69,8 +76,9 @@ public class PropertyService { dto.getHouseNumber(), dto.getZipCode(), dto.getCity(), - dto.getCountry(), - dto.getNotes() + dto.getFederalState(), + dto.getNotes(), + this.propertyStatusRepository.findById(dto.getPropertyStatus().getId()).orElseThrow(EntityNotFoundException::new) )); } @@ -90,9 +98,10 @@ public class PropertyService { property.getHouseNumber(), property.getZipCode(), property.getCity(), - property.getCountry(), + property.getFederalState(), property.getNotes(), - attachments + attachments, + propertyStatusService.toDTO(property.getPropertyStatus()) )); }); diff --git a/src/main/java/de/iwomm/propify_api/service/PropertyStatusService.java b/src/main/java/de/iwomm/propify_api/service/PropertyStatusService.java new file mode 100644 index 0000000..9196973 --- /dev/null +++ b/src/main/java/de/iwomm/propify_api/service/PropertyStatusService.java @@ -0,0 +1,19 @@ +package de.iwomm.propify_api.service; + +import de.iwomm.propify_api.dto.PropertyStatusDTO; +import de.iwomm.propify_api.entity.PropertyStatus; +import de.iwomm.propify_api.repository.PropertyStatusRepository; +import org.springframework.stereotype.Service; + +@Service +public class PropertyStatusService { + private PropertyStatusRepository propertyStatusRepository; + + public PropertyStatusService(PropertyStatusRepository propertyStatusRepository) { + this.propertyStatusRepository = propertyStatusRepository; + } + + public PropertyStatusDTO toDTO(PropertyStatus propertyStatus) { + return new PropertyStatusDTO(propertyStatus.getName(), propertyStatus.getSortOrder()); + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 9ae804c..cfb3417 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -20,7 +20,7 @@ spring: properties: hibernate: format_sql: true - database-platform: org.hibernate.dialect.PostgreSQLDialect +# database-platform: org.hibernate.dialect.PostgreSQLDialect # datasource: # url: jdbc:h2:mem:demo;DB_CLOSE_DELAY=-1 # driver-class-name: org.h2.Driver @@ -44,11 +44,12 @@ spring: logging: level: org: + hibernate: + type.descriptor.sql.BasicBinder: TRACE + SQL: DEBUG springframework: security: DEBUG - - cors: allowed-origins: - http://localhost:4200