Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat: request attendance state #37

Merged
merged 2 commits into from
Aug 21, 2024
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 @@ -2,6 +2,7 @@

import static gdsc.konkuk.platformcore.application.attendance.AttendanceServiceHelper.findAttendanceById;

import gdsc.konkuk.platformcore.application.attendance.dtos.AttendanceStatus;
import gdsc.konkuk.platformcore.application.attendance.exceptions.AttendanceAlreadyExistException;
import gdsc.konkuk.platformcore.application.attendance.exceptions.AttendanceErrorCode;
import gdsc.konkuk.platformcore.application.event.exceptions.EventErrorCode;
Expand Down Expand Up @@ -56,6 +57,12 @@ public Attendance registerAttendance(AttendanceRegisterRequest registerRequest)
return newAttendance;
}

public AttendanceStatus getAttendanceStatus(Long attendanceId) {
List<Participant> totalParticipants = participantRepository.findAllByAttendanceId(attendanceId);
List<Participant> attendedParticipants = totalParticipants.stream().filter(Participant::isAttended).toList();
return AttendanceStatus.of(attendanceId, totalParticipants.size(), attendedParticipants.size());
}

@Transactional
public void deleteAttendance(Long attendanceId) {
participantRepository.deleteAllByAttendanceId(attendanceId);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package gdsc.konkuk.platformcore.application.attendance.dtos;

import lombok.Builder;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Builder
public class AttendanceStatus {
private Long attendanceId;
private int total;
private int attended;

public static AttendanceStatus of(Long attendanceId, int total, int attended) {
return AttendanceStatus.builder()
.attendanceId(attendanceId)
.total(total)
.attended(attended)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import gdsc.konkuk.platformcore.controller.attendance.dtos.AttendSuccessResponse;
import gdsc.konkuk.platformcore.controller.attendance.dtos.AttendanceRegisterRequest;
import gdsc.konkuk.platformcore.controller.attendance.dtos.AttendanceResponse;
import gdsc.konkuk.platformcore.application.attendance.dtos.AttendanceStatus;
import gdsc.konkuk.platformcore.domain.attendance.entity.Attendance;
import gdsc.konkuk.platformcore.domain.attendance.entity.Participant;
import gdsc.konkuk.platformcore.global.responses.SuccessResponse;
Expand Down Expand Up @@ -66,6 +67,13 @@ public ResponseEntity<SuccessResponse> registerAttendance(
.body(SuccessResponse.of(response));
}

// TODO: 추후 WebSocket으로 변경 필요
@GetMapping("/{attendanceId}/status")
public ResponseEntity<SuccessResponse> getAttendance(@PathVariable Long attendanceId) {
AttendanceStatus attendanceStatus = attendanceService.getAttendanceStatus(attendanceId);
return ResponseEntity.ok(SuccessResponse.of(attendanceStatus));
}

@DeleteMapping("/{attendanceId}")
public ResponseEntity<SuccessResponse> deleteAttendance(@PathVariable Long attendanceId) {
attendanceService.deleteAttendance(attendanceId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,6 @@ public interface ParticipantRepository extends JpaRepository<Participant, Long>
""")
List<Participant> findAllByBatchAndStartAtBetween(
String batch, LocalDateTime st, LocalDateTime en);

List<Participant> findAllByAttendanceId(Long attendanceId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.fasterxml.jackson.databind.ObjectMapper;

import gdsc.konkuk.platformcore.application.attendance.AttendanceService;
import gdsc.konkuk.platformcore.application.attendance.dtos.AttendanceStatus;
import gdsc.konkuk.platformcore.application.event.EventService;
import gdsc.konkuk.platformcore.application.event.dtos.EventWithAttendance;
import gdsc.konkuk.platformcore.controller.attendance.dtos.AttendanceRegisterRequest;
Expand Down Expand Up @@ -203,6 +204,43 @@ void should_register_attendance_when_pass_event_id() throws Exception {
.build())));
}

@Test
@DisplayName("출석 현황을 조회할 수 있다")
@WithMockUser
void should_get_attendance_status_when_pass_attendance_id() throws Exception {
// given
given(attendanceService.getAttendanceStatus(any(Long.class)))
.willReturn(AttendanceStatus.of(1L, 10, 6));

// when
ResultActions result =
mockMvc.perform(
RestDocumentationRequestBuilders.get("/api/v1/attendances/{attendanceId}/status", 1)
.with(csrf()));

// then
result
.andDo(print())
.andExpect(status().isOk())
.andDo(
document(
"getAttendanceStatus",
preprocessRequest(prettyPrint()),
preprocessResponse(prettyPrint()),
resource(
ResourceSnippetParameters.builder()
.description("출석 현황을 조회할 수 있다")
.tag("attendance")
.pathParameters(parameterWithName("attendanceId").description("출석 ID"))
.responseFields(
fieldWithPath("success").description("성공 여부"),
fieldWithPath("message").description("메시지"),
fieldWithPath("data.attendanceId").description("출석 ID"),
fieldWithPath("data.total").description("전체 인원"),
fieldWithPath("data.attended").description("출석 인원"))
.build())));
}

@Test
@DisplayName("이벤트 출석을 삭제할 수 있다")
@WithMockUser
Expand Down