refactor(api): refactor endpoints, services, and domain logic

This commit is contained in:
2025-09-09 19:53:42 +02:00
parent 9f5306545e
commit 1b55d9ab29
144 changed files with 1357 additions and 1221 deletions

View File

@@ -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) {
}
}

View File

@@ -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<About> byId(Long id) {
return repository.findById(new AboutId(id));
}
public List<About> all() {
return repository.findAll();
}
}

View File

@@ -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
) {
}
}

View File

@@ -14,11 +14,11 @@ public class GetCertificationUseCase {
this.repository = repository;
}
public Optional<Certification> byId(Long id) {
return repository.findById(new CertificationId(id));
public Optional<Certification> byId(Long profileId, Long id) {
return repository.findById(new CertificationId(profileId, id));
}
public List<Certification> all() {
return repository.findAll();
public List<Certification> all(Long profileId) {
return repository.findAll(profileId);
}
}

View File

@@ -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
) {
}
}

View File

@@ -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<Contact> byId(Long id) {
return repository.findById(new ContactId(id));
}
public List<Contact> all() {
return repository.findAll();
}
}

View File

@@ -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
) {
}
}

View File

@@ -14,11 +14,11 @@ public class GetEducationUseCase {
this.repository = repository;
}
public Optional<Education> byId(Long id) {
return repository.findById(new EducationId(id));
public Optional<Education> byId(Long profileId, Long id) {
return repository.findById(new EducationId(profileId, id));
}
public List<Education> all() {
return repository.findAll();
public List<Education> all(Long profileId) {
return repository.findAll(profileId);
}
}

View File

@@ -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<String> skills,
List<String> technologies,
List<String> achievements
) {
}

View File

@@ -14,11 +14,11 @@ public class GetExperienceUseCase {
this.repository = repository;
}
public Optional<Experience> byId(Long id) {
return repository.findById(new ExperienceId(id));
public Optional<Experience> byId(Long profileId, Long id) {
return repository.findById(new ExperienceId(profileId, id));
}
public List<Experience> all() {
return repository.findAll();
public List<Experience> all(Long profileId) {
return repository.findAll(profileId);
}
}

View File

@@ -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<Link> socialLinks
) {
}
public record Link(String platform, String url) {
}
}

View File

@@ -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<Profile> byId(Long id) {
return repository.findById(new ProfileId(id));
}
public Optional<Profile> bySlug(String slug) {
return repository.findBySlug(new ProfileId(slug));
}
public List<Profile> all() {
return repository.findAll();
}
}

View File

@@ -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<String> technologies,
List<String> features,
String demo,
String repository) {
}
}

View File

@@ -15,11 +15,11 @@ public class GetProjectUseCase {
this.repository = repository;
}
public Optional<Project> byId(Long id) {
return repository.findById(new ProjectId(id));
public Optional<Project> byId(Long profileId, Long id) {
return repository.findById(new ProjectId(profileId, id));
}
public List<Project> all() {
return repository.findAll();
public List<Project> all(Long profileId) {
return repository.findAll(profileId);
}
}

View File

@@ -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
) {
}
}

View File

@@ -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<Resume> byId(Long id) {
return repository.findById(new ResumeId(id));
}
public List<Resume> all() {
return repository.findAll();
}
}

View File

@@ -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<CommandSkill> skills
) {
}
public record CommandSkill(
String name,
Integer level,
Integer years
) {
}
}

View File

@@ -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<Skill> byId(Long id) {
return repository.findById(new SkillId(id));
public Optional<SkillGroup> byId(Long profileId, Long id) {
return repository.findById(new SkillGroupId(profileId, id));
}
public List<Skill> all() {
return repository.findAll();
public List<SkillGroup> all(Long profileId) {
return repository.findAll(profileId);
}
}