Skip to content

Commit

Permalink
refactor: Glass, Dispenser API, WebSocket
Browse files Browse the repository at this point in the history
  • Loading branch information
lomayd committed Nov 11, 2022
1 parent b018352 commit efbd302
Show file tree
Hide file tree
Showing 12 changed files with 181 additions and 135 deletions.
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ dependencies {
implementation 'io.springfox:springfox-swagger2:2.9.2'
implementation 'io.springfox:springfox-swagger-ui:2.9.2'
implementation 'io.jsonwebtoken:jjwt:0.9.1'
implementation 'com.googlecode.json-simple:json-simple:1.1.1'

compileOnly 'org.projectlombok:lombok'
runtimeOnly 'mysql:mysql-connector-java'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public ResponseEntity<DispenserResponseDto.DrinkerLogin> drinkerLogin() {
return ResponseEntity.ok(dispenserService.drinkerLogin());
}

@ApiOperation("디스펜서 정보 조회")
@ApiOperation("디스펜서 조회")
@GetMapping("/dispenser")
@ResponseStatus(HttpStatus.OK)
public ResponseEntity<DispenserResponseDto.DispenserInfo> getDispenser() {
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,12 @@ public static class DrinkerLogin {
@NoArgsConstructor
@AllArgsConstructor
public static class DispenserInfo {
private String id;
private String dispenserId;
private Boolean started;

public static DispenserResponseDto.DispenserInfo of(Dispenser dispenser) {
return DispenserInfo.builder()
.id(dispenser.getId())
.dispenserId(dispenser.getId())
.started(dispenser.isStarted())
.build();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,21 @@
import dcom.ssdbackend.api.domain.dispenser.dto.DispenserResponseDto;
import dcom.ssdbackend.api.domain.dispenser.repository.DispenserRepository;
import dcom.ssdbackend.api.global.jwt.JwtProvider;
import dcom.ssdbackend.api.global.websocket.WebSocketHandler;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.web.socket.WebSocketSession;

import java.util.List;
import java.util.Map;

@Service
@RequiredArgsConstructor
public class DispenserService {
private final DispenserRepository dispenserRepository;
private final JwtProvider jwtProvider;


public DispenserResponseDto.DrinkerLogin drinkerLogin(){
Dispenser dispenser = dispenserRepository.findById(jwtProvider.getDispenserTokenInHeader()).get();
String drinkerToken = jwtProvider.generateDrinkerToken(dispenser.getId());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@
import org.springframework.stereotype.Service;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;


Expand All @@ -14,35 +18,52 @@
public class DispenserSocketService {
private final DispenserRepository dispenserRepository;

public void startDispenser(WebSocketSession session,String payLoadMessage, Map<WebSocketSession,String> sessions) throws Exception{
// startDispenser:{dispenserId}
String dispenserId = payLoadMessage.substring(15);
public void dispenserLogin(WebSocketSession session, String dispenserId, Map<String, List<WebSocketSession>> drinkerMap, Map<String, WebSocketSession> keyDispenserMap, Map<WebSocketSession, String> valueDispenserMap) {
drinkerMap.put(dispenserId, new ArrayList<>());
keyDispenserMap.put(dispenserId, session);
valueDispenserMap.put(session, dispenserId);
}

public void drinkerLogin(WebSocketSession session, String dispenserId, Map<String, List<WebSocketSession>> drinkerMap) {
List<WebSocketSession> drinkerWebSocketSessionList = drinkerMap.get(dispenserId);
drinkerWebSocketSessionList.add(session);
}

public void startDispenser(String dispenserId, Map<String, List<WebSocketSession>> drinkerMap, Map<String, WebSocketSession> keyDispenserMap) throws IOException {
Dispenser dispenser = dispenserRepository.findById(dispenserId).get();

dispenser.setStarted(true);

dispenserRepository.save(dispenser);

for (WebSocketSession s : sessions.keySet()) {
if (sessions.get(s).equals(dispenserId)) {
s.sendMessage(new TextMessage("술자리가 시작되었습니다!"));
List<WebSocketSession> drinkerWebSocketSessionList = drinkerMap.get(dispenserId);
WebSocketSession dispenserWebSocketSession = keyDispenserMap.get(dispenserId);

if (!drinkerWebSocketSessionList.isEmpty() && keyDispenserMap.containsKey(dispenserId)) {
for (WebSocketSession s : drinkerWebSocketSessionList) {
s.sendMessage(new TextMessage("{\"eventType\":\"start\"}"));
}

dispenserWebSocketSession.sendMessage(new TextMessage("{\"eventType\":\"start\"}"));
}
}

public void stopDispenser(WebSocketSession session,String payLoadMessage, Map<WebSocketSession,String> sessions) throws Exception{
// stopDispenser:{dispenserId}
String dispenserId = payLoadMessage.substring(14);
public void stopDispenser(String dispenserId, Map<String, List<WebSocketSession>> drinkerMap, Map<String, WebSocketSession> keyDispenserMap) throws IOException {
Dispenser dispenser = dispenserRepository.findById(dispenserId).get();

dispenser.setStarted(false);

dispenserRepository.save(dispenser);

for (WebSocketSession s : sessions.keySet()) {
if (sessions.get(s).equals(dispenserId)) {
s.sendMessage(new TextMessage("술자리가 종료되었습니다!"));
List<WebSocketSession> drinkerWebSocketSessionList = drinkerMap.get(dispenserId);
WebSocketSession dispenserWebSocketSession = keyDispenserMap.get(dispenserId);

if (!drinkerWebSocketSessionList.isEmpty() && keyDispenserMap.containsKey(dispenserId)) {
for (WebSocketSession s : drinkerWebSocketSessionList) {
s.sendMessage(new TextMessage("{\"eventType\":\"stop\"}"));
}

dispenserWebSocketSession.sendMessage(new TextMessage("{\"eventType\":\"stop\"}"));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;
import java.util.List;

@Api(tags = {"Glass Controller"})
Expand All @@ -20,24 +21,39 @@
public class GlassController {
private final GlassService glassService;

@ApiOperation("술잔 정보 조회")
@ApiOperation("술잔 등록")
@PostMapping("/glass")
@ResponseStatus(HttpStatus.OK)
public ResponseEntity<Void> addGlass(@Validated @RequestBody GlassRequestDto.AddGlass addGlass) throws IOException {
glassService.addGlass(addGlass);
return ResponseEntity.status(HttpStatus.OK).build();
}

@ApiOperation("술잔 조회")
@GetMapping("/glass")
@ResponseStatus(HttpStatus.OK)
public ResponseEntity<List<GlassResponseDto.GlassInfo>> getGlass() {
return ResponseEntity.ok(glassService.getGlass());
}

@ApiOperation("술잔 정보 수정")
@ApiOperation("술잔 수정")
@PatchMapping("/glass/{glassId}")
public ResponseEntity<Void> updateGlass(@ApiParam(value="술잔 ID", required = true) @PathVariable final String glassId, @Validated @RequestBody GlassRequestDto.UpdateGlass updateGlass) {
public ResponseEntity<Void> updateGlass(@ApiParam(value="술잔 ID", required = true) @PathVariable final String glassId, @Validated @RequestBody GlassRequestDto.UpdateGlass updateGlass) throws IOException {
glassService.updateGlass(glassId,updateGlass);
return ResponseEntity.status(HttpStatus.CREATED).build();
}

@ApiOperation("술잔 정보 삭제")
@ApiOperation("술잔 삭제")
@DeleteMapping("/glass/{glassId}")
public ResponseEntity<Void> deleteGlass(@ApiParam(value="술잔 ID", required = true) @PathVariable final String glassId) {
public ResponseEntity<Void> deleteGlass(@ApiParam(value="술잔 ID", required = true) @PathVariable final String glassId) throws IOException {
glassService.deleteGlass(glassId);
return ResponseEntity.status(HttpStatus.ACCEPTED).build();
}

@ApiOperation("술 마시기")
@PatchMapping("/glass/{glassId}/drink")
public ResponseEntity<Void> updateGlass(@ApiParam(value="술잔 ID", required = true) @PathVariable final String glassId) throws IOException {
glassService.drinkOneGlass(glassId);
return ResponseEntity.status(HttpStatus.OK).build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,18 @@
import lombok.*;

public class GlassRequestDto {
@ApiModel(value="사용자의 술잔 정보 수정")
@ApiModel(value="술잔 등록")
@Builder
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public static class AddGlass {
private String glassId;
private String dispenserId;
}

@ApiModel(value="술잔 수정")
@Builder
@Getter
@Setter
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,24 +7,24 @@
import java.util.stream.Collectors;

public class GlassResponseDto {
@ApiModel(value = "술잔 정보 조회")
@ApiModel(value = "술잔 조회")
@Builder
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public static class GlassInfo{
private String id;
public static class GlassInfo {
private String glassId;
private String drinkerName;
private String detail;
private Integer totalCapacity;
private Integer currentDrink;
private Long lastDrinkTimeStamp;
private String dispenserId;

public static GlassInfo of(Glass glass){
public static GlassInfo of(Glass glass) {
return GlassInfo.builder()
.id(glass.getId())
.glassId(glass.getId())
.drinkerName(glass.getDrinkerName())
.detail(glass.getDetail())
.totalCapacity(glass.getTotalCapacity())
Expand All @@ -37,5 +37,5 @@ public static GlassInfo of(Glass glass){
public static List<GlassInfo> of(List<Glass> glasses) {
return glasses.stream().map(GlassInfo::of).collect(Collectors.toList());
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,48 +1,100 @@
package dcom.ssdbackend.api.domain.glass.service;

import dcom.ssdbackend.api.domain.dispenser.Dispenser;
import dcom.ssdbackend.api.domain.dispenser.repository.DispenserRepository;
import dcom.ssdbackend.api.domain.glass.Glass;
import dcom.ssdbackend.api.domain.glass.dto.GlassRequestDto;
import dcom.ssdbackend.api.domain.glass.dto.GlassResponseDto;
import dcom.ssdbackend.api.domain.glass.repository.GlassRepository;
import dcom.ssdbackend.api.global.jwt.JwtProvider;
import dcom.ssdbackend.api.global.websocket.WebSocketHandler;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;

import java.io.IOException;
import java.util.List;
import java.util.Map;

@Service
@RequiredArgsConstructor
public class GlassService {
private final GlassRepository glassRepository;
private final DispenserRepository dispenserRepository;
private final JwtProvider jwtProvider;


public void addGlass(GlassRequestDto.AddGlass addGlass) throws IOException{
Glass glass = new Glass();
Dispenser dispenser = dispenserRepository.findById(addGlass.getDispenserId()).get();

glass.setId(addGlass.getGlassId());
glass.setDispenser(dispenser);
glass.setCurrentDrink(0);
glass.setLastDrinkTimeStamp(0L);

glassRepository.save(glass);

List<WebSocketSession> drinkerWebSocketSessionList = WebSocketHandler.drinkerMap.get(glass.getDispenser().getId());

if(!drinkerWebSocketSessionList.isEmpty()) {
for (WebSocketSession s : drinkerWebSocketSessionList) {
s.sendMessage(new TextMessage("{\"eventType\":\"change\"}"));
}
}
}

public List<GlassResponseDto.GlassInfo> getGlass(){
String drinkerToken = jwtProvider.getDrinkerTokenInHeader();
boolean bool = jwtProvider.verifyDrinkerToken(drinkerToken);
List<Glass> glasses = glassRepository.findAll();
return GlassResponseDto.GlassInfo.of(glasses);
}

public void updateGlass(String glassId, GlassRequestDto.UpdateGlass updateGlass) {
public void updateGlass(String glassId, GlassRequestDto.UpdateGlass updateGlass) throws IOException {
Glass glass = glassRepository.findById(glassId).get();

glass.setDrinkerName(updateGlass.getDrinkerName());
glass.setDetail(updateGlass.getDetail());
glass.setTotalCapacity(updateGlass.getTotalCapacity());

glass.builder()
.id(glass.getId())
.drinkerName(glass.getDrinkerName())
.detail(glass.getDetail())
.totalCapacity(glass.getTotalCapacity())
.currentDrink(glass.getCurrentDrink())
.lastDrinkTimeStamp(glass.getLastDrinkTimeStamp())
.dispenser(glass.getDispenser())
.build();

glassRepository.save(glass);

List<WebSocketSession> drinkerWebSocketSessionList = WebSocketHandler.drinkerMap.get(glass.getDispenser().getId());

if(!drinkerWebSocketSessionList.isEmpty()) {
for (WebSocketSession s : drinkerWebSocketSessionList) {
s.sendMessage(new TextMessage("{\"eventType\":\"change\"}"));
}
}
}

public void deleteGlass(String glassId) {
glassRepository.deleteById(glassId);
public void deleteGlass(String glassId) throws IOException {
Glass glass = glassRepository.findById(glassId).get();

List<WebSocketSession> drinkerWebSocketSessionList = WebSocketHandler.drinkerMap.get(glass.getDispenser().getId());

glassRepository.delete(glass);

if(!drinkerWebSocketSessionList.isEmpty()) {
for (WebSocketSession s : drinkerWebSocketSessionList) {
s.sendMessage(new TextMessage("{\"eventType\":\"change\"}"));
}
}
}

public void drinkOneGlass(String glassId) throws IOException{
Glass glass = glassRepository.findById(glassId).get();

List<WebSocketSession> drinkerWebSocketSessionList = WebSocketHandler.drinkerMap.get(glass.getDispenser().getId());

glass.setCurrentDrink(glass.getCurrentDrink() + 1);
glass.setLastDrinkTimeStamp(System.currentTimeMillis());
glassRepository.save(glass);

if(!drinkerWebSocketSessionList.isEmpty()) {
for (WebSocketSession s : drinkerWebSocketSessionList) {
s.sendMessage(new TextMessage("{\"eventType\":\"change\"}"));
}
}
}
}
Loading

0 comments on commit efbd302

Please sign in to comment.