Skip to content
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ public class ChangedRouteDTO {
@Schema(description = "현재", example = "")
private final RouteDifferInfo current;
@Schema(description = "해당 버전 (과거)", example = "")
private final RouteDifferInfo revision;
private final RouteDifferInfo difference;

public static ChangedRouteDTO of(Long id, RouteDifferInfo current, RouteDifferInfo revision) {
return new ChangedRouteDTO(id, current, revision);
public static ChangedRouteDTO of(Long id, RouteDifferInfo current, RouteDifferInfo difference) {
return new ChangedRouteDTO(id, current, difference);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package com.softeer5.uniro_backend.admin.repository;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.hibernate.envers.AuditReader;
import org.hibernate.envers.AuditReaderFactory;
Expand Down Expand Up @@ -35,4 +38,19 @@ public void deleteAllAfterVersionId(Long univId, Long versionId) {
.executeUpdate();
}

public List<Route> findUpdatedRouteByUnivIdWithNodes(Long univId, Long versionId) {
AuditReader auditReader = AuditReaderFactory.get(entityManager);
List<Route> allRevisions = auditReader.createQuery()
.forRevisionsOfEntity(Route.class, true, true)
.add(AuditEntity.revisionNumber().gt(versionId))
.add(AuditEntity.property("univId").eq(univId))
.addOrder(AuditEntity.revisionNumber().asc())
.getResultList();

Map<Long, Route> uniqueRoutesMap = new HashMap<>();
for (Route route : allRevisions) {
uniqueRoutesMap.put(route.getId(), route);
}
return new ArrayList<>(uniqueRoutesMap.values());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import com.softeer5.uniro_backend.common.exception.custom.AdminException;
import com.softeer5.uniro_backend.common.exception.custom.RouteException;
import com.softeer5.uniro_backend.map.dto.response.GetAllRoutesResDTO;
import com.softeer5.uniro_backend.map.dto.response.GetChangedRoutesByRevisionResDTO;
import com.softeer5.uniro_backend.map.dto.response.GetRiskRoutesResDTO;
import com.softeer5.uniro_backend.map.dto.response.NodeInfoResDTO;
import com.softeer5.uniro_backend.map.entity.Node;
Expand Down Expand Up @@ -98,14 +99,7 @@ public void rollbackRev(Long univId, Long versionId){
}

public GetAllRoutesByRevisionResDTO getAllRoutesByRevision(Long univId, Long versionId){
revInfoRepository.findById(versionId)
.orElseThrow(() -> new AdminException("invalid version id", INVALID_VERSION_ID));

List<Route> revRoutes = routeAuditRepository.getAllRoutesAtRevision(univId, versionId);

if(revRoutes.isEmpty()) {
throw new RouteException("Route Not Found", ROUTE_NOT_FOUND);
}
List<Route> revRoutes = getRevRoutes(univId,versionId);
GetAllRoutesResDTO routesInfo = routeCalculator.assembleRoutes(revRoutes);

Map<Long, Route> revRouteMap = new HashMap<>();
Expand Down Expand Up @@ -134,19 +128,55 @@ public GetAllRoutesByRevisionResDTO getAllRoutesByRevision(Long univId, Long ver

//시작점이 1개인 nodeList 생성
List<Node> endNodes = determineEndNodes(lostAdjMap, lostNodeMap);
LostRoutesDTO lostRouteDTO = LostRoutesDTO.of(mapNodeInfo(lostNodeMap), routeCalculator.getCoreRoutes(lostAdjMap, endNodes));

List<NodeInfoResDTO> lostNodeInfos = lostNodeMap.entrySet().stream()
.map(entry -> {
Node node = entry.getValue();
return NodeInfoResDTO.of(entry.getKey(), node.getX(), node.getY());
})
.toList();
return GetAllRoutesByRevisionResDTO.of(routesInfo, getRiskRoutesResDTO, lostRouteDTO, changedRoutes);
}

LostRoutesDTO lostRouteDTO = LostRoutesDTO.of(lostNodeInfos, routeCalculator.getCoreRoutes(lostAdjMap, endNodes));
public GetChangedRoutesByRevisionResDTO getChangedRoutesByRevision(Long univId, Long versionId) {
List<Route> revRoutes = getRevRoutes(univId,versionId);

return GetAllRoutesByRevisionResDTO.of(routesInfo, getRiskRoutesResDTO, lostRouteDTO, changedRoutes);
Map<Long, Route> revRouteMap = new HashMap<>();
for(Route revRoute : revRoutes){
revRouteMap.put(revRoute.getId(), revRoute);
}

List<Route> routes = routeAuditRepository.findUpdatedRouteByUnivIdWithNodes(univId,versionId);

Map<Long, List<Route>> lostAdjMap = new HashMap<>();
Map<Long, Node> lostNodeMap = new HashMap<>();
List<ChangedRouteDTO> changedRoutes = new ArrayList<>();

for(Route route : routes){
if(revRouteMap.containsKey(route.getId())){
Route revRoute = revRouteMap.get(route.getId());
handleRevisionRoute(revRoute, route, changedRoutes);
continue;
}
//해당 시점 이후에 생성된 루트들 (과거 시점엔 보이지 않는 루트)
handleLostRoute(route, lostAdjMap, lostNodeMap);
}

//시작점이 1개인 nodeList 생성
List<Node> endNodes = determineEndNodes(lostAdjMap, lostNodeMap);
LostRoutesDTO lostRouteDTO = LostRoutesDTO.of(mapNodeInfo(lostNodeMap), routeCalculator.getCoreRoutes(lostAdjMap, endNodes));

return GetChangedRoutesByRevisionResDTO.of(lostRouteDTO,changedRoutes);
}

private List<Route> getRevRoutes(Long univId, Long versionId) {
revInfoRepository.findById(versionId)
.orElseThrow(() -> new AdminException("invalid version id", INVALID_VERSION_ID));

List<Route> revRoutes = routeAuditRepository.getAllRoutesAtRevision(univId, versionId);

if(revRoutes.isEmpty()) {
throw new RouteException("Route Not Found", ROUTE_NOT_FOUND);
}
return revRoutes;
}


private void handleRevisionRoute(Route revRoute, Route route, List<ChangedRouteDTO> changedRoutes, List<Route> riskRoutes) {
//변경사항이 있는 경우
if(!route.isEqualRoute(revRoute)){
Expand All @@ -158,6 +188,13 @@ else if(!route.getCautionFactors().isEmpty() || !route.getDangerFactors().isEmpt
}
}

private void handleRevisionRoute(Route revRoute, Route route, List<ChangedRouteDTO> changedRoutes) {
//변경사항이 있는 경우
if(!route.isEqualRoute(revRoute)){
changedRoutes.add(ChangedRouteDTO.of(route.getId(), RouteDifferInfo.of(route), RouteDifferInfo.of(revRoute)));
}
}

private void handleLostRoute(Route route, Map<Long, List<Route>> lostAdjMap, Map<Long, Node> lostNodeMap) {
lostAdjMap.computeIfAbsent(route.getNode1().getId(), k -> new ArrayList<>()).add(route);
lostAdjMap.computeIfAbsent(route.getNode2().getId(), k -> new ArrayList<>()).add(route);
Expand All @@ -174,4 +211,13 @@ private List<Node> determineEndNodes(Map<Long, List<Route>> lostAdjMap, Map<Long
.collect(Collectors.toList());
}

private List<NodeInfoResDTO> mapNodeInfo(Map<Long, Node> lostNodeMap){
return lostNodeMap.entrySet().stream()
.map(entry -> {
Node node = entry.getValue();
return NodeInfoResDTO.of(entry.getKey(), node.getX(), node.getY());
})
.toList();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,7 @@ public static RevisionType getRevisionType() {

public static void clear() {
univIdHolder.remove();
actionHolder.remove();
REVISION_TYPE_THREAD_LOCAL.remove();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,7 @@

import com.softeer5.uniro_backend.map.dto.request.CreateBuildingRouteReqDTO;
import com.softeer5.uniro_backend.map.dto.request.CreateRoutesReqDTO;
import com.softeer5.uniro_backend.map.dto.response.FastestRouteResDTO;
import com.softeer5.uniro_backend.map.dto.response.GetAllRoutesResDTO;
import com.softeer5.uniro_backend.map.dto.response.GetRiskResDTO;
import com.softeer5.uniro_backend.map.dto.response.GetRiskRoutesResDTO;
import com.softeer5.uniro_backend.map.dto.response.*;
import com.softeer5.uniro_backend.map.dto.request.PostRiskReqDTO;

import jakarta.validation.Valid;
Expand Down Expand Up @@ -82,4 +79,12 @@ ResponseEntity<List<FastestRouteResDTO>> findFastestRoute(@PathVariable("univId"
})
ResponseEntity<Void> createBuildingRoute(@PathVariable("univId") Long univId,
@RequestBody @Valid CreateBuildingRouteReqDTO createBuildingRouteReqDTO);

@Operation(summary = "현재 버전과 특정 버전의 차이점 조회")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "현재 버전과 특정 버전의 차이점 조회 성공"),
@ApiResponse(responseCode = "400", description = "EXCEPTION(임시)", content = @Content),
})
ResponseEntity<GetChangedRoutesByRevisionResDTO> getChangedRoutesByRevision(@PathVariable("univId") Long univId,
@PathVariable("versionId") Long versionId);
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
package com.softeer5.uniro_backend.map.controller;

import com.softeer5.uniro_backend.admin.service.AdminService;
import com.softeer5.uniro_backend.map.dto.request.CreateBuildingRouteReqDTO;
import com.softeer5.uniro_backend.map.dto.request.CreateRoutesReqDTO;
import com.softeer5.uniro_backend.map.dto.response.FastestRouteResDTO;
import com.softeer5.uniro_backend.map.dto.response.GetAllRoutesResDTO;
import com.softeer5.uniro_backend.map.dto.response.GetRiskResDTO;
import com.softeer5.uniro_backend.map.dto.response.GetRiskRoutesResDTO;
import com.softeer5.uniro_backend.map.dto.response.*;
import com.softeer5.uniro_backend.map.dto.request.PostRiskReqDTO;
import com.softeer5.uniro_backend.map.service.RouteCalculator;

Expand All @@ -25,7 +23,7 @@
public class MapController implements MapApi {

private final MapService mapService;
private final RouteCalculator routeCalculator;
private final AdminService adminService;

@Override
@GetMapping("/{univId}/routes")
Expand Down Expand Up @@ -83,4 +81,12 @@ public ResponseEntity<Void> createBuildingRoute(@PathVariable("univId") Long uni
return ResponseEntity.status(HttpStatus.CREATED).build();
}

@Override
@GetMapping("/{univId}/routes/{versionId}")
public ResponseEntity<GetChangedRoutesByRevisionResDTO> getChangedRoutesByRevision(@PathVariable("univId") Long univId,
@PathVariable("versionId") Long versionId){
GetChangedRoutesByRevisionResDTO getChangedRoutesByRevisionResDTO = adminService.getChangedRoutesByRevision(univId,versionId);
return ResponseEntity.ok(getChangedRoutesByRevisionResDTO);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.softeer5.uniro_backend.map.dto.response;

import com.softeer5.uniro_backend.admin.dto.response.ChangedRouteDTO;
import com.softeer5.uniro_backend.admin.dto.response.LostRoutesDTO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

import java.util.List;

@Getter
@Schema(name = "GetChangedRoutesByRevisionResDTO", description = "현재 버전과 특정 버전의 차이점 조회 응답 DTO")
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public class GetChangedRoutesByRevisionResDTO {
@Schema(description = "삭제된 길&노드 정보 정보", example = "")
private final LostRoutesDTO lostRoutes;
@Schema(description = "현재 버전과 비교하여 변경된 주의/위험 요소 정보", example = "")
private final List<ChangedRouteDTO> changedList;

public static GetChangedRoutesByRevisionResDTO of(LostRoutesDTO lostRoutes, List<ChangedRouteDTO> changedList) {
return new GetChangedRoutesByRevisionResDTO(lostRoutes,changedList);
}
}
Loading