Skip to content

Commit

Permalink
feat: Friend CRUD (#44)
Browse files Browse the repository at this point in the history
* ✨ feat: friend crud (related: #41)

* 🔨 add: user thumbnail
  • Loading branch information
Zerohertz authored Feb 18, 2025
1 parent 2b82e6b commit 324199f
Show file tree
Hide file tree
Showing 16 changed files with 325 additions and 147 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,9 @@
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

import com.server.domain.friend.dto.GetFriendOutDto;
import com.server.domain.friend.enums.FriendState;
import com.server.domain.friend.dto.GetFriendListOutDto;
import com.server.domain.friend.dto.GetFriendRequestOutDto;
import com.server.domain.friend.enums.FriendRequestState;
import com.server.domain.friend.service.FriendService;
import com.server.global.dto.ApiResponseDto;

Expand Down Expand Up @@ -43,12 +44,12 @@ public ApiResponseDto<String> createFriendRequest(HttpServletRequest request,

@ResponseStatus(HttpStatus.OK)
@GetMapping("/request")
@Operation(summary = "친구 내역 조회", description = "사용자 기준 신청 보낸 내역")
public ApiResponseDto<List<GetFriendOutDto>> getFriendRequest(
@RequestParam(required = false) FriendState state,
@Operation(summary = "친구 신청 내역 조회", description = "사용자 기준 신청 보낸 내역")
public ApiResponseDto<List<GetFriendRequestOutDto>> getFriendRequest(
@RequestParam(required = false) FriendRequestState state,
HttpServletRequest request) {
List<GetFriendOutDto> getUserOutDtos = friendService.getRequestUser(request, state);
return ApiResponseDto.success(HttpStatus.OK.value(), getUserOutDtos);
List<GetFriendRequestOutDto> getFriendRequestOutDtos = friendService.getRequestUser(request, state);
return ApiResponseDto.success(HttpStatus.OK.value(), getFriendRequestOutDtos);
}

@ResponseStatus(HttpStatus.OK)
Expand All @@ -63,10 +64,10 @@ public ApiResponseDto<String> deleteFriendRequest(HttpServletRequest request,

@ResponseStatus(HttpStatus.OK)
@GetMapping("/receipt")
@Operation(summary = "친구 내역 조회", description = "사용자 기준 신청 받은 내역")
public ApiResponseDto<List<GetFriendOutDto>> getFriendReceipt(HttpServletRequest request,
@RequestParam(required = false) FriendState state) {
List<GetFriendOutDto> getUserOutDtos = friendService.getReceiptUser(request, state);
@Operation(summary = "친구 신청 내역 조회", description = "사용자 기준 신청 받은 내역")
public ApiResponseDto<List<GetFriendRequestOutDto>> getFriendReceipt(HttpServletRequest request,
@RequestParam(required = false) FriendRequestState state) {
List<GetFriendRequestOutDto> getUserOutDtos = friendService.getReceiptUser(request, state);
return ApiResponseDto.success(HttpStatus.OK.value(), getUserOutDtos);
}

Expand All @@ -79,4 +80,12 @@ public ApiResponseDto<String> approveFriendRequest(HttpServletRequest request,
return ApiResponseDto.success(HttpStatus.CREATED.value(), String.format(
"The friend request from User '%s' to User '%s' has been accepted.", requestUsername, receiptUsername));
}

@ResponseStatus(HttpStatus.OK)
@GetMapping("")
@Operation(summary = "친구 내역 조회", description = "사용자 기준 승인된 친구 내역")
public ApiResponseDto<List<GetFriendListOutDto>> getFriends(HttpServletRequest request) {
List<GetFriendListOutDto> getFriendListOutDtos = friendService.getFriends(request);
return ApiResponseDto.success(HttpStatus.OK.value(), getFriendListOutDtos);
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package com.server.domain.friend.dto;

import com.server.domain.friend.enums.FriendState;
import com.server.domain.friend.enums.FriendListState;
import com.server.domain.user.dto.UserDto;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class GetFriendOutDto extends UserDto {
private FriendState state;
public class GetFriendListOutDto extends UserDto {
private FriendListState state;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.server.domain.friend.dto;

import com.server.domain.friend.enums.FriendRequestState;
import com.server.domain.user.dto.UserDto;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class GetFriendRequestOutDto extends UserDto {
private FriendRequestState state;
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import com.server.domain.friend.enums.FriendState;
import com.server.domain.friend.enums.FriendListState;
import com.server.domain.user.entity.User;
import com.server.global.error.code.FriendErrorCode;
import com.server.global.error.exception.BusinessException;
Expand Down Expand Up @@ -37,9 +37,9 @@
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Table(name = "friends", uniqueConstraints = {
@Table(name = "friend_list", uniqueConstraints = {
@UniqueConstraint(columnNames = { "request_user_id", "receipt_user_id" }) })
public class Friend {
public class FriendList {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Expand All @@ -57,7 +57,7 @@ public class Friend {
@Column(name = "state")
@Enumerated(EnumType.STRING)
@Setter
private FriendState state;
private FriendListState state;

@Column(name = "created_at", nullable = false)
@CreationTimestamp
Expand Down
78 changes: 78 additions & 0 deletions src/main/java/com/server/domain/friend/entity/FriendRequest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package com.server.domain.friend.entity;

import java.time.LocalDateTime;

import org.hibernate.annotations.CreationTimestamp;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import com.server.domain.friend.enums.FriendRequestState;
import com.server.domain.user.entity.User;
import com.server.global.error.code.FriendErrorCode;
import com.server.global.error.exception.BusinessException;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.PrePersist;
import jakarta.persistence.PreUpdate;
import jakarta.persistence.Table;
import jakarta.persistence.UniqueConstraint;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Entity
@EntityListeners(AuditingEntityListener.class)
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Table(name = "friend_request", uniqueConstraints = {
@UniqueConstraint(columnNames = { "request_user_id", "receipt_user_id" }) })
public class FriendRequest {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "friend_id")
private Long id;

@ManyToOne
@JoinColumn(name = "request_user_id", nullable = false)
private User requestUser;

@ManyToOne
@JoinColumn(name = "receipt_user_id", nullable = false)
private User receiptUser;

@Column(name = "state")
@Enumerated(EnumType.STRING)
@Setter
private FriendRequestState state;

@Column(name = "created_at", nullable = false)
@CreationTimestamp
private LocalDateTime createdAt;

@Column(name = "updated_at", nullable = false)
@LastModifiedDate
private LocalDateTime updatedAt;

@PrePersist
@PreUpdate
private void validateRecursiveRequest() {
if (requestUser.getUsername().equals(receiptUser.getUsername())) {
throw new BusinessException(FriendErrorCode.SELF_FRIEND_REQUEST_NOT_ALLOWED);
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.server.domain.friend.enums;

public enum FriendListState {
NEUTRAL,
BLOCKED
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.server.domain.friend.enums;

public enum FriendState {
public enum FriendRequestState {
SENDING,
REMOVED,
ACCEPTED
REJECTED
}
10 changes: 7 additions & 3 deletions src/main/java/com/server/domain/friend/mapper/FriendMapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,18 @@
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

import com.server.domain.friend.dto.GetFriendOutDto;
import com.server.domain.friend.enums.FriendState;
import com.server.domain.friend.dto.GetFriendListOutDto;
import com.server.domain.friend.dto.GetFriendRequestOutDto;
import com.server.domain.friend.enums.FriendListState;
import com.server.domain.friend.enums.FriendRequestState;
import com.server.domain.user.entity.User;

@Mapper(componentModel = "spring")
public interface FriendMapper {

FriendMapper INSTANCE = Mappers.getMapper(FriendMapper.class);

GetFriendOutDto toGetFriendOutDto(User user, FriendState state);
GetFriendRequestOutDto toGetFriendOutDto(User user, FriendRequestState state);

GetFriendListOutDto toGetFriendOutDto(User user, FriendListState state);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.server.domain.friend.repository;

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

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

import com.server.domain.friend.entity.FriendList;
import com.server.domain.user.entity.User;

@Repository
public interface FriendListRepository extends JpaRepository<FriendList, Long> {

Optional<List<FriendList>> findByRequestUser(User requestUser);

Optional<List<FriendList>> findByReceiptUser(User receiptUser);

Optional<FriendList> findByRequestUserAndReceiptUser(User requestUser, User receiptUser);
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.server.domain.friend.repository;

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

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

import com.server.domain.friend.entity.FriendRequest;
import com.server.domain.friend.enums.FriendRequestState;
import com.server.domain.user.entity.User;

@Repository
public interface FriendRequestRepository extends JpaRepository<FriendRequest, Long> {

Optional<List<FriendRequest>> findByRequestUser(User requestUser);

Optional<List<FriendRequest>> findByReceiptUser(User receiptUser);

Optional<FriendRequest> findByRequestUserAndReceiptUser(User requestUser, User receiptUser);

Optional<List<FriendRequest>> findByRequestUserAndState(User requestUser, FriendRequestState state);

Optional<List<FriendRequest>> findByReceiptUserAndState(User receiptUser, FriendRequestState state);

void deleteById(Long id);
}
Loading

0 comments on commit 324199f

Please sign in to comment.