diff --git a/backend/pom.xml b/backend/pom.xml index 3594ce4..5bcbe95 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -120,6 +120,11 @@ ${jsonwebtoken.version} runtime + + software.amazon.awssdk + s3 + 2.20.26 + diff --git a/backend/src/main/java/com/amigoscode/Main.java b/backend/src/main/java/com/amigoscode/Main.java index 9efcc7b..3952b81 100644 --- a/backend/src/main/java/com/amigoscode/Main.java +++ b/backend/src/main/java/com/amigoscode/Main.java @@ -3,6 +3,8 @@ import com.amigoscode.customer.Customer; import com.amigoscode.customer.CustomerRepository; import com.amigoscode.customer.Gender; +import com.amigoscode.s3.S3Buckets; +import com.amigoscode.s3.S3Service; import com.github.javafaker.Faker; import com.github.javafaker.Name; import org.springframework.boot.CommandLineRunner; @@ -24,25 +26,45 @@ public static void main(String[] args) { @Bean CommandLineRunner runner( CustomerRepository customerRepository, - PasswordEncoder passwordEncoder) { + PasswordEncoder passwordEncoder) + { return args -> { - var faker = new Faker(); - Random random = new Random(); - Name name = faker.name(); - String firstName = name.firstName(); - String lastName = name.lastName(); - int age = random.nextInt(16, 99); - Gender gender = age % 2 == 0 ? Gender.MALE : Gender.FEMALE; - String email = firstName.toLowerCase() + "." + lastName.toLowerCase() + "@amigoscode.com"; - Customer customer = new Customer( - firstName + " " + lastName, - email, - passwordEncoder.encode("password"), - age, - gender); - customerRepository.save(customer); - System.out.println(email); + createRandomCustomer(customerRepository, passwordEncoder); + //testBucketUploadandDownload(s3Service, s3Buckets); }; } + private static void testBucketUploadandDownload(S3Service s3Service, S3Buckets s3Buckets) { + s3Service.putObject( + s3Buckets.getCustomer(), + "foo", + "Hello World".getBytes()); + + byte[] obj = s3Service.getObject( + s3Buckets.getCustomer(), + "foo" + ); + + System.out.println("Hooray: " + new String(obj)); + } + + private static void createRandomCustomer(CustomerRepository customerRepository, PasswordEncoder passwordEncoder) { + var faker = new Faker(); + Random random = new Random(); + Name name = faker.name(); + String firstName = name.firstName(); + String lastName = name.lastName(); + int age = random.nextInt(16, 99); + Gender gender = age % 2 == 0 ? Gender.MALE : Gender.FEMALE; + String email = firstName.toLowerCase() + "." + lastName.toLowerCase() + "@amigoscode.com"; + Customer customer = new Customer( + firstName + " " + lastName, + email, + passwordEncoder.encode("password"), + age, + gender); + customerRepository.save(customer); + System.out.println(email); + } + } diff --git a/backend/src/main/java/com/amigoscode/customer/Customer.java b/backend/src/main/java/com/amigoscode/customer/Customer.java index 05eccf8..ef924c0 100644 --- a/backend/src/main/java/com/amigoscode/customer/Customer.java +++ b/backend/src/main/java/com/amigoscode/customer/Customer.java @@ -4,6 +4,7 @@ import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; +import software.amazon.awssdk.services.s3.endpoints.internal.Value; import java.util.Arrays; import java.util.Collection; @@ -17,6 +18,10 @@ @UniqueConstraint( name = "customer_email_unique", columnNames = "email" + ), + @UniqueConstraint( + name = "profile_image_id_unique", + columnNames = "profileImageId" ) } ) @@ -57,6 +62,11 @@ public class Customer implements UserDetails { ) private String password; + @Column( + unique = true + ) + private String profileImageId; + public Customer() { } @@ -86,6 +96,17 @@ public Customer(String name, this.gender = gender; } + public Customer(Integer id, + String name, + String email, + String password, + Integer age, + Gender gender, + String profileImageId) { + this(id, name, email, password, age, gender); + this.profileImageId = profileImageId; + } + public Integer getId() { return id; } @@ -126,28 +147,12 @@ public void setGender(Gender gender) { this.gender = gender; } - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Customer customer = (Customer) o; - return Objects.equals(id, customer.id) && Objects.equals(name, customer.name) && Objects.equals(email, customer.email) && Objects.equals(age, customer.age) && gender == customer.gender; + public String getProfileImageId(){ + return profileImageId; } - @Override - public int hashCode() { - return Objects.hash(id, name, email, age, gender); - } - - @Override - public String toString() { - return "Customer{" + - "id=" + id + - ", name='" + name + '\'' + - ", email='" + email + '\'' + - ", age=" + age + - ", gender=" + gender + - '}'; + public void setProfileImageId(String profileImageId) { + this.profileImageId = profileImageId; } @Override @@ -184,4 +189,32 @@ public boolean isCredentialsNonExpired() { public boolean isEnabled() { return true; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Customer customer = (Customer) o; + return Objects.equals(id, customer.id) && Objects.equals(name, customer.name) && Objects.equals(email, customer.email) && Objects.equals(age, customer.age) && gender == customer.gender && Objects.equals(password, customer.password) && Objects.equals(profileImageId, customer.profileImageId); + } + + @Override + public int hashCode() { + return Objects.hash(id, name, email, age, gender, password, profileImageId); + } + + @Override + public String toString() { + return "Customer{" + + "id=" + id + + ", name='" + name + '\'' + + ", email='" + email + '\'' + + ", age=" + age + + ", gender=" + gender + + ", password='" + password + '\'' + + ", profileImageId='" + profileImageId + '\'' + + '}'; + } } + + diff --git a/backend/src/main/java/com/amigoscode/customer/CustomerController.java b/backend/src/main/java/com/amigoscode/customer/CustomerController.java index a5abe1d..3dd05e0 100644 --- a/backend/src/main/java/com/amigoscode/customer/CustomerController.java +++ b/backend/src/main/java/com/amigoscode/customer/CustomerController.java @@ -2,9 +2,12 @@ import com.amigoscode.jwt.JWTUtil; import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; import java.util.List; @RestController @@ -54,4 +57,20 @@ public void updateCustomer( customerService.updateCustomer(customerId, updateRequest); } + @PostMapping( + value = "{customerId}/profile-image", + consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + + public void uploadCustomerProfileImage( + @PathVariable("customerId") Integer customerID, + @RequestParam("file") MultipartFile file) throws IOException { + customerService.uploadCustomerImage(customerID, file); + } + + + @GetMapping("{customerId}/profile-image") + public byte[] getCustomerProfileImage( + @PathVariable("customerId") Integer customerId) { + return customerService.getCustomerProfileImage(customerId); + } } diff --git a/backend/src/main/java/com/amigoscode/customer/CustomerDTO.java b/backend/src/main/java/com/amigoscode/customer/CustomerDTO.java index 21b0a2a..63bd4e6 100644 --- a/backend/src/main/java/com/amigoscode/customer/CustomerDTO.java +++ b/backend/src/main/java/com/amigoscode/customer/CustomerDTO.java @@ -9,7 +9,7 @@ public record CustomerDTO ( Gender gender, Integer age, List roles, - String username -){ + String username, + String profileImageId){ } diff --git a/backend/src/main/java/com/amigoscode/customer/CustomerDTOMapper.java b/backend/src/main/java/com/amigoscode/customer/CustomerDTOMapper.java index b01d52d..9e122f8 100644 --- a/backend/src/main/java/com/amigoscode/customer/CustomerDTOMapper.java +++ b/backend/src/main/java/com/amigoscode/customer/CustomerDTOMapper.java @@ -20,7 +20,8 @@ public CustomerDTO apply(Customer customer) { .stream() .map(GrantedAuthority::getAuthority) .collect(Collectors.toList()), - customer.getUsername() + customer.getUsername(), + customer.getProfileImageId() ); } } diff --git a/backend/src/main/java/com/amigoscode/customer/CustomerDao.java b/backend/src/main/java/com/amigoscode/customer/CustomerDao.java index a0bda72..fdd7836 100644 --- a/backend/src/main/java/com/amigoscode/customer/CustomerDao.java +++ b/backend/src/main/java/com/amigoscode/customer/CustomerDao.java @@ -5,11 +5,12 @@ public interface CustomerDao { List selectAllCustomers(); - Optional selectCustomerById(Integer id); + Optional selectCustomerById(Integer customerId); void insertCustomer(Customer customer); boolean existsCustomerWithEmail(String email); - boolean existsCustomerById(Integer id); + boolean existsCustomerById(Integer customerId); void deleteCustomerById(Integer customerId); void updateCustomer(Customer update); Optional selectUserByEmail(String email); + void updateCustomerProfileImageId(String profileImageId, Integer customerId); } diff --git a/backend/src/main/java/com/amigoscode/customer/CustomerJDBCDataAccessService.java b/backend/src/main/java/com/amigoscode/customer/CustomerJDBCDataAccessService.java index 3dffcd3..77a5264 100644 --- a/backend/src/main/java/com/amigoscode/customer/CustomerJDBCDataAccessService.java +++ b/backend/src/main/java/com/amigoscode/customer/CustomerJDBCDataAccessService.java @@ -21,7 +21,7 @@ public CustomerJDBCDataAccessService(JdbcTemplate jdbcTemplate, @Override public List selectAllCustomers() { var sql = """ - SELECT id, name, email, password, age, gender + SELECT id, name, email, password, age, gender, profile_image_id FROM customer LIMIT 1000 """; @@ -32,7 +32,7 @@ public List selectAllCustomers() { @Override public Optional selectCustomerById(Integer id) { var sql = """ - SELECT id, name, email, password, age, gender + SELECT id, name, email, password, age, gender, profile_image_id FROM customer WHERE id = ? """; @@ -125,7 +125,7 @@ public void updateCustomer(Customer update) { @Override public Optional selectUserByEmail(String email) { var sql = """ - SELECT id, name, email, password, age, gender + SELECT id, name, email, password, age, gender, profile_image_id FROM customer WHERE email = ? """; @@ -133,4 +133,15 @@ public Optional selectUserByEmail(String email) { .stream() .findFirst(); } + + @Override + public void updateCustomerProfileImageId(String profileImageId, Integer customerId) { + var sql = """ + UPDATE customer + SET profile_image_id = ? + WHERE id= ? + """; + jdbcTemplate.update(sql, profileImageId, customerId); + + } } diff --git a/backend/src/main/java/com/amigoscode/customer/CustomerJPADataAccessService.java b/backend/src/main/java/com/amigoscode/customer/CustomerJPADataAccessService.java index 7c08e70..80b1c08 100644 --- a/backend/src/main/java/com/amigoscode/customer/CustomerJPADataAccessService.java +++ b/backend/src/main/java/com/amigoscode/customer/CustomerJPADataAccessService.java @@ -57,4 +57,9 @@ public Optional selectUserByEmail(String email) { return customerRepository.findCustomerByEmail(email); } + @Override + public void updateCustomerProfileImageId(String profileImageId, Integer customerId) { + customerRepository.updateProfileImageId(profileImageId, customerId); + } + } diff --git a/backend/src/main/java/com/amigoscode/customer/CustomerListDataAccessService.java b/backend/src/main/java/com/amigoscode/customer/CustomerListDataAccessService.java index cbc138d..d2c6a36 100644 --- a/backend/src/main/java/com/amigoscode/customer/CustomerListDataAccessService.java +++ b/backend/src/main/java/com/amigoscode/customer/CustomerListDataAccessService.java @@ -83,4 +83,9 @@ public Optional selectUserByEmail(String email) { .findFirst(); } + @Override + public void updateCustomerProfileImageId(String profileImageId, Integer customerId) { + + } + } diff --git a/backend/src/main/java/com/amigoscode/customer/CustomerRepository.java b/backend/src/main/java/com/amigoscode/customer/CustomerRepository.java index 41e54be..6020f2e 100644 --- a/backend/src/main/java/com/amigoscode/customer/CustomerRepository.java +++ b/backend/src/main/java/com/amigoscode/customer/CustomerRepository.java @@ -1,6 +1,8 @@ package com.amigoscode.customer; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; import java.util.Optional; @@ -10,4 +12,9 @@ public interface CustomerRepository boolean existsCustomerByEmail(String email); boolean existsCustomerById(Integer id); Optional findCustomerByEmail(String email); + + @Modifying + @Query("UPDATE Customer c SET c.profileImageId = ?1 WHERE c.id = ?2") + int updateProfileImageId(String profileImageId, Integer customerId); + } diff --git a/backend/src/main/java/com/amigoscode/customer/CustomerRowMapper.java b/backend/src/main/java/com/amigoscode/customer/CustomerRowMapper.java index c004b54..86317ee 100644 --- a/backend/src/main/java/com/amigoscode/customer/CustomerRowMapper.java +++ b/backend/src/main/java/com/amigoscode/customer/CustomerRowMapper.java @@ -16,6 +16,7 @@ public Customer mapRow(ResultSet rs, int rowNum) throws SQLException { rs.getString("email"), rs.getString("password"), rs.getInt("age"), - Gender.valueOf(rs.getString("gender"))); + Gender.valueOf(rs.getString("gender")), + rs.getString(("profile_image_id"))); } } diff --git a/backend/src/main/java/com/amigoscode/customer/CustomerService.java b/backend/src/main/java/com/amigoscode/customer/CustomerService.java index 05ecfa2..075d09c 100644 --- a/backend/src/main/java/com/amigoscode/customer/CustomerService.java +++ b/backend/src/main/java/com/amigoscode/customer/CustomerService.java @@ -3,11 +3,16 @@ import com.amigoscode.exception.DuplicateResourceException; import com.amigoscode.exception.RequestValidationException; import com.amigoscode.exception.ResourceNotFoundException; +import com.amigoscode.s3.S3Buckets; +import com.amigoscode.s3.S3Service; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; import java.util.List; +import java.util.UUID; import java.util.stream.Collectors; @Service @@ -16,13 +21,19 @@ public class CustomerService { private final CustomerDao customerDao; private final CustomerDTOMapper customerDTOMapper; private final PasswordEncoder passwordEncoder; + private final S3Service s3Service; + private final S3Buckets s3Buckets; + public CustomerService(@Qualifier("jdbc") CustomerDao customerDao, CustomerDTOMapper customerDTOMapper, - PasswordEncoder passwordEncoder) { + PasswordEncoder passwordEncoder, + S3Service s3Service, S3Buckets s3Buckets) { this.customerDao = customerDao; this.customerDTOMapper = customerDTOMapper; this.passwordEncoder = passwordEncoder; + this.s3Service = s3Service; + this.s3Buckets = s3Buckets; } public List getAllCustomers() { @@ -61,13 +72,17 @@ public void addCustomer(CustomerRegistrationRequest customerRegistrationRequest) } public void deleteCustomerById(Integer customerId) { + checkIfCusomterExistsorThrow(customerId); + + customerDao.deleteCustomerById(customerId); + } + + private void checkIfCusomterExistsorThrow(Integer customerId) { if (!customerDao.existsCustomerById(customerId)) { throw new ResourceNotFoundException( "customer with id [%s] not found".formatted(customerId) ); } - - customerDao.deleteCustomerById(customerId); } public void updateCustomer(Integer customerId, @@ -101,10 +116,44 @@ public void updateCustomer(Integer customerId, } if (!changes) { - throw new RequestValidationException("no data changes found"); + throw new RequestValidationException("no data changes found"); } customerDao.updateCustomer(customer); } + + public void uploadCustomerImage(Integer customerID, MultipartFile file) throws IOException { + checkIfCusomterExistsorThrow(customerID); + String profileImageId = UUID.randomUUID().toString(); + + s3Service.putObject(s3Buckets.getCustomer(), + "profile-images/%s/%s".formatted(customerID, profileImageId ), + file.getBytes()); + //TODO: Store profile imageID to DB + + customerDao.updateCustomerProfileImageId(profileImageId, customerID); + + } + + public byte[] getCustomerProfileImage(Integer customerId) { + var customer = customerDao.selectCustomerById(customerId) + .map( customerDTOMapper) + .orElseThrow(() -> new ResourceNotFoundException( + " customer with id [%s] not found".formatted(customerId) + )); + + //TODO: check if profielImageId is empty or null + if (customer.profileImageId().isEmpty()) { + throw new ResourceNotFoundException( + " customer with id [%s] profile image not found".formatted(customerId) + ); + } + //String profileImageId = "TODO"; + byte[] profileImage = s3Service.getObject(s3Buckets.getCustomer(), + "profile-images/%s/%s".formatted(customerId, customer.profileImageId())); + + return profileImage; + + } } diff --git a/backend/src/main/java/com/amigoscode/s3/S3Buckets.java b/backend/src/main/java/com/amigoscode/s3/S3Buckets.java new file mode 100644 index 0000000..c6c079e --- /dev/null +++ b/backend/src/main/java/com/amigoscode/s3/S3Buckets.java @@ -0,0 +1,19 @@ +package com.amigoscode.s3; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; +@Configuration +@ConfigurationProperties(prefix = "aws.s3.buckets") //refers to the application.yml file + + +public class S3Buckets { + private String customer; + + public String getCustomer(){ + return customer; + } + public void setCustomer(String customer){ + this.customer = customer; + } + } + diff --git a/backend/src/main/java/com/amigoscode/s3/S3Config.java b/backend/src/main/java/com/amigoscode/s3/S3Config.java new file mode 100644 index 0000000..d4fdf65 --- /dev/null +++ b/backend/src/main/java/com/amigoscode/s3/S3Config.java @@ -0,0 +1,23 @@ +package com.amigoscode.s3; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.s3.S3Client; + +@Configuration +public class S3Config { + + @Value("${aws.region}") + private String awsregion; + + @Bean + public S3Client s3Client() { + S3Client client = S3Client.builder() + .region(Region.of(awsregion)) + .build(); + return client; + } + +} diff --git a/backend/src/main/java/com/amigoscode/s3/S3Service.java b/backend/src/main/java/com/amigoscode/s3/S3Service.java new file mode 100644 index 0000000..d1b2009 --- /dev/null +++ b/backend/src/main/java/com/amigoscode/s3/S3Service.java @@ -0,0 +1,45 @@ +package com.amigoscode.s3; + +import com.fasterxml.jackson.core.io.IOContext; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Service; +import software.amazon.awssdk.core.ResponseInputStream; +import software.amazon.awssdk.core.sync.RequestBody; +import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.model.GetObjectRequest; +import software.amazon.awssdk.services.s3.model.GetObjectResponse; +import software.amazon.awssdk.services.s3.model.PutObjectRequest; + +import java.io.IOException; +@Service +public class S3Service { + private final S3Client s3Client; + + public S3Service(S3Client s3Client) { + this.s3Client = s3Client; + } + public void putObject(String bucketName, String key, byte[] file) { + PutObjectRequest objectRequest = PutObjectRequest.builder() + .bucket(bucketName) + .key(key) + .build(); + s3Client.putObject(objectRequest, RequestBody.fromBytes(file)); + } + + public byte[] getObject(String bucketName, String key) { + GetObjectRequest getObjectRequest = GetObjectRequest.builder() + .bucket(bucketName) + .key(key) + .build(); + + ResponseInputStream res = s3Client.getObject(getObjectRequest); + try { + byte[] bytes = res.readAllBytes(); + return bytes; + } catch (IOException e){ + throw new RuntimeException(e); + } + + } + +} diff --git a/backend/src/main/resources/application.yml b/backend/src/main/resources/application.yml index d3fbbe6..f691e0e 100644 --- a/backend/src/main/resources/application.yml +++ b/backend/src/main/resources/application.yml @@ -9,6 +9,12 @@ cors: allowed-headers: "*" exposed-headers: "*" +aws: + region: us-east-1 + s3: + buckets: + customer: fullstack-amgiocode-customer-test + management: endpoints: web: diff --git a/backend/src/main/resources/db/migration/V2__Add_Customer_Profile_Image.sql b/backend/src/main/resources/db/migration/V2__Add_Customer_Profile_Image.sql new file mode 100644 index 0000000..02a40d5 --- /dev/null +++ b/backend/src/main/resources/db/migration/V2__Add_Customer_Profile_Image.sql @@ -0,0 +1,6 @@ +ALTER TABLE customer +ADD COLUMN profile_image_id VARCHAR(36); + +ALTER TABLE customer +ADD CONSTRAINT profile_image_id_unique + UNIQUE (profile_image_id); diff --git a/backend/src/test/java/com/amigoscode/customer/CustomerRowMapperTest.java b/backend/src/test/java/com/amigoscode/customer/CustomerRowMapperTest.java index 81fd38f..c565978 100644 --- a/backend/src/test/java/com/amigoscode/customer/CustomerRowMapperTest.java +++ b/backend/src/test/java/com/amigoscode/customer/CustomerRowMapperTest.java @@ -22,14 +22,21 @@ void mapRow() throws SQLException { when(resultSet.getString("name")).thenReturn("Jamila"); when(resultSet.getString("email")).thenReturn("jamila@gmail.com"); when(resultSet.getString("gender")).thenReturn("FEMALE"); + when(resultSet.getString("password")).thenReturn("password"); + when(resultSet.getString("profile_image_id")).thenReturn("22222"); + // When Customer actual = customerRowMapper.mapRow(resultSet, 1); // Then Customer expected = new Customer( - 1, "Jamila", "jamila@gmail.com", "password", 19, - Gender.FEMALE); + 1, + "Jamila", + "jamila@gmail.com", + "password", 19, + Gender.FEMALE, + "22222"); assertThat(actual).isEqualTo(expected); } } \ No newline at end of file diff --git a/backend/src/test/java/com/amigoscode/customer/CustomerServiceTest.java b/backend/src/test/java/com/amigoscode/customer/CustomerServiceTest.java index 87190c4..249d674 100644 --- a/backend/src/test/java/com/amigoscode/customer/CustomerServiceTest.java +++ b/backend/src/test/java/com/amigoscode/customer/CustomerServiceTest.java @@ -3,6 +3,8 @@ import com.amigoscode.exception.DuplicateResourceException; import com.amigoscode.exception.RequestValidationException; import com.amigoscode.exception.ResourceNotFoundException; +import com.amigoscode.s3.S3Buckets; +import com.amigoscode.s3.S3Service; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -24,12 +26,22 @@ class CustomerServiceTest { private CustomerDao customerDao; @Mock private PasswordEncoder passwordEncoder; + @Mock + private S3Service s3Service; + @Mock + private S3Buckets s3Buckets; + private CustomerService underTest; private final CustomerDTOMapper customerDTOMapper = new CustomerDTOMapper(); @BeforeEach void setUp() { - underTest = new CustomerService(customerDao, customerDTOMapper, passwordEncoder); + underTest = new CustomerService( + customerDao, + customerDTOMapper, + passwordEncoder, + s3Service, + s3Buckets ); } @Test diff --git a/backend/src/test/java/com/amigoscode/journey/CustomerIT.java b/backend/src/test/java/com/amigoscode/journey/CustomerIT.java index 0770f4e..f7c4f21 100644 --- a/backend/src/test/java/com/amigoscode/journey/CustomerIT.java +++ b/backend/src/test/java/com/amigoscode/journey/CustomerIT.java @@ -84,7 +84,8 @@ void canRegisterCustomer() { gender, age, List.of("ROLE_USER"), - email + email, + null ); assertThat(allCustomers).contains(expectedCustomer); @@ -266,7 +267,7 @@ void canUpdateCustomer() { .getResponseBody(); CustomerDTO expected = new CustomerDTO( - id, newName, email, gender, age, List.of("ROLE_USER"), email + id, newName, email, gender, age, List.of("ROLE_USER"), email, null ); assertThat(updatedCustomer).isEqualTo(expected); diff --git a/docker-compose.yml b/docker-compose.yml index 56e9949..3f22a59 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,30 +13,30 @@ services: networks: - db restart: unless-stopped - amigoscode-api: - container_name: amigoscode-api - image: amigoscode/amigoscode-api - environment: - SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/customer - ports: - - "8088:8080" - networks: - - db - depends_on: - - db - restart: unless-stopped - amigoscode-react: - container_name: amigoscode-react - image: amigoscode/amigoscode-react - build: - context: frontend/react - args: - api_base_url: http://localhost:8088 - ports: - - "3000:5173" - depends_on: - - amigoscode-api - restart: unless-stopped +# amigoscode-api: +# container_name: amigoscode-api +# image: amigoscode/amigoscode-api +# environment: +# SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/customer +# ports: +# - "8088:8080" +# networks: +# - db +# depends_on: +# - db +# restart: unless-stopped +# amigoscode-react: +# container_name: amigoscode-react +# image: amigoscode/amigoscode-react +# build: +# context: frontend/react +# args: +# api_base_url: http://localhost:8088 +# ports: +# - "3000:5173" +# depends_on: +# - amigoscode-api +# restart: unless-stopped networks: db: