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

View File

@ -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;
}

View File

@ -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;
}

View File

@ -46,9 +46,12 @@ public class ContactController {
@PostMapping
public ResponseEntity<ContactDto> 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);

View File

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

View File

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