Skip to content
This repository has been archived by the owner on Dec 7, 2024. It is now read-only.

πŸ”€Β :: μžμ‹ μ˜ μΆœμ„ μƒνƒœ 쑰회 #348

Merged
merged 20 commits into from
Apr 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
f4dea65
add :: endpoint μ„€μ •
ta2ye0n Apr 26, 2024
208353c
add :: AttendSelfCheckResponseDto
ta2ye0n Apr 26, 2024
6f37a6d
add :: AttendanceConverter 좔상화 및 κ΅¬ν˜„
ta2ye0n Apr 26, 2024
77dc7c3
add :: AttendanceRepository
ta2ye0n Apr 26, 2024
466a44d
add :: FindAttendSelfCheckService
ta2ye0n Apr 26, 2024
cb8dfa7
add :: FindAttendSelfCheckServiceImpl
ta2ye0n Apr 26, 2024
9b28ac5
Update src/main/kotlin/com/msg/gcms/domain/attendance/service/impl/Fi…
ta2ye0n Apr 26, 2024
2bb95fe
add :: import문 좔가
ta2ye0n Apr 26, 2024
ac7ee87
refactor :: ν•΄λ‹Ή λ™μ•„λ¦¬μ˜ μ†Œμ†μ΄ 아닐 λ•Œ μ˜ˆμ™Έ λ°œμƒ
ta2ye0n Apr 26, 2024
47647bc
refactor :: schedule μ°ΎλŠ” 쑰건 μΆ”κ°€
ta2ye0n Apr 26, 2024
21e2e6a
refactor :: λ“€μ—¬μ“°κΈ° μˆ˜μ •
ta2ye0n Apr 26, 2024
056775c
Update src/main/kotlin/com/msg/gcms/domain/attendance/service/FindAtt…
ta2ye0n Apr 26, 2024
ccc2fa7
Update src/main/kotlin/com/msg/gcms/domain/attendance/presentation/At…
ta2ye0n Apr 26, 2024
27da259
refactor :: λ³€μˆ˜λͺ… μˆ˜μ •
ta2ye0n Apr 26, 2024
adf3a64
refactor :: μ„œλΉ„μŠ€ λͺ… λ³€κ²½
ta2ye0n Apr 26, 2024
672b04e
refactor :: exists둜 λ³€κ²½
ta2ye0n Apr 26, 2024
677b10e
refactor :: 클래슀λͺ… λ³€κ²½
ta2ye0n Apr 26, 2024
594c309
refactor :: 쑰건식 μˆ˜μ •
ta2ye0n Apr 26, 2024
c72c19d
refactor :: 쑰회 μ½”λ“œ μˆ˜μ •
ta2ye0n Apr 26, 2024
a71b777
refactor :: κ°œν–‰ μΆ”κ°€
ta2ye0n Apr 26, 2024
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 @@ -5,6 +5,7 @@ import com.msg.gcms.domain.attendance.presentation.data.dto.UserAttendanceStatus
import com.msg.gcms.domain.attendance.presentation.data.request.CreateScheduleRequestDto
import com.msg.gcms.domain.attendance.presentation.data.request.UpdateAttendanceStatusBatchRequestDto
import com.msg.gcms.domain.attendance.presentation.data.request.UpdateAttendanceStatusRequestDto
import com.msg.gcms.domain.attendance.presentation.data.response.AttendSelfCheckResponseDto
import com.msg.gcms.domain.attendance.service.*
import com.msg.gcms.domain.attendance.util.AttendanceConverter
import com.msg.gcms.domain.attendance.util.ScheduleConverter
Expand All @@ -13,22 +14,21 @@ import org.springframework.format.annotation.DateTimeFormat
import org.springframework.http.HttpStatus
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.*
import java.net.URL
import java.net.URLEncoder
import java.time.LocalDate
import java.util.*
import javax.servlet.http.HttpServletResponse
import javax.validation.Valid

@RequestController("/attend")
class AttendanceController(
private val createScheduleService: CreateScheduleService,
private val queryCurrentAttendConditionService: QueryCurrentAttendConditionService,
private val updateAttendanceStatusService: UpdateAttendanceStatusService,
private val updateAttendanceStatusBatchService: UpdateAttendanceStatusBatchService,
private val clubAttendanceStatusExcelService: ClubAttendanceStatusExcelService,
private val scheduleConverter: ScheduleConverter,
private val attendanceConverter: AttendanceConverter
private val createScheduleService: CreateScheduleService,
private val queryCurrentAttendConditionService: QueryCurrentAttendConditionService,
private val updateAttendanceStatusService: UpdateAttendanceStatusService,
private val updateAttendanceStatusBatchService: UpdateAttendanceStatusBatchService,
private val clubAttendanceStatusExcelService: ClubAttendanceStatusExcelService,
private val queryCurrentAttendStatusService: QueryCurrentAttendStatusService,
private val scheduleConverter: ScheduleConverter,
private val attendanceConverter: AttendanceConverter
) {
@PostMapping("/{club_id}/club")
fun createSchedule(
Expand Down Expand Up @@ -71,4 +71,9 @@ class AttendanceController(
response.setHeader("Content-Disposition", "attachment; filename=${URLEncoder.encode("$currentDate μΆœμ„λΆ€", "UTF-8").replace("+", "%20")}.xlsx")
return clubAttendanceStatusExcelService.execute(currentDate)
}

@GetMapping("/{club_id}/my")
fun findAttendSelfCheck(@PathVariable("club_id") clubId: Long): ResponseEntity<AttendSelfCheckResponseDto> =
queryCurrentAttendStatusService.execute(clubId)
.let { ResponseEntity.ok(it) }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.msg.gcms.domain.attendance.presentation.data.response

import com.msg.gcms.domain.attendance.domain.enums.AttendanceStatus

data class AttendSelfCheckResponseDto(
val attendanceStatus: AttendanceStatus
)
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.msg.gcms.domain.attendance.repository
import com.msg.gcms.domain.attendance.domain.entity.Attendance
import com.msg.gcms.domain.attendance.domain.entity.Schedule
import com.msg.gcms.domain.attendance.domain.enums.Period
import com.msg.gcms.domain.user.domain.entity.User
import org.springframework.data.jpa.repository.EntityGraph
import org.springframework.data.repository.CrudRepository

Expand All @@ -12,4 +13,6 @@ interface AttendanceRepository : CrudRepository<Attendance, Long>, CustomAttenda
fun findAllByIdIn(ids: List<Long>): List<Attendance>
@EntityGraph(attributePaths = ["user"])
fun findAllBySchedule(schedule: Schedule): List<Attendance>

fun findByScheduleAndPeriodAndUser (schedule: Schedule, period: Period, user: User): Attendance?
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.msg.gcms.domain.attendance.service

import com.msg.gcms.domain.attendance.presentation.data.response.AttendSelfCheckResponseDto

interface QueryCurrentAttendStatusService {
fun execute(id: Long) : AttendSelfCheckResponseDto
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package com.msg.gcms.domain.attendance.service.impl

import com.msg.gcms.domain.attendance.domain.enums.Period
import com.msg.gcms.domain.attendance.exception.AttendanceNotFoundException
import com.msg.gcms.domain.attendance.exception.ScheduleNotFoundException
import com.msg.gcms.domain.attendance.presentation.data.response.AttendSelfCheckResponseDto
import com.msg.gcms.domain.attendance.repository.AttendanceRepository
import com.msg.gcms.domain.attendance.repository.ScheduleRepository
import com.msg.gcms.domain.attendance.service.QueryCurrentAttendStatusService
import com.msg.gcms.domain.attendance.util.AttendanceConverter
import com.msg.gcms.domain.club.domain.repository.ClubRepository
import com.msg.gcms.domain.club.exception.ClubNotFoundException
import com.msg.gcms.domain.club.exception.NotClubMemberException
import com.msg.gcms.domain.clubMember.domain.repository.ClubMemberRepository
import com.msg.gcms.global.annotation.ServiceWithReadOnlyTransaction
import com.msg.gcms.global.util.UserUtil
import org.springframework.data.repository.findByIdOrNull
import java.time.LocalDate
import java.time.LocalTime

@ServiceWithReadOnlyTransaction
class QueryCurrentAttendStatusServiceImpl (
private val userUtil: UserUtil,
private val attendanceRepository: AttendanceRepository,
private val clubRepository: ClubRepository,
private val attendanceConverter: AttendanceConverter,
private val clubMemberRepository: ClubMemberRepository,
private val scheduleRepository: ScheduleRepository
): QueryCurrentAttendStatusService {
override fun execute(id: Long): AttendSelfCheckResponseDto {
val user = userUtil.fetchCurrentUser()
val club = clubRepository.findByIdOrNull(id)
?: throw ClubNotFoundException()

if (!clubMemberRepository.existsByUserAndClub(user, club)) {
throw NotClubMemberException()
}

val period = getCurrentPeriod()

val schedule = scheduleRepository.findByClubAndDate(club, LocalDate.now())
?: throw ScheduleNotFoundException()

val attend = attendanceRepository.findByScheduleAndPeriodAndUser(schedule, period, user)
?: throw AttendanceNotFoundException()

return attendanceConverter.toDto(attend);
}

fun getCurrentPeriod(): Period {
Period.values().reversed().forEach {
if (LocalTime.now().isAfter(it.time))
return it
}
return Period.ELEVENTH
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import com.msg.gcms.domain.attendance.presentation.data.dto.AttendanceDto.Attend
import com.msg.gcms.domain.attendance.presentation.data.dto.UserAttendanceStatusListDto
import com.msg.gcms.domain.attendance.presentation.data.request.UpdateAttendanceStatusBatchRequestDto
import com.msg.gcms.domain.attendance.presentation.data.request.UpdateAttendanceStatusRequestDto
import com.msg.gcms.domain.attendance.presentation.data.response.AttendSelfCheckResponseDto
import com.msg.gcms.domain.user.domain.entity.User

interface AttendanceConverter {
Expand All @@ -23,4 +24,6 @@ interface AttendanceConverter {
fun toDto(attendanceStatusDto: UpdateAttendanceStatusBatchRequestDto): AttendanceBatchDto
fun toDto(user: User, attendance: Attendance): UserAttendanceStatusListDto.UserAttendanceStatusDto
fun toListDto(attendances: List<Attendance>): UserAttendanceStatusListDto

fun toDto(attendance: Attendance): AttendSelfCheckResponseDto
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import com.msg.gcms.domain.attendance.presentation.data.dto.AttendanceDto.Attend
import com.msg.gcms.domain.attendance.presentation.data.dto.UserAttendanceStatusListDto
import com.msg.gcms.domain.attendance.presentation.data.request.UpdateAttendanceStatusBatchRequestDto
import com.msg.gcms.domain.attendance.presentation.data.request.UpdateAttendanceStatusRequestDto
import com.msg.gcms.domain.attendance.presentation.data.response.AttendSelfCheckResponseDto
import com.msg.gcms.domain.attendance.util.AttendanceConverter
import com.msg.gcms.domain.user.domain.entity.User
import org.springframework.stereotype.Component
Expand Down Expand Up @@ -39,6 +40,11 @@ class AttendanceConverterImpl : AttendanceConverter {
number = user.number,
attendanceStatus = attendance.attendanceStatus
)

override fun toDto(attendance: Attendance): AttendSelfCheckResponseDto = AttendSelfCheckResponseDto(
attendanceStatus = attendance.attendanceStatus
)

override fun toDto(attendanceStatusDto: UpdateAttendanceStatusRequestDto): AttendanceDto = AttendanceDto(
id = attendanceStatusDto.attendanceId,
attendanceStatus = attendanceStatusDto.attendanceStatus
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ class SecurityConfig(
.antMatchers(HttpMethod.PATCH, "/attend/batch").authenticated()
.antMatchers(HttpMethod.PATCH, "/attend").authenticated()
.antMatchers(HttpMethod.GET, "/attend/excel").hasRole("ADMIN")
.antMatchers(HttpMethod.GET, "/attend/{club_id}/my").hasAnyRole("STUDENT")

.antMatchers(HttpMethod.POST, "/notification/{club_id}").authenticated()
.antMatchers(HttpMethod.GET, "/notification/{id}").authenticated()
Expand Down
Loading