diff --git a/komga/src/main/kotlin/org/gotson/komga/domain/persistence/AuthenticationActivityRepository.kt b/komga/src/main/kotlin/org/gotson/komga/domain/persistence/AuthenticationActivityRepository.kt index 3280a02ff..15cb9333f 100644 --- a/komga/src/main/kotlin/org/gotson/komga/domain/persistence/AuthenticationActivityRepository.kt +++ b/komga/src/main/kotlin/org/gotson/komga/domain/persistence/AuthenticationActivityRepository.kt @@ -9,6 +9,7 @@ import java.time.LocalDateTime interface AuthenticationActivityRepository { fun findAll(pageable: Pageable): Page fun findAllByUser(user: KomgaUser, pageable: Pageable): Page + fun findMostRecentByUser(user: KomgaUser): AuthenticationActivity? fun insert(activity: AuthenticationActivity) diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/AuthenticationActivityDao.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/AuthenticationActivityDao.kt index 25a26d3ee..14235498b 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/AuthenticationActivityDao.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/AuthenticationActivityDao.kt @@ -43,6 +43,15 @@ class AuthenticationActivityDao( return findAll(conditions, pageable) } + override fun findMostRecentByUser(user: KomgaUser): AuthenticationActivity? = + dsl.selectFrom(aa) + .where(aa.USER_ID.eq(user.id)) + .or(aa.EMAIL.eq(user.email)) + .orderBy(aa.DATE_TIME.desc()) + .limit(1) + .fetchOne() + ?.toDomain() + private fun findAll(conditions: Condition, pageable: Pageable): PageImpl { val count = dsl.fetchCount(aa, conditions) diff --git a/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/UserController.kt b/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/UserController.kt index 86cac4f7c..f892ca738 100644 --- a/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/UserController.kt +++ b/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/UserController.kt @@ -31,7 +31,6 @@ import org.springframework.http.HttpStatus import org.springframework.http.MediaType import org.springframework.security.access.prepost.PreAuthorize import org.springframework.security.core.annotation.AuthenticationPrincipal -import org.springframework.security.core.userdetails.UsernameNotFoundException import org.springframework.web.bind.annotation.DeleteMapping import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PatchMapping @@ -198,4 +197,15 @@ class UserController( return authenticationActivityRepository.findAll(pageRequest).map { it.toDto() } } + + @GetMapping("{id}/authentication-activity/latest") + @PreAuthorize("hasRole('$ROLE_ADMIN') or #principal.user.id == #id") + fun getLatestAuthenticationActivityForUser( + @PathVariable id: String, + @AuthenticationPrincipal principal: KomgaPrincipal, + ): AuthenticationActivityDto = + userRepository.findByIdOrNull(id)?.let { user -> + authenticationActivityRepository.findMostRecentByUser(user)?.toDto() + ?: throw ResponseStatusException(HttpStatus.NOT_FOUND) + } ?: throw ResponseStatusException(HttpStatus.NOT_FOUND) }