Add endpoint to retrieve latest publications.

This commit is contained in:
Florian THIERRY
2024-06-04 13:06:20 +02:00
parent 067bf7885a
commit 58295398e0
7 changed files with 53 additions and 1 deletions

View File

@@ -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<Publication> getLatest() {
return publicationPort.getLatest();
}
}

View File

@@ -15,4 +15,6 @@ public interface PublicationPort {
void delete(Publication publication);
List<Publication> search(List<PublicationSearchCriterion> criteria);
List<Publication> getLatest();
}

View File

@@ -48,6 +48,7 @@ public class SecurityConfiguration {
"/api/pictures/{pictureId}",
"/api/publications/{publicationId}",
"/api/publications",
"/api/publications/latest",
"/error"
).permitAll()
.requestMatchers(

View File

@@ -66,7 +66,21 @@ public class PublicationController {
@GetMapping
public List<PublicationDto> searchPublications(@RequestParam("query") String searchQuery) {
final List<PublicationDto> publications = publicationUseCases.searchPublications(searchQuery)
List<PublicationDto> publications = publicationUseCases.searchPublications(searchQuery)
.stream()
.map(PublicationDto::new)
.toList();
if (isEmpty(publications)) {
throw new NoPublicationSearchResultException();
}
return publications;
}
@GetMapping("/latest")
public List<PublicationDto> getLatestPublications() {
List<PublicationDto> publications = publicationUseCases.getLatest()
.stream()
.map(PublicationDto::new)
.toList();

View File

@@ -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<Publication> getLatest() {
return repository.getLatest(Limit.of(10))
.stream()
.map(PublicationEntity::toDomain)
.toList();
}
}

View File

@@ -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<PublicationEntity,
WHERE p.id = :publicationId
""")
Optional<PublicationEntity> findById(@Param("publicationId") UUID publicationId);
@Query("""
SELECT p
FROM PublicationEntity p
JOIN FETCH p.author a
ORDER BY p.creationDate DESC
""")
List<PublicationEntity> getLatest(Limit limit);
}

View File

@@ -0,0 +1,11 @@
meta {
name: Get latest
type: http
seq: 6
}
get {
url: {{url}}/api/publications/latest
body: none
auth: none
}