Я создаю микросервис аутентификации токена, используя Lagom
, и столкнулся с проблемой. Моя модель данных в настоящее время
table Token (
groupName varchar(255) PK,
token varchar(255) (logical UUID type)
)
У меня есть три метода: createToken
, getToken
и validateToken
. Первые два берут имя группы, которое хорошо соответствует идентификатору сущности, как указано в https://www.lagomframework.com/documentation/current/scala/PersistentEntity.html#Persistent-Entity.
Третий принимает токен в теле запроса, а затем возвращает полезную нагрузку json с groupName
и token
, если это удается.
Lagom абстрагирует реальный SQL, и вы получаете доступ к постоянному слою, выполняя что-то вроде этого: val ref = persistentEntityRegistry.refFor[DptokenEntity](groupName)
. Фактический код персистентности здесь:
class DptokenEntity extends PersistentEntity {
override type Command = DptokenCommand[_]
override type Event = DptokenEvent
override type State = DptokenState
override def initialState: DptokenState = DptokenState(None)
override def behavior: Behavior = {
case DptokenState(_) => Actions()
.onCommand[PersistToken, TokenResponse] {
case (PersistToken(token), ctx, state) =>
ctx.thenPersist(TokenPersisted(token)) { _ =>
ctx.reply(token)
}
}.onReadOnlyCommand[GetToken, TokenResponse] {
case (GetToken(groupName), ctx, state) =>
state.token match {
case Some(token) => ctx.reply(token)
case None => ctx.invalidCommand(s"No token exists for $groupName")
}
}.onEvent {
case (TokenPersisted(token), _) => DptokenState(Some(token))
}
}
}
case class DptokenState(token: Option[TokenResponse])
Я изо всех сил пытаюсь понять, как выполнить обратный поиск в вышеупомянутой модели, из-за того факта, что, если я найду entity
по токену, якобы получу новую строку в базе данных, где отношение token
-> groupName
, что создает серьезные проблемы с обновлениями и т. Д. *
Я хотел бы посоветоваться с хорошими ребятами из SO, прежде чем я просто разберу материал Event Sourcing и использую raw Slick.