Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/dev' into test
Browse files Browse the repository at this point in the history
  • Loading branch information
wochae committed Jan 7, 2024
2 parents 2591ad6 + de88790 commit 18ecd4f
Show file tree
Hide file tree
Showing 12 changed files with 252 additions and 30 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package peer.backend.annotation.tracking;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BlacklistFreeTracking {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package peer.backend.annotation.tracking;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UserBanTracking {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package peer.backend.annotation.tracking;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UserReportTracking {

}
40 changes: 40 additions & 0 deletions src/main/java/peer/backend/aspect/UserTrackingAspect.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.time.LocalDate;
import java.util.List;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.annotation.AfterReturning;
Expand All @@ -10,6 +11,8 @@
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import peer.backend.entity.blacklist.Blacklist;
import peer.backend.entity.report.Report;
import peer.backend.entity.user.SocialLogin;
import peer.backend.entity.user.User;
import peer.backend.mongo.entity.UserTracking;
Expand Down Expand Up @@ -37,6 +40,18 @@ public void userFtLink() {
public void userWithdrawal() {
}

@Pointcut("@annotation(peer.backend.annotation.tracking.UserBanTracking)")
public void userBan() {
}

@Pointcut("@annotation(peer.backend.annotation.tracking.UserReportTracking)")
public void userReport() {
}

@Pointcut("@annotation(peer.backend.annotation.tracking.BlacklistFreeTracking)")
public void blacklistFree() {
}

@Order(2)
@AfterReturning(pointcut = "peer.backend.aspect.UserTrackingAspect.userRegistration()", returning = "user")
public void userRegistrationTracking(User user) {
Expand Down Expand Up @@ -78,4 +93,29 @@ public void userWithdrawalTracking(User user) {
userTracking.setStatus(UserTrackingStatus.WITHDRAWAL);
this.userTrackingRepository.save(userTracking);
}

@AfterReturning(pointcut = "peer.backend.aspect.UserTrackingAspect.userBan()", returning = "blacklist")
public void userBanTracking(List<Blacklist> blacklist) {
List<Long> userIdList = blacklist.stream().map(b -> b.getUser().getId())
.collect(Collectors.toList());
List<UserTracking> userTrackingList = this.userTrackingRepository.findAllByUserIdIn(
userIdList);
userTrackingList.forEach(userTracking -> userTracking.setStatus(UserTrackingStatus.BAN));
this.userTrackingRepository.saveAll(userTrackingList);
}

@AfterReturning(pointcut = "peer.backend.aspect.UserTrackingAspect.userReport()", returning = "report")
public void userReportTracking(Report report) {
User reportedUser = report.getToUser();
UserTracking userTracking = this.userTrackingRepository.findByUserId(reportedUser.getId());
userTracking.setReportCount(userTracking.getReportCount() + 1);
this.userTrackingRepository.save(userTracking);
}

@AfterReturning(pointcut = "peer.backend.aspect.UserTrackingAspect.blacklistFree()", returning = "userId")
public void blacklistFreeTracking(Long userId) {
UserTracking userTracking = this.userTrackingRepository.findByUserId(userId);
userTracking.setStatus(UserTrackingStatus.NORMAL);
this.userTrackingRepository.save(userTracking);
}
}
5 changes: 5 additions & 0 deletions src/main/java/peer/backend/config/jwt/TokenProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -142,4 +142,9 @@ public Long getExpiration(String accessToken) {
.parseClaimsJws(accessToken).getBody().getExpiration();
return (expiration.getTime() - new Date().getTime());
}

public User getUserWithToken(String token) {
Authentication jwt = this.getAuthentication(token);
return User.authenticationToUser(jwt);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,21 @@
import com.corundumstudio.socketio.listener.DisconnectListener;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import peer.backend.config.SocketIoConfig;
import peer.backend.config.jwt.TokenProvider;
import peer.backend.dto.socket.whoURDTO;
import peer.backend.dto.socket.yesWhoUAreDTO;
import peer.backend.entity.user.User;
import peer.backend.repository.team.TeamRepository;
import peer.backend.repository.team.TeamUserRepository;
import peer.backend.repository.user.UserRepository;
import peer.backend.service.socket.SocketServerService;

import java.util.EventListener;
import java.util.List;
import java.util.NoSuchElementException;

Expand All @@ -28,41 +32,41 @@
@Slf4j
@RequestMapping("/")
public class SocketIoServerController {
private final SocketIOServer server;
private final SocketServerService socketServerService;
private final UserRepository userRepository;

@Autowired
private TokenProvider tokenProvider;

private final RedisTemplate<String, String> redisTemplate;
private final TokenProvider tokenProvider;

@Autowired
public SocketIoServerController(SocketIoConfig config, SocketServerService socketServerService, UserRepository userRepository, RedisTemplate<String, String> redisTemplate) {
this.server = config.socketIOServer();
public SocketIoServerController(SocketIoConfig config,
SocketServerService socketServerService,
UserRepository userRepository,
TokenProvider tokenProvider,
RedisTemplate<String, String> redisTemplate) {
SocketIOServer server = config.socketIOServer();
this.socketServerService = socketServerService;
this.userRepository = userRepository;
this.redisTemplate = redisTemplate;
this.server.start();
this.server.addConnectListener(onUserConnectWithSocket);
this.server.addDisconnectListener(onUserDisconnectWithSocket);
this.tokenProvider = tokenProvider;
server.start();
server.addConnectListener(onUserConnectWithSocket);
server.addDisconnectListener(onUserDisconnectWithSocket);

this.server.addEventListener("checkOnline", tempDTO.class, IsHeOnline);
server.addEventListener("checkOnline", tempDTO.class, isHeOnline);
server.addEventListener("whoAmI", whoURDTO.class, whoAmI);

}

public ConnectListener onUserConnectWithSocket = new ConnectListener() {
@Override
public void onConnect(SocketIOClient client) {
log.info("Socket is Connected : " + client.getSessionId());
List<String> token = client.getHandshakeData().getUrlParams().get("token");
if (!tokenProvider.validateToken(token.get(0))) {
log.info("Wrong Token! Connection is closed!");
client.disconnect();
String token = client.getHandshakeData().getUrlParams().get("token").get(0);

if (!socketServerService.checkValidationWithToken(client, token))
return;
}
Authentication userJwt = tokenProvider.getAuthentication(token.get(0));
User user = User.authenticationToUser(userJwt);
User user = tokenProvider.getUserWithToken(token);

log.info(user.getName() + " is Online Status");
redisTemplate.opsForValue().set("onlineStatus:" + user.getId(), client.getSessionId().toString());
}
Expand All @@ -72,19 +76,18 @@ public void onConnect(SocketIOClient client) {
public DisconnectListener onUserDisconnectWithSocket = new DisconnectListener() {
@Override
public void onDisconnect(SocketIOClient client) {
List<String> token = client.getHandshakeData().getUrlParams().get("token");
Authentication userJwt = tokenProvider.getAuthentication(token.get(0));
User user = User.authenticationToUser(userJwt);
String token = client.getHandshakeData().getUrlParams().get("token").get(0);
User user = tokenProvider.getUserWithToken(token);
redisTemplate.delete("onlineStatus:" + user.getId());
log.info(user.getName() + " is offline Status");
log.info("Socket is disconnected : " + client.getSessionId());
}
};

public DataListener<tempDTO> IsHeOnline = new DataListener<>() {
public DataListener<tempDTO> isHeOnline = new DataListener<>() {
@Override
public void onData(SocketIOClient client, tempDTO data, AckRequest ackSender) throws Exception {
Long userId;
long userId;
User user;
try {
userId = Long.parseLong(data.getData());
Expand All @@ -105,4 +108,28 @@ public void onData(SocketIOClient client, tempDTO data, AckRequest ackSender) th
}
}
};

public DataListener<whoURDTO> whoAmI = new DataListener<>() {
@Override
public void onData(SocketIOClient client, whoURDTO data, AckRequest ackSender){
String token = client.getHandshakeData().getUrlParams().get("token").get(0);
if (!socketServerService.checkValidationWithToken(client, token))
return ;
User target = tokenProvider.getUserWithToken(token);
yesWhoUAreDTO result = null;
try {
result = socketServerService.makeUserInfo(target, data);
} catch (Exception e) {
client.sendEvent("whoAmI", e.getMessage());
client.disconnect();
return;
}
if (result == null) {
client.sendEvent("whoAmI", "잘못된 요청입니다.");
client.disconnect();
return;
}
client.sendEvent("whoAmI", result);
}
};
}
13 changes: 13 additions & 0 deletions src/main/java/peer/backend/dto/socket/whoURDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package peer.backend.dto.socket;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@AllArgsConstructor
@NoArgsConstructor
public class whoURDTO {
public String teamId;
public String teamName;
}
18 changes: 18 additions & 0 deletions src/main/java/peer/backend/dto/socket/yesWhoUAreDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package peer.backend.dto.socket;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import peer.backend.entity.team.enums.TeamUserRoleType;

@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class yesWhoUAreDTO {
public String userId;
public String teamId;
public String teamName;
public TeamUserRoleType yourRole;
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package peer.backend.mongo.repository;

import java.util.List;
import org.bson.types.ObjectId;
import org.springframework.data.mongodb.repository.MongoRepository;
import peer.backend.mongo.entity.UserTracking;

public interface UserTrackingRepository extends MongoRepository<UserTracking, ObjectId> {

UserTracking findByUserId(Long id);

List<UserTracking> findAllByUserIdIn(List<Long> idList);
}
21 changes: 18 additions & 3 deletions src/main/java/peer/backend/service/blacklist/BlacklistService.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,13 @@
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import peer.backend.annotation.tracking.BlacklistFreeTracking;
import peer.backend.annotation.tracking.UserBanTracking;
import peer.backend.entity.blacklist.Blacklist;
import peer.backend.entity.blacklist.BlacklistType;
import peer.backend.entity.report.ReportHandleType;
import peer.backend.entity.user.User;
import peer.backend.exception.NotFoundException;
import peer.backend.repository.blacklist.BlacklistRepository;
import peer.backend.service.UserService;

Expand All @@ -22,8 +25,9 @@ public class BlacklistService {
private final BlacklistRepository blacklistRepository;
private final UserService userService;

@UserBanTracking
@Transactional
public void addBlacklistToUserList(List<User> userList,
public List<Blacklist> addBlacklistToUserList(List<User> userList,
BlacklistType type, String content) {
List<Blacklist> blacklist = new ArrayList<>();

Expand All @@ -32,6 +36,7 @@ public void addBlacklistToUserList(List<User> userList,
}

this.blacklistRepository.saveAll(blacklist);
return blacklist;
}

@Transactional
Expand All @@ -45,9 +50,13 @@ public void addBlacklistToEmail(String email, BlacklistType type, String content
this.blacklistRepository.save(new Blacklist(user, type, content));
}

@BlacklistFreeTracking
@Transactional
public void deleteBlacklist(Long blacklistId) {
this.blacklistRepository.deleteById(blacklistId);
public Long deleteBlacklist(Long blacklistId) {
Blacklist blacklist = this.getBlacklist(blacklistId);
Long userId = blacklist.getUser().getId();
this.blacklistRepository.delete(blacklist);
return userId;
}

@Transactional
Expand All @@ -66,4 +75,10 @@ public BlacklistType getBlacklistTypeToReportHandleType(

return result;
}

@Transactional
public Blacklist getBlacklist(Long blacklistId) {
return this.blacklistRepository.findById(blacklistId)
.orElseThrow(() -> new NotFoundException("존재하지 않는 아이디입니다."));
}
}
6 changes: 4 additions & 2 deletions src/main/java/peer/backend/service/report/ReportService.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import peer.backend.annotation.tracking.UserReportTracking;
import peer.backend.entity.report.Report;
import peer.backend.entity.report.ReportStatus;
import peer.backend.entity.report.ReportType;
Expand All @@ -24,16 +25,17 @@ public class ReportService {
private final ReportRepository reportRepository;
private final UserRepository userRepository;

@UserReportTracking
@Transactional
public void save(User from, Long toId, ReportType type, String content) {
public Report save(User from, Long toId, ReportType type, String content) {
User to = userRepository.findById(toId)
.orElseThrow(() -> new NotFoundException("존재하지 않는 유저입니다."));

if (from.getId().equals(to.getId())) {
throw new ConflictException("자기 자신은 신고할 수 없습니다.");
}

this.reportRepository.save(new Report(from, to, type, content));
return this.reportRepository.save(new Report(from, to, type, content));
}

@Transactional
Expand Down
Loading

0 comments on commit 18ecd4f

Please sign in to comment.