perf(recipe): cambio a MongoDB

parent f3a3de77
Showing with 86 additions and 115 deletions
package com.example.apprecetas.recipe.application;
public interface DeleteRecipeUseCase {
void delete(Long id);
void delete(String id);
}
......@@ -5,7 +5,7 @@ import com.example.apprecetas.recipe.domain.entity.Recipe;
import java.util.List;
public interface ReadRecipeUseCase {
Recipe readById(Long id);
Recipe readById(String id);
List<Recipe> readAll();
}
......@@ -3,5 +3,5 @@ package com.example.apprecetas.recipe.application;
import com.example.apprecetas.recipe.domain.entity.Recipe;
public interface UpdateRecipeUseCase {
Recipe update(Long id, Recipe recipe);
Recipe update(String id, Recipe recipe);
}
......@@ -4,7 +4,7 @@ import com.example.apprecetas.recipe.application.CreateRecipeUseCase;
import com.example.apprecetas.recipe.domain.entity.Recipe;
import com.example.apprecetas.recipe.domain.repository.CreateRecipeRepository;
import com.example.apprecetas.recipe.infrastructure.mapper.RecipeMapper;
import com.example.apprecetas.recipe.infrastructure.repository.jpa.RecipeJpa;
import com.example.apprecetas.recipe.infrastructure.repository.mongodb.RecipeDocument;
import lombok.RequiredArgsConstructor;
import org.mapstruct.factory.Mappers;
import org.springframework.stereotype.Service;
......@@ -19,16 +19,16 @@ public class CreateRecipeUseCaseImpl implements CreateRecipeUseCase {
@Override
public Recipe create(Recipe recipe) {
RecipeJpa recipeJpa = mapper.mapJpa(recipe);
RecipeDocument recipeDocument = mapper.mapDocument(recipe);
recipeJpa.getSteps().forEach(step -> {
step.setRecipe(recipeJpa);
});
recipeJpa.getIngredients().forEach(ingredient -> {
ingredient.setRecipe(recipeJpa);
/*recipeDocument.getSteps().forEach(step -> {
step.setRecipe(recipeDocument);
});
recipeDocument.getIngredients().forEach(ingredient -> {
ingredient.setRecipe(recipeDocument);
});*/
RecipeJpa savedRecipe = repository.create(recipeJpa);
return mapper.mapJpa(savedRecipe);
RecipeDocument savedRecipe = repository.create(recipeDocument);
return mapper.mapDocument(savedRecipe);
}
}
......@@ -4,7 +4,7 @@ import com.example.apprecetas.exception.EntityNotFoundException;
import com.example.apprecetas.recipe.application.DeleteRecipeUseCase;
import com.example.apprecetas.recipe.domain.repository.DeleteRecipeRepository;
import com.example.apprecetas.recipe.domain.repository.ReadRecipeRepository;
import com.example.apprecetas.recipe.infrastructure.repository.jpa.RecipeJpa;
import com.example.apprecetas.recipe.infrastructure.repository.mongodb.RecipeDocument;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
......@@ -16,9 +16,9 @@ public class DeleteRecipeUseCaseImpl implements DeleteRecipeUseCase {
private final ReadRecipeRepository readRepository;
@Override
public void delete(Long id) {
RecipeJpa recipeJpa = readRepository.readById(id)
public void delete(String id) {
RecipeDocument recipeDocument = readRepository.readById(id)
.orElseThrow(() -> new EntityNotFoundException("La receta con id " + id + " no existe"));
deleteRepository.delete(recipeJpa);
deleteRepository.delete(recipeDocument);
}
}
......@@ -5,7 +5,7 @@ import com.example.apprecetas.recipe.application.ReadRecipeUseCase;
import com.example.apprecetas.recipe.domain.entity.Recipe;
import com.example.apprecetas.recipe.domain.repository.ReadRecipeRepository;
import com.example.apprecetas.recipe.infrastructure.mapper.RecipeMapper;
import com.example.apprecetas.recipe.infrastructure.repository.jpa.RecipeJpa;
import com.example.apprecetas.recipe.infrastructure.repository.mongodb.RecipeDocument;
import lombok.RequiredArgsConstructor;
import org.mapstruct.factory.Mappers;
import org.springframework.stereotype.Service;
......@@ -21,16 +21,16 @@ public class ReadRecipeUseCaseImpl implements ReadRecipeUseCase {
private final RecipeMapper mapper = Mappers.getMapper(RecipeMapper.class);
@Override
public Recipe readById(Long id) {
RecipeJpa recipeJpa = repository.readById(id)
public Recipe readById(String id) {
RecipeDocument recipeDocument = repository.readById(id)
.orElseThrow(() -> new EntityNotFoundException("La receta con id " + id + " no existe"));
return mapper.mapJpa(recipeJpa);
return mapper.mapDocument(recipeDocument);
}
@Override
public List<Recipe> readAll() {
return repository.readAll().stream()
.map(mapper::mapJpa)
.map(mapper::mapDocument)
.toList();
}
}
......@@ -4,7 +4,7 @@ import com.example.apprecetas.recipe.application.UpdateRecipeUseCase;
import com.example.apprecetas.recipe.domain.entity.Recipe;
import com.example.apprecetas.recipe.domain.repository.UpdateRecipeRepository;
import com.example.apprecetas.recipe.infrastructure.mapper.RecipeMapper;
import com.example.apprecetas.recipe.infrastructure.repository.jpa.RecipeJpa;
import com.example.apprecetas.recipe.infrastructure.repository.mongodb.RecipeDocument;
import lombok.RequiredArgsConstructor;
import org.mapstruct.factory.Mappers;
import org.springframework.stereotype.Service;
......@@ -18,9 +18,9 @@ public class UpdateRecipeUseCaseImpl implements UpdateRecipeUseCase {
private final RecipeMapper mapper = Mappers.getMapper(RecipeMapper.class);
@Override
public Recipe update(Long id, Recipe recipe) {
RecipeJpa recipeJpa = mapper.mapJpa(recipe);
RecipeJpa updatedRecipe = repository.upadte(id, recipeJpa);
return mapper.mapJpa(updatedRecipe);
public Recipe update(String id, Recipe recipe) {
RecipeDocument recipeDocument = mapper.mapDocument(recipe);
RecipeDocument updatedRecipe = repository.upadte(id, recipeDocument);
return mapper.mapDocument(updatedRecipe);
}
}
......@@ -11,7 +11,7 @@ import java.util.Set;
@NoArgsConstructor
public class Recipe {
private Long id;
private String id;
private String name;
private String description;
private String picture;
......
package com.example.apprecetas.recipe.domain.repository;
import com.example.apprecetas.recipe.infrastructure.repository.jpa.RecipeJpa;
import com.example.apprecetas.recipe.infrastructure.repository.mongodb.RecipeDocument;
public interface CreateRecipeRepository {
RecipeJpa create(RecipeJpa recipeJpa);
RecipeDocument create(RecipeDocument recipeDocument);
}
package com.example.apprecetas.recipe.domain.repository;
import com.example.apprecetas.recipe.infrastructure.repository.jpa.RecipeJpa;
import com.example.apprecetas.recipe.infrastructure.repository.mongodb.RecipeDocument;
public interface DeleteRecipeRepository {
void delete(RecipeJpa recipeJpa);
void delete(RecipeDocument recipeDocument);
}
package com.example.apprecetas.recipe.domain.repository;
import com.example.apprecetas.recipe.infrastructure.repository.jpa.RecipeJpa;
import com.example.apprecetas.recipe.infrastructure.repository.mongodb.RecipeDocument;
import java.util.List;
import java.util.Optional;
public interface ReadRecipeRepository {
Optional<RecipeJpa> readById(Long id);
Optional<RecipeDocument> readById(String id);
List<RecipeJpa> readAll();
List<RecipeDocument> readAll();
}
package com.example.apprecetas.recipe.domain.repository;
import com.example.apprecetas.recipe.infrastructure.repository.jpa.RecipeJpa;
import com.example.apprecetas.recipe.infrastructure.repository.mongodb.RecipeDocument;
public interface UpdateRecipeRepository {
RecipeJpa upadte(Long id, RecipeJpa recipeJpa);
RecipeDocument upadte(String id, RecipeDocument recipeDocument);
}
......@@ -16,7 +16,7 @@ public class DeleteRecipeController {
private final DeleteRecipeUseCase service;
@DeleteMapping("/{id}")
public ResponseEntity<String> delete(@PathVariable Long id) {
public ResponseEntity<String> delete(@PathVariable String id) {
service.delete(id);
return ResponseEntity.ok().body("La receta con id " + id + " se ha eliminado correctamente.");
}
......
......@@ -23,7 +23,7 @@ public class ReadRecipeController {
private final RecipeMapper mapper = Mappers.getMapper(RecipeMapper.class);
@GetMapping("/{id}")
public ResponseEntity<RecipeOutputDto> readById(@PathVariable Long id) {
public ResponseEntity<RecipeOutputDto> readById(@PathVariable String id) {
return ResponseEntity.ok().body(mapper.map(service.readById(id)));
}
......
......@@ -24,7 +24,7 @@ public class UpdateRecipeController {
private final RecipeMapper mapper = Mappers.getMapper(RecipeMapper.class);
@PutMapping("/{id}")
public ResponseEntity<RecipeOutputDto> update(@PathVariable Long id, @RequestBody @Valid RecipeInputDto recipeInputDto, BindingResult result) {
public ResponseEntity<RecipeOutputDto> update(@PathVariable String id, @RequestBody @Valid RecipeInputDto recipeInputDto, BindingResult result) {
if (result.hasErrors()) {
String errorMsg = result.getFieldErrors().stream()
.map(fieldError -> fieldError.getField() + ": " + fieldError.getDefaultMessage())
......
......@@ -28,7 +28,7 @@ public class RecipeInputDto {
@Valid
private Set<IngredientInputDto> ingredients;
@NotEmpty(message = "Debe incluir al menos un ingrediente")
@NotEmpty(message = "Debe incluir al menos un paso")
@Valid
private Set<StepInputDto> steps;
......
......@@ -13,7 +13,7 @@ import java.util.Set;
@NoArgsConstructor
public class RecipeOutputDto {
private Long id;
private String id;
private String name;
private String description;
private String picture;
......
......@@ -3,7 +3,7 @@ package com.example.apprecetas.recipe.infrastructure.mapper;
import com.example.apprecetas.recipe.domain.entity.Recipe;
import com.example.apprecetas.recipe.infrastructure.controller.dto.input.RecipeInputDto;
import com.example.apprecetas.recipe.infrastructure.controller.dto.output.RecipeOutputDto;
import com.example.apprecetas.recipe.infrastructure.repository.jpa.RecipeJpa;
import com.example.apprecetas.recipe.infrastructure.repository.mongodb.RecipeDocument;
import org.mapstruct.Mapper;
@Mapper
......@@ -13,8 +13,8 @@ public interface RecipeMapper {
Recipe map(RecipeInputDto recipeInputDto);
RecipeJpa mapJpa(Recipe recipe);
RecipeDocument mapDocument(Recipe recipe);
Recipe mapJpa(RecipeJpa recipeJpa);
Recipe mapDocument(RecipeDocument recipeDocument);
}
package com.example.apprecetas.recipe.infrastructure.repository.impl;
import com.example.apprecetas.recipe.domain.repository.CreateRecipeRepository;
import com.example.apprecetas.recipe.infrastructure.repository.jpa.RecipeJpa;
import com.example.apprecetas.recipe.infrastructure.repository.jpa.RecipeRepositoryJpa;
import com.example.apprecetas.recipe.infrastructure.repository.mongodb.RecipeDocument;
import com.example.apprecetas.recipe.infrastructure.repository.mongodb.RecipeRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
......@@ -10,10 +10,10 @@ import org.springframework.stereotype.Repository;
@RequiredArgsConstructor
public class CreateRecipeRepositoryImpl implements CreateRecipeRepository {
private final RecipeRepositoryJpa repositoryJpa;
private final RecipeRepository repositoryJpa;
@Override
public RecipeJpa create(RecipeJpa recipeJpa) {
return repositoryJpa.save(recipeJpa);
public RecipeDocument create(RecipeDocument recipeDocument) {
return repositoryJpa.save(recipeDocument);
}
}
package com.example.apprecetas.recipe.infrastructure.repository.impl;
import com.example.apprecetas.recipe.domain.repository.DeleteRecipeRepository;
import com.example.apprecetas.recipe.infrastructure.repository.jpa.RecipeJpa;
import com.example.apprecetas.recipe.infrastructure.repository.jpa.RecipeRepositoryJpa;
import com.example.apprecetas.recipe.infrastructure.repository.mongodb.RecipeDocument;
import com.example.apprecetas.recipe.infrastructure.repository.mongodb.RecipeRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
......@@ -10,10 +10,10 @@ import org.springframework.stereotype.Repository;
@RequiredArgsConstructor
public class DeleteRecipeRepositoryImpl implements DeleteRecipeRepository {
private final RecipeRepositoryJpa repositoryJpa;
private final RecipeRepository repositoryJpa;
@Override
public void delete(RecipeJpa recipeJpa) {
repositoryJpa.delete(recipeJpa);
public void delete(RecipeDocument recipeDocument) {
repositoryJpa.delete(recipeDocument);
}
}
package com.example.apprecetas.recipe.infrastructure.repository.impl;
import com.example.apprecetas.recipe.domain.repository.ReadRecipeRepository;
import com.example.apprecetas.recipe.infrastructure.repository.jpa.RecipeJpa;
import com.example.apprecetas.recipe.infrastructure.repository.jpa.RecipeRepositoryJpa;
import com.example.apprecetas.recipe.infrastructure.repository.mongodb.RecipeDocument;
import com.example.apprecetas.recipe.infrastructure.repository.mongodb.RecipeRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
......@@ -13,15 +13,15 @@ import java.util.Optional;
@RequiredArgsConstructor
public class ReadRecipeRepositoryImpl implements ReadRecipeRepository {
private final RecipeRepositoryJpa repositoryJpa;
private final RecipeRepository repositoryJpa;
@Override
public Optional<RecipeJpa> readById(Long id) {
public Optional<RecipeDocument> readById(String id) {
return repositoryJpa.findById(id);
}
@Override
public List<RecipeJpa> readAll() {
public List<RecipeDocument> readAll() {
return repositoryJpa.findAll();
}
}
......@@ -2,8 +2,8 @@ package com.example.apprecetas.recipe.infrastructure.repository.impl;
import com.example.apprecetas.exception.EntityNotFoundException;
import com.example.apprecetas.recipe.domain.repository.UpdateRecipeRepository;
import com.example.apprecetas.recipe.infrastructure.repository.jpa.RecipeJpa;
import com.example.apprecetas.recipe.infrastructure.repository.jpa.RecipeRepositoryJpa;
import com.example.apprecetas.recipe.infrastructure.repository.mongodb.RecipeDocument;
import com.example.apprecetas.recipe.infrastructure.repository.mongodb.RecipeRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
......@@ -11,17 +11,17 @@ import org.springframework.stereotype.Repository;
@RequiredArgsConstructor
public class UpdateRecipeRepositoryImpl implements UpdateRecipeRepository {
private final RecipeRepositoryJpa repositoryJpa;
private final RecipeRepository repositoryJpa;
@Override
public RecipeJpa upadte(Long id, RecipeJpa recipeJpa) {
public RecipeDocument upadte(String id, RecipeDocument recipeDocument) {
RecipeJpa recipe = repositoryJpa.findById(id)
RecipeDocument recipe = repositoryJpa.findById(id)
.orElseThrow(() -> new EntityNotFoundException("La receta con id " + id + " no existe"));
recipe.setName(recipeJpa.getName());
recipe.setDescription(recipeJpa.getDescription());
recipe.setPicture(recipeJpa.getPicture());
recipe.setName(recipeDocument.getName());
recipe.setDescription(recipeDocument.getDescription());
recipe.setPicture(recipeDocument.getPicture());
return repositoryJpa.save(recipe);
}
......
package com.example.apprecetas.recipe.infrastructure.repository.jpa;
import org.springframework.data.jpa.repository.JpaRepository;
public interface RecipeRepositoryJpa extends JpaRepository<RecipeJpa, Long> {
}
package com.example.apprecetas.recipe.infrastructure.repository.jpa;
package com.example.apprecetas.recipe.infrastructure.repository.mongodb;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Entity
@Table(name = "ingredient")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class IngredientJpa {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_ingredient")
private Long id;
public class IngredientDocument {
private String name;
private int quantity;
private String unitOfMeasure;
@ManyToOne
@JoinColumn(name = "recipe_id")
private RecipeJpa recipe;
}
package com.example.apprecetas.recipe.infrastructure.repository.jpa;
package com.example.apprecetas.recipe.infrastructure.repository.mongodb;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.HashSet;
import java.util.Set;
@Entity
@Table(name = "recipe")
@Document(collection = "recipes")
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class RecipeJpa {
public class RecipeDocument {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_recipe")
private Long id;
private String id;
private String name;
private String description;
private String picture;
@OneToMany(mappedBy = "recipe", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<IngredientJpa> ingredients;
@OneToMany(mappedBy = "recipe", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<StepJpa> steps;
private Set<IngredientDocument> ingredients = new HashSet<>();
private Set<StepDocument> steps = new HashSet<>();
}
package com.example.apprecetas.recipe.infrastructure.repository.mongodb;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface RecipeRepository extends MongoRepository<RecipeDocument, String> {
}
package com.example.apprecetas.recipe.infrastructure.repository.jpa;
package com.example.apprecetas.recipe.infrastructure.repository.mongodb;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Entity
@Table(name = "step")
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class StepJpa {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_step")
private Long id;
public class StepDocument {
private int number;
private String description;
@ManyToOne
@JoinColumn(name = "recipe_id")
private RecipeJpa recipe;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment