From 9ff4b21dd962124aeae72ef1d7dc10da2ac6230d Mon Sep 17 00:00:00 2001 From: Pablo de la Torre Jamardo Date: Tue, 26 Aug 2025 17:41:07 +0200 Subject: [PATCH] feat: implement final Resume API --- .../application/home/CreateHomeUseCase.java | 26 ------------ .../application/home/GetHomeUseCase.java | 24 ----------- .../resume/CreateResumeUseCase.java | 35 ++++++++++++++++ .../application/resume/GetResumeUseCase.java | 24 +++++++++++ .../bootstrap/home/HomeApplicationConfig.java | 21 ---------- .../resume/ResumeApplicationConfig.java | 21 ++++++++++ .../pablotj/portfolio/domain/home/Home.java | 13 ------ .../pablotj/portfolio/domain/home/HomeId.java | 7 ---- .../domain/home/port/HomeRepositoryPort.java | 14 ------- .../portfolio/domain/resume/Resume.java | 15 +++++++ .../portfolio/domain/resume/ResumeId.java | 7 ++++ .../resume/port/ResumeRepositoryPort.java | 14 +++++++ .../about/mapper/AboutJpaMapper.java | 11 +---- .../mapper/CertificationJpaMapper.java | 11 +---- .../contact/mapper/ContactJpaMapper.java | 11 +---- .../education/mapper/EducationJpaMapper.java | 11 +---- .../mapper/ExperienceJpaMapper.java | 11 +---- .../home/adapter/HomeRepositoryAdapter.java | 40 ------------------- .../home/mapper/HomeJpaMapper.java | 24 ----------- .../home/repo/SpringDataHomeRepository.java | 7 ---- .../project/mapper/ProjectJpaMapper.java | 11 +---- .../adapter/ResumeRepositoryAdapter.java | 40 +++++++++++++++++++ .../entity/ResumeJpaEntity.java} | 20 +++++++--- .../resume/mapper/ResumeJpaMapper.java | 17 ++++++++ .../repo/SpringDataResumeRepository.java | 7 ++++ .../rest/home/dto/CreateHomeRequest.java | 10 ----- .../infrastructure/rest/home/dto/HomeDto.java | 6 --- .../rest/home/mapper/HomeRestMapper.java | 13 ------ .../controller/ResumeController.java} | 36 +++++++++-------- .../rest/resume/dto/ResumeCreateRequest.java | 12 ++++++ .../rest/resume/dto/ResumeDto.java | 13 ++++++ .../rest/resume/mapper/ResumeRestMapper.java | 13 ++++++ mvnw | 4 +- 33 files changed, 265 insertions(+), 284 deletions(-) delete mode 100644 application/src/main/java/com/pablotj/portfolio/application/home/CreateHomeUseCase.java delete mode 100644 application/src/main/java/com/pablotj/portfolio/application/home/GetHomeUseCase.java create mode 100644 application/src/main/java/com/pablotj/portfolio/application/resume/CreateResumeUseCase.java create mode 100644 application/src/main/java/com/pablotj/portfolio/application/resume/GetResumeUseCase.java delete mode 100644 bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/home/HomeApplicationConfig.java create mode 100644 bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/resume/ResumeApplicationConfig.java delete mode 100644 domain/src/main/java/com/pablotj/portfolio/domain/home/Home.java delete mode 100644 domain/src/main/java/com/pablotj/portfolio/domain/home/HomeId.java delete mode 100644 domain/src/main/java/com/pablotj/portfolio/domain/home/port/HomeRepositoryPort.java create mode 100644 domain/src/main/java/com/pablotj/portfolio/domain/resume/Resume.java create mode 100644 domain/src/main/java/com/pablotj/portfolio/domain/resume/ResumeId.java create mode 100644 domain/src/main/java/com/pablotj/portfolio/domain/resume/port/ResumeRepositoryPort.java delete mode 100644 infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/home/adapter/HomeRepositoryAdapter.java delete mode 100644 infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/home/mapper/HomeJpaMapper.java delete mode 100644 infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/home/repo/SpringDataHomeRepository.java create mode 100644 infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/resume/adapter/ResumeRepositoryAdapter.java rename infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/{home/entity/HomeJpaEntity.java => resume/entity/ResumeJpaEntity.java} (51%) create mode 100644 infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/resume/mapper/ResumeJpaMapper.java create mode 100644 infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/resume/repo/SpringDataResumeRepository.java delete mode 100644 infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/home/dto/CreateHomeRequest.java delete mode 100644 infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/home/dto/HomeDto.java delete mode 100644 infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/home/mapper/HomeRestMapper.java rename infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/{home/controller/HomeController.java => resume/controller/ResumeController.java} (51%) create mode 100644 infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/resume/dto/ResumeCreateRequest.java create mode 100644 infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/resume/dto/ResumeDto.java create mode 100644 infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/resume/mapper/ResumeRestMapper.java diff --git a/application/src/main/java/com/pablotj/portfolio/application/home/CreateHomeUseCase.java b/application/src/main/java/com/pablotj/portfolio/application/home/CreateHomeUseCase.java deleted file mode 100644 index f0a4fe8..0000000 --- a/application/src/main/java/com/pablotj/portfolio/application/home/CreateHomeUseCase.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.pablotj.portfolio.application.home; - -import com.pablotj.portfolio.domain.home.Home; -import com.pablotj.portfolio.domain.home.port.HomeRepositoryPort; - -public class CreateHomeUseCase { - - private final HomeRepositoryPort repository; - - public CreateHomeUseCase(HomeRepositoryPort repository) { - this.repository = repository; - } - - public Home handle(Command cmd) { - var home = Home.builder() - .id(null) - .title(cmd.title()) - .description(cmd.description()) - .url(cmd.url()) - .build(); - return repository.save(home); - } - - public record Command(String title, String description, String url) { - } -} \ No newline at end of file diff --git a/application/src/main/java/com/pablotj/portfolio/application/home/GetHomeUseCase.java b/application/src/main/java/com/pablotj/portfolio/application/home/GetHomeUseCase.java deleted file mode 100644 index 3ef5e10..0000000 --- a/application/src/main/java/com/pablotj/portfolio/application/home/GetHomeUseCase.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.pablotj.portfolio.application.home; - -import com.pablotj.portfolio.domain.home.Home; -import com.pablotj.portfolio.domain.home.HomeId; -import com.pablotj.portfolio.domain.home.port.HomeRepositoryPort; -import java.util.List; -import java.util.Optional; - -public class GetHomeUseCase { - - private final HomeRepositoryPort repository; - - public GetHomeUseCase(HomeRepositoryPort repository) { - this.repository = repository; - } - - public Optional byId(Long id) { - return repository.findById(new HomeId(id)); - } - - public List all() { - return repository.findAll(); - } -} \ No newline at end of file diff --git a/application/src/main/java/com/pablotj/portfolio/application/resume/CreateResumeUseCase.java b/application/src/main/java/com/pablotj/portfolio/application/resume/CreateResumeUseCase.java new file mode 100644 index 0000000..c4e7bd4 --- /dev/null +++ b/application/src/main/java/com/pablotj/portfolio/application/resume/CreateResumeUseCase.java @@ -0,0 +1,35 @@ +package com.pablotj.portfolio.application.resume; + +import com.pablotj.portfolio.domain.resume.Resume; +import com.pablotj.portfolio.domain.resume.port.ResumeRepositoryPort; +import jakarta.validation.constraints.NotBlank; + +public class CreateResumeUseCase { + + private final ResumeRepositoryPort repository; + + public CreateResumeUseCase(ResumeRepositoryPort repository) { + this.repository = repository; + } + + public Resume handle(Command cmd) { + var home = Resume.builder() + .id(null) + .name(cmd.title()) + .surnames(cmd.surnames()) + .title(cmd.title()) + .summary(cmd.summary()) + .icon(cmd.icon()) + .build(); + return repository.save(home); + } + + public record Command( + String name, + String surnames, + String title, + String summary, + String icon + ) { + } +} \ No newline at end of file diff --git a/application/src/main/java/com/pablotj/portfolio/application/resume/GetResumeUseCase.java b/application/src/main/java/com/pablotj/portfolio/application/resume/GetResumeUseCase.java new file mode 100644 index 0000000..50d6669 --- /dev/null +++ b/application/src/main/java/com/pablotj/portfolio/application/resume/GetResumeUseCase.java @@ -0,0 +1,24 @@ +package com.pablotj.portfolio.application.resume; + +import com.pablotj.portfolio.domain.resume.Resume; +import com.pablotj.portfolio.domain.resume.ResumeId; +import com.pablotj.portfolio.domain.resume.port.ResumeRepositoryPort; +import java.util.List; +import java.util.Optional; + +public class GetResumeUseCase { + + private final ResumeRepositoryPort repository; + + public GetResumeUseCase(ResumeRepositoryPort repository) { + this.repository = repository; + } + + public Optional byId(Long id) { + return repository.findById(new ResumeId(id)); + } + + public List all() { + return repository.findAll(); + } +} \ No newline at end of file diff --git a/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/home/HomeApplicationConfig.java b/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/home/HomeApplicationConfig.java deleted file mode 100644 index e15feac..0000000 --- a/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/home/HomeApplicationConfig.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.pablotj.portfolio.bootstrap.home; - -import com.pablotj.portfolio.application.home.CreateHomeUseCase; -import com.pablotj.portfolio.application.home.GetHomeUseCase; -import com.pablotj.portfolio.domain.home.port.HomeRepositoryPort; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class HomeApplicationConfig { - - @Bean - public GetHomeUseCase getHomeUseCase(HomeRepositoryPort repo) { - return new GetHomeUseCase(repo); - } - - @Bean - public CreateHomeUseCase createHomeUseCase(HomeRepositoryPort repo) { - return new CreateHomeUseCase(repo); - } -} \ No newline at end of file diff --git a/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/resume/ResumeApplicationConfig.java b/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/resume/ResumeApplicationConfig.java new file mode 100644 index 0000000..4e05f9a --- /dev/null +++ b/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/resume/ResumeApplicationConfig.java @@ -0,0 +1,21 @@ +package com.pablotj.portfolio.bootstrap.resume; + +import com.pablotj.portfolio.application.resume.CreateResumeUseCase; +import com.pablotj.portfolio.application.resume.GetResumeUseCase; +import com.pablotj.portfolio.domain.resume.port.ResumeRepositoryPort; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class ResumeApplicationConfig { + + @Bean + public GetResumeUseCase getHomeUseCase(ResumeRepositoryPort repo) { + return new GetResumeUseCase(repo); + } + + @Bean + public CreateResumeUseCase createHomeUseCase(ResumeRepositoryPort repo) { + return new CreateResumeUseCase(repo); + } +} \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/home/Home.java b/domain/src/main/java/com/pablotj/portfolio/domain/home/Home.java deleted file mode 100644 index 8fb524e..0000000 --- a/domain/src/main/java/com/pablotj/portfolio/domain/home/Home.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.pablotj.portfolio.domain.home; - -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class Home { - private final HomeId id; - private final String title; - private final String description; - private final String url; -} \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/home/HomeId.java b/domain/src/main/java/com/pablotj/portfolio/domain/home/HomeId.java deleted file mode 100644 index 352719e..0000000 --- a/domain/src/main/java/com/pablotj/portfolio/domain/home/HomeId.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.pablotj.portfolio.domain.home; - -public record HomeId(Long value) { - public HomeId { - if (value != null && value < 0) throw new IllegalArgumentException("HomeId must be positive"); - } -} \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/home/port/HomeRepositoryPort.java b/domain/src/main/java/com/pablotj/portfolio/domain/home/port/HomeRepositoryPort.java deleted file mode 100644 index 4426112..0000000 --- a/domain/src/main/java/com/pablotj/portfolio/domain/home/port/HomeRepositoryPort.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.pablotj.portfolio.domain.home.port; - -import com.pablotj.portfolio.domain.home.Home; -import com.pablotj.portfolio.domain.home.HomeId; -import java.util.List; -import java.util.Optional; - -public interface HomeRepositoryPort { - Home save(Home p); - - Optional findById(HomeId id); - - List findAll(); -} \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/resume/Resume.java b/domain/src/main/java/com/pablotj/portfolio/domain/resume/Resume.java new file mode 100644 index 0000000..ade80a8 --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/resume/Resume.java @@ -0,0 +1,15 @@ +package com.pablotj.portfolio.domain.resume; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class Resume { + private final ResumeId id; + private final String name; + private final String surnames; + private final String title; + private final String summary; + private final String icon; +} \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/resume/ResumeId.java b/domain/src/main/java/com/pablotj/portfolio/domain/resume/ResumeId.java new file mode 100644 index 0000000..2fed6fc --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/resume/ResumeId.java @@ -0,0 +1,7 @@ +package com.pablotj.portfolio.domain.resume; + +public record ResumeId(Long value) { + public ResumeId { + if (value != null && value < 0) throw new IllegalArgumentException("ResumeId must be positive"); + } +} \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/resume/port/ResumeRepositoryPort.java b/domain/src/main/java/com/pablotj/portfolio/domain/resume/port/ResumeRepositoryPort.java new file mode 100644 index 0000000..1d2da6e --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/resume/port/ResumeRepositoryPort.java @@ -0,0 +1,14 @@ +package com.pablotj.portfolio.domain.resume.port; + +import com.pablotj.portfolio.domain.resume.Resume; +import com.pablotj.portfolio.domain.resume.ResumeId; +import java.util.List; +import java.util.Optional; + +public interface ResumeRepositoryPort { + Resume save(Resume p); + + Optional findById(ResumeId id); + + List findAll(); +} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/about/mapper/AboutJpaMapper.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/about/mapper/AboutJpaMapper.java index 163d853..7c2e990 100644 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/about/mapper/AboutJpaMapper.java +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/about/mapper/AboutJpaMapper.java @@ -12,13 +12,6 @@ public interface AboutJpaMapper { @Mapping(target = "id", ignore = true) AboutJpaEntity toEntity(About domain); - default About toDomain(AboutJpaEntity e) { - if (e == null) return null; - return About.builder() - .id(e.getId() == null ? null : new AboutId(e.getId())) - .title(e.getTitle()) - .description(e.getDescription()) - .url(e.getUrl()) - .build(); - } + @Mapping(target = "id.value", source = "id") + About toDomain(AboutJpaEntity e); } \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/certification/mapper/CertificationJpaMapper.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/certification/mapper/CertificationJpaMapper.java index 921807f..0545e4d 100644 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/certification/mapper/CertificationJpaMapper.java +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/certification/mapper/CertificationJpaMapper.java @@ -12,13 +12,6 @@ public interface CertificationJpaMapper { @Mapping(target = "id", ignore = true) CertificationJpaEntity toEntity(Certification domain); - default Certification toDomain(CertificationJpaEntity e) { - if (e == null) return null; - return Certification.builder() - .id(e.getId() == null ? null : new CertificationId(e.getId())) - .title(e.getTitle()) - .description(e.getDescription()) - .url(e.getUrl()) - .build(); - } + @Mapping(target = "id.value", source = "id") + Certification toDomain(CertificationJpaEntity e); } \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/contact/mapper/ContactJpaMapper.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/contact/mapper/ContactJpaMapper.java index 1de50be..348b7c4 100644 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/contact/mapper/ContactJpaMapper.java +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/contact/mapper/ContactJpaMapper.java @@ -12,13 +12,6 @@ public interface ContactJpaMapper { @Mapping(target = "id", ignore = true) ContactJpaEntity toEntity(Contact domain); - default Contact toDomain(ContactJpaEntity e) { - if (e == null) return null; - return Contact.builder() - .id(e.getId() == null ? null : new ContactId(e.getId())) - .title(e.getTitle()) - .description(e.getDescription()) - .url(e.getUrl()) - .build(); - } + @Mapping(target = "id.value", source = "id") + Contact toDomain(ContactJpaEntity e); } \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/education/mapper/EducationJpaMapper.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/education/mapper/EducationJpaMapper.java index bac47cd..86f0bf4 100644 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/education/mapper/EducationJpaMapper.java +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/education/mapper/EducationJpaMapper.java @@ -12,13 +12,6 @@ public interface EducationJpaMapper { @Mapping(target = "id", ignore = true) EducationJpaEntity toEntity(Education domain); - default Education toDomain(EducationJpaEntity e) { - if (e == null) return null; - return Education.builder() - .id(e.getId() == null ? null : new EducationId(e.getId())) - .title(e.getTitle()) - .description(e.getDescription()) - .url(e.getUrl()) - .build(); - } + @Mapping(target = "id.value", source = "id") + Education toDomain(EducationJpaEntity e); } \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/experience/mapper/ExperienceJpaMapper.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/experience/mapper/ExperienceJpaMapper.java index 1ffbfe1..0e8249d 100644 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/experience/mapper/ExperienceJpaMapper.java +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/experience/mapper/ExperienceJpaMapper.java @@ -12,13 +12,6 @@ public interface ExperienceJpaMapper { @Mapping(target = "id", ignore = true) ExperienceJpaEntity toEntity(Experience domain); - default Experience toDomain(ExperienceJpaEntity e) { - if (e == null) return null; - return Experience.builder() - .id(e.getId() == null ? null : new ExperienceId(e.getId())) - .title(e.getTitle()) - .description(e.getDescription()) - .url(e.getUrl()) - .build(); - } + @Mapping(target = "id.value", source = "id") + Experience toDomain(ExperienceJpaEntity e); } \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/home/adapter/HomeRepositoryAdapter.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/home/adapter/HomeRepositoryAdapter.java deleted file mode 100644 index 58bccac..0000000 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/home/adapter/HomeRepositoryAdapter.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.pablotj.portfolio.infrastructure.persistence.home.adapter; - -import com.pablotj.portfolio.domain.home.Home; -import com.pablotj.portfolio.domain.home.HomeId; -import com.pablotj.portfolio.domain.home.port.HomeRepositoryPort; -import com.pablotj.portfolio.infrastructure.persistence.home.entity.HomeJpaEntity; -import com.pablotj.portfolio.infrastructure.persistence.home.mapper.HomeJpaMapper; -import com.pablotj.portfolio.infrastructure.persistence.home.repo.SpringDataHomeRepository; -import java.util.List; -import java.util.Optional; -import org.springframework.stereotype.Repository; - -@Repository -public class HomeRepositoryAdapter implements HomeRepositoryPort { - - private final SpringDataHomeRepository repo; - private final HomeJpaMapper mapper; - - public HomeRepositoryAdapter(SpringDataHomeRepository repo, HomeJpaMapper mapper) { - this.repo = repo; - this.mapper = mapper; - } - - @Override - public Home save(Home p) { - HomeJpaEntity entity = mapper.toEntity(p); - HomeJpaEntity saved = repo.save(entity); - return mapper.toDomain(saved); - } - - @Override - public Optional findById(HomeId id) { - return repo.findById(id.value()).map(mapper::toDomain); - } - - @Override - public List findAll() { - return repo.findAll().stream().map(mapper::toDomain).toList(); - } -} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/home/mapper/HomeJpaMapper.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/home/mapper/HomeJpaMapper.java deleted file mode 100644 index f6e6539..0000000 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/home/mapper/HomeJpaMapper.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.pablotj.portfolio.infrastructure.persistence.home.mapper; - -import com.pablotj.portfolio.domain.home.Home; -import com.pablotj.portfolio.domain.home.HomeId; -import com.pablotj.portfolio.infrastructure.persistence.home.entity.HomeJpaEntity; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; - -@Mapper(componentModel = "spring") -public interface HomeJpaMapper { - - @Mapping(target = "id", ignore = true) - HomeJpaEntity toEntity(Home domain); - - default Home toDomain(HomeJpaEntity e) { - if (e == null) return null; - return Home.builder() - .id(e.getId() == null ? null : new HomeId(e.getId())) - .title(e.getTitle()) - .description(e.getDescription()) - .url(e.getUrl()) - .build(); - } -} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/home/repo/SpringDataHomeRepository.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/home/repo/SpringDataHomeRepository.java deleted file mode 100644 index 3db716d..0000000 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/home/repo/SpringDataHomeRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.pablotj.portfolio.infrastructure.persistence.home.repo; - -import com.pablotj.portfolio.infrastructure.persistence.home.entity.HomeJpaEntity; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface SpringDataHomeRepository extends JpaRepository { -} diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/project/mapper/ProjectJpaMapper.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/project/mapper/ProjectJpaMapper.java index 704591b..0df712d 100644 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/project/mapper/ProjectJpaMapper.java +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/project/mapper/ProjectJpaMapper.java @@ -12,13 +12,6 @@ public interface ProjectJpaMapper { @Mapping(target = "id", ignore = true) ProjectJpaEntity toEntity(Project domain); - default Project toDomain(ProjectJpaEntity e) { - if (e == null) return null; - return Project.builder() - .id(e.getId() == null ? null : new ProjectId(e.getId())) - .title(e.getTitle()) - .description(e.getDescription()) - .url(e.getUrl()) - .build(); - } + @Mapping(target = "id.value", source = "id") + Project toDomain(ProjectJpaEntity e); } \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/resume/adapter/ResumeRepositoryAdapter.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/resume/adapter/ResumeRepositoryAdapter.java new file mode 100644 index 0000000..d77be5f --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/resume/adapter/ResumeRepositoryAdapter.java @@ -0,0 +1,40 @@ +package com.pablotj.portfolio.infrastructure.persistence.resume.adapter; + +import com.pablotj.portfolio.domain.resume.Resume; +import com.pablotj.portfolio.domain.resume.ResumeId; +import com.pablotj.portfolio.domain.resume.port.ResumeRepositoryPort; +import com.pablotj.portfolio.infrastructure.persistence.resume.entity.ResumeJpaEntity; +import com.pablotj.portfolio.infrastructure.persistence.resume.mapper.ResumeJpaMapper; +import com.pablotj.portfolio.infrastructure.persistence.resume.repo.SpringDataResumeRepository; +import java.util.List; +import java.util.Optional; +import org.springframework.stereotype.Repository; + +@Repository +public class ResumeRepositoryAdapter implements ResumeRepositoryPort { + + private final SpringDataResumeRepository repo; + private final ResumeJpaMapper mapper; + + public ResumeRepositoryAdapter(SpringDataResumeRepository repo, ResumeJpaMapper mapper) { + this.repo = repo; + this.mapper = mapper; + } + + @Override + public Resume save(Resume p) { + ResumeJpaEntity entity = mapper.toEntity(p); + ResumeJpaEntity saved = repo.save(entity); + return mapper.toDomain(saved); + } + + @Override + public Optional findById(ResumeId id) { + return repo.findById(id.value()).map(mapper::toDomain); + } + + @Override + public List findAll() { + return repo.findAll().stream().map(mapper::toDomain).toList(); + } +} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/home/entity/HomeJpaEntity.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/resume/entity/ResumeJpaEntity.java similarity index 51% rename from infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/home/entity/HomeJpaEntity.java rename to infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/resume/entity/ResumeJpaEntity.java index 94dd525..b156e97 100644 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/home/entity/HomeJpaEntity.java +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/resume/entity/ResumeJpaEntity.java @@ -1,4 +1,4 @@ -package com.pablotj.portfolio.infrastructure.persistence.home.entity; +package com.pablotj.portfolio.infrastructure.persistence.resume.entity; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -10,20 +10,28 @@ import lombok.Getter; import lombok.Setter; @Entity -@Table(name = "homes") +@Table(name = "resumes") @Getter @Setter -public class HomeJpaEntity { +public class ResumeJpaEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @Column(name = "first_name", nullable = false) + private String name; + + @Column(name = "last_name", nullable = false) + private String surnames; + @Column(nullable = false) private String title; - @Column(columnDefinition = "text") - private String description; + @Column(columnDefinition = "text", nullable = false) + private String summary; + + @Column + private String icon; - private String url; } \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/resume/mapper/ResumeJpaMapper.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/resume/mapper/ResumeJpaMapper.java new file mode 100644 index 0000000..9cdb13c --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/resume/mapper/ResumeJpaMapper.java @@ -0,0 +1,17 @@ +package com.pablotj.portfolio.infrastructure.persistence.resume.mapper; + +import com.pablotj.portfolio.domain.resume.Resume; +import com.pablotj.portfolio.domain.resume.ResumeId; +import com.pablotj.portfolio.infrastructure.persistence.resume.entity.ResumeJpaEntity; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +@Mapper(componentModel = "spring") +public interface ResumeJpaMapper { + + @Mapping(target = "id", ignore = true) + ResumeJpaEntity toEntity(Resume domain); + + @Mapping(target = "id.value", source = "id") + Resume toDomain(ResumeJpaEntity e); +} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/resume/repo/SpringDataResumeRepository.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/resume/repo/SpringDataResumeRepository.java new file mode 100644 index 0000000..e063727 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/resume/repo/SpringDataResumeRepository.java @@ -0,0 +1,7 @@ +package com.pablotj.portfolio.infrastructure.persistence.resume.repo; + +import com.pablotj.portfolio.infrastructure.persistence.resume.entity.ResumeJpaEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface SpringDataResumeRepository extends JpaRepository { +} diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/home/dto/CreateHomeRequest.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/home/dto/CreateHomeRequest.java deleted file mode 100644 index 2b052fe..0000000 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/home/dto/CreateHomeRequest.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.pablotj.portfolio.infrastructure.rest.home.dto; - -import jakarta.validation.constraints.NotBlank; - -public record CreateHomeRequest( - @NotBlank String title, - String description, - String url -) { -} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/home/dto/HomeDto.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/home/dto/HomeDto.java deleted file mode 100644 index 28c3e6b..0000000 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/home/dto/HomeDto.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.pablotj.portfolio.infrastructure.rest.home.dto; - -import jakarta.validation.constraints.NotBlank; - -public record HomeDto(Long id, @NotBlank String title, String description, String url) { -} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/home/mapper/HomeRestMapper.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/home/mapper/HomeRestMapper.java deleted file mode 100644 index 99a244f..0000000 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/home/mapper/HomeRestMapper.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.pablotj.portfolio.infrastructure.rest.home.mapper; - -import com.pablotj.portfolio.domain.home.Home; -import com.pablotj.portfolio.infrastructure.rest.home.dto.HomeDto; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; - -@Mapper(componentModel = "spring") -public interface HomeRestMapper { - - @Mapping(target = "id", source = "id.value") - HomeDto toDto(Home domain); -} diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/home/controller/HomeController.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/resume/controller/ResumeController.java similarity index 51% rename from infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/home/controller/HomeController.java rename to infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/resume/controller/ResumeController.java index 8cafd3a..d512b4c 100644 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/home/controller/HomeController.java +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/resume/controller/ResumeController.java @@ -1,10 +1,10 @@ -package com.pablotj.portfolio.infrastructure.rest.home.controller; +package com.pablotj.portfolio.infrastructure.rest.resume.controller; -import com.pablotj.portfolio.application.home.CreateHomeUseCase; -import com.pablotj.portfolio.application.home.GetHomeUseCase; -import com.pablotj.portfolio.infrastructure.rest.home.dto.CreateHomeRequest; -import com.pablotj.portfolio.infrastructure.rest.home.dto.HomeDto; -import com.pablotj.portfolio.infrastructure.rest.home.mapper.HomeRestMapper; +import com.pablotj.portfolio.application.resume.CreateResumeUseCase; +import com.pablotj.portfolio.application.resume.GetResumeUseCase; +import com.pablotj.portfolio.infrastructure.rest.resume.dto.ResumeCreateRequest; +import com.pablotj.portfolio.infrastructure.rest.resume.dto.ResumeDto; +import com.pablotj.portfolio.infrastructure.rest.resume.mapper.ResumeRestMapper; import jakarta.validation.Valid; import java.net.URI; import java.util.List; @@ -18,25 +18,25 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/v1/homes") -public class HomeController { +public class ResumeController { - private final CreateHomeUseCase createUC; - private final GetHomeUseCase getUC; - private final HomeRestMapper mapper; + private final CreateResumeUseCase createUC; + private final GetResumeUseCase getUC; + private final ResumeRestMapper mapper; - public HomeController(CreateHomeUseCase createUC, GetHomeUseCase getUC, HomeRestMapper mapper) { + public ResumeController(CreateResumeUseCase createUC, GetResumeUseCase getUC, ResumeRestMapper mapper) { this.createUC = createUC; this.getUC = getUC; this.mapper = mapper; } @GetMapping - public List all() { + public List all() { return getUC.all().stream().map(mapper::toDto).toList(); } @GetMapping("/{id}") - public ResponseEntity byId(@PathVariable Long id) { + public ResponseEntity byId(@PathVariable Long id) { return getUC.byId(id) .map(mapper::toDto) .map(ResponseEntity::ok) @@ -44,11 +44,13 @@ public class HomeController { } @PostMapping - public ResponseEntity create(@Valid @RequestBody CreateHomeRequest request) { - var cmd = new CreateHomeUseCase.Command( + public ResponseEntity create(@Valid @RequestBody ResumeCreateRequest request) { + var cmd = new CreateResumeUseCase.Command( + request.name(), + request.surnames(), request.title(), - request.description(), - request.url() + request.summary(), + request.icon() ); var created = createUC.handle(cmd); var body = mapper.toDto(created); diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/resume/dto/ResumeCreateRequest.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/resume/dto/ResumeCreateRequest.java new file mode 100644 index 0000000..e3fb0e6 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/resume/dto/ResumeCreateRequest.java @@ -0,0 +1,12 @@ +package com.pablotj.portfolio.infrastructure.rest.resume.dto; + +import jakarta.validation.constraints.NotBlank; + +public record ResumeCreateRequest( + @NotBlank String name, + @NotBlank String surnames, + @NotBlank String title, + @NotBlank String summary, + String icon +) { +} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/resume/dto/ResumeDto.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/resume/dto/ResumeDto.java new file mode 100644 index 0000000..c63f8ad --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/resume/dto/ResumeDto.java @@ -0,0 +1,13 @@ +package com.pablotj.portfolio.infrastructure.rest.resume.dto; + +import jakarta.validation.constraints.NotBlank; + +public record ResumeDto( + Long id, + @NotBlank String name, + @NotBlank String surnames, + @NotBlank String title, + @NotBlank String summary, + String icon +) { +} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/resume/mapper/ResumeRestMapper.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/resume/mapper/ResumeRestMapper.java new file mode 100644 index 0000000..0cc685b --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/resume/mapper/ResumeRestMapper.java @@ -0,0 +1,13 @@ +package com.pablotj.portfolio.infrastructure.rest.resume.mapper; + +import com.pablotj.portfolio.domain.resume.Resume; +import com.pablotj.portfolio.infrastructure.rest.resume.dto.ResumeDto; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +@Mapper(componentModel = "spring") +public interface ResumeRestMapper { + + @Mapping(target = "id", source = "id.value") + ResumeDto toDto(Resume domain); +} diff --git a/mvnw b/mvnw index 19529dd..4f699ce 100755 --- a/mvnw +++ b/mvnw @@ -23,7 +23,7 @@ # # Optional ENV vars # ----------------- -# JAVA_HOME - location of a JDK home dir, required when download maven via java source +# JAVA_HOME - location of a JDK resume dir, required when download maven via java source # MVNW_REPOURL - repo url base for downloading maven distribution # MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven # MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output @@ -134,7 +134,7 @@ maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; esac # apply MVNW_REPOURL and calculate MAVEN_HOME -# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +# maven resume pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ [ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" distributionUrlName="${distributionUrl##*/}" distributionUrlNameMain="${distributionUrlName%.*}"