Skip to content

Commit

Permalink
Create functionality for user reviews
Browse files Browse the repository at this point in the history
  • Loading branch information
Fagorym committed Feb 14, 2024
1 parent d43183a commit da36078
Show file tree
Hide file tree
Showing 17 changed files with 372 additions and 43 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package ru.nsu.fit.directors.userservice.controller;

import java.util.List;

import javax.annotation.ParametersAreNonnullByDefault;

import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import ru.nsu.fit.directors.userservice.dto.request.ReviewCreationDto;
import ru.nsu.fit.directors.userservice.dto.response.ResponseReviewDto;
import ru.nsu.fit.directors.userservice.facade.ReviewFacade;

@RestController
@RequestMapping(value = "/review")
@RequiredArgsConstructor
@ParametersAreNonnullByDefault
public class ReviewController {
private final ReviewFacade reviewFacade;

@PostMapping
public void create(@RequestBody @Valid ReviewCreationDto reviewCreationDto) {
reviewFacade.createReview(reviewCreationDto);
}

@GetMapping
public List<ResponseReviewDto> get() {
return reviewFacade.getReviews();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,15 @@
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import ru.nsu.fit.directors.userservice.dto.request.RequestUserDto;
import ru.nsu.fit.directors.userservice.dto.response.ResponseUserDto;
import ru.nsu.fit.directors.userservice.facade.UserFacade;
import ru.nsu.fit.directors.userservice.service.SecurityService;
import ru.nsu.fit.directors.userservice.service.UserService;

/**
* Class, that represent user controller.
Expand All @@ -24,7 +23,7 @@
@RequiredArgsConstructor(access = AccessLevel.PUBLIC)
@RequestMapping(value = "/user", produces = MediaType.APPLICATION_JSON_VALUE)
public class UserController {
private final UserService userService;
private final UserFacade userFacade;
private final SecurityService securityService;
private final HttpServletRequest httpServletRequest;

Expand All @@ -36,7 +35,7 @@ public class UserController {
*/
@PostMapping(value = "/register", consumes = MediaType.APPLICATION_JSON_VALUE)
public Boolean register(@RequestBody @Valid RequestUserDto requestUserDto) {
userService.registerUser(requestUserDto);
userFacade.registerUser(requestUserDto);
securityService.autoLogin(
requestUserDto.getUsername(),
requestUserDto.getPassword(),
Expand Down Expand Up @@ -73,7 +72,7 @@ public void logout() {
*/
@GetMapping(value = "/me")
public ResponseUserDto me() {
return userService.getLoggedInUser();
return userFacade.getLoggedInUser();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package ru.nsu.fit.directors.userservice.dto.request;

public record ReviewCreationDto() {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package ru.nsu.fit.directors.userservice.dto.response;

import java.time.LocalDate;

public record ResponseReviewDto(
String username,
String text,
Integer score,
LocalDate date
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package ru.nsu.fit.directors.userservice.facade;

import java.util.List;

import javax.annotation.Nonnull;
import javax.annotation.ParametersAreNonnullByDefault;

import ru.nsu.fit.directors.userservice.dto.request.ReviewCreationDto;
import ru.nsu.fit.directors.userservice.dto.response.ResponseReviewDto;

@ParametersAreNonnullByDefault
public interface ReviewFacade {
/**
* Создать отзыв на заведение.
*
* @param reviewCreationDto данные об отзыве
*/
void createReview(ReviewCreationDto reviewCreationDto);

/**
* Получить отзывы активного пользователя.
*
* @return список отзывов активного пользователя
*/
@Nonnull
List<ResponseReviewDto> getReviews();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package ru.nsu.fit.directors.userservice.facade;

import java.util.List;

import javax.annotation.Nonnull;
import javax.annotation.ParametersAreNonnullByDefault;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import ru.nsu.fit.directors.userservice.dto.request.ReviewCreationDto;
import ru.nsu.fit.directors.userservice.dto.response.ResponseReviewDto;
import ru.nsu.fit.directors.userservice.model.UserReview;
import ru.nsu.fit.directors.userservice.service.EstablishmentService;
import ru.nsu.fit.directors.userservice.service.ReviewService;
import ru.nsu.fit.directors.userservice.service.UserService;

@Service
@RequiredArgsConstructor
@ParametersAreNonnullByDefault
public class ReviewFacadeImpl implements ReviewFacade {
private final ReviewService reviewService;
private final UserService userService;
private final EstablishmentService establishmentService;

@Override
public void createReview(ReviewCreationDto reviewCreationDto) {
reviewService.save(new UserReview().setUser(userService.getLoggedInUser()));
}

@Nonnull
@Override
public List<ResponseReviewDto> getReviews() {
List<Long> reviewExternalIds = reviewService.getUserReviews(userService.getLoggedInUser()).stream()
.map(UserReview::getExternalId)
.toList();
return establishmentService.getReviewsByExternalIds(reviewExternalIds);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package ru.nsu.fit.directors.userservice.facade;

import javax.annotation.Nonnull;
import javax.annotation.ParametersAreNonnullByDefault;

import ru.nsu.fit.directors.userservice.dto.request.RequestUserDto;
import ru.nsu.fit.directors.userservice.dto.response.ResponseUserDto;

@ParametersAreNonnullByDefault
public interface UserFacade {
/**
* Получить активного пользователя.
*
* @return данные об активном пользователе.
*/
@Nonnull
ResponseUserDto getLoggedInUser();

/**
* Зарегестрировать пользователя.
*
* @param requestUserDto данные о пользователе
*/
void registerUser(RequestUserDto requestUserDto);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package ru.nsu.fit.directors.userservice.facade;

import javax.annotation.Nonnull;
import javax.annotation.ParametersAreNonnullByDefault;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import ru.nsu.fit.directors.userservice.dto.request.RequestUserDto;
import ru.nsu.fit.directors.userservice.dto.response.ResponseUserDto;
import ru.nsu.fit.directors.userservice.mapper.UserMapper;
import ru.nsu.fit.directors.userservice.model.User;
import ru.nsu.fit.directors.userservice.service.UserService;

@Slf4j
@Service
@RequiredArgsConstructor
@ParametersAreNonnullByDefault
public class UserFacadeImpl implements UserFacade {
private final UserService userService;
private final UserMapper userMapper;
private final PasswordEncoder passwordEncoder;

@Nonnull
@Override
public ResponseUserDto getLoggedInUser() {
User user = userService.getLoggedInUser();
return ResponseUserDto.builder()
.id(user.getId())
.phoneNumber(user.getPhoneNumber())
.username(user.getUsername())
.build();
}

@Override
public void registerUser(RequestUserDto requestUserDto) {
log.info("Registering user with");
User user = userMapper.dtoToModel(requestUserDto);
user.setPassword(passwordEncoder.encode(user.getPassword()));
userService.save(user);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package ru.nsu.fit.directors.userservice.model;

import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;

@Table("user_review")
@Entity
@Getter
@Setter
@Accessors(chain = true)
@ToString
public class UserReview {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private Long externalId;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package ru.nsu.fit.directors.userservice.repository;

import java.util.List;

import javax.annotation.Nonnull;

import org.springframework.data.jpa.repository.JpaRepository;
import ru.nsu.fit.directors.userservice.model.User;
import ru.nsu.fit.directors.userservice.model.UserReview;

public interface ReviewRepository extends JpaRepository<UserReview, Long> {
@Nonnull
List<UserReview> findAllByUser(User user);
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,31 @@
package ru.nsu.fit.directors.userservice.service;

import java.util.List;

import javax.annotation.Nonnull;
import javax.annotation.ParametersAreNonnullByDefault;

import ru.nsu.fit.directors.userservice.dto.request.RequestGetEstablishmentParameters;
import ru.nsu.fit.directors.userservice.dto.response.EstablishmentListDto;
import ru.nsu.fit.directors.userservice.dto.response.ResponseReviewDto;

@ParametersAreNonnullByDefault
public interface EstablishmentService {
/**
* Получить заведение исходя из параметров.
*
* @param parameters параметры и фильтры
* @return список заведений, удовлетворяющих фильтрам
*/
@Nonnull
EstablishmentListDto getEstablishmentByParams(RequestGetEstablishmentParameters parameters);

/**
* Получить отзывы по внешним идентфикаторам.
*
* @param externalIds внешние идентификаторы отзывов
* @return список отзывов
*/
@Nonnull
List<ResponseReviewDto> getReviewsByExternalIds(List<Long> externalIds);
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,12 @@
import ru.nsu.fit.directors.userservice.api.EstablishmentApi;
import ru.nsu.fit.directors.userservice.dto.request.RequestGetEstablishmentParameters;
import ru.nsu.fit.directors.userservice.dto.response.EstablishmentListDto;
import ru.nsu.fit.directors.userservice.dto.response.ResponseReviewDto;

import javax.annotation.Nonnull;
import javax.annotation.ParametersAreNonnullByDefault;

import java.util.List;
import java.util.Optional;

@Component
Expand All @@ -17,6 +21,7 @@ public class EstablishmentServiceImpl implements EstablishmentService {
private final EstablishmentApi establishmentApi;
private final FavouritesService favouritesService;

@Nonnull
@Override
public EstablishmentListDto getEstablishmentByParams(RequestGetEstablishmentParameters parameters) {
EstablishmentListDto establishmentInfoList = establishmentApi.syncGetWithParams(
Expand All @@ -27,10 +32,23 @@ public EstablishmentListDto getEstablishmentByParams(RequestGetEstablishmentPara
.queryParamIfPresent("category", Optional.ofNullable(parameters.category()))
.build(),
new ParameterizedTypeReference<>() {
});
}
);
establishmentInfoList.establishments().forEach(
info -> info.setFavourite(favouritesService.getFavouritesIds().contains(info.getId()))
);
return establishmentInfoList;
}

@Nonnull
@Override
public List<ResponseReviewDto> getReviewsByExternalIds(List<Long> externalIds) {
return establishmentApi.syncListGetWithParams(
uriBuilder -> uriBuilder.path("/internal/review")
.queryParam("ids", externalIds)
.build(),
new ParameterizedTypeReference<>() {
}
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package ru.nsu.fit.directors.userservice.service;

import java.util.List;

import javax.annotation.Nonnull;
import javax.annotation.ParametersAreNonnullByDefault;

import ru.nsu.fit.directors.userservice.model.User;
import ru.nsu.fit.directors.userservice.model.UserReview;

@ParametersAreNonnullByDefault
public interface ReviewService {
/**
* Сохранить отзыв.
*
* @param userReview пользовательский отзыв
*/
void save(UserReview userReview);

/**
* Получить пользовательские отзывы.
*
* @param user пользователь
* @return список отзывов
*/
@Nonnull
List<UserReview> getUserReviews(User user);
}
Loading

0 comments on commit da36078

Please sign in to comment.