Implementation of publication deletion.

This commit is contained in:
Florian THIERRY
2024-03-12 11:08:33 +01:00
parent 571b005770
commit 822eae5991
6 changed files with 34 additions and 2 deletions

View File

@@ -123,4 +123,18 @@ public class PublicationUseCases {
return updatedPublication; 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);
}
} }

View File

@@ -9,4 +9,6 @@ public interface PublicationPort {
void save(Publication publication); void save(Publication publication);
Optional<Publication> findById(UUID publicationId); Optional<Publication> findById(UUID publicationId);
void delete(Publication publication);
} }

View File

@@ -6,6 +6,7 @@ import org.codiki.application.publication.PublicationUseCases;
import org.codiki.domain.publication.model.Publication; import org.codiki.domain.publication.model.Publication;
import org.codiki.domain.publication.model.PublicationEditionRequest; import org.codiki.domain.publication.model.PublicationEditionRequest;
import org.codiki.exposition.publication.model.PublicationEditionRequestDto; 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.PathVariable;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.PutMapping;
@@ -38,4 +39,9 @@ public class PublicationController {
Publication updatedPublication = publicationUseCases.updatePublication(publicationId, request); Publication updatedPublication = publicationUseCases.updatePublication(publicationId, request);
return new PublicationDto(updatedPublication); return new PublicationDto(updatedPublication);
} }
@DeleteMapping("/{publicationId}")
public void deletePublication(@PathVariable("publicationId") UUID publicationId) {
publicationUseCases.deletePublication(publicationId);
}
} }

View File

@@ -28,4 +28,9 @@ public class PublicationJpaAdapter implements PublicationPort {
return repository.findById(publicationId) return repository.findById(publicationId)
.map(PublicationEntity::toDomain); .map(PublicationEntity::toDomain);
} }
@Override
public void delete(Publication publication) {
repository.deleteById(publication.id());
}
} }

View File

@@ -1,9 +1,14 @@
package org.codiki.infrastructure.publication.repository; package org.codiki.infrastructure.publication.repository;
import java.util.Optional;
import java.util.UUID; import java.util.UUID;
import org.codiki.infrastructure.publication.model.PublicationEntity; import org.codiki.infrastructure.publication.model.PublicationEntity;
import org.springframework.data.jpa.repository.JpaRepository; 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<PublicationEntity, UUID> { public interface PublicationRepository extends JpaRepository<PublicationEntity, UUID> {
@Query("SELECT p FROM PublicationEntity p JOIN FETCH p.author a JOIN FETCH p.category C WHERE p.id = :publicationId")
Optional<PublicationEntity> findById(@Param("publicationId") UUID publicationId);
} }

View File

@@ -1,5 +1,5 @@
vars { vars {
url: http://localhost:8080 url: http://localhost:8080
publicationId: 31301854-e7c2-4c92-8d91-e9e146a9048f publicationId: f3a6486c-02f0-4db7-a2e1-1563bc994e7f
bearerToken: eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI1YWQ0NjJiOC04ZjllLTRhMjYtYmI4Ni1jNzRmZWY1ZDExYjYiLCJleHAiOjE3MTAyMzg3Mzh9.4OLDr87maWETWjjsue0rZp8A1r01Z2TE30RPJ3GwnyTybwWFDruV1h32kUrDwFRuA-tbUUHv_YnzDyy75sft3A bearerToken: eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI1YWQ0NjJiOC04ZjllLTRhMjYtYmI4Ni1jNzRmZWY1ZDExYjYiLCJleHAiOjE3MTAyMzkzMDR9.2S0ar_3Z2lM-nwgVwiydwycu2XXoHWudZgqaiyEVC6T8IWnb3upTIC3HshyTtHJ0bLetQ7XXqRftPFLTNKgOrw
} }