diff --git a/backend/codiki-application/src/main/java/org/codiki/application/publication/PublicationUseCases.java b/backend/codiki-application/src/main/java/org/codiki/application/publication/PublicationUseCases.java index e11eb79..6795986 100644 --- a/backend/codiki-application/src/main/java/org/codiki/application/publication/PublicationUseCases.java +++ b/backend/codiki-application/src/main/java/org/codiki/application/publication/PublicationUseCases.java @@ -3,6 +3,7 @@ package org.codiki.application.publication; import static java.util.Objects.isNull; import java.time.Clock; import java.time.ZonedDateTime; +import java.util.Collection; import java.util.List; import java.util.Optional; import java.util.UUID; @@ -190,4 +191,8 @@ public class PublicationUseCases { return publicationPort.search(criteria); } + + public List getLatest() { + return publicationPort.getLatest(); + } } diff --git a/backend/codiki-domain/src/main/java/org/codiki/domain/publication/port/PublicationPort.java b/backend/codiki-domain/src/main/java/org/codiki/domain/publication/port/PublicationPort.java index bfca8bf..d48cdf8 100644 --- a/backend/codiki-domain/src/main/java/org/codiki/domain/publication/port/PublicationPort.java +++ b/backend/codiki-domain/src/main/java/org/codiki/domain/publication/port/PublicationPort.java @@ -15,4 +15,6 @@ public interface PublicationPort { void delete(Publication publication); List search(List criteria); + + List getLatest(); } diff --git a/backend/codiki-exposition/src/main/java/org/codiki/exposition/configuration/security/SecurityConfiguration.java b/backend/codiki-exposition/src/main/java/org/codiki/exposition/configuration/security/SecurityConfiguration.java index 750a166..497b1c5 100644 --- a/backend/codiki-exposition/src/main/java/org/codiki/exposition/configuration/security/SecurityConfiguration.java +++ b/backend/codiki-exposition/src/main/java/org/codiki/exposition/configuration/security/SecurityConfiguration.java @@ -48,6 +48,7 @@ public class SecurityConfiguration { "/api/pictures/{pictureId}", "/api/publications/{publicationId}", "/api/publications", + "/api/publications/latest", "/error" ).permitAll() .requestMatchers( diff --git a/backend/codiki-exposition/src/main/java/org/codiki/exposition/publication/PublicationController.java b/backend/codiki-exposition/src/main/java/org/codiki/exposition/publication/PublicationController.java index 4f411ee..dbeb1fc 100644 --- a/backend/codiki-exposition/src/main/java/org/codiki/exposition/publication/PublicationController.java +++ b/backend/codiki-exposition/src/main/java/org/codiki/exposition/publication/PublicationController.java @@ -66,7 +66,7 @@ public class PublicationController { @GetMapping public List searchPublications(@RequestParam("query") String searchQuery) { - final List publications = publicationUseCases.searchPublications(searchQuery) + List publications = publicationUseCases.searchPublications(searchQuery) .stream() .map(PublicationDto::new) .toList(); @@ -77,4 +77,18 @@ public class PublicationController { return publications; } + + @GetMapping("/latest") + public List getLatestPublications() { + List publications = publicationUseCases.getLatest() + .stream() + .map(PublicationDto::new) + .toList(); + + if (isEmpty(publications)) { + throw new NoPublicationSearchResultException(); + } + + return publications; + } } diff --git a/backend/codiki-infrastructure/src/main/java/org/codiki/infrastructure/publication/PublicationJpaAdapter.java b/backend/codiki-infrastructure/src/main/java/org/codiki/infrastructure/publication/PublicationJpaAdapter.java index 8480ff8..b50eca2 100644 --- a/backend/codiki-infrastructure/src/main/java/org/codiki/infrastructure/publication/PublicationJpaAdapter.java +++ b/backend/codiki-infrastructure/src/main/java/org/codiki/infrastructure/publication/PublicationJpaAdapter.java @@ -6,6 +6,7 @@ import org.codiki.domain.publication.port.PublicationPort; import org.codiki.infrastructure.publication.model.PublicationEntity; import org.codiki.infrastructure.publication.model.PublicationSearchResult; import org.codiki.infrastructure.publication.repository.PublicationRepository; +import org.springframework.data.domain.Limit; import org.springframework.stereotype.Component; import java.util.List; @@ -56,4 +57,12 @@ public class PublicationJpaAdapter implements PublicationPort { .map(PublicationSearchResult::getPublication) .toList(); } + + @Override + public List getLatest() { + return repository.getLatest(Limit.of(10)) + .stream() + .map(PublicationEntity::toDomain) + .toList(); + } } diff --git a/backend/codiki-infrastructure/src/main/java/org/codiki/infrastructure/publication/repository/PublicationRepository.java b/backend/codiki-infrastructure/src/main/java/org/codiki/infrastructure/publication/repository/PublicationRepository.java index fdcd4ff..a1ed02a 100644 --- a/backend/codiki-infrastructure/src/main/java/org/codiki/infrastructure/publication/repository/PublicationRepository.java +++ b/backend/codiki-infrastructure/src/main/java/org/codiki/infrastructure/publication/repository/PublicationRepository.java @@ -1,9 +1,11 @@ package org.codiki.infrastructure.publication.repository; +import java.util.List; import java.util.Optional; import java.util.UUID; import org.codiki.infrastructure.publication.model.PublicationEntity; +import org.springframework.data.domain.Limit; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -16,4 +18,12 @@ public interface PublicationRepository extends JpaRepository findById(@Param("publicationId") UUID publicationId); + + @Query(""" + SELECT p + FROM PublicationEntity p + JOIN FETCH p.author a + ORDER BY p.creationDate DESC + """) + List getLatest(Limit limit); } diff --git a/backend/rest-client-collection/Codiki/Publication/Get latest.bru b/backend/rest-client-collection/Codiki/Publication/Get latest.bru new file mode 100644 index 0000000..e4256d0 --- /dev/null +++ b/backend/rest-client-collection/Codiki/Publication/Get latest.bru @@ -0,0 +1,11 @@ +meta { + name: Get latest + type: http + seq: 6 +} + +get { + url: {{url}}/api/publications/latest + body: none + auth: none +}