Skip to content

Commit 78ee82d

Browse files
authored
Feat: [Record] 기록 삭제 api (#81)
1 parent 536de79 commit 78ee82d

3 files changed

Lines changed: 62 additions & 0 deletions

File tree

runtracker/src/main/java/com/runtracker/domain/record/controller/RecordController.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,12 @@ public ApiResponse<RunningRecordDTO> getRunningRecord(
4444
RunningRecordDTO record = recordService.getRunningRecordById(userDetails.getMemberId(), recordId);
4545
return ApiResponse.ok(record);
4646
}
47+
48+
@DeleteMapping("/{recordId}")
49+
public ApiResponse<Void> deleteRecord(
50+
@AuthenticationPrincipal UserDetailsImpl userDetails,
51+
@PathVariable Long recordId) {
52+
recordService.deleteRecord(userDetails.getMemberId(), recordId);
53+
return ApiResponse.ok();
54+
}
4755
}

runtracker/src/main/java/com/runtracker/domain/record/service/RecordService.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,4 +211,16 @@ public static LocalDate getMonthStart(LocalDate date) {
211211
public static LocalDate getMonthEnd(LocalDate date) {
212212
return date.with(TemporalAdjusters.lastDayOfMonth());
213213
}
214+
215+
@Transactional
216+
public void deleteRecord(Long memberId, Long recordId) {
217+
RunningRecord record = recordRepository.findById(recordId)
218+
.orElseThrow(() -> new RecordNotFoundException("Running record not found with id: " + recordId));
219+
220+
if (!record.getMemberId().equals(memberId)) {
221+
throw new RecordNotFoundException("Running record not found with id: " + recordId);
222+
}
223+
224+
recordRepository.delete(record);
225+
}
214226
}

runtracker/src/test/java/com/runtracker/domain/record/controller/RecordControllerTest.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@
1818
import static com.epages.restdocs.apispec.ResourceDocumentation.resource;
1919
import static org.mockito.ArgumentMatchers.*;
2020
import static org.mockito.BDDMockito.given;
21+
import static org.mockito.Mockito.doNothing;
2122
import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
2223
import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get;
24+
import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.delete;
2325
import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath;
2426
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
2527

@@ -322,4 +324,44 @@ void getAllRunningRecordsTest() throws Exception {
322324
)
323325
));
324326
}
327+
328+
@Test
329+
void deleteRecordTest() throws Exception {
330+
// given
331+
doNothing().when(recordService).deleteRecord(anyLong(), anyLong());
332+
given(jwtUtil.getMemberIdFromToken(anyString())).willReturn(1L);
333+
given(jwtUtil.getSocialIdFromToken(anyString())).willReturn("kakao_123");
334+
335+
UserDetailsImpl mockUserDetails = UserDetailsImpl.builder()
336+
.memberId(1L)
337+
.socialId("kakao_123")
338+
.roles(List.of(MemberRole.USER))
339+
.build();
340+
given(userDetailsService.loadUserByUsername("1")).willReturn(mockUserDetails);
341+
342+
// when
343+
this.mockMvc.perform(delete("/api/records/{recordId}", 1L)
344+
.header(AUTH_HEADER, TEST_ACCESS_TOKEN))
345+
.andExpect(status().isOk())
346+
.andDo(document("record-delete",
347+
resource(
348+
ResourceSnippetParameters.builder()
349+
.tag("records")
350+
.summary("러닝 기록 삭제")
351+
.description("본인의 러닝 기록을 삭제합니다.")
352+
.requestHeaders(
353+
headerWithName("Authorization").description("엑세스 토큰")
354+
)
355+
.pathParameters(
356+
parameterWithName("recordId").description("삭제할 러닝 기록 ID")
357+
)
358+
.responseFields(
359+
fieldWithPath("status.statusCode").type(JsonFieldType.STRING).description("상태 코드"),
360+
fieldWithPath("status.message").type(JsonFieldType.STRING).description("상태 메시지"),
361+
fieldWithPath("status.description").type(JsonFieldType.STRING).description("상태 설명").optional()
362+
)
363+
.build()
364+
)
365+
));
366+
}
325367
}

0 commit comments

Comments
 (0)