diff --git a/spring-ddd-application/src/main/java/com/rogelioorts/training/spring/ddd/services/MoviesService.java b/spring-ddd-application/src/main/java/com/rogelioorts/training/spring/ddd/services/MoviesService.java new file mode 100644 index 0000000..367b3ef --- /dev/null +++ b/spring-ddd-application/src/main/java/com/rogelioorts/training/spring/ddd/services/MoviesService.java @@ -0,0 +1,28 @@ +package com.rogelioorts.training.spring.ddd.services; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.rogelioorts.training.spring.ddd.entities.Movie; +import com.rogelioorts.training.spring.ddd.repositories.MoviesRepository; +import com.rogelioorts.training.spring.ddd.value.objects.Filter; + +@Service +public class MoviesService { + + @Autowired + private MoviesRepository moviesRepository; + + public List findAll(List filters) { + List movies = moviesRepository.findAll(); + + for(Filter filter: filters) { + movies = filter.apply(movies); + } + + return movies; + } + +} diff --git a/spring-ddd-infrastructure/src/main/java/com/rogelioorts/training/spring/ddd/mappers/MoviesFeignMapper.java b/spring-ddd-infrastructure/src/main/java/com/rogelioorts/training/spring/ddd/mappers/MoviesFeignMapper.java index 1f11814..23870d7 100644 --- a/spring-ddd-infrastructure/src/main/java/com/rogelioorts/training/spring/ddd/mappers/MoviesFeignMapper.java +++ b/spring-ddd-infrastructure/src/main/java/com/rogelioorts/training/spring/ddd/mappers/MoviesFeignMapper.java @@ -7,7 +7,7 @@ import com.rogelioorts.training.spring.ddd.entities.Movie; import com.rogelioorts.training.spring.ddd.value.objects.CensoringLevel; @Component -public class FeignMoviesMapper { +public class MoviesFeignMapper { public Movie map(FeignMovie in) { Movie out = new Movie(); diff --git a/spring-ddd-infrastructure/src/main/java/com/rogelioorts/training/spring/ddd/repositories/MoviesFeignRepository.java b/spring-ddd-infrastructure/src/main/java/com/rogelioorts/training/spring/ddd/repositories/MoviesFeignRepository.java index 8197ced..2a870cf 100644 --- a/spring-ddd-infrastructure/src/main/java/com/rogelioorts/training/spring/ddd/repositories/MoviesFeignRepository.java +++ b/spring-ddd-infrastructure/src/main/java/com/rogelioorts/training/spring/ddd/repositories/MoviesFeignRepository.java @@ -6,7 +6,7 @@ import org.springframework.web.bind.annotation.RequestMethod; import com.rogelioorts.training.spring.ddd.entities.PageFeignMovie; -@FeignClient("${movies-server.url}") +@FeignClient(name = "MoviesFeign", url = "${movies-server.url}") public interface MoviesFeignRepository { @RequestMapping(method = RequestMethod.GET, path = "/movies") diff --git a/spring-ddd-infrastructure/src/main/java/com/rogelioorts/training/spring/ddd/repositories/impl/MoviesFeignRepositoryImpl.java b/spring-ddd-infrastructure/src/main/java/com/rogelioorts/training/spring/ddd/repositories/impl/MoviesFeignRepositoryImpl.java index 71bee51..ea8732b 100644 --- a/spring-ddd-infrastructure/src/main/java/com/rogelioorts/training/spring/ddd/repositories/impl/MoviesFeignRepositoryImpl.java +++ b/spring-ddd-infrastructure/src/main/java/com/rogelioorts/training/spring/ddd/repositories/impl/MoviesFeignRepositoryImpl.java @@ -7,7 +7,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import com.rogelioorts.training.spring.ddd.entities.Movie; -import com.rogelioorts.training.spring.ddd.mappers.FeignMoviesMapper; +import com.rogelioorts.training.spring.ddd.mappers.MoviesFeignMapper; import com.rogelioorts.training.spring.ddd.repositories.MoviesFeignRepository; import com.rogelioorts.training.spring.ddd.repositories.MoviesRepository; @@ -18,7 +18,7 @@ public class MoviesFeignRepositoryImpl implements MoviesRepository { private MoviesFeignRepository repository; @Autowired - private FeignMoviesMapper mapper; + private MoviesFeignMapper mapper; @Override public List findAll() { diff --git a/spring-ddd-presentation-rest/.classpath b/spring-ddd-presentation-rest/.classpath index fae1a2b..9e0e011 100644 --- a/spring-ddd-presentation-rest/.classpath +++ b/spring-ddd-presentation-rest/.classpath @@ -6,6 +6,7 @@ + @@ -19,6 +20,7 @@ + diff --git a/spring-ddd-presentation-rest/pom.xml b/spring-ddd-presentation-rest/pom.xml index 698a6ce..6f5b9ab 100644 --- a/spring-ddd-presentation-rest/pom.xml +++ b/spring-ddd-presentation-rest/pom.xml @@ -17,6 +17,10 @@ spring-ddd-domain + + org.springframework + spring-web + org.springframework spring-webmvc @@ -25,5 +29,36 @@ org.springframework spring-beans + + + org.mapstruct + mapstruct-jdk8 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.7.0 + + 1.8 + 1.8 + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + + + org.projectlombok + lombok + ${lombok.version} + + + + + + \ No newline at end of file diff --git a/spring-ddd-presentation-rest/src/main/java/com/rogelioorts/training/spring/ddd/controllers/MoviesController.java b/spring-ddd-presentation-rest/src/main/java/com/rogelioorts/training/spring/ddd/controllers/MoviesController.java new file mode 100644 index 0000000..e7a569e --- /dev/null +++ b/spring-ddd-presentation-rest/src/main/java/com/rogelioorts/training/spring/ddd/controllers/MoviesController.java @@ -0,0 +1,38 @@ +package com.rogelioorts.training.spring.ddd.controllers; + +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.rogelioorts.training.spring.ddd.entities.Movie; +import com.rogelioorts.training.spring.ddd.entities.MovieApi; +import com.rogelioorts.training.spring.ddd.mappers.FiltersApiMapper; +import com.rogelioorts.training.spring.ddd.mappers.MoviesApiMapper; +import com.rogelioorts.training.spring.ddd.services.MoviesService; + +@RestController +@RequestMapping("/movies") +public class MoviesController { + + @Autowired + private MoviesService moviesService; + + @Autowired + private FiltersApiMapper filtersMapper; + + @Autowired + private MoviesApiMapper moviesMapper; + + @RequestMapping(method = RequestMethod.GET) + public List findAll(@RequestParam(required = false) List filters, @RequestParam(required = false) String level) { + List movies = moviesService.findAll(filtersMapper.map(filters, level)); + + return movies.stream().map(moviesMapper::map).collect(Collectors.toList()); + } + +} diff --git a/spring-ddd-presentation-rest/src/main/java/com/rogelioorts/training/spring/ddd/entities/MovieApi.java b/spring-ddd-presentation-rest/src/main/java/com/rogelioorts/training/spring/ddd/entities/MovieApi.java new file mode 100644 index 0000000..e4a1dc6 --- /dev/null +++ b/spring-ddd-presentation-rest/src/main/java/com/rogelioorts/training/spring/ddd/entities/MovieApi.java @@ -0,0 +1,22 @@ +package com.rogelioorts.training.spring.ddd.entities; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class MovieApi { + + private String id; + + private String title; + + private String image; + + private String description; + + private double punctuation; + + private String censoringLevel; + +} diff --git a/spring-ddd-presentation-rest/src/main/java/com/rogelioorts/training/spring/ddd/mappers/FiltersApiMapper.java b/spring-ddd-presentation-rest/src/main/java/com/rogelioorts/training/spring/ddd/mappers/FiltersApiMapper.java new file mode 100644 index 0000000..7de8d72 --- /dev/null +++ b/spring-ddd-presentation-rest/src/main/java/com/rogelioorts/training/spring/ddd/mappers/FiltersApiMapper.java @@ -0,0 +1,46 @@ +package com.rogelioorts.training.spring.ddd.mappers; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.stereotype.Component; + +import com.rogelioorts.training.spring.ddd.factories.FiltersFactory; +import com.rogelioorts.training.spring.ddd.value.objects.CensoringLevel; +import com.rogelioorts.training.spring.ddd.value.objects.Filter; + +@Component +public class FiltersApiMapper { + + public List map(List rawFilters, String censoringLevel) { + List filters = new ArrayList<>(); + + if(rawFilters != null) { + for(String filterId : rawFilters) { + filters.add(map(filterId, censoringLevel)); + } + } + + return filters; + } + + private Filter map(String filterId, String censoringLevel) { + if("censoring".equals(filterId)) { + return FiltersFactory.censoringFilter(mapCensoringLevel(censoringLevel)); + } else { + throw new IllegalArgumentException("Not valid filter ID \"" + filterId + "\""); + } + } + + private CensoringLevel mapCensoringLevel(String censoringLevel) { + switch(censoringLevel) { + case "CENSORED": + return CensoringLevel.CENSORED; + case "UNCENSORED": + return CensoringLevel.UNCENSORED; + default: + throw new IllegalArgumentException("Not valid censoring level \"" + censoringLevel + "\""); + } + } + +} diff --git a/spring-ddd-presentation-rest/src/main/java/com/rogelioorts/training/spring/ddd/mappers/MoviesApiMapper.java b/spring-ddd-presentation-rest/src/main/java/com/rogelioorts/training/spring/ddd/mappers/MoviesApiMapper.java new file mode 100644 index 0000000..4b7314b --- /dev/null +++ b/spring-ddd-presentation-rest/src/main/java/com/rogelioorts/training/spring/ddd/mappers/MoviesApiMapper.java @@ -0,0 +1,15 @@ +package com.rogelioorts.training.spring.ddd.mappers; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +import com.rogelioorts.training.spring.ddd.entities.Movie; +import com.rogelioorts.training.spring.ddd.entities.MovieApi; + +@Mapper(componentModel = "spring") +public interface MoviesApiMapper { + + @Mapping(source = "movieId", target = "id") + MovieApi map(Movie movie); + +}