Skip to content

Commit e8031d3

Browse files
authored
Merge pull request #136 from kookmin-sw/fix/135
[Backend] fix: API 오류 수정
2 parents b0d6f1a + 3c57294 commit e8031d3

File tree

9 files changed

+44
-64
lines changed

9 files changed

+44
-64
lines changed

backend/src/main/java/com/example/backend/common/GlobalExceptionHandler.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,17 @@ public ResponseEntity<?> handleIllegalStateException(IllegalStateException e) {
2929
if (e.getMessage().contains("로그인이 필요")) {
3030
return ResponseEntity.status(HttpStatus.UNAUTHORIZED)
3131
.body(Collections.singletonMap("message", e.getMessage()));
32+
} else if (e.getMessage().contains("이미 출동")){
33+
return ResponseEntity.status(HttpStatus.ALREADY_REPORTED)
34+
.body(Collections.singletonMap("message", e.getMessage()));
3235
}
3336
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
3437
.body(Collections.singletonMap("message", e.getMessage()));
3538
}
3639

3740
@ExceptionHandler(NoSuchElementException.class)
3841
public ResponseEntity<?> handleNoSuchElementException(NoSuchElementException e) {
39-
return ResponseEntity.status(HttpStatus.FORBIDDEN)
42+
return ResponseEntity.status(HttpStatus.NOT_FOUND)
4043
.body(Collections.singletonMap("message", e.getMessage()));
4144
}
4245

backend/src/main/java/com/example/backend/common/domain/CaseEntity.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ public class CaseEntity {
4848
@Column(name = "memo", nullable = false, columnDefinition = "TEXT")
4949
private String memo;
5050

51+
@Column(name = "progress_date", columnDefinition = "TIMESTAMP WITHOUT TIME ZONE")
52+
private LocalDateTime progressDate;
53+
5154
public enum CaseCategory {
5255
fire, assault, crowd_congestion, weapon, swoon
5356
}

backend/src/main/java/com/example/backend/dashboard/dto/CaseDetectResponse.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public class CaseDetectResponse {
1616
private String category; // 사건 카테고리 (예: fire, assault 등)
1717
private String cctvAddress; // CCTV 주소
1818
private String dateTime; // 사건 감지 시각 (문자열 형태, yyyy-MM-dd HH:mm:ss)
19+
private int level;
1920
private String video; // 영상 URL
2021

2122
public static CaseDetectResponse fromEntity(CaseEntity entity) {
@@ -26,6 +27,7 @@ public static CaseDetectResponse fromEntity(CaseEntity entity) {
2627
.category(entity.getCategory().name())
2728
.cctvAddress(entity.getCctv().getAddress())
2829
.dateTime(formattedDateTime)
30+
.level(entity.getLevel())
2931
.video(entity.getVideo())
3032
.build();
3133
}

backend/src/main/java/com/example/backend/dashboard/repository/DashboardRepository.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import java.util.List;
77

88
public interface DashboardRepository extends JpaRepository<CaseEntity, Integer> {
9-
List<CaseEntity> findAllByOfficeIdAndStateInOrderById(int officeId, List<CaseEntity.CaseState> states);
9+
List<CaseEntity> findAllByOfficeIdAndStateInOrderByIdDesc(int officeId, List<CaseEntity.CaseState> states);
10+
List<CaseEntity> findAllByOfficeIdAndStateOrderByProgressDateDesc(int officeId, CaseEntity.CaseState state);
1011

1112
}

backend/src/main/java/com/example/backend/dashboard/service/CaseDetectService.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public CaseDetectResponse saveCase(CaseDetectRequest request) {
3838
.accuracy(true)
3939
.memo(request.getMemo())
4040
.level(request.getLevel())
41+
.progressDate(null)
4142
.build();
4243

4344
CaseEntity saved = caseRepository.save(caseEntity);

backend/src/main/java/com/example/backend/dashboard/service/DashboardService.java

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,9 @@
1313
import org.springframework.stereotype.Service;
1414
import org.springframework.transaction.annotation.Transactional;
1515

16-
import java.util.Collections;
17-
import java.util.List;
18-
import java.util.Map;
19-
import java.util.NoSuchElementException;
16+
import java.time.LocalDateTime;
17+
import java.time.format.DateTimeFormatter;
18+
import java.util.*;
2019
import java.util.stream.Collectors;
2120

2221
@Service
@@ -50,7 +49,7 @@ private CaseEntity getAuthorizedCase(int caseId, HttpSession session) {
5049
CaseEntity caseEntity = dashboardRepository.findById(caseId)
5150
.orElseThrow(() -> new EntityNotFoundException("해당 사건을 찾을 수 없습니다."));
5251
if (caseEntity.getOffice().getId() != officeId) {
53-
throw new NoSuchElementException("해당 사건에 대한 권한이 없습니다.");
52+
throw new IllegalStateException("해당 사건에 대한 권한이 없습니다.");
5453
}
5554
return caseEntity;
5655
}
@@ -61,16 +60,22 @@ public List<DashboardResponse> getCases(HttpSession session) {
6160

6261
List<CaseEntity.CaseState> targetStates = List.of(
6362
CaseEntity.CaseState.미확인,
64-
CaseEntity.CaseState.확인,
65-
CaseEntity.CaseState.출동
63+
CaseEntity.CaseState.확인
6664
);
67-
List<CaseEntity> cases = dashboardRepository.findAllByOfficeIdAndStateInOrderById(officeId, targetStates);
6865

69-
if (cases.isEmpty()) {
66+
List<CaseEntity> readyCases = dashboardRepository.findAllByOfficeIdAndStateInOrderByIdDesc(officeId, targetStates);
67+
68+
List<CaseEntity> progressCases = dashboardRepository.findAllByOfficeIdAndStateOrderByProgressDateDesc(officeId, CaseEntity.CaseState.출동);
69+
70+
if (readyCases.isEmpty() && progressCases.isEmpty()) {
7071
throw new NoSuchElementException("미확인, 확인 또는 출동 중인 사건이 없습니다.");
7172
}
7273

73-
return cases.stream()
74+
List<CaseEntity> combinedCases = new ArrayList<>();
75+
combinedCases.addAll(readyCases);
76+
combinedCases.addAll(progressCases);
77+
78+
return combinedCases.stream()
7479
.map(DashboardResponse::fromEntity)
7580
.collect(Collectors.toList());
7681
}
@@ -111,6 +116,11 @@ public Map<Integer, String> updateCaseState(int id, StateRequest request, HttpSe
111116
PoliceEntity assignedPolice = PoliceEntity.builder().id(policeId).build();
112117
caseEntity.setPolice(assignedPolice);
113118

119+
// 출동 날짜 및 시간
120+
LocalDateTime now = LocalDateTime.now();
121+
String formatter = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
122+
caseEntity.setProgressDate(LocalDateTime.parse(formatter));
123+
114124
dashboardRepository.save(caseEntity);
115125

116126
return Collections.singletonMap(id, "지금 출동합니다.");

backend/src/main/java/com/example/backend/search/dto/DetailResponse.java

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@
22

33
import com.example.backend.common.domain.CaseEntity;
44
import com.fasterxml.jackson.annotation.JsonFormat;
5-
import lombok.Builder;
6-
import lombok.Getter;
5+
import lombok.*;
76

87
import java.time.LocalDateTime;
98

10-
@Getter
9+
@Data
10+
@Getter @Builder
1111
public class DetailResponse {
12-
private int id;
13-
private int policeId;
12+
private Integer id;
13+
private Integer policeId;
1414
private String policeName;
15-
private int cctvId;
15+
private Integer cctvId;
1616
private String address;
1717
private Double longitude;
1818
private Double latitude;
@@ -24,22 +24,6 @@ public class DetailResponse {
2424
private String video;
2525
private String memo;
2626

27-
@Builder
28-
public DetailResponse(Integer id, Integer policeId, String policeName, Integer cctvId, String address, Double latitude, Double longitude, LocalDateTime date,
29-
String category, String video, String memo) {
30-
this.id = id;
31-
this.policeId = policeId;
32-
this.policeName = policeName;
33-
this.cctvId = cctvId;
34-
this.address = address;
35-
this.latitude = latitude;
36-
this.longitude = longitude;
37-
this.date = date;
38-
this.category = category;
39-
this.video = video;
40-
this.memo = memo;
41-
}
42-
4327
public static DetailResponse fromEntity(CaseEntity entity) {
4428
return DetailResponse.builder()
4529
.id(entity.getId())

backend/src/main/java/com/example/backend/search/dto/SearchResponse.java

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,17 @@
22

33
import com.example.backend.common.domain.CaseEntity;
44
import com.fasterxml.jackson.annotation.JsonFormat;
5-
import lombok.Builder;
6-
import lombok.Data;
7-
import lombok.Getter;
8-
import lombok.NoArgsConstructor;
5+
import lombok.*;
96

107
import java.time.LocalDateTime;
118

12-
@Getter
13-
@NoArgsConstructor
149
@Data
10+
@Getter @Builder
1511
public class SearchResponse {
16-
private int id;
17-
private int policeId;
12+
private Integer id;
13+
private Integer policeId;
1814
private String policeName;
19-
private int cctvId;
15+
private Integer cctvId;
2016
private String address;
2117

2218
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
@@ -25,19 +21,6 @@ public class SearchResponse {
2521
private String category;
2622
private String memo;
2723

28-
@Builder
29-
public SearchResponse(Integer id, Integer policeId, String policeName, Integer cctvId, String address, LocalDateTime date,
30-
String category, String memo) {
31-
this.id = id;
32-
this.policeId = policeId;
33-
this.policeName = policeName;
34-
this.cctvId = cctvId;
35-
this.address = address;
36-
this.date = date;
37-
this.category = category;
38-
this.memo = memo;
39-
}
40-
4124
public static SearchResponse fromEntity(CaseEntity entity) {
4225
return SearchResponse.builder()
4326
.id(entity.getId())

backend/src/main/java/com/example/backend/search/dto/SearchResult.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,9 @@
55

66
import java.util.List;
77

8-
@Getter
8+
@Getter @Builder
99
public class SearchResult {
1010
private final List<SearchResponse> results; // 검색 결과 리스트
1111
private final int totalPages; // 전체 페이지 수
1212
private final long totalElements; // 전체 데이터 개수
13-
14-
@Builder
15-
public SearchResult(List<SearchResponse> results, int totalPages, long totalElements) {
16-
this.results = results;
17-
this.totalPages = totalPages;
18-
this.totalElements = totalElements;
19-
}
2013
}

0 commit comments

Comments
 (0)