Skip to content

Commit 6141af3

Browse files
authored
1.2.2
2 parents ab86300 + 3e9699d commit 6141af3

File tree

9 files changed

+96
-45
lines changed

9 files changed

+96
-45
lines changed

src/main/kotlin/co/yappuworld/schedule/client/application/AdminAttendanceService.kt

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@ import co.yappuworld.schedule.client.dto.request.AdminSessionAttendanceUpdateReq
88
import co.yappuworld.schedule.client.dto.response.AdminAttendanceCodeResponse
99
import co.yappuworld.schedule.client.dto.response.AdminAttendancesResponse
1010
import co.yappuworld.schedule.domain.AttendanceBook
11-
import co.yappuworld.schedule.infrastructure.AttendanceCommandService
1211
import co.yappuworld.schedule.infrastructure.AttendanceFindService
12+
import co.yappuworld.schedule.infrastructure.LatePassCommandService
1313
import co.yappuworld.schedule.infrastructure.LatePassFindService
1414
import co.yappuworld.schedule.infrastructure.SessionFindService
15+
import co.yappuworld.schedule.infrastructure.entity.LatePassEntity
1516
import co.yappuworld.user.infrastructure.UserFindService
1617
import org.springframework.stereotype.Service
1718
import org.springframework.transaction.annotation.Transactional
@@ -20,11 +21,11 @@ import java.time.LocalDateTime
2021
@Service
2122
class AdminAttendanceService(
2223
private val attendanceFindService: AttendanceFindService,
23-
private val attendanceCommandService: AttendanceCommandService,
2424
private val userFindService: UserFindService,
2525
private val sessionFindService: SessionFindService,
2626
private val generationFindService: GenerationFindService,
2727
private val latePassFindService: LatePassFindService,
28+
private val latePassCommandService: LatePassCommandService,
2829
private val configFindService: ConfigFindService
2930
) {
3031

@@ -45,14 +46,8 @@ class AdminAttendanceService(
4546

4647
@Transactional
4748
fun updateAttendance(request: AdminAttendanceUpdateRequest) {
48-
val attendanceBySessionAndUserId = attendanceFindService
49-
.findAttendances(request.getSessionAndUserIdPairs())
50-
.associateBy { it.session.id to it.userId }
51-
52-
request.targets.forEach { target ->
53-
attendanceBySessionAndUserId[target.sessionId to target.userId]
54-
?.apply { updateStatus(target.attendanceStatus) }
55-
}
49+
updateAttendanceStatus(request)
50+
updateLatePasses(request)
5651
}
5752

5853
@Transactional
@@ -79,4 +74,30 @@ class AdminAttendanceService(
7974
fun deleteAttendanceCode() {
8075
configFindService.findAttendanceCode().reset()
8176
}
77+
78+
private fun updateAttendanceStatus(request: AdminAttendanceUpdateRequest) {
79+
val attendanceBySessionAndUserId = attendanceFindService
80+
.findAttendances(request.getSessionAndUserIdPairs())
81+
.associateBy { it.session.id to it.userId }
82+
83+
request.attendances.forEach { request ->
84+
attendanceBySessionAndUserId[request.sessionId to request.userId]
85+
?.apply { updateStatus(request.attendanceStatus) }
86+
}
87+
}
88+
89+
private fun updateLatePasses(request: AdminAttendanceUpdateRequest) {
90+
val existingLatePasses = latePassFindService
91+
.findLatePasses(request.generation, request.latePasses.map { it.userId })
92+
.associateBy { it.userId }
93+
94+
val latePasses = request.latePasses.map { updateRequest ->
95+
val latePass = existingLatePasses[updateRequest.userId]
96+
?: LatePassEntity(userId = updateRequest.userId, generation = request.generation)
97+
98+
latePass.apply { updateCount(updateRequest.latePassCount) }
99+
}
100+
101+
latePassCommandService.saveAll(latePasses)
102+
}
82103
}

src/main/kotlin/co/yappuworld/schedule/client/dto/request/AdminAttendanceUpdateRequest.kt

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,30 @@ import io.swagger.v3.oas.annotations.media.Schema
66
import java.util.UUID
77

88
data class AdminAttendanceUpdateRequest(
9-
@Schema(description = "업데이트 목록")
10-
val targets: List<AdminAttendanceUpdateTargetRequest>
9+
@param:Schema(description = "기수")
10+
val generation: Int,
11+
@param:Schema(description = "업데이트 목록")
12+
val attendances: List<AdminAttendanceUpdateTargetRequest>,
13+
@param:Schema(description = "지각 면제권 업데이트 목록")
14+
val latePasses: List<AdminLatePassUpdateTargetRequest>
1115
) {
1216

1317
@JsonIgnore
14-
val size = targets.size
15-
16-
@JsonIgnore
17-
fun getSessionAndUserIdPairs(): List<Pair<UUID, UUID>> = targets.map { it.sessionId to it.userId }
18+
fun getSessionAndUserIdPairs(): List<Pair<UUID, UUID>> = attendances.map { it.sessionId to it.userId }
1819
}
1920

2021
data class AdminAttendanceUpdateTargetRequest(
21-
@Schema(description = "유저 ID")
22+
@param:Schema(description = "유저 ID")
2223
val userId: UUID,
23-
@Schema(description = "세션 ID")
24+
@param:Schema(description = "세션 ID")
2425
val sessionId: UUID,
25-
@Schema(description = "업데이트 상태")
26+
@param:Schema(description = "업데이트 상태")
2627
val attendanceStatus: AttendanceStatus
2728
)
29+
30+
data class AdminLatePassUpdateTargetRequest(
31+
@param:Schema(description = "유저 ID")
32+
val userId: UUID,
33+
@param:Schema(description = "지각 면제권 개수")
34+
val latePassCount: Int
35+
)

src/main/kotlin/co/yappuworld/schedule/domain/AttendanceBook.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,7 @@ class AttendanceBook(
6767
attendees = attendees,
6868
sessions = sessions,
6969
attendances = attendances,
70-
latePassCountByUserId = latePasses
71-
.groupBy { it.userId }
72-
.mapValues { (_, latePasses) -> latePasses.size },
70+
latePassCountByUserId = latePasses.associate { it.userId to it.count },
7371
now = now
7472
)
7573

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package co.yappuworld.schedule.infrastructure
2+
3+
import co.yappuworld.schedule.infrastructure.entity.LatePassEntity
4+
import org.springframework.stereotype.Service
5+
import org.springframework.transaction.annotation.Transactional
6+
7+
@Service
8+
@Transactional
9+
class LatePassCommandService(
10+
private val latePassRepository: LatePassRepository
11+
) {
12+
13+
fun saveAll(latePassEntities: List<LatePassEntity>) {
14+
latePassRepository.saveAll(latePassEntities)
15+
}
16+
}

src/main/kotlin/co/yappuworld/schedule/infrastructure/LatePassFindService.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,12 @@ class LatePassFindService(
1414
fun countLatePasses(
1515
generation: Int,
1616
userId: UUID
17-
): Int = latePassRepository.countAllByGenerationAndUserId(generation, userId)
17+
): Int = latePassRepository.findByGenerationAndUserId(generation, userId)?.count ?: 0
1818

1919
fun findLatePasses(generation: Int): List<LatePassEntity> = latePassRepository.findAllByGeneration(generation)
20+
21+
fun findLatePasses(
22+
generation: Int,
23+
userIds: List<UUID>
24+
): List<LatePassEntity> = latePassRepository.findAllByGenerationAndUserIdIn(generation, userIds)
2025
}

src/main/kotlin/co/yappuworld/schedule/infrastructure/LatePassRepository.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,15 @@ import java.util.UUID
66

77
interface LatePassRepository : JpaRepository<LatePassEntity, Long> {
88

9-
fun countAllByGenerationAndUserId(
9+
fun findByGenerationAndUserId(
1010
generation: Int,
1111
userId: UUID
12-
): Int
12+
): LatePassEntity?
1313

1414
fun findAllByGeneration(generation: Int): List<LatePassEntity>
15+
16+
fun findAllByGenerationAndUserIdIn(
17+
generation: Int,
18+
userIds: Collection<UUID>
19+
): List<LatePassEntity>
1520
}

src/main/kotlin/co/yappuworld/schedule/infrastructure/entity/LatePassEntity.kt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,14 @@ import java.util.UUID
1010
@Table(name = "late_passes")
1111
class LatePassEntity(
1212
val userId: UUID,
13-
val generation: Int,
14-
reason: String? = null
13+
val generation: Int
1514
) : BaseEntity() {
1615

17-
@Column(name = "reason")
18-
val reason: String? = reason
16+
@Column(name = "count", nullable = false)
17+
var count: Int = 0
18+
private set
19+
20+
fun updateCount(latePassCount: Int) {
21+
this.count = latePassCount
22+
}
1923
}

src/main/resources/schema.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,5 +137,5 @@ create table late_passes
137137
updated_at datetime(6),
138138
user_id binary(16) NOT NULL,
139139
generation int NOT NULL,
140-
reason varchar(128)
140+
count int NOT NULL DEFAULT 0
141141
);

src/test/kotlin/co/yappuworld/schedule/domain/AttendanceBookTest.kt

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,10 @@ class AttendanceBookTest :
7777
status = AttendanceStatus.PENDING
7878
)
7979
)
80-
val latePassEntities = listOf(
81-
LatePassEntity(
82-
userId = users[0].userId,
83-
generation = generation
84-
)
85-
)
80+
val latePassEntity = LatePassEntity(
81+
userId = users[0].userId,
82+
generation = generation
83+
).apply { updateCount(1) }
8684

8785
scenario("AttendanceBook을 생성한다.") {
8886
shouldNotThrowAny {
@@ -91,7 +89,7 @@ class AttendanceBookTest :
9189
attendees = users.map { getAttendeeFixture(it, generation) },
9290
sessions = sessions,
9391
attendances = attendances,
94-
latePasses = latePassEntities,
92+
latePasses = listOf(latePassEntity),
9593
now = now
9694
)
9795
}
@@ -103,7 +101,7 @@ class AttendanceBookTest :
103101
attendees = users.map { getAttendeeFixture(it, generation) },
104102
sessions = sessions,
105103
attendances = attendances,
106-
latePasses = latePassEntities,
104+
latePasses = listOf(latePassEntity),
107105
now = now
108106
)
109107

@@ -153,7 +151,7 @@ class AttendanceBookTest :
153151
attendees = users.map { getAttendeeFixture(it, generation) },
154152
sessions = sessions,
155153
attendances = attendances,
156-
latePasses = latePassEntities,
154+
latePasses = listOf(latePassEntity),
157155
now = now
158156
)
159157

@@ -195,11 +193,7 @@ class AttendanceBookTest :
195193
LatePassEntity(
196194
userId = users[0].userId,
197195
generation = generation
198-
),
199-
LatePassEntity(
200-
userId = users[0].userId,
201-
generation = generation
202-
)
196+
).apply { updateCount(2) }
203197
),
204198
now = now
205199
)
@@ -213,7 +207,7 @@ class AttendanceBookTest :
213207
attendees = users.map { getAttendeeFixture(it, generation) },
214208
sessions = sessions,
215209
attendances = attendances,
216-
latePasses = latePassEntities,
210+
latePasses = listOf(latePassEntity),
217211
now = now
218212
)
219213

0 commit comments

Comments
 (0)