feat: implement final Contact API

This commit is contained in:
Pablo de la Torre Jamardo 2025-08-26 17:50:20 +02:00
parent 9ff4b21dd9
commit ab40e9a497
6 changed files with 67 additions and 19 deletions

View File

@ -2,6 +2,8 @@ package com.pablotj.portfolio.application.contact;
import com.pablotj.portfolio.domain.contact.Contact; import com.pablotj.portfolio.domain.contact.Contact;
import com.pablotj.portfolio.domain.contact.port.ContactRepositoryPort; import com.pablotj.portfolio.domain.contact.port.ContactRepositoryPort;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
public class CreateContactUseCase { public class CreateContactUseCase {
@ -14,13 +16,23 @@ public class CreateContactUseCase {
public Contact handle(Command cmd) { public Contact handle(Command cmd) {
var contact = Contact.builder() var contact = Contact.builder()
.id(null) .id(null)
.title(cmd.title()) .country(cmd.country())
.description(cmd.description()) .city(cmd.city())
.url(cmd.url()) .email(cmd.email())
.phone(cmd.phone())
.linkedin(cmd.linkedin())
.github(cmd.github())
.build(); .build();
return repository.save(contact); 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
) {
} }
} }

View File

@ -1,13 +1,19 @@
package com.pablotj.portfolio.domain.contact; package com.pablotj.portfolio.domain.contact;
import jakarta.validation.constraints.Email;
import lombok.Builder; import lombok.Builder;
import lombok.Getter; import lombok.Getter;
@Getter @Getter
@Builder @Builder
public class Contact { public class Contact {
private final ContactId id; private final ContactId id;
private final String title; private final String country;
private final String description; private final String city;
private final String url; private final String email;
private final String phone;
private final String linkedin;
private final String github;
} }

View File

@ -6,24 +6,38 @@ import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType; import jakarta.persistence.GenerationType;
import jakarta.persistence.Id; import jakarta.persistence.Id;
import jakarta.persistence.Table; import jakarta.persistence.Table;
import jakarta.validation.constraints.Email;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter; import lombok.Setter;
@Entity @Entity
@Table(name = "contacts") @Table(name = "contacts")
@Getter @Getter
@Setter @NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Builder
public class ContactJpaEntity { public class ContactJpaEntity {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; private Long id;
private String country;
private String city;
@Column(nullable = false) @Column(nullable = false)
private String title; @Email
private String email;
@Column(columnDefinition = "text") private String phone;
private String description;
private String url; @Column(name = "linkedin_url")
private String linkedin;
@Column(name = "github_url")
private String github;
} }

View File

@ -46,9 +46,12 @@ public class ContactController {
@PostMapping @PostMapping
public ResponseEntity<ContactDto> create(@Valid @RequestBody CreateContactRequest request) { public ResponseEntity<ContactDto> create(@Valid @RequestBody CreateContactRequest request) {
var cmd = new CreateContactUseCase.Command( var cmd = new CreateContactUseCase.Command(
request.title(), request.country(),
request.description(), request.city(),
request.url() request.email(),
request.phone(),
request.linkedin(),
request.github()
); );
var created = createUC.handle(cmd); var created = createUC.handle(cmd);
var body = mapper.toDto(created); var body = mapper.toDto(created);

View File

@ -1,6 +1,15 @@
package com.pablotj.portfolio.infrastructure.rest.contact.dto; package com.pablotj.portfolio.infrastructure.rest.contact.dto;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank; 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
) {
} }

View File

@ -1,10 +1,14 @@
package com.pablotj.portfolio.infrastructure.rest.contact.dto; package com.pablotj.portfolio.infrastructure.rest.contact.dto;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
public record CreateContactRequest( public record CreateContactRequest(
@NotBlank String title, String country,
String description, String city,
String url @NotBlank @Email String email,
String phone,
String linkedin,
String github
) { ) {
} }