From 2cf0ff503a77b4ca6c9934d12ec2804537aabff0 Mon Sep 17 00:00:00 2001 From: Florian THIERRY Date: Mon, 11 Mar 2024 15:07:33 +0100 Subject: [PATCH] Fix implementation of infrastructure layer of publication creation. --- .../codiki/application/user/UserUseCases.java | 6 ++-- .../category/CategoryJpaAdapter.java | 25 ++++++++++++++++ .../category/model/CategoryEntity.java | 26 +++++++++++++--- .../repository/CategoryRepository.java | 9 ++++++ .../publication/model/AuthorEntity.java | 18 +++++++---- .../publication/model/PublicationEntity.java | 30 ++++++++++++------- .../001-initial-script-tables-creation.sql | 2 +- rest-client-collection/Codiki/Users/Login.bru | 13 ++++++-- 8 files changed, 103 insertions(+), 26 deletions(-) create mode 100644 codiki-infrastructure/src/main/java/org/codiki/infrastructure/category/CategoryJpaAdapter.java create mode 100644 codiki-infrastructure/src/main/java/org/codiki/infrastructure/category/repository/CategoryRepository.java diff --git a/codiki-application/src/main/java/org/codiki/application/user/UserUseCases.java b/codiki-application/src/main/java/org/codiki/application/user/UserUseCases.java index 18d9f3d..e0cebc8 100644 --- a/codiki-application/src/main/java/org/codiki/application/user/UserUseCases.java +++ b/codiki-application/src/main/java/org/codiki/application/user/UserUseCases.java @@ -8,6 +8,7 @@ import java.util.UUID; import org.codiki.application.security.AuthenticationFacade; import org.codiki.application.security.JwtService; import org.codiki.application.security.annotation.AllowedToAdmins; +import org.codiki.application.security.model.CustomUserDetails; import org.codiki.domain.exception.LoginFailureException; import org.codiki.domain.exception.RefreshTokenDoesNotExistException; import org.codiki.domain.exception.UserDoesNotExistException; @@ -79,8 +80,9 @@ public class UserUseCases { public Optional getAuthenticatedUser() { return Optional.of(authenticationFacade.getAuthentication()) .map(Authentication::getPrincipal) - .filter(String.class::isInstance) - .map(String.class::cast) + .filter(CustomUserDetails.class::isInstance) + .map(CustomUserDetails.class::cast) + .map(CustomUserDetails::getUsername) .map(UUID::fromString) .flatMap(userPort::findById); } diff --git a/codiki-infrastructure/src/main/java/org/codiki/infrastructure/category/CategoryJpaAdapter.java b/codiki-infrastructure/src/main/java/org/codiki/infrastructure/category/CategoryJpaAdapter.java new file mode 100644 index 0000000..b262cdb --- /dev/null +++ b/codiki-infrastructure/src/main/java/org/codiki/infrastructure/category/CategoryJpaAdapter.java @@ -0,0 +1,25 @@ +package org.codiki.infrastructure.category; + +import java.util.Optional; +import java.util.UUID; + +import org.codiki.domain.category.model.Category; +import org.codiki.domain.category.port.CategoryPort; +import org.codiki.infrastructure.category.model.CategoryEntity; +import org.codiki.infrastructure.category.repository.CategoryRepository; +import org.springframework.stereotype.Component; + +@Component +public class CategoryJpaAdapter implements CategoryPort { + private final CategoryRepository categoryRepository; + + public CategoryJpaAdapter(CategoryRepository categoryRepository) { + this.categoryRepository = categoryRepository; + } + + @Override + public Optional findById(UUID categoryId) { + return categoryRepository.findById(categoryId) + .map(CategoryEntity::toDomain); + } +} diff --git a/codiki-infrastructure/src/main/java/org/codiki/infrastructure/category/model/CategoryEntity.java b/codiki-infrastructure/src/main/java/org/codiki/infrastructure/category/model/CategoryEntity.java index 6da54a6..0f92c0c 100644 --- a/codiki-infrastructure/src/main/java/org/codiki/infrastructure/category/model/CategoryEntity.java +++ b/codiki-infrastructure/src/main/java/org/codiki/infrastructure/category/model/CategoryEntity.java @@ -1,5 +1,7 @@ package org.codiki.infrastructure.category.model; +import static java.util.Collections.emptyList; +import java.util.Collections; import java.util.UUID; import org.codiki.domain.category.model.Category; @@ -8,20 +10,36 @@ import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; @Entity @Table(name = "category") -public record CategoryEntity( +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class CategoryEntity { @Id - UUID id, + private UUID id; @Column(nullable = false) - String name + private String name; // List subCategories -) { + public CategoryEntity(Category category) { this( category.id(), category.name() ); } + + public Category toDomain() { + return new Category( + id, + name, + emptyList() + ); + } } diff --git a/codiki-infrastructure/src/main/java/org/codiki/infrastructure/category/repository/CategoryRepository.java b/codiki-infrastructure/src/main/java/org/codiki/infrastructure/category/repository/CategoryRepository.java new file mode 100644 index 0000000..e9bf66a --- /dev/null +++ b/codiki-infrastructure/src/main/java/org/codiki/infrastructure/category/repository/CategoryRepository.java @@ -0,0 +1,9 @@ +package org.codiki.infrastructure.category.repository; + +import java.util.UUID; + +import org.codiki.infrastructure.category.model.CategoryEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface CategoryRepository extends JpaRepository { +} 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 a8bd2cb..360028f 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 @@ -8,16 +8,24 @@ import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; @Entity @Table(name = "`user`") -public record AuthorEntity( +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class AuthorEntity { @Id - UUID id, + private UUID id; @Column(nullable = false) - String name, - String image -) { + private String name; + private String image; + public AuthorEntity(Author author) { this( author.id(), 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 250350d..df2ee4f 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 @@ -13,31 +13,39 @@ import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; @Entity @Table(name = "publication") -public record PublicationEntity( +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class PublicationEntity { @Id - UUID id, + private UUID id; @Column(nullable = false) - String key, + private String key; @Column(nullable = false) - String title, + private String title; @Column(nullable = false) - String text, + private String text; @Column(nullable = false) - String description, + private String description; @Column(nullable = false) - String image, + private String image; @Column(nullable = false) - ZonedDateTime creationDate, + private ZonedDateTime creationDate; @ManyToOne(fetch = LAZY) @JoinColumn(name = "author_id") - AuthorEntity author, + private AuthorEntity author; @ManyToOne(fetch = LAZY) @JoinColumn(name = "category_id") - CategoryEntity categoryId -) { + private CategoryEntity categoryId; + public PublicationEntity(Publication publication) { this( publication.id(), 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 afbfc5b..2a6866d 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 @@ -35,7 +35,7 @@ CREATE TABLE IF NOT EXISTS publication ( text VARCHAR NOT NULL, description VARCHAR NOT NULL, image VARCHAR NOT NULL, - creationDate TIMESTAMP NOT NULL, + creation_date TIMESTAMP NOT NULL, author_id UUID NOT NULL, category_id UUID NOT NULL, CONSTRAINT publication_pk PRIMARY KEY (id), diff --git a/rest-client-collection/Codiki/Users/Login.bru b/rest-client-collection/Codiki/Users/Login.bru index c73dc28..784638d 100644 --- a/rest-client-collection/Codiki/Users/Login.bru +++ b/rest-client-collection/Codiki/Users/Login.bru @@ -4,8 +4,15 @@ meta { seq: 1 } -get { - url: - body: none +post { + url: {{url}}/api/users/login + body: json auth: none } + +body:json { + { + "id": "5ad462b8-8f9e-4a26-bb86-c74fef5d11b6", + "password": "password" + } +}