diff --git a/application/src/main/java/com/pablotj/portfolio/application/about/CreateAboutUseCase.java b/application/src/main/java/com/pablotj/portfolio/application/about/CreateAboutUseCase.java new file mode 100644 index 0000000..ca3cb76 --- /dev/null +++ b/application/src/main/java/com/pablotj/portfolio/application/about/CreateAboutUseCase.java @@ -0,0 +1,26 @@ +package com.pablotj.portfolio.application.about; + +import com.pablotj.portfolio.domain.about.About; +import com.pablotj.portfolio.domain.about.port.AboutRepositoryPort; + +public class CreateAboutUseCase { + + private final AboutRepositoryPort repository; + + public CreateAboutUseCase(AboutRepositoryPort repository) { + this.repository = repository; + } + + public About handle(Command cmd) { + var about = About.builder() + .id(null) + .title(cmd.title()) + .description(cmd.description()) + .url(cmd.url()) + .build(); + return repository.save(about); + } + + 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/about/GetAboutUseCase.java b/application/src/main/java/com/pablotj/portfolio/application/about/GetAboutUseCase.java new file mode 100644 index 0000000..eddaae0 --- /dev/null +++ b/application/src/main/java/com/pablotj/portfolio/application/about/GetAboutUseCase.java @@ -0,0 +1,24 @@ +package com.pablotj.portfolio.application.about; + +import com.pablotj.portfolio.domain.about.About; +import com.pablotj.portfolio.domain.about.AboutId; +import com.pablotj.portfolio.domain.about.port.AboutRepositoryPort; +import java.util.List; +import java.util.Optional; + +public class GetAboutUseCase { + + private final AboutRepositoryPort repository; + + public GetAboutUseCase(AboutRepositoryPort repository) { + this.repository = repository; + } + + public Optional byId(Long id) { + return repository.findById(new AboutId(id)); + } + + public List all() { + return repository.findAll(); + } +} \ No newline at end of file diff --git a/application/src/main/java/com/pablotj/portfolio/application/certification/CreateCertificationUseCase.java b/application/src/main/java/com/pablotj/portfolio/application/certification/CreateCertificationUseCase.java new file mode 100644 index 0000000..ae6f33c --- /dev/null +++ b/application/src/main/java/com/pablotj/portfolio/application/certification/CreateCertificationUseCase.java @@ -0,0 +1,26 @@ +package com.pablotj.portfolio.application.certification; + +import com.pablotj.portfolio.domain.certification.Certification; +import com.pablotj.portfolio.domain.certification.port.CertificationRepositoryPort; + +public class CreateCertificationUseCase { + + private final CertificationRepositoryPort repository; + + public CreateCertificationUseCase(CertificationRepositoryPort repository) { + this.repository = repository; + } + + public Certification handle(Command cmd) { + var certification = Certification.builder() + .id(null) + .title(cmd.title()) + .description(cmd.description()) + .url(cmd.url()) + .build(); + return repository.save(certification); + } + + 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/certification/GetCertificationUseCase.java b/application/src/main/java/com/pablotj/portfolio/application/certification/GetCertificationUseCase.java new file mode 100644 index 0000000..1d169ed --- /dev/null +++ b/application/src/main/java/com/pablotj/portfolio/application/certification/GetCertificationUseCase.java @@ -0,0 +1,24 @@ +package com.pablotj.portfolio.application.certification; + +import com.pablotj.portfolio.domain.certification.Certification; +import com.pablotj.portfolio.domain.certification.CertificationId; +import com.pablotj.portfolio.domain.certification.port.CertificationRepositoryPort; +import java.util.List; +import java.util.Optional; + +public class GetCertificationUseCase { + + private final CertificationRepositoryPort repository; + + public GetCertificationUseCase(CertificationRepositoryPort repository) { + this.repository = repository; + } + + public Optional byId(Long id) { + return repository.findById(new CertificationId(id)); + } + + public List all() { + return repository.findAll(); + } +} \ No newline at end of file diff --git a/application/src/main/java/com/pablotj/portfolio/application/contact/CreateContactUseCase.java b/application/src/main/java/com/pablotj/portfolio/application/contact/CreateContactUseCase.java new file mode 100644 index 0000000..cb26044 --- /dev/null +++ b/application/src/main/java/com/pablotj/portfolio/application/contact/CreateContactUseCase.java @@ -0,0 +1,26 @@ +package com.pablotj.portfolio.application.contact; + +import com.pablotj.portfolio.domain.contact.Contact; +import com.pablotj.portfolio.domain.contact.port.ContactRepositoryPort; + +public class CreateContactUseCase { + + private final ContactRepositoryPort repository; + + public CreateContactUseCase(ContactRepositoryPort repository) { + this.repository = repository; + } + + public Contact handle(Command cmd) { + var contact = Contact.builder() + .id(null) + .title(cmd.title()) + .description(cmd.description()) + .url(cmd.url()) + .build(); + return repository.save(contact); + } + + 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/contact/GetContactUseCase.java b/application/src/main/java/com/pablotj/portfolio/application/contact/GetContactUseCase.java new file mode 100644 index 0000000..4bccfcd --- /dev/null +++ b/application/src/main/java/com/pablotj/portfolio/application/contact/GetContactUseCase.java @@ -0,0 +1,24 @@ +package com.pablotj.portfolio.application.contact; + +import com.pablotj.portfolio.domain.contact.Contact; +import com.pablotj.portfolio.domain.contact.ContactId; +import com.pablotj.portfolio.domain.contact.port.ContactRepositoryPort; +import java.util.List; +import java.util.Optional; + +public class GetContactUseCase { + + private final ContactRepositoryPort repository; + + public GetContactUseCase(ContactRepositoryPort repository) { + this.repository = repository; + } + + public Optional byId(Long id) { + return repository.findById(new ContactId(id)); + } + + public List all() { + return repository.findAll(); + } +} \ No newline at end of file diff --git a/application/src/main/java/com/pablotj/portfolio/application/education/CreateEducationUseCase.java b/application/src/main/java/com/pablotj/portfolio/application/education/CreateEducationUseCase.java new file mode 100644 index 0000000..e065df8 --- /dev/null +++ b/application/src/main/java/com/pablotj/portfolio/application/education/CreateEducationUseCase.java @@ -0,0 +1,26 @@ +package com.pablotj.portfolio.application.education; + +import com.pablotj.portfolio.domain.education.Education; +import com.pablotj.portfolio.domain.education.port.EducationRepositoryPort; + +public class CreateEducationUseCase { + + private final EducationRepositoryPort repository; + + public CreateEducationUseCase(EducationRepositoryPort repository) { + this.repository = repository; + } + + public Education handle(Command cmd) { + var education = Education.builder() + .id(null) + .title(cmd.title()) + .description(cmd.description()) + .url(cmd.url()) + .build(); + return repository.save(education); + } + + 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/education/GetEducationUseCase.java b/application/src/main/java/com/pablotj/portfolio/application/education/GetEducationUseCase.java new file mode 100644 index 0000000..9ab16b1 --- /dev/null +++ b/application/src/main/java/com/pablotj/portfolio/application/education/GetEducationUseCase.java @@ -0,0 +1,24 @@ +package com.pablotj.portfolio.application.education; + +import com.pablotj.portfolio.domain.education.Education; +import com.pablotj.portfolio.domain.education.EducationId; +import com.pablotj.portfolio.domain.education.port.EducationRepositoryPort; +import java.util.List; +import java.util.Optional; + +public class GetEducationUseCase { + + private final EducationRepositoryPort repository; + + public GetEducationUseCase(EducationRepositoryPort repository) { + this.repository = repository; + } + + public Optional byId(Long id) { + return repository.findById(new EducationId(id)); + } + + public List all() { + return repository.findAll(); + } +} \ No newline at end of file diff --git a/application/src/main/java/com/pablotj/portfolio/application/experience/CreateExperienceUseCase.java b/application/src/main/java/com/pablotj/portfolio/application/experience/CreateExperienceUseCase.java new file mode 100644 index 0000000..77cceb1 --- /dev/null +++ b/application/src/main/java/com/pablotj/portfolio/application/experience/CreateExperienceUseCase.java @@ -0,0 +1,26 @@ +package com.pablotj.portfolio.application.experience; + +import com.pablotj.portfolio.domain.experience.Experience; +import com.pablotj.portfolio.domain.experience.port.ExperienceRepositoryPort; + +public class CreateExperienceUseCase { + + private final ExperienceRepositoryPort repository; + + public CreateExperienceUseCase(ExperienceRepositoryPort repository) { + this.repository = repository; + } + + public Experience handle(Command cmd) { + var experience = Experience.builder() + .id(null) + .title(cmd.title()) + .description(cmd.description()) + .url(cmd.url()) + .build(); + return repository.save(experience); + } + + 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/experience/GetExperienceUseCase.java b/application/src/main/java/com/pablotj/portfolio/application/experience/GetExperienceUseCase.java new file mode 100644 index 0000000..be84928 --- /dev/null +++ b/application/src/main/java/com/pablotj/portfolio/application/experience/GetExperienceUseCase.java @@ -0,0 +1,24 @@ +package com.pablotj.portfolio.application.experience; + +import com.pablotj.portfolio.domain.experience.Experience; +import com.pablotj.portfolio.domain.experience.ExperienceId; +import com.pablotj.portfolio.domain.experience.port.ExperienceRepositoryPort; +import java.util.List; +import java.util.Optional; + +public class GetExperienceUseCase { + + private final ExperienceRepositoryPort repository; + + public GetExperienceUseCase(ExperienceRepositoryPort repository) { + this.repository = repository; + } + + public Optional byId(Long id) { + return repository.findById(new ExperienceId(id)); + } + + public List all() { + return repository.findAll(); + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..f0a4fe8 --- /dev/null +++ b/application/src/main/java/com/pablotj/portfolio/application/home/CreateHomeUseCase.java @@ -0,0 +1,26 @@ +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 new file mode 100644 index 0000000..3ef5e10 --- /dev/null +++ b/application/src/main/java/com/pablotj/portfolio/application/home/GetHomeUseCase.java @@ -0,0 +1,24 @@ +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/skill/CreateSkillUseCase.java b/application/src/main/java/com/pablotj/portfolio/application/skill/CreateSkillUseCase.java new file mode 100644 index 0000000..bcc29f4 --- /dev/null +++ b/application/src/main/java/com/pablotj/portfolio/application/skill/CreateSkillUseCase.java @@ -0,0 +1,26 @@ +package com.pablotj.portfolio.application.skill; + +import com.pablotj.portfolio.domain.skill.Skill; +import com.pablotj.portfolio.domain.skill.port.SkillRepositoryPort; + +public class CreateSkillUseCase { + + private final SkillRepositoryPort repository; + + public CreateSkillUseCase(SkillRepositoryPort repository) { + this.repository = repository; + } + + public Skill handle(Command cmd) { + var skill = Skill.builder() + .id(null) + .title(cmd.title()) + .description(cmd.description()) + .url(cmd.url()) + .build(); + return repository.save(skill); + } + + 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/skill/GetSkillUseCase.java b/application/src/main/java/com/pablotj/portfolio/application/skill/GetSkillUseCase.java new file mode 100644 index 0000000..a48415e --- /dev/null +++ b/application/src/main/java/com/pablotj/portfolio/application/skill/GetSkillUseCase.java @@ -0,0 +1,24 @@ +package com.pablotj.portfolio.application.skill; + +import com.pablotj.portfolio.domain.skill.Skill; +import com.pablotj.portfolio.domain.skill.SkillId; +import com.pablotj.portfolio.domain.skill.port.SkillRepositoryPort; +import java.util.List; +import java.util.Optional; + +public class GetSkillUseCase { + + private final SkillRepositoryPort repository; + + public GetSkillUseCase(SkillRepositoryPort repository) { + this.repository = repository; + } + + public Optional byId(Long id) { + return repository.findById(new SkillId(id)); + } + + public List all() { + return repository.findAll(); + } +} \ No newline at end of file diff --git a/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/PortfolioApplication.java b/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/PortfolioApplication.java index 28f5747..019057d 100644 --- a/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/PortfolioApplication.java +++ b/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/PortfolioApplication.java @@ -6,8 +6,8 @@ import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @SpringBootApplication(scanBasePackages = "com.pablotj") -@EnableJpaRepositories(basePackages = { "com.pablotj.portfolio.infrastructure.persistence.project.repo" }) -@EntityScan(basePackages = { "com.pablotj.portfolio.infrastructure.persistence.project.entity" }) +@EnableJpaRepositories(basePackages = {"com.pablotj.portfolio.infrastructure.persistence.*.repo"}) +@EntityScan(basePackages = {"com.pablotj.portfolio.infrastructure.persistence.*.entity"}) public class PortfolioApplication { public static void main(String[] args) { diff --git a/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/about/AboutApplicationConfig.java b/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/about/AboutApplicationConfig.java new file mode 100644 index 0000000..4e85de0 --- /dev/null +++ b/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/about/AboutApplicationConfig.java @@ -0,0 +1,21 @@ +package com.pablotj.portfolio.bootstrap.about; + +import com.pablotj.portfolio.application.about.CreateAboutUseCase; +import com.pablotj.portfolio.application.about.GetAboutUseCase; +import com.pablotj.portfolio.domain.about.port.AboutRepositoryPort; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class AboutApplicationConfig { + + @Bean + public GetAboutUseCase getAboutUseCase(AboutRepositoryPort repo) { + return new GetAboutUseCase(repo); + } + + @Bean + public CreateAboutUseCase createAboutUseCase(AboutRepositoryPort repo) { + return new CreateAboutUseCase(repo); + } +} \ No newline at end of file diff --git a/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/certification/CertificationApplicationConfig.java b/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/certification/CertificationApplicationConfig.java new file mode 100644 index 0000000..a652302 --- /dev/null +++ b/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/certification/CertificationApplicationConfig.java @@ -0,0 +1,21 @@ +package com.pablotj.portfolio.bootstrap.certification; + +import com.pablotj.portfolio.application.certification.CreateCertificationUseCase; +import com.pablotj.portfolio.application.certification.GetCertificationUseCase; +import com.pablotj.portfolio.domain.certification.port.CertificationRepositoryPort; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class CertificationApplicationConfig { + + @Bean + public GetCertificationUseCase getCertificationUseCase(CertificationRepositoryPort repo) { + return new GetCertificationUseCase(repo); + } + + @Bean + public CreateCertificationUseCase createCertificationUseCase(CertificationRepositoryPort repo) { + return new CreateCertificationUseCase(repo); + } +} \ No newline at end of file diff --git a/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/contact/ContactApplicationConfig.java b/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/contact/ContactApplicationConfig.java new file mode 100644 index 0000000..26f6c83 --- /dev/null +++ b/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/contact/ContactApplicationConfig.java @@ -0,0 +1,21 @@ +package com.pablotj.portfolio.bootstrap.contact; + +import com.pablotj.portfolio.application.contact.CreateContactUseCase; +import com.pablotj.portfolio.application.contact.GetContactUseCase; +import com.pablotj.portfolio.domain.contact.port.ContactRepositoryPort; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class ContactApplicationConfig { + + @Bean + public GetContactUseCase getContactUseCase(ContactRepositoryPort repo) { + return new GetContactUseCase(repo); + } + + @Bean + public CreateContactUseCase createContactUseCase(ContactRepositoryPort repo) { + return new CreateContactUseCase(repo); + } +} \ No newline at end of file diff --git a/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/education/EducationApplicationConfig.java b/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/education/EducationApplicationConfig.java new file mode 100644 index 0000000..91875ca --- /dev/null +++ b/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/education/EducationApplicationConfig.java @@ -0,0 +1,21 @@ +package com.pablotj.portfolio.bootstrap.education; + +import com.pablotj.portfolio.application.education.CreateEducationUseCase; +import com.pablotj.portfolio.application.education.GetEducationUseCase; +import com.pablotj.portfolio.domain.education.port.EducationRepositoryPort; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class EducationApplicationConfig { + + @Bean + public GetEducationUseCase getEducationUseCase(EducationRepositoryPort repo) { + return new GetEducationUseCase(repo); + } + + @Bean + public CreateEducationUseCase createEducationUseCase(EducationRepositoryPort repo) { + return new CreateEducationUseCase(repo); + } +} \ No newline at end of file diff --git a/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/experience/ExperienceApplicationConfig.java b/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/experience/ExperienceApplicationConfig.java new file mode 100644 index 0000000..31bf306 --- /dev/null +++ b/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/experience/ExperienceApplicationConfig.java @@ -0,0 +1,21 @@ +package com.pablotj.portfolio.bootstrap.experience; + +import com.pablotj.portfolio.application.experience.CreateExperienceUseCase; +import com.pablotj.portfolio.application.experience.GetExperienceUseCase; +import com.pablotj.portfolio.domain.experience.port.ExperienceRepositoryPort; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class ExperienceApplicationConfig { + + @Bean + public GetExperienceUseCase getExperienceUseCase(ExperienceRepositoryPort repo) { + return new GetExperienceUseCase(repo); + } + + @Bean + public CreateExperienceUseCase createExperienceUseCase(ExperienceRepositoryPort repo) { + return new CreateExperienceUseCase(repo); + } +} \ 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 new file mode 100644 index 0000000..e15feac --- /dev/null +++ b/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/home/HomeApplicationConfig.java @@ -0,0 +1,21 @@ +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/skill/SkillApplicationConfig.java b/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/skill/SkillApplicationConfig.java new file mode 100644 index 0000000..b78e847 --- /dev/null +++ b/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/skill/SkillApplicationConfig.java @@ -0,0 +1,21 @@ +package com.pablotj.portfolio.bootstrap.skill; + +import com.pablotj.portfolio.application.skill.CreateSkillUseCase; +import com.pablotj.portfolio.application.skill.GetSkillUseCase; +import com.pablotj.portfolio.domain.skill.port.SkillRepositoryPort; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class SkillApplicationConfig { + + @Bean + public GetSkillUseCase getSkillUseCase(SkillRepositoryPort repo) { + return new GetSkillUseCase(repo); + } + + @Bean + public CreateSkillUseCase createSkillUseCase(SkillRepositoryPort repo) { + return new CreateSkillUseCase(repo); + } +} \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/about/About.java b/domain/src/main/java/com/pablotj/portfolio/domain/about/About.java new file mode 100644 index 0000000..34e1b8b --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/about/About.java @@ -0,0 +1,13 @@ +package com.pablotj.portfolio.domain.about; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class About { + private final AboutId 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/about/AboutId.java b/domain/src/main/java/com/pablotj/portfolio/domain/about/AboutId.java new file mode 100644 index 0000000..5b8a255 --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/about/AboutId.java @@ -0,0 +1,7 @@ +package com.pablotj.portfolio.domain.about; + +public record AboutId(Long value) { + public AboutId { + if (value != null && value < 0) throw new IllegalArgumentException("AboutId must be positive"); + } +} \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/about/port/AboutRepositoryPort.java b/domain/src/main/java/com/pablotj/portfolio/domain/about/port/AboutRepositoryPort.java new file mode 100644 index 0000000..cc8d0d7 --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/about/port/AboutRepositoryPort.java @@ -0,0 +1,15 @@ +package com.pablotj.portfolio.domain.about.port; + +import com.pablotj.portfolio.domain.about.About; +import com.pablotj.portfolio.domain.about.AboutId; +import java.util.List; +import java.util.Optional; + +public interface AboutRepositoryPort { + + About save(About p); + + Optional findById(AboutId id); + + List findAll(); +} \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/certification/Certification.java b/domain/src/main/java/com/pablotj/portfolio/domain/certification/Certification.java new file mode 100644 index 0000000..8dd81f1 --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/certification/Certification.java @@ -0,0 +1,13 @@ +package com.pablotj.portfolio.domain.certification; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class Certification { + private final CertificationId 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/certification/CertificationId.java b/domain/src/main/java/com/pablotj/portfolio/domain/certification/CertificationId.java new file mode 100644 index 0000000..0c0acd5 --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/certification/CertificationId.java @@ -0,0 +1,7 @@ +package com.pablotj.portfolio.domain.certification; + +public record CertificationId(Long value) { + public CertificationId { + if (value != null && value < 0) throw new IllegalArgumentException("CertificationId must be positive"); + } +} \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/certification/port/CertificationRepositoryPort.java b/domain/src/main/java/com/pablotj/portfolio/domain/certification/port/CertificationRepositoryPort.java new file mode 100644 index 0000000..b448d27 --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/certification/port/CertificationRepositoryPort.java @@ -0,0 +1,14 @@ +package com.pablotj.portfolio.domain.certification.port; + +import com.pablotj.portfolio.domain.certification.Certification; +import com.pablotj.portfolio.domain.certification.CertificationId; +import java.util.List; +import java.util.Optional; + +public interface CertificationRepositoryPort { + Certification save(Certification p); + + Optional findById(CertificationId id); + + List findAll(); +} \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/contact/Contact.java b/domain/src/main/java/com/pablotj/portfolio/domain/contact/Contact.java new file mode 100644 index 0000000..14807ff --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/contact/Contact.java @@ -0,0 +1,13 @@ +package com.pablotj.portfolio.domain.contact; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class Contact { + private final ContactId 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/contact/ContactId.java b/domain/src/main/java/com/pablotj/portfolio/domain/contact/ContactId.java new file mode 100644 index 0000000..83794e8 --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/contact/ContactId.java @@ -0,0 +1,7 @@ +package com.pablotj.portfolio.domain.contact; + +public record ContactId(Long value) { + public ContactId { + if (value != null && value < 0) throw new IllegalArgumentException("ContactId must be positive"); + } +} \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/contact/port/ContactRepositoryPort.java b/domain/src/main/java/com/pablotj/portfolio/domain/contact/port/ContactRepositoryPort.java new file mode 100644 index 0000000..4614910 --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/contact/port/ContactRepositoryPort.java @@ -0,0 +1,14 @@ +package com.pablotj.portfolio.domain.contact.port; + +import com.pablotj.portfolio.domain.contact.Contact; +import com.pablotj.portfolio.domain.contact.ContactId; +import java.util.List; +import java.util.Optional; + +public interface ContactRepositoryPort { + Contact save(Contact p); + + Optional findById(ContactId id); + + List findAll(); +} \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/education/Education.java b/domain/src/main/java/com/pablotj/portfolio/domain/education/Education.java new file mode 100644 index 0000000..64a5d61 --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/education/Education.java @@ -0,0 +1,13 @@ +package com.pablotj.portfolio.domain.education; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class Education { + private final EducationId 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/education/EducationId.java b/domain/src/main/java/com/pablotj/portfolio/domain/education/EducationId.java new file mode 100644 index 0000000..fb3375f --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/education/EducationId.java @@ -0,0 +1,7 @@ +package com.pablotj.portfolio.domain.education; + +public record EducationId(Long value) { + public EducationId { + if (value != null && value < 0) throw new IllegalArgumentException("EducationId must be positive"); + } +} \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/education/port/EducationRepositoryPort.java b/domain/src/main/java/com/pablotj/portfolio/domain/education/port/EducationRepositoryPort.java new file mode 100644 index 0000000..de80f56 --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/education/port/EducationRepositoryPort.java @@ -0,0 +1,14 @@ +package com.pablotj.portfolio.domain.education.port; + +import com.pablotj.portfolio.domain.education.Education; +import com.pablotj.portfolio.domain.education.EducationId; +import java.util.List; +import java.util.Optional; + +public interface EducationRepositoryPort { + Education save(Education p); + + Optional findById(EducationId id); + + List findAll(); +} \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/experience/Experience.java b/domain/src/main/java/com/pablotj/portfolio/domain/experience/Experience.java new file mode 100644 index 0000000..db3a27a --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/experience/Experience.java @@ -0,0 +1,13 @@ +package com.pablotj.portfolio.domain.experience; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class Experience { + private final ExperienceId 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/experience/ExperienceId.java b/domain/src/main/java/com/pablotj/portfolio/domain/experience/ExperienceId.java new file mode 100644 index 0000000..c9713af --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/experience/ExperienceId.java @@ -0,0 +1,7 @@ +package com.pablotj.portfolio.domain.experience; + +public record ExperienceId(Long value) { + public ExperienceId { + if (value != null && value < 0) throw new IllegalArgumentException("ExperienceId must be positive"); + } +} \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/experience/port/ExperienceRepositoryPort.java b/domain/src/main/java/com/pablotj/portfolio/domain/experience/port/ExperienceRepositoryPort.java new file mode 100644 index 0000000..db2bd4a --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/experience/port/ExperienceRepositoryPort.java @@ -0,0 +1,14 @@ +package com.pablotj.portfolio.domain.experience.port; + +import com.pablotj.portfolio.domain.experience.Experience; +import com.pablotj.portfolio.domain.experience.ExperienceId; +import java.util.List; +import java.util.Optional; + +public interface ExperienceRepositoryPort { + Experience save(Experience p); + + Optional findById(ExperienceId id); + + List findAll(); +} \ 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 new file mode 100644 index 0000000..8fb524e --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/home/Home.java @@ -0,0 +1,13 @@ +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 new file mode 100644 index 0000000..352719e --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/home/HomeId.java @@ -0,0 +1,7 @@ +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 new file mode 100644 index 0000000..4426112 --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/home/port/HomeRepositoryPort.java @@ -0,0 +1,14 @@ +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/skill/Skill.java b/domain/src/main/java/com/pablotj/portfolio/domain/skill/Skill.java new file mode 100644 index 0000000..2930cd2 --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/skill/Skill.java @@ -0,0 +1,13 @@ +package com.pablotj.portfolio.domain.skill; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class Skill { + private final SkillId 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/skill/SkillId.java b/domain/src/main/java/com/pablotj/portfolio/domain/skill/SkillId.java new file mode 100644 index 0000000..2c79d09 --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/skill/SkillId.java @@ -0,0 +1,7 @@ +package com.pablotj.portfolio.domain.skill; + +public record SkillId(Long value) { + public SkillId { + if (value != null && value < 0) throw new IllegalArgumentException("SkillId must be positive"); + } +} \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/skill/port/SkillRepositoryPort.java b/domain/src/main/java/com/pablotj/portfolio/domain/skill/port/SkillRepositoryPort.java new file mode 100644 index 0000000..47fd59f --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/skill/port/SkillRepositoryPort.java @@ -0,0 +1,14 @@ +package com.pablotj.portfolio.domain.skill.port; + +import com.pablotj.portfolio.domain.skill.Skill; +import com.pablotj.portfolio.domain.skill.SkillId; +import java.util.List; +import java.util.Optional; + +public interface SkillRepositoryPort { + Skill save(Skill p); + + Optional findById(SkillId id); + + List findAll(); +} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/about/adapter/AboutRepositoryAdapter.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/about/adapter/AboutRepositoryAdapter.java new file mode 100644 index 0000000..86b5bd5 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/about/adapter/AboutRepositoryAdapter.java @@ -0,0 +1,40 @@ +package com.pablotj.portfolio.infrastructure.persistence.about.adapter; + +import com.pablotj.portfolio.domain.about.About; +import com.pablotj.portfolio.domain.about.AboutId; +import com.pablotj.portfolio.domain.about.port.AboutRepositoryPort; +import com.pablotj.portfolio.infrastructure.persistence.about.entity.AboutJpaEntity; +import com.pablotj.portfolio.infrastructure.persistence.about.mapper.AboutJpaMapper; +import com.pablotj.portfolio.infrastructure.persistence.about.repo.SpringDataAboutRepository; +import java.util.List; +import java.util.Optional; +import org.springframework.stereotype.Repository; + +@Repository +public class AboutRepositoryAdapter implements AboutRepositoryPort { + + private final SpringDataAboutRepository repo; + private final AboutJpaMapper mapper; + + public AboutRepositoryAdapter(SpringDataAboutRepository repo, AboutJpaMapper mapper) { + this.repo = repo; + this.mapper = mapper; + } + + @Override + public About save(About p) { + AboutJpaEntity entity = mapper.toEntity(p); + AboutJpaEntity saved = repo.save(entity); + return mapper.toDomain(saved); + } + + @Override + public Optional findById(AboutId 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/about/entity/AboutJpaEntity.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/about/entity/AboutJpaEntity.java new file mode 100644 index 0000000..12c6707 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/about/entity/AboutJpaEntity.java @@ -0,0 +1,29 @@ +package com.pablotj.portfolio.infrastructure.persistence.about.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table(name = "abouts") +@Getter +@Setter +public class AboutJpaEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String title; + + @Column(columnDefinition = "text") + private String description; + + private String url; +} \ 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 new file mode 100644 index 0000000..163d853 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/about/mapper/AboutJpaMapper.java @@ -0,0 +1,24 @@ +package com.pablotj.portfolio.infrastructure.persistence.about.mapper; + +import com.pablotj.portfolio.domain.about.About; +import com.pablotj.portfolio.domain.about.AboutId; +import com.pablotj.portfolio.infrastructure.persistence.about.entity.AboutJpaEntity; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +@Mapper(componentModel = "spring") +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(); + } +} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/about/repo/SpringDataAboutRepository.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/about/repo/SpringDataAboutRepository.java new file mode 100644 index 0000000..611dd8f --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/about/repo/SpringDataAboutRepository.java @@ -0,0 +1,7 @@ +package com.pablotj.portfolio.infrastructure.persistence.about.repo; + +import com.pablotj.portfolio.infrastructure.persistence.about.entity.AboutJpaEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface SpringDataAboutRepository extends JpaRepository { +} diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/certification/adapter/CertificationRepositoryAdapter.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/certification/adapter/CertificationRepositoryAdapter.java new file mode 100644 index 0000000..1e13722 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/certification/adapter/CertificationRepositoryAdapter.java @@ -0,0 +1,40 @@ +package com.pablotj.portfolio.infrastructure.persistence.certification.adapter; + +import com.pablotj.portfolio.domain.certification.Certification; +import com.pablotj.portfolio.domain.certification.CertificationId; +import com.pablotj.portfolio.domain.certification.port.CertificationRepositoryPort; +import com.pablotj.portfolio.infrastructure.persistence.certification.entity.CertificationJpaEntity; +import com.pablotj.portfolio.infrastructure.persistence.certification.mapper.CertificationJpaMapper; +import com.pablotj.portfolio.infrastructure.persistence.certification.repo.SpringDataCertificationRepository; +import java.util.List; +import java.util.Optional; +import org.springframework.stereotype.Repository; + +@Repository +public class CertificationRepositoryAdapter implements CertificationRepositoryPort { + + private final SpringDataCertificationRepository repo; + private final CertificationJpaMapper mapper; + + public CertificationRepositoryAdapter(SpringDataCertificationRepository repo, CertificationJpaMapper mapper) { + this.repo = repo; + this.mapper = mapper; + } + + @Override + public Certification save(Certification p) { + CertificationJpaEntity entity = mapper.toEntity(p); + CertificationJpaEntity saved = repo.save(entity); + return mapper.toDomain(saved); + } + + @Override + public Optional findById(CertificationId 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/certification/entity/CertificationJpaEntity.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/certification/entity/CertificationJpaEntity.java new file mode 100644 index 0000000..ab5ad0e --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/certification/entity/CertificationJpaEntity.java @@ -0,0 +1,29 @@ +package com.pablotj.portfolio.infrastructure.persistence.certification.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table(name = "certifications") +@Getter +@Setter +public class CertificationJpaEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String title; + + @Column(columnDefinition = "text") + private String description; + + private String url; +} \ 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 new file mode 100644 index 0000000..921807f --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/certification/mapper/CertificationJpaMapper.java @@ -0,0 +1,24 @@ +package com.pablotj.portfolio.infrastructure.persistence.certification.mapper; + +import com.pablotj.portfolio.domain.certification.Certification; +import com.pablotj.portfolio.domain.certification.CertificationId; +import com.pablotj.portfolio.infrastructure.persistence.certification.entity.CertificationJpaEntity; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +@Mapper(componentModel = "spring") +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(); + } +} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/certification/repo/SpringDataCertificationRepository.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/certification/repo/SpringDataCertificationRepository.java new file mode 100644 index 0000000..8dc8cfd --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/certification/repo/SpringDataCertificationRepository.java @@ -0,0 +1,7 @@ +package com.pablotj.portfolio.infrastructure.persistence.certification.repo; + +import com.pablotj.portfolio.infrastructure.persistence.certification.entity.CertificationJpaEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface SpringDataCertificationRepository extends JpaRepository { +} diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/contact/adapter/ContactRepositoryAdapter.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/contact/adapter/ContactRepositoryAdapter.java new file mode 100644 index 0000000..167b2a9 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/contact/adapter/ContactRepositoryAdapter.java @@ -0,0 +1,40 @@ +package com.pablotj.portfolio.infrastructure.persistence.contact.adapter; + +import com.pablotj.portfolio.domain.contact.Contact; +import com.pablotj.portfolio.domain.contact.ContactId; +import com.pablotj.portfolio.domain.contact.port.ContactRepositoryPort; +import com.pablotj.portfolio.infrastructure.persistence.contact.entity.ContactJpaEntity; +import com.pablotj.portfolio.infrastructure.persistence.contact.mapper.ContactJpaMapper; +import com.pablotj.portfolio.infrastructure.persistence.contact.repo.SpringDataContactRepository; +import java.util.List; +import java.util.Optional; +import org.springframework.stereotype.Repository; + +@Repository +public class ContactRepositoryAdapter implements ContactRepositoryPort { + + private final SpringDataContactRepository repo; + private final ContactJpaMapper mapper; + + public ContactRepositoryAdapter(SpringDataContactRepository repo, ContactJpaMapper mapper) { + this.repo = repo; + this.mapper = mapper; + } + + @Override + public Contact save(Contact p) { + ContactJpaEntity entity = mapper.toEntity(p); + ContactJpaEntity saved = repo.save(entity); + return mapper.toDomain(saved); + } + + @Override + public Optional findById(ContactId 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/contact/entity/ContactJpaEntity.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/contact/entity/ContactJpaEntity.java new file mode 100644 index 0000000..90769d3 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/contact/entity/ContactJpaEntity.java @@ -0,0 +1,29 @@ +package com.pablotj.portfolio.infrastructure.persistence.contact.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table(name = "contacts") +@Getter +@Setter +public class ContactJpaEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String title; + + @Column(columnDefinition = "text") + private String description; + + private String url; +} \ 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 new file mode 100644 index 0000000..1de50be --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/contact/mapper/ContactJpaMapper.java @@ -0,0 +1,24 @@ +package com.pablotj.portfolio.infrastructure.persistence.contact.mapper; + +import com.pablotj.portfolio.domain.contact.Contact; +import com.pablotj.portfolio.domain.contact.ContactId; +import com.pablotj.portfolio.infrastructure.persistence.contact.entity.ContactJpaEntity; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +@Mapper(componentModel = "spring") +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(); + } +} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/contact/repo/SpringDataContactRepository.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/contact/repo/SpringDataContactRepository.java new file mode 100644 index 0000000..75c67b9 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/contact/repo/SpringDataContactRepository.java @@ -0,0 +1,7 @@ +package com.pablotj.portfolio.infrastructure.persistence.contact.repo; + +import com.pablotj.portfolio.infrastructure.persistence.contact.entity.ContactJpaEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface SpringDataContactRepository extends JpaRepository { +} diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/education/adapter/EducationRepositoryAdapter.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/education/adapter/EducationRepositoryAdapter.java new file mode 100644 index 0000000..09dc967 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/education/adapter/EducationRepositoryAdapter.java @@ -0,0 +1,40 @@ +package com.pablotj.portfolio.infrastructure.persistence.education.adapter; + +import com.pablotj.portfolio.domain.education.Education; +import com.pablotj.portfolio.domain.education.EducationId; +import com.pablotj.portfolio.domain.education.port.EducationRepositoryPort; +import com.pablotj.portfolio.infrastructure.persistence.education.entity.EducationJpaEntity; +import com.pablotj.portfolio.infrastructure.persistence.education.mapper.EducationJpaMapper; +import com.pablotj.portfolio.infrastructure.persistence.education.repo.SpringDataEducationRepository; +import java.util.List; +import java.util.Optional; +import org.springframework.stereotype.Repository; + +@Repository +public class EducationRepositoryAdapter implements EducationRepositoryPort { + + private final SpringDataEducationRepository repo; + private final EducationJpaMapper mapper; + + public EducationRepositoryAdapter(SpringDataEducationRepository repo, EducationJpaMapper mapper) { + this.repo = repo; + this.mapper = mapper; + } + + @Override + public Education save(Education p) { + EducationJpaEntity entity = mapper.toEntity(p); + EducationJpaEntity saved = repo.save(entity); + return mapper.toDomain(saved); + } + + @Override + public Optional findById(EducationId 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/education/entity/EducationJpaEntity.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/education/entity/EducationJpaEntity.java new file mode 100644 index 0000000..cab9530 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/education/entity/EducationJpaEntity.java @@ -0,0 +1,29 @@ +package com.pablotj.portfolio.infrastructure.persistence.education.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table(name = "educations") +@Getter +@Setter +public class EducationJpaEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String title; + + @Column(columnDefinition = "text") + private String description; + + private String url; +} \ 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 new file mode 100644 index 0000000..bac47cd --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/education/mapper/EducationJpaMapper.java @@ -0,0 +1,24 @@ +package com.pablotj.portfolio.infrastructure.persistence.education.mapper; + +import com.pablotj.portfolio.domain.education.Education; +import com.pablotj.portfolio.domain.education.EducationId; +import com.pablotj.portfolio.infrastructure.persistence.education.entity.EducationJpaEntity; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +@Mapper(componentModel = "spring") +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(); + } +} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/education/repo/SpringDataEducationRepository.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/education/repo/SpringDataEducationRepository.java new file mode 100644 index 0000000..348303c --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/education/repo/SpringDataEducationRepository.java @@ -0,0 +1,7 @@ +package com.pablotj.portfolio.infrastructure.persistence.education.repo; + +import com.pablotj.portfolio.infrastructure.persistence.education.entity.EducationJpaEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface SpringDataEducationRepository extends JpaRepository { +} diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/experience/adapter/ExperienceRepositoryAdapter.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/experience/adapter/ExperienceRepositoryAdapter.java new file mode 100644 index 0000000..e6db141 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/experience/adapter/ExperienceRepositoryAdapter.java @@ -0,0 +1,40 @@ +package com.pablotj.portfolio.infrastructure.persistence.experience.adapter; + +import com.pablotj.portfolio.domain.experience.Experience; +import com.pablotj.portfolio.domain.experience.ExperienceId; +import com.pablotj.portfolio.domain.experience.port.ExperienceRepositoryPort; +import com.pablotj.portfolio.infrastructure.persistence.experience.entity.ExperienceJpaEntity; +import com.pablotj.portfolio.infrastructure.persistence.experience.mapper.ExperienceJpaMapper; +import com.pablotj.portfolio.infrastructure.persistence.experience.repo.SpringDataExperienceRepository; +import java.util.List; +import java.util.Optional; +import org.springframework.stereotype.Repository; + +@Repository +public class ExperienceRepositoryAdapter implements ExperienceRepositoryPort { + + private final SpringDataExperienceRepository repo; + private final ExperienceJpaMapper mapper; + + public ExperienceRepositoryAdapter(SpringDataExperienceRepository repo, ExperienceJpaMapper mapper) { + this.repo = repo; + this.mapper = mapper; + } + + @Override + public Experience save(Experience p) { + ExperienceJpaEntity entity = mapper.toEntity(p); + ExperienceJpaEntity saved = repo.save(entity); + return mapper.toDomain(saved); + } + + @Override + public Optional findById(ExperienceId 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/experience/entity/ExperienceJpaEntity.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/experience/entity/ExperienceJpaEntity.java new file mode 100644 index 0000000..0462289 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/experience/entity/ExperienceJpaEntity.java @@ -0,0 +1,29 @@ +package com.pablotj.portfolio.infrastructure.persistence.experience.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table(name = "experiences") +@Getter +@Setter +public class ExperienceJpaEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String title; + + @Column(columnDefinition = "text") + private String description; + + private String url; +} \ 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 new file mode 100644 index 0000000..1ffbfe1 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/experience/mapper/ExperienceJpaMapper.java @@ -0,0 +1,24 @@ +package com.pablotj.portfolio.infrastructure.persistence.experience.mapper; + +import com.pablotj.portfolio.domain.experience.Experience; +import com.pablotj.portfolio.domain.experience.ExperienceId; +import com.pablotj.portfolio.infrastructure.persistence.experience.entity.ExperienceJpaEntity; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +@Mapper(componentModel = "spring") +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(); + } +} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/experience/repo/SpringDataExperienceRepository.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/experience/repo/SpringDataExperienceRepository.java new file mode 100644 index 0000000..215f92e --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/experience/repo/SpringDataExperienceRepository.java @@ -0,0 +1,7 @@ +package com.pablotj.portfolio.infrastructure.persistence.experience.repo; + +import com.pablotj.portfolio.infrastructure.persistence.experience.entity.ExperienceJpaEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface SpringDataExperienceRepository extends JpaRepository { +} 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 new file mode 100644 index 0000000..58bccac --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/home/adapter/HomeRepositoryAdapter.java @@ -0,0 +1,40 @@ +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/entity/HomeJpaEntity.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/home/entity/HomeJpaEntity.java new file mode 100644 index 0000000..94dd525 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/home/entity/HomeJpaEntity.java @@ -0,0 +1,29 @@ +package com.pablotj.portfolio.infrastructure.persistence.home.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table(name = "homes") +@Getter +@Setter +public class HomeJpaEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String title; + + @Column(columnDefinition = "text") + private String description; + + private String url; +} \ 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 new file mode 100644 index 0000000..f6e6539 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/home/mapper/HomeJpaMapper.java @@ -0,0 +1,24 @@ +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 new file mode 100644 index 0000000..3db716d --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/home/repo/SpringDataHomeRepository.java @@ -0,0 +1,7 @@ +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/skill/adapter/SkillRepositoryAdapter.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/skill/adapter/SkillRepositoryAdapter.java new file mode 100644 index 0000000..2bfab7d --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/skill/adapter/SkillRepositoryAdapter.java @@ -0,0 +1,40 @@ +package com.pablotj.portfolio.infrastructure.persistence.skill.adapter; + +import com.pablotj.portfolio.domain.skill.Skill; +import com.pablotj.portfolio.domain.skill.SkillId; +import com.pablotj.portfolio.domain.skill.port.SkillRepositoryPort; +import com.pablotj.portfolio.infrastructure.persistence.skill.entity.SkillJpaEntity; +import com.pablotj.portfolio.infrastructure.persistence.skill.mapper.SkillJpaMapper; +import com.pablotj.portfolio.infrastructure.persistence.skill.repo.SpringDataSkillRepository; +import java.util.List; +import java.util.Optional; +import org.springframework.stereotype.Repository; + +@Repository +public class SkillRepositoryAdapter implements SkillRepositoryPort { + + private final SpringDataSkillRepository repo; + private final SkillJpaMapper mapper; + + public SkillRepositoryAdapter(SpringDataSkillRepository repo, SkillJpaMapper mapper) { + this.repo = repo; + this.mapper = mapper; + } + + @Override + public Skill save(Skill p) { + SkillJpaEntity entity = mapper.toEntity(p); + SkillJpaEntity saved = repo.save(entity); + return mapper.toDomain(saved); + } + + @Override + public Optional findById(SkillId 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/skill/entity/SkillJpaEntity.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/skill/entity/SkillJpaEntity.java new file mode 100644 index 0000000..f0df0df --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/skill/entity/SkillJpaEntity.java @@ -0,0 +1,29 @@ +package com.pablotj.portfolio.infrastructure.persistence.skill.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table(name = "skills") +@Getter +@Setter +public class SkillJpaEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String title; + + @Column(columnDefinition = "text") + private String description; + + private String url; +} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/skill/mapper/SkillJpaMapper.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/skill/mapper/SkillJpaMapper.java new file mode 100644 index 0000000..17d93a5 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/skill/mapper/SkillJpaMapper.java @@ -0,0 +1,24 @@ +package com.pablotj.portfolio.infrastructure.persistence.skill.mapper; + +import com.pablotj.portfolio.domain.skill.Skill; +import com.pablotj.portfolio.domain.skill.SkillId; +import com.pablotj.portfolio.infrastructure.persistence.skill.entity.SkillJpaEntity; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +@Mapper(componentModel = "spring") +public interface SkillJpaMapper { + + @Mapping(target = "id", ignore = true) + SkillJpaEntity toEntity(Skill domain); + + default Skill toDomain(SkillJpaEntity e) { + if (e == null) return null; + return Skill.builder() + .id(e.getId() == null ? null : new SkillId(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/skill/repo/SpringDataSkillRepository.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/skill/repo/SpringDataSkillRepository.java new file mode 100644 index 0000000..5368648 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/skill/repo/SpringDataSkillRepository.java @@ -0,0 +1,7 @@ +package com.pablotj.portfolio.infrastructure.persistence.skill.repo; + +import com.pablotj.portfolio.infrastructure.persistence.skill.entity.SkillJpaEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface SpringDataSkillRepository extends JpaRepository { +} diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/about/controller/AboutController.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/about/controller/AboutController.java new file mode 100644 index 0000000..7c5e3ed --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/about/controller/AboutController.java @@ -0,0 +1,56 @@ +package com.pablotj.portfolio.infrastructure.rest.about.controller; + +import com.pablotj.portfolio.application.about.CreateAboutUseCase; +import com.pablotj.portfolio.application.about.GetAboutUseCase; +import com.pablotj.portfolio.infrastructure.rest.about.dto.AboutDto; +import com.pablotj.portfolio.infrastructure.rest.about.mapper.AboutRestMapper; +import jakarta.validation.Valid; +import java.net.URI; +import java.util.List; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/v1/abouts") +public class AboutController { + + private final CreateAboutUseCase createUC; + private final GetAboutUseCase getUC; + private final AboutRestMapper mapper; + + public AboutController(CreateAboutUseCase createUC, GetAboutUseCase getUC, AboutRestMapper mapper) { + this.createUC = createUC; + this.getUC = getUC; + this.mapper = mapper; + } + + @GetMapping + public List all() { + return getUC.all().stream().map(mapper::toDto).toList(); + } + + @GetMapping("/{id}") + public ResponseEntity byId(@PathVariable Long id) { + return getUC.byId(id) + .map(mapper::toDto) + .map(ResponseEntity::ok) + .orElse(ResponseEntity.notFound().build()); + } + + @PostMapping + public ResponseEntity create(@Valid @RequestBody com.pablotj.portfolio.infrastructure.rest.about.dto.CreateAboutRequest request) { + var cmd = new CreateAboutUseCase.Command( + request.title(), + request.description(), + request.url() + ); + var created = createUC.handle(cmd); + var body = mapper.toDto(created); + return ResponseEntity.created(URI.create("/api/abouts/" + body.id())).body(body); + } +} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/about/dto/AboutDto.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/about/dto/AboutDto.java new file mode 100644 index 0000000..f1f254b --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/about/dto/AboutDto.java @@ -0,0 +1,6 @@ +package com.pablotj.portfolio.infrastructure.rest.about.dto; + +import jakarta.validation.constraints.NotBlank; + +public record AboutDto(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/about/dto/CreateAboutRequest.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/about/dto/CreateAboutRequest.java new file mode 100644 index 0000000..385b340 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/about/dto/CreateAboutRequest.java @@ -0,0 +1,10 @@ +package com.pablotj.portfolio.infrastructure.rest.about.dto; + +import jakarta.validation.constraints.NotBlank; + +public record CreateAboutRequest( + @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/about/mapper/AboutRestMapper.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/about/mapper/AboutRestMapper.java new file mode 100644 index 0000000..af3a004 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/about/mapper/AboutRestMapper.java @@ -0,0 +1,13 @@ +package com.pablotj.portfolio.infrastructure.rest.about.mapper; + +import com.pablotj.portfolio.domain.about.About; +import com.pablotj.portfolio.infrastructure.rest.about.dto.AboutDto; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +@Mapper(componentModel = "spring") +public interface AboutRestMapper { + + @Mapping(target = "id", source = "id.value") + AboutDto toDto(About domain); +} diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/api/ApiRootController.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/api/ApiRootController.java index ef951d4..26fb9ea 100644 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/api/ApiRootController.java +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/api/ApiRootController.java @@ -1,13 +1,12 @@ package com.pablotj.portfolio.infrastructure.rest.api; +import java.util.List; +import java.util.Map; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.List; -import java.util.Map; - @RestController @RequestMapping public class ApiRootController { @@ -20,9 +19,14 @@ public class ApiRootController { "doc", "/v3/api-docs", "swagger", "/swagger-ui", "endpoints", List.of( + Map.of("path", "/v1/homes", "description", "Manage projects"), + Map.of("path", "/v1/certifications", "description", "Manage projects"), Map.of("path", "/v1/projects", "description", "Manage projects"), - Map.of("path", "/v1/experience", "description", "Experience entries"), - Map.of("path", "/v1/about", "description", "About me") + Map.of("path", "/v1/contacts", "description", "Manage projects"), + Map.of("path", "/v1/educations", "description", "Manage projects"), + Map.of("path", "/v1/experiences", "description", "Manage projects"), + Map.of("path", "/v1/projects", "description", "Manage projects"), + Map.of("path", "/v1/skills", "description", "Experience entries") ) ); diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/certification/controller/CertificationController.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/certification/controller/CertificationController.java new file mode 100644 index 0000000..2a35b90 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/certification/controller/CertificationController.java @@ -0,0 +1,57 @@ +package com.pablotj.portfolio.infrastructure.rest.certification.controller; + +import com.pablotj.portfolio.application.certification.CreateCertificationUseCase; +import com.pablotj.portfolio.application.certification.GetCertificationUseCase; +import com.pablotj.portfolio.infrastructure.rest.certification.dto.CertificationDto; +import com.pablotj.portfolio.infrastructure.rest.certification.dto.CreateCertificationRequest; +import com.pablotj.portfolio.infrastructure.rest.certification.mapper.CertificationRestMapper; +import jakarta.validation.Valid; +import java.net.URI; +import java.util.List; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/v1/certifications") +public class CertificationController { + + private final CreateCertificationUseCase createUC; + private final GetCertificationUseCase getUC; + private final CertificationRestMapper mapper; + + public CertificationController(CreateCertificationUseCase createUC, GetCertificationUseCase getUC, CertificationRestMapper mapper) { + this.createUC = createUC; + this.getUC = getUC; + this.mapper = mapper; + } + + @GetMapping + public List all() { + return getUC.all().stream().map(mapper::toDto).toList(); + } + + @GetMapping("/{id}") + public ResponseEntity byId(@PathVariable Long id) { + return getUC.byId(id) + .map(mapper::toDto) + .map(ResponseEntity::ok) + .orElse(ResponseEntity.notFound().build()); + } + + @PostMapping + public ResponseEntity create(@Valid @RequestBody CreateCertificationRequest request) { + var cmd = new CreateCertificationUseCase.Command( + request.title(), + request.description(), + request.url() + ); + var created = createUC.handle(cmd); + var body = mapper.toDto(created); + return ResponseEntity.created(URI.create("/api/certifications/" + body.id())).body(body); + } +} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/certification/dto/CertificationDto.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/certification/dto/CertificationDto.java new file mode 100644 index 0000000..a8258c7 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/certification/dto/CertificationDto.java @@ -0,0 +1,6 @@ +package com.pablotj.portfolio.infrastructure.rest.certification.dto; + +import jakarta.validation.constraints.NotBlank; + +public record CertificationDto(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/certification/dto/CreateCertificationRequest.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/certification/dto/CreateCertificationRequest.java new file mode 100644 index 0000000..536219f --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/certification/dto/CreateCertificationRequest.java @@ -0,0 +1,10 @@ +package com.pablotj.portfolio.infrastructure.rest.certification.dto; + +import jakarta.validation.constraints.NotBlank; + +public record CreateCertificationRequest( + @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/certification/mapper/CertificationRestMapper.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/certification/mapper/CertificationRestMapper.java new file mode 100644 index 0000000..e116f3d --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/certification/mapper/CertificationRestMapper.java @@ -0,0 +1,13 @@ +package com.pablotj.portfolio.infrastructure.rest.certification.mapper; + +import com.pablotj.portfolio.domain.certification.Certification; +import com.pablotj.portfolio.infrastructure.rest.certification.dto.CertificationDto; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +@Mapper(componentModel = "spring") +public interface CertificationRestMapper { + + @Mapping(target = "id", source = "id.value") + CertificationDto toDto(Certification domain); +} diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/contact/controller/ContactController.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/contact/controller/ContactController.java new file mode 100644 index 0000000..d968ca4 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/contact/controller/ContactController.java @@ -0,0 +1,57 @@ +package com.pablotj.portfolio.infrastructure.rest.contact.controller; + +import com.pablotj.portfolio.application.contact.CreateContactUseCase; +import com.pablotj.portfolio.application.contact.GetContactUseCase; +import com.pablotj.portfolio.infrastructure.rest.contact.dto.ContactDto; +import com.pablotj.portfolio.infrastructure.rest.contact.dto.CreateContactRequest; +import com.pablotj.portfolio.infrastructure.rest.contact.mapper.ContactRestMapper; +import jakarta.validation.Valid; +import java.net.URI; +import java.util.List; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/v1/contacts") +public class ContactController { + + private final CreateContactUseCase createUC; + private final GetContactUseCase getUC; + private final ContactRestMapper mapper; + + public ContactController(CreateContactUseCase createUC, GetContactUseCase getUC, ContactRestMapper mapper) { + this.createUC = createUC; + this.getUC = getUC; + this.mapper = mapper; + } + + @GetMapping + public List all() { + return getUC.all().stream().map(mapper::toDto).toList(); + } + + @GetMapping("/{id}") + public ResponseEntity byId(@PathVariable Long id) { + return getUC.byId(id) + .map(mapper::toDto) + .map(ResponseEntity::ok) + .orElse(ResponseEntity.notFound().build()); + } + + @PostMapping + public ResponseEntity create(@Valid @RequestBody CreateContactRequest request) { + var cmd = new CreateContactUseCase.Command( + request.title(), + request.description(), + request.url() + ); + var created = createUC.handle(cmd); + var body = mapper.toDto(created); + return ResponseEntity.created(URI.create("/api/contacts/" + body.id())).body(body); + } +} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/contact/dto/ContactDto.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/contact/dto/ContactDto.java new file mode 100644 index 0000000..89a6a37 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/contact/dto/ContactDto.java @@ -0,0 +1,6 @@ +package com.pablotj.portfolio.infrastructure.rest.contact.dto; + +import jakarta.validation.constraints.NotBlank; + +public record ContactDto(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/contact/dto/CreateContactRequest.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/contact/dto/CreateContactRequest.java new file mode 100644 index 0000000..ea9c5de --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/contact/dto/CreateContactRequest.java @@ -0,0 +1,10 @@ +package com.pablotj.portfolio.infrastructure.rest.contact.dto; + +import jakarta.validation.constraints.NotBlank; + +public record CreateContactRequest( + @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/contact/mapper/ContactRestMapper.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/contact/mapper/ContactRestMapper.java new file mode 100644 index 0000000..aa258ac --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/contact/mapper/ContactRestMapper.java @@ -0,0 +1,13 @@ +package com.pablotj.portfolio.infrastructure.rest.contact.mapper; + +import com.pablotj.portfolio.domain.contact.Contact; +import com.pablotj.portfolio.infrastructure.rest.contact.dto.ContactDto; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +@Mapper(componentModel = "spring") +public interface ContactRestMapper { + + @Mapping(target = "id", source = "id.value") + ContactDto toDto(Contact domain); +} diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/education/controller/EducationController.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/education/controller/EducationController.java new file mode 100644 index 0000000..963b6df --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/education/controller/EducationController.java @@ -0,0 +1,57 @@ +package com.pablotj.portfolio.infrastructure.rest.education.controller; + +import com.pablotj.portfolio.application.education.CreateEducationUseCase; +import com.pablotj.portfolio.application.education.GetEducationUseCase; +import com.pablotj.portfolio.infrastructure.rest.education.dto.CreateEducationRequest; +import com.pablotj.portfolio.infrastructure.rest.education.dto.EducationDto; +import com.pablotj.portfolio.infrastructure.rest.education.mapper.EducationRestMapper; +import jakarta.validation.Valid; +import java.net.URI; +import java.util.List; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/v1/educations") +public class EducationController { + + private final CreateEducationUseCase createUC; + private final GetEducationUseCase getUC; + private final EducationRestMapper mapper; + + public EducationController(CreateEducationUseCase createUC, GetEducationUseCase getUC, EducationRestMapper mapper) { + this.createUC = createUC; + this.getUC = getUC; + this.mapper = mapper; + } + + @GetMapping + public List all() { + return getUC.all().stream().map(mapper::toDto).toList(); + } + + @GetMapping("/{id}") + public ResponseEntity byId(@PathVariable Long id) { + return getUC.byId(id) + .map(mapper::toDto) + .map(ResponseEntity::ok) + .orElse(ResponseEntity.notFound().build()); + } + + @PostMapping + public ResponseEntity create(@Valid @RequestBody CreateEducationRequest request) { + var cmd = new CreateEducationUseCase.Command( + request.title(), + request.description(), + request.url() + ); + var created = createUC.handle(cmd); + var body = mapper.toDto(created); + return ResponseEntity.created(URI.create("/api/educations/" + body.id())).body(body); + } +} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/education/dto/CreateEducationRequest.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/education/dto/CreateEducationRequest.java new file mode 100644 index 0000000..40a4380 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/education/dto/CreateEducationRequest.java @@ -0,0 +1,10 @@ +package com.pablotj.portfolio.infrastructure.rest.education.dto; + +import jakarta.validation.constraints.NotBlank; + +public record CreateEducationRequest( + @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/education/dto/EducationDto.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/education/dto/EducationDto.java new file mode 100644 index 0000000..957d235 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/education/dto/EducationDto.java @@ -0,0 +1,6 @@ +package com.pablotj.portfolio.infrastructure.rest.education.dto; + +import jakarta.validation.constraints.NotBlank; + +public record EducationDto(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/education/mapper/EducationRestMapper.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/education/mapper/EducationRestMapper.java new file mode 100644 index 0000000..2fac7e2 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/education/mapper/EducationRestMapper.java @@ -0,0 +1,13 @@ +package com.pablotj.portfolio.infrastructure.rest.education.mapper; + +import com.pablotj.portfolio.domain.education.Education; +import com.pablotj.portfolio.infrastructure.rest.education.dto.EducationDto; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +@Mapper(componentModel = "spring") +public interface EducationRestMapper { + + @Mapping(target = "id", source = "id.value") + EducationDto toDto(Education domain); +} diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/experience/controller/ExperienceController.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/experience/controller/ExperienceController.java new file mode 100644 index 0000000..88c2a39 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/experience/controller/ExperienceController.java @@ -0,0 +1,57 @@ +package com.pablotj.portfolio.infrastructure.rest.experience.controller; + +import com.pablotj.portfolio.application.experience.CreateExperienceUseCase; +import com.pablotj.portfolio.application.experience.GetExperienceUseCase; +import com.pablotj.portfolio.infrastructure.rest.experience.dto.CreateExperienceRequest; +import com.pablotj.portfolio.infrastructure.rest.experience.dto.ExperienceDto; +import com.pablotj.portfolio.infrastructure.rest.experience.mapper.ExperienceRestMapper; +import jakarta.validation.Valid; +import java.net.URI; +import java.util.List; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/v1/experiences") +public class ExperienceController { + + private final CreateExperienceUseCase createUC; + private final GetExperienceUseCase getUC; + private final ExperienceRestMapper mapper; + + public ExperienceController(CreateExperienceUseCase createUC, GetExperienceUseCase getUC, ExperienceRestMapper mapper) { + this.createUC = createUC; + this.getUC = getUC; + this.mapper = mapper; + } + + @GetMapping + public List all() { + return getUC.all().stream().map(mapper::toDto).toList(); + } + + @GetMapping("/{id}") + public ResponseEntity byId(@PathVariable Long id) { + return getUC.byId(id) + .map(mapper::toDto) + .map(ResponseEntity::ok) + .orElse(ResponseEntity.notFound().build()); + } + + @PostMapping + public ResponseEntity create(@Valid @RequestBody CreateExperienceRequest request) { + var cmd = new CreateExperienceUseCase.Command( + request.title(), + request.description(), + request.url() + ); + var created = createUC.handle(cmd); + var body = mapper.toDto(created); + return ResponseEntity.created(URI.create("/api/experiences/" + body.id())).body(body); + } +} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/experience/dto/CreateExperienceRequest.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/experience/dto/CreateExperienceRequest.java new file mode 100644 index 0000000..28a66dc --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/experience/dto/CreateExperienceRequest.java @@ -0,0 +1,10 @@ +package com.pablotj.portfolio.infrastructure.rest.experience.dto; + +import jakarta.validation.constraints.NotBlank; + +public record CreateExperienceRequest( + @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/experience/dto/ExperienceDto.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/experience/dto/ExperienceDto.java new file mode 100644 index 0000000..dce1ce4 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/experience/dto/ExperienceDto.java @@ -0,0 +1,6 @@ +package com.pablotj.portfolio.infrastructure.rest.experience.dto; + +import jakarta.validation.constraints.NotBlank; + +public record ExperienceDto(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/experience/mapper/ExperienceRestMapper.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/experience/mapper/ExperienceRestMapper.java new file mode 100644 index 0000000..81e3378 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/experience/mapper/ExperienceRestMapper.java @@ -0,0 +1,13 @@ +package com.pablotj.portfolio.infrastructure.rest.experience.mapper; + +import com.pablotj.portfolio.domain.experience.Experience; +import com.pablotj.portfolio.infrastructure.rest.experience.dto.ExperienceDto; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +@Mapper(componentModel = "spring") +public interface ExperienceRestMapper { + + @Mapping(target = "id", source = "id.value") + ExperienceDto toDto(Experience 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/home/controller/HomeController.java new file mode 100644 index 0000000..8cafd3a --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/home/controller/HomeController.java @@ -0,0 +1,57 @@ +package com.pablotj.portfolio.infrastructure.rest.home.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 jakarta.validation.Valid; +import java.net.URI; +import java.util.List; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/v1/homes") +public class HomeController { + + private final CreateHomeUseCase createUC; + private final GetHomeUseCase getUC; + private final HomeRestMapper mapper; + + public HomeController(CreateHomeUseCase createUC, GetHomeUseCase getUC, HomeRestMapper mapper) { + this.createUC = createUC; + this.getUC = getUC; + this.mapper = mapper; + } + + @GetMapping + public List all() { + return getUC.all().stream().map(mapper::toDto).toList(); + } + + @GetMapping("/{id}") + public ResponseEntity byId(@PathVariable Long id) { + return getUC.byId(id) + .map(mapper::toDto) + .map(ResponseEntity::ok) + .orElse(ResponseEntity.notFound().build()); + } + + @PostMapping + public ResponseEntity create(@Valid @RequestBody CreateHomeRequest request) { + var cmd = new CreateHomeUseCase.Command( + request.title(), + request.description(), + request.url() + ); + var created = createUC.handle(cmd); + var body = mapper.toDto(created); + return ResponseEntity.created(URI.create("/api/homes/" + body.id())).body(body); + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..2b052fe --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/home/dto/CreateHomeRequest.java @@ -0,0 +1,10 @@ +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 new file mode 100644 index 0000000..28c3e6b --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/home/dto/HomeDto.java @@ -0,0 +1,6 @@ +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 new file mode 100644 index 0000000..99a244f --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/home/mapper/HomeRestMapper.java @@ -0,0 +1,13 @@ +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/skill/controller/SkillController.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/skill/controller/SkillController.java new file mode 100644 index 0000000..a99ac9b --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/skill/controller/SkillController.java @@ -0,0 +1,57 @@ +package com.pablotj.portfolio.infrastructure.rest.skill.controller; + +import com.pablotj.portfolio.application.skill.CreateSkillUseCase; +import com.pablotj.portfolio.application.skill.GetSkillUseCase; +import com.pablotj.portfolio.infrastructure.rest.skill.dto.CreateSkillRequest; +import com.pablotj.portfolio.infrastructure.rest.skill.dto.SkillDto; +import com.pablotj.portfolio.infrastructure.rest.skill.mapper.SkillRestMapper; +import jakarta.validation.Valid; +import java.net.URI; +import java.util.List; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/v1/skills") +public class SkillController { + + private final CreateSkillUseCase createUC; + private final GetSkillUseCase getUC; + private final SkillRestMapper mapper; + + public SkillController(CreateSkillUseCase createUC, GetSkillUseCase getUC, SkillRestMapper mapper) { + this.createUC = createUC; + this.getUC = getUC; + this.mapper = mapper; + } + + @GetMapping + public List all() { + return getUC.all().stream().map(mapper::toDto).toList(); + } + + @GetMapping("/{id}") + public ResponseEntity byId(@PathVariable Long id) { + return getUC.byId(id) + .map(mapper::toDto) + .map(ResponseEntity::ok) + .orElse(ResponseEntity.notFound().build()); + } + + @PostMapping + public ResponseEntity create(@Valid @RequestBody CreateSkillRequest request) { + var cmd = new CreateSkillUseCase.Command( + request.title(), + request.description(), + request.url() + ); + var created = createUC.handle(cmd); + var body = mapper.toDto(created); + return ResponseEntity.created(URI.create("/api/skills/" + body.id())).body(body); + } +} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/skill/dto/CreateSkillRequest.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/skill/dto/CreateSkillRequest.java new file mode 100644 index 0000000..85b46f6 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/skill/dto/CreateSkillRequest.java @@ -0,0 +1,10 @@ +package com.pablotj.portfolio.infrastructure.rest.skill.dto; + +import jakarta.validation.constraints.NotBlank; + +public record CreateSkillRequest( + @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/skill/dto/SkillDto.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/skill/dto/SkillDto.java new file mode 100644 index 0000000..557214b --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/skill/dto/SkillDto.java @@ -0,0 +1,6 @@ +package com.pablotj.portfolio.infrastructure.rest.skill.dto; + +import jakarta.validation.constraints.NotBlank; + +public record SkillDto(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/skill/mapper/SkillRestMapper.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/skill/mapper/SkillRestMapper.java new file mode 100644 index 0000000..4e495c4 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/skill/mapper/SkillRestMapper.java @@ -0,0 +1,13 @@ +package com.pablotj.portfolio.infrastructure.rest.skill.mapper; + +import com.pablotj.portfolio.domain.skill.Skill; +import com.pablotj.portfolio.infrastructure.rest.skill.dto.SkillDto; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +@Mapper(componentModel = "spring") +public interface SkillRestMapper { + + @Mapping(target = "id", source = "id.value") + SkillDto toDto(Skill domain); +}