Skip to content

Commit

Permalink
#43 Add logging decorators
Browse files Browse the repository at this point in the history
  • Loading branch information
vityaman committed May 17, 2024
1 parent 3d68b88 commit 252ab6d
Show file tree
Hide file tree
Showing 15 changed files with 264 additions and 13 deletions.
Original file line number Diff line number Diff line change
@@ -1,11 +1,17 @@
package ru.vityaman.lms.botalka.app.spring.logic

import org.springframework.stereotype.Service
import ru.vityaman.lms.botalka.core.logging.Slf4jLog
import ru.vityaman.lms.botalka.core.logic.HomeworkService
import ru.vityaman.lms.botalka.core.logic.basic.BasicHomeworkService
import ru.vityaman.lms.botalka.core.logic.logging.LoggingHomeworkService
import ru.vityaman.lms.botalka.core.storage.HomeworkStorage

@Service
class SpringHomeworkService(
storage: HomeworkStorage,
) : HomeworkService by BasicHomeworkService(storage)
) : HomeworkService by
LoggingHomeworkService(
Slf4jLog("HomeworkService"),
BasicHomeworkService(storage),
)
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package ru.vityaman.lms.botalka.app.spring.logic

import org.springframework.stereotype.Service
import ru.vityaman.lms.botalka.core.logging.Slf4jLog
import ru.vityaman.lms.botalka.core.logic.PromotionService
import ru.vityaman.lms.botalka.core.logic.UserService
import ru.vityaman.lms.botalka.core.logic.basic.BasicPromotionService
import ru.vityaman.lms.botalka.core.logic.logging.LoggingPromotionService
import ru.vityaman.lms.botalka.core.storage.PromotionStorage
import ru.vityaman.lms.botalka.core.tx.TxEnv

Expand All @@ -12,4 +14,8 @@ class SpringPromotionService(
storage: PromotionStorage,
userService: UserService,
txEnv: TxEnv,
) : PromotionService by BasicPromotionService(storage, userService, txEnv)
) : PromotionService by
LoggingPromotionService(
Slf4jLog("PromotionService"),
BasicPromotionService(storage, userService, txEnv),
)
Original file line number Diff line number Diff line change
@@ -1,11 +1,17 @@
package ru.vityaman.lms.botalka.app.spring.logic

import org.springframework.stereotype.Service
import ru.vityaman.lms.botalka.core.logging.Slf4jLog
import ru.vityaman.lms.botalka.core.logic.RatingService
import ru.vityaman.lms.botalka.core.logic.WorkspaceService
import ru.vityaman.lms.botalka.core.logic.basic.BasicRatingService
import ru.vityaman.lms.botalka.core.logic.logging.LoggingRatingService

@Service
class SpringRatingService(
workspaces: WorkspaceService,
) : RatingService by BasicRatingService(workspaces)
) : RatingService by
LoggingRatingService(
Slf4jLog("RatingService"),
BasicRatingService(workspaces),
)
Original file line number Diff line number Diff line change
@@ -1,11 +1,17 @@
package ru.vityaman.lms.botalka.app.spring.logic

import org.springframework.stereotype.Service
import ru.vityaman.lms.botalka.core.logging.Slf4jLog
import ru.vityaman.lms.botalka.core.logic.UserService
import ru.vityaman.lms.botalka.core.logic.basic.BasicUserService
import ru.vityaman.lms.botalka.core.logic.logging.LoggingUserService
import ru.vityaman.lms.botalka.core.storage.UserStorage

@Service
class SpringUserService(
storage: UserStorage,
) : UserService by BasicUserService(storage)
) : UserService by
LoggingUserService(
Slf4jLog("UserService"),
BasicUserService(storage),
)
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package ru.vityaman.lms.botalka.app.spring.logic

import org.springframework.stereotype.Service
import ru.vityaman.lms.botalka.core.logging.Slf4jLog
import ru.vityaman.lms.botalka.core.logic.HomeworkService
import ru.vityaman.lms.botalka.core.logic.WorkspaceService
import ru.vityaman.lms.botalka.core.logic.basic.BasicWorkspaceService
import ru.vityaman.lms.botalka.core.logic.logging.LoggingWorkspaceService
import ru.vityaman.lms.botalka.core.storage.WorkspaceStorage
import java.time.Clock

Expand All @@ -12,4 +14,8 @@ class SpringWorkspaceService(
storage: WorkspaceStorage,
homeworks: HomeworkService,
clock: Clock,
) : WorkspaceService by BasicWorkspaceService(storage, homeworks, clock)
) : WorkspaceService by
LoggingWorkspaceService(
Slf4jLog("WorkspaceService"),
BasicWorkspaceService(storage, homeworks, clock),
)
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@ package ru.vityaman.lms.botalka.app.spring.logic

import org.springframework.stereotype.Service
import ru.vityaman.lms.botalka.core.external.yandex.YandexOAuthCode
import ru.vityaman.lms.botalka.core.logging.Slf4jLog
import ru.vityaman.lms.botalka.core.logic.AuthService
import ru.vityaman.lms.botalka.core.logic.UserService
import ru.vityaman.lms.botalka.core.logic.basic.BasicAuthService
import ru.vityaman.lms.botalka.core.logic.logging.LoggingAuthService
import ru.vityaman.lms.botalka.core.security.auth.AuthMethod
import ru.vityaman.lms.botalka.core.tx.TxEnv

Expand All @@ -13,8 +15,12 @@ class SpringYandexAuthService(
method: AuthMethod<YandexOAuthCode>,
users: UserService,
txEnv: TxEnv,
) : AuthService<YandexOAuthCode> by BasicAuthService(
method,
users,
txEnv,
) : AuthService<YandexOAuthCode> by
LoggingAuthService(
Slf4jLog("YandexAuthService"),
BasicAuthService(
method,
users,
txEnv,
),
)
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,23 @@ package ru.vityaman.lms.botalka.app.spring.security

import org.springframework.stereotype.Service
import ru.vityaman.lms.botalka.core.external.yandex.YandexOAuthCode
import ru.vityaman.lms.botalka.core.logging.Slf4jLog
import ru.vityaman.lms.botalka.core.logic.AuthService
import ru.vityaman.lms.botalka.core.logic.UserService
import ru.vityaman.lms.botalka.core.logic.basic.BasicAuthService
import ru.vityaman.lms.botalka.core.logic.logging.LoggingAuthService
import ru.vityaman.lms.botalka.core.tx.TxEnv

@Service
class SpringYandexOAuthService(
method: SpringYandexOAuthMethod,
users: UserService,
txEnv: TxEnv,
) : AuthService<YandexOAuthCode> by BasicAuthService(
method,
users,
txEnv,
) : AuthService<YandexOAuthCode> by LoggingAuthService(
Slf4jLog("YandexOAuthService"),
BasicAuthService(
method,
users,
txEnv,
),
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package ru.vityaman.lms.botalka.core.logging

interface Log {
fun info(message: String)
fun warn(message: String)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package ru.vityaman.lms.botalka.core.logging

import org.slf4j.LoggerFactory

class Slf4jLog(name: String) : Log {
private val origin = LoggerFactory.getLogger(name)

override fun info(message: String) {
origin.info(message)
}

override fun warn(message: String) {
origin.warn(message)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package ru.vityaman.lms.botalka.core.logic.logging

import ru.vityaman.lms.botalka.core.logging.Log
import ru.vityaman.lms.botalka.core.logic.AuthService
import ru.vityaman.lms.botalka.core.model.AuthUser
import ru.vityaman.lms.botalka.core.model.User
import ru.vityaman.lms.botalka.core.security.auth.AccessToken

class LoggingAuthService<T>(
private val log: Log,
private val origin: AuthService<T>,
) : AuthService<T> {
override suspend fun signUp(draft: User.Draft, credentials: T): AuthUser =
runCatching { origin.signUp(draft, credentials) }
.onSuccess { log.info("User with ${it.user.id} signed up") }
.onFailure { log.warn("Failed to sign up") }
.getOrThrow()

override suspend fun signIn(credentials: T): AccessToken =
runCatching { origin.signIn(credentials) }
.onSuccess { log.info("Signed in") }
.onFailure { log.warn("Failed to sign in") }
.getOrThrow()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package ru.vityaman.lms.botalka.core.logic.logging

import ru.vityaman.lms.botalka.core.logging.Log
import ru.vityaman.lms.botalka.core.logic.HomeworkService
import ru.vityaman.lms.botalka.core.model.Homework

class LoggingHomeworkService(
private val log: Log,
private val origin: HomeworkService,
) : HomeworkService {
override suspend fun create(homework: Homework.Draft): Homework =
runCatching { origin.create(homework) }
.onSuccess { log.info("Created homework with ${it.id}") }
.onFailure { log.warn("Failed to create a homework") }
.getOrThrow()

override suspend fun getById(id: Homework.Id): Homework? =
runCatching { origin.getById(id) }
.onFailure {
log.warn("Failed to get homework with $id: ${it.message}")
}
.getOrThrow()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package ru.vityaman.lms.botalka.core.logic.logging

import ru.vityaman.lms.botalka.core.logging.Log
import ru.vityaman.lms.botalka.core.logic.PromotionService
import ru.vityaman.lms.botalka.core.model.PromotionRequest

class LoggingPromotionService(
private val log: Log,
private val origin: PromotionService,
) : PromotionService {
override suspend fun request(
promotion: PromotionRequest.Draft,
): PromotionRequest =
runCatching { origin.request(promotion) }
.onSuccess {
buildString {
append("Created a promotion request with ${it.id} ")
append("of user with ${promotion.user} to ")
append("${promotion.role}")
}.let { log.info(it) }
}
.onFailure {
buildString {
append("Failed to request promotion of user with ")
append("${promotion.user} to ${promotion.role}")
}.let { log.warn(it) }
}
.getOrThrow()

override suspend fun approve(id: PromotionRequest.Id) =
runCatching { origin.approve(id) }
.onSuccess { log.info("Promotion request with $id was approved") }
.onFailure {
log.warn("Failed to approve promotion request with is $id")
}
.getOrThrow()

override suspend fun reject(id: PromotionRequest.Id) =
runCatching { origin.reject(id) }
.onSuccess { log.info("Promotion request with $id was rejected") }
.onFailure {
log.warn("Failed to reject promotion request with is $id")
}
.getOrThrow()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package ru.vityaman.lms.botalka.core.logic.logging

import ru.vityaman.lms.botalka.core.logging.Log
import ru.vityaman.lms.botalka.core.logic.Grades
import ru.vityaman.lms.botalka.core.logic.RatingService

class LoggingRatingService(
private val log: Log,
private val origin: RatingService,
) : RatingService {
override suspend fun grades(): Grades =
runCatching { origin.grades() }
.onSuccess { log.info("Got grades for ${it.size} students") }
.getOrThrow()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package ru.vityaman.lms.botalka.core.logic.logging

import ru.vityaman.lms.botalka.core.logging.Log
import ru.vityaman.lms.botalka.core.logic.UserService
import ru.vityaman.lms.botalka.core.model.User

class LoggingUserService(
private val log: Log,
private val origin: UserService,
) : UserService {
override suspend fun create(user: User.Draft): User =
runCatching { origin.create(user) }
.onSuccess { log.info("Created user with ${it.id}") }
.onFailure { log.warn("Failed to create user: ${it.message}") }
.getOrThrow()

override suspend fun getById(id: User.Id): User? =
runCatching { origin.getById(id) }
.onSuccess { it ?: log.warn("User with $id not found") }
.onFailure { log.warn("Failed to get user with $id") }
.getOrThrow()

override suspend fun promote(id: User.Id, role: User.Role) =
runCatching { origin.promote(id, role) }
.onSuccess { log.info("User with $id promoted to $role") }
.onFailure {
buildString {
append("Failed to promote user with ")
append("$id to $role: ${it.message}")
}.let { log.warn(it) }
}
.getOrThrow()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package ru.vityaman.lms.botalka.core.logic.logging

import kotlinx.coroutines.flow.Flow
import ru.vityaman.lms.botalka.core.logging.Log
import ru.vityaman.lms.botalka.core.logic.WorkspaceService
import ru.vityaman.lms.botalka.core.model.Homework
import ru.vityaman.lms.botalka.core.model.Workspace

class LoggingWorkspaceService(
private val log: Log,
private val origin: WorkspaceService,
) : WorkspaceService {
override fun events(id: Workspace.Id): Flow<Workspace.Event> =
runCatching { origin.events(id) }
.onSuccess { log.info("Got events for workspace with $id") }
.onFailure {
buildString {
append("Failed to get events for workspace with $id: ")
append(it.message)
}.let { log.warn(it) }
}
.getOrThrow()

override suspend fun produce(
id: Workspace.Id,
event: Workspace.Event.Draft,
): Workspace.Event =
runCatching { origin.produce(id, event) }
.onSuccess {
buildString {
append("Produced an event with ${it.id} ")
append("at workspace with $id")
}.let { log.info(it) }
}
.onFailure {
buildString {
append("Failed to produce and event ")
append("at workspace with $id: ")
append(it.message)
}.let { log.warn(it) }
}
.getOrThrow()

override suspend fun grade(id: Workspace.Id): Homework.Score? =
origin.grade(id)

override fun all(): Flow<Workspace.Id> =
origin.all()
}

0 comments on commit 252ab6d

Please sign in to comment.