authService errors

This commit is contained in:
cheykrym 2025-08-06 04:19:30 +03:00
parent 337c222548
commit 7f9337cd16
3 changed files with 24 additions and 12 deletions

View File

@ -1,16 +1,27 @@
package org.yobble.scala_monolith.api.endpoint.auth package org.yobble.scala_monolith.api.endpoint.auth
import io.circe.generic.auto.*
import org.yobble.scala_monolith.api.dto.{LoginRequest, LoginResponse} import org.yobble.scala_monolith.api.dto.{LoginRequest, LoginResponse}
import sttp.tapir._ import org.yobble.scala_monolith.api.response.ErrorResponse
import sttp.tapir.generic.auto._ import org.yobble.scala_monolith.api.util.ErrorExamples
import sttp.tapir.json.circe._ import sttp.model.StatusCode
import sttp.tapir.*
import sttp.tapir.generic.auto.*
import sttp.tapir.json.circe.*
object AuthEndpoints { object AuthEndpoints {
val loginEndpoint: PublicEndpoint[LoginRequest, String, LoginResponse, Any] = val loginEndpoint: PublicEndpoint[LoginRequest, ErrorResponse, LoginResponse, Any] =
endpoint.post endpoint.post
.in("auth" / "login") .in("auth" / "login")
.in(jsonBody[LoginRequest]) .in(jsonBody[LoginRequest])
.out(jsonBody[LoginResponse]) .out(jsonBody[LoginResponse])
.errorOut(stringBody) .errorOut(
oneOf[ErrorResponse](
oneOfVariant(StatusCode.BadRequest, jsonBody[ErrorResponse].description("Bad Request").example(ErrorExamples.badRequest)),
oneOfVariant(StatusCode.Unauthorized, jsonBody[ErrorResponse].description("Unauthorized").example(ErrorExamples.unauthorized)),
oneOfVariant(StatusCode.Forbidden, jsonBody[ErrorResponse].description("Forbidden").example(ErrorExamples.forbidden)),
oneOfVariant(StatusCode.UnprocessableEntity, jsonBody[ErrorResponse].description("Validation Error").example(ErrorExamples.validation))
)
)
} }

View File

@ -11,6 +11,5 @@ object ErrorResponse {
implicit val errorDetailEncoder: Encoder[ErrorDetail] = deriveEncoder[ErrorDetail] implicit val errorDetailEncoder: Encoder[ErrorDetail] = deriveEncoder[ErrorDetail]
// Encoder без поля code // Encoder без поля code
// implicit val errorResponseEncoder: Encoder[ErrorResponse] = implicit val errorResponseEncoder: Encoder[ErrorResponse] = deriveEncoder[ErrorResponse]
// deriveEncoder[ErrorResponse].mapJsonObject(_.remove("code"))
} }

View File

@ -2,24 +2,26 @@ package org.yobble.scala_monolith.service
import cats.effect.IO import cats.effect.IO
import org.yobble.scala_monolith.api.dto.{LoginRequest, LoginResponse} import org.yobble.scala_monolith.api.dto.{LoginRequest, LoginResponse}
import org.yobble.scala_monolith.api.response.ErrorResponse
import org.yobble.scala_monolith.api.util.ErrorUtils
import org.yobble.scala_monolith.repository.UserRepository import org.yobble.scala_monolith.repository.UserRepository
class AuthService(userRepository: UserRepository) { class AuthService(userRepository: UserRepository) {
def login(request: LoginRequest): IO[Either[String, LoginResponse]] = { def login(request: LoginRequest): IO[Either[ErrorResponse, LoginResponse]] = {
userRepository.findByLogin(request.login).map { userRepository.findByLogin(request.login).map {
case Some(user) if user.passwordHash != request.password => case Some(user) if user.passwordHash != request.password =>
Left("Invalid login or password") Left(ErrorUtils.unauthorized("Invalid login or password"))
case Some(user) if user.isBlocked => case Some(user) if user.isBlocked =>
Left("User account is disabled") Left(ErrorUtils.forbidden("User account is disabled"))
case Some(user) if user.isDeleted => case Some(user) if user.isDeleted =>
Left("User account is deleted") Left(ErrorUtils.forbidden("User account is deleted"))
case Some(user) => case Some(user) =>
// TODO: Implement proper password hashing (e.g., with bcrypt) // TODO: Implement proper password hashing (e.g., with bcrypt)
// TODO: Implement real token generation // TODO: Implement real token generation
Right(LoginResponse(accessToken = "fake-access-token", refreshToken = "fake-refresh-token")) Right(LoginResponse(accessToken = "fake-access-token", refreshToken = "fake-refresh-token"))
case None => case None =>
Left("Invalid login or password") Left(ErrorUtils.unauthorized("Invalid login or password"))
} }
} }
} }