Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -43,17 +43,31 @@ public class IncidentController {
private final UserMapper userMapper;
private final NotificationService notificationService;

private AppUser getUser(CustomUserDetails userDetails) {
if (userDetails == null) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth != null && auth.getPrincipal() instanceof CustomUserDetails cd) {
if (cd.getUser() == null) {
throw new ResponseStatusException(HttpStatus.UNAUTHORIZED, "Invalid user details");
}
return cd.getUser();
}
throw new ResponseStatusException(HttpStatus.UNAUTHORIZED, "Authentication required");
}
return userDetails.getUser();
}
Comment thread
SandraNelj marked this conversation as resolved.

@PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@ResponseStatus(HttpStatus.CREATED)
@PreAuthorize("hasAnyRole('RESIDENT', 'ADMIN')")
public ResponseEntity<IncidentResponse> createIncidentWithFiles(@RequestParam("subject") String subject,
@RequestParam(value = "description", required = false) String description,
@RequestParam("incidentCategory") IncidentCategory incidentCategory,
@RequestParam(value = "files", required = false) List<MultipartFile> files,
@AuthenticationPrincipal CustomUserDetails customUserDetails) {
@AuthenticationPrincipal CustomUserDetails userDetails) {

log.info("POST /api/incidents - Creating new incident with {} files", files != null ? files.size() : 0);
AppUser user = customUserDetails.getUser();
AppUser user = getUser(userDetails);

IncidentRequest incidentRequest = new IncidentRequest();
incidentRequest.setSubject(subject);
Expand All @@ -68,10 +82,10 @@ public ResponseEntity<IncidentResponse> createIncidentWithFiles(@RequestParam("s
@ResponseStatus(HttpStatus.CREATED)
@PreAuthorize("hasAnyRole('RESIDENT', 'ADMIN')")
public ResponseEntity<IncidentResponse> createIncident(@RequestBody @Valid IncidentRequest incidentRequest,
@AuthenticationPrincipal CustomUserDetails customUserDetails) {
@AuthenticationPrincipal CustomUserDetails userDetails) {

log.info("POST /api/incidents (JSON) - Creating new incident");
AppUser user = customUserDetails.getUser();
AppUser user = getUser(userDetails);
Incident saved = incidentService.createIncident(incidentRequest, null, user);
return ResponseEntity.status(HttpStatus.CREATED).body(IncidentResponse.fromEntityBasic(saved));
}
Expand All @@ -81,7 +95,7 @@ public ResponseEntity<IncidentResponse> createIncident(@RequestBody @Valid Incid
public ResponseEntity<Page<IncidentResponse>> getMyIncidents(@AuthenticationPrincipal CustomUserDetails userDetails,
Pageable pageable) {
log.info("GET /api/incidents/my - Fetching my incidents");
AppUser user = userDetails.getUser();
AppUser user = getUser(userDetails);
return ResponseEntity
.ok(incidentService.findByCreatedBy(user, pageable).map(IncidentResponse::fromEntityBasic));
}
Expand All @@ -91,7 +105,7 @@ public ResponseEntity<Page<IncidentResponse>> getMyIncidents(@AuthenticationPrin
public ResponseEntity<Page<IncidentResponse>> getAssignedIncidents(
@AuthenticationPrincipal CustomUserDetails userDetails, Pageable pageable) {
log.info("GET /api/incidents/assigned - Fetching assigned incidents");
AppUser user = userDetails.getUser();
AppUser user = getUser(userDetails);
return ResponseEntity
.ok(incidentService.findByAssignedTo(user, pageable).map(IncidentResponse::fromEntityBasic));
}
Expand All @@ -106,35 +120,33 @@ public ResponseEntity<Page<IncidentResponse>> getAllIncidents(Pageable pageable)
@PreAuthorize("hasAnyRole('RESIDENT', 'HANDLER', 'ADMIN')")
@GetMapping("/{id}")
public ResponseEntity<IncidentResponse> getIncidentById(@PathVariable Long id) {
log.info("GET /api/incidents/{} - Fetching incident", id);
Authentication auth = SecurityContextHolder.getContext().getAuthentication();

if (auth == null || !(auth.getPrincipal() instanceof CustomUserDetails userDetails)) {
if (auth == null || !(auth.getPrincipal() instanceof CustomUserDetails cd)) {
throw new ResponseStatusException(HttpStatus.UNAUTHORIZED);
}

AppUser currentUser = userDetails.getUser();
AppUser currentUser = cd.getUser();
log.info("GET /api/incidents/{} - Fetching incident", id);
notificationService.markNotificationAsReadForIncident(currentUser.getId(), id);

return ResponseEntity.ok(IncidentResponse.fromEntityWithDocuments(incidentService.getById(id, currentUser)));
}

@PreAuthorize("hasRole('ADMIN')")
@PatchMapping("/{incidentId}/assign")
public ResponseEntity<IncidentResponse> assignIncident(@PathVariable Long incidentId,
@Valid @RequestBody AssignIncidentRequest request, @AuthenticationPrincipal CustomUserDetails adminUser) {
@Valid @RequestBody AssignIncidentRequest request, @AuthenticationPrincipal CustomUserDetails userDetails) {
log.info("PATCH /api/incidents/{}/assign - Assigning to handler {}", incidentId, request.handlerId());
Incident updatedIncident = incidentService.assignIncidentToHandler(incidentId, request.handlerId(),
adminUser.getUser());
AppUser user = getUser(userDetails);
Incident updatedIncident = incidentService.assignIncidentToHandler(incidentId, request.handlerId(), user);
return ResponseEntity.ok(IncidentResponse.fromEntityBasic(updatedIncident));
}

@PreAuthorize("hasRole('ADMIN')")
@PatchMapping("/{incidentId}/unassign")
public ResponseEntity<IncidentResponse> unassignIncident(@PathVariable Long incidentId,
@AuthenticationPrincipal CustomUserDetails adminUser) {
@AuthenticationPrincipal CustomUserDetails userDetails) {
log.info("PATCH /api/incidents/{}/unassign - Unassigning incident", incidentId);
Incident updatedIncident = incidentService.unassignIncident(incidentId, adminUser.getUser());
AppUser user = getUser(userDetails);
Incident updatedIncident = incidentService.unassignIncident(incidentId, user);
return ResponseEntity.ok(IncidentResponse.fromEntityBasic(updatedIncident));
}

Expand All @@ -160,10 +172,10 @@ public ResponseEntity<IncidentResponse> resolveIncident(@PathVariable Long incid
@PatchMapping("/{incidentId}/status")
public ResponseEntity<IncidentResponse> updateStatus(@PathVariable Long incidentId,
@Valid @RequestBody UpdateIncidentStatusRequest request,
@AuthenticationPrincipal CustomUserDetails adminUser) {
@AuthenticationPrincipal CustomUserDetails userDetails) {
log.info("PATCH /api/incidents/{}/status - Updating status to {}", incidentId, request.status());
Incident updatedIncident = incidentService.updateIncidentStatus(incidentId, request.status(),
adminUser.getUser());
AppUser user = getUser(userDetails);
Incident updatedIncident = incidentService.updateIncidentStatus(incidentId, request.status(), user);
return ResponseEntity.ok(IncidentResponse.fromEntity(updatedIncident));
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.example.team6backend.incident.dto;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.example.team6backend.document.dto.DocumentDTO;
import org.example.team6backend.incident.entity.Incident;
import org.example.team6backend.incident.entity.IncidentCategory;
Expand All @@ -10,7 +11,9 @@
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

@Slf4j
@Data
public class IncidentResponse {

Expand Down Expand Up @@ -49,8 +52,8 @@ public static IncidentResponse fromEntityWithDocuments(Incident incident) {
if (Hibernate.isInitialized(incident.getDocuments()) && incident.getDocuments() != null) {
response.setHasDocuments(!incident.getDocuments().isEmpty());
if (!incident.getDocuments().isEmpty()) {
List<DocumentDTO> documentDTOs = incident.getDocuments().stream()
.filter(document -> document != null).map(document -> {
List<DocumentDTO> documentDTOs = incident.getDocuments().stream().filter(Objects::nonNull)
.map(document -> {
DocumentDTO dto = new DocumentDTO();
dto.setFileName(document.getFileName());
dto.setFileKey(document.getFileKey());
Expand All @@ -60,6 +63,7 @@ public static IncidentResponse fromEntityWithDocuments(Incident incident) {
}
}
} catch (Exception e) {
log.warn("Failed to load documents for incident ", e);
response.setHasDocuments(false);
response.setDocuments(new ArrayList<>());
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
package org.example.team6backend.incident.entity;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import org.example.team6backend.document.entity.Document;
import org.example.team6backend.user.entity.AppUser;

import java.time.Instant;
import java.util.List;

@Entity
@Getter
@Setter
public class Incident {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Expand Down Expand Up @@ -55,92 +59,4 @@ protected void onCreate() {
protected void onUpdate() {
updatedAt = Instant.now();
}

public Long getId() {
return id;
}

public String getSubject() {
return subject;
}

public String getDescription() {
return description;
}

public IncidentCategory getIncidentCategory() {
return incidentCategory;
}

public IncidentStatus getIncidentStatus() {
return incidentStatus;
}

public AppUser getCreatedBy() {
return createdBy;
}

public AppUser getModifiedBy() {
return modifiedBy;
}

public AppUser getAssignedTo() {
return assignedTo;
}

public Instant getCreatedAt() {
return createdAt;
}

public Instant getUpdatedAt() {
return updatedAt;
}

public List<Document> getDocuments() {
return documents;
}

public void setId(Long id) {
this.id = id;
}

public void setSubject(String subject) {
this.subject = subject;
}

public void setDescription(String description) {
this.description = description;
}

public void setIncidentCategory(IncidentCategory incidentCategory) {
this.incidentCategory = incidentCategory;
}

public void setIncidentStatus(IncidentStatus incidentStatus) {
this.incidentStatus = incidentStatus;
}

public void setCreatedBy(AppUser createdBy) {
this.createdBy = createdBy;
}

public void setModifiedBy(AppUser modifiedBy) {
this.modifiedBy = modifiedBy;
}

public void setAssignedTo(AppUser assignedTo) {
this.assignedTo = assignedTo;
}

public void setCreatedAt(Instant createdAt) {
this.createdAt = createdAt;
}

public void setUpdatedAt(Instant updatedAt) {
this.updatedAt = updatedAt;
}

public void setDocuments(List<Document> documents) {
this.documents = documents;
}
}
Loading
Loading