Skip to content
Closed
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.practicum.ewm.enums;

public enum FriendshipsStatus {
NO_FRIENDSHIP,
ONE_SIDED,
MUTUAL
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import ru.practicum.ewm.enums.EventState;
import ru.practicum.ewm.event.model.Event;
import ru.practicum.ewm.enums.EventState;

import java.time.LocalDateTime;
import java.util.List;
Expand All @@ -31,13 +31,15 @@ List<Event> findAllByAdmin(
Pageable pageable
);

List<Event> findAllByInitiatorId(Long initiatorId, Pageable pageable);
List<Event> findAllByInitiatorId(Long initiatorId, Pageable pageable);

List<Event> findAllByIdIn(List<Long> eventIds);

List<Event> findAllByIdIn(List<Long> eventIds);
boolean existsByCategoryId(Long id);

boolean existsByCategoryId(Long id);
Optional<Event> findByIdAndInitiatorId(Long eventId, Long userId);

Optional<Event> findByIdAndInitiatorId(Long eventId, Long userId);
Page<Event> findAll(Specification<Event> spec, Pageable pageable);

Page<Event> findAll(Specification<Event> spec, Pageable pageable);
}
List<Event> findByInitiatorIdIn(List<Long> initiatorIds, Pageable pageable);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package ru.practicum.ewm.subscription;

import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import ru.practicum.ewm.enums.FriendshipsStatus;
import ru.practicum.ewm.subscription.model.Subscription;
import ru.practicum.ewm.user.model.User;

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

public interface SubscriptionRepository extends JpaRepository<Subscription, Long> {
Optional<Subscription> findByFollowerAndOwner(User follower, User owner);

List<Subscription> findByFollower(User follower);

List<Subscription> findByOwner(User owner, Pageable pageable);

long countByOwnerAndFriendshipsStatusIn(User owner, List<FriendshipsStatus> friendshipsStatuses);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package ru.practicum.ewm.subscription.controller;

import jakarta.validation.Valid;
import jakarta.validation.constraints.Positive;
import jakarta.validation.constraints.PositiveOrZero;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import lombok.experimental.FieldDefaults;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import ru.practicum.ewm.event.dto.EventShortDto;
import ru.practicum.ewm.subscription.dto.NewRequestSubscription;
import ru.practicum.ewm.subscription.dto.SubscriberData;
import ru.practicum.ewm.subscription.dto.SubscriptionDto;
import ru.practicum.ewm.subscription.service.SubscriptionService;

import java.util.List;

@RestController
@RequestMapping("/users/{userId}/subscriptions")
@RequiredArgsConstructor
@Slf4j
@Validated
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
public class SubscriptionController {

SubscriptionService subscriptionService;

@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public SubscriptionDto subscribe(@PathVariable Long userId,
@Valid @RequestBody NewRequestSubscription requestSubscription) {
log.info("Получен POST запрос на подписку пользователя {} на пользователя {}", userId, requestSubscription.getOwnerId());
return subscriptionService.subscribe(userId, requestSubscription);
}

@DeleteMapping("/{ownerId}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void unsubscribe(@PathVariable Long userId, @PathVariable Long ownerId) {
log.info("Получен DELETE запрос на отписку пользователя {} от пользователя {}", userId, ownerId);
subscriptionService.unsubscribe(userId, ownerId);
}

@GetMapping("/events")
public List<EventShortDto> getEventsFromSubscriptions(@PathVariable Long userId,
@RequestParam(defaultValue = "0") @PositiveOrZero int from,
@RequestParam(defaultValue = "10") @Positive int size) {
log.info("Получен GET запрос на получение событий от подписок пользователя {}", userId);
return subscriptionService.getEventsFromSubscriptions(userId, from, size);
}

@GetMapping("/subscribers/count")
public Long getSubscriberCount(@PathVariable Long userId) {
log.info("Получен GET запрос на получение количества подписчиков пользователя {}",userId);
return subscriptionService.getSubscriberCount(userId);
}

@GetMapping("/subscribers")
public List<SubscriberData> getAllSubscribers(@PathVariable Long userId,
@RequestParam(defaultValue = "0") @PositiveOrZero int from,
@RequestParam(defaultValue = "10") @Positive int size) {
log.info("Получен GET запрос на получение всех подписчиков пользователя {}", userId);
return subscriptionService.getAllSubscribers(userId, from, size);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package ru.practicum.ewm.subscription.dto;

import jakarta.validation.constraints.NotNull;
import lombok.*;
import lombok.experimental.FieldDefaults;

@FieldDefaults(level = AccessLevel.PRIVATE)
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class NewRequestSubscription {

@NotNull
Long ownerId;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package ru.practicum.ewm.subscription.dto;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.*;
import lombok.experimental.FieldDefaults;
import ru.practicum.ewm.enums.FriendshipsStatus;

import java.time.LocalDateTime;

@FieldDefaults(level = AccessLevel.PRIVATE)
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SubscriberData {
Long userId;
String ownerName;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
LocalDateTime subscribeTime;
FriendshipsStatus friendshipsStatus;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package ru.practicum.ewm.subscription.dto;

import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.validation.constraints.NotNull;
import lombok.*;
import lombok.experimental.FieldDefaults;
import ru.practicum.ewm.enums.FriendshipsStatus;
import ru.practicum.ewm.user.dto.UserDto;

import java.time.LocalDateTime;

@FieldDefaults(level = AccessLevel.PRIVATE)
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SubscriptionDto {

Long id;
Long followerId;
UserDto owner;
@NotNull
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
LocalDateTime subscribeTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
LocalDateTime unsubscribeTime;
FriendshipsStatus friendshipsStatus;
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package ru.practicum.ewm.subscription.mapper;

import ru.practicum.ewm.enums.FriendshipsStatus;
import ru.practicum.ewm.subscription.dto.NewRequestSubscription;
import ru.practicum.ewm.subscription.dto.SubscriberData;
import ru.practicum.ewm.subscription.dto.SubscriptionDto;
import ru.practicum.ewm.subscription.model.Subscription;
import ru.practicum.ewm.user.mapper.UserMapper;
import ru.practicum.ewm.user.model.User;

import java.time.LocalDateTime;

public class SubscriptionMapper {

public static Subscription toNewSubscriptionFromRequest(User subscriber, NewRequestSubscription requestSubscription, User owner) {
return Subscription.builder()
.follower(subscriber)
.owner(owner)
.subscribeTime(LocalDateTime.now())
.unsubscribeTime(null)
.friendshipsStatus(FriendshipsStatus.NO_FRIENDSHIP)
.build();
}

public static SubscriptionDto toSubscriptionDto(Subscription subscription) {
return SubscriptionDto.builder()
.id(subscription.getId())
.followerId(subscription.getFollower().getId())
.owner(UserMapper.toUserDto(subscription.getOwner()))
.subscribeTime(subscription.getSubscribeTime())
.unsubscribeTime(subscription.getUnsubscribeTime())
.friendshipsStatus(subscription.getFriendshipsStatus())
.build();
}

public static SubscriptionDto toSubscriptionDtoWithoutUnsubscribeTime(Subscription subscription) {
return SubscriptionDto.builder()
.id(subscription.getId())
.followerId(subscription.getFollower().getId())
.owner(UserMapper.toUserDto(subscription.getOwner()))
.subscribeTime(subscription.getSubscribeTime())
.friendshipsStatus(subscription.getFriendshipsStatus())
.build();
}

public static SubscriberData toSubscriberData(Subscription subscription) {
return SubscriberData.builder()
.userId(subscription.getFollower().getId())
.ownerName(subscription.getOwner().getName())
.subscribeTime(subscription.getSubscribeTime())
.friendshipsStatus(subscription.getFriendshipsStatus())
.build();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package ru.practicum.ewm.subscription.model;

import jakarta.persistence.*;
import lombok.*;
import lombok.experimental.FieldDefaults;
import ru.practicum.ewm.enums.FriendshipsStatus;
import ru.practicum.ewm.user.model.User;

import java.time.LocalDateTime;

@FieldDefaults(level = AccessLevel.PRIVATE)
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "subscriptions")
public class Subscription {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;

@ManyToOne
@JoinColumn(name = "follower_id")
User follower;

@ManyToOne
@JoinColumn(name = "owner_id")
User owner;

@Column(name = "subscribe_time")
LocalDateTime subscribeTime;

@Column(name = "unsubscribe_time")
LocalDateTime unsubscribeTime;

@Enumerated(EnumType.STRING)
@Column(name = "friendships_status", nullable = false)
FriendshipsStatus friendshipsStatus;
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package ru.practicum.ewm.subscription.service;

import ru.practicum.ewm.event.dto.EventShortDto;
import ru.practicum.ewm.subscription.dto.NewRequestSubscription;
import ru.practicum.ewm.subscription.dto.SubscriberData;
import ru.practicum.ewm.subscription.dto.SubscriptionDto;

import java.util.List;

public interface SubscriptionService {
SubscriptionDto subscribe(Long userId, NewRequestSubscription requestSubscription);

void unsubscribe(Long userId, Long ownerId);

List<EventShortDto> getEventsFromSubscriptions(Long userId, int from, int size);

Long getSubscriberCount(Long userId);

List<SubscriberData> getAllSubscribers(Long userId, int from, int size);
}
Loading
Loading