Skip to content

Commit

Permalink
feat: 유저 탈퇴 시에 해당 유저 관련 정보 삭제
Browse files Browse the repository at this point in the history
  • Loading branch information
umi0410 committed Dec 2, 2021
1 parent 96ce203 commit 722de76
Show file tree
Hide file tree
Showing 15 changed files with 155 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import com.khumu.alimi.data.ResourceKind;
import com.khumu.alimi.data.dto.*;
import com.khumu.alimi.data.entity.ResourceNotificationSubscription;
import com.khumu.alimi.service.NotifyAnnouncementCrawledService;
import com.khumu.alimi.service.AnnouncementService;
import com.khumu.alimi.service.notification.NotificationService;
import lombok.*;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -23,7 +23,7 @@
@RestController
public class NotificationController {
private final NotificationService notificationService;
private final NotifyAnnouncementCrawledService announcementEventService;
private final AnnouncementService announcementEventService;

@RequestMapping(value="/ping", method=RequestMethod.GET)
public String ping() {
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/khumu/alimi/data/ResourceKind.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package com.khumu.alimi.data;

public enum ResourceKind {
comment, article, announcement, study_article, haksa_schedule
user, comment, article, announcement, study_article, haksa_schedule
}
41 changes: 41 additions & 0 deletions src/main/java/com/khumu/alimi/data/dto/KhumuUserDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.khumu.alimi.data.dto;

import lombok.*;

/**
* 이벤트 메시지로 전달받는 유저 정보. 이 중 필요한 필드만 사용한다.
{
"last_login": null,
"is_active": true,
"date_joined": "2021-12-03T03:27:35.493",
"username": "jinsu.dev",
"kind": "guest",
"nickname": "\\uac1c\\ubc1c\\ud558\\ub294 \\ud638\\ub791\\uc774",
"student_number": "2000123123",
"department": "\\ud559\\uacfc \\ubbf8\\uc124\\uc815",
"created_at": "2021-12-03T03:27:35.493",
"status": "deleted",
"is_superuser": false,
"profile_image": null,
"info21_authenticated_at": null,
"groups": [],
"user_permissions": []
}
*/
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@Builder
public class KhumuUserDto {
private String username;

@Override
public String toString() {
return "KhumuUserDto{" +
"username='" + username + '\'' +
'}';
}
}


Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,10 @@
"sub_link": "http://ce.khu.ac.kr/index.php?hCode=BOARD&page=view&idx=2330&bo_idx=1",
"date": "2021-08-06 11:15:38",
"author": {
"id": 1,
"author_name": "컴퓨터공학과",
"followed": false
"id": 1,
"author_name": "컴퓨터공학과",
"followed": false
}
},
"followers": [
"jinsu", "bo314"
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/com/khumu/alimi/data/entity/PushDevice.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,9 @@ public class PushDevice {
@Id
String deviceToken;
String user;

// 해당 기기에서 유저 정보를 삭제합니다.
public void deleteUserInfo() {
user = null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,7 @@
import com.khumu.alimi.data.dto.*;
import com.khumu.alimi.data.resource.ArticleResource;
import com.khumu.alimi.external.slack.SlackNotifier;
import com.khumu.alimi.service.NotifyAnnouncementCrawledService;
import com.khumu.alimi.service.notification.ArticleEventService;
import com.khumu.alimi.service.notification.CommentEventService;
import com.khumu.alimi.service.notification.HaksaScheduleEventService;
import com.khumu.alimi.service.*;
import io.awspring.cloud.messaging.listener.annotation.SqsListener;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -19,9 +16,10 @@
@Slf4j
@RequiredArgsConstructor
public class SqsMessageListener {
final NotifyAnnouncementCrawledService announcementEventService;
final ArticleEventService articleEventMessageService;
final CommentEventService commentEventMessageService;
final AnnouncementService announcementEventService;
final ArticleService articleEventMessageService;
final CommentService commentEventMessageService;
final DeleteUserService deleteUserService;
final HaksaScheduleEventService haksaScheduleEventService;
final ObjectMapper objectMapper;
final SlackNotifier slackNotifier;
Expand All @@ -38,25 +36,42 @@ public void receiveMessage(SqsMessageBodyDto body) {
// body.getMessage()는 각각의 리소스들의 Dto를 Json 문자열로 나타낸 것이다.
// 예를 들어 CommentDto의 Json 문자열 버젼.
switch (resourceKind){
case user: {
KhumuUserDto khumuUserDto = objectMapper.readValue(body.getMessage(), KhumuUserDto.class);
switch (eventMessageDto.getEventKind()) {
case delete:
deleteUserService.delete(khumuUserDto);
break;
default:
log.error("지원하지 않는 resource_kind와 event_kind의 조합입니다." + eventKind);
break;
}
} break;
case comment:{
CommentDto commentDto = objectMapper.readValue(body.getMessage(), CommentDto.class);
switch (eventMessageDto.getEventKind()) {
case create:
commentEventMessageService.subscribeArticle(commentDto);
commentEventMessageService.createNotificationsForNewComment(commentDto);
break;
default:
log.error("지원하지 않는 resource_kind와 event_kind의 조합입니다." + eventKind);
break;
}
} break;
case article: {
ArticleResource article = objectMapper.readValue(body.getMessage(), ArticleResource.class);
switch (eventKind) {
case create:{
articleEventMessageService.subscribeByNewArticle(article);
}break;
} break;

case new_hot_article:{
articleEventMessageService.notifyNewHotArticle(article);
}break;
} break;
default:
log.error("지원하지 않는 resource_kind와 event_kind의 조합입니다." + eventKind);
break;
}
} break;
case announcement:{
Expand All @@ -66,6 +81,9 @@ public void receiveMessage(SqsMessageBodyDto body) {
slackNotifier.sendSlack("새로운 공지사항에 대한 알림을 보냅니다.", event.getAnnouncement().getTitle());
announcementEventService.notifyNewAnnouncementCrawled(event);
} break;
default:
log.error("지원하지 않는 resource_kind와 event_kind의 조합입니다." + eventKind);
break;
}
} break;
case haksa_schedule:{
Expand All @@ -75,10 +93,14 @@ public void receiveMessage(SqsMessageBodyDto body) {
HaksaScheduleDto haksaScheduleDto = objectMapper.readValue(body.getMessage(), HaksaScheduleDto.class);
haksaScheduleEventService.createNotificationForHaksaScheduleStarts(haksaScheduleDto);
} break;
default:
log.error("지원하지 않는 resource_kind와 event_kind의 조합입니다." + eventKind);
break;
}
} break;
default:
System.out.println("default");
log.error("지원하지 않는 resource_kind와 event_kind의 조합입니다." + eventKind);
break;
}

} catch (Exception e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,4 +54,8 @@ public PushDevice save(PushDevice subscription) {
public void delete(PushDevice device) {
pushDeviceRepository.delete(device);
}

public void deleteAll(Iterable<PushDevice> devices){
pushDeviceRepository.deleteAll(devices);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ public interface ResourceNotificationSubscriptionRepository extends JpaRepositor
List<ResourceNotificationSubscription> findAllByResourceKindAndResourceId(ResourceKind resourceKind, Long resourceId);
List<ResourceNotificationSubscription> findAllBySubscriberAndResourceKindAndResourceId(String subscriberId, ResourceKind resourceKind, Long resourceId);

List<ResourceNotificationSubscription> findAllBySubscriber(String subscriberId);

// 해당 유저의 해당 ResourceKind의 ResourceNotificationSubscription을 조회하거나 만들고 조회함.
default ResourceNotificationSubscription getOrCreate(ResourceNotificationSubscription subscription){
// user의 해당 리소스에 대한 구독 정보를 조회해주거나
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
@Slf4j
@RequiredArgsConstructor
@Service
public class NotifyAnnouncementCrawledService {
public class AnnouncementService {
private final NotificationRepository notificationRepository;
private final CustomPushDeviceRepository pushDeviceRepository;
private final CustomPushOptionRepository pushOptionRepository;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.khumu.alimi.service.notification;
package com.khumu.alimi.service;

import com.khumu.alimi.data.ResourceKind;
import com.khumu.alimi.data.dto.EventMessageDto;
Expand All @@ -9,6 +9,7 @@
import com.khumu.alimi.repository.CustomPushOptionRepository;
import com.khumu.alimi.repository.NotificationRepository;
import com.khumu.alimi.repository.PushDeviceRepository;
import com.khumu.alimi.service.notification.NotificationService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
Expand All @@ -21,7 +22,7 @@
@Slf4j
@RequiredArgsConstructor
@Service
public class ArticleEventService {
public class ArticleService {
final NotificationRepository notificationRepository;
final NotificationService notificationService;
final PushDeviceRepository pushDeviceRepository;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.khumu.alimi.service.notification;
package com.khumu.alimi.service;

import com.google.gson.Gson;
import com.khumu.alimi.data.ResourceKind;
Expand All @@ -7,6 +7,7 @@
import com.khumu.alimi.data.entity.*;
import com.khumu.alimi.external.push.PushManager;
import com.khumu.alimi.repository.*;
import com.khumu.alimi.service.notification.NotificationService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
Expand All @@ -25,7 +26,7 @@
@Service
@RequiredArgsConstructor
@Slf4j
public class CommentEventService {
public class CommentService {
final NotificationRepository notificationRepository;
final CustomPushDeviceRepository pushDeviceRepository;
final CustomPushOptionRepository pushOptionRepository;
Expand Down
45 changes: 45 additions & 0 deletions src/main/java/com/khumu/alimi/service/DeleteUserService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.khumu.alimi.service;

import com.khumu.alimi.data.dto.KhumuUserDto;
import com.khumu.alimi.data.entity.PushDevice;
import com.khumu.alimi.data.entity.ResourceNotificationSubscription;
import com.khumu.alimi.repository.NotificationRepository;
import com.khumu.alimi.repository.PushDeviceRepository;
import com.khumu.alimi.repository.ResourceNotificationSubscriptionRepository;
import com.khumu.alimi.service.notification.NotificationService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
* 게시물 관련된 이벤트가 발생했을 때 무슨 작업을 수행할 것인지.
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class DeleteUserService {
private final ResourceNotificationSubscriptionRepository resourceNotificationSubscriptionRepository;
private final PushDeviceRepository pushDeviceRepository;

@Transactional
// 유저와 관련된 정보들을 삭제합니다.
public void delete(KhumuUserDto user) {
log.info(user + "와 관련된 정보를 삭제합니다.");
if (user == null || user.getUsername() == null) {
log.error("유저 정보가 존재하지 않습니다. " + user);
throw new RuntimeException("유저 정보가 존재하지 않음");
} else {
List<PushDevice> devices = pushDeviceRepository.findAllByUser(user.getUsername());
for (PushDevice device : devices) {
// @Transactional 있어야 함.
device.deleteUserInfo();
}

List<ResourceNotificationSubscription> subscriptions = resourceNotificationSubscriptionRepository.findAllBySubscriber(user.getUsername());
resourceNotificationSubscriptionRepository.deleteAll(subscriptions);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.khumu.alimi.service.notification;
package com.khumu.alimi.service;

import com.google.firebase.messaging.FirebaseMessagingException;
import com.google.gson.Gson;
Expand All @@ -14,6 +14,7 @@
import com.khumu.alimi.repository.CustomPushOptionRepository;
import com.khumu.alimi.repository.NotificationRepository;
import com.khumu.alimi.repository.ResourceNotificationSubscriptionRepository;
import com.khumu.alimi.service.notification.NotificationService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.jni.Local;
Expand Down
9 changes: 9 additions & 0 deletions src/main/java/com/khumu/alimi/service/PushService.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,15 @@ public PushDevice subscribePush(PushDevice subscriptionReq){
return subscription;
}

@Transactional
public List<PushDevice> unsubscribe(String username) {
List<PushDevice> devices = pushDeviceRepository.findAllByUser(username);
pushDeviceRepository.deleteAll(devices);
log.info(username + "의 Device 정보들을 삭제합니다.");

return devices;
}

@Transactional
// 딱히 Dto를 사용할 것도 없네.
public Map<PushOptionKind, PushOption> getPushOption(SimpleKhumuUserDto requestUser, String username) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,11 @@
@Service
@RequiredArgsConstructor
public class NotificationService {

final NotificationRepository nr;
final ResourceNotificationSubscriptionRepository resourceNotificationSubscriptionRepository;

final NotificationMapper notificationMapper;

public Notification getNotification(Long id) {
Notification n = nr.findById(id).get();
return n;
Expand Down

0 comments on commit 722de76

Please sign in to comment.