Skip to content

Commit

Permalink
Merge pull request #26 from rcsim/feature/recomendacao
Browse files Browse the repository at this point in the history
Feature/recomendacao
  • Loading branch information
Geoguitar authored Jan 26, 2024
2 parents 63499ff + 24c16f4 commit f88aa52
Show file tree
Hide file tree
Showing 13 changed files with 181 additions and 2 deletions.
4 changes: 2 additions & 2 deletions schema.js
Original file line number Diff line number Diff line change
Expand Up @@ -136,5 +136,5 @@ var video12 = db.videos.insertOne({
}).insertedId;

// Update the users documents with the _id fields of the videos documents
db.users.updateOne({ "_id": user1 }, { "$set": { "favorites": [video1, video3, video4, video5, video7, video8, video9, video11] } });
db.users.updateOne({ "_id": user2 }, { "$set": { "favorites": [video2, video3, video4, video6, video7, video10, video12] } });
db.users.updateOne({ "_id": user1 }, { "$set": { "favorites": [video1] } });
db.users.updateOne({ "_id": user2 }, { "$set": { "favorites": [video2] } });
17 changes: 17 additions & 0 deletions src/main/java/com/postech30/movies/controller/UserController.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.postech30.movies.controller;

import com.postech30.movies.dto.UserDTO;
import com.postech30.movies.entity.Video;
import com.postech30.movies.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
Expand Down Expand Up @@ -74,4 +75,20 @@ public Mono<UserDTO> updateUser(@RequestBody UserDTO userDTO, @PathVariable("id"
public Mono<Void> deleteUser(@PathVariable("id") String userId) {
return userService.deleteUser(userId);
}


@Operation(summary = "Recomenda video a o usuario",
description = "Recomenda video com base nos favoritos do usuario com base nos dados do sistema.")
@ApiResponses({
@ApiResponse(responseCode = "200", description = "Sucesso"),
@ApiResponse(responseCode = "400", description = "Request incorreto"),
@ApiResponse(responseCode = "404", description = "Usuário não encontrado")
})
@GetMapping("/recommendation/{userId}")
public Flux<Video> getRecommendations(@PathVariable String userId) {

return userService.getRecommendedVideos(userId);

}

}
3 changes: 3 additions & 0 deletions src/main/java/com/postech30/movies/dto/VideoDTO.java
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,9 @@ public class VideoDTO {
@JsonProperty
private List<String> favoritedBy;

@JsonProperty
private String category;

@JsonProperty
private String categoryName;

Expand Down
1 change: 1 addition & 0 deletions src/main/java/com/postech30/movies/entity/Video.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ public class Video {
private String url;
private LocalDate publishDate;
private Integer views;
private String category;
private List<ObjectId> favoritedBy;
private String categoryName;
private String categoryDescription;
Expand Down
1 change: 1 addition & 0 deletions src/main/java/com/postech30/movies/mapper/VideoMapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ public static Video mapToVideo(VideoDTO videoDTO) {
videoDTO.getUrl(),
videoDTO.getPublishDate(),
videoDTO.getViews(),
videoDTO.getCategory(),
videoDTO.getFavoritedBy() != null ?
videoDTO.getFavoritedBy().stream()
.map(ObjectId::new)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@
import org.springframework.data.mongodb.repository.ReactiveMongoRepository;

public interface UserRepository extends ReactiveMongoRepository<User, String> {
User getUserById(String userId);
}
Original file line number Diff line number Diff line change
@@ -1,22 +1,28 @@
package com.postech30.movies.repository;

import com.postech30.movies.entity.Video;
import org.bson.types.ObjectId;
import org.reactivestreams.Publisher;
import org.springframework.data.mongodb.repository.Aggregation;
import org.springframework.data.mongodb.repository.Query;
import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.time.LocalDate;
import java.util.List;

public interface VideoRepository extends ReactiveMongoRepository<Video, String> {

Mono<Video> findByTitleIgnoreCaseContaining(String title);


Flux<Video> findByPublishDate(LocalDate publishDate);


Flux<Video> findByCategoryName(String categoryName);


@Aggregation("{ $count: 'totalVideos' }")
Mono<Long> getTotalVideos();

Expand All @@ -27,4 +33,6 @@ public interface VideoRepository extends ReactiveMongoRepository<Video, String>
Mono<Double> getAverageViews();


@Query("{ 'category': ?0 }")
Flux<Video> findVideosByCategory(ObjectId category);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,19 @@

import com.postech30.movies.dto.CategoryDTO;
import com.postech30.movies.entity.Category;
import com.postech30.movies.entity.Video;
import com.postech30.movies.mapper.CategoryMapper;
import com.postech30.movies.repository.CategoryRepository;
import com.postech30.movies.service.CategoryService;
import lombok.AllArgsConstructor;
import org.bson.types.ObjectId;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;

@Service
@AllArgsConstructor
public class CategoryServiceImpl implements CategoryService {
Expand Down Expand Up @@ -45,6 +50,8 @@ public Mono<CategoryDTO> updateCategory(CategoryDTO categoryDTO, String category
}).map(CategoryMapper::mapToCategoryDTO);
}



@Override
public Mono<Void> deleteCategory(String categoryId) {
return categoryRepository.deleteById(categoryId);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,22 +1,34 @@
package com.postech30.movies.service.Impl;

import com.postech30.movies.dto.UserDTO;
import com.postech30.movies.dto.VideoDTO;
import com.postech30.movies.entity.User;
import com.postech30.movies.entity.Video;
import com.postech30.movies.mapper.UserMapper;
import com.postech30.movies.mapper.VideoMapper;
import com.postech30.movies.repository.UserRepository;
import com.postech30.movies.repository.VideoRepository;
import com.postech30.movies.service.UserService;
import lombok.AllArgsConstructor;
import org.bson.types.ObjectId;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.ArrayList;
import java.util.List;


@Service
@AllArgsConstructor
public class UserServiceImpl implements UserService {

private UserRepository userRepository;

private VideoRepository videoRepository;



@Override
public Flux<UserDTO> getAllUsers() {
Flux<User> userFlux = userRepository.findAll();
Expand Down Expand Up @@ -49,4 +61,12 @@ public Mono<UserDTO> updateUser(UserDTO userDTO, String userId) {
public Mono<Void> deleteUser(String userId) {
return userRepository.deleteById(userId);
}

@Override
public Flux<Video> getRecommendedVideos(String userId) {
return userRepository.findById(userId)
.flatMapMany(user -> Flux.fromIterable(user.getFavorites())
.flatMap(videoId -> videoRepository.findById(videoId.toString()))
.flatMap(video -> videoRepository.findVideosByCategory(new ObjectId(video.getCategory()))));
}
}
4 changes: 4 additions & 0 deletions src/main/java/com/postech30/movies/service/UserService.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.postech30.movies.service;

import com.postech30.movies.dto.UserDTO;
import com.postech30.movies.dto.VideoDTO;
import com.postech30.movies.entity.Video;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

Expand All @@ -16,4 +18,6 @@ public interface UserService {

Mono<Void> deleteUser(String userId);

Flux<Video> getRecommendedVideos(String userId);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.postech30.movies.controller;

import com.postech30.movies.entity.Video;
import com.postech30.movies.service.UserService;
import org.bson.types.ObjectId;
import org.mockito.InjectMocks;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.reactive.server.WebTestClient;
import reactor.core.publisher.Flux;

import java.time.LocalDate;
import java.util.Arrays;
import java.util.Collections;

import static org.mockito.Mockito.when;
@SpringBootTest
public class UserControllerTest {

@InjectMocks
private UserController userController;

@Mock
private UserService userService;

@Test
public void testGetRecommendations() {
// Configurar dados de exemplo
String userId = "exampleUserId";
Video video1 = new Video(
"12334",
"Example Title",
"Example Description",
"https://example.com",
LocalDate.now(),
1000,
Arrays.asList(new ObjectId("65b30969b4f04b5b4cf30b20"), new ObjectId("65b30969b4f04b5b4cfe0b20")).toString(),
Collections.singletonList(new ObjectId("65b30969b4f04b5b4cfe0ba0")),
"Example Category Name",
"Example Category Description"
);

when(userService.getRecommendedVideos(userId)).thenReturn(Flux.just(video1));

userController.getRecommendations("user1");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package com.postech30.movies.service.Impl;


import com.postech30.movies.entity.User;
import com.postech30.movies.entity.Video;
import com.postech30.movies.repository.UserRepository;
import com.postech30.movies.repository.VideoRepository;
import com.postech30.movies.service.UserService;
import org.bson.types.ObjectId;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.springframework.boot.test.context.SpringBootTest;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;

import java.time.LocalDate;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import static org.mockito.Mockito.when;

@SpringBootTest
public class UserServiceImplTest {

@InjectMocks
private UserServiceImpl userService;

@Mock
private UserRepository userRepository;

@Mock
private VideoRepository videoRepository;





@Test
public void testGetRecommendedVideos() {
// Configurar dados de exemplo
String userId = "exampleUserId";
User user = new User("1","teste","[email protected]", Arrays.asList(new ObjectId("65b30969b4f04b5b4cfe0b20")));
Video video1 = new Video(
"12334",
"Example Title",
"Example Description",
"https://example.com",
LocalDate.now(),
1000,
Arrays.asList(new ObjectId("65b30969b4f04b5b4cf30b20"), new ObjectId("65b30969b4f04b5b4cfe0b20")).toString(),
Collections.singletonList(new ObjectId("65b30969b4f04b5b4cfe0ba0")),
"Example Category Name",
"Example Category Description"
);
when(userRepository.findById(userId)).thenReturn(Mono.just(user));
when(videoRepository.findById("videoId1")).thenReturn(Mono.just(video1));
when(videoRepository.findVideosByCategory(new ObjectId("65b30969b4f04b5b4cfe0ba0"))).thenReturn(Flux.just(video1));

// Chamar o método e verificar a resposta usando StepVerifier
Flux<Video> result = userService.getRecommendedVideos(userId);

}

}
Binary file modified videos/video.mp4
Binary file not shown.

0 comments on commit f88aa52

Please sign in to comment.