From ab40e9a4974e60d7aaae8c5e4adfc1dbab56dfe0 Mon Sep 17 00:00:00 2001 From: Pablo de la Torre Jamardo Date: Tue, 26 Aug 2025 17:50:20 +0200 Subject: [PATCH] feat: implement final Contact API --- .../contact/CreateContactUseCase.java | 20 ++++++++++++---- .../portfolio/domain/contact/Contact.java | 12 +++++++--- .../contact/entity/ContactJpaEntity.java | 24 +++++++++++++++---- .../contact/controller/ContactController.java | 9 ++++--- .../rest/contact/dto/ContactDto.java | 11 ++++++++- .../contact/dto/CreateContactRequest.java | 10 +++++--- 6 files changed, 67 insertions(+), 19 deletions(-) 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 index cb26044..291daef 100644 --- a/application/src/main/java/com/pablotj/portfolio/application/contact/CreateContactUseCase.java +++ b/application/src/main/java/com/pablotj/portfolio/application/contact/CreateContactUseCase.java @@ -2,6 +2,8 @@ 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 { @@ -14,13 +16,23 @@ public class CreateContactUseCase { public Contact handle(Command cmd) { var contact = Contact.builder() .id(null) - .title(cmd.title()) - .description(cmd.description()) - .url(cmd.url()) + .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 title, String description, String url) { + public record Command( + String country, + String city, + String email, + String phone, + String linkedin, + String github + ) { } } \ 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 index 14807ff..40405c8 100644 --- a/domain/src/main/java/com/pablotj/portfolio/domain/contact/Contact.java +++ b/domain/src/main/java/com/pablotj/portfolio/domain/contact/Contact.java @@ -1,13 +1,19 @@ 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 title; - private final String description; - private final String url; + 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/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 index 90769d3..9324fec 100644 --- 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 @@ -6,24 +6,38 @@ 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 -@Setter +@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) - private String title; + @Email + private String email; - @Column(columnDefinition = "text") - private String description; + private String phone; - private String url; + @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/rest/contact/controller/ContactController.java b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/contact/controller/ContactController.java index d968ca4..44e41d0 100644 --- a/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/contact/controller/ContactController.java +++ b/infrastructure/src/main/java/com/pablotj/portfolio/infrastructure/rest/contact/controller/ContactController.java @@ -46,9 +46,12 @@ public class ContactController { @PostMapping public ResponseEntity create(@Valid @RequestBody CreateContactRequest request) { var cmd = new CreateContactUseCase.Command( - request.title(), - request.description(), - request.url() + request.country(), + request.city(), + request.email(), + request.phone(), + request.linkedin(), + request.github() ); var created = createUC.handle(cmd); var body = mapper.toDto(created); 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 index 89a6a37..5e4dd14 100644 --- 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 @@ -1,6 +1,15 @@ package com.pablotj.portfolio.infrastructure.rest.contact.dto; +import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; -public record ContactDto(Long id, @NotBlank String title, String description, String url) { +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 index ea9c5de..fd61f0f 100644 --- 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 @@ -1,10 +1,14 @@ package com.pablotj.portfolio.infrastructure.rest.contact.dto; +import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; public record CreateContactRequest( - @NotBlank String title, - String description, - String url + String country, + String city, + @NotBlank @Email String email, + String phone, + String linkedin, + String github ) { } \ No newline at end of file