From d1fb536217ed3e651f2d18770e4d9ae951a6ca1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=20=D0=91=D0=BE=D0=BA?= =?UTF-8?q?=D0=B0=D1=80=D0=B5=D0=B2?= Date: Wed, 11 Sep 2024 22:59:46 +0300 Subject: [PATCH 1/3] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D1=83=D1=80=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../practicum/controller/UserController.java | 55 ++++++++++++++ .../java/ru/practicum/dto/AdminUserDto.java | 15 ++++ .../main/java/ru/practicum/dto/UserDto.java | 14 ++++ .../ru/practicum/dto/UserDtoReceived.java | 26 +++++++ .../java/ru/practicum/dto/UserShortDto.java | 14 ++++ .../exception/ConflictException.java | 7 ++ .../exception/NotFoundException.java | 7 ++ .../exception/NotUniqueException.java | 7 ++ .../exception/handler/ErrorResponse.java | 20 +++++ .../exception/handler/MainServiceHandler.java | 67 +++++++++++++++++ .../java/ru/practicum/mapper/UserMapper.java | 50 +++++++++++++ .../main/java/ru/practicum/model/User.java | 33 ++++++++ .../repository/UserMainServiceRepository.java | 23 ++++++ .../ru/practicum/service/UserService.java | 14 ++++ .../service/impl/UserServiceImpl.java | 75 +++++++++++++++++++ .../main/resources/application-dev.properties | 5 +- .../src/main/resources/application.properties | 1 + .../src/main/resources/schema.sql | 18 +++-- .../src/main/resources/application.properties | 4 +- .../main/java/ru/practicum/dto/Validator.java | 7 ++ 20 files changed, 452 insertions(+), 10 deletions(-) create mode 100644 ewm-main-service/src/main/java/ru/practicum/controller/UserController.java create mode 100644 ewm-main-service/src/main/java/ru/practicum/dto/AdminUserDto.java create mode 100644 ewm-main-service/src/main/java/ru/practicum/dto/UserDto.java create mode 100644 ewm-main-service/src/main/java/ru/practicum/dto/UserDtoReceived.java create mode 100644 ewm-main-service/src/main/java/ru/practicum/dto/UserShortDto.java create mode 100644 ewm-main-service/src/main/java/ru/practicum/exception/ConflictException.java create mode 100644 ewm-main-service/src/main/java/ru/practicum/exception/NotFoundException.java create mode 100644 ewm-main-service/src/main/java/ru/practicum/exception/NotUniqueException.java create mode 100644 ewm-main-service/src/main/java/ru/practicum/exception/handler/ErrorResponse.java create mode 100644 ewm-main-service/src/main/java/ru/practicum/exception/handler/MainServiceHandler.java create mode 100644 ewm-main-service/src/main/java/ru/practicum/mapper/UserMapper.java create mode 100644 ewm-main-service/src/main/java/ru/practicum/model/User.java create mode 100644 ewm-main-service/src/main/java/ru/practicum/repository/UserMainServiceRepository.java create mode 100644 ewm-main-service/src/main/java/ru/practicum/service/UserService.java create mode 100644 ewm-main-service/src/main/java/ru/practicum/service/impl/UserServiceImpl.java create mode 100644 ewm-stat-service/stat-dto/src/main/java/ru/practicum/dto/Validator.java diff --git a/ewm-main-service/src/main/java/ru/practicum/controller/UserController.java b/ewm-main-service/src/main/java/ru/practicum/controller/UserController.java new file mode 100644 index 0000000..56160e4 --- /dev/null +++ b/ewm-main-service/src/main/java/ru/practicum/controller/UserController.java @@ -0,0 +1,55 @@ +package ru.practicum.controller; + +import jakarta.validation.constraints.Positive; +import jakarta.validation.constraints.PositiveOrZero; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import ru.practicum.dto.AdminUserDto; +import ru.practicum.dto.UserDtoReceived; +import ru.practicum.dto.Validator; +import ru.practicum.service.UserService; +import ru.practicum.mapper.UserMapper; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +@Validated +@RequestMapping("/admin/users") +@Slf4j +public class UserController { + + private final UserService userService; + + @PostMapping + @ResponseStatus(HttpStatus.CREATED) + public ResponseEntity createUser(@RequestBody @Validated({Validator.Create.class}) UserDtoReceived userDto) { + log.info("Calling the POST request to /admin/users endpoint"); + return ResponseEntity.status(HttpStatus.CREATED).body(userService.createUser(UserMapper.toUser(userDto))); + } + + + @DeleteMapping("/{userId}") + @ResponseStatus(HttpStatus.NO_CONTENT) + public ResponseEntity deleteUser(@PathVariable Long userId) { + log.info("Calling the DELETE request to /admin/users/{userId} endpoint"); + userService.deleteUser(userId); + return ResponseEntity + .status(HttpStatus.NO_CONTENT) + .body("User deleted: " + userId); + } + + @GetMapping + public ResponseEntity> getUsers(@RequestParam(defaultValue = "") List ids, + @RequestParam(defaultValue = "0") @PositiveOrZero int from, + @RequestParam(defaultValue = "10") @Positive int size) { + log.info("Calling the GET request to /admin/users endpoint"); + List response = UserMapper.toListAdminUserDto(userService.readUsers(ids, from, size)); + return ResponseEntity.ok(response); + } + +} \ No newline at end of file diff --git a/ewm-main-service/src/main/java/ru/practicum/dto/AdminUserDto.java b/ewm-main-service/src/main/java/ru/practicum/dto/AdminUserDto.java new file mode 100644 index 0000000..ef6753e --- /dev/null +++ b/ewm-main-service/src/main/java/ru/practicum/dto/AdminUserDto.java @@ -0,0 +1,15 @@ +package ru.practicum.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +public class AdminUserDto { + + private Long id; + private String name; + private String email; +} \ No newline at end of file diff --git a/ewm-main-service/src/main/java/ru/practicum/dto/UserDto.java b/ewm-main-service/src/main/java/ru/practicum/dto/UserDto.java new file mode 100644 index 0000000..e60a43b --- /dev/null +++ b/ewm-main-service/src/main/java/ru/practicum/dto/UserDto.java @@ -0,0 +1,14 @@ +package ru.practicum.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +public class UserDto { + + private Long id; + private String name; +} \ No newline at end of file diff --git a/ewm-main-service/src/main/java/ru/practicum/dto/UserDtoReceived.java b/ewm-main-service/src/main/java/ru/practicum/dto/UserDtoReceived.java new file mode 100644 index 0000000..af66ccf --- /dev/null +++ b/ewm-main-service/src/main/java/ru/practicum/dto/UserDtoReceived.java @@ -0,0 +1,26 @@ +package ru.practicum.dto; + + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +public class UserDtoReceived { + + private Long id; + + @Email(groups = {Validator.Create.class}) + @Size(min = 6, max = 254, groups = {Validator.Create.class}) + @NotBlank(groups = {Validator.Create.class}) + private String email; + + @NotBlank(groups = {Validator.Create.class}) + @Size(min = 2, max = 250, groups = {Validator.Create.class}) + private String name; +} \ No newline at end of file diff --git a/ewm-main-service/src/main/java/ru/practicum/dto/UserShortDto.java b/ewm-main-service/src/main/java/ru/practicum/dto/UserShortDto.java new file mode 100644 index 0000000..5162a56 --- /dev/null +++ b/ewm-main-service/src/main/java/ru/practicum/dto/UserShortDto.java @@ -0,0 +1,14 @@ +package ru.practicum.dto; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.*; + +@Builder +@Data +public class UserShortDto { + @NotNull + private Long id; + @NotEmpty + private String name; +} \ No newline at end of file diff --git a/ewm-main-service/src/main/java/ru/practicum/exception/ConflictException.java b/ewm-main-service/src/main/java/ru/practicum/exception/ConflictException.java new file mode 100644 index 0000000..5628ca9 --- /dev/null +++ b/ewm-main-service/src/main/java/ru/practicum/exception/ConflictException.java @@ -0,0 +1,7 @@ +package ru.practicum.exception; + +public class ConflictException extends RuntimeException { + public ConflictException(final String massage) { + super(massage); + } +} \ No newline at end of file diff --git a/ewm-main-service/src/main/java/ru/practicum/exception/NotFoundException.java b/ewm-main-service/src/main/java/ru/practicum/exception/NotFoundException.java new file mode 100644 index 0000000..561f30f --- /dev/null +++ b/ewm-main-service/src/main/java/ru/practicum/exception/NotFoundException.java @@ -0,0 +1,7 @@ +package ru.practicum.exception; + +public class NotFoundException extends RuntimeException { + public NotFoundException(final String massage) { + super(massage); + } +} \ No newline at end of file diff --git a/ewm-main-service/src/main/java/ru/practicum/exception/NotUniqueException.java b/ewm-main-service/src/main/java/ru/practicum/exception/NotUniqueException.java new file mode 100644 index 0000000..c5498d7 --- /dev/null +++ b/ewm-main-service/src/main/java/ru/practicum/exception/NotUniqueException.java @@ -0,0 +1,7 @@ +package ru.practicum.exception; + +public class NotUniqueException extends RuntimeException { + public NotUniqueException(String message) { + super(message); + } +} \ No newline at end of file diff --git a/ewm-main-service/src/main/java/ru/practicum/exception/handler/ErrorResponse.java b/ewm-main-service/src/main/java/ru/practicum/exception/handler/ErrorResponse.java new file mode 100644 index 0000000..465984b --- /dev/null +++ b/ewm-main-service/src/main/java/ru/practicum/exception/handler/ErrorResponse.java @@ -0,0 +1,20 @@ +package ru.practicum.exception.handler; + +import lombok.Data; + +@Data +public class ErrorResponse { + + private String status; + private String reason; + private String message; + private String timestamp; + + + public ErrorResponse(String status, String reason, String message, String timestamp) { + this.status = status; + this.reason = reason; + this.message = message; + this.timestamp = timestamp; + } +} \ No newline at end of file diff --git a/ewm-main-service/src/main/java/ru/practicum/exception/handler/MainServiceHandler.java b/ewm-main-service/src/main/java/ru/practicum/exception/handler/MainServiceHandler.java new file mode 100644 index 0000000..6b0536e --- /dev/null +++ b/ewm-main-service/src/main/java/ru/practicum/exception/handler/MainServiceHandler.java @@ -0,0 +1,67 @@ +package ru.practicum.exception.handler; + + +import jakarta.validation.ConstraintViolationException; +import lombok.extern.slf4j.Slf4j; +import org.apache.coyote.BadRequestException; +import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.MissingRequestHeaderException; +import org.springframework.web.bind.MissingServletRequestParameterException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import ru.practicum.exception.ConflictException; +import ru.practicum.exception.NotFoundException; +import ru.practicum.exception.NotUniqueException; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Slf4j +@RestControllerAdvice +public class MainServiceHandler { + + private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + + @ExceptionHandler({MissingRequestHeaderException.class, MethodArgumentNotValidException.class, + BadRequestException.class, ConstraintViolationException.class, MissingServletRequestParameterException.class}) + public ResponseEntity handleBadRequest(final Exception e) { + log.error("{} - Status: {}, Description: {}, Timestamp: {}", + "Bad Request", HttpStatus.BAD_REQUEST, e.getMessage(), LocalDateTime.now()); + + return new ResponseEntity<>(new ErrorResponse(HttpStatus.BAD_REQUEST.name(), e.getMessage(), + "Bad Request", LocalDateTime.now().format(FORMATTER)), HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler + public ResponseEntity handleInternalServerError(final Exception e) { + log.error("{} - Status: {}, Description: {}, Timestamp: {}", + "SERVER ERROR", HttpStatus.INTERNAL_SERVER_ERROR, e.getMessage(), LocalDateTime.now()); + + return new ResponseEntity<>(new ErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR.name(), e.getMessage(), + "Internal Server Error", LocalDateTime.now().format(FORMATTER)), HttpStatus.INTERNAL_SERVER_ERROR); + } + + @ExceptionHandler({ConflictException.class, DataIntegrityViolationException.class, NotUniqueException.class}) + public ResponseEntity handleConflict(final Exception e) { + log.error("{} - Status: {}, Description: {}, Timestamp: {}", + "CONFLICT", HttpStatus.CONFLICT, e.getMessage(), LocalDateTime.now()); + + return new ResponseEntity<>(new ErrorResponse(HttpStatus.CONFLICT.name(), e.getMessage(), + "Data Integrity constraint violation occurred", LocalDateTime.now().format(FORMATTER)), + HttpStatus.CONFLICT); + } + + @ExceptionHandler({NotFoundException.class}) + public ResponseEntity handleNotFound(final RuntimeException e) { + log.error("{} - Status: {}, Description: {}, Timestamp: {}", + "NOT FOUND", HttpStatus.NOT_FOUND, e.getMessage(), LocalDateTime.now()); + + return new ResponseEntity<>(new ErrorResponse(HttpStatus.NOT_FOUND.name(), e.getMessage(), + "Not Found", LocalDateTime.now().format(FORMATTER)), HttpStatus.NOT_FOUND); + } + +} \ No newline at end of file diff --git a/ewm-main-service/src/main/java/ru/practicum/mapper/UserMapper.java b/ewm-main-service/src/main/java/ru/practicum/mapper/UserMapper.java new file mode 100644 index 0000000..62ade18 --- /dev/null +++ b/ewm-main-service/src/main/java/ru/practicum/mapper/UserMapper.java @@ -0,0 +1,50 @@ +package ru.practicum.mapper; + + +import lombok.experimental.UtilityClass; +import ru.practicum.dto.AdminUserDto; +import ru.practicum.dto.UserDto; +import ru.practicum.dto.UserDtoReceived; +import ru.practicum.dto.UserShortDto; +import ru.practicum.model.User; + +import java.util.List; +import java.util.stream.Collectors; + + +public class UserMapper { + + public UserDto toUserDto(User user) { + return UserDto.builder() + .name(user.getName()) + .id(user.getId()) + .build(); + } + + public static User toUser(UserDtoReceived userDto) { + return User.builder() + .email(userDto.getEmail()) + .name(userDto.getName()) + .build(); + } + + public static UserShortDto toUserShortDto(User user) { + return UserShortDto.builder() + .id(user.getId()) + .name(user.getName()) + .build(); + } + + public static AdminUserDto toAdminUserDto(User newUser) { + return AdminUserDto.builder() + .email(newUser.getEmail()) + .id(newUser.getId()) + .name(newUser.getName()) + .build(); + } + + public static List toListAdminUserDto(List users) { + return users.stream().map(UserMapper::toAdminUserDto).collect(Collectors.toList()); + } + +} \ No newline at end of file diff --git a/ewm-main-service/src/main/java/ru/practicum/model/User.java b/ewm-main-service/src/main/java/ru/practicum/model/User.java new file mode 100644 index 0000000..4c923a6 --- /dev/null +++ b/ewm-main-service/src/main/java/ru/practicum/model/User.java @@ -0,0 +1,33 @@ +package ru.practicum.model; + + +import jakarta.persistence.*; +import lombok.*; + +@Data +@Builder +@Entity +@Table(name = "users") +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private Long id; + + @Column(name = "user_name") + private String name; + + @Column(name = "email") + private String email; + + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", name='" + name + '\'' + + ", email='" + email + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/ewm-main-service/src/main/java/ru/practicum/repository/UserMainServiceRepository.java b/ewm-main-service/src/main/java/ru/practicum/repository/UserMainServiceRepository.java new file mode 100644 index 0000000..471d6d0 --- /dev/null +++ b/ewm-main-service/src/main/java/ru/practicum/repository/UserMainServiceRepository.java @@ -0,0 +1,23 @@ +package ru.practicum.repository; + + +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import ru.practicum.model.User; + +import java.util.List; + +public interface UserMainServiceRepository extends JpaRepository { + + @Query("SELECT u " + + "FROM User u " + + "WHERE u.id IN ?1 ") + List findAllById(List id, Pageable pageable); + + @Query("SELECT u " + + "FROM User u") + List findAllUser(Pageable pageable); + + Boolean existsByEmail(String email); +} \ No newline at end of file diff --git a/ewm-main-service/src/main/java/ru/practicum/service/UserService.java b/ewm-main-service/src/main/java/ru/practicum/service/UserService.java new file mode 100644 index 0000000..dd11428 --- /dev/null +++ b/ewm-main-service/src/main/java/ru/practicum/service/UserService.java @@ -0,0 +1,14 @@ +package ru.practicum.service; + +import ru.practicum.dto.AdminUserDto; +import ru.practicum.model.User; + +import java.util.List; + +public interface UserService { + AdminUserDto createUser(User user); + + void deleteUser(Long userId); + + List readUsers(List idList, int from, int size); +} \ No newline at end of file diff --git a/ewm-main-service/src/main/java/ru/practicum/service/impl/UserServiceImpl.java b/ewm-main-service/src/main/java/ru/practicum/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..6e04aeb --- /dev/null +++ b/ewm-main-service/src/main/java/ru/practicum/service/impl/UserServiceImpl.java @@ -0,0 +1,75 @@ +package ru.practicum.service.impl; + + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import ru.practicum.dto.AdminUserDto; +import ru.practicum.exception.NotFoundException; +import ru.practicum.exception.NotUniqueException; +import ru.practicum.mapper.UserMapper; +import ru.practicum.model.User; +import ru.practicum.repository.UserMainServiceRepository; +import ru.practicum.service.UserService; + +import java.util.List; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +@Slf4j +public class UserServiceImpl implements UserService { + + + private final UserMainServiceRepository userMainServiceRepository; + + @Transactional + @Override + public AdminUserDto createUser(User user) { + log.info("createUser - invoked"); + if (userMainServiceRepository.existsByEmail(user.getEmail())) { + throw new NotUniqueException("User with this email already exists"); + } + AdminUserDto adminDto = UserMapper.toAdminUserDto(userMainServiceRepository.save(user)); + log.info("Result: user {} - created", adminDto); + return adminDto; + } + + @Transactional + @Override + public void deleteUser(Long userId) { + log.info("deleteUser - invoked"); + if (!userMainServiceRepository.existsById(userId)) { + log.error("User with id = {} not exist", userId); + throw new NotFoundException("User not found"); + } + log.info("Result: user with id = {} - removed", userId); + userMainServiceRepository.deleteById(userId); + } + + @Override + public List readUsers(List idList, int from, int size) { + log.info("readUsers - invoked"); + Pageable pageable = createPageRequestAsc(from, size); + + if (idList.isEmpty()) { + List allUsers = userMainServiceRepository.findAllUser(pageable); + log.info("Result: idList is empty, returning all users size = {}", allUsers.size()); + return allUsers; + } + List users = userMainServiceRepository.findAllById(idList, pageable); + if (users.isEmpty()) { + return List.of(); + } + log.info("Result: list of Users size = {}", users.size()); + return users; + } + + public static PageRequest createPageRequestAsc(int from, int size) { + return PageRequest.of(from, size, Sort.Direction.ASC, "id"); + } +} \ No newline at end of file diff --git a/ewm-main-service/src/main/resources/application-dev.properties b/ewm-main-service/src/main/resources/application-dev.properties index 2c7e478..e129614 100644 --- a/ewm-main-service/src/main/resources/application-dev.properties +++ b/ewm-main-service/src/main/resources/application-dev.properties @@ -3,7 +3,10 @@ logging.level.org.springframework.orm.jpa=WARN logging.level.org.springframework.transaction=WARN logging.level.org.springframework.transaction.interceptor=WARN logging.level.org.springframework.orm.jpa.JpaTransactionManager=WARN -spring.datasource.url=jdbc:postgresql://stats-db:6542/stats-db +spring.datasource.url=jdbc:postgresql://${HOST:localhost}:${PORT:7654}/${NAME:ewmMainDB} + +spring.datasource.username=root +spring.datasource.password=root #spring.datasource.url=jdbc:postgresql://${HOST:localhost}:${PORT:2323}/${NAME:ewn-db} spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect spring.datasource.driverClassName=org.postgresql.Driver \ No newline at end of file diff --git a/ewm-main-service/src/main/resources/application.properties b/ewm-main-service/src/main/resources/application.properties index 79a019c..d2dcd44 100644 --- a/ewm-main-service/src/main/resources/application.properties +++ b/ewm-main-service/src/main/resources/application.properties @@ -2,6 +2,7 @@ server.port=8080 spring.sql.init.mode=always spring.jpa.hibernate.ddl-auto=none spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect +ewm-stats-service.url=http://localhost:9090 #--- diff --git a/ewm-main-service/src/main/resources/schema.sql b/ewm-main-service/src/main/resources/schema.sql index 5e810a5..8db1807 100644 --- a/ewm-main-service/src/main/resources/schema.sql +++ b/ewm-main-service/src/main/resources/schema.sql @@ -6,14 +6,14 @@ CREATE TABLE IF NOT EXISTS users isAdmin BOOLEAN NOT NULL ); -CREATE TABLE IF NOT EXISTS requests +CREATE TABLE IF NOT EXISTS categories ( - id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, - created TIMESTAMP NOT NULL, - event INTEGER NOT NULL REFERENCES events (id) ON DELETE CASCADE, - status VARCHAR(255) NOT NULL + id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + name VARCHAR(255) NOT NULL ); + + CREATE TABLE IF NOT EXISTS events ( id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, @@ -34,10 +34,12 @@ CREATE TABLE IF NOT EXISTS events lon DOUBLE PRECISION NOT NULL ); -CREATE TABLE IF NOT EXISTS categories +CREATE TABLE IF NOT EXISTS requests ( - id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, - name VARCHAR(255) NOT NULL + id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + created TIMESTAMP NOT NULL, + event INTEGER NOT NULL REFERENCES events (id) ON DELETE CASCADE, + status VARCHAR(255) NOT NULL ); CREATE TABLE IF NOT EXISTS compilations diff --git a/ewm-stat-service/stat-client/src/main/resources/application.properties b/ewm-stat-service/stat-client/src/main/resources/application.properties index 297d1f1..c5c3852 100644 --- a/ewm-stat-service/stat-client/src/main/resources/application.properties +++ b/ewm-stat-service/stat-client/src/main/resources/application.properties @@ -1 +1,3 @@ -spring.application.name=stats-client \ No newline at end of file +spring.application.name=stats-client +spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration +ewm-stats-service.url=http://localhost:9090 diff --git a/ewm-stat-service/stat-dto/src/main/java/ru/practicum/dto/Validator.java b/ewm-stat-service/stat-dto/src/main/java/ru/practicum/dto/Validator.java new file mode 100644 index 0000000..2b01ff6 --- /dev/null +++ b/ewm-stat-service/stat-dto/src/main/java/ru/practicum/dto/Validator.java @@ -0,0 +1,7 @@ +package ru.practicum.dto; + +public interface Validator { + + interface Create {} + interface Update {} +} \ No newline at end of file From 7f935e16db0cb1f78bf4ed2eed4ce74c30194aa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=20=D0=91=D0=BE=D0=BA?= =?UTF-8?q?=D0=B0=D1=80=D0=B5=D0=B2?= Date: Tue, 17 Sep 2024 20:48:26 +0300 Subject: [PATCH 2/3] =?UTF-8?q?=D0=BF=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=20user?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../practicum/controller/UserController.java | 8 ++++++-- .../java/ru/practicum/dto/UserDtoReceived.java | 3 +++ .../java/ru/practicum/mapper/UserMapper.java | 1 + .../src/main/java/ru/practicum/model/User.java | 13 ++++--------- .../service/impl/UserServiceImpl.java | 18 +++++++++++++++++- .../main/resources/application-dev.properties | 1 + ewm-main-service/src/main/resources/schema.sql | 4 ++-- 7 files changed, 34 insertions(+), 14 deletions(-) diff --git a/ewm-main-service/src/main/java/ru/practicum/controller/UserController.java b/ewm-main-service/src/main/java/ru/practicum/controller/UserController.java index 56160e4..5396a7f 100644 --- a/ewm-main-service/src/main/java/ru/practicum/controller/UserController.java +++ b/ewm-main-service/src/main/java/ru/practicum/controller/UserController.java @@ -11,6 +11,7 @@ import ru.practicum.dto.AdminUserDto; import ru.practicum.dto.UserDtoReceived; import ru.practicum.dto.Validator; +import ru.practicum.model.User; import ru.practicum.service.UserService; import ru.practicum.mapper.UserMapper; @@ -28,8 +29,11 @@ public class UserController { @PostMapping @ResponseStatus(HttpStatus.CREATED) public ResponseEntity createUser(@RequestBody @Validated({Validator.Create.class}) UserDtoReceived userDto) { - log.info("Calling the POST request to /admin/users endpoint"); - return ResponseEntity.status(HttpStatus.CREATED).body(userService.createUser(UserMapper.toUser(userDto))); + log.info("Calling the POST request to /admin/users endpoint {}", userDto); + User user = UserMapper.toUser(userDto); + return ResponseEntity.status(HttpStatus.CREATED) + .body(userService.createUser(user)); + } diff --git a/ewm-main-service/src/main/java/ru/practicum/dto/UserDtoReceived.java b/ewm-main-service/src/main/java/ru/practicum/dto/UserDtoReceived.java index af66ccf..f0efec9 100644 --- a/ewm-main-service/src/main/java/ru/practicum/dto/UserDtoReceived.java +++ b/ewm-main-service/src/main/java/ru/practicum/dto/UserDtoReceived.java @@ -23,4 +23,7 @@ public class UserDtoReceived { @NotBlank(groups = {Validator.Create.class}) @Size(min = 2, max = 250, groups = {Validator.Create.class}) private String name; + + + private Boolean isAdmin; } \ No newline at end of file diff --git a/ewm-main-service/src/main/java/ru/practicum/mapper/UserMapper.java b/ewm-main-service/src/main/java/ru/practicum/mapper/UserMapper.java index 62ade18..5ef9405 100644 --- a/ewm-main-service/src/main/java/ru/practicum/mapper/UserMapper.java +++ b/ewm-main-service/src/main/java/ru/practicum/mapper/UserMapper.java @@ -25,6 +25,7 @@ public static User toUser(UserDtoReceived userDto) { return User.builder() .email(userDto.getEmail()) .name(userDto.getName()) + .isAdmin(userDto.getIsAdmin()) .build(); } diff --git a/ewm-main-service/src/main/java/ru/practicum/model/User.java b/ewm-main-service/src/main/java/ru/practicum/model/User.java index 4c923a6..d7ec7fd 100644 --- a/ewm-main-service/src/main/java/ru/practicum/model/User.java +++ b/ewm-main-service/src/main/java/ru/practicum/model/User.java @@ -7,6 +7,8 @@ @Data @Builder @Entity +@AllArgsConstructor +@NoArgsConstructor @Table(name = "users") public class User { @@ -21,13 +23,6 @@ public class User { @Column(name = "email") private String email; - - @Override - public String toString() { - return "User{" + - "id=" + id + - ", name='" + name + '\'' + - ", email='" + email + '\'' + - '}'; - } + @Column(name = "is_admin") + private Boolean isAdmin; } \ No newline at end of file diff --git a/ewm-main-service/src/main/java/ru/practicum/service/impl/UserServiceImpl.java b/ewm-main-service/src/main/java/ru/practicum/service/impl/UserServiceImpl.java index 6e04aeb..6e5253b 100644 --- a/ewm-main-service/src/main/java/ru/practicum/service/impl/UserServiceImpl.java +++ b/ewm-main-service/src/main/java/ru/practicum/service/impl/UserServiceImpl.java @@ -17,6 +17,7 @@ import ru.practicum.service.UserService; import java.util.List; +import java.util.Optional; @Service @RequiredArgsConstructor @@ -61,6 +62,9 @@ public List readUsers(List idList, int from, int size) { log.info("Result: idList is empty, returning all users size = {}", allUsers.size()); return allUsers; } + + idList.forEach(this::findUserById); + List users = userMainServiceRepository.findAllById(idList, pageable); if (users.isEmpty()) { return List.of(); @@ -69,7 +73,19 @@ public List readUsers(List idList, int from, int size) { return users; } - public static PageRequest createPageRequestAsc(int from, int size) { + private static PageRequest createPageRequestAsc(int from, int size) { return PageRequest.of(from, size, Sort.Direction.ASC, "id"); } + + private void findUserById(Long id) { + Optional user = userMainServiceRepository.findById(id); + + if (user.isEmpty()) { + log.error("User with id {} not found", id); + throw new NotFoundException("User with id " + id + " not found"); + } + + log.info("User with id {} found", id); + + } } \ No newline at end of file diff --git a/ewm-main-service/src/main/resources/application-dev.properties b/ewm-main-service/src/main/resources/application-dev.properties index e129614..bb2da14 100644 --- a/ewm-main-service/src/main/resources/application-dev.properties +++ b/ewm-main-service/src/main/resources/application-dev.properties @@ -4,6 +4,7 @@ logging.level.org.springframework.transaction=WARN logging.level.org.springframework.transaction.interceptor=WARN logging.level.org.springframework.orm.jpa.JpaTransactionManager=WARN spring.datasource.url=jdbc:postgresql://${HOST:localhost}:${PORT:7654}/${NAME:ewmMainDB} +spring.jpa.hibernate.ddl-auto=update spring.datasource.username=root spring.datasource.password=root diff --git a/ewm-main-service/src/main/resources/schema.sql b/ewm-main-service/src/main/resources/schema.sql index 8db1807..b0be75c 100644 --- a/ewm-main-service/src/main/resources/schema.sql +++ b/ewm-main-service/src/main/resources/schema.sql @@ -2,8 +2,8 @@ CREATE TABLE IF NOT EXISTS users ( id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, email VARCHAR(255) NOT NULL, - name VARCHAR(255) NOT NULL, - isAdmin BOOLEAN NOT NULL + user_name VARCHAR(255) NOT NULL, + is_admin BOOLEAN DEFAULT FALSE ); CREATE TABLE IF NOT EXISTS categories From 9f7abe43e326100d21bd8a581fb344f3b1dc60e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=20=D0=91=D0=BE=D0=BA?= =?UTF-8?q?=D0=B0=D1=80=D0=B5=D0=B2?= Date: Tue, 17 Sep 2024 21:03:42 +0300 Subject: [PATCH 3/3] =?UTF-8?q?=D0=BF=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D0=B7=D0=B0=D0=BC=D0=B5=D1=87=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{MainServiceHandler.java => ErrorHandler.java} | 2 +- .../ru/practicum/exception/handler/ErrorResponse.java | 9 ++------- .../practicum/repository/UserMainServiceRepository.java | 5 +++-- 3 files changed, 6 insertions(+), 10 deletions(-) rename ewm-main-service/src/main/java/ru/practicum/exception/handler/{MainServiceHandler.java => ErrorHandler.java} (98%) diff --git a/ewm-main-service/src/main/java/ru/practicum/exception/handler/MainServiceHandler.java b/ewm-main-service/src/main/java/ru/practicum/exception/handler/ErrorHandler.java similarity index 98% rename from ewm-main-service/src/main/java/ru/practicum/exception/handler/MainServiceHandler.java rename to ewm-main-service/src/main/java/ru/practicum/exception/handler/ErrorHandler.java index 6b0536e..afb0d05 100644 --- a/ewm-main-service/src/main/java/ru/practicum/exception/handler/MainServiceHandler.java +++ b/ewm-main-service/src/main/java/ru/practicum/exception/handler/ErrorHandler.java @@ -21,7 +21,7 @@ @Slf4j @RestControllerAdvice -public class MainServiceHandler { +public class ErrorHandler { private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); diff --git a/ewm-main-service/src/main/java/ru/practicum/exception/handler/ErrorResponse.java b/ewm-main-service/src/main/java/ru/practicum/exception/handler/ErrorResponse.java index 465984b..51535b9 100644 --- a/ewm-main-service/src/main/java/ru/practicum/exception/handler/ErrorResponse.java +++ b/ewm-main-service/src/main/java/ru/practicum/exception/handler/ErrorResponse.java @@ -1,8 +1,10 @@ package ru.practicum.exception.handler; +import lombok.AllArgsConstructor; import lombok.Data; @Data +@AllArgsConstructor public class ErrorResponse { private String status; @@ -10,11 +12,4 @@ public class ErrorResponse { private String message; private String timestamp; - - public ErrorResponse(String status, String reason, String message, String timestamp) { - this.status = status; - this.reason = reason; - this.message = message; - this.timestamp = timestamp; - } } \ No newline at end of file diff --git a/ewm-main-service/src/main/java/ru/practicum/repository/UserMainServiceRepository.java b/ewm-main-service/src/main/java/ru/practicum/repository/UserMainServiceRepository.java index 471d6d0..c20ef2d 100644 --- a/ewm-main-service/src/main/java/ru/practicum/repository/UserMainServiceRepository.java +++ b/ewm-main-service/src/main/java/ru/practicum/repository/UserMainServiceRepository.java @@ -4,6 +4,7 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import ru.practicum.model.User; import java.util.List; @@ -12,8 +13,8 @@ public interface UserMainServiceRepository extends JpaRepository { @Query("SELECT u " + "FROM User u " + - "WHERE u.id IN ?1 ") - List findAllById(List id, Pageable pageable); + "WHERE u.id IN ?ids ") + List findAllById(@Param("ids") List id, Pageable pageable); @Query("SELECT u " + "FROM User u")