diff --git a/codiki-application/src/main/java/org/codiki/application/publication/PublicationUseCases.java b/codiki-application/src/main/java/org/codiki/application/publication/PublicationUseCases.java index 61ab22a..d7aa051 100644 --- a/codiki-application/src/main/java/org/codiki/application/publication/PublicationUseCases.java +++ b/codiki-application/src/main/java/org/codiki/application/publication/PublicationUseCases.java @@ -123,4 +123,18 @@ public class PublicationUseCases { return updatedPublication; } + + public void deletePublication(UUID publicationId) { + Publication publicationToDelete = publicationPort.findById(publicationId) + .orElseThrow(() -> new PublicationNotFoundException(publicationId)); + + User authenticatedUser = userUseCases.getAuthenticatedUser() + .orElseThrow(AuthenticationRequiredException::new); + + if (!publicationToDelete.author().id().equals(authenticatedUser.id())) { + throw new PublicationUpdateForbiddenException(); + } + + publicationPort.delete(publicationToDelete); + } } diff --git a/codiki-domain/src/main/java/org/codiki/domain/publication/port/PublicationPort.java b/codiki-domain/src/main/java/org/codiki/domain/publication/port/PublicationPort.java index a97d088..090f97d 100644 --- a/codiki-domain/src/main/java/org/codiki/domain/publication/port/PublicationPort.java +++ b/codiki-domain/src/main/java/org/codiki/domain/publication/port/PublicationPort.java @@ -9,4 +9,6 @@ public interface PublicationPort { void save(Publication publication); Optional findById(UUID publicationId); + + void delete(Publication publication); } diff --git a/codiki-exposition/src/main/java/org/codiki/exposition/publication/PublicationController.java b/codiki-exposition/src/main/java/org/codiki/exposition/publication/PublicationController.java index db69ecc..7bbc504 100644 --- a/codiki-exposition/src/main/java/org/codiki/exposition/publication/PublicationController.java +++ b/codiki-exposition/src/main/java/org/codiki/exposition/publication/PublicationController.java @@ -6,6 +6,7 @@ import org.codiki.application.publication.PublicationUseCases; import org.codiki.domain.publication.model.Publication; import org.codiki.domain.publication.model.PublicationEditionRequest; import org.codiki.exposition.publication.model.PublicationEditionRequestDto; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; @@ -38,4 +39,9 @@ public class PublicationController { Publication updatedPublication = publicationUseCases.updatePublication(publicationId, request); return new PublicationDto(updatedPublication); } + + @DeleteMapping("/{publicationId}") + public void deletePublication(@PathVariable("publicationId") UUID publicationId) { + publicationUseCases.deletePublication(publicationId); + } } diff --git a/codiki-infrastructure/src/main/java/org/codiki/infrastructure/publication/PublicationJpaAdapter.java b/codiki-infrastructure/src/main/java/org/codiki/infrastructure/publication/PublicationJpaAdapter.java index e69bd7c..a0a2548 100644 --- a/codiki-infrastructure/src/main/java/org/codiki/infrastructure/publication/PublicationJpaAdapter.java +++ b/codiki-infrastructure/src/main/java/org/codiki/infrastructure/publication/PublicationJpaAdapter.java @@ -28,4 +28,9 @@ public class PublicationJpaAdapter implements PublicationPort { return repository.findById(publicationId) .map(PublicationEntity::toDomain); } + + @Override + public void delete(Publication publication) { + repository.deleteById(publication.id()); + } } diff --git a/codiki-infrastructure/src/main/java/org/codiki/infrastructure/publication/repository/PublicationRepository.java b/codiki-infrastructure/src/main/java/org/codiki/infrastructure/publication/repository/PublicationRepository.java index 8b513f0..a50ed58 100644 --- a/codiki-infrastructure/src/main/java/org/codiki/infrastructure/publication/repository/PublicationRepository.java +++ b/codiki-infrastructure/src/main/java/org/codiki/infrastructure/publication/repository/PublicationRepository.java @@ -1,9 +1,14 @@ package org.codiki.infrastructure.publication.repository; +import java.util.Optional; import java.util.UUID; import org.codiki.infrastructure.publication.model.PublicationEntity; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; public interface PublicationRepository extends JpaRepository { + @Query("SELECT p FROM PublicationEntity p JOIN FETCH p.author a JOIN FETCH p.category C WHERE p.id = :publicationId") + Optional findById(@Param("publicationId") UUID publicationId); } diff --git a/rest-client-collection/Codiki/environments/localhost.bru b/rest-client-collection/Codiki/environments/localhost.bru index b283c11..075519c 100644 --- a/rest-client-collection/Codiki/environments/localhost.bru +++ b/rest-client-collection/Codiki/environments/localhost.bru @@ -1,5 +1,5 @@ vars { url: http://localhost:8080 - publicationId: 31301854-e7c2-4c92-8d91-e9e146a9048f - bearerToken: eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI1YWQ0NjJiOC04ZjllLTRhMjYtYmI4Ni1jNzRmZWY1ZDExYjYiLCJleHAiOjE3MTAyMzg3Mzh9.4OLDr87maWETWjjsue0rZp8A1r01Z2TE30RPJ3GwnyTybwWFDruV1h32kUrDwFRuA-tbUUHv_YnzDyy75sft3A + publicationId: f3a6486c-02f0-4db7-a2e1-1563bc994e7f + bearerToken: eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI1YWQ0NjJiOC04ZjllLTRhMjYtYmI4Ni1jNzRmZWY1ZDExYjYiLCJleHAiOjE3MTAyMzkzMDR9.2S0ar_3Z2lM-nwgVwiydwycu2XXoHWudZgqaiyEVC6T8IWnb3upTIC3HshyTtHJ0bLetQ7XXqRftPFLTNKgOrw }