Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions main-service/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,13 @@
<artifactId>querydsl-jpa</artifactId>
<classifier>jakarta</classifier>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.practicum.exception;

public class ConflictException extends RuntimeException {
public ConflictException(String message) {
super(message);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,18 @@

import jakarta.validation.ConstraintViolationException;

import ru.practicum.exception.ForbiddenAccessException;
import ru.practicum.exception.IllegalEventUpdateException;
import ru.practicum.exception.NotFoundException;
import ru.practicum.exception.ValidationException;
import ru.practicum.exception.dto.ApiError;
import ru.practicum.exception.dto.Violation;
import ru.practicum.exception.*;

import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;

import lombok.extern.slf4j.Slf4j;

Expand All @@ -45,6 +44,33 @@ public ApiError handleException(Exception e) {
LocalDateTime.now());
}

@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler({
MissingServletRequestParameterException.class,
MethodArgumentTypeMismatchException.class
})
public ApiError handleRequestParamException(Exception e) {
log.warn(e.getMessage(), e);
return new ApiError(
null,
e.getMessage(),
"Incorrect request",
HttpStatus.BAD_REQUEST.toString(),
LocalDateTime.now());
}

@ResponseStatus(HttpStatus.CONFLICT)
@ExceptionHandler(ConflictException.class)
public ApiError handleConflictException(ConflictException e) {
log.warn(e.getMessage(), e);
return new ApiError(
null,
e.getMessage(),
"Conflict",
HttpStatus.CONFLICT.toString(),
LocalDateTime.now());
}

@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(ConstraintViolationException.class)
public ApiError handleConstraintValidationException(ConstraintViolationException e) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package ru.practicum.request.controller;

import java.util.List;

import jakarta.validation.Valid;

import ru.practicum.request.dto.EventRequestStatusUpdateRequest;
import ru.practicum.request.dto.EventRequestStatusUpdateResult;
import ru.practicum.request.dto.ParticipationRequestDto;
import ru.practicum.request.service.ParticipationRequestService;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/users/{userId}/events/{eventId}/requests")
public class ParticipationRequestEventPrivateController {

private final ParticipationRequestService requestService;

@GetMapping
public List<ParticipationRequestDto> getEventRequests(
@PathVariable Long userId, @PathVariable Long eventId) {
log.info("Get requests for eventId={} by initiator userId={}", eventId, userId);
return requestService.getEventRequestsByInitiator(userId, eventId);
}

@PatchMapping
public EventRequestStatusUpdateResult updateRequestsStatus(
@PathVariable Long userId,
@PathVariable Long eventId,
@Valid @RequestBody EventRequestStatusUpdateRequest updateRequest) {
log.info(
"Update requests status for eventId={} by userId={}, requestIds={}, status={}",
eventId,
userId,
updateRequest.requestIds(),
updateRequest.status());
return requestService.updateEventRequestsStatus(userId, eventId, updateRequest);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package ru.practicum.request.controller;

import java.util.List;

import ru.practicum.request.dto.ParticipationRequestDto;
import ru.practicum.request.service.ParticipationRequestService;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/users/{userId}/requests")
public class ParticipationRequestPrivateController {

private final ParticipationRequestService requestService;

@PostMapping
public ParticipationRequestDto createRequest(
@PathVariable Long userId, @RequestParam Long eventId) {
log.info("Create participation request userId={}, eventId={}", userId, eventId);
return requestService.createRequest(userId, eventId);
}

@GetMapping
public List<ParticipationRequestDto> getUserRequests(@PathVariable Long userId) {
log.info("Get participation requests by userId={}", userId);
return requestService.getUserRequests(userId);
}

@PatchMapping("/{requestId}/cancel")
public ParticipationRequestDto cancelRequest(
@PathVariable Long userId, @PathVariable Long requestId) {
log.info("Cancel participation request userId={}, requestId={}", userId, requestId);
return requestService.cancelRequest(userId, requestId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package ru.practicum.request.mapper;

import java.util.List;

import ru.practicum.request.dto.ParticipationRequestDto;
import ru.practicum.request.model.ParticipationRequest;

import lombok.experimental.UtilityClass;

@UtilityClass
public class ParticipationRequestMapper {

public ParticipationRequestDto toDto(ParticipationRequest request) {
if (request == null) {
return null;
}
return new ParticipationRequestDto(
request.getCreated(),
request.getEvent().getId(),
request.getId(),
request.getRequester().getId(),
request.getStatus().name());
}

public List<ParticipationRequestDto> toDtoList(List<ParticipationRequest> requests) {
if (requests == null) {
return List.of();
}
return requests.stream().map(ParticipationRequestMapper::toDto).toList();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,6 @@
public enum EventRequestStatus {
PENDING,
CONFIRMED,
REJECTED
REJECTED,
CANCELED
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,36 @@

import java.time.LocalDateTime;

import jakarta.persistence.*;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
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 ru.practicum.event.model.Event;
import ru.practicum.user.model.User;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.FieldDefaults;
import lombok.*;

@Entity
@Table(name = "participation_request")
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "participation_request")
@FieldDefaults(level = AccessLevel.PRIVATE)
public class ParticipationRequest {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package ru.practicum.request.repository;

import java.util.Collection;
import java.util.List;

import ru.practicum.request.model.EventRequestStatus;
import ru.practicum.request.model.ParticipationRequest;

import org.springframework.data.jpa.repository.JpaRepository;

public interface ParticipationRequestRepository extends JpaRepository<ParticipationRequest, Long> {
boolean existsByEvent_IdAndRequester_Id(Long eventId, Long requesterId);

List<ParticipationRequest> findAllByRequester_IdOrderByCreatedDesc(Long requesterId);

List<ParticipationRequest> findAllByEvent_IdOrderByCreatedAsc(Long eventId);

long countByEvent_IdAndStatus(Long eventId, EventRequestStatus status);

List<ParticipationRequest> findAllByIdInAndEvent_Id(Collection<Long> ids, Long eventId);

List<ParticipationRequest> findAllByEvent_IdAndStatus(Long eventId, EventRequestStatus status);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package ru.practicum.request.service;

import java.util.List;

import ru.practicum.request.dto.EventRequestStatusUpdateRequest;
import ru.practicum.request.dto.EventRequestStatusUpdateResult;
import ru.practicum.request.dto.ParticipationRequestDto;

public interface ParticipationRequestService {
ParticipationRequestDto createRequest(Long userId, Long eventId);

List<ParticipationRequestDto> getUserRequests(Long userId);

ParticipationRequestDto cancelRequest(Long userId, Long requestId);

List<ParticipationRequestDto> getEventRequestsByInitiator(Long userId, Long eventId);

EventRequestStatusUpdateResult updateEventRequestsStatus(
Long userId, Long eventId, EventRequestStatusUpdateRequest request);
}
Loading