Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -146,3 +146,42 @@ docker compose up --build
| `MAX_FILE_SIZE` / `MAX_REQUEST_SIZE` | Límites upload | `50MB` |
| `LOG_LEVEL_ROOT` / `LOG_LEVEL_OUTFITLAB` | Logging | `INFO` / `DEBUG` |
| `SERVER_PORT` | Puerto interno | `8080` |

## Testing
Utilizacion de Patron Given - When - Then
## - Given: preparar datos y mocks. Ej:

private UserSubscriptionEntity givenExistingSubscriptionReturningEntity(String email, String planCode, int combinations) {
UserSubscriptionEntity entity = givenSubscriptionEntity(email, planCode, 10L, combinations);
when(userSubscriptionJpaRepository.findByUserEmail(email))
.thenReturn(Optional.of(entity));
return entity;
}
## - WHEN: ejecutar el método a probar. Ej:

private void whenFindingSubscriptionByUserEmail(String email, UserSubscriptionEntity entity) {
when(userSubscriptionJpaRepository.findByUserEmail(email)).thenReturn(Optional.of(entity));
}

## - THEN: verificar resultados o excepciones. Ej:

private void thenSubscriptionShouldHaveCombinationsUsed(UserSubscriptionModel model, int expected) {
assertThat(model).isNotNull();
assertThat(model.getCombinationsUsed()).isEqualTo(expected);
}

## - Test completo del metodo
@Test
void shouldReturnSubscriptionModelWhenEmailExists() throws SubscriptionNotFoundException {
String email = "[email protected]";
UserSubscriptionEntity entity = givenExistingSubscriptionReturningEntity(email, "BASIC", 10);

whenFindingSubscriptionByUserEmail(email, entity);

UserSubscriptionModel result = whenFindByUserEmail(email);

thenSubscriptionShouldHaveCombinationsUsed(result, 10);
verify(userSubscriptionJpaRepository).findByUserEmail(email);
}


This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.outfitlab.project.domain.interfaces.repositories;

public interface PrendaOcasionRepository {

void deleteAllPrendaOcasionByGarment(String garmentCode);
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
package com.outfitlab.project.domain.useCases.recomendations;

import com.outfitlab.project.domain.interfaces.repositories.PrendaOcacionRepository;
import com.outfitlab.project.domain.interfaces.repositories.PrendaOcasionRepository;

public class DeleteAllPrendaOcacionRelatedToGarment {

private final PrendaOcacionRepository prendaOcacionRepository;
private final PrendaOcasionRepository prendaOcacionRepository;

public DeleteAllPrendaOcacionRelatedToGarment(PrendaOcacionRepository prendaOcacionRepository){
public DeleteAllPrendaOcacionRelatedToGarment(PrendaOcasionRepository prendaOcacionRepository){
this.prendaOcacionRepository = prendaOcacionRepository;
}

public void execute(String garmentCode){
this.prendaOcacionRepository.deleteAllPrendaOcacionByGarment(garmentCode);
this.prendaOcacionRepository.deleteAllPrendaOcasionByGarment(garmentCode);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public class GarmentConfig {
@Bean
public GarmentRepository garmentRepository(GarmentJpaRepository jpaRepository, BrandJpaRepository brandJpaRepository,
ClimaJpaRepository climaJpaRepository, ColorJpaRepository colorJpaRepository,
OcacionJpaRepository ocacionJpaRepository) {
OcasionJpaRepository ocacionJpaRepository) {
return new GarmentRepositoryImpl(jpaRepository, brandJpaRepository, colorJpaRepository, climaJpaRepository, ocacionJpaRepository);
}

Expand All @@ -41,7 +41,7 @@ public DeleteAllFavoritesRelatedToGarment deleteAllFavoritesRelatedToGarment(Use
}

@Bean
public DeleteAllPrendaOcacionRelatedToGarment deleteAllPrendaOcacionRelatedToGarment(PrendaOcacionRepository prendaOcacionRepository){
public DeleteAllPrendaOcacionRelatedToGarment deleteAllPrendaOcacionRelatedToGarment(PrendaOcasionRepository prendaOcacionRepository){
return new DeleteAllPrendaOcacionRelatedToGarment(prendaOcacionRepository);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ public DeleteGarmentRecomentationsRelatedToGarment deleteGarmentRecomentationsRe
}

@Bean
public PrendaOcacionRepository prendaOcacionRepository(PrendaOcacionJpaRepository prendaOcacionJpaRepository){
return new PrendaOcacionRepositoryImpl(prendaOcacionJpaRepository);
public PrendaOcasionRepository prendaOcacionRepository(PrendaOcasionJpaRepository prendaOcacionJpaRepository){
return new PrendaOcasionRepositoryImpl(prendaOcacionJpaRepository);
}

@Bean
Expand All @@ -42,7 +42,7 @@ public CreateSugerenciasByGarmentsCode createSugerenciasByGarmentsCode(GarmentRe
}

@Bean
public DeleteAllPrendaOcacionRelatedToGarment deleteAllPrendaOcacionRelatedToGarment(PrendaOcacionRepository prendaOcacionRepository){
public DeleteAllPrendaOcacionRelatedToGarment deleteAllPrendaOcacionRelatedToGarment(PrendaOcasionRepository prendaOcacionRepository){
return new DeleteAllPrendaOcacionRelatedToGarment(prendaOcacionRepository);
}

Expand All @@ -52,8 +52,8 @@ public ColorRepository colorRepository(ColorJpaRepository colorJpaRepository){
}

@Bean
public OcacionRepository ocacionRepository(OcacionJpaRepository ocacionJpaRepository){
return new OcacionRepositoryImpl(ocacionJpaRepository);
public OcacionRepository ocacionRepository(OcasionJpaRepository ocacionJpaRepository){
return new OcasionRepositoryImpl(ocacionJpaRepository);
}

@Bean
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,10 @@ public class MarcaEntity {
private String urlSite;

public MarcaEntity(){}

public MarcaEntity(String codigoMarca, String nombre) {
this.codigoMarca = codigoMarca;
this.nombre = nombre;
}
public MarcaEntity(String codigoMarca, String nombre, String logoUrl, LocalDateTime createdAt, LocalDateTime updatedAt) {
this.codigoMarca = codigoMarca;
this.nombre = nombre;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,11 @@ public class SubscriptionEntity {
@Column(name = "has_advanced_reports", columnDefinition = "boolean default false")
private boolean hasAdvancedReports = false;

public SubscriptionEntity(String name, String planCode) {
this.name = name;
this.planCode = planCode;
}

public Long getId() {
return id;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public ColorRepositoryImpl(ColorJpaRepository colorJpaRepository) {
@Override
public List<ColorModel> findAllColores() {
List<ColorEntity> colors = this.colorJpaRepository.findAll();
if (colors.isEmpty()) throw new ColorNotFoundException("No encontramos ocaciones.");
if (colors.isEmpty()) throw new ColorNotFoundException("No encontramos ocasiones.");
return colors.stream().map(ColorEntity::convertEntityToModel)
.toList();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.outfitlab.project.infrastructure.repositories;

import com.outfitlab.project.domain.exceptions.GarmentNotFoundException;
import com.outfitlab.project.domain.interfaces.repositories.ClimaRepository;
import com.outfitlab.project.domain.interfaces.repositories.GarmentRepository;
import com.outfitlab.project.domain.model.ClimaModel;
import com.outfitlab.project.domain.model.ColorModel;
Expand All @@ -25,9 +24,9 @@ public class GarmentRepositoryImpl implements GarmentRepository {
private final BrandJpaRepository brandJpaRepository;
private final ColorJpaRepository colorJpaRepository;
private final ClimaJpaRepository climaJpaRepository;
private final OcacionJpaRepository ocacionJpaRepository;
private final OcasionJpaRepository ocacionJpaRepository;

public GarmentRepositoryImpl(GarmentJpaRepository garmentJpaRepository, BrandJpaRepository brandJpaRepository, ColorJpaRepository colorJpaRepository, ClimaJpaRepository climaJpaRepository, OcacionJpaRepository ocacionJpaRepository) {
public GarmentRepositoryImpl(GarmentJpaRepository garmentJpaRepository, BrandJpaRepository brandJpaRepository, ColorJpaRepository colorJpaRepository, ClimaJpaRepository climaJpaRepository, OcasionJpaRepository ocacionJpaRepository) {
this.garmentJpaRepository = garmentJpaRepository;
this.brandJpaRepository = brandJpaRepository;
this.colorJpaRepository = colorJpaRepository;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ private String buildRequestBody(String peticionUsuario) throws com.fasterxml.jac
return objectMapper.writeValueAsString(directRequest);
}

private String extractJsonContent(String apiResponseBody) throws Exception {
protected String extractJsonContent(String apiResponseBody) throws Exception {
Map<String, Object> responseMap = objectMapper.readValue(apiResponseBody, Map.class);

List<Map<String, Object>> candidates = (List<Map<String, Object>>) responseMap.get("candidates");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,26 +1,25 @@
package com.outfitlab.project.infrastructure.repositories;

import com.outfitlab.project.domain.exceptions.ClimaNotFoundException;
import com.outfitlab.project.domain.exceptions.OcasionNotFoundException;
import com.outfitlab.project.domain.interfaces.repositories.OcacionRepository;
import com.outfitlab.project.domain.model.OcasionModel;
import com.outfitlab.project.infrastructure.model.ClimaEntity;
import com.outfitlab.project.infrastructure.model.OcasionEntity;
import com.outfitlab.project.infrastructure.repositories.interfaces.OcacionJpaRepository;
import com.outfitlab.project.infrastructure.repositories.interfaces.OcasionJpaRepository;

import java.util.List;

public class OcacionRepositoryImpl implements OcacionRepository {
public class OcasionRepositoryImpl implements OcacionRepository {

private final OcacionJpaRepository ocacionJpaRepository;

public OcacionRepositoryImpl(OcacionJpaRepository ocacionJpaRepository) {
this.ocacionJpaRepository = ocacionJpaRepository;
private final OcasionJpaRepository ocasionJpaRepository;

public OcasionRepositoryImpl(OcasionJpaRepository ocasionJpaRepository) {
this.ocasionJpaRepository = ocasionJpaRepository;
}

@Override
public List<OcasionModel> findAllOcasiones() {
List<OcasionEntity> ocaciones = this.ocacionJpaRepository.findAll();
List<OcasionEntity> ocaciones = this.ocasionJpaRepository.findAll();
if (ocaciones.isEmpty()) throw new OcasionNotFoundException("No encontramos ocaciones.");
return ocaciones.stream().map(OcasionEntity::convertEntityToModel)
.toList();
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.outfitlab.project.infrastructure.repositories;

import com.outfitlab.project.domain.interfaces.repositories.PrendaOcasionRepository;
import com.outfitlab.project.infrastructure.repositories.interfaces.PrendaOcasionJpaRepository;

public class PrendaOcasionRepositoryImpl implements PrendaOcasionRepository {

private final PrendaOcasionJpaRepository prendaOcasionJpaRepository;

public PrendaOcasionRepositoryImpl(PrendaOcasionJpaRepository prendaOcasionJpaRepository){
this.prendaOcasionJpaRepository = prendaOcasionJpaRepository;
}

@Override
public void deleteAllPrendaOcasionByGarment(String garmentCode) {
this.prendaOcasionJpaRepository.deleteAllByGarmentCode(garmentCode);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ private void checkIfExtensionIsValid(String extension) {
}
}

private MultipartFile convertImageUrlToMultipartFile(String imageUrl) throws ErrorUploadImageToTripoException {
protected MultipartFile convertImageUrlToMultipartFile(String imageUrl) throws ErrorUploadImageToTripoException {
InputStream inputStream = null;
try {
URL url = new URL(imageUrl);
Expand Down Expand Up @@ -233,7 +233,7 @@ private Map<String, Object> getHttpBodyImageToModelTripo(Map<String, Object> upl
return bodyMap;
}

private HttpHeaders getHttpHeaders(MediaType type) {
protected HttpHeaders getHttpHeaders(MediaType type) {
HttpHeaders taskHeaders = new HttpHeaders();
taskHeaders.setContentType(type);
taskHeaders.setBearerAuth(tripoApiKey);
Expand Down Expand Up @@ -267,7 +267,7 @@ private static void checkIfResponseIsOk(ResponseEntity<String> response) throws
}
}

private ResponseEntity<String> generateRequestToUploadImageToTripo(MultipartFile imageFile, String originalFilename) throws ErroBytesException {
protected ResponseEntity<String> generateRequestToUploadImageToTripo(MultipartFile imageFile, String originalFilename) throws ErroBytesException {
MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
body.add("file", tryGetByteArrayResourceFromImage(imageFile, originalFilename));
HttpHeaders headers = getHttpHeaders(MediaType.MULTIPART_FORM_DATA);
Expand All @@ -287,7 +287,7 @@ private String tryGetImageToken(ResponseEntity<String> response) throws ErrorRea
return imageToken;
}

private ResponseEntity<String> requestTripoTaskStatus(String taskId, HttpEntity<Void> entityWithTaskHeaders) {
protected ResponseEntity<String> requestTripoTaskStatus(String taskId, HttpEntity<Void> entityWithTaskHeaders) {
return restTemplate.exchange(
taskUrl + "/" + taskId,
HttpMethod.GET,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,13 @@ public class UploadImageRepositoryImpl implements com.outfitlab.project.domain.i
@Value("${AWS_BUCKET_NAME}")
private String bucketName;

public UploadImageRepositoryImpl(S3Client s3Client, String region, String bucketName) {
this.s3Client = s3Client;
this.region = region;
this.bucketName = bucketName;
}


@Override
public String uploadFile(MultipartFile file, String folder) {
try {
Expand Down Expand Up @@ -73,4 +80,8 @@ private String extractKeyFromUrl(String url) {
if (index == -1) {throw new IllegalArgumentException("URL de S3 inválida: " + url);}
return url.substring(index + ".amazonaws.com/".length());
}


public void setRegion(String region) { this.region = region; }
public void setBucketName(String bucketName) { this.bucketName = bucketName; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import java.util.Optional;

public interface OcacionJpaRepository extends JpaRepository<OcasionEntity, Long> {
public interface OcasionJpaRepository extends JpaRepository<OcasionEntity, Long> {
Optional<OcasionEntity> findByNombre(String nombre);
Optional<OcasionEntity> findOcasionEntityByNombre(String nombre);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import org.springframework.data.repository.query.Param;
import org.springframework.transaction.annotation.Transactional;

public interface PrendaOcacionJpaRepository extends JpaRepository<PrendaOcasionEntity, Long> {
public interface PrendaOcasionJpaRepository extends JpaRepository<PrendaOcasionEntity, Long> {
@Transactional
@Modifying
@Query("""
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.outfitlab.project.presentation.dto;

import java.util.List;
import lombok.AllArgsConstructor;

import java.util.List;
@AllArgsConstructor
public class StatusResponse {
private String id;
private String status;
Expand Down
Loading
Loading