From 58614f1952c0c98b71920ed937d69a3f4e97d696 Mon Sep 17 00:00:00 2001 From: hyxklee Date: Wed, 12 Nov 2025 19:21:54 +0900 Subject: [PATCH 1/3] =?UTF-8?q?refactor:=20=EC=96=B4=EB=93=9C=EB=AF=BC?= =?UTF-8?q?=EC=9D=B8=20=EA=B2=BD=EC=9A=B0=20=EC=B6=9C=EC=84=9D=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=EB=A5=BC=20=EB=B0=98=ED=99=98=ED=95=B4=EC=A3=BC?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../attendance/application/dto/AttendanceDTO.java | 3 +++ .../application/mapper/AttendanceMapper.java | 12 ++++++++++++ .../application/usecase/AttendanceUseCaseImpl.java | 5 +++++ 3 files changed, 20 insertions(+) diff --git a/src/main/java/leets/weeth/domain/attendance/application/dto/AttendanceDTO.java b/src/main/java/leets/weeth/domain/attendance/application/dto/AttendanceDTO.java index 266b346e..85df4e89 100644 --- a/src/main/java/leets/weeth/domain/attendance/application/dto/AttendanceDTO.java +++ b/src/main/java/leets/weeth/domain/attendance/application/dto/AttendanceDTO.java @@ -1,5 +1,6 @@ package leets.weeth.domain.attendance.application.dto; +import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Pattern; import leets.weeth.domain.attendance.domain.entity.enums.Status; @@ -13,6 +14,8 @@ public record Main( Integer attendanceRate, String title, Status status, + @Schema(description = "어드민인 경우 출석 코드 노출") + Integer code, LocalDateTime start, LocalDateTime end, String location diff --git a/src/main/java/leets/weeth/domain/attendance/application/mapper/AttendanceMapper.java b/src/main/java/leets/weeth/domain/attendance/application/mapper/AttendanceMapper.java index c44160f6..9e33b092 100644 --- a/src/main/java/leets/weeth/domain/attendance/application/mapper/AttendanceMapper.java +++ b/src/main/java/leets/weeth/domain/attendance/application/mapper/AttendanceMapper.java @@ -14,12 +14,24 @@ public interface AttendanceMapper { @Mapping(target = "attendanceRate", source = "user.attendanceRate"), @Mapping(target = "title", source = "attendance.meeting.title"), @Mapping(target = "status", source = "attendance.status"), + @Mapping(target = "code", ignore = true), @Mapping(target = "start", source = "attendance.meeting.start"), @Mapping(target = "end", source = "attendance.meeting.end"), @Mapping(target = "location", source = "attendance.meeting.location"), }) AttendanceDTO.Main toMainDto(User user, Attendance attendance); + @Mappings({ + @Mapping(target = "attendanceRate", source = "user.attendanceRate"), + @Mapping(target = "title", source = "attendance.meeting.title"), + @Mapping(target = "status", source = "attendance.status"), + @Mapping(target = "code", source = "attendance.meeting.code"), + @Mapping(target = "start", source = "attendance.meeting.start"), + @Mapping(target = "end", source = "attendance.meeting.end"), + @Mapping(target = "location", source = "attendance.meeting.location"), + }) + AttendanceDTO.Main toAdminResponse(User user, Attendance attendance); + @Mappings({ @Mapping(target = "attendances", source = "attendances"), @Mapping(target = "total", expression = "java( user.getAttendanceCount() + user.getAbsenceCount() )") diff --git a/src/main/java/leets/weeth/domain/attendance/application/usecase/AttendanceUseCaseImpl.java b/src/main/java/leets/weeth/domain/attendance/application/usecase/AttendanceUseCaseImpl.java index 9840ceac..6b59c190 100644 --- a/src/main/java/leets/weeth/domain/attendance/application/usecase/AttendanceUseCaseImpl.java +++ b/src/main/java/leets/weeth/domain/attendance/application/usecase/AttendanceUseCaseImpl.java @@ -13,6 +13,7 @@ import leets.weeth.domain.schedule.domain.service.MeetingGetService; import leets.weeth.domain.user.domain.entity.Cardinal; import leets.weeth.domain.user.domain.entity.User; +import leets.weeth.domain.user.domain.entity.enums.Role; import leets.weeth.domain.user.domain.service.UserCardinalGetService; import leets.weeth.domain.user.domain.service.UserGetService; import lombok.RequiredArgsConstructor; @@ -66,6 +67,10 @@ public AttendanceDTO.Main find(Long userId) { .findAny() .orElse(null); + if (Role.ADMIN == user.getRole()) { + return mapper.toAdminResponse(user, todayMeeting); + } + return mapper.toMainDto(user, todayMeeting); } From 438be8bafbdc773170f4a6ccfc36edc3d5a219b9 Mon Sep 17 00:00:00 2001 From: hyxklee Date: Wed, 12 Nov 2025 19:29:47 +0900 Subject: [PATCH 2/3] =?UTF-8?q?refactor:=20=EC=96=B4=EB=93=9C=EB=AF=BC?= =?UTF-8?q?=EC=9D=B8=20=EA=B2=BD=EC=9A=B0=20=EC=B6=9C=EC=84=9D=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=EB=A5=BC=20=EB=B0=98=ED=99=98=ED=95=B4=EC=A3=BC?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EB=A1=9C=EC=A7=81=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/AttendanceMapperTest.java | 68 ++++++++++++++++--- 1 file changed, 57 insertions(+), 11 deletions(-) diff --git a/src/test/java/leets/weeth/domain/attendance/application/mapper/AttendanceMapperTest.java b/src/test/java/leets/weeth/domain/attendance/application/mapper/AttendanceMapperTest.java index 20578fee..7f0da65c 100644 --- a/src/test/java/leets/weeth/domain/attendance/application/mapper/AttendanceMapperTest.java +++ b/src/test/java/leets/weeth/domain/attendance/application/mapper/AttendanceMapperTest.java @@ -1,23 +1,28 @@ package leets.weeth.domain.attendance.application.mapper; -import static leets.weeth.domain.attendance.test.fixture.AttendanceTestFixture.*; -import static org.assertj.core.api.Assertions.*; - -import java.time.LocalDate; -import java.util.List; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - import leets.weeth.domain.attendance.application.dto.AttendanceDTO; import leets.weeth.domain.attendance.domain.entity.Attendance; import leets.weeth.domain.schedule.domain.entity.Meeting; import leets.weeth.domain.user.domain.entity.User; import leets.weeth.domain.user.domain.entity.enums.Position; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mapstruct.factory.Mappers; +import org.mockito.InjectMocks; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.time.LocalDate; +import java.util.List; + +import static leets.weeth.domain.attendance.test.fixture.AttendanceTestFixture.*; +import static org.assertj.core.api.Assertions.assertThat; +@ExtendWith(MockitoExtension.class) class AttendanceMapperTest { - private final AttendanceMapper attendanceMapper = new AttendanceMapperImpl(); + @InjectMocks + private final AttendanceMapper attendanceMapper = Mappers.getMapper(AttendanceMapper.class); @Test @DisplayName("toMainDto: 사용자 + 당일 출석 객체를 Main DTO로 매핑한다") @@ -121,4 +126,45 @@ void nullSafety_whenTodayAttendanceNull() { assertThat(main.end()).isNull(); assertThat(main.location()).isNull(); } -} \ No newline at end of file + + @Test + @DisplayName("toMainDto: 일반 유저는 출석 코드가 null로 매핑된다") + void toMainDto_normalUser_codeIsNull() { + // given + LocalDate today = LocalDate.now(); + Meeting meeting = createOneDayMeeting(today, 1, 1234, "Today"); + User user = createActiveUserWithAttendances("일반유저", List.of(meeting)); + Attendance attendance = user.getAttendances().get(0); + + // when + AttendanceDTO.Main main = attendanceMapper.toMainDto(user, attendance); + + // then + assertThat(main).isNotNull(); + assertThat(main.code()).isNull(); + assertThat(main.title()).isEqualTo("Today"); + assertThat(main.status()).isEqualTo(attendance.getStatus()); + } + + @Test + @DisplayName("toAdminResponse: ADMIN 유저는 출석 코드가 포함된다") + void toAdminResponse_adminUser_includesCode() { + // given + LocalDate today = LocalDate.now(); + Integer expectedCode = 1234; + Meeting meeting = createOneDayMeeting(today, 1, expectedCode, "Today"); + User adminUser = createAdminUserWithAttendances("관리자", List.of(meeting)); + Attendance attendance = adminUser.getAttendances().get(0); + + // when + AttendanceDTO.Main main = attendanceMapper.toAdminResponse(adminUser, attendance); + + // then + assertThat(main).isNotNull(); + assertThat(main.code()).isEqualTo(expectedCode); + assertThat(main.title()).isEqualTo("Today"); + assertThat(main.start()).isEqualTo(meeting.getStart()); + assertThat(main.end()).isEqualTo(meeting.getEnd()); + assertThat(main.location()).isEqualTo(meeting.getLocation()); + } +} From 2f099f0f7e57b67ada6fac2d26e78fbb65287eb5 Mon Sep 17 00:00:00 2001 From: hyxklee Date: Wed, 12 Nov 2025 19:29:51 +0900 Subject: [PATCH 3/3] =?UTF-8?q?refactor:=20=EC=96=B4=EB=93=9C=EB=AF=BC?= =?UTF-8?q?=EC=9D=B8=20=EA=B2=BD=EC=9A=B0=20=EC=B6=9C=EC=84=9D=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=EB=A5=BC=20=EB=B0=98=ED=99=98=ED=95=B4=EC=A3=BC?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EB=A1=9C=EC=A7=81=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/fixture/AttendanceTestFixture.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/test/java/leets/weeth/domain/attendance/test/fixture/AttendanceTestFixture.java b/src/test/java/leets/weeth/domain/attendance/test/fixture/AttendanceTestFixture.java index 6cfe52b8..458901fd 100644 --- a/src/test/java/leets/weeth/domain/attendance/test/fixture/AttendanceTestFixture.java +++ b/src/test/java/leets/weeth/domain/attendance/test/fixture/AttendanceTestFixture.java @@ -10,6 +10,7 @@ import leets.weeth.domain.user.domain.entity.User; import leets.weeth.domain.user.domain.entity.enums.Department; import leets.weeth.domain.user.domain.entity.enums.Position; +import leets.weeth.domain.user.domain.entity.enums.Role; import leets.weeth.domain.user.domain.entity.enums.Status; public class AttendanceTestFixture { @@ -21,6 +22,29 @@ public static User createActiveUser(String name) { return User.builder().name(name).status(Status.ACTIVE).build(); } + public static User createAdminUser(String name) { + return User.builder().name(name).status(Status.ACTIVE).role(Role.ADMIN).build(); + } + + public static User createAdminUserWithAttendances(String name, List meetings) { + User user = createAdminUser(name); + + if (user.getAttendances() == null) { + try { + java.lang.reflect.Field f = user.getClass().getDeclaredField("attendances"); + f.setAccessible(true); + f.set(user, new java.util.ArrayList<>()); + } catch (Exception ignore) {} + } + if (meetings != null) { + for (Meeting meeting : meetings) { + Attendance attendance = createAttendance(meeting, user); + user.add(attendance); + } + } + return user; + } + //todo : 추후 User Fixture 활용 예정 public static User createActiveUserWithAttendances(String name, List meetings) { User user = createActiveUser(name);