This commit is contained in:
2025-10-09 10:37:26 +02:00
parent e7784f31bb
commit 39ce995956
22 changed files with 288 additions and 129 deletions

View File

@@ -0,0 +1,31 @@
meta {
name: Create new
type: http
seq: 3
}
post {
url: {{API_BASE_URL}}/api/{{API_VERSION}}/project-statuses
body: json
auth: bearer
}
auth:bearer {
token: {{BEARER_TOKEN}}
}
body:json {
{
"name": "Test Projekt 1",
"eventNumber": "123-456",
"description": "This is the first project",
"projectType": "energy_consulting_wg",
"status": "preparation",
"propertyId": "ff27cd1b-9eab-482c-8fd7-8093573efca2",
"amountRequested": "10000"
}
}
settings {
encodeUrl: true
}

View File

@@ -0,0 +1,31 @@
meta {
name: Delete one by ID
type: http
seq: 4
}
delete {
url: API_BASE_URL}}/api/{{API_VERSION}}/project-statuses/...
body: json
auth: bearer
}
auth:bearer {
token: {{BEARER_TOKEN}}
}
body:json {
{
"name": "Mustername 1",
"street": "Musterstraße",
"houseNumber": "1",
"zipCode": "55123",
"city": "Musterstadt",
"country": "de",
"notes": "Lorem ipsum"
}
}
settings {
encodeUrl: true
}

View File

@@ -0,0 +1,19 @@
meta {
name: Get all
type: http
seq: 1
}
get {
url: {{API_BASE_URL}}/api/{{API_VERSION}}/project-statuses
body: none
auth: bearer
}
auth:bearer {
token: {{BEARER_TOKEN}}
}
settings {
encodeUrl: true
}

View File

@@ -0,0 +1,19 @@
meta {
name: Get one by ID
type: http
seq: 2
}
get {
url: {{API_BASE_URL}}/api/{{API_VERSION}}/project-statuses/...
body: none
auth: bearer
}
auth:bearer {
token: {{BEARER_TOKEN}}
}
settings {
encodeUrl: true
}

View File

@@ -0,0 +1,8 @@
meta {
name: ProjectStatuses
seq: 6
}
auth {
mode: inherit
}

View File

@@ -0,0 +1,31 @@
meta {
name: Create new
type: http
seq: 3
}
post {
url: {{API_BASE_URL}}/api/{{API_VERSION}}/project-types
body: json
auth: bearer
}
auth:bearer {
token: {{BEARER_TOKEN}}
}
body:json {
{
"name": "Test Projekt 1",
"eventNumber": "123-456",
"description": "This is the first project",
"projectType": "energy_consulting_wg",
"status": "preparation",
"propertyId": "ff27cd1b-9eab-482c-8fd7-8093573efca2",
"amountRequested": "10000"
}
}
settings {
encodeUrl: true
}

View File

@@ -0,0 +1,31 @@
meta {
name: Delete one by ID
type: http
seq: 4
}
delete {
url: API_BASE_URL}}/api/{{API_VERSION}}/project-types/...
body: json
auth: bearer
}
auth:bearer {
token: {{BEARER_TOKEN}}
}
body:json {
{
"name": "Mustername 1",
"street": "Musterstraße",
"houseNumber": "1",
"zipCode": "55123",
"city": "Musterstadt",
"country": "de",
"notes": "Lorem ipsum"
}
}
settings {
encodeUrl: true
}

View File

@@ -0,0 +1,19 @@
meta {
name: Get all
type: http
seq: 1
}
get {
url: {{API_BASE_URL}}/api/{{API_VERSION}}/project-types
body: none
auth: bearer
}
auth:bearer {
token: {{BEARER_TOKEN}}
}
settings {
encodeUrl: true
}

View File

@@ -0,0 +1,19 @@
meta {
name: Get one by ID
type: http
seq: 2
}
get {
url: {{API_BASE_URL}}/api/{{API_VERSION}}/project-types/...
body: none
auth: bearer
}
auth:bearer {
token: {{BEARER_TOKEN}}
}
settings {
encodeUrl: true
}

View File

@@ -0,0 +1,8 @@
meta {
name: ProjectTypes
seq: 5
}
auth {
mode: inherit
}

12
pom.xml
View File

@@ -98,6 +98,18 @@
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.6.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>

View File

@@ -5,7 +5,7 @@ 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.entity.Project;
import de.iwomm.propify_api.mapper.ProjectMapper;
import de.iwomm.propify_api.mapper.ProjectToDtoMapperImpl;
import de.iwomm.propify_api.service.ProjectService;
import jakarta.persistence.EntityNotFoundException;
import org.springframework.http.ResponseEntity;
@@ -21,11 +21,11 @@ import java.util.UUID;
@RequestMapping("/api/v1/projects")
public class ProjectController {
private final ProjectService projectService;
private final ProjectMapper projectMapper;
private final ProjectToDtoMapperImpl projectToDtoMapper;
public ProjectController(ProjectService projectService, ProjectMapper projectMapper) {
public ProjectController(ProjectService projectService, ProjectToDtoMapperImpl projectToDtoMapper) {
this.projectService = projectService;
this.projectMapper = projectMapper;
this.projectToDtoMapper = projectToDtoMapper;
}
@GetMapping
@@ -42,7 +42,7 @@ public class ProjectController {
public ResponseEntity<?> getById(@PathVariable UUID id) {
try {
Project project = projectService.findById(id).orElseThrow(EntityNotFoundException::new);
ProjectDetailsDTO projectDTO = this.projectMapper.projectToProjectDetailsDTO(project);
ProjectDetailsDTO projectDTO = this.projectToDtoMapper.projectToProjectDetailsDto(project); // this.projectMapper.projectToProjectDetailsDTO(project);
return ResponseEntity
.ok(projectDTO);

View File

@@ -6,7 +6,7 @@ import java.util.UUID;
public record ProjectTimelineEventDTO(
UUID id,
ProjectTimelineEventTypeDTO projectEventType,
ProjectTimelineEventTypeDTO timelineEventType,
String title,
LocalDateTime date,
String description,

View File

@@ -21,7 +21,7 @@ public class ProjectTimelineEvent {
@ManyToOne
@JoinColumn(name = "project_timeline_event_type_id")
ProjectTimelineEventType projectTimelineEventType;
ProjectTimelineEventType timelineEventType;
@ManyToOne(optional = false, fetch = FetchType.LAZY)
@JoinColumn(name = "project_id", nullable = false)
@@ -43,22 +43,22 @@ public class ProjectTimelineEvent {
String title,
LocalDateTime date,
String description,
ProjectTimelineEventType projectTimelineEventType,
ProjectTimelineEventType timelineEventType,
List<String> documents
) {
this.title = title;
this.date = date;
this.description = description;
this.projectTimelineEventType = projectTimelineEventType;
this.timelineEventType = timelineEventType;
this.documents = documents;
}
public ProjectTimelineEventType getProjectTimelineEventType() {
return projectTimelineEventType;
public ProjectTimelineEventType getTimelineEventType() {
return timelineEventType;
}
public void setProjectTimelineEventType(ProjectTimelineEventType projectTimelineEventType) {
this.projectTimelineEventType = projectTimelineEventType;
public void setTimelineEventType(ProjectTimelineEventType projectTimelineEventType) {
this.timelineEventType = projectTimelineEventType;
}
public void setProject(Project project) {

View File

@@ -12,8 +12,10 @@ public class ProjectType {
@Column(nullable = false)
private UUID id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private int sortOrder;
public ProjectType() {

View File

@@ -219,4 +219,8 @@ public class Property {
public void setFederalState(FederalState federalState) {
this.federalState = federalState;
}
public String getAddress() {
return this.street + " " + this.houseNumber + ", " + this.zipCode + " " + this.city;
}
}

View File

@@ -1,47 +0,0 @@
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,15 @@
package de.iwomm.propify_api.mapper;
import de.iwomm.propify_api.dto.ProjectTimelineEventDTO;
import de.iwomm.propify_api.entity.ProjectTimelineEvent;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import java.util.List;
@Mapper(componentModel = "spring", uses = { ProjectTimelineEventTypeDtoMapper.class })
public interface ProjectTimelineEventToDtoMapper {
ProjectTimelineEventDTO toDto(ProjectTimelineEvent entity);
List<ProjectTimelineEventDTO> toDtoList(List<ProjectTimelineEvent> entities);
}

View File

@@ -0,0 +1,10 @@
package de.iwomm.propify_api.mapper;
import de.iwomm.propify_api.dto.ProjectTimelineEventTypeDTO;
import de.iwomm.propify_api.entity.ProjectTimelineEventType;
import org.mapstruct.Mapper;
@Mapper(componentModel = "spring")
public interface ProjectTimelineEventTypeDtoMapper {
ProjectTimelineEventTypeDTO toDto(ProjectTimelineEventType entity);
}

View File

@@ -0,0 +1,16 @@
package de.iwomm.propify_api.mapper;
import de.iwomm.propify_api.dto.ProjectDetailsDTO;
import de.iwomm.propify_api.entity.Project;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
@Mapper(componentModel = "spring", uses = { ProjectTimelineEventToDtoMapper.class })
public abstract class ProjectToDtoMapper {
@Mapping(target = "status", source = "projectStatus.name") // angenommen ProjectStatus hat getName()
@Mapping(target = "projectType", source = "projectType.name") // angenommen ProjectType hat getName()
@Mapping(target = "address", source = "property.address") // angenommen Property hat getAddress()
public abstract ProjectDetailsDTO projectToProjectDetailsDto(Project project);
}

View File

@@ -1,47 +0,0 @@
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

@@ -1,22 +0,0 @@
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()
);
}
}