Skip to content

Commit

Permalink
Fix/dib (#96)
Browse files Browse the repository at this point in the history
* Fix: 찜하기 응답 페이지 수정

* Feat: sse 연결 추가
  • Loading branch information
flowerdonk authored Aug 10, 2023
1 parent 85d1096 commit ce64304
Show file tree
Hide file tree
Showing 9 changed files with 57 additions and 62 deletions.
7 changes: 3 additions & 4 deletions src/main/java/com/anywayclear/controller/AlarmController.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,9 @@ public ResponseEntity<Void> createTopic(@PathVariable String topicName) {
return ResponseEntity.created(URI.create("api/alarms/" + topic)).build();
}

@PostMapping(value = "/topic/{topicName}/subscribe", produces = "text/event-stream")
@GetMapping(value = "/topic/{topicName}/subscribe", produces = "text/event-stream")
public ResponseEntity<SseEmitter> subscribeTopic(@PathVariable String topicName, @AuthenticationPrincipal OAuth2User oAuth2User,
@RequestHeader(value = "Last-Event_ID", required = false) String lastEventId, HttpServletResponse response) {
// alarmService.subscribeTopic(topicName);
System.out.println("OAuth UserName : " + oAuth2User);
return new ResponseEntity<>(alarmService.subscribeTopic(topicName, "username", lastEventId, LocalDateTime.now()), HttpStatus.OK);
}
Expand All @@ -58,7 +57,7 @@ public ResponseEntity<AlarmResponseList> getSubscribeAlarmList(@PathVariable Str
return ResponseEntity.ok(alarmService.getSubscribeAlarmList(memberId));
}
@GetMapping("/{memberId}/dibs")
public ResponseEntity<AlarmResponseList> getDibAlarmList(@PathVariable String memberId, @PageableDefault(size = 10, sort = "id", direction = Sort.Direction.DESC) Pageable pageable) {
return ResponseEntity.ok(alarmService.getDibAlarmList(memberId, pageable));
public ResponseEntity<AlarmResponseList> getDibAlarmList(@PathVariable String memberId) {
return ResponseEntity.ok(alarmService.getDibAlarmList(memberId));
}
}
9 changes: 6 additions & 3 deletions src/main/java/com/anywayclear/controller/DibController.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package com.anywayclear.controller;

import com.anywayclear.dto.request.DibCreateRequest;
import com.anywayclear.dto.response.DibResponse;
import com.anywayclear.dto.response.DibResponseList;
import com.anywayclear.dto.response.IsDibResponse;
import com.anywayclear.dto.response.MultiResponse;
import com.anywayclear.entity.Dib;
import com.anywayclear.service.DibService;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
Expand Down Expand Up @@ -30,9 +33,9 @@ public ResponseEntity<Void> createDib(@Valid @RequestBody DibCreateRequest reque
return ResponseEntity.created(URI.create("api/dibs/" + id)).build();
}

@GetMapping
public ResponseEntity<DibResponseList> getDibList(@RequestParam(name = "userId") String userId, @PageableDefault(size = 10, sort = "id", direction = Sort.Direction.DESC) Pageable pageable) {
return ResponseEntity.ok(dibService.getDibList(userId, pageable));
@GetMapping("/{userId}")
public ResponseEntity<MultiResponse<DibResponse, Dib>> getDibList(@PathVariable("userId") String userId, Pageable pageable) {
return ResponseEntity.ok(dibService.getDibPage(userId, pageable));
}

@GetMapping("/{produce-id}/member")
Expand Down
14 changes: 7 additions & 7 deletions src/main/java/com/anywayclear/dto/response/DibResponse.java
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,14 @@ public DibResponse(Long id, String title, int startPrice, String image, String s
this.userId = userId;
}

public static DibResponse toResponse(Produce produce) {
public static DibResponse toResponse(Dib dib) {
return DibResponse.builder()
.id(produce.getId())
.title(produce.getName())
.startPrice(produce.getStartPrice())
.image(produce.getImage())
.sellerName(produce.getSeller().getNickname())
.userId(produce.getSeller().getUserId())
.id(dib.getProduce().getId())
.title(dib.getProduce().getName())
.startPrice(dib.getProduce().getStartPrice())
.image(dib.getProduce().getImage())
.sellerName(dib.getProduce().getSeller().getNickname())
.userId(dib.getProduce().getSeller().getUserId())
.build();
}
}
10 changes: 4 additions & 6 deletions src/main/java/com/anywayclear/dto/response/DibResponseList.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,11 @@
@Getter
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class DibResponseList {
private Page<DibResponse> dibResponseList;
private List<DibResponse> dibResponseList;

public DibResponseList(final List<Produce> dibList, Pageable pageable) {
this.dibResponseList = new PageImpl<>(dibList.stream()
public DibResponseList(final List<Dib> dibList) {
this.dibResponseList = dibList.stream()
.map(DibResponse::toResponse)
.collect(Collectors.toList()),
pageable,
dibList.size());
.collect(Collectors.toList());
}
}
4 changes: 3 additions & 1 deletion src/main/java/com/anywayclear/repository/DibRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@

public interface DibRepository extends JpaRepository<Dib, Long> {

List<Dib> findAllByConsumer(Member member); // 찜 중인 농산물 찾기
Page<Dib> findAllByConsumer(Member member, Pageable pageable); // 찜 중인 농산물 찾기 (페이지)

List<Dib> findAllByConsumer(Optional<Member> member); // 찜 중인 농산물 찾기

List<Dib> findAllByProduce(Produce produce); // 해당 농산물을 찜한 소비자 찾기

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,37 +10,37 @@
import java.util.stream.Collectors;

@Repository
public class SSEInMemoryRepository implements SSERepository{
public class SSEInMemoryRepository{
private final Map<String, SseEmitter> sseEmitterMap = new ConcurrentHashMap<>();

@Override
public void put(String key, SseEmitter sseEmitter) {
sseEmitterMap.put(key, sseEmitter);
}

@Override
public Optional<SseEmitter> get(String key) {
return Optional.ofNullable(sseEmitterMap.get(key));
}

@Override
public List<SseEmitter> getListByKeyPrefix(String keyPrefix){
return sseEmitterMap.keySet().stream()
.filter(key -> key.startsWith(keyPrefix))
.map(sseEmitterMap::get)
.collect(Collectors.toList());
}

@Override
public List<String> getKeyListByKeyPrefix(String keyPrefix){
return sseEmitterMap.keySet().stream()
.filter(key -> key.startsWith(keyPrefix))
.collect(Collectors.toList());
}


@Override
public void remove(String key) {
sseEmitterMap.remove(key);
}

public void deleteAllByKeyPrefix(String keyPrefix) {
sseEmitterMap.forEach((key, emitter) -> {
if (key.startsWith(keyPrefix)) sseEmitterMap.remove(key);
});
}
}
2 changes: 2 additions & 0 deletions src/main/java/com/anywayclear/repository/SSERepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,6 @@ public interface SSERepository {
List<String> getKeyListByKeyPrefix(String keyPrefix);

void remove(String key);

void deleteAllByKeyPrefix(String keyPrefix);
}
46 changes: 19 additions & 27 deletions src/main/java/com/anywayclear/service/AlarmService.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,12 @@

import com.anywayclear.dto.response.*;
import com.anywayclear.entity.Alarm;
import com.anywayclear.entity.Dib;
import com.anywayclear.entity.Member;
import com.anywayclear.repository.DibRepository;
import com.anywayclear.repository.MemberRepository;
import com.anywayclear.repository.SSEInMemoryRepository;
import com.anywayclear.repository.SubscribeRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Pageable;
import org.springframework.data.redis.core.RedisTemplate;
Expand All @@ -14,11 +19,8 @@
import javax.annotation.PostConstruct;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.HashSet;
import java.util.*;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;

Expand All @@ -42,8 +44,11 @@ public class AlarmService {
// 구독 목록 불러오기 위한 서비스
private final SubscribeService subscribeService;

// 찜 목록 불러오기 위한 서비스
private final DibService dibService;
// 찜 목록 불러오기 위한 리포지토리
private final DibRepository dibRepository;

// 유저Id로 유저 객체를 찾기 위한 리포지토리
private final MemberRepository memberRepository;

// topic 이름으로 topic 정보를 가져와 메시지를 발송할 수 있도록 Map에 저장
private Map<String, ChannelTopic> channels;
Expand All @@ -63,23 +68,9 @@ public String createTopic(String topicName) { // 신규 Topic을 생성하고 Li
}

public SseEmitter subscribeTopic(String topicName, String userId, String lastEventId, LocalDateTime now) {
// RedisPubSubAdapter<String, String> listener = new RedisPubSubAdapter<String, String>() {
// @Override
// public void message(String channel, String message) {
// System.out.println(String.format("subscribe -> Channel: %s, Message: %s", channel, message));
// }
// };
//
// StatefulRedisPubSubConnection<String, String> pubsubConn = Main.redisClient.connectPubSub();
// pubsubConn.addListener(listener);
// RedisPubSubAsyncCommands<String, String> async = pubsubConn.async();
// async.subscribe(topicName);
//
//// application flow continues

// Pub/Sub Topic 찾아서 리스너 연결
ChannelTopic topic = channels.get(topicName);
redisMessageListener.addMessageListener(redisSubscribeService, topic);
// ChannelTopic topic = channels.get(topicName);
// redisMessageListener.addMessageListener(redisSubscribeService, topic);

// SSE 연결
// emitter에 키에 토픽, 유저 정보를 담기
Expand All @@ -100,7 +91,7 @@ public SseEmitter subscribeTopic(String topicName, String userId, String lastEve
sseRepository.put(key, emitter);
try {
emitter.send(SseEmitter.event()
.name("CONNCECTED")
.name("CONNCECTED") // 클라이언트에서 식별하는 이벤트 이름
.id(key)
.data("subscribe"));
} catch (IOException exception) {
Expand Down Expand Up @@ -147,14 +138,15 @@ public AlarmResponseList getSubscribeAlarmList(String memberId) { // 해당 유
return new AlarmResponseList(alarmList);
}

public AlarmResponseList getDibAlarmList(String memberId, Pageable pageable) { // 해당 유저의 알림 리스트 불러오기
public AlarmResponseList getDibAlarmList(String memberId) { // 해당 유저의 알림 리스트 불러오기
// 패턴 매칭 사용 -> member:memberId:alarm:*

// [1] 유저의 찜 목록 불러오기
DibResponseList dibResponseList = dibService.getDibList(memberId, pageable);
Optional<Member> member = memberRepository.findByUserId(memberId);
List<Dib> dibList = dibRepository.findAllByConsumer(member);
Set<String> keys = new HashSet<>(); // Set을 사용하여 중복된 값 제거
for (DibResponse response : dibResponseList.getDibResponseList()) {
String produce = response.getId().toString(); // Response 객체에서 sender 필드 값을 추출
for (Dib dib : dibList) {
String produce = dib.getProduce().getId().toString(); // Response 객체에서 sender 필드 값을 추출
keys.add(produce); // keys 집합에 sender 값 추가
}

Expand Down
13 changes: 6 additions & 7 deletions src/main/java/com/anywayclear/service/DibService.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.anywayclear.dto.response.DibResponse;
import com.anywayclear.dto.response.DibResponseList;
import com.anywayclear.dto.response.IsDibResponse;
import com.anywayclear.dto.response.MultiResponse;
import com.anywayclear.entity.Dib;
import com.anywayclear.entity.Member;
import com.anywayclear.entity.Produce;
Expand Down Expand Up @@ -45,16 +46,14 @@ public Long createDib(DibCreateRequest request) {

public DibResponse getDib(Long id) {
Dib dib = dibRepository.findById(id).orElseThrow(() -> new RuntimeException("아이디가 없습니다."));
return DibResponse.toResponse(dib.getProduce());
return DibResponse.toResponse(dib);
}

public DibResponseList getDibList(String userId, Pageable pageable) { // 찜 중인 농산물 리스트 반환
public MultiResponse<DibResponse, Dib> getDibPage(String userId, Pageable pageable) { // 찜 중인 농산물 리스트 반환
Member member = memberRepository.findByUserId(userId).orElseThrow(() -> new RuntimeException("해당 userId의 유저가 없습니다."));
List<Produce> dibList = dibRepository.findAllByConsumer(member)
.stream()
.map(Dib::getProduce)
.collect(Collectors.toList());
return new DibResponseList(dibList, pageable);
Page<Dib> dibPage = dibRepository.findAllByConsumer(member, pageable);
List<DibResponse> dibResponseList = dibPage.map(DibResponse::toResponse).getContent();
return new MultiResponse<>(dibResponseList, dibPage);
}

public IsDibResponse getIsDib(String userId, long produceId) {
Expand Down

0 comments on commit ce64304

Please sign in to comment.