Skip to content

Commit

Permalink
[feat] 구독 관련 controller 작성
Browse files Browse the repository at this point in the history
[feat] 구독 관련 controller 작성
  • Loading branch information
elive7 authored Jul 15, 2024
2 parents dbb5a6a + 868a393 commit 16444cd
Show file tree
Hide file tree
Showing 17 changed files with 463 additions and 440 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ public ResponseEntity<Slice<RecordInfoWithBookmark>> getBookmarkedRecords(
List<Boolean> bookmarks = recordStatService.findBookmarks(userId, records);

return ResponseEntity
.ok()
.status(HttpStatus.OK)
.body(RecordInfoWithBookmark.of(records, bookmarks));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ public interface SubscribeRepository {

// query
Slice<Subscribe> findAllBySubscribingUserId(long subscribingUserId, long cursor, Pageable pageable);
Slice<Subscribe> findAllBySubscribedUserId(long subscribedUserId, long curson, Pageable pageable);
boolean existsBySubscribingUserIdAndSubscribedUserId(long subscribingUserId, long subscribedUserId);
long countSubscribingUsers(long subscribedUserId);
long countSubscribedUsers(long subscribingUserId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,20 @@ public Slice<SubscribeEntity> findAllBySubscribingUserId(long subscribingUserId,
return new SliceImpl<>(subscribeEntities, pageable, QueryDslUtils.hasNext(pageable, subscribeEntities));
}

public Slice<SubscribeEntity> findAllBySubscribedUserId(long subscribedUserId, long cursor, Pageable pageable) {
List<SubscribeEntity> subscribeEntities = jpaQueryFactory
.selectFrom(subscribeEntity)
.where(
QueryDslUtils.ltCursorId(cursor, subscribeEntity.id),
subscribeEntity.subscribedUser.id.eq(subscribedUserId)
)
.orderBy(subscribeEntity.id.desc())
.limit(pageable.getPageSize() + 1)
.fetch();

return new SliceImpl<>(subscribeEntities, pageable, QueryDslUtils.hasNext(pageable, subscribeEntities));
}

public long countSubscribingUsers(long subscribedUserId) {
return jpaQueryFactory
.select(subscribeEntity.id.count())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,12 @@ public Slice<Subscribe> findAllBySubscribingUserId(long subscribingUserId, long
.map(SubscribeEntity::toDomain);
}

@Override
public Slice<Subscribe> findAllBySubscribedUserId(long subscribedUserId, long cursor, Pageable pageable) {
return subscribeQueryDslRepository.findAllBySubscribedUserId(subscribedUserId, cursor, pageable)
.map(SubscribeEntity::toDomain);
}

@Override
public long countSubscribingUsers(long subscribedUserId) {
return subscribeQueryDslRepository.countSubscribingUsers(subscribedUserId);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.recordy.server.subscribe.service;

import java.util.List;
import org.recordy.server.subscribe.domain.usecase.SubscribeCreate;
import org.recordy.server.user.domain.User;
import org.springframework.data.domain.Slice;
Expand All @@ -12,4 +13,6 @@ public interface SubscribeService {

// query
Slice<User> getSubscribedUsers(long subscribingUserId, long cursor, int size);
Slice<User> getSubscribingUsers(long subscribedUserId, long cursor, int size);
List<Boolean> findSubscribes(long userId, Slice<User> subscribingUsers);
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.recordy.server.subscribe.service.impl;

import java.util.List;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.recordy.server.common.message.ErrorMessage;
import org.recordy.server.subscribe.domain.Subscribe;
Expand Down Expand Up @@ -43,4 +45,17 @@ public Slice<User> getSubscribedUsers(long subscribingUserId, long cursor, int s
return subscribeRepository.findAllBySubscribingUserId(subscribingUserId, cursor, PageRequest.ofSize(size))
.map(Subscribe::getSubscribedUser);
}

@Override
public Slice<User> getSubscribingUsers(long subscribedUserId, long cursor, int size) {
return subscribeRepository.findAllBySubscribedUserId(subscribedUserId, cursor, PageRequest.ofSize(size))
.map(Subscribe::getSubscribingUser);
}

@Override
public List<Boolean> findSubscribes(long userId, Slice<User> subscribingUsers) {
return subscribingUsers.getContent().stream()
.map(subscribingUser -> subscribeRepository.existsBySubscribingUserIdAndSubscribedUserId(userId, subscribingUser.getId()))
.collect(Collectors.toList());
}
}
397 changes: 37 additions & 360 deletions src/main/java/org/recordy/server/user/controller/UserApi.java

Large diffs are not rendered by default.

162 changes: 162 additions & 0 deletions src/main/java/org/recordy/server/user/controller/UserAuthApi.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
package org.recordy.server.user.controller;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.recordy.server.auth.security.UserId;
import org.recordy.server.user.controller.dto.request.UserSignInRequest;
import org.recordy.server.user.controller.dto.request.UserSignUpRequest;
import org.recordy.server.user.controller.dto.response.UserSignInResponse;
import org.recordy.server.user.controller.dto.response.UserReissueTokenResponse;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestParam;

@Tag(name = "유저 관련 API")
public interface UserAuthApi {

@Operation(
summary = "유저 회원 가입 API",
description = "유저가 회원 가입하는 API입니다. ",
responses = {
@ApiResponse(
responseCode = "200",
description = "성공",
content = @Content(
mediaType = MediaType.APPLICATION_JSON_VALUE,
schema = @Schema(
implementation = UserSignInResponse.class
)
)
)
}
)
public ResponseEntity<UserSignInResponse> signIn(
@RequestHeader(HttpHeaders.AUTHORIZATION) String platformToken,
@RequestBody UserSignInRequest request
);

@Operation(
security = @SecurityRequirement(name = "Authorization"),
summary = "로그아웃 API",
description = "access token을 바탕으로 로그아웃을 진행하는 API입니다.",
responses = {
@ApiResponse(
responseCode = "200",
description = "요청이 성공했습니다."
),
@ApiResponse(
responseCode = "404",
description = "존재하지 않는 회원입니다.",
content = @Content
),
@ApiResponse(
responseCode = "404",
description = "인증 정보를 찾을 수 없습니다.",
content = @Content
)
}
)
public ResponseEntity signOut(
@UserId Long userId
);

@Operation(
security = @SecurityRequirement(name = "Authorization"),
summary = "유저 닉네임 중복체크 API",
description = "유저가 회원 가입할 때 닉네임을 중복체크해주는 API입니다.",
responses = {
@ApiResponse(
responseCode = "200",
description = "성공",
content = @Content(
mediaType = MediaType.APPLICATION_JSON_VALUE,
schema = @Schema(
implementation = void.class
)
)
)
}
)
public ResponseEntity<Void> checkDuplicateNickname(
@RequestParam String nickname
);

@Operation(
summary = "유저 회원 탈퇴 API",
description = "유저가 회원 탈퇴하는 API입니다.",
responses = {
@ApiResponse(
responseCode = "200",
description = "성공",
content = @Content(
mediaType = MediaType.APPLICATION_JSON_VALUE,
schema = @Schema(
implementation = void.class
)
)
)
}
)
public ResponseEntity<Void> delete(
@UserId Long userId
);

@Operation(
security = @SecurityRequirement(name = "Authorization"),
summary = "access token 재발급 API",
description = "refresh token을 바탕으로 access token을 재발급 받는 API입니다.",
responses = {
@ApiResponse(
responseCode = "200",
description = "성공",
content = @Content(
mediaType = MediaType.APPLICATION_JSON_VALUE,
schema = @Schema(
implementation = UserReissueTokenResponse.class
)
)
),
@ApiResponse(
responseCode = "404",
description = "존재하지 않는 회원입니다.",
content = @Content
),
@ApiResponse(
responseCode = "404",
description = "인증 정보를 찾을 수 없습니다.",
content = @Content
)
}
)
public ResponseEntity<UserReissueTokenResponse> reissueToken(
@RequestHeader(HttpHeaders.AUTHORIZATION) String refreshToken
);

@Operation(
summary = "유저 회원 등록 API",
description = "유저 회원 등록하는 API입니다.",
responses = {
@ApiResponse(
responseCode = "200",
description = "성공",
content = @Content(
mediaType = MediaType.APPLICATION_JSON_VALUE,
schema = @Schema(
implementation = void.class
)
)
)
}
)
public ResponseEntity<Void> signUp(
@UserId Long userId,
@RequestBody UserSignUpRequest request
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
package org.recordy.server.user.controller;


import lombok.RequiredArgsConstructor;
import org.recordy.server.auth.security.UserId;
import org.recordy.server.user.controller.dto.request.UserSignUpRequest;
import org.recordy.server.user.domain.usecase.UserSignIn;
import org.recordy.server.user.controller.dto.request.UserSignInRequest;
import org.recordy.server.user.controller.dto.response.UserReissueTokenResponse;
import org.recordy.server.user.controller.dto.response.UserSignInResponse;
import org.recordy.server.user.domain.usecase.UserSignUp;
import org.recordy.server.user.service.UserService;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RequiredArgsConstructor
@RequestMapping("/api/v1/users")
@RestController
public class UserAuthController implements UserAuthApi {

private final UserService userService;

@Override
@PostMapping("/signIn")
public ResponseEntity<UserSignInResponse> signIn(
@RequestHeader(HttpHeaders.AUTHORIZATION) String platformToken,
@RequestBody UserSignInRequest request
) {
return ResponseEntity
.status(HttpStatus.OK)
.body(UserSignInResponse.from(
userService.signIn(UserSignIn.of(platformToken, request.platformType()))
));
}

@Override
@PostMapping("/signUp")
public ResponseEntity<Void> signUp(
@UserId Long userId,
@RequestBody UserSignUpRequest request
) {
userService.signUp(UserSignUp.of(userId, request.nickname(), request.termsAgreement()));

return ResponseEntity.
status(HttpStatus.CREATED).
build();
}

@Override
@GetMapping("/check-nickname")
public ResponseEntity<Void> checkDuplicateNickname(
@RequestParam String nickname
) {
userService.validateDuplicateNickname(nickname);

return ResponseEntity
.status(HttpStatus.OK)
.build();
}

@Override
@PostMapping("/token")
public ResponseEntity<UserReissueTokenResponse> reissueToken(
@RequestHeader(HttpHeaders.AUTHORIZATION) String refreshToken
) {
return ResponseEntity
.status(HttpStatus.OK)
.body(UserReissueTokenResponse.of(
userService.reissueToken(refreshToken)
));
}

@Override
@DeleteMapping("/logout")
public ResponseEntity<Void> signOut(
@UserId Long userId
) {
userService.signOut(userId);

return ResponseEntity
.noContent()
.build();
}

@Override
@DeleteMapping
public ResponseEntity<Void> delete(
@UserId Long userId
) {
userService.delete(userId);

return ResponseEntity
.noContent()
.build();
}
}
Loading

0 comments on commit 16444cd

Please sign in to comment.