From 3b85b12741aabefdcdfc1248d7a2f3a4cee7075a Mon Sep 17 00:00:00 2001 From: Andrii Solianyk Date: Fri, 2 May 2025 14:49:22 +0200 Subject: [PATCH] Few improvements such as application.properties.prod file new DTO for response when adding notice --- .../controller/ImageController.java | 8 ++++++-- .../controller/NoticeController.java | 11 +++++----- .../dto/NoticeAdditionDTO.java | 19 ++++++++++++++++++ .../repository/ImageRepository.java | 4 ++++ .../service/ImageService.java | 10 ++++++++++ .../service/NoticeService.java | 4 ++-- src/main/resources/application.properties | 4 ++-- .../resources/application.properties.prod | 20 +++++++++++++++++++ 8 files changed, 69 insertions(+), 11 deletions(-) create mode 100644 src/main/java/_11/asktpk/artisanconnectbackend/dto/NoticeAdditionDTO.java create mode 100644 src/main/resources/application.properties.prod diff --git a/src/main/java/_11/asktpk/artisanconnectbackend/controller/ImageController.java b/src/main/java/_11/asktpk/artisanconnectbackend/controller/ImageController.java index 71f58a9..ce85ce2 100644 --- a/src/main/java/_11/asktpk/artisanconnectbackend/controller/ImageController.java +++ b/src/main/java/_11/asktpk/artisanconnectbackend/controller/ImageController.java @@ -77,8 +77,12 @@ public class ImageController { return ResponseEntity.ok(result); } - @DeleteMapping("/delete/{id}") - public ResponseEntity deleteImage(@PathVariable("id") String filename) { + @DeleteMapping("/delete/{filename}") + public ResponseEntity deleteImage(@PathVariable("filename") String filename) { + if(filename == null) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new RequestResponseDTO("Filename is empty.")); + } + try { imageService.deleteImage(uploadDir, filename); return ResponseEntity.status(HttpStatus.OK).body(new RequestResponseDTO("Image deleted successfully.")); diff --git a/src/main/java/_11/asktpk/artisanconnectbackend/controller/NoticeController.java b/src/main/java/_11/asktpk/artisanconnectbackend/controller/NoticeController.java index 307a8fb..8a4a06b 100644 --- a/src/main/java/_11/asktpk/artisanconnectbackend/controller/NoticeController.java +++ b/src/main/java/_11/asktpk/artisanconnectbackend/controller/NoticeController.java @@ -1,5 +1,6 @@ package _11.asktpk.artisanconnectbackend.controller; +import _11.asktpk.artisanconnectbackend.dto.NoticeAdditionDTO; import _11.asktpk.artisanconnectbackend.service.ClientService; import _11.asktpk.artisanconnectbackend.service.NoticeService; import _11.asktpk.artisanconnectbackend.dto.NoticeDTO; @@ -37,22 +38,22 @@ public class NoticeController { } @PostMapping("/add") - public ResponseEntity addNotice(@RequestBody NoticeDTO dto) { + public ResponseEntity addNotice(@RequestBody NoticeDTO dto) { if (!clientService.clientExists(dto.getClientId())) { return ResponseEntity .status(HttpStatus.BAD_REQUEST) - .body("Nie znaleziono klienta o ID: " + dto.getClientId()); + .body(new NoticeAdditionDTO("Nie znaleziono klienta o ID: " + dto.getClientId())); } if (dto.getCategory() == null) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Nie ma takiej kategorii"); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new NoticeAdditionDTO("Nie ma takiej kategorii")); } dto.setPublishDate(java.time.LocalDateTime.now()); - noticeService.addNotice(dto); + Long newNoticeId = noticeService.addNotice(dto); - return ResponseEntity.status(HttpStatus.CREATED).body("Dodano ogłoszenie."); + return ResponseEntity.status(HttpStatus.CREATED).body(new NoticeAdditionDTO(newNoticeId ,"Dodano ogłoszenie.")); } diff --git a/src/main/java/_11/asktpk/artisanconnectbackend/dto/NoticeAdditionDTO.java b/src/main/java/_11/asktpk/artisanconnectbackend/dto/NoticeAdditionDTO.java new file mode 100644 index 0000000..42dd205 --- /dev/null +++ b/src/main/java/_11/asktpk/artisanconnectbackend/dto/NoticeAdditionDTO.java @@ -0,0 +1,19 @@ +package _11.asktpk.artisanconnectbackend.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter @Setter +public class NoticeAdditionDTO { + public Long noticeId; + public String message; + + public NoticeAdditionDTO(String message) { + this.message = message; + } + + public NoticeAdditionDTO(Long noticeId, String message) { + this.noticeId = noticeId; + this.message = message; + } +} diff --git a/src/main/java/_11/asktpk/artisanconnectbackend/repository/ImageRepository.java b/src/main/java/_11/asktpk/artisanconnectbackend/repository/ImageRepository.java index 3426bec..0cba2cb 100644 --- a/src/main/java/_11/asktpk/artisanconnectbackend/repository/ImageRepository.java +++ b/src/main/java/_11/asktpk/artisanconnectbackend/repository/ImageRepository.java @@ -7,4 +7,8 @@ import java.util.List; public interface ImageRepository extends JpaRepository { List findByNoticeId(Long noticeId); + + boolean existsImageByImageNameEqualsIgnoreCase(String imageName); + + void deleteByImageNameEquals(String imageName); } diff --git a/src/main/java/_11/asktpk/artisanconnectbackend/service/ImageService.java b/src/main/java/_11/asktpk/artisanconnectbackend/service/ImageService.java index 6a2ec7e..e1c6702 100644 --- a/src/main/java/_11/asktpk/artisanconnectbackend/service/ImageService.java +++ b/src/main/java/_11/asktpk/artisanconnectbackend/service/ImageService.java @@ -5,6 +5,7 @@ import _11.asktpk.artisanconnectbackend.repository.ImageRepository; import org.springframework.core.io.Resource; import org.springframework.core.io.UrlResource; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; @@ -17,6 +18,7 @@ import java.util.UUID; import java.util.stream.Collectors; @Service +@Transactional public class ImageService { private final ImageRepository imageRepository; @@ -63,6 +65,8 @@ public class ImageService { public void deleteImage(String imageDirectory, String imageName) throws IOException { Path imagePath = Path.of(imageDirectory, imageName); + deleteImageRecordFromDB(imageName); + if (Files.exists(imagePath)) { Files.delete(imagePath); } else { @@ -80,4 +84,10 @@ public class ImageService { .map(Image::getImageName) .collect(Collectors.toList()); } + + public void deleteImageRecordFromDB(String imageName) { + if(imageRepository.existsImageByImageNameEqualsIgnoreCase(imageName)) { + imageRepository.deleteByImageNameEquals(imageName); + } + } } \ No newline at end of file diff --git a/src/main/java/_11/asktpk/artisanconnectbackend/service/NoticeService.java b/src/main/java/_11/asktpk/artisanconnectbackend/service/NoticeService.java index 633edb3..cf6c884 100644 --- a/src/main/java/_11/asktpk/artisanconnectbackend/service/NoticeService.java +++ b/src/main/java/_11/asktpk/artisanconnectbackend/service/NoticeService.java @@ -68,8 +68,8 @@ public class NoticeService { return toDTO(notice); } - public void addNotice(NoticeDTO dto) { - noticeRepository.save(fromDTO(dto)); + public Long addNotice(NoticeDTO dto) { + return noticeRepository.save(fromDTO(dto)).getIdNotice(); } public boolean noticeExists(Long id) { diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index edfa045..23daefd 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -15,5 +15,5 @@ spring.jpa.defer-datasource-initialization=true spring.jpa.hibernate.ddl-auto=create-drop file.upload-dir=/Users/andsol/Desktop/uploads -spring.servlet.multipart.max-file-size=5MB -spring.servlet.multipart.max-request-size=5MB \ No newline at end of file +spring.servlet.multipart.max-file-size=10MB +spring.servlet.multipart.max-request-size=10MB \ No newline at end of file diff --git a/src/main/resources/application.properties.prod b/src/main/resources/application.properties.prod new file mode 100644 index 0000000..610f4e2 --- /dev/null +++ b/src/main/resources/application.properties.prod @@ -0,0 +1,20 @@ +spring.application.name=ArtisanConnectBackend + +## PostgreSQL +spring.datasource.url=jdbc:postgresql://db:5432/postgres +spring.datasource.driver-class-name=org.postgresql.Driver +spring.datasource.username=postgres +spring.datasource.password=postgres + +#initial data for db injection +spring.sql.init.data-locations=classpath:sql/data.sql +spring.sql.init.mode=always +spring.jpa.defer-datasource-initialization=true + +# create and drop table, good for testing, production set to none or comment it +spring.jpa.hibernate.ddl-auto=update + +#file.upload-dir=/Users/andsol/Desktop/uploads +file.upload-dir=/app/images +spring.servlet.multipart.max-file-size=10MB +spring.servlet.multipart.max-request-size=10MB \ No newline at end of file