From adc3cdf9a356a9d1338ae579d835d9317f48dc84 Mon Sep 17 00:00:00 2001 From: Florian THIERRY Date: Thu, 14 Mar 2024 09:55:51 +0100 Subject: [PATCH] Add dependency to pictures in publications. --- .../application/picture/PictureUseCases.java | 7 +++-- .../PublicationCreationRequestValidator.java | 4 +-- .../PublicationUpdateRequestValidator.java | 2 +- .../publication/PublicationUseCases.java | 26 +++++++++++++++---- .../PublicationEditionException.java | 2 +- .../domain/publication/model/Publication.java | 3 ++- .../model/PublicationEditionRequest.java | 2 +- .../model/builder/AuthorBuilder.java | 2 +- .../model/builder/PublicationBuilder.java | 12 ++++----- .../exposition/picture/PictureController.java | 4 ++- .../publication/PublicationDto.java | 4 +-- .../model/PublicationEditionRequestDto.java | 4 +-- .../publication/model/AuthorEntity.java | 4 +-- .../publication/model/PublicationEntity.java | 11 ++++---- .../001-initial-script-tables-creation.sql | 13 ++++++---- .../Codiki/environments/localhost.bru | 2 +- 16 files changed, 62 insertions(+), 40 deletions(-) diff --git a/codiki-application/src/main/java/org/codiki/application/picture/PictureUseCases.java b/codiki-application/src/main/java/org/codiki/application/picture/PictureUseCases.java index 7ff59be..a4a2d02 100644 --- a/codiki-application/src/main/java/org/codiki/application/picture/PictureUseCases.java +++ b/codiki-application/src/main/java/org/codiki/application/picture/PictureUseCases.java @@ -1,10 +1,10 @@ package org.codiki.application.picture; import java.io.File; +import java.util.Optional; import java.util.UUID; import static org.codiki.domain.picture.model.builder.PictureBuilder.aPicture; -import org.codiki.domain.picture.exception.PictureNotFoundException; import org.codiki.domain.picture.model.Picture; import org.codiki.domain.picture.port.PicturePort; import org.springframework.stereotype.Service; @@ -32,8 +32,7 @@ public class PictureUseCases { picturePort.deleteById(pictureId); } - public Picture findById(UUID pictureId) { - return picturePort.findById(pictureId) - .orElseThrow(() -> new PictureNotFoundException(pictureId)); + public Optional findById(UUID pictureId) { + return picturePort.findById(pictureId); } } diff --git a/codiki-application/src/main/java/org/codiki/application/publication/PublicationCreationRequestValidator.java b/codiki-application/src/main/java/org/codiki/application/publication/PublicationCreationRequestValidator.java index 1cd10a6..3d45d77 100644 --- a/codiki-application/src/main/java/org/codiki/application/publication/PublicationCreationRequestValidator.java +++ b/codiki-application/src/main/java/org/codiki/application/publication/PublicationCreationRequestValidator.java @@ -19,8 +19,8 @@ public class PublicationCreationRequestValidator { throw new PublicationEditionException("description cannot be null"); } - if (request.image() == null) { - throw new PublicationEditionException("image cannot be null"); + if (request.pictureId() == null) { + throw new PublicationEditionException("pictureId cannot be null"); } } } diff --git a/codiki-application/src/main/java/org/codiki/application/publication/PublicationUpdateRequestValidator.java b/codiki-application/src/main/java/org/codiki/application/publication/PublicationUpdateRequestValidator.java index 7048d3c..83435bd 100644 --- a/codiki-application/src/main/java/org/codiki/application/publication/PublicationUpdateRequestValidator.java +++ b/codiki-application/src/main/java/org/codiki/application/publication/PublicationUpdateRequestValidator.java @@ -13,7 +13,7 @@ public class PublicationUpdateRequestValidator { isNull(request.title()) && isNull(request.text()) && isNull(request.description()) && - isNull(request.image()) && + isNull(request.pictureId()) && isNull(request.categoryId()) ) { throw new PublicationEditionException("no any field is filled"); 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 d7aa051..bb6ad60 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 @@ -8,10 +8,13 @@ import java.util.UUID; import static org.codiki.domain.publication.model.builder.AuthorBuilder.anAuthor; import static org.codiki.domain.publication.model.builder.PublicationBuilder.aPublication; import org.codiki.application.category.CategoryUseCases; +import org.codiki.application.picture.PictureUseCases; import org.codiki.application.user.UserUseCases; import org.codiki.domain.category.exception.CategoryNotFoundException; import org.codiki.domain.category.model.Category; import org.codiki.domain.exception.AuthenticationRequiredException; +import org.codiki.domain.picture.exception.PictureNotFoundException; +import org.codiki.domain.picture.model.Picture; import org.codiki.domain.publication.exception.PublicationEditionException; import org.codiki.domain.publication.exception.PublicationNotFoundException; import org.codiki.domain.publication.exception.PublicationUpdateForbiddenException; @@ -25,19 +28,22 @@ import org.springframework.stereotype.Service; @Service public class PublicationUseCases { private final CategoryUseCases categoryUseCases; + private final Clock clock; private final KeyGenerator keyGenerator; + private final PictureUseCases pictureUseCases; private final PublicationPort publicationPort; private final PublicationCreationRequestValidator publicationCreationRequestValidator; private final PublicationUpdateRequestValidator publicationUpdateRequestValidator; private final UserUseCases userUseCases; - private final Clock clock; public PublicationUseCases( CategoryUseCases categoryUseCases, Clock clock, KeyGenerator keyGenerator, + PictureUseCases pictureUseCases, PublicationCreationRequestValidator publicationCreationRequestValidator, - PublicationPort publicationPort, PublicationUpdateRequestValidator publicationUpdateRequestValidator, + PublicationPort publicationPort, + PublicationUpdateRequestValidator publicationUpdateRequestValidator, UserUseCases userUseCases ) { this.categoryUseCases = categoryUseCases; @@ -47,6 +53,7 @@ public class PublicationUseCases { this.publicationPort = publicationPort; this.publicationUpdateRequestValidator = publicationUpdateRequestValidator; this.userUseCases = userUseCases; + this.pictureUseCases = pictureUseCases; } public Publication createPublication(PublicationEditionRequest request) { @@ -60,13 +67,18 @@ public class PublicationUseCases { new CategoryNotFoundException(request.categoryId()) )); + Picture picture = pictureUseCases.findById(request.pictureId()) + .orElseThrow(() -> new PublicationEditionException( + new PictureNotFoundException(request.pictureId()) + )); + Publication newPublication = aPublication() .withId(UUID.randomUUID()) .withKey(keyGenerator.generateKey()) .withTitle(request.title()) .withText(request.text()) .withDescription(request.description()) - .withImage(request.image()) + .withPicture(picture) .withCreationDate(ZonedDateTime.now(clock)) .withAuthor(anAuthor().basedOn(authenticatedUser).build()) .withCategory(category) @@ -104,8 +116,12 @@ public class PublicationUseCases { publicationBuilder.withDescription(request.description()); } - if (!isNull(request.image())) { - publicationBuilder.withImage(request.image()); + if (!isNull(request.pictureId())) { + Picture picture = pictureUseCases.findById(request.pictureId()) + .orElseThrow(() -> new PublicationEditionException( + new PictureNotFoundException(request.pictureId()) + )); + publicationBuilder.withPicture(picture); } if (!isNull(request.categoryId())) { diff --git a/codiki-domain/src/main/java/org/codiki/domain/publication/exception/PublicationEditionException.java b/codiki-domain/src/main/java/org/codiki/domain/publication/exception/PublicationEditionException.java index ba2cd85..365b073 100644 --- a/codiki-domain/src/main/java/org/codiki/domain/publication/exception/PublicationEditionException.java +++ b/codiki-domain/src/main/java/org/codiki/domain/publication/exception/PublicationEditionException.java @@ -8,6 +8,6 @@ public class PublicationEditionException extends FunctionnalException { } public PublicationEditionException(FunctionnalException cause) { - super("Impossible to edit a publication due to a root cause.", cause); + super(String.format("Impossible to edit a publication due to a root cause: %s.", cause.getMessage())); } } diff --git a/codiki-domain/src/main/java/org/codiki/domain/publication/model/Publication.java b/codiki-domain/src/main/java/org/codiki/domain/publication/model/Publication.java index 57bf2e8..dd73353 100644 --- a/codiki-domain/src/main/java/org/codiki/domain/publication/model/Publication.java +++ b/codiki-domain/src/main/java/org/codiki/domain/publication/model/Publication.java @@ -4,6 +4,7 @@ import java.time.ZonedDateTime; import java.util.UUID; import org.codiki.domain.category.model.Category; +import org.codiki.domain.picture.model.Picture; public record Publication( UUID id, @@ -11,8 +12,8 @@ public record Publication( String title, String text, String description, - String image, ZonedDateTime creationDate, + Picture picture, Author author, Category category ) { diff --git a/codiki-domain/src/main/java/org/codiki/domain/publication/model/PublicationEditionRequest.java b/codiki-domain/src/main/java/org/codiki/domain/publication/model/PublicationEditionRequest.java index a456a9d..932222c 100644 --- a/codiki-domain/src/main/java/org/codiki/domain/publication/model/PublicationEditionRequest.java +++ b/codiki-domain/src/main/java/org/codiki/domain/publication/model/PublicationEditionRequest.java @@ -6,6 +6,6 @@ public record PublicationEditionRequest( String title, String text, String description, - String image, + UUID pictureId, UUID categoryId ) {} diff --git a/codiki-domain/src/main/java/org/codiki/domain/publication/model/builder/AuthorBuilder.java b/codiki-domain/src/main/java/org/codiki/domain/publication/model/builder/AuthorBuilder.java index fc993a0..cd48056 100644 --- a/codiki-domain/src/main/java/org/codiki/domain/publication/model/builder/AuthorBuilder.java +++ b/codiki-domain/src/main/java/org/codiki/domain/publication/model/builder/AuthorBuilder.java @@ -20,7 +20,7 @@ public class AuthorBuilder { return new AuthorBuilder() .withId(user.id()) // .withName(user.name()) -// .withImage(user.image()) +// .withImage(user.pictureId()) ; } diff --git a/codiki-domain/src/main/java/org/codiki/domain/publication/model/builder/PublicationBuilder.java b/codiki-domain/src/main/java/org/codiki/domain/publication/model/builder/PublicationBuilder.java index 5fcf281..72921f5 100644 --- a/codiki-domain/src/main/java/org/codiki/domain/publication/model/builder/PublicationBuilder.java +++ b/codiki-domain/src/main/java/org/codiki/domain/publication/model/builder/PublicationBuilder.java @@ -3,6 +3,7 @@ package org.codiki.domain.publication.model.builder; import java.time.ZonedDateTime; import java.util.UUID; +import org.codiki.domain.picture.model.Picture; import org.codiki.domain.publication.model.Author; import org.codiki.domain.category.model.Category; import org.codiki.domain.publication.model.Publication; @@ -13,7 +14,7 @@ public class PublicationBuilder { private String title; private String text; private String description; - private String image; + private Picture picture; private ZonedDateTime creationDate; private Author author; private Category category; @@ -49,8 +50,8 @@ public class PublicationBuilder { return this; } - public PublicationBuilder withImage(String image) { - this.image = image; + public PublicationBuilder withPicture(Picture picture) { + this.picture = picture; return this; } @@ -76,8 +77,7 @@ public class PublicationBuilder { title, text, description, - image, - creationDate, + creationDate, picture, author, category ); @@ -90,7 +90,7 @@ public class PublicationBuilder { .withTitle(publication.title()) .withText(publication.text()) .withDescription(publication.description()) - .withImage(publication.image()) + .withPicture(publication.picture()) .withCreationDate(publication.creationDate()) .withAuthor(publication.author()) .withCategory(publication.category()); diff --git a/codiki-exposition/src/main/java/org/codiki/exposition/picture/PictureController.java b/codiki-exposition/src/main/java/org/codiki/exposition/picture/PictureController.java index 9e71271..1117c9a 100644 --- a/codiki-exposition/src/main/java/org/codiki/exposition/picture/PictureController.java +++ b/codiki-exposition/src/main/java/org/codiki/exposition/picture/PictureController.java @@ -6,6 +6,7 @@ import java.util.UUID; import static org.springframework.http.MediaType.APPLICATION_OCTET_STREAM_VALUE; import static org.springframework.http.MediaType.MULTIPART_FORM_DATA_VALUE; import org.codiki.application.picture.PictureUseCases; +import org.codiki.domain.picture.exception.PictureNotFoundException; import org.codiki.domain.picture.model.Picture; import org.springframework.core.io.FileSystemResource; import org.springframework.web.bind.annotation.GetMapping; @@ -39,7 +40,8 @@ public class PictureController { @GetMapping(value = "/{pictureId}", produces = APPLICATION_OCTET_STREAM_VALUE) public FileSystemResource loadPicture(@PathVariable("pictureId") UUID pictureId) { - Picture picture = pictureUseCases.findById(pictureId); + Picture picture = pictureUseCases.findById(pictureId) + .orElseThrow(() -> new PictureNotFoundException(pictureId)); return new FileSystemResource(picture.contentFile()); } } diff --git a/codiki-exposition/src/main/java/org/codiki/exposition/publication/PublicationDto.java b/codiki-exposition/src/main/java/org/codiki/exposition/publication/PublicationDto.java index c2c22e7..adf6e7d 100644 --- a/codiki-exposition/src/main/java/org/codiki/exposition/publication/PublicationDto.java +++ b/codiki-exposition/src/main/java/org/codiki/exposition/publication/PublicationDto.java @@ -13,8 +13,8 @@ public record PublicationDto( String title, String text, String description, - String image, ZonedDateTime creationDate, + UUID picture, AuthorDto author, CategoryDto category ) { @@ -25,8 +25,8 @@ public record PublicationDto( publication.title(), publication.text(), publication.description(), - publication.image(), publication.creationDate(), + publication.picture().id(), new AuthorDto(publication.author()), new CategoryDto(publication.category()) ); diff --git a/codiki-exposition/src/main/java/org/codiki/exposition/publication/model/PublicationEditionRequestDto.java b/codiki-exposition/src/main/java/org/codiki/exposition/publication/model/PublicationEditionRequestDto.java index 7f8edcb..23d33d1 100644 --- a/codiki-exposition/src/main/java/org/codiki/exposition/publication/model/PublicationEditionRequestDto.java +++ b/codiki-exposition/src/main/java/org/codiki/exposition/publication/model/PublicationEditionRequestDto.java @@ -8,10 +8,10 @@ public record PublicationEditionRequestDto( String title, String text, String description, - String image, + UUID pictureId, UUID categoryId ) { public PublicationEditionRequest toDomain() { - return new PublicationEditionRequest(title, text, description, image, categoryId); + return new PublicationEditionRequest(title, text, description, pictureId, categoryId); } } diff --git a/codiki-infrastructure/src/main/java/org/codiki/infrastructure/publication/model/AuthorEntity.java b/codiki-infrastructure/src/main/java/org/codiki/infrastructure/publication/model/AuthorEntity.java index 0b22c0f..5d16d01 100644 --- a/codiki-infrastructure/src/main/java/org/codiki/infrastructure/publication/model/AuthorEntity.java +++ b/codiki-infrastructure/src/main/java/org/codiki/infrastructure/publication/model/AuthorEntity.java @@ -24,13 +24,13 @@ public class AuthorEntity { private UUID id; @Column(nullable = false) private String name; -// private String image; +// private String pictureId; public AuthorEntity(Author author) { this( author.id(), author.name() -// author.image() +// author.pictureId() ); } diff --git a/codiki-infrastructure/src/main/java/org/codiki/infrastructure/publication/model/PublicationEntity.java b/codiki-infrastructure/src/main/java/org/codiki/infrastructure/publication/model/PublicationEntity.java index 7a6df58..de46f43 100644 --- a/codiki-infrastructure/src/main/java/org/codiki/infrastructure/publication/model/PublicationEntity.java +++ b/codiki-infrastructure/src/main/java/org/codiki/infrastructure/publication/model/PublicationEntity.java @@ -5,6 +5,7 @@ import java.util.UUID; import org.codiki.domain.publication.model.Publication; import org.codiki.infrastructure.category.model.CategoryEntity; +import org.codiki.infrastructure.picture.model.PictureEntity; import static jakarta.persistence.FetchType.LAZY; import jakarta.persistence.Column; @@ -36,10 +37,11 @@ public class PublicationEntity { @Column(nullable = false) private String description; @Column(nullable = false) - private String image; - @Column(nullable = false) private ZonedDateTime creationDate; @ManyToOne(fetch = LAZY) + @JoinColumn(name = "picture_id") + private PictureEntity picture; + @ManyToOne(fetch = LAZY) @JoinColumn(name = "author_id") private AuthorEntity author; @ManyToOne(fetch = LAZY) @@ -53,8 +55,8 @@ public class PublicationEntity { publication.title(), publication.text(), publication.description(), - publication.image(), publication.creationDate(), + new PictureEntity(publication.picture()), new AuthorEntity(publication.author()), new CategoryEntity(publication.category()) ); @@ -67,8 +69,7 @@ public class PublicationEntity { title, text, description, - image, - creationDate, + creationDate, picture.toDomain(), author.toDomain(), category.toDomain() ); diff --git a/codiki-infrastructure/src/main/resources/sql/001-initial-script-tables-creation.sql b/codiki-infrastructure/src/main/resources/sql/001-initial-script-tables-creation.sql index 187a55c..c281c9a 100644 --- a/codiki-infrastructure/src/main/resources/sql/001-initial-script-tables-creation.sql +++ b/codiki-infrastructure/src/main/resources/sql/001-initial-script-tables-creation.sql @@ -31,24 +31,27 @@ CREATE TABLE IF NOT EXISTS category ( ); CREATE INDEX category_parent_category_id_idx ON category (parent_category_id); +CREATE TABLE IF NOT EXISTS picture ( + id UUID NOT NULL, + CONSTRAINT picture_pk PRIMARY KEY (id) +); + CREATE TABLE IF NOT EXISTS publication ( id UUID NOT NULL, key VARCHAR(10) NOT NULL, title VARCHAR NOT NULL, text VARCHAR NOT NULL, description VARCHAR NOT NULL, - image VARCHAR NOT NULL, creation_date TIMESTAMP NOT NULL, + picture_id UUID NOT NULL, author_id UUID NOT NULL, category_id UUID NOT NULL, CONSTRAINT publication_pk PRIMARY KEY (id), + CONSTRAINT publication_picture_id_fk FOREIGN KEY (picture_id) REFERENCES picture (id), CONSTRAINT publication_author_id_fk FOREIGN KEY (author_id) REFERENCES "user" (id), CONSTRAINT publication_category_id_fk FOREIGN KEY (category_id) REFERENCES category (id) ); +CREATE INDEX publication_picture_id_idx ON publication (picture_id); CREATE INDEX publication_author_id_idx ON publication (author_id); CREATE INDEX publication_category_id_idx ON publication (category_id); -CREATE TABLE IF NOT EXISTS picture ( - id UUID NOT NULL, - CONSTRAINT picture_pk PRIMARY KEY (id) -); diff --git a/rest-client-collection/Codiki/environments/localhost.bru b/rest-client-collection/Codiki/environments/localhost.bru index da6c63f..20e5a2c 100644 --- a/rest-client-collection/Codiki/environments/localhost.bru +++ b/rest-client-collection/Codiki/environments/localhost.bru @@ -1,7 +1,7 @@ vars { url: http://localhost:8080 publicationId: fce1de27-11c6-4deb-a248-b63288c00037 - bearerToken: eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI1YWQ0NjJiOC04ZjllLTRhMjYtYmI4Ni1jNzRmZWY1ZDExYjYiLCJleHAiOjE3MTA0MDYxMzF9.FhAT0my_DfKKTcgpWA3cesv8WYNw36dV6O1ZYrNtW0NR3E9AQ_XP0hAw_GH1K4maMxIzToqzNrZVJ-ug-cIaCQ + bearerToken: eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI1YWQ0NjJiOC04ZjllLTRhMjYtYmI4Ni1jNzRmZWY1ZDExYjYiLCJleHAiOjE3MTA0MDc5Mjd9.QdanZXjfLztIVJU-pRS3gZxnC4GIycyhmlCkhYSPchiXpeNzruw_GY3fH1_qshC_AjOCSqGmCq3X1S_zVFdodQ categoryId: 172fa901-3f4b-4540-92f3-1c15820e8ec9 pictureId: 65b660b7-66bb-4e4a-a62c-fd0ca101f972 }