This commit is contained in:
2025-10-02 18:01:23 +02:00
parent 210611bbbe
commit e7784f31bb
44 changed files with 1787 additions and 93 deletions

View File

@@ -5,7 +5,7 @@ meta {
} }
get { 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 body: none
auth: bearer auth: bearer
} }

View File

@@ -1,10 +1,11 @@
package de.iwomm.propify_api.controller; 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.ProjectDTO;
import de.iwomm.propify_api.dto.ProjectDetailsDTO;
import de.iwomm.propify_api.dto.ProjectStatsDTO; 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.Project;
import de.iwomm.propify_api.entity.Property; import de.iwomm.propify_api.mapper.ProjectMapper;
import de.iwomm.propify_api.service.ProjectService; import de.iwomm.propify_api.service.ProjectService;
import jakarta.persistence.EntityNotFoundException; import jakarta.persistence.EntityNotFoundException;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
@@ -19,10 +20,12 @@ import java.util.UUID;
@RestController @RestController
@RequestMapping("/api/v1/projects") @RequestMapping("/api/v1/projects")
public class ProjectController { 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.projectService = projectService;
this.projectMapper = projectMapper;
} }
@GetMapping @GetMapping
@@ -38,7 +41,8 @@ public class ProjectController {
@PreAuthorize("hasAnyRole('ADMIN', 'USER')") @PreAuthorize("hasAnyRole('ADMIN', 'USER')")
public ResponseEntity<?> getById(@PathVariable UUID id) { public ResponseEntity<?> getById(@PathVariable UUID id) {
try { 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 return ResponseEntity
.ok(projectDTO); .ok(projectDTO);
@@ -68,9 +72,9 @@ public class ProjectController {
@PostMapping @PostMapping
@PreAuthorize("hasRole('ADMIN')") @PreAuthorize("hasRole('ADMIN')")
public ResponseEntity<?> create(@RequestBody ProjectDTO projectDTO) { public ResponseEntity<?> create(@RequestBody NewProjectDTO newProjectDTO) {
try { try {
Project newItem = projectService.save(projectDTO); Project newItem = projectService.save(newProjectDTO);
URI location = ServletUriComponentsBuilder.fromCurrentRequest() URI location = ServletUriComponentsBuilder.fromCurrentRequest()
.path("/{id}") .path("/{id}")

View File

@@ -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> projectStatusDTO = projectStatusService.toDTOs(projectStatusService.findAll());
return ResponseEntity
.ok(projectStatusDTO);
}
}

View File

@@ -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> projectTypeDTO = projectTypeService.toDTOs(projectTypeService.findAll());
return ResponseEntity
.ok(projectTypeDTO);
}
}

View File

@@ -1,29 +1,302 @@
package de.iwomm.propify_api.database; package de.iwomm.propify_api.database;
import de.iwomm.propify_api.entity.Property; import de.iwomm.propify_api.entity.*;
import de.iwomm.propify_api.repository.PropertyRepository; import de.iwomm.propify_api.repository.*;
import jakarta.persistence.EntityNotFoundException;
import org.springframework.boot.CommandLineRunner; import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Profile; import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@Component @Component
@Profile("dev") // Runs only in "dev" environments @Profile("dev") // Runs only in "dev" environments
public class DatabaseSeeder implements CommandLineRunner { public class DatabaseSeeder implements CommandLineRunner {
private final PropertyRepository propertyRepository; 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.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 @Override
public void run(String... args) throws Exception { public void run(String... args) throws Exception {
if (propertyRepository.count() == 0) { int i;
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")); // Seed countries and federal states
propertyRepository.save(new Property("Mustergebäude 3", "Mustersteet", "3", "32345", "New York", "CH", "Musterbemerkung 3")); 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."); System.out.println("Countries seeded.");
} else { } else {
countryDe = this.countryRepository.findByCode("DE");
countryAt = this.countryRepository.findByCode("AT");
countryCh = this.countryRepository.findByCode("CH");
System.out.println("Countries already seeded."); 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.");
} }
} }

View File

@@ -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;
}
}

View File

@@ -11,8 +11,10 @@ public class ProjectDTO {
private String name; private String name;
private String eventNumber; private String eventNumber;
private String description; private String description;
private String projectType; private ProjectTypeDTO projectType;
private String status; private UUID projectTypeId;
private ProjectStatusDTO status;
private UUID statusId;
private UUID propertyId; private UUID propertyId;
private int amountRequested; private int amountRequested;
private LocalDate startDate; private LocalDate startDate;
@@ -20,9 +22,19 @@ public class ProjectDTO {
private PropertyDTO property; private PropertyDTO property;
private LocalDateTime createdAt; private LocalDateTime createdAt;
public ProjectDTO(UUID id, String name, String eventNumber, String description, String projectType, public ProjectDTO(UUID id,
String status, UUID propertyId, int amountRequested, String name,
LocalDate startDate, LocalDate endDate, LocalDateTime createdAt, PropertyDTO propertyDTO) { String eventNumber,
String description,
ProjectTypeDTO projectType,
ProjectStatusDTO status,
UUID propertyId,
int amountRequested,
LocalDate startDate,
LocalDate endDate,
LocalDateTime createdAt,
PropertyDTO propertyDTO
) {
this.id = id; this.id = id;
this.name = name; this.name = name;
this.eventNumber = eventNumber; this.eventNumber = eventNumber;
@@ -69,19 +81,19 @@ public class ProjectDTO {
this.description = description; this.description = description;
} }
public String getProjectType() { public ProjectTypeDTO getProjectType() {
return projectType; return projectType;
} }
public void setProjectType(String projectType) { public void setProjectType(ProjectTypeDTO projectType) {
this.projectType = projectType; this.projectType = projectType;
} }
public String getStatus() { public ProjectStatusDTO getStatus() {
return status; return status;
} }
public void setStatus(String status) { public void setStatus(ProjectStatusDTO status) {
this.status = status; this.status = status;
} }

View File

@@ -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<ProjectTimelineEventDTO> timelineEvents
) {
}

View File

@@ -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;
}
}

View File

@@ -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<String> documents
) {
}

View File

@@ -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
) {
}

View File

@@ -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;
}
}

View File

@@ -1,5 +1,8 @@
package de.iwomm.propify_api.dto; 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.List;
import java.util.UUID; import java.util.UUID;
@@ -10,21 +13,25 @@ public class PropertyDTO {
private String houseNumber; private String houseNumber;
private String zipCode; private String zipCode;
private String city; private String city;
private String country; private FederalState federalState;
private String notes; private String notes;
private List<AttachmentDTO> attachments; private List<AttachmentDTO> attachments;
private PropertyStatusDTO propertyStatus;
public PropertyDTO(UUID id, String name, String street, String houseNumber, String zipCode, String city, String country, String notes, List<AttachmentDTO> attachments) { public PropertyDTO(UUID id, String name, String street, String houseNumber,
String zipCode, String city, FederalState federalState, String notes,
List<AttachmentDTO> attachments, PropertyStatusDTO propertyStatus) {
this.id = id; this.id = id;
this.name = name; this.name = name;
this.street = street; this.street = street;
this.houseNumber = houseNumber; this.houseNumber = houseNumber;
this.zipCode = zipCode; this.zipCode = zipCode;
this.city = city; this.city = city;
this.country = country; this.federalState = federalState;
this.notes = notes; this.notes = notes;
this.attachments = attachments; this.attachments = attachments;
this.propertyStatus = propertyStatus;
} }
public UUID getId() { public UUID getId() {
@@ -83,14 +90,6 @@ public class PropertyDTO {
this.notes = notes; this.notes = notes;
} }
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public List<AttachmentDTO> getAttachments() { public List<AttachmentDTO> getAttachments() {
return attachments; return attachments;
} }
@@ -98,4 +97,20 @@ public class PropertyDTO {
public void setAttachments(List<AttachmentDTO> attachments) { public void setAttachments(List<AttachmentDTO> attachments) {
this.attachments = 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;
}
} }

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -0,0 +1,4 @@
package de.iwomm.propify_api.entity;
import jakarta.persistence.Entity;

View File

@@ -5,6 +5,8 @@ import jakarta.persistence.*;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID; import java.util.UUID;
@Entity @Entity
@@ -14,11 +16,21 @@ public class Project {
@Column(nullable = false) @Column(nullable = false)
private UUID id; private UUID id;
@Column(nullable = false)
private String name; private String name;
private String eventNumber;
private String eventNumber; // Vorgangsnummer
private String description; 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) @Column(nullable = false)
private int amountRequested; private int amountRequested;
@@ -34,23 +46,26 @@ public class Project {
private LocalDateTime updatedAt; private LocalDateTime updatedAt;
@ManyToOne(cascade = CascadeType.PERSIST, optional = false) @ManyToOne(optional = false)
@JoinColumn(name = "property_id", nullable = false) @JoinColumn(name = "property_id", nullable = false)
@JsonManagedReference @JsonManagedReference
private Property property; private Property property;
@OneToMany(mappedBy = "project", cascade = CascadeType.ALL, orphanRemoval = true)
private List<ProjectTimelineEvent> timelineEvents = new ArrayList<>();
public Project() { public Project() {
this.amountRequested = 0; this.amountRequested = 0;
} }
public Project(String name, String eventNumber, String description, String projectType, public Project(String name, String eventNumber, String description, ProjectType projectType,
String status, Property property, int amountRequested, ProjectStatus status, Property property, int amountRequested,
LocalDate startDate, LocalDate endDate) { LocalDate startDate, LocalDate endDate) {
this.name = name; this.name = name;
this.eventNumber = eventNumber; this.eventNumber = eventNumber;
this.description = description; this.description = description;
this.projectType = projectType; this.projectType = projectType;
this.status = status; this.projectStatus = status;
this.property = property; this.property = property;
this.amountRequested = amountRequested; this.amountRequested = amountRequested;
this.startDate = startDate; this.startDate = startDate;
@@ -100,22 +115,6 @@ public class Project {
this.description = description; 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() { public int getAmountRequested() {
return amountRequested; return amountRequested;
} }
@@ -163,4 +162,34 @@ public class Project {
public void setUpdatedAt(LocalDateTime updatedAt) { public void setUpdatedAt(LocalDateTime updatedAt) {
this.updatedAt = 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<ProjectTimelineEvent> getTimelineEvents() {
return timelineEvents;
}
public void setTimelineEvents(List<ProjectTimelineEvent> timelineEvents) {
this.timelineEvents = timelineEvents;
}
public void addTimelineEvent(ProjectTimelineEvent projectTimelineEvent) {
projectTimelineEvent.setProject(this);
this.timelineEvents.add(projectTimelineEvent);
}
} }

View File

@@ -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;
}
}

View File

@@ -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<String> documents;
@Column(nullable = false)
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
public ProjectTimelineEvent() {
}
public ProjectTimelineEvent(
String title,
LocalDateTime date,
String description,
ProjectTimelineEventType projectTimelineEventType,
List<String> 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<String> getDocuments() {
return documents;
}
public void setDocuments(List<String> documents) {
this.documents = documents;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -2,6 +2,7 @@ package de.iwomm.propify_api.entity;
import com.fasterxml.jackson.annotation.JsonBackReference; import com.fasterxml.jackson.annotation.JsonBackReference;
import jakarta.persistence.*; import jakarta.persistence.*;
import jakarta.validation.constraints.NotNull;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
@@ -17,6 +18,8 @@ public class Property {
@Column(nullable = false) @Column(nullable = false)
private String name; private String name;
private String owner;
@Column(nullable = false) @Column(nullable = false)
private String street; private String street;
@@ -29,10 +32,18 @@ public class Property {
@Column(nullable = false) @Column(nullable = false)
private String city; private String city;
@ManyToOne
@JoinColumn(name = "federal_state_id")
private FederalState federalState;
private String notes; private String notes;
@Column(nullable = false) @Column(nullable = false)
private String country; private int yearOfConstruction; // baujahr
@Column(nullable = false)
private int unitCount; // anzahl einheiten
@OneToMany(mappedBy = "property", orphanRemoval = true) @OneToMany(mappedBy = "property", orphanRemoval = true)
@OrderBy("fileName") @OrderBy("fileName")
@@ -48,6 +59,18 @@ public class Property {
@JsonBackReference @JsonBackReference
private List<Project> projects = new ArrayList<>(); private List<Project> 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<Project> getProjects() { public List<Project> getProjects() {
return projects; return projects;
} }
@@ -67,14 +90,19 @@ public class Property {
public 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.name = name;
this.street = street; this.street = street;
this.houseNumber = houseNumber; this.houseNumber = houseNumber;
this.zipCode = zipCode; this.zipCode = zipCode;
this.city = city; this.city = city;
this.country = country; this.federalState = federalState;
this.notes = notes; this.notes = notes;
this.propertyStatus = propertyStatus;
} }
@PrePersist @PrePersist
@@ -152,14 +180,6 @@ public class Property {
this.city = city; this.city = city;
} }
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getNotes() { public String getNotes() {
return this.notes; return this.notes;
} }
@@ -167,4 +187,36 @@ public class Property {
public void setNotes(String notes) { public void setNotes(String notes) {
this.notes = 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;
}
} }

View File

@@ -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<Property> properties = new LinkedHashSet<>();
public PropertyStatus() {
}
public Set<Property> getProperties() {
return properties;
}
public void setProperties(Set<Property> 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;
}
}

View File

@@ -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<ProjectTimelineEventDTO> 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;
}
}

View File

@@ -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<ProjectTimelineEvent> -> List<ProjectTimelineEventDTO>
*/
public List<ProjectTimelineEventDTO> projectTimelineEventToDTO(List<ProjectTimelineEvent> timelineEvents) {
List<ProjectTimelineEventDTO> 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()
);
}
}

View File

@@ -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()
);
}
}

View File

@@ -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, UUID> {
Country findByCode(String code);
}

View File

@@ -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, UUID> {
FederalState findByAbbreviation(String abbreviation);
FederalState findByAbbreviationAndCountry(String abbreviation, Country country);
}

View File

@@ -1,9 +1,11 @@
package de.iwomm.propify_api.repository; package de.iwomm.propify_api.repository;
import de.iwomm.propify_api.entity.Project; import de.iwomm.propify_api.entity.Project;
import de.iwomm.propify_api.entity.ProjectStatus;
import de.iwomm.propify_api.entity.Property; import de.iwomm.propify_api.entity.Property;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.Optional; import java.util.Optional;
import java.util.UUID; import java.util.UUID;
@@ -14,5 +16,8 @@ public interface ProjectRepository extends JpaRepository<Project, UUID> {
@Query("SELECT SUM(p.amountRequested) FROM Project p") @Query("SELECT SUM(p.amountRequested) FROM Project p")
long sumAmountRequested(); 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);
} }

View File

@@ -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<ProjectStatus, UUID> {
public Optional<ProjectStatus> findByName(String name);
}

View File

@@ -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<ProjectTimelineEvent, UUID> {
public ProjectTimelineEvent findByTitle(String title);
}

View File

@@ -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<ProjectTimelineEventType, UUID> {
public ProjectTimelineEventType findByName(String name);
}

View File

@@ -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<ProjectType, UUID> {
public Optional<ProjectType> findByName(String name);
}

View File

@@ -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, UUID> {
PropertyStatus findByName(String name);
}

View File

@@ -1,11 +1,13 @@
package de.iwomm.propify_api.service; package de.iwomm.propify_api.service;
import de.iwomm.propify_api.dto.ProjectDTO; import de.iwomm.propify_api.dto.*;
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.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.entity.Property;
import de.iwomm.propify_api.repository.ProjectRepository; 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 jakarta.persistence.EntityNotFoundException;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -19,10 +21,19 @@ public class ProjectService {
private final ProjectRepository projectRepository; private final ProjectRepository projectRepository;
private final PropertyService propertyService; 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.projectRepository = projectRepository;
this.propertyService = propertyService; this.propertyService = propertyService;
this.projectTypeRepository = projectTypeRepository;
this.projectStatusRepository = projectStatusRepository;
} }
public List<Project> findAll() { public List<Project> findAll() {
@@ -33,16 +44,17 @@ public class ProjectService {
return projectRepository.findById(id); return projectRepository.findById(id);
} }
public Project save(ProjectDTO dto) { public Project save(NewProjectDTO dto) {
Property property = this.propertyService.findById(dto.getPropertyId()).orElseThrow(EntityNotFoundException::new); 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( return this.projectRepository.save(new Project(
dto.getName(), dto.getName(),
dto.getEventNumber(), dto.getEventNumber(),
dto.getDescription(), dto.getDescription(),
dto.getProjectType(), projectType,
dto.getStatus(), projectStatus,
property, property,
dto.getAmountRequested(), dto.getAmountRequested(),
dto.getStartDate(), dto.getStartDate(),
@@ -56,8 +68,8 @@ public class ProjectService {
project.getName(), project.getName(),
project.getEventNumber(), project.getEventNumber(),
project.getDescription(), project.getDescription(),
project.getProjectType(), new ProjectTypeDTO(project.getProjectType()),
project.getStatus(), new ProjectStatusDTO(project.getProjectStatus()),
project.getProperty().getId(), project.getProperty().getId(),
project.getAmountRequested(), project.getAmountRequested(),
project.getStartDate(), project.getStartDate(),
@@ -70,9 +82,14 @@ public class ProjectService {
project.getProperty().getHouseNumber(), project.getProperty().getHouseNumber(),
project.getProperty().getZipCode(), project.getProperty().getZipCode(),
project.getProperty().getCity(), project.getProperty().getCity(),
project.getProperty().getCountry(), project.getProperty().getFederalState(),
project.getProperty().getNotes(), 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.setAmountRequestedInTotal(this.projectRepository.sumAmountRequested());
projectStatsDTO.setProjectsCountTotal(this.projectRepository.count()); projectStatsDTO.setProjectsCountTotal(this.projectRepository.count());
projectStatsDTO.setProjectsCountActive(this.projectRepository.countProjectByStatus("active")); projectStatsDTO.setProjectsCountActive(this.projectRepository.countProjectByStatus("Aktiv"));
projectStatsDTO.setProjectsCountCompleted(this.projectRepository.countProjectByStatus("completed")); projectStatsDTO.setProjectsCountCompleted(this.projectRepository.countProjectByStatus("Abgeschlossen"));
System.out.println(projectStatsDTO.getProjectsCountCompleted());
System.out.println(projectStatsDTO.getProjectsCountActive());
System.out.println(projectStatsDTO.getProjectsCountCompleted());
return projectStatsDTO; return projectStatsDTO;
} }

View File

@@ -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<ProjectStatusDTO> toDTOs(List<ProjectStatus> projectStatuses) {
List<ProjectStatusDTO> dtos = new ArrayList<>();
projectStatuses.forEach(projectStatus -> {
dtos.add(new ProjectStatusDTO(projectStatus));
});
return dtos;
}
public List<ProjectStatus> findAll() {
return projectStatusRepository.findAll();
}
}

View File

@@ -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;
}
}

View File

@@ -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<ProjectTimelineEventType> getById(UUID id) {
return this.projectTimelineEventTypeRepository.findById(id);
}
}

View File

@@ -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<ProjectTypeDTO> toDTOs(List<ProjectType> projectTypes) {
List<ProjectTypeDTO> dtos = new ArrayList<>();
projectTypes.forEach(projectType -> {
dtos.add(new ProjectTypeDTO(projectType));
});
return dtos;
}
public List<ProjectType> findAll() {
return projectTypeRepository.findAll();
}
}

View File

@@ -5,6 +5,7 @@ import de.iwomm.propify_api.dto.BulkDeletePropertyIdsDTO;
import de.iwomm.propify_api.dto.PropertyDTO; import de.iwomm.propify_api.dto.PropertyDTO;
import de.iwomm.propify_api.entity.Property; import de.iwomm.propify_api.entity.Property;
import de.iwomm.propify_api.repository.PropertyRepository; import de.iwomm.propify_api.repository.PropertyRepository;
import de.iwomm.propify_api.repository.PropertyStatusRepository;
import jakarta.persistence.EntityNotFoundException; import jakarta.persistence.EntityNotFoundException;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -16,9 +17,16 @@ import java.util.UUID;
@Service @Service
public class PropertyService { public class PropertyService {
private final PropertyRepository propertyRepository; 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.propertyRepository = propertyRepository;
this.propertyStatusRepository = propertyStatusRepository;
this.propertyStatusService = propertyStatusService;
} }
public List<Property> findAll() { public List<Property> findAll() {
@@ -54,7 +62,6 @@ public class PropertyService {
updated.setHouseNumber(propertyDto.getHouseNumber()); updated.setHouseNumber(propertyDto.getHouseNumber());
updated.setZipCode(propertyDto.getZipCode()); updated.setZipCode(propertyDto.getZipCode());
updated.setCity(propertyDto.getCity()); updated.setCity(propertyDto.getCity());
updated.setCountry(propertyDto.getCountry());
updated.setNotes(propertyDto.getNotes()); updated.setNotes(propertyDto.getNotes());
propertyRepository.save(updated); propertyRepository.save(updated);
@@ -69,8 +76,9 @@ public class PropertyService {
dto.getHouseNumber(), dto.getHouseNumber(),
dto.getZipCode(), dto.getZipCode(),
dto.getCity(), dto.getCity(),
dto.getCountry(), dto.getFederalState(),
dto.getNotes() dto.getNotes(),
this.propertyStatusRepository.findById(dto.getPropertyStatus().getId()).orElseThrow(EntityNotFoundException::new)
)); ));
} }
@@ -90,9 +98,10 @@ public class PropertyService {
property.getHouseNumber(), property.getHouseNumber(),
property.getZipCode(), property.getZipCode(),
property.getCity(), property.getCity(),
property.getCountry(), property.getFederalState(),
property.getNotes(), property.getNotes(),
attachments attachments,
propertyStatusService.toDTO(property.getPropertyStatus())
)); ));
}); });

View File

@@ -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());
}
}

View File

@@ -20,7 +20,7 @@ spring:
properties: properties:
hibernate: hibernate:
format_sql: true format_sql: true
database-platform: org.hibernate.dialect.PostgreSQLDialect # database-platform: org.hibernate.dialect.PostgreSQLDialect
# datasource: # datasource:
# url: jdbc:h2:mem:demo;DB_CLOSE_DELAY=-1 # url: jdbc:h2:mem:demo;DB_CLOSE_DELAY=-1
# driver-class-name: org.h2.Driver # driver-class-name: org.h2.Driver
@@ -44,11 +44,12 @@ spring:
logging: logging:
level: level:
org: org:
hibernate:
type.descriptor.sql.BasicBinder: TRACE
SQL: DEBUG
springframework: springframework:
security: DEBUG security: DEBUG
cors: cors:
allowed-origins: allowed-origins:
- http://localhost:4200 - http://localhost:4200