Add dependency to pictures in publications.
This commit is contained in:
@@ -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<Picture> findById(UUID pictureId) {
|
||||
return picturePort.findById(pictureId);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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())) {
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
) {
|
||||
|
||||
@@ -6,6 +6,6 @@ public record PublicationEditionRequest(
|
||||
String title,
|
||||
String text,
|
||||
String description,
|
||||
String image,
|
||||
UUID pictureId,
|
||||
UUID categoryId
|
||||
) {}
|
||||
|
||||
@@ -20,7 +20,7 @@ public class AuthorBuilder {
|
||||
return new AuthorBuilder()
|
||||
.withId(user.id())
|
||||
// .withName(user.name())
|
||||
// .withImage(user.image())
|
||||
// .withImage(user.pictureId())
|
||||
;
|
||||
}
|
||||
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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())
|
||||
);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -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()
|
||||
);
|
||||
|
||||
@@ -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)
|
||||
);
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user