Skip to content
Merged

Dev #313

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
6 changes: 0 additions & 6 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,6 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'

// CHAT
// web socket
implementation 'org.springframework.boot:spring-boot-starter-websocket'
implementation 'org.webjars:webjars-locator-core'
implementation 'org.webjars:sockjs-client:1.5.1'
implementation 'org.webjars:stomp-websocket:2.3.4'
// kafka
// implementation 'org.springframework.kafka:spring-kafka'

Expand Down
2 changes: 1 addition & 1 deletion src/main/java/org/myteam/server/aop/CommonCountAspect.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.myteam.server.global.util.redis.RedisCountService;
import org.myteam.server.global.util.redis.service.RedisCountService;
import org.myteam.server.global.util.redis.ServiceType;
import org.springframework.stereotype.Component;

Expand Down
20 changes: 17 additions & 3 deletions src/main/java/org/myteam/server/auth/service/TokenService.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,14 @@
import java.time.Duration;
import java.util.UUID;

import org.myteam.server.chat.info.domain.UserInfo;
import org.myteam.server.global.exception.ErrorCode;
import org.myteam.server.global.exception.PlayHiveJwtException;
import org.myteam.server.global.security.jwt.JwtProvider;
import org.myteam.server.global.util.redis.RedisService;
import org.myteam.server.global.util.redis.service.RedisService;
import org.myteam.server.global.util.redis.service.RedisUserInfoService;
import org.myteam.server.member.entity.Member;
import org.myteam.server.member.service.MemberReadService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

Expand All @@ -24,6 +28,8 @@
public class TokenService {
private final JwtProvider jwtProvider;
private final RedisService redisService;
private final RedisUserInfoService redisUserInfoService;
private final MemberReadService memberReadService;

/**
* Refresh Token 검증
Expand All @@ -40,7 +46,13 @@ public void regenerateAccessToken(HttpServletRequest request, HttpServletRespons
existRefreshToken(refreshToken);
expireRefreshToken(refreshToken);

generateAccessToken(refreshToken, response);
String newAccessToken = generateAccessToken(refreshToken, response);
log.info("member: {} regenerated new Access Token", publicId);
Member member = memberReadService.findById(publicId);

redisUserInfoService.saveUserInfo(newAccessToken,
new UserInfo(member.getPublicId(), member.getNickname(), member.getImgUrl()));
log.info("member: {} caching user info", publicId);
}

private void existRefreshToken(String refreshToken) {
Expand All @@ -57,7 +69,7 @@ private void expireRefreshToken(String refreshToken) {
}
}

private void generateAccessToken(String refreshToken, HttpServletResponse response) {
private String generateAccessToken(String refreshToken, HttpServletResponse response) {
UUID publicId = jwtProvider.getPublicId(refreshToken);
String role = jwtProvider.getRole(refreshToken);
String status = jwtProvider.getStatus(refreshToken);
Expand All @@ -66,5 +78,7 @@ private void generateAccessToken(String refreshToken, HttpServletResponse respon
status);

response.addHeader(HEADER_AUTHORIZATION, TOKEN_PREFIX + newAccessToken);

return newAccessToken;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
import org.myteam.server.global.domain.Category;
import org.myteam.server.global.util.domain.TimePeriod;
import org.myteam.server.global.util.redis.CommonCountDto;
import org.myteam.server.global.util.redis.RedisCountService;
import org.myteam.server.global.util.redis.service.RedisCountService;
import org.myteam.server.global.util.redis.ServiceType;
import org.myteam.server.home.dto.HotBoardDto;
import org.myteam.server.home.dto.NewBoardDto;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package org.myteam.server.board.service;

import lombok.RequiredArgsConstructor;
import org.myteam.server.global.util.redis.RedisCountService;
import org.myteam.server.global.util.redis.service.RedisCountService;
import org.myteam.server.global.util.redis.ServiceType;
import org.myteam.server.report.domain.DomainType;
import org.springframework.stereotype.Service;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
import org.myteam.server.global.exception.ErrorCode;
import org.myteam.server.global.exception.PlayHiveException;
import org.myteam.server.global.util.redis.CommonCountDto;
import org.myteam.server.global.util.redis.RedisCountService;
import org.myteam.server.global.util.redis.service.RedisCountService;
import org.myteam.server.global.util.redis.ServiceType;
import org.myteam.server.member.entity.Member;
import org.myteam.server.member.service.MemberReadService;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import lombok.RequiredArgsConstructor;
import org.myteam.server.global.util.redis.CommonCountDto;
import org.myteam.server.global.util.redis.RankingCacheReader;
import org.myteam.server.global.util.redis.RedisCountService;
import org.myteam.server.global.util.redis.service.RedisCountService;
import org.myteam.server.global.util.redis.ServiceType;
import org.myteam.server.report.domain.DomainType;
import org.springframework.stereotype.Component;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
package org.myteam.server.chat.controller;
package org.myteam.server.chat.block.controller;

import lombok.RequiredArgsConstructor;
import org.myteam.server.chat.dto.request.BanRequest;
import org.myteam.server.chat.dto.response.BanResponse;
import org.myteam.server.chat.service.BanService;
import org.myteam.server.chat.block.dto.request.BlockRequest.*;
import org.myteam.server.chat.block.dto.response.BlockResponse.*;
import org.myteam.server.chat.block.dto.response.BlockedMembersResponse;
import org.myteam.server.chat.block.service.BlockReadService;
import org.myteam.server.chat.block.service.BlockService;
import org.myteam.server.global.web.response.ResponseDto;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.UUID;

import static org.myteam.server.global.web.response.ResponseStatus.SUCCESS;

/**
Expand All @@ -16,16 +20,17 @@
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/bans")
public class BanController {
public class BlockController {

private final BanService banService;
private final BlockService blockService;
private final BlockReadService blockReadService;

/**
* 유저 밴하기
*/
@PostMapping
public ResponseEntity<ResponseDto<BanResponse>> banUser(@RequestBody BanRequest request) {
BanResponse response = banService.banUser(request);
public ResponseEntity<ResponseDto<SuccessBlockResponse>> banUser(@RequestBody BlockUserRequest request) {
SuccessBlockResponse response = blockService.banUser(request);
return ResponseEntity.ok(new ResponseDto(
SUCCESS.name(),
"Ban Success",
Expand All @@ -36,22 +41,22 @@ public ResponseEntity<ResponseDto<BanResponse>> banUser(@RequestBody BanRequest
/**
* 유저 밴 해제
*/
@DeleteMapping("/{username}")
public ResponseEntity<ResponseDto<String>> unbanUser(@PathVariable String username) {
String deleteName = banService.unbanUser(username);
@DeleteMapping("/{blockedId}")
public ResponseEntity<ResponseDto<String>> unbanUser(@PathVariable UUID blockedId) {
blockService.unblockUser(blockedId);
return ResponseEntity.ok(new ResponseDto(
SUCCESS.name(),
"Delete Ban Successfully",
deleteName
null
));
}

/**
* 특정 유저 밴 정보 조회
*/
@GetMapping("/{username}")
public ResponseEntity<ResponseDto<BanResponse>> getBanByUsername(@PathVariable String username) {
BanResponse response = banService.findBanByUsername(username);
@GetMapping("/{blockerId}/blocked")
public ResponseEntity<ResponseDto<BlockedMembersResponse>> getBanByPublicId(@PathVariable UUID blockerId) {
BlockedMembersResponse response = blockReadService.getBlockedUsers(blockerId);
return ResponseEntity.ok(new ResponseDto(
SUCCESS.name(),
"Find Ban Reason Successfully",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.myteam.server.chat.domain;
package org.myteam.server.chat.block.domain;

public enum BanReason {
HARASSMENT("회원에 대한 상습 비방"),
Expand Down
63 changes: 63 additions & 0 deletions src/main/java/org/myteam/server/chat/block/domain/MemberBlock.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package org.myteam.server.chat.block.domain;

import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.myteam.server.global.domain.BaseTime;
import org.myteam.server.member.entity.Member;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

@Getter
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "member_block",
uniqueConstraints = @UniqueConstraint(columnNames = {"blocker_id", "blocked_id"}))
public class MemberBlock extends BaseTime {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "blocker_id", nullable = false)
private Member blocker;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "blocked_id", nullable = false)
private Member blocked;

@ElementCollection(fetch = FetchType.LAZY)
@Enumerated(EnumType.STRING)
private List<BanReason> reasons = new ArrayList<>(); // 밴 사유

private String message;

@Builder
private MemberBlock(Member blocker, Member blocked, List<BanReason> reasons, LocalDateTime bannedAt, String message) {
this.blocker = blocker;
this.blocked = blocked;
if (reasons != null) {
this.reasons.addAll(reasons);
}
this.message = message;
}

/**
* 차단 엔티티 생성
*/
public static MemberBlock createMemberBlock(Member blocker, Member blocked, List<BanReason> reasons, String message) {
return MemberBlock.builder()
.blocker(blocker)
.blocked(blocked)
.reasons(reasons)
.bannedAt(LocalDateTime.now())
.message(message)
.build();
}

}
5 changes: 5 additions & 0 deletions src/main/java/org/myteam/server/chat/block/domain/Topic.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package org.myteam.server.chat.block.domain;

public class Topic {
public static final String TOPIC_PREFIX = "/topic/chat.match-";
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package org.myteam.server.chat.block.dto.request;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.myteam.server.chat.block.domain.BanReason;

import java.util.List;
import java.util.UUID;

public record BlockRequest() {

@Getter
@NoArgsConstructor
@AllArgsConstructor
public class BlockUserRequest {
private UUID blockedId;
private List<BanReason> reasons;
private String message;
}

@Getter
@NoArgsConstructor
@AllArgsConstructor
public class UnblockUserRequest {
private UUID blockedId;
}

@Getter
@NoArgsConstructor
@AllArgsConstructor
public class BlockCheckRequest {
private UUID blockedId;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package org.myteam.server.chat.block.dto.response;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.myteam.server.chat.block.domain.MemberBlock;

import java.util.UUID;

public record BlockResponse() {

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static final class SuccessBlockResponse {
private UUID blocker;
private UUID blocked;

public static SuccessBlockResponse createBlockResponse(MemberBlock block) {
return SuccessBlockResponse.builder()
.blocker(block.getBlocker().getPublicId())
.blocked(block.getBlocked().getPublicId())
.build();
}
}

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static final class BlockedMemberInfo {
private UUID blocked;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.myteam.server.chat.block.dto.response;

import java.util.List;
import java.util.UUID;

public record BlockedMembersResponse(List<UUID> blocked) {

public static BlockedMembersResponse from(List<UUID> blockedIds) {
return new BlockedMembersResponse(blockedIds);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.myteam.server.chat.block.repository;

import java.util.List;
import java.util.UUID;

public interface MemberBlockQueryRepository {
List<UUID> existsByBlockerPublicId(UUID blockerPublicId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.myteam.server.chat.block.repository;

import org.myteam.server.chat.block.domain.MemberBlock;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.Optional;
import java.util.UUID;

@Repository
public interface MemberBlockRepository extends JpaRepository<MemberBlock, Long>, MemberBlockQueryRepository {
boolean existsByBlockerPublicIdAndBlockedPublicId(UUID blocker, UUID blocked);
Optional<MemberBlock> findByBlockerPublicIdAndBlockedPublicId(UUID blocker, UUID blocked);
}
Loading