diff --git a/.gitignore b/.gitignore index d5a178d..e145a6b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .idea - +*.toml +*.db target \ No newline at end of file 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 deleted file mode 100644 index ca3cb76..0000000 --- a/application/src/main/java/com/pablotj/portfolio/application/about/CreateAboutUseCase.java +++ /dev/null @@ -1,26 +0,0 @@ -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 deleted file mode 100644 index eddaae0..0000000 --- a/application/src/main/java/com/pablotj/portfolio/application/about/GetAboutUseCase.java +++ /dev/null @@ -1,24 +0,0 @@ -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 index ae6f33c..f795685 100644 --- a/application/src/main/java/com/pablotj/portfolio/application/certification/CreateCertificationUseCase.java +++ b/application/src/main/java/com/pablotj/portfolio/application/certification/CreateCertificationUseCase.java @@ -1,26 +1,33 @@ 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; public class CreateCertificationUseCase { - private final CertificationRepositoryPort repository; + CertificationRepositoryPort repository; public CreateCertificationUseCase(CertificationRepositoryPort repository) { this.repository = repository; } - public Certification handle(Command cmd) { + public Certification handle(Long profileId, Command cmd) { var certification = Certification.builder() - .id(null) - .title(cmd.title()) - .description(cmd.description()) - .url(cmd.url()) + .id(new CertificationId(profileId)) + .name(cmd.name()) + .issuer(cmd.issuer()) + .date(cmd.date()) + .credentialId(cmd.credentialId()) .build(); return repository.save(certification); } - public record Command(String title, String description, String url) { + public record Command( + String name, + String issuer, + String date, + String credentialId + ) { } } \ 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 index 1d169ed..3349591 100644 --- a/application/src/main/java/com/pablotj/portfolio/application/certification/GetCertificationUseCase.java +++ b/application/src/main/java/com/pablotj/portfolio/application/certification/GetCertificationUseCase.java @@ -14,11 +14,11 @@ public class GetCertificationUseCase { this.repository = repository; } - public Optional byId(Long id) { - return repository.findById(new CertificationId(id)); + public Optional byId(Long profileId, Long id) { + return repository.findById(new CertificationId(profileId, id)); } - public List all() { - return repository.findAll(); + public List all(Long profileId) { + return repository.findAll(profileId); } } \ 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 deleted file mode 100644 index 291daef..0000000 --- a/application/src/main/java/com/pablotj/portfolio/application/contact/CreateContactUseCase.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.pablotj.portfolio.application.contact; - -import com.pablotj.portfolio.domain.contact.Contact; -import com.pablotj.portfolio.domain.contact.port.ContactRepositoryPort; -import jakarta.validation.constraints.Email; -import jakarta.validation.constraints.NotBlank; - -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) - .country(cmd.country()) - .city(cmd.city()) - .email(cmd.email()) - .phone(cmd.phone()) - .linkedin(cmd.linkedin()) - .github(cmd.github()) - .build(); - return repository.save(contact); - } - - public record Command( - String country, - String city, - String email, - String phone, - String linkedin, - String github - ) { - } -} \ 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 deleted file mode 100644 index 4bccfcd..0000000 --- a/application/src/main/java/com/pablotj/portfolio/application/contact/GetContactUseCase.java +++ /dev/null @@ -1,24 +0,0 @@ -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 index e065df8..b5fc625 100644 --- a/application/src/main/java/com/pablotj/portfolio/application/education/CreateEducationUseCase.java +++ b/application/src/main/java/com/pablotj/portfolio/application/education/CreateEducationUseCase.java @@ -1,6 +1,7 @@ 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; public class CreateEducationUseCase { @@ -11,16 +12,24 @@ public class CreateEducationUseCase { this.repository = repository; } - public Education handle(Command cmd) { + public Education handle(Long profileId, Command cmd) { var education = Education.builder() - .id(null) - .title(cmd.title()) + .id(new EducationId(profileId)) + .institution(cmd.institution()) + .degree(cmd.degree()) + .period(cmd.period()) + .grade(cmd.grade()) .description(cmd.description()) - .url(cmd.url()) .build(); return repository.save(education); } - public record Command(String title, String description, String url) { + public record Command( + String institution, + String degree, + String period, + String grade, + String description + ) { } } \ 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 index 9ab16b1..62bd3b1 100644 --- a/application/src/main/java/com/pablotj/portfolio/application/education/GetEducationUseCase.java +++ b/application/src/main/java/com/pablotj/portfolio/application/education/GetEducationUseCase.java @@ -14,11 +14,11 @@ public class GetEducationUseCase { this.repository = repository; } - public Optional byId(Long id) { - return repository.findById(new EducationId(id)); + public Optional byId(Long profileId, Long id) { + return repository.findById(new EducationId(profileId, id)); } - public List all() { - return repository.findAll(); + public List all(Long profileId) { + return repository.findAll(profileId); } } \ 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 index a50d7ff..058d154 100644 --- a/application/src/main/java/com/pablotj/portfolio/application/experience/CreateExperienceUseCase.java +++ b/application/src/main/java/com/pablotj/portfolio/application/experience/CreateExperienceUseCase.java @@ -2,10 +2,9 @@ package com.pablotj.portfolio.application.experience; import com.pablotj.portfolio.domain.experience.Achievement; import com.pablotj.portfolio.domain.experience.Experience; -import com.pablotj.portfolio.domain.experience.Skill; +import com.pablotj.portfolio.domain.experience.ExperienceId; +import com.pablotj.portfolio.domain.experience.Technology; import com.pablotj.portfolio.domain.experience.port.ExperienceRepositoryPort; -import jakarta.validation.constraints.NotBlank; -import java.time.LocalDate; import java.util.ArrayList; import java.util.List; @@ -17,22 +16,18 @@ public class CreateExperienceUseCase { this.repository = repository; } - public Experience handle(Command cmd) { + public Experience handle(Long profileId, Command cmd) { var experience = Experience.builder() - .id(null) - .position(cmd.position()) + .id(new ExperienceId(profileId)) .company(cmd.company()) - .startDate(cmd.startDate()) - .endDate(cmd.endDate()) - .city(cmd.city()) - .region(cmd.region()) - .country(cmd.country()) - .remote(cmd.remote()) + .position(cmd.position()) + .period(cmd.period()) + .location(cmd.location()) .description(cmd.description()) - .skills(new ArrayList<>()) + .technologies(new ArrayList<>()) .achievements(new ArrayList<>()) .build(); - cmd.skills.forEach(name -> experience.getSkills().add(Skill.builder().id(null).name(name).build())); + cmd.technologies.forEach(name -> experience.getTechnologies().add(Technology.builder().id(null).name(name).build())); cmd.achievements.forEach(description -> experience.getAchievements().add(Achievement.builder().id(null).description(description).build())); return repository.save(experience); } @@ -40,14 +35,10 @@ public class CreateExperienceUseCase { public record Command( String position, String company, - LocalDate startDate, - LocalDate endDate, - String city, - String region, - String country, - Boolean remote, + String period, + String location, String description, - List skills, + List technologies, List achievements ) { } 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 index be84928..ec2c074 100644 --- a/application/src/main/java/com/pablotj/portfolio/application/experience/GetExperienceUseCase.java +++ b/application/src/main/java/com/pablotj/portfolio/application/experience/GetExperienceUseCase.java @@ -14,11 +14,11 @@ public class GetExperienceUseCase { this.repository = repository; } - public Optional byId(Long id) { - return repository.findById(new ExperienceId(id)); + public Optional byId(Long profileId, Long id) { + return repository.findById(new ExperienceId(profileId, id)); } - public List all() { - return repository.findAll(); + public List all(Long profileId) { + return repository.findAll(profileId); } } \ No newline at end of file diff --git a/application/src/main/java/com/pablotj/portfolio/application/profile/CreateProfileUseCase.java b/application/src/main/java/com/pablotj/portfolio/application/profile/CreateProfileUseCase.java new file mode 100644 index 0000000..d5e076a --- /dev/null +++ b/application/src/main/java/com/pablotj/portfolio/application/profile/CreateProfileUseCase.java @@ -0,0 +1,50 @@ +package com.pablotj.portfolio.application.profile; + +import com.pablotj.portfolio.domain.profile.Profile; +import com.pablotj.portfolio.domain.profile.ProfileSocialLink; +import com.pablotj.portfolio.domain.profile.port.ProfileRepositoryPort; +import java.util.List; + +public class CreateProfileUseCase { + + private final ProfileRepositoryPort repository; + + public CreateProfileUseCase(ProfileRepositoryPort repository) { + this.repository = repository; + } + + public Profile handle(Command cmd) { + var personalBuilder = Profile.builder() + .id(null) + .slug(cmd.slug()) + .name(cmd.name()) + .title(cmd.title()) + .subtitle(cmd.subtitle()) + .email(cmd.email()) + .phone(cmd.phone()) + .location(cmd.location()) + .avatar(cmd.avatar()) + .bio(cmd.bio()); + if (cmd.socialLinks != null) { + cmd.socialLinks.forEach(l -> personalBuilder.social(ProfileSocialLink.builder().id(null).platform(l.platform()).url(l.url()).build())); + } + return repository.save(personalBuilder.build()); + } + + public record Command( + String slug, + String name, + String title, + String subtitle, + String email, + String phone, + String location, + String avatar, + String bio, + List socialLinks + ) { + } + + public record Link(String platform, String url) { + } +} \ No newline at end of file diff --git a/application/src/main/java/com/pablotj/portfolio/application/profile/GetProfileUseCase.java b/application/src/main/java/com/pablotj/portfolio/application/profile/GetProfileUseCase.java new file mode 100644 index 0000000..2693ece --- /dev/null +++ b/application/src/main/java/com/pablotj/portfolio/application/profile/GetProfileUseCase.java @@ -0,0 +1,30 @@ +package com.pablotj.portfolio.application.profile; + +import com.pablotj.portfolio.domain.profile.Profile; +import com.pablotj.portfolio.domain.profile.ProfileId; +import com.pablotj.portfolio.domain.profile.port.ProfileRepositoryPort; +import java.util.List; +import java.util.Optional; + +public class GetProfileUseCase { + + private final ProfileRepositoryPort repository; + + public GetProfileUseCase(ProfileRepositoryPort repository) { + this.repository = repository; + } + + public Optional byId(Long id) { + return repository.findById(new ProfileId(id)); + } + + public Optional bySlug(String slug) { + return repository.findBySlug(new ProfileId(slug)); + } + + public List all() { + return repository.findAll(); + } + + +} \ No newline at end of file diff --git a/application/src/main/java/com/pablotj/portfolio/application/project/CreateProjectUseCase.java b/application/src/main/java/com/pablotj/portfolio/application/project/CreateProjectUseCase.java index 7aa1589..2331109 100644 --- a/application/src/main/java/com/pablotj/portfolio/application/project/CreateProjectUseCase.java +++ b/application/src/main/java/com/pablotj/portfolio/application/project/CreateProjectUseCase.java @@ -1,25 +1,44 @@ package com.pablotj.portfolio.application.project; import com.pablotj.portfolio.domain.project.Project; +import com.pablotj.portfolio.domain.project.ProjectFeature; +import com.pablotj.portfolio.domain.project.ProjectId; +import com.pablotj.portfolio.domain.project.ProjectTechnology; import com.pablotj.portfolio.domain.project.port.ProjectRepositoryPort; +import java.util.ArrayList; +import java.util.List; public class CreateProjectUseCase { private final ProjectRepositoryPort repository; - public record Command(String title, String description, String url) {} - public CreateProjectUseCase(ProjectRepositoryPort repository) { this.repository = repository; } - public Project handle(Command cmd) { + public Project handle(Long profileId, Command cmd) { var project = Project.builder() - .id(null) + .id(new ProjectId(profileId)) .title(cmd.title()) .description(cmd.description()) - .url(cmd.url()) + .image(cmd.image()) + .technologies(new ArrayList<>()) + .features(new ArrayList<>()) + .demo(cmd.demo()) + .repository(cmd.repository()) + .build(); + cmd.technologies.forEach(name -> project.getTechnologies().add(ProjectTechnology.builder().id(null).name(name).build())); + cmd.features.forEach(description -> project.getFeatures().add(ProjectFeature.builder().id(null).name(description).build())); return repository.save(project); } + + public record Command(String title, + String description, + String image, + List technologies, + List features, + String demo, + String repository) { + } } \ No newline at end of file diff --git a/application/src/main/java/com/pablotj/portfolio/application/project/GetProjectUseCase.java b/application/src/main/java/com/pablotj/portfolio/application/project/GetProjectUseCase.java index bc60fe2..2390b21 100644 --- a/application/src/main/java/com/pablotj/portfolio/application/project/GetProjectUseCase.java +++ b/application/src/main/java/com/pablotj/portfolio/application/project/GetProjectUseCase.java @@ -15,11 +15,11 @@ public class GetProjectUseCase { this.repository = repository; } - public Optional byId(Long id) { - return repository.findById(new ProjectId(id)); + public Optional byId(Long profileId, Long id) { + return repository.findById(new ProjectId(profileId, id)); } - public List all() { - return repository.findAll(); + public List all(Long profileId) { + return repository.findAll(profileId); } } \ No newline at end of file diff --git a/application/src/main/java/com/pablotj/portfolio/application/resume/CreateResumeUseCase.java b/application/src/main/java/com/pablotj/portfolio/application/resume/CreateResumeUseCase.java deleted file mode 100644 index c4e7bd4..0000000 --- a/application/src/main/java/com/pablotj/portfolio/application/resume/CreateResumeUseCase.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.pablotj.portfolio.application.resume; - -import com.pablotj.portfolio.domain.resume.Resume; -import com.pablotj.portfolio.domain.resume.port.ResumeRepositoryPort; -import jakarta.validation.constraints.NotBlank; - -public class CreateResumeUseCase { - - private final ResumeRepositoryPort repository; - - public CreateResumeUseCase(ResumeRepositoryPort repository) { - this.repository = repository; - } - - public Resume handle(Command cmd) { - var home = Resume.builder() - .id(null) - .name(cmd.title()) - .surnames(cmd.surnames()) - .title(cmd.title()) - .summary(cmd.summary()) - .icon(cmd.icon()) - .build(); - return repository.save(home); - } - - public record Command( - String name, - String surnames, - String title, - String summary, - String icon - ) { - } -} \ No newline at end of file diff --git a/application/src/main/java/com/pablotj/portfolio/application/resume/GetResumeUseCase.java b/application/src/main/java/com/pablotj/portfolio/application/resume/GetResumeUseCase.java deleted file mode 100644 index 50d6669..0000000 --- a/application/src/main/java/com/pablotj/portfolio/application/resume/GetResumeUseCase.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.pablotj.portfolio.application.resume; - -import com.pablotj.portfolio.domain.resume.Resume; -import com.pablotj.portfolio.domain.resume.ResumeId; -import com.pablotj.portfolio.domain.resume.port.ResumeRepositoryPort; -import java.util.List; -import java.util.Optional; - -public class GetResumeUseCase { - - private final ResumeRepositoryPort repository; - - public GetResumeUseCase(ResumeRepositoryPort repository) { - this.repository = repository; - } - - public Optional byId(Long id) { - return repository.findById(new ResumeId(id)); - } - - public List all() { - return repository.findAll(); - } -} \ No newline at end of file diff --git a/application/src/main/java/com/pablotj/portfolio/application/skill/CreateSkillUseCase.java b/application/src/main/java/com/pablotj/portfolio/application/skill/CreateSkillUseCase.java index bcc29f4..ffec8b8 100644 --- a/application/src/main/java/com/pablotj/portfolio/application/skill/CreateSkillUseCase.java +++ b/application/src/main/java/com/pablotj/portfolio/application/skill/CreateSkillUseCase.java @@ -1,7 +1,11 @@ package com.pablotj.portfolio.application.skill; import com.pablotj.portfolio.domain.skill.Skill; +import com.pablotj.portfolio.domain.skill.SkillGroup; +import com.pablotj.portfolio.domain.skill.SkillGroupId; import com.pablotj.portfolio.domain.skill.port.SkillRepositoryPort; +import java.util.ArrayList; +import java.util.List; public class CreateSkillUseCase { @@ -11,16 +15,29 @@ public class CreateSkillUseCase { this.repository = repository; } - public Skill handle(Command cmd) { - var skill = Skill.builder() - .id(null) - .title(cmd.title()) - .description(cmd.description()) - .url(cmd.url()) + public SkillGroup handle(Long profileId, CommandGroup cmd) { + var skillGroup = SkillGroup.builder() + .id(new SkillGroupId(profileId)) + .name(cmd.name()) + .icon(cmd.icon()) + .skills(new ArrayList<>()) .build(); - return repository.save(skill); + cmd.skills.forEach(s -> skillGroup.getSkills().add( + Skill.builder().id(null).name(s.name).level(s.level).years(s.years).build())); + return repository.save(skillGroup); } - public record Command(String title, String description, String url) { + public record CommandGroup( + String name, + String icon, + List skills + ) { + } + + public record CommandSkill( + String name, + Integer level, + Integer years + ) { } } \ 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 index a48415e..174447d 100644 --- a/application/src/main/java/com/pablotj/portfolio/application/skill/GetSkillUseCase.java +++ b/application/src/main/java/com/pablotj/portfolio/application/skill/GetSkillUseCase.java @@ -1,7 +1,7 @@ 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.SkillGroup; +import com.pablotj.portfolio.domain.skill.SkillGroupId; import com.pablotj.portfolio.domain.skill.port.SkillRepositoryPort; import java.util.List; import java.util.Optional; @@ -14,11 +14,11 @@ public class GetSkillUseCase { this.repository = repository; } - public Optional byId(Long id) { - return repository.findById(new SkillId(id)); + public Optional byId(Long profileId, Long id) { + return repository.findById(new SkillGroupId(profileId, id)); } - public List all() { - return repository.findAll(); + public List all(Long profileId) { + return repository.findAll(profileId); } } \ No newline at end of file diff --git a/bootstrap/pom.xml b/bootstrap/pom.xml index ecaf96c..44dcb76 100644 --- a/bootstrap/pom.xml +++ b/bootstrap/pom.xml @@ -51,4 +51,20 @@ test + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + \ No newline at end of file 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 deleted file mode 100644 index 4e85de0..0000000 --- a/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/about/AboutApplicationConfig.java +++ /dev/null @@ -1,21 +0,0 @@ -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/contact/ContactApplicationConfig.java b/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/contact/ContactApplicationConfig.java deleted file mode 100644 index 26f6c83..0000000 --- a/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/contact/ContactApplicationConfig.java +++ /dev/null @@ -1,21 +0,0 @@ -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/profile/ProfileApplicationConfig.java b/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/profile/ProfileApplicationConfig.java new file mode 100644 index 0000000..6aaaeb6 --- /dev/null +++ b/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/profile/ProfileApplicationConfig.java @@ -0,0 +1,21 @@ +package com.pablotj.portfolio.bootstrap.profile; + +import com.pablotj.portfolio.application.profile.CreateProfileUseCase; +import com.pablotj.portfolio.application.profile.GetProfileUseCase; +import com.pablotj.portfolio.domain.profile.port.ProfileRepositoryPort; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class ProfileApplicationConfig { + + @Bean + public GetProfileUseCase getHomeUseCase(ProfileRepositoryPort repo) { + return new GetProfileUseCase(repo); + } + + @Bean + public CreateProfileUseCase createHomeUseCase(ProfileRepositoryPort repo) { + return new CreateProfileUseCase(repo); + } +} \ No newline at end of file diff --git a/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/resume/ResumeApplicationConfig.java b/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/resume/ResumeApplicationConfig.java deleted file mode 100644 index 4e05f9a..0000000 --- a/bootstrap/src/main/java/com/pablotj/portfolio/bootstrap/resume/ResumeApplicationConfig.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.pablotj.portfolio.bootstrap.resume; - -import com.pablotj.portfolio.application.resume.CreateResumeUseCase; -import com.pablotj.portfolio.application.resume.GetResumeUseCase; -import com.pablotj.portfolio.domain.resume.port.ResumeRepositoryPort; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class ResumeApplicationConfig { - - @Bean - public GetResumeUseCase getHomeUseCase(ResumeRepositoryPort repo) { - return new GetResumeUseCase(repo); - } - - @Bean - public CreateResumeUseCase createHomeUseCase(ResumeRepositoryPort repo) { - return new CreateResumeUseCase(repo); - } -} \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/about/About.java b/domain/src/main/java/com/pablotj/portfolio/domain/about/About.java deleted file mode 100644 index 34e1b8b..0000000 --- a/domain/src/main/java/com/pablotj/portfolio/domain/about/About.java +++ /dev/null @@ -1,13 +0,0 @@ -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 deleted file mode 100644 index 5b8a255..0000000 --- a/domain/src/main/java/com/pablotj/portfolio/domain/about/AboutId.java +++ /dev/null @@ -1,7 +0,0 @@ -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 deleted file mode 100644 index cc8d0d7..0000000 --- a/domain/src/main/java/com/pablotj/portfolio/domain/about/port/AboutRepositoryPort.java +++ /dev/null @@ -1,15 +0,0 @@ -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 index 8dd81f1..24238c3 100644 --- a/domain/src/main/java/com/pablotj/portfolio/domain/certification/Certification.java +++ b/domain/src/main/java/com/pablotj/portfolio/domain/certification/Certification.java @@ -7,7 +7,8 @@ import lombok.Getter; @Builder public class Certification { private final CertificationId id; - private final String title; - private final String description; - private final String url; + private final String name; + private final String issuer; + private final String date; + private final String credentialId; } \ 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 index 0c0acd5..eeeece6 100644 --- a/domain/src/main/java/com/pablotj/portfolio/domain/certification/CertificationId.java +++ b/domain/src/main/java/com/pablotj/portfolio/domain/certification/CertificationId.java @@ -1,7 +1,12 @@ package com.pablotj.portfolio.domain.certification; -public record CertificationId(Long value) { +public record CertificationId(Long profileId, Long certificationId) { + + public CertificationId(Long profileId) { + this(profileId, null); + } + public CertificationId { - if (value != null && value < 0) throw new IllegalArgumentException("CertificationId must be positive"); + if (certificationId != null && certificationId < 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 index b448d27..d98cfc9 100644 --- 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 @@ -10,5 +10,5 @@ public interface CertificationRepositoryPort { Optional findById(CertificationId id); - List findAll(); + List findAll(Long profileId); } \ 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 deleted file mode 100644 index 40405c8..0000000 --- a/domain/src/main/java/com/pablotj/portfolio/domain/contact/Contact.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.pablotj.portfolio.domain.contact; - -import jakarta.validation.constraints.Email; -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class Contact { - - private final ContactId id; - private final String country; - private final String city; - private final String email; - private final String phone; - private final String linkedin; - private final String github; - -} \ 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 deleted file mode 100644 index 83794e8..0000000 --- a/domain/src/main/java/com/pablotj/portfolio/domain/contact/ContactId.java +++ /dev/null @@ -1,7 +0,0 @@ -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 deleted file mode 100644 index 4614910..0000000 --- a/domain/src/main/java/com/pablotj/portfolio/domain/contact/port/ContactRepositoryPort.java +++ /dev/null @@ -1,14 +0,0 @@ -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 index 64a5d61..0efc980 100644 --- a/domain/src/main/java/com/pablotj/portfolio/domain/education/Education.java +++ b/domain/src/main/java/com/pablotj/portfolio/domain/education/Education.java @@ -7,7 +7,9 @@ import lombok.Getter; @Builder public class Education { private final EducationId id; - private final String title; + private final String institution; + private final String degree; + private final String period; + private final String grade; 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 index fb3375f..ae1f264 100644 --- a/domain/src/main/java/com/pablotj/portfolio/domain/education/EducationId.java +++ b/domain/src/main/java/com/pablotj/portfolio/domain/education/EducationId.java @@ -1,7 +1,11 @@ package com.pablotj.portfolio.domain.education; -public record EducationId(Long value) { +public record EducationId(Long profileId, Long educationId) { + public EducationId(Long profileId) { + this(profileId, null); + } + public EducationId { - if (value != null && value < 0) throw new IllegalArgumentException("EducationId must be positive"); + if (educationId != null && educationId < 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 index de80f56..d095373 100644 --- 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 @@ -10,5 +10,5 @@ public interface EducationRepositoryPort { Optional findById(EducationId id); - List findAll(); + List findAll(Long profileId); } \ 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 index 86a7fb4..4a2b92d 100644 --- a/domain/src/main/java/com/pablotj/portfolio/domain/experience/Experience.java +++ b/domain/src/main/java/com/pablotj/portfolio/domain/experience/Experience.java @@ -1,6 +1,5 @@ package com.pablotj.portfolio.domain.experience; -import java.time.LocalDate; import java.util.List; import lombok.Builder; import lombok.Getter; @@ -9,15 +8,11 @@ import lombok.Getter; @Builder public class Experience { private final ExperienceId id; - private final String position; private final String company; - private final LocalDate startDate; - private final LocalDate endDate; - private final String city; - private final String region; - private final String country; - private final Boolean remote; + private final String position; + private final String period; + private final String location; private final String description; - private final List skills; + private final List technologies; private final List achievements; } \ 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 index c9713af..455c3ae 100644 --- a/domain/src/main/java/com/pablotj/portfolio/domain/experience/ExperienceId.java +++ b/domain/src/main/java/com/pablotj/portfolio/domain/experience/ExperienceId.java @@ -1,7 +1,12 @@ package com.pablotj.portfolio.domain.experience; -public record ExperienceId(Long value) { +public record ExperienceId(Long profileId, Long experienceId) { + + public ExperienceId(Long profileId) { + this(profileId, null); + } + public ExperienceId { - if (value != null && value < 0) throw new IllegalArgumentException("ExperienceId must be positive"); + if (experienceId != null && experienceId < 0) throw new IllegalArgumentException("ProfileSocialLinkId must be positive"); } } \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/experience/Skill.java b/domain/src/main/java/com/pablotj/portfolio/domain/experience/Technology.java similarity index 63% rename from domain/src/main/java/com/pablotj/portfolio/domain/experience/Skill.java rename to domain/src/main/java/com/pablotj/portfolio/domain/experience/Technology.java index 69e68f9..30eeacc 100644 --- a/domain/src/main/java/com/pablotj/portfolio/domain/experience/Skill.java +++ b/domain/src/main/java/com/pablotj/portfolio/domain/experience/Technology.java @@ -1,12 +1,11 @@ package com.pablotj.portfolio.domain.experience; -import java.time.LocalDate; import lombok.Builder; import lombok.Getter; @Getter @Builder -public class Skill { - private final SkillId id; +public class Technology { + private final TechnologyId id; private String name; } \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/experience/SkillId.java b/domain/src/main/java/com/pablotj/portfolio/domain/experience/TechnologyId.java similarity index 51% rename from domain/src/main/java/com/pablotj/portfolio/domain/experience/SkillId.java rename to domain/src/main/java/com/pablotj/portfolio/domain/experience/TechnologyId.java index e13d505..f1d889b 100644 --- a/domain/src/main/java/com/pablotj/portfolio/domain/experience/SkillId.java +++ b/domain/src/main/java/com/pablotj/portfolio/domain/experience/TechnologyId.java @@ -1,7 +1,7 @@ package com.pablotj.portfolio.domain.experience; -public record SkillId(Long value) { - public SkillId { - if (value != null && value < 0) throw new IllegalArgumentException("SkillId must be positive"); +public record TechnologyId(Long value) { + public TechnologyId { + if (value != null && value < 0) throw new IllegalArgumentException("TechnologyId 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 index db2bd4a..0678448 100644 --- 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 @@ -10,5 +10,6 @@ public interface ExperienceRepositoryPort { Optional findById(ExperienceId id); - List findAll(); + List findAll(Long profileId); + } \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/profile/Profile.java b/domain/src/main/java/com/pablotj/portfolio/domain/profile/Profile.java new file mode 100644 index 0000000..c0b15eb --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/profile/Profile.java @@ -0,0 +1,23 @@ +package com.pablotj.portfolio.domain.profile; + +import java.util.List; +import lombok.Builder; +import lombok.Getter; +import lombok.Singular; + +@Getter +@Builder +public class Profile { + private final ProfileId id; + private final String slug; + private final String name; + private final String title; + private final String subtitle; + private final String email; + private final String phone; + private final String location; + private final String avatar; + private final String bio; + @Singular("social") + private final List social; +} \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/profile/ProfileId.java b/domain/src/main/java/com/pablotj/portfolio/domain/profile/ProfileId.java new file mode 100644 index 0000000..39bb5a2 --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/profile/ProfileId.java @@ -0,0 +1,16 @@ +package com.pablotj.portfolio.domain.profile; + +public record ProfileId(Long id, String slug) { + + public ProfileId(Long id) { + this(id, null); + } + + public ProfileId(String slug) { + this(null, slug); + } + + public ProfileId { + if (id != null && id < 0) throw new IllegalArgumentException("ProfileId must be positive"); + } +} \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/profile/ProfileSocialLink.java b/domain/src/main/java/com/pablotj/portfolio/domain/profile/ProfileSocialLink.java new file mode 100644 index 0000000..0e2c8f6 --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/profile/ProfileSocialLink.java @@ -0,0 +1,12 @@ +package com.pablotj.portfolio.domain.profile; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class ProfileSocialLink { + private final ProfileSocialLinkId id; + private final String url; + private final String platform; +} \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/profile/ProfileSocialLinkId.java b/domain/src/main/java/com/pablotj/portfolio/domain/profile/ProfileSocialLinkId.java new file mode 100644 index 0000000..b6355c4 --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/profile/ProfileSocialLinkId.java @@ -0,0 +1,7 @@ +package com.pablotj.portfolio.domain.profile; + +public record ProfileSocialLinkId(Long value) { + public ProfileSocialLinkId { + if (value != null && value < 0) throw new IllegalArgumentException("ProfileSocialLinkId must be positive"); + } +} \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/profile/port/ProfileRepositoryPort.java b/domain/src/main/java/com/pablotj/portfolio/domain/profile/port/ProfileRepositoryPort.java new file mode 100644 index 0000000..01d664b --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/profile/port/ProfileRepositoryPort.java @@ -0,0 +1,16 @@ +package com.pablotj.portfolio.domain.profile.port; + +import com.pablotj.portfolio.domain.profile.Profile; +import com.pablotj.portfolio.domain.profile.ProfileId; +import java.util.List; +import java.util.Optional; + +public interface ProfileRepositoryPort { + Profile save(Profile p); + + Optional findBySlug(ProfileId id); + + Optional findById(ProfileId id); + + List findAll(); +} \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/project/Project.java b/domain/src/main/java/com/pablotj/portfolio/domain/project/Project.java index 73a21a2..2cdd805 100644 --- a/domain/src/main/java/com/pablotj/portfolio/domain/project/Project.java +++ b/domain/src/main/java/com/pablotj/portfolio/domain/project/Project.java @@ -1,5 +1,6 @@ package com.pablotj.portfolio.domain.project; +import java.util.List; import lombok.Builder; import lombok.Getter; @@ -9,5 +10,9 @@ public class Project { private final ProjectId id; private final String title; private final String description; - private final String url; + private final String image; + private final List technologies; + private final List features; + private final String demo; + private final String repository; } \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/project/ProjectFeature.java b/domain/src/main/java/com/pablotj/portfolio/domain/project/ProjectFeature.java new file mode 100644 index 0000000..a3b94ba --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/project/ProjectFeature.java @@ -0,0 +1,11 @@ +package com.pablotj.portfolio.domain.project; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class ProjectFeature { + private final ProjectFeatureId id; + private final String name; +} \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/project/ProjectFeatureId.java b/domain/src/main/java/com/pablotj/portfolio/domain/project/ProjectFeatureId.java new file mode 100644 index 0000000..2c7eaa9 --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/project/ProjectFeatureId.java @@ -0,0 +1,7 @@ +package com.pablotj.portfolio.domain.project; + +public record ProjectFeatureId(Long value) { + public ProjectFeatureId { + if (value != null && value < 0) throw new IllegalArgumentException("ProjectFeatureId must be positive"); + } +} \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/project/ProjectId.java b/domain/src/main/java/com/pablotj/portfolio/domain/project/ProjectId.java index 58e791f..c1b8091 100644 --- a/domain/src/main/java/com/pablotj/portfolio/domain/project/ProjectId.java +++ b/domain/src/main/java/com/pablotj/portfolio/domain/project/ProjectId.java @@ -1,7 +1,12 @@ package com.pablotj.portfolio.domain.project; -public record ProjectId(Long value) { +public record ProjectId(Long profileId, Long projectId) { + + public ProjectId(Long profileId) { + this(profileId, null); + } + public ProjectId { - if (value != null && value < 0) throw new IllegalArgumentException("ProjectId must be positive"); + if (projectId != null && projectId < 0) throw new IllegalArgumentException("ProjectId must be positive"); } } \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/project/ProjectTechnology.java b/domain/src/main/java/com/pablotj/portfolio/domain/project/ProjectTechnology.java new file mode 100644 index 0000000..bbe01c3 --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/project/ProjectTechnology.java @@ -0,0 +1,11 @@ +package com.pablotj.portfolio.domain.project; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class ProjectTechnology { + private final ProjectTechnologyId id; + private final String name; +} \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/project/ProjectTechnologyId.java b/domain/src/main/java/com/pablotj/portfolio/domain/project/ProjectTechnologyId.java new file mode 100644 index 0000000..48a7c60 --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/project/ProjectTechnologyId.java @@ -0,0 +1,7 @@ +package com.pablotj.portfolio.domain.project; + +public record ProjectTechnologyId(Long value) { + public ProjectTechnologyId { + if (value != null && value < 0) throw new IllegalArgumentException("ProjectTechnologyId must be positive"); + } +} \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/project/port/ProjectRepositoryPort.java b/domain/src/main/java/com/pablotj/portfolio/domain/project/port/ProjectRepositoryPort.java index 50cb21c..ed25062 100644 --- a/domain/src/main/java/com/pablotj/portfolio/domain/project/port/ProjectRepositoryPort.java +++ b/domain/src/main/java/com/pablotj/portfolio/domain/project/port/ProjectRepositoryPort.java @@ -9,5 +9,5 @@ import java.util.Optional; public interface ProjectRepositoryPort { Project save(Project p); Optional findById(ProjectId id); - List findAll(); + List findAll(Long profileId); } \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/resume/Resume.java b/domain/src/main/java/com/pablotj/portfolio/domain/resume/Resume.java deleted file mode 100644 index ade80a8..0000000 --- a/domain/src/main/java/com/pablotj/portfolio/domain/resume/Resume.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.pablotj.portfolio.domain.resume; - -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class Resume { - private final ResumeId id; - private final String name; - private final String surnames; - private final String title; - private final String summary; - private final String icon; -} \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/resume/ResumeId.java b/domain/src/main/java/com/pablotj/portfolio/domain/resume/ResumeId.java deleted file mode 100644 index 2fed6fc..0000000 --- a/domain/src/main/java/com/pablotj/portfolio/domain/resume/ResumeId.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.pablotj.portfolio.domain.resume; - -public record ResumeId(Long value) { - public ResumeId { - if (value != null && value < 0) throw new IllegalArgumentException("ResumeId must be positive"); - } -} \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/resume/port/ResumeRepositoryPort.java b/domain/src/main/java/com/pablotj/portfolio/domain/resume/port/ResumeRepositoryPort.java deleted file mode 100644 index 1d2da6e..0000000 --- a/domain/src/main/java/com/pablotj/portfolio/domain/resume/port/ResumeRepositoryPort.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.pablotj.portfolio.domain.resume.port; - -import com.pablotj.portfolio.domain.resume.Resume; -import com.pablotj.portfolio.domain.resume.ResumeId; -import java.util.List; -import java.util.Optional; - -public interface ResumeRepositoryPort { - Resume save(Resume p); - - Optional findById(ResumeId id); - - List findAll(); -} \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/skill/Skill.java b/domain/src/main/java/com/pablotj/portfolio/domain/skill/Skill.java index 2930cd2..656dd39 100644 --- a/domain/src/main/java/com/pablotj/portfolio/domain/skill/Skill.java +++ b/domain/src/main/java/com/pablotj/portfolio/domain/skill/Skill.java @@ -7,7 +7,7 @@ import lombok.Getter; @Builder public class Skill { private final SkillId id; - private final String title; - private final String description; - private final String url; + private final String name; + private final Integer level; + private final Integer years; } \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/skill/SkillGroup.java b/domain/src/main/java/com/pablotj/portfolio/domain/skill/SkillGroup.java new file mode 100644 index 0000000..b00746f --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/skill/SkillGroup.java @@ -0,0 +1,14 @@ +package com.pablotj.portfolio.domain.skill; + +import java.util.List; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class SkillGroup { + private final SkillGroupId id; + private final String name; + private final String icon; + private final List skills; +} \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/portfolio/domain/skill/SkillGroupId.java b/domain/src/main/java/com/pablotj/portfolio/domain/skill/SkillGroupId.java new file mode 100644 index 0000000..9f9ec52 --- /dev/null +++ b/domain/src/main/java/com/pablotj/portfolio/domain/skill/SkillGroupId.java @@ -0,0 +1,12 @@ +package com.pablotj.portfolio.domain.skill; + +public record SkillGroupId(Long profileId, Long skillGroupId) { + + public SkillGroupId(Long profileId) { + this(profileId, null); + } + + public SkillGroupId { + if (skillGroupId != null && skillGroupId < 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 index 47fd59f..4be1cd1 100644 --- 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 @@ -1,14 +1,14 @@ package com.pablotj.portfolio.domain.skill.port; -import com.pablotj.portfolio.domain.skill.Skill; -import com.pablotj.portfolio.domain.skill.SkillId; +import com.pablotj.portfolio.domain.skill.SkillGroup; +import com.pablotj.portfolio.domain.skill.SkillGroupId; import java.util.List; import java.util.Optional; public interface SkillRepositoryPort { - Skill save(Skill p); + SkillGroup save(SkillGroup p); - Optional findById(SkillId id); + Optional findById(SkillGroupId id); - List findAll(); + List findAll(Long profileId); } \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/config/CorsConfig.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/config/CorsConfig.java new file mode 100644 index 0000000..f5a5fe8 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/config/CorsConfig.java @@ -0,0 +1,17 @@ +package com.pablotj.portfolio.infrastructure.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class CorsConfig implements WebMvcConfigurer { + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") // todos los endpoints que comiencen con /api/ + .allowedOrigins("http://127.0.0.1:3000", "http://localhost:3000", "https://pablotj.com") + .allowedMethods("GET", "POST", "PUT", "DELETE") + .allowedHeaders("*"); + } +} 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 deleted file mode 100644 index 86b5bd5..0000000 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/about/adapter/AboutRepositoryAdapter.java +++ /dev/null @@ -1,40 +0,0 @@ -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/mapper/AboutJpaMapper.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/about/mapper/AboutJpaMapper.java deleted file mode 100644 index 7c2e990..0000000 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/about/mapper/AboutJpaMapper.java +++ /dev/null @@ -1,17 +0,0 @@ -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); - - @Mapping(target = "id.value", source = "id") - About toDomain(AboutJpaEntity e); -} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/about/repo/SpringDataAboutRepository.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/about/repo/SpringDataAboutRepository.java deleted file mode 100644 index 611dd8f..0000000 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/about/repo/SpringDataAboutRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -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 index 1e13722..4d00617 100644 --- 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 @@ -30,11 +30,11 @@ public class CertificationRepositoryAdapter implements CertificationRepositoryPo @Override public Optional findById(CertificationId id) { - return repo.findById(id.value()).map(mapper::toDomain); + return repo.findByProfileIdAndId(id.profileId(), id.certificationId()).map(mapper::toDomain); } @Override - public List findAll() { - return repo.findAll().stream().map(mapper::toDomain).toList(); + public List findAll(Long profileId) { + return repo.findAllByProfileId(profileId).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 index ab5ad0e..6dc6fc0 100644 --- 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 @@ -1,16 +1,20 @@ package com.pablotj.portfolio.infrastructure.persistence.certification.entity; +import com.pablotj.portfolio.infrastructure.persistence.profile.entity.ProfileJpaEntity; import jakarta.persistence.Column; import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import lombok.Getter; import lombok.Setter; @Entity -@Table(name = "certifications") +@Table(name = "CERTIFICATION") @Getter @Setter public class CertificationJpaEntity { @@ -19,11 +23,19 @@ public class CertificationJpaEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @Column(nullable = false) - private String title; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "profile_id", nullable = false) + private ProfileJpaEntity profile; - @Column(columnDefinition = "text") - private String description; + @Column + private String name; - private String url; + @Column + private String issuer; + + @Column + private String date; + + @Column + private String credentialId; } \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/certification/mapper/CertificationJpaMapper.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/certification/mapper/CertificationJpaMapper.java index 0545e4d..59171af 100644 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/certification/mapper/CertificationJpaMapper.java +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/certification/mapper/CertificationJpaMapper.java @@ -10,8 +10,9 @@ import org.mapstruct.Mapping; public interface CertificationJpaMapper { @Mapping(target = "id", ignore = true) + @Mapping(target = "profile.id", source = "id.profileId") CertificationJpaEntity toEntity(Certification domain); - @Mapping(target = "id.value", source = "id") + @Mapping(target = "id", expression = "java(new CertificationId(e.getProfile().getId(), e.getId()))") Certification toDomain(CertificationJpaEntity e); } \ 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 index 8dc8cfd..756d43f 100644 --- 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 @@ -1,7 +1,14 @@ package com.pablotj.portfolio.infrastructure.persistence.certification.repo; import com.pablotj.portfolio.infrastructure.persistence.certification.entity.CertificationJpaEntity; +import java.util.List; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; public interface SpringDataCertificationRepository extends JpaRepository { + + Optional findByProfileIdAndId(Long profileId, Long id); + + List findAllByProfileId(Long profileId); + } 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 deleted file mode 100644 index 167b2a9..0000000 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/contact/adapter/ContactRepositoryAdapter.java +++ /dev/null @@ -1,40 +0,0 @@ -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 deleted file mode 100644 index 9324fec..0000000 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/contact/entity/ContactJpaEntity.java +++ /dev/null @@ -1,43 +0,0 @@ -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 jakarta.validation.constraints.Email; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Entity -@Table(name = "contacts") -@Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor(access = AccessLevel.PRIVATE) -@Builder -public class ContactJpaEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - private String country; - private String city; - - @Column(nullable = false) - @Email - private String email; - - private String phone; - - @Column(name = "linkedin_url") - private String linkedin; - - @Column(name = "github_url") - private String github; -} \ 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 deleted file mode 100644 index 348b7c4..0000000 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/contact/mapper/ContactJpaMapper.java +++ /dev/null @@ -1,17 +0,0 @@ -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); - - @Mapping(target = "id.value", source = "id") - Contact toDomain(ContactJpaEntity e); -} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/contact/repo/SpringDataContactRepository.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/contact/repo/SpringDataContactRepository.java deleted file mode 100644 index 75c67b9..0000000 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/contact/repo/SpringDataContactRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -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 index 09dc967..77b9bea 100644 --- 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 @@ -30,11 +30,11 @@ public class EducationRepositoryAdapter implements EducationRepositoryPort { @Override public Optional findById(EducationId id) { - return repo.findById(id.value()).map(mapper::toDomain); + return repo.findByProfileIdAndId(id.profileId(), id.educationId()).map(mapper::toDomain); } @Override - public List findAll() { - return repo.findAll().stream().map(mapper::toDomain).toList(); + public List findAll(Long profileId) { + return repo.findAllByProfileId(profileId).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 index cab9530..754de90 100644 --- 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 @@ -1,16 +1,20 @@ package com.pablotj.portfolio.infrastructure.persistence.education.entity; +import com.pablotj.portfolio.infrastructure.persistence.profile.entity.ProfileJpaEntity; import jakarta.persistence.Column; import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import lombok.Getter; import lombok.Setter; @Entity -@Table(name = "educations") +@Table(name = "EDUCATION") @Getter @Setter public class EducationJpaEntity { @@ -19,11 +23,22 @@ public class EducationJpaEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @Column(nullable = false) - private String title; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "profile_id", nullable = false) + private ProfileJpaEntity profile; + + @Column + private String institution; + + @Column + private String degree; + + @Column + private String period; + + @Column + private String grade; @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 index 86f0bf4..be6e424 100644 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/education/mapper/EducationJpaMapper.java +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/education/mapper/EducationJpaMapper.java @@ -10,8 +10,9 @@ import org.mapstruct.Mapping; public interface EducationJpaMapper { @Mapping(target = "id", ignore = true) + @Mapping(target = "profile.id", source = "id.profileId") EducationJpaEntity toEntity(Education domain); - @Mapping(target = "id.value", source = "id") + @Mapping(target = "id", expression = "java(new EducationId(e.getProfile().getId(), e.getId()))") Education toDomain(EducationJpaEntity e); } \ 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 index 348303c..f990076 100644 --- 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 @@ -1,7 +1,13 @@ package com.pablotj.portfolio.infrastructure.persistence.education.repo; +import com.pablotj.portfolio.infrastructure.persistence.certification.entity.CertificationJpaEntity; import com.pablotj.portfolio.infrastructure.persistence.education.entity.EducationJpaEntity; +import java.util.List; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; public interface SpringDataEducationRepository extends JpaRepository { + Optional findByProfileIdAndId(Long profileId, Long id); + + List findAllByProfileId(Long profileId); } 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 index e6db141..9ff7444 100644 --- 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 @@ -30,11 +30,11 @@ public class ExperienceRepositoryAdapter implements ExperienceRepositoryPort { @Override public Optional findById(ExperienceId id) { - return repo.findById(id.value()).map(mapper::toDomain); + return repo.findByProfileIdAndId(id.profileId(), id.experienceId()).map(mapper::toDomain); } @Override - public List findAll() { - return repo.findAll().stream().map(mapper::toDomain).toList(); + public List findAll(Long profileId) { + return repo.findAllByProfileId(profileId).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/ExperienceAchievementJpaEntity.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/experience/entity/ExperienceAchievementJpaEntity.java index 8442f90..521111e 100644 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/experience/entity/ExperienceAchievementJpaEntity.java +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/experience/entity/ExperienceAchievementJpaEntity.java @@ -1,10 +1,20 @@ package com.pablotj.portfolio.infrastructure.persistence.experience.entity; -import jakarta.persistence.*; -import lombok.*; +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.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; @Entity -@Table(name = "experience_achievements") +@Table(name = "EXPERIENCE_ACHIEVEMENT") @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) 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 index 3a7fcf2..06ee091 100644 --- 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 @@ -1,15 +1,17 @@ package com.pablotj.portfolio.infrastructure.persistence.experience.entity; +import com.pablotj.portfolio.infrastructure.persistence.profile.entity.ProfileJpaEntity; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; import jakarta.persistence.OneToMany; import jakarta.persistence.Table; -import java.time.LocalDate; import java.util.List; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -19,7 +21,7 @@ import lombok.NoArgsConstructor; import lombok.Setter; @Entity -@Table(name = "experiences") +@Table(name = "EXPERIENCE") @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) @@ -31,25 +33,30 @@ public class ExperienceJpaEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "profile_id", nullable = false) + private ProfileJpaEntity profile; + + @Column private String position; + + @Column private String company; - private LocalDate startDate; - private LocalDate endDate; + @Column + private String period; - private String city; - private String region; - private String country; - private Boolean remote; + @Column + private String location; @Column(columnDefinition = "text") private String description; @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) - @JoinColumn(name = "experience_id") - private List skills; + @JoinColumn(name = "EXPERIENCE_ID") + private List technologies; @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) - @JoinColumn(name = "experience_id") + @JoinColumn(name = "EXPERIENCE_ID") private List achievements; } \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/experience/entity/ExperienceSkillJpaEntity.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/experience/entity/ExperienceSkillJpaEntity.java index b2d0da9..24a84c9 100644 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/experience/entity/ExperienceSkillJpaEntity.java +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/experience/entity/ExperienceSkillJpaEntity.java @@ -1,10 +1,19 @@ package com.pablotj.portfolio.infrastructure.persistence.experience.entity; -import jakarta.persistence.*; -import lombok.*; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; @Entity -@Table(name = "experience_skills") +@Table(name = "EXPERIENCE_SKILL") @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/experience/mapper/ExperienceJpaMapper.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/experience/mapper/ExperienceJpaMapper.java index de1a0c5..dbce14f 100644 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/experience/mapper/ExperienceJpaMapper.java +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/experience/mapper/ExperienceJpaMapper.java @@ -2,7 +2,7 @@ package com.pablotj.portfolio.infrastructure.persistence.experience.mapper; import com.pablotj.portfolio.domain.experience.Achievement; import com.pablotj.portfolio.domain.experience.Experience; -import com.pablotj.portfolio.domain.experience.Skill; +import com.pablotj.portfolio.domain.experience.Technology; import com.pablotj.portfolio.infrastructure.persistence.experience.entity.ExperienceAchievementJpaEntity; import com.pablotj.portfolio.infrastructure.persistence.experience.entity.ExperienceJpaEntity; import com.pablotj.portfolio.infrastructure.persistence.experience.entity.ExperienceSkillJpaEntity; @@ -13,12 +13,12 @@ import org.mapstruct.Mapping; public interface ExperienceJpaMapper { @Mapping(target = "id", ignore = true) + @Mapping(target = "profile.id", source = "id.profileId") ExperienceJpaEntity toEntity(Experience domain); - @Mapping(target = "id.value", source = "id") + @Mapping(target = "id", expression = "java(new ExperienceId(entity.getProfile().getId(), entity.getId()))") Experience toDomain(ExperienceJpaEntity entity); - @Mapping(target = "id", ignore = true) ExperienceAchievementJpaEntity toEntity(Achievement entity); @@ -26,10 +26,10 @@ public interface ExperienceJpaMapper { Achievement toDomain(ExperienceAchievementJpaEntity entity); @Mapping(target = "id", ignore = true) - ExperienceSkillJpaEntity toEntity(Skill entity); + ExperienceSkillJpaEntity toEntity(Technology entity); @Mapping(target = "id.value", source = "id") - Skill toDomain(ExperienceSkillJpaEntity entity); + Technology toDomain(ExperienceSkillJpaEntity entity); } \ 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 index 215f92e..3a2361d 100644 --- 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 @@ -1,7 +1,13 @@ package com.pablotj.portfolio.infrastructure.persistence.experience.repo; +import com.pablotj.portfolio.infrastructure.persistence.education.entity.EducationJpaEntity; import com.pablotj.portfolio.infrastructure.persistence.experience.entity.ExperienceJpaEntity; +import java.util.List; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; public interface SpringDataExperienceRepository extends JpaRepository { + Optional findByProfileIdAndId(Long profileId, Long id); + + List findAllByProfileId(Long profileId); } diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/profile/adapter/ProfileRepositoryAdapter.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/profile/adapter/ProfileRepositoryAdapter.java new file mode 100644 index 0000000..b746cc0 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/profile/adapter/ProfileRepositoryAdapter.java @@ -0,0 +1,51 @@ +package com.pablotj.portfolio.infrastructure.persistence.profile.adapter; + +import com.pablotj.portfolio.domain.profile.Profile; +import com.pablotj.portfolio.domain.profile.ProfileId; +import com.pablotj.portfolio.domain.profile.port.ProfileRepositoryPort; +import com.pablotj.portfolio.infrastructure.persistence.profile.entity.ProfileJpaEntity; +import com.pablotj.portfolio.infrastructure.persistence.profile.entity.ProfileSocialLinkJpaEntity; +import com.pablotj.portfolio.infrastructure.persistence.profile.mapper.ProfileJpaMapper; +import com.pablotj.portfolio.infrastructure.persistence.profile.repo.SpringDataProfileRepository; +import java.util.List; +import java.util.Optional; +import org.springframework.stereotype.Repository; + +@Repository +public class ProfileRepositoryAdapter implements ProfileRepositoryPort { + + private final SpringDataProfileRepository repo; + private final ProfileJpaMapper mapper; + + public ProfileRepositoryAdapter(SpringDataProfileRepository repo, ProfileJpaMapper mapper) { + this.repo = repo; + this.mapper = mapper; + } + + @Override + public Profile save(Profile p) { + ProfileJpaEntity entity = mapper.toEntity(p); + if (entity.getSocial() != null) { + for (ProfileSocialLinkJpaEntity socialLinkJpaEntity : entity.getSocial()) { + socialLinkJpaEntity.setProfile(entity); + } + } + ProfileJpaEntity saved = repo.save(entity); + return mapper.toDomain(saved); + } + + @Override + public Optional findBySlug(ProfileId id) { + return repo.findBySlug(id.slug()).map(mapper::toDomain); + } + + @Override + public Optional findById(ProfileId id) { + return repo.findById(id.id()).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/profile/entity/ProfileJpaEntity.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/profile/entity/ProfileJpaEntity.java new file mode 100644 index 0000000..4de0dda --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/profile/entity/ProfileJpaEntity.java @@ -0,0 +1,56 @@ +package com.pablotj.portfolio.infrastructure.persistence.profile.entity; + +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import java.util.ArrayList; +import java.util.List; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table(name = "profile") +@Getter +@Setter +public class ProfileJpaEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column + private String slug; + + @Column + private String name; + + @Column + private String title; + + @Column + private String subtitle; + + @Column + private String email; + + @Column + private String phone; + + @Column + private String location; + + @Column + private String avatar; + + @Column + private String bio; + + @OneToMany(mappedBy = "profile", cascade = CascadeType.ALL, orphanRemoval = true) + private List social = new ArrayList<>(); + +} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/profile/entity/ProfileSocialLinkJpaEntity.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/profile/entity/ProfileSocialLinkJpaEntity.java new file mode 100644 index 0000000..a92a078 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/profile/entity/ProfileSocialLinkJpaEntity.java @@ -0,0 +1,33 @@ +package com.pablotj.portfolio.infrastructure.persistence.profile.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table(name = "profile_social_link") +@Getter +@Setter +public class ProfileSocialLinkJpaEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "profile_id", nullable = false) + private ProfileJpaEntity profile; + + @Column + private String url; + + @Column + private String platform; +} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/profile/mapper/ProfileJpaMapper.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/profile/mapper/ProfileJpaMapper.java new file mode 100644 index 0000000..93182b1 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/profile/mapper/ProfileJpaMapper.java @@ -0,0 +1,26 @@ +package com.pablotj.portfolio.infrastructure.persistence.profile.mapper; + +import com.pablotj.portfolio.domain.profile.Profile; +import com.pablotj.portfolio.domain.profile.ProfileSocialLink; +import com.pablotj.portfolio.infrastructure.persistence.profile.entity.ProfileJpaEntity; +import com.pablotj.portfolio.infrastructure.persistence.profile.entity.ProfileSocialLinkJpaEntity; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +@Mapper(componentModel = "spring") +public interface ProfileJpaMapper { + + @Mapping(target = "id", ignore = true) + @Mapping(target = "social", source = "social") + ProfileJpaEntity toEntity(Profile domain); + + @Mapping(target = "id.id", source = "id") + @Mapping(target = "social", source = "social") + Profile toDomain(ProfileJpaEntity e); + + @Mapping(target = "id", ignore = true) + ProfileSocialLinkJpaEntity toEntitySocial(ProfileSocialLink entity); + + @Mapping(target = "id.value", source = "id") + ProfileSocialLink toDomainSocial(ProfileSocialLinkJpaEntity entity); +} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/profile/repo/SpringDataProfileRepository.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/profile/repo/SpringDataProfileRepository.java new file mode 100644 index 0000000..b5a6ad4 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/profile/repo/SpringDataProfileRepository.java @@ -0,0 +1,10 @@ +package com.pablotj.portfolio.infrastructure.persistence.profile.repo; + +import com.pablotj.portfolio.infrastructure.persistence.profile.entity.ProfileJpaEntity; +import java.util.Optional; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface SpringDataProfileRepository extends JpaRepository { + + Optional findBySlug(String slug); +} diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/project/adapter/ProjectRepositoryAdapter.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/project/adapter/ProjectRepositoryAdapter.java index f13c290..bed1735 100644 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/project/adapter/ProjectRepositoryAdapter.java +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/project/adapter/ProjectRepositoryAdapter.java @@ -31,11 +31,11 @@ public class ProjectRepositoryAdapter implements ProjectRepositoryPort { @Override public Optional findById(ProjectId id) { - return repo.findById(id.value()).map(mapper::toDomain); + return repo.findByProfileIdAndId(id.profileId(), id.projectId()).map(mapper::toDomain); } @Override - public List findAll() { - return repo.findAll().stream().map(mapper::toDomain).toList(); + public List findAll(Long profileId) { + return repo.findAllByProfileId(profileId).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/project/entity/ProjectFeatureJpaEntity.java similarity index 57% rename from infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/about/entity/AboutJpaEntity.java rename to infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/project/entity/ProjectFeatureJpaEntity.java index 12c6707..d85afd3 100644 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/about/entity/AboutJpaEntity.java +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/project/entity/ProjectFeatureJpaEntity.java @@ -1,4 +1,4 @@ -package com.pablotj.portfolio.infrastructure.persistence.about.entity; +package com.pablotj.portfolio.infrastructure.persistence.project.entity; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -10,20 +10,16 @@ import lombok.Getter; import lombok.Setter; @Entity -@Table(name = "abouts") +@Table(name = "PROJECT_FEATURE") @Getter @Setter -public class AboutJpaEntity { +public class ProjectFeatureJpaEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @Column(nullable = false) - private String title; + @Column + private String name; - @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/project/entity/ProjectJpaEntity.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/project/entity/ProjectJpaEntity.java index 40d8a07..d1e6b0e 100644 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/project/entity/ProjectJpaEntity.java +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/project/entity/ProjectJpaEntity.java @@ -1,11 +1,23 @@ package com.pablotj.portfolio.infrastructure.persistence.project.entity; -import jakarta.persistence.*; +import com.pablotj.portfolio.infrastructure.persistence.profile.entity.ProfileJpaEntity; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import java.util.List; import lombok.Getter; import lombok.Setter; @Entity -@Table(name = "projects") +@Table(name = "PROJECT") @Getter @Setter public class ProjectJpaEntity { @@ -13,11 +25,31 @@ public class ProjectJpaEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @Column(nullable = false) + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "profile_id", nullable = false) + private ProfileJpaEntity profile; + + @Column private String title; - @Column(columnDefinition = "text") + @Column private String description; - private String url; + @Column + private String image; + + @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) + @JoinColumn(name = "PROJECT_ID") + private List technologies; + + @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) + @JoinColumn(name = "PROJECT_ID") + private List features; + + @Column + private String demo; + + @Column + private String repository; + } \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/project/entity/ProjectTechnologyJpaEntity.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/project/entity/ProjectTechnologyJpaEntity.java new file mode 100644 index 0000000..1305dde --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/project/entity/ProjectTechnologyJpaEntity.java @@ -0,0 +1,25 @@ +package com.pablotj.portfolio.infrastructure.persistence.project.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 = "PROJECT_FEATURE_TECHNOLOGY") +@Getter +@Setter +public class ProjectTechnologyJpaEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column + private String name; + +} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/project/mapper/ProjectJpaMapper.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/project/mapper/ProjectJpaMapper.java index 0df712d..d9d6229 100644 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/project/mapper/ProjectJpaMapper.java +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/project/mapper/ProjectJpaMapper.java @@ -1,8 +1,11 @@ package com.pablotj.portfolio.infrastructure.persistence.project.mapper; import com.pablotj.portfolio.domain.project.Project; -import com.pablotj.portfolio.domain.project.ProjectId; +import com.pablotj.portfolio.domain.project.ProjectFeature; +import com.pablotj.portfolio.domain.project.ProjectTechnology; +import com.pablotj.portfolio.infrastructure.persistence.project.entity.ProjectFeatureJpaEntity; import com.pablotj.portfolio.infrastructure.persistence.project.entity.ProjectJpaEntity; +import com.pablotj.portfolio.infrastructure.persistence.project.entity.ProjectTechnologyJpaEntity; import org.mapstruct.Mapper; import org.mapstruct.Mapping; @@ -10,8 +13,21 @@ import org.mapstruct.Mapping; public interface ProjectJpaMapper { @Mapping(target = "id", ignore = true) + @Mapping(target = "profile.id", source = "id.profileId") ProjectJpaEntity toEntity(Project domain); - @Mapping(target = "id.value", source = "id") + @Mapping(target = "id", expression = "java(new ProjectId(e.getProfile().getId(), e.getId()))") Project toDomain(ProjectJpaEntity e); + + @Mapping(target = "id", ignore = true) + ProjectTechnologyJpaEntity toEntity(ProjectTechnology entity); + + @Mapping(target = "id.value", source = "id") + ProjectTechnology toDomain(ProjectTechnologyJpaEntity entity); + + @Mapping(target = "id", ignore = true) + ProjectFeatureJpaEntity toEntity(ProjectFeature entity); + + @Mapping(target = "id.value", source = "id") + ProjectFeature toDomain(ProjectFeatureJpaEntity entity); } \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/project/repo/SpringDataProjectRepository.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/project/repo/SpringDataProjectRepository.java index ae3bad2..1a7dd6f 100644 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/project/repo/SpringDataProjectRepository.java +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/project/repo/SpringDataProjectRepository.java @@ -1,6 +1,13 @@ package com.pablotj.portfolio.infrastructure.persistence.project.repo; +import com.pablotj.portfolio.infrastructure.persistence.experience.entity.ExperienceJpaEntity; import com.pablotj.portfolio.infrastructure.persistence.project.entity.ProjectJpaEntity; +import java.util.List; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; -public interface SpringDataProjectRepository extends JpaRepository {} +public interface SpringDataProjectRepository extends JpaRepository { + Optional findByProfileIdAndId(Long profileId, Long id); + + List findAllByProfileId(Long profileId); +} diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/resume/adapter/ResumeRepositoryAdapter.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/resume/adapter/ResumeRepositoryAdapter.java deleted file mode 100644 index d77be5f..0000000 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/resume/adapter/ResumeRepositoryAdapter.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.pablotj.portfolio.infrastructure.persistence.resume.adapter; - -import com.pablotj.portfolio.domain.resume.Resume; -import com.pablotj.portfolio.domain.resume.ResumeId; -import com.pablotj.portfolio.domain.resume.port.ResumeRepositoryPort; -import com.pablotj.portfolio.infrastructure.persistence.resume.entity.ResumeJpaEntity; -import com.pablotj.portfolio.infrastructure.persistence.resume.mapper.ResumeJpaMapper; -import com.pablotj.portfolio.infrastructure.persistence.resume.repo.SpringDataResumeRepository; -import java.util.List; -import java.util.Optional; -import org.springframework.stereotype.Repository; - -@Repository -public class ResumeRepositoryAdapter implements ResumeRepositoryPort { - - private final SpringDataResumeRepository repo; - private final ResumeJpaMapper mapper; - - public ResumeRepositoryAdapter(SpringDataResumeRepository repo, ResumeJpaMapper mapper) { - this.repo = repo; - this.mapper = mapper; - } - - @Override - public Resume save(Resume p) { - ResumeJpaEntity entity = mapper.toEntity(p); - ResumeJpaEntity saved = repo.save(entity); - return mapper.toDomain(saved); - } - - @Override - public Optional findById(ResumeId id) { - return repo.findById(id.value()).map(mapper::toDomain); - } - - @Override - public List findAll() { - return repo.findAll().stream().map(mapper::toDomain).toList(); - } -} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/resume/entity/ResumeJpaEntity.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/resume/entity/ResumeJpaEntity.java deleted file mode 100644 index b156e97..0000000 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/resume/entity/ResumeJpaEntity.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.pablotj.portfolio.infrastructure.persistence.resume.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 = "resumes") -@Getter -@Setter -public class ResumeJpaEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(name = "first_name", nullable = false) - private String name; - - @Column(name = "last_name", nullable = false) - private String surnames; - - @Column(nullable = false) - private String title; - - @Column(columnDefinition = "text", nullable = false) - private String summary; - - @Column - private String icon; - -} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/resume/mapper/ResumeJpaMapper.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/resume/mapper/ResumeJpaMapper.java deleted file mode 100644 index 9cdb13c..0000000 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/resume/mapper/ResumeJpaMapper.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.pablotj.portfolio.infrastructure.persistence.resume.mapper; - -import com.pablotj.portfolio.domain.resume.Resume; -import com.pablotj.portfolio.domain.resume.ResumeId; -import com.pablotj.portfolio.infrastructure.persistence.resume.entity.ResumeJpaEntity; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; - -@Mapper(componentModel = "spring") -public interface ResumeJpaMapper { - - @Mapping(target = "id", ignore = true) - ResumeJpaEntity toEntity(Resume domain); - - @Mapping(target = "id.value", source = "id") - Resume toDomain(ResumeJpaEntity e); -} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/resume/repo/SpringDataResumeRepository.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/resume/repo/SpringDataResumeRepository.java deleted file mode 100644 index e063727..0000000 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/resume/repo/SpringDataResumeRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.pablotj.portfolio.infrastructure.persistence.resume.repo; - -import com.pablotj.portfolio.infrastructure.persistence.resume.entity.ResumeJpaEntity; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface SpringDataResumeRepository extends JpaRepository { -} diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/skill/adapter/SkillRepositoryAdapter.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/skill/adapter/SkillRepositoryAdapter.java index 2bfab7d..e076387 100644 --- 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 @@ -1,9 +1,9 @@ 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.SkillGroup; +import com.pablotj.portfolio.domain.skill.SkillGroupId; import com.pablotj.portfolio.domain.skill.port.SkillRepositoryPort; -import com.pablotj.portfolio.infrastructure.persistence.skill.entity.SkillJpaEntity; +import com.pablotj.portfolio.infrastructure.persistence.skill.entity.SkillGroupJpaEntity; import com.pablotj.portfolio.infrastructure.persistence.skill.mapper.SkillJpaMapper; import com.pablotj.portfolio.infrastructure.persistence.skill.repo.SpringDataSkillRepository; import java.util.List; @@ -22,19 +22,19 @@ public class SkillRepositoryAdapter implements SkillRepositoryPort { } @Override - public Skill save(Skill p) { - SkillJpaEntity entity = mapper.toEntity(p); - SkillJpaEntity saved = repo.save(entity); + public SkillGroup save(SkillGroup p) { + SkillGroupJpaEntity entity = mapper.toEntity(p); + SkillGroupJpaEntity saved = repo.save(entity); return mapper.toDomain(saved); } @Override - public Optional findById(SkillId id) { - return repo.findById(id.value()).map(mapper::toDomain); + public Optional findById(SkillGroupId id) { + return repo.findByProfileIdAndId(id.profileId(), id.skillGroupId()).map(mapper::toDomain); } @Override - public List findAll() { - return repo.findAll().stream().map(mapper::toDomain).toList(); + public List findAll(Long profileId) { + return repo.findAllByProfileId(profileId).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/SkillGroupJpaEntity.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/skill/entity/SkillGroupJpaEntity.java new file mode 100644 index 0000000..dbd431e --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/persistence/skill/entity/SkillGroupJpaEntity.java @@ -0,0 +1,42 @@ +package com.pablotj.portfolio.infrastructure.persistence.skill.entity; + +import com.pablotj.portfolio.infrastructure.persistence.profile.entity.ProfileJpaEntity; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import java.util.List; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table(name = "SKILL_GROUP") +@Getter +@Setter +public class SkillGroupJpaEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "profile_id", nullable = false) + private ProfileJpaEntity profile; + + @Column + private String name; + + @Column + private String icon; + + @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) + @JoinColumn(name = "SKILL_ID") + private List skills; +} \ 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 index f0df0df..0550e79 100644 --- 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 @@ -10,7 +10,7 @@ import lombok.Getter; import lombok.Setter; @Entity -@Table(name = "skills") +@Table(name = "SKILL") @Getter @Setter public class SkillJpaEntity { @@ -19,11 +19,12 @@ public class SkillJpaEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @Column(nullable = false) - private String title; + @Column + private String name; - @Column(columnDefinition = "text") - private String description; + @Column + private Integer level; - private String url; + @Column + private Integer years; } \ 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 index 17d93a5..72f893b 100644 --- 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 @@ -1,7 +1,8 @@ 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.domain.skill.SkillGroup; +import com.pablotj.portfolio.infrastructure.persistence.skill.entity.SkillGroupJpaEntity; import com.pablotj.portfolio.infrastructure.persistence.skill.entity.SkillJpaEntity; import org.mapstruct.Mapper; import org.mapstruct.Mapping; @@ -10,15 +11,15 @@ import org.mapstruct.Mapping; public interface SkillJpaMapper { @Mapping(target = "id", ignore = true) - SkillJpaEntity toEntity(Skill domain); + @Mapping(target = "profile.id", source = "id.profileId") + SkillGroupJpaEntity toEntity(SkillGroup 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(); - } + @Mapping(target = "id", expression = "java(new SkillGroupId(entity.getProfile().getId(), entity.getId()))") + SkillGroup toDomain(SkillGroupJpaEntity entity); + + @Mapping(target = "id", ignore = true) + SkillJpaEntity toEntity(Skill entity); + + @Mapping(target = "id.value", source = "id") + Skill toDomain(SkillJpaEntity entity); } \ 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 index 5368648..9db0dc3 100644 --- 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 @@ -1,7 +1,13 @@ package com.pablotj.portfolio.infrastructure.persistence.skill.repo; -import com.pablotj.portfolio.infrastructure.persistence.skill.entity.SkillJpaEntity; +import com.pablotj.portfolio.infrastructure.persistence.project.entity.ProjectJpaEntity; +import com.pablotj.portfolio.infrastructure.persistence.skill.entity.SkillGroupJpaEntity; +import java.util.List; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; -public interface SpringDataSkillRepository extends JpaRepository { +public interface SpringDataSkillRepository extends JpaRepository { + Optional findByProfileIdAndId(Long profileId, Long id); + + List findAllByProfileId(Long profileId); } diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/about/AboutController.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/about/AboutController.java deleted file mode 100644 index 7f6a9a7..0000000 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/about/AboutController.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.pablotj.portfolio.infrastructure.rest.about; - -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 deleted file mode 100644 index f1f254b..0000000 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/about/dto/AboutDto.java +++ /dev/null @@ -1,6 +0,0 @@ -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 deleted file mode 100644 index 385b340..0000000 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/about/dto/CreateAboutRequest.java +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index af3a004..0000000 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/about/mapper/AboutRestMapper.java +++ /dev/null @@ -1,13 +0,0 @@ -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 26fb9ea..4200d84 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 @@ -2,6 +2,7 @@ package com.pablotj.portfolio.infrastructure.rest.api; import java.util.List; import java.util.Map; +import org.springframework.beans.factory.annotation.Value; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -11,11 +12,14 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping public class ApiRootController { + @Value("${info.app.version}") + private String appVersion; + @GetMapping public ResponseEntity> root() { Map response = Map.of( "api", "Portfolio API", - "version", "1.0", + "version", appVersion, "doc", "/v3/api-docs", "swagger", "/swagger-ui", "endpoints", List.of( @@ -26,7 +30,7 @@ public class ApiRootController { 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") + Map.of("path", "/v1/technologies", "description", "ProfileSocialLink entries") ) ); diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/certification/CertificationController.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/certification/CertificationController.java index 21197ab..ebe9de7 100644 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/certification/CertificationController.java +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/certification/CertificationController.java @@ -17,7 +17,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController -@RequestMapping("/v1/certifications") +@RequestMapping("/v1/profiles/{profileId}/certifications") public class CertificationController { private final CreateCertificationUseCase createUC; @@ -31,26 +31,27 @@ public class CertificationController { } @GetMapping - public List all() { - return getUC.all().stream().map(mapper::toDto).toList(); + public List all(@PathVariable Long profileId) { + return getUC.all(profileId).stream().map(mapper::toDto).toList(); } @GetMapping("/{id}") - public ResponseEntity byId(@PathVariable Long id) { - return getUC.byId(id) + public ResponseEntity byId(@PathVariable Long profileId, @PathVariable Long id) { + return getUC.byId(profileId, id) .map(mapper::toDto) .map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); } @PostMapping - public ResponseEntity create(@Valid @RequestBody CreateCertificationRequest request) { + public ResponseEntity create(@PathVariable Long profileId, @Valid @RequestBody CreateCertificationRequest request) { var cmd = new CreateCertificationUseCase.Command( - request.title(), - request.description(), - request.url() + request.name(), + request.issuer(), + request.date(), + request.credentialId() ); - var created = createUC.handle(cmd); + var created = createUC.handle(profileId, cmd); var body = mapper.toDto(created); return ResponseEntity.created(URI.create("/api/certifications/" + body.id())).body(body); } 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 index a8258c7..9623307 100644 --- 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 @@ -1,6 +1,8 @@ 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) { +public record CertificationDto(Long id, + String name, + String issuer, + String date, + String credentialId) { } \ 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 index 536219f..0ae0994 100644 --- 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 @@ -1,10 +1,9 @@ package com.pablotj.portfolio.infrastructure.rest.certification.dto; -import jakarta.validation.constraints.NotBlank; - public record CreateCertificationRequest( - @NotBlank String title, - String description, - String url + String name, + String issuer, + String date, + String credentialId ) { } \ 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 index e116f3d..9d52cfc 100644 --- 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 @@ -8,6 +8,6 @@ import org.mapstruct.Mapping; @Mapper(componentModel = "spring") public interface CertificationRestMapper { - @Mapping(target = "id", source = "id.value") + @Mapping(target = "id", source = "id.certificationId") CertificationDto toDto(Certification domain); } diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/contact/ContactController.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/contact/ContactController.java deleted file mode 100644 index b74d24f..0000000 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/contact/ContactController.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.pablotj.portfolio.infrastructure.rest.contact; - -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.country(), - request.city(), - request.email(), - request.phone(), - request.linkedin(), - request.github() - ); - 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 deleted file mode 100644 index 5e4dd14..0000000 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/contact/dto/ContactDto.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.pablotj.portfolio.infrastructure.rest.contact.dto; - -import jakarta.validation.constraints.Email; -import jakarta.validation.constraints.NotBlank; - -public record ContactDto( - Long id, - String country, - String city, - @NotBlank @Email String email, - String phone, - String linkedin, - String github -) { -} \ 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 deleted file mode 100644 index fd61f0f..0000000 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/contact/dto/CreateContactRequest.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.pablotj.portfolio.infrastructure.rest.contact.dto; - -import jakarta.validation.constraints.Email; -import jakarta.validation.constraints.NotBlank; - -public record CreateContactRequest( - String country, - String city, - @NotBlank @Email String email, - String phone, - String linkedin, - String github -) { -} \ 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 deleted file mode 100644 index aa258ac..0000000 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/contact/mapper/ContactRestMapper.java +++ /dev/null @@ -1,13 +0,0 @@ -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/EducationController.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/education/EducationController.java index 348625b..7c2a4fd 100644 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/education/EducationController.java +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/education/EducationController.java @@ -17,7 +17,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController -@RequestMapping("/v1/educations") +@RequestMapping("/v1/profiles/{profileId}/education") public class EducationController { private final CreateEducationUseCase createUC; @@ -31,26 +31,28 @@ public class EducationController { } @GetMapping - public List all() { - return getUC.all().stream().map(mapper::toDto).toList(); + public List all(@PathVariable Long profileId) { + return getUC.all(profileId).stream().map(mapper::toDto).toList(); } @GetMapping("/{id}") - public ResponseEntity byId(@PathVariable Long id) { - return getUC.byId(id) + public ResponseEntity byId(@PathVariable Long profileId, @PathVariable Long id) { + return getUC.byId(profileId, id) .map(mapper::toDto) .map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); } @PostMapping - public ResponseEntity create(@Valid @RequestBody CreateEducationRequest request) { + public ResponseEntity create(@PathVariable Long profileId, @Valid @RequestBody CreateEducationRequest request) { var cmd = new CreateEducationUseCase.Command( - request.title(), - request.description(), - request.url() + request.institution(), + request.degree(), + request.period(), + request.grade(), + request.description() ); - var created = createUC.handle(cmd); + var created = createUC.handle(profileId, cmd); var body = mapper.toDto(created); return ResponseEntity.created(URI.create("/api/educations/" + body.id())).body(body); } 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 index 40a4380..f2211cd 100644 --- 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 @@ -1,10 +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 + String institution, + String degree, + String period, + String grade, + String description ) { } \ 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 index 957d235..3c9a5a9 100644 --- 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 @@ -1,6 +1,10 @@ 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) { +public record EducationDto( + Long id, + String institution, + String degree, + String period, + String grade, + String description) { } \ 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 index 2fac7e2..6358297 100644 --- 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 @@ -8,6 +8,6 @@ import org.mapstruct.Mapping; @Mapper(componentModel = "spring") public interface EducationRestMapper { - @Mapping(target = "id", source = "id.value") + @Mapping(target = "id", source = "id.educationId") EducationDto toDto(Education domain); } diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/experience/ExperienceController.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/experience/ExperienceController.java index a4018bb..aceac1b 100644 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/experience/ExperienceController.java +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/experience/ExperienceController.java @@ -17,7 +17,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController -@RequestMapping("/v1/experiences") +@RequestMapping("/v1/profiles/{profileId}/experience") public class ExperienceController { private final CreateExperienceUseCase createUC; @@ -31,34 +31,30 @@ public class ExperienceController { } @GetMapping - public List all() { - return getUC.all().stream().map(mapper::toDto).toList(); + public List all(@PathVariable Long profileId) { + return getUC.all(profileId).stream().map(mapper::toDto).toList(); } @GetMapping("/{id}") - public ResponseEntity byId(@PathVariable Long id) { - return getUC.byId(id) + public ResponseEntity byId(@PathVariable Long profileId, @PathVariable Long id) { + return getUC.byId(profileId, id) .map(mapper::toDto) .map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); } @PostMapping - public ResponseEntity create(@Valid @RequestBody CreateExperienceRequest request) { + public ResponseEntity create(@PathVariable Long profileId, @Valid @RequestBody CreateExperienceRequest request) { var cmd = new CreateExperienceUseCase.Command( - request.position(), request.company(), - request.startDate(), - request.endDate(), - request.city(), - request.region(), - request.country(), - request.remote(), + request.position(), + request.period(), + request.location(), request.description(), - request.skills(), + request.technologies(), request.achievements() ); - var created = createUC.handle(cmd); + var created = createUC.handle(profileId, cmd); var body = mapper.toDto(created); return ResponseEntity.created(URI.create("/api/experiences/" + body.id())).body(body); } 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 index 8313c62..89404af 100644 --- 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 @@ -1,19 +1,14 @@ package com.pablotj.portfolio.infrastructure.rest.experience.dto; import jakarta.validation.constraints.NotBlank; -import java.time.LocalDate; import java.util.List; public record CreateExperienceRequest( @NotBlank String position, String company, - LocalDate startDate, - LocalDate endDate, - String city, - String region, - String country, - Boolean remote, + String period, + String location, String description, - List skills, + List technologies, List achievements ) {} \ 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 index 6dabb00..81450c1 100644 --- 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 @@ -1,20 +1,15 @@ package com.pablotj.portfolio.infrastructure.rest.experience.dto; import jakarta.validation.constraints.NotBlank; -import java.time.LocalDate; import java.util.List; public record ExperienceDto( Long id, @NotBlank String position, String company, - LocalDate startDate, - LocalDate endDate, - String city, - String region, - String country, - Boolean remote, + String period, + String location, String description, - List skills, + List technologies, List achievements ) {} \ 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 index 54f2ebb..3d67b24 100644 --- 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 @@ -2,7 +2,7 @@ package com.pablotj.portfolio.infrastructure.rest.experience.mapper; import com.pablotj.portfolio.domain.experience.Achievement; import com.pablotj.portfolio.domain.experience.Experience; -import com.pablotj.portfolio.domain.experience.Skill; +import com.pablotj.portfolio.domain.experience.Technology; import com.pablotj.portfolio.infrastructure.rest.experience.dto.ExperienceDto; import java.util.List; import org.mapstruct.Mapper; @@ -11,14 +11,14 @@ import org.mapstruct.Mapping; @Mapper(componentModel = "spring") public interface ExperienceRestMapper { - @Mapping(target = "id", source = "id.value") - @Mapping(target = "skills", source = "skills") + @Mapping(target = "id", source = "id.experienceId") + @Mapping(target = "technologies", source = "technologies") @Mapping(target = "achievements", source = "achievements") ExperienceDto toDto(Experience domain); - default List mapSkills(List skills) { + default List mapSkills(List skills) { return skills == null ? List.of() : skills.stream() - .map(Skill::getName) + .map(Technology::getName) .toList(); } diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/profile/ProfileController.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/profile/ProfileController.java new file mode 100644 index 0000000..c7de454 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/profile/ProfileController.java @@ -0,0 +1,65 @@ +package com.pablotj.portfolio.infrastructure.rest.profile; + +import com.pablotj.portfolio.application.profile.CreateProfileUseCase; +import com.pablotj.portfolio.application.profile.GetProfileUseCase; +import com.pablotj.portfolio.infrastructure.rest.profile.dto.ProfileCreateRequest; +import com.pablotj.portfolio.infrastructure.rest.profile.dto.ProfileDto; +import com.pablotj.portfolio.infrastructure.rest.profile.mapper.ProfileRestMapper; +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/profiles") +public class ProfileController { + + private final CreateProfileUseCase createUC; + private final GetProfileUseCase getUC; + private final ProfileRestMapper mapper; + + public ProfileController(CreateProfileUseCase createUC, GetProfileUseCase getUC, ProfileRestMapper mapper) { + this.createUC = createUC; + this.getUC = getUC; + this.mapper = mapper; + } + + + @GetMapping + public List all() { + return getUC.all().stream().map(mapper::toDto).toList(); + } + + @GetMapping("/{slug}") + public ResponseEntity byId(@PathVariable String slug) { + return getUC.bySlug(slug) + .map(mapper::toDto) + .map(ResponseEntity::ok) + .orElse(ResponseEntity.notFound().build()); + } + + @PostMapping + public ResponseEntity create(@Valid @RequestBody ProfileCreateRequest request) { + var cmd = new CreateProfileUseCase.Command( + request.slug(), + request.name(), + request.title(), + request.subtitle(), + request.email(), + request.phone(), + request.location(), + request.avatar(), + request.bio(), + request.social().stream().map(l -> new CreateProfileUseCase.Link(l.platform(), l.url())).toList() + ); + 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/profile/dto/ProfileCreateRequest.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/profile/dto/ProfileCreateRequest.java new file mode 100644 index 0000000..1672d16 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/profile/dto/ProfileCreateRequest.java @@ -0,0 +1,17 @@ +package com.pablotj.portfolio.infrastructure.rest.profile.dto; + +import java.util.List; + +public record ProfileCreateRequest( + String slug, + String name, + String title, + String subtitle, + String email, + String phone, + String location, + String avatar, + String bio, + List social +) { +} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/profile/dto/ProfileDto.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/profile/dto/ProfileDto.java new file mode 100644 index 0000000..7656681 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/profile/dto/ProfileDto.java @@ -0,0 +1,18 @@ +package com.pablotj.portfolio.infrastructure.rest.profile.dto; + +import java.util.List; + +public record ProfileDto( + Long id, + String slug, + String name, + String title, + String subtitle, + String email, + String phone, + String location, + String avatar, + String bio, + List social +) { +} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/profile/dto/ProfileSocialLinkDto.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/profile/dto/ProfileSocialLinkDto.java new file mode 100644 index 0000000..e06317d --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/profile/dto/ProfileSocialLinkDto.java @@ -0,0 +1,4 @@ +package com.pablotj.portfolio.infrastructure.rest.profile.dto; + +public record ProfileSocialLinkDto(String platform, String url) { +} diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/profile/mapper/ProfileRestMapper.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/profile/mapper/ProfileRestMapper.java new file mode 100644 index 0000000..8a81b29 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/profile/mapper/ProfileRestMapper.java @@ -0,0 +1,24 @@ +package com.pablotj.portfolio.infrastructure.rest.profile.mapper; + +import com.pablotj.portfolio.domain.profile.Profile; +import com.pablotj.portfolio.domain.profile.ProfileSocialLink; +import com.pablotj.portfolio.infrastructure.rest.profile.dto.ProfileDto; +import com.pablotj.portfolio.infrastructure.rest.profile.dto.ProfileSocialLinkDto; +import java.util.List; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +@Mapper(componentModel = "spring") +public interface ProfileRestMapper { + + @Mapping(target = "id", source = "id.id") + @Mapping(target = "social", source = "social") + ProfileDto toDto(Profile domain); + + + default List mapSocialLinks(List skills) { + return skills == null ? List.of() : skills.stream() + .map(s -> new ProfileSocialLinkDto(s.getPlatform(), s.getUrl())) + .toList(); + } +} diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/project/ProjectController.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/project/ProjectController.java index abf7f89..e22f0af 100644 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/project/ProjectController.java +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/project/ProjectController.java @@ -6,14 +6,18 @@ import com.pablotj.portfolio.infrastructure.rest.project.dto.CreateProjectReques import com.pablotj.portfolio.infrastructure.rest.project.dto.ProjectDto; import com.pablotj.portfolio.infrastructure.rest.project.mapper.ProjectRestMapper; import jakarta.validation.Valid; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - 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/projects") +@RequestMapping("/v1/profiles/{profileId}/projects") public class ProjectController { private final CreateProjectUseCase createUC; @@ -27,26 +31,30 @@ public class ProjectController { } @GetMapping - public List all() { - return getUC.all().stream().map(mapper::toDto).toList(); + public List all(@PathVariable Long profileId) { + return getUC.all(profileId).stream().map(mapper::toDto).toList(); } @GetMapping("/{id}") - public ResponseEntity byId(@PathVariable Long id) { - return getUC.byId(id) + public ResponseEntity byId(@PathVariable Long profileId, @PathVariable Long id) { + return getUC.byId(profileId, id) .map(mapper::toDto) .map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); } @PostMapping - public ResponseEntity create(@Valid @RequestBody CreateProjectRequest request) { + public ResponseEntity create(@PathVariable Long profileId, @Valid @RequestBody CreateProjectRequest request) { var cmd = new CreateProjectUseCase.Command( request.title(), request.description(), - request.url() + request.image(), + request.technologies(), + request.features(), + request.demo(), + request.repository() ); - var created = createUC.handle(cmd); + var created = createUC.handle(profileId, cmd); var body = mapper.toDto(created); return ResponseEntity.created(URI.create("/api/projects/" + body.id())).body(body); } diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/project/dto/CreateProjectRequest.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/project/dto/CreateProjectRequest.java index 65ab2a5..2553b4e 100644 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/project/dto/CreateProjectRequest.java +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/project/dto/CreateProjectRequest.java @@ -1,9 +1,13 @@ package com.pablotj.portfolio.infrastructure.rest.project.dto; -import jakarta.validation.constraints.NotBlank; +import java.util.List; public record CreateProjectRequest( - @NotBlank String title, + String title, String description, - String url + String image, + List technologies, + List features, + String demo, + String repository ) {} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/project/dto/ProjectDto.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/project/dto/ProjectDto.java index b22eeaa..e837843 100644 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/project/dto/ProjectDto.java +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/project/dto/ProjectDto.java @@ -1,5 +1,15 @@ package com.pablotj.portfolio.infrastructure.rest.project.dto; -import jakarta.validation.constraints.NotBlank; +import java.util.List; -public record ProjectDto(Long id, @NotBlank String title, String description, String url) {} \ No newline at end of file +public record ProjectDto( + Long id, + String title, + String description, + String image, + List technologies, + List features, + String demo, + String repository +) { +} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/project/mapper/ProjectRestMapper.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/project/mapper/ProjectRestMapper.java index cc4c0b3..b581c8d 100644 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/project/mapper/ProjectRestMapper.java +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/project/mapper/ProjectRestMapper.java @@ -1,13 +1,30 @@ package com.pablotj.portfolio.infrastructure.rest.project.mapper; import com.pablotj.portfolio.domain.project.Project; +import com.pablotj.portfolio.domain.project.ProjectFeature; +import com.pablotj.portfolio.domain.project.ProjectTechnology; import com.pablotj.portfolio.infrastructure.rest.project.dto.ProjectDto; +import java.util.List; import org.mapstruct.Mapper; import org.mapstruct.Mapping; @Mapper(componentModel = "spring") public interface ProjectRestMapper { - @Mapping(target = "id", source = "id.value") + @Mapping(target = "id", source = "id.projectId") + @Mapping(target = "technologies", source = "technologies") + @Mapping(target = "features", source = "features") ProjectDto toDto(Project domain); + + default List mapTechnologies(List technologies) { + return technologies == null ? List.of() : technologies.stream() + .map(ProjectTechnology::getName) + .toList(); + } + + default List mapFeatures(List features) { + return features == null ? List.of() : features.stream() + .map(ProjectFeature::getName) + .toList(); + } } diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/resume/ResumeController.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/resume/ResumeController.java deleted file mode 100644 index 7592c7d..0000000 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/resume/ResumeController.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.pablotj.portfolio.infrastructure.rest.resume; - -import com.pablotj.portfolio.application.resume.CreateResumeUseCase; -import com.pablotj.portfolio.application.resume.GetResumeUseCase; -import com.pablotj.portfolio.infrastructure.rest.resume.dto.ResumeCreateRequest; -import com.pablotj.portfolio.infrastructure.rest.resume.dto.ResumeDto; -import com.pablotj.portfolio.infrastructure.rest.resume.mapper.ResumeRestMapper; -import jakarta.validation.Valid; -import java.net.URI; -import java.util.List; -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 ResumeController { - - private final CreateResumeUseCase createUC; - private final GetResumeUseCase getUC; - private final ResumeRestMapper mapper; - - public ResumeController(CreateResumeUseCase createUC, GetResumeUseCase getUC, ResumeRestMapper 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 ResumeCreateRequest request) { - var cmd = new CreateResumeUseCase.Command( - request.name(), - request.surnames(), - request.title(), - request.summary(), - request.icon() - ); - 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/resume/dto/ResumeCreateRequest.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/resume/dto/ResumeCreateRequest.java deleted file mode 100644 index e3fb0e6..0000000 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/resume/dto/ResumeCreateRequest.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.pablotj.portfolio.infrastructure.rest.resume.dto; - -import jakarta.validation.constraints.NotBlank; - -public record ResumeCreateRequest( - @NotBlank String name, - @NotBlank String surnames, - @NotBlank String title, - @NotBlank String summary, - String icon -) { -} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/resume/dto/ResumeDto.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/resume/dto/ResumeDto.java deleted file mode 100644 index c63f8ad..0000000 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/resume/dto/ResumeDto.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.pablotj.portfolio.infrastructure.rest.resume.dto; - -import jakarta.validation.constraints.NotBlank; - -public record ResumeDto( - Long id, - @NotBlank String name, - @NotBlank String surnames, - @NotBlank String title, - @NotBlank String summary, - String icon -) { -} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/resume/mapper/ResumeRestMapper.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/resume/mapper/ResumeRestMapper.java deleted file mode 100644 index 0cc685b..0000000 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/resume/mapper/ResumeRestMapper.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.pablotj.portfolio.infrastructure.rest.resume.mapper; - -import com.pablotj.portfolio.domain.resume.Resume; -import com.pablotj.portfolio.infrastructure.rest.resume.dto.ResumeDto; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; - -@Mapper(componentModel = "spring") -public interface ResumeRestMapper { - - @Mapping(target = "id", source = "id.value") - ResumeDto toDto(Resume domain); -} diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/skill/SkillController.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/skill/SkillController.java index 910e325..7a9d0c4 100644 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/skill/SkillController.java +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/skill/SkillController.java @@ -2,8 +2,8 @@ package com.pablotj.portfolio.infrastructure.rest.skill; 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.dto.CreateSkillGroupRequest; +import com.pablotj.portfolio.infrastructure.rest.skill.dto.SkillGroupDto; import com.pablotj.portfolio.infrastructure.rest.skill.mapper.SkillRestMapper; import jakarta.validation.Valid; import java.net.URI; @@ -17,7 +17,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController -@RequestMapping("/v1/skills") +@RequestMapping("/v1/profiles/{profileId}/skills") public class SkillController { private final CreateSkillUseCase createUC; @@ -31,26 +31,26 @@ public class SkillController { } @GetMapping - public List all() { - return getUC.all().stream().map(mapper::toDto).toList(); + public List all(@PathVariable Long profileId) { + return getUC.all(profileId).stream().map(mapper::toDto).toList(); } @GetMapping("/{id}") - public ResponseEntity byId(@PathVariable Long id) { - return getUC.byId(id) + public ResponseEntity byId(@PathVariable Long profileId, @PathVariable Long id) { + return getUC.byId(profileId, 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() + public ResponseEntity create(@PathVariable Long profileId, @Valid @RequestBody CreateSkillGroupRequest request) { + var cmd = new CreateSkillUseCase.CommandGroup( + request.name(), + request.icon(), + request.skills().stream().map(s -> new CreateSkillUseCase.CommandSkill(s.name(), s.level(), s.years())).toList() ); - var created = createUC.handle(cmd); + var created = createUC.handle(profileId, cmd); var body = mapper.toDto(created); return ResponseEntity.created(URI.create("/api/skills/" + body.id())).body(body); } diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/skill/dto/CreateSkillGroupRequest.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/skill/dto/CreateSkillGroupRequest.java new file mode 100644 index 0000000..3bf00d2 --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/skill/dto/CreateSkillGroupRequest.java @@ -0,0 +1,8 @@ +package com.pablotj.portfolio.infrastructure.rest.skill.dto; + +import java.util.List; + +public record CreateSkillGroupRequest( + String name, String icon, List skills +) { +} \ 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 index 85b46f6..a438cfc 100644 --- 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 @@ -1,10 +1,8 @@ package com.pablotj.portfolio.infrastructure.rest.skill.dto; -import jakarta.validation.constraints.NotBlank; - public record CreateSkillRequest( - @NotBlank String title, - String description, - String url + String name, + Integer years, + Integer level ) { } \ 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 index 557214b..1afa353 100644 --- 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 @@ -1,6 +1,4 @@ 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) { +public record SkillDto(Long id, String name, Integer years, Integer level) { } \ No newline at end of file diff --git a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/skill/dto/SkillGroupDto.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/skill/dto/SkillGroupDto.java new file mode 100644 index 0000000..61a872e --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/skill/dto/SkillGroupDto.java @@ -0,0 +1,6 @@ +package com.pablotj.portfolio.infrastructure.rest.skill.dto; + +import java.util.List; + +public record SkillGroupDto(Long id, String name, String icon, List skills) { +} \ 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 index 4e495c4..7ac3540 100644 --- 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 @@ -1,13 +1,18 @@ package com.pablotj.portfolio.infrastructure.rest.skill.mapper; import com.pablotj.portfolio.domain.skill.Skill; +import com.pablotj.portfolio.domain.skill.SkillGroup; import com.pablotj.portfolio.infrastructure.rest.skill.dto.SkillDto; +import com.pablotj.portfolio.infrastructure.rest.skill.dto.SkillGroupDto; import org.mapstruct.Mapper; import org.mapstruct.Mapping; @Mapper(componentModel = "spring") public interface SkillRestMapper { + @Mapping(target = "id", source = "id.skillGroupId") + SkillGroupDto toDto(SkillGroup domain); + @Mapping(target = "id", source = "id.value") SkillDto toDto(Skill domain); } diff --git a/infrastructure/src/main/resources/ddl.sql b/infrastructure/src/main/resources/ddl.sql new file mode 100644 index 0000000..aaa34af --- /dev/null +++ b/infrastructure/src/main/resources/ddl.sql @@ -0,0 +1,145 @@ +create table certification +( + id bigint generated by default as identity, + credential_id varchar(255), + date varchar(255), + issuer varchar(255), + name varchar(255), + primary key (id) +); + +create table education +( + id bigint generated by default as identity, + degree varchar(255), + description text, + grade varchar(255), + institution varchar(255), + period varchar(255), + primary key (id) +); + +create table experience +( + id bigint generated by default as identity, + company varchar(255), + description text, + location varchar(255), + period varchar(255), + position varchar(255), + primary key (id) +); + +create table experience_achievement +( + id bigint generated by default as identity, + description text, + experience_id bigint, + primary key (id) +); + +create table experience_skill +( + id bigint generated by default as identity, + name varchar(255), + experience_id bigint, + primary key (id) +); + +create table personal +( + id bigint generated by default as identity, + avatar varchar(255), + bio varchar(255), + email varchar(255), + location varchar(255), + name varchar(255), + phone varchar(255), + subtitle varchar(255), + title varchar(255), + primary key (id) +); + +create table personal_social_link +( + id bigint generated by default as identity, + platform varchar(255), + url varchar(255), + personal_id bigint not null, + primary key (id) +); + +create table project +( + id bigint generated by default as identity, + demo varchar(255), + description varchar(255), + image varchar(255), + repository varchar(255), + title varchar(255), + primary key (id) +); + +create table project_feature +( + id bigint generated by default as identity, + name varchar(255), + project_id bigint, + primary key (id) +); + +create table project_feature_technology +( + id bigint generated by default as identity, + name varchar(255), + project_id bigint, + primary key (id) +); + +create table skill +( + id bigint generated by default as identity, + level integer, + name varchar(255), + years integer, + skill_id bigint, + primary key (id) +); + +create table skill_group +( + id bigint generated by default as identity, + icon varchar(255), + name varchar(255), + primary key (id) +); + +alter table if exists experience_achievement + add constraint FK94xrk6stofkung8skwplo29nd + foreign key (experience_id) + references experience; + +alter table if exists experience_skill + add constraint FKpr3jdfjjlaubuayoafpwyx2al + foreign key (experience_id) + references experience; + +alter table if exists profile_social_link + add constraint FKfh1pbfvvg3palcr1yip6jffik + foreign key (PROFILE_ID) + references profile; + +alter table if exists project_feature + add constraint FKdifppyvrfito5in15ox4db0up + foreign key (project_id) + references project; + +alter table if exists project_feature_technology + add constraint FK15krsajtovetpg5vsaqj3icwf + foreign key (project_id) + references project; + +alter table if exists skill + add constraint FKi819li5g5cp5qbsyenhr3kmef + foreign key (skill_id) + references skill_group; \ No newline at end of file diff --git a/mvnw b/mvnw index 4f699ce..cbc2df5 100755 --- a/mvnw +++ b/mvnw @@ -23,7 +23,7 @@ # # Optional ENV vars # ----------------- -# JAVA_HOME - location of a JDK resume dir, required when download maven via java source +# JAVA_HOME - location of a JDK profile dir, required when download maven via java source # MVNW_REPOURL - repo url base for downloading maven distribution # MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven # MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output @@ -134,7 +134,7 @@ maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; esac # apply MVNW_REPOURL and calculate MAVEN_HOME -# maven resume pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +# maven profile pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ [ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" distributionUrlName="${distributionUrl##*/}" distributionUrlNameMain="${distributionUrlName%.*}"