From ce6fddf039917220418651af7088a80bfff213b0 Mon Sep 17 00:00:00 2001 From: Felix Eriksson Date: Mon, 27 Apr 2026 21:35:57 +0200 Subject: [PATCH 1/7] fixed edit ticket to allow file upload. changed upload to show files --- src/main/resources/templates/edit_ticket.html | 5 +++-- src/main/resources/templates/upload.html | 7 ++----- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/main/resources/templates/edit_ticket.html b/src/main/resources/templates/edit_ticket.html index f02320b..7b41380 100644 --- a/src/main/resources/templates/edit_ticket.html +++ b/src/main/resources/templates/edit_ticket.html @@ -10,7 +10,7 @@

Edit Ticket

-
+
@@ -26,9 +26,10 @@

Edit Ticket

+
- + Cancel
diff --git a/src/main/resources/templates/upload.html b/src/main/resources/templates/upload.html index 89eb696..68ea68d 100644 --- a/src/main/resources/templates/upload.html +++ b/src/main/resources/templates/upload.html @@ -24,10 +24,7 @@

Upload File

Uploaded Files

-
-

No files uploaded yet.

-
- +
@@ -38,7 +35,7 @@

Uploaded Files

From 6fc11d2d61f54da5a67db2550858398827d169cb Mon Sep 17 00:00:00 2001 From: Felix Eriksson Date: Mon, 27 Apr 2026 22:04:23 +0200 Subject: [PATCH 2/7] fixed download logic in upload.html --- .../org/example/untitled/s3/S3RestController.java | 1 + src/main/java/org/example/untitled/s3/S3Service.java | 1 - .../org/example/untitled/usercase/UploadedFile.java | 2 +- src/main/resources/templates/upload.html | 11 +++++++---- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/example/untitled/s3/S3RestController.java b/src/main/java/org/example/untitled/s3/S3RestController.java index 8b6cec6..2d05a7b 100644 --- a/src/main/java/org/example/untitled/s3/S3RestController.java +++ b/src/main/java/org/example/untitled/s3/S3RestController.java @@ -1,5 +1,6 @@ package org.example.untitled.s3; +import org.example.untitled.usercase.UploadedFile; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.*; diff --git a/src/main/java/org/example/untitled/s3/S3Service.java b/src/main/java/org/example/untitled/s3/S3Service.java index abf4471..df7a467 100644 --- a/src/main/java/org/example/untitled/s3/S3Service.java +++ b/src/main/java/org/example/untitled/s3/S3Service.java @@ -107,7 +107,6 @@ public List createFile(CaseEntity caseEntity, String s3Key) { int indexOfSlash = s3Key.lastIndexOf('/'); String fileName = s3Key.substring(indexOfSlash + 1); uploadedFile.setFilename(fileName); - return List.of(uploadedFile); } } diff --git a/src/main/java/org/example/untitled/usercase/UploadedFile.java b/src/main/java/org/example/untitled/usercase/UploadedFile.java index 25dd26e..4861ae3 100644 --- a/src/main/java/org/example/untitled/usercase/UploadedFile.java +++ b/src/main/java/org/example/untitled/usercase/UploadedFile.java @@ -15,7 +15,7 @@ public class UploadedFile { @Column(nullable = false) private String filename; - @Column(nullable = true) + @Column(name = "s3key") private String s3Key; @Column(nullable = false, updatable = false) diff --git a/src/main/resources/templates/upload.html b/src/main/resources/templates/upload.html index 68ea68d..0623e98 100644 --- a/src/main/resources/templates/upload.html +++ b/src/main/resources/templates/upload.html @@ -15,11 +15,12 @@

File Upload

Upload File

-
+ - +

-
+ +
@@ -35,7 +36,9 @@

Uploaded Files

From 29bdeceed4063f68a6e61e05b2c625b3fe98582d Mon Sep 17 00:00:00 2001 From: Felix Eriksson Date: Mon, 27 Apr 2026 22:46:35 +0200 Subject: [PATCH 3/7] added files associated to ticket --- .../org/example/untitled/s3/S3Service.java | 5 ++-- .../usercase/controller/CaseController.java | 8 ++++++- .../repository/UploadedFileRepository.java | 15 ++++++++++++ .../usercase/service/CaseService.java | 23 ++++++++++++++++--- src/main/resources/templates/ticket.html | 12 ++++++++++ 5 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 src/main/java/org/example/untitled/usercase/repository/UploadedFileRepository.java diff --git a/src/main/java/org/example/untitled/s3/S3Service.java b/src/main/java/org/example/untitled/s3/S3Service.java index df7a467..a94c079 100644 --- a/src/main/java/org/example/untitled/s3/S3Service.java +++ b/src/main/java/org/example/untitled/s3/S3Service.java @@ -3,6 +3,7 @@ import jakarta.annotation.PostConstruct; import org.example.untitled.usercase.CaseEntity; import org.example.untitled.usercase.UploadedFile; +import org.example.untitled.usercase.repository.UploadedFileRepository; import org.springframework.stereotype.Service; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.*; @@ -99,7 +100,7 @@ public void deleteFile(String filename){ .key(filename)); } - public List createFile(CaseEntity caseEntity, String s3Key) { + public UploadedFile createFile(CaseEntity caseEntity, String s3Key) { UploadedFile uploadedFile = new UploadedFile(); uploadedFile.setUploadedBy(caseEntity.getOwner()); uploadedFile.setAssociatedCase(caseEntity); @@ -107,6 +108,6 @@ public List createFile(CaseEntity caseEntity, String s3Key) { int indexOfSlash = s3Key.lastIndexOf('/'); String fileName = s3Key.substring(indexOfSlash + 1); uploadedFile.setFilename(fileName); - return List.of(uploadedFile); + return uploadedFile; } } diff --git a/src/main/java/org/example/untitled/usercase/controller/CaseController.java b/src/main/java/org/example/untitled/usercase/controller/CaseController.java index 60cbdac..4ee8dcb 100644 --- a/src/main/java/org/example/untitled/usercase/controller/CaseController.java +++ b/src/main/java/org/example/untitled/usercase/controller/CaseController.java @@ -1,8 +1,10 @@ package org.example.untitled.usercase.controller; import jakarta.validation.Valid; +import org.example.untitled.s3.S3Service; import org.example.untitled.user.Role; import org.example.untitled.usercase.CaseStatus; +import org.example.untitled.usercase.UploadedFile; import org.example.untitled.usercase.dto.CaseEntityDto; import org.example.untitled.usercase.dto.CommentDto; import org.example.untitled.usercase.dto.CreateCaseRequest; @@ -33,11 +35,13 @@ public class CaseController { private final CaseService caseService; private final CommentService commentService; private static final Logger log = LoggerFactory.getLogger(CaseController.class); + private final S3Service s3Service; - public CaseController(CaseService caseService, CommentService commentService) { + public CaseController(CaseService caseService, CommentService commentService, S3Service s3Service) { this.caseService = caseService; this.commentService = commentService; + this.s3Service = s3Service; } @PostMapping @@ -71,8 +75,10 @@ public String showTicketDetails( throw new ResponseStatusException(HttpStatus.FORBIDDEN, "You do not own this ticket"); List comments = commentService.getCommentsByTicketId(id); + List files = caseService.getTicketFiles(id); model.addAttribute("ticket", ticket); model.addAttribute("comments", comments); + model.addAttribute("files", files); return "ticket"; } diff --git a/src/main/java/org/example/untitled/usercase/repository/UploadedFileRepository.java b/src/main/java/org/example/untitled/usercase/repository/UploadedFileRepository.java new file mode 100644 index 0000000..b49eb61 --- /dev/null +++ b/src/main/java/org/example/untitled/usercase/repository/UploadedFileRepository.java @@ -0,0 +1,15 @@ +package org.example.untitled.usercase.repository; + +import org.example.untitled.usercase.CaseEntity; +import org.example.untitled.usercase.UploadedFile; +import org.springframework.data.repository.ListCrudRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface UploadedFileRepository extends ListCrudRepository { + + List associatedCaseEntity(CaseEntity caseEntity); + +} diff --git a/src/main/java/org/example/untitled/usercase/service/CaseService.java b/src/main/java/org/example/untitled/usercase/service/CaseService.java index 46b5dbc..9b02b35 100644 --- a/src/main/java/org/example/untitled/usercase/service/CaseService.java +++ b/src/main/java/org/example/untitled/usercase/service/CaseService.java @@ -17,6 +17,7 @@ import org.example.untitled.usercase.dto.CreateCommentRequest; import org.example.untitled.usercase.mapper.CaseMapper; import org.example.untitled.usercase.repository.CaseRepository; +import org.example.untitled.usercase.repository.UploadedFileRepository; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -34,6 +35,7 @@ public class CaseService { private final UserRepository userRepository; private final AuditLogService auditLogService; private final CommentService commentService; + private final UploadedFileRepository uploadedFileRepository; private final S3Service s3Service; public CaseService( @@ -41,12 +43,14 @@ public CaseService( UserRepository userRepository, CommentService commentService, S3Service s3Service, - AuditLogService auditLogService) { + AuditLogService auditLogService, + UploadedFileRepository fileRepository) { this.caseRepository = caseRepository; this.userRepository = userRepository; this.commentService = commentService; this.auditLogService = auditLogService; this.s3Service = s3Service; + this.uploadedFileRepository = fileRepository; } @Transactional @@ -64,7 +68,9 @@ public CaseEntityDto createTicket(CreateCaseRequest request, String username) { if (request.getFileNames() != null){ for(String fName : request.getFileNames()){ if (fName == null || fName.isBlank()) continue; - caseEntity.getFiles().addAll(s3Service.createFile(caseEntity, fName)); + UploadedFile uploadFile = s3Service.createFile(caseEntity, fName); + uploadedFileRepository.save(uploadFile); + caseEntity.getFiles().add(uploadFile); } } CaseEntity saved = caseRepository.save(caseEntity); @@ -102,7 +108,9 @@ public CaseEntityDto updateTicket(Long id, CreateCaseRequest request, String use .collect(Collectors.toSet()); for(String fName : request.getFileNames()){ if (fName == null || fName.isBlank() || existing.contains(fName)) continue; - caseEntity.getFiles().addAll(s3Service.createFile(caseEntity, fName)); + UploadedFile uploadFile = s3Service.createFile(caseEntity, fName); + uploadedFileRepository.save(uploadFile); + caseEntity.getFiles().add(uploadFile); } } CaseEntity saved = caseRepository.save(caseEntity); @@ -170,6 +178,15 @@ public CaseEntityDto getTicketByID(long id) { () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Ticket not found: " + id)); return CaseMapper.toDto(caseEntity); } + + public List getTicketFiles(long id) { + CaseEntity caseEntity = caseRepository.findById(id) + .orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Ticket not found: " + id)); + + return uploadedFileRepository.associatedCaseEntity(caseEntity).stream() + .toList(); + } public User findOwnerById(long id) { return caseRepository.findOwnerById(id); } diff --git a/src/main/resources/templates/ticket.html b/src/main/resources/templates/ticket.html index ef79986..f122b74 100644 --- a/src/main/resources/templates/ticket.html +++ b/src/main/resources/templates/ticket.html @@ -6,6 +6,7 @@ Ticket +
@@ -35,6 +36,17 @@

Ticket Details

+
+
+ + + + +
File Name
- +
- +
+ +
- - - - + + + + - - - - + + + +
File NameAction
File NameAction
- -
+ +
+

+
+ \ No newline at end of file diff --git a/src/main/resources/templates/userpage.html b/src/main/resources/templates/userpage.html index a5981c7..c257c2e 100644 --- a/src/main/resources/templates/userpage.html +++ b/src/main/resources/templates/userpage.html @@ -11,7 +11,7 @@

My Tickets

+ New ticket - Upload file + User Files
From 07b6d41f35bb4f397e10014a20358563dc53a7f4 Mon Sep 17 00:00:00 2001 From: Felix Eriksson Date: Mon, 27 Apr 2026 23:46:07 +0200 Subject: [PATCH 5/7] mvn spotless refactoring --- src/main/java/org/example/untitled/s3/S3RestController.java | 1 - .../org/example/untitled/user/controller/UserController.java | 2 -- 2 files changed, 3 deletions(-) diff --git a/src/main/java/org/example/untitled/s3/S3RestController.java b/src/main/java/org/example/untitled/s3/S3RestController.java index 2d05a7b..8b6cec6 100644 --- a/src/main/java/org/example/untitled/s3/S3RestController.java +++ b/src/main/java/org/example/untitled/s3/S3RestController.java @@ -1,6 +1,5 @@ package org.example.untitled.s3; -import org.example.untitled.usercase.UploadedFile; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.*; diff --git a/src/main/java/org/example/untitled/user/controller/UserController.java b/src/main/java/org/example/untitled/user/controller/UserController.java index 7aead80..889ac1d 100644 --- a/src/main/java/org/example/untitled/user/controller/UserController.java +++ b/src/main/java/org/example/untitled/user/controller/UserController.java @@ -5,7 +5,6 @@ import org.example.untitled.exception.EmailAlreadyExistsException; import org.example.untitled.exception.UserAlreadyExistsException; import org.example.untitled.user.service.UserService; -import org.example.untitled.usercase.UploadedFile; import org.example.untitled.usercase.service.CaseService; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.core.annotation.AuthenticationPrincipal; @@ -18,7 +17,6 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; -import java.util.List; @Controller public class UserController { From 843341bb6b3158928a1fd64bc721e9df825545f0 Mon Sep 17 00:00:00 2001 From: Felix Eriksson Date: Tue, 28 Apr 2026 09:03:16 +0200 Subject: [PATCH 6/7] last minute addition after merging with main to comment ticket --- src/main/java/org/example/untitled/s3/S3Service.java | 2 +- .../example/untitled/usercase/service/CaseService.java | 7 +++++++ src/main/resources/templates/edit_ticket.html | 2 +- src/main/resources/templates/ticket.html | 8 +++++++- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/example/untitled/s3/S3Service.java b/src/main/java/org/example/untitled/s3/S3Service.java index b818138..a94c079 100644 --- a/src/main/java/org/example/untitled/s3/S3Service.java +++ b/src/main/java/org/example/untitled/s3/S3Service.java @@ -24,7 +24,7 @@ public class S3Service { private final S3Presigner s3Presigner; private static final String BUCKET_NAME = "chum-bucket"; - public S3Service(S3Client s3Client, S3Presigner s3Presigner, UploadedFileRepository uploadedFileRepository){ + public S3Service(S3Client s3Client, S3Presigner s3Presigner){ this.s3Client = s3Client; this.s3Presigner = s3Presigner; } diff --git a/src/main/java/org/example/untitled/usercase/service/CaseService.java b/src/main/java/org/example/untitled/usercase/service/CaseService.java index ae656ca..59a5e08 100644 --- a/src/main/java/org/example/untitled/usercase/service/CaseService.java +++ b/src/main/java/org/example/untitled/usercase/service/CaseService.java @@ -18,6 +18,7 @@ import org.example.untitled.usercase.mapper.CaseMapper; import org.example.untitled.usercase.repository.CaseRepository; import org.example.untitled.usercase.repository.UploadedFileRepository; +import org.jspecify.annotations.Nullable; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -194,4 +195,10 @@ public User findOwnerById(long id) { public boolean isNotOwner(CaseEntityDto ticket, String username) { return !ticket.ownerUsername().equals(username); } + + public @Nullable List getUserFiles(String username) { + User actor = userRepository.findByUsername(username) + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "User not found")); + return uploadedFileRepository.getUploadedFilesByUploadedBy(actor); + } } diff --git a/src/main/resources/templates/edit_ticket.html b/src/main/resources/templates/edit_ticket.html index 7b41380..b44c818 100644 --- a/src/main/resources/templates/edit_ticket.html +++ b/src/main/resources/templates/edit_ticket.html @@ -23,7 +23,7 @@

Edit Ticket

- +

diff --git a/src/main/resources/templates/ticket.html b/src/main/resources/templates/ticket.html index fc36619..3184f5a 100644 --- a/src/main/resources/templates/ticket.html +++ b/src/main/resources/templates/ticket.html @@ -60,8 +60,14 @@

Add Comment

th:errors="*{text}" class="field-error"> +
+ + +

+
+
- +
From 2297c92c198806a04847d5e1e312dad790bc576f Mon Sep 17 00:00:00 2001 From: Felix Eriksson Date: Tue, 28 Apr 2026 09:04:57 +0200 Subject: [PATCH 7/7] mvn spotless to fix errors --- src/main/java/org/example/untitled/s3/S3Service.java | 1 - .../org/example/untitled/usercase/controller/CaseController.java | 1 - 2 files changed, 2 deletions(-) diff --git a/src/main/java/org/example/untitled/s3/S3Service.java b/src/main/java/org/example/untitled/s3/S3Service.java index a94c079..8cb6009 100644 --- a/src/main/java/org/example/untitled/s3/S3Service.java +++ b/src/main/java/org/example/untitled/s3/S3Service.java @@ -3,7 +3,6 @@ import jakarta.annotation.PostConstruct; import org.example.untitled.usercase.CaseEntity; import org.example.untitled.usercase.UploadedFile; -import org.example.untitled.usercase.repository.UploadedFileRepository; import org.springframework.stereotype.Service; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.*; diff --git a/src/main/java/org/example/untitled/usercase/controller/CaseController.java b/src/main/java/org/example/untitled/usercase/controller/CaseController.java index 018b9fa..f12ec3b 100644 --- a/src/main/java/org/example/untitled/usercase/controller/CaseController.java +++ b/src/main/java/org/example/untitled/usercase/controller/CaseController.java @@ -1,7 +1,6 @@ package org.example.untitled.usercase.controller; import jakarta.validation.Valid; -import org.example.untitled.s3.S3Service; import org.example.untitled.user.Role; import org.example.untitled.user.service.UserService; import org.example.untitled.usercase.AuditLog;