diff --git a/server/src/main/resources/db/changelog/06-add-username-to-monitoring.yml b/server/src/main/resources/db/changelog/06-add-username-to-monitoring.yml new file mode 100644 index 0000000..ef2293e --- /dev/null +++ b/server/src/main/resources/db/changelog/06-add-username-to-monitoring.yml @@ -0,0 +1,23 @@ +databaseChangeLog: + - changeSet: + id: 06 + author: dyrkin + preConditions: + onFail: MARK_RAN + not: + columnExists: + tableName: monitoring + columnName: username + changes: + - addColumn: + tableName: monitoring + columns: + - column: + name: username + type: VARCHAR(255) + + - addNotNullConstraint: + tableName: monitoring + columnName: username + columnDataType: VARCHAR(255) + defaultNullValue: "you" diff --git a/server/src/main/resources/db/liquibase-changelog.yml b/server/src/main/resources/db/liquibase-changelog.yml index 26bbea4..f6bff2b 100644 --- a/server/src/main/resources/db/liquibase-changelog.yml +++ b/server/src/main/resources/db/liquibase-changelog.yml @@ -16,4 +16,7 @@ databaseChangeLog: relativeToChangelogFile: true - include: file: changelog/05-drop-bugs-table.yml - relativeToChangelogFile: true \ No newline at end of file + relativeToChangelogFile: true +- include: + file: changelog/06-add-username-to-monitoring.yml + relativeToChangelogFile: true \ No newline at end of file diff --git a/server/src/main/scala/com/lbs/server/conversation/Account.scala b/server/src/main/scala/com/lbs/server/conversation/Account.scala index 5e02e8f..10460b9 100644 --- a/server/src/main/scala/com/lbs/server/conversation/Account.scala +++ b/server/src/main/scala/com/lbs/server/conversation/Account.scala @@ -51,7 +51,7 @@ class Account(val userId: UserId, bot: Bot, dataService: DataService, val locali userMaybe.foreach { user => user.activeAccountId = accountId dataService.saveUser(user) - router ! SwitchAccount(UserId(account.userId, account.accountId, userId.source)) + router ! SwitchAccount(UserId(account.userId, account.username, account.accountId, userId.source)) bot.sendMessage(userId.source, lang.accountSwitched(account.username)) } case None => diff --git a/server/src/main/scala/com/lbs/server/conversation/Auth.scala b/server/src/main/scala/com/lbs/server/conversation/Auth.scala index 1b4dff6..f58912a 100644 --- a/server/src/main/scala/com/lbs/server/conversation/Auth.scala +++ b/server/src/main/scala/com/lbs/server/conversation/Auth.scala @@ -46,8 +46,8 @@ class Auth( chat = getChat(userId.get) chat ! cmd stay() - case Msg(LoggedIn(forwardCommand, uId, aId), _) => - val id = UserId(uId, aId, source) + case Msg(LoggedIn(forwardCommand, uId, username, aId), _) => + val id = UserId(uId, username, aId, source) val cmd = forwardCommand.cmd userId = Some(id) chat = getChat(id, reInit = true) @@ -72,7 +72,7 @@ class Auth( def getUserId: Option[UserId] = { val userIdMaybe = dataService.findUserAndAccountIdBySource(source) - userIdMaybe.map { case (uId, aId) => UserId(uId, aId, source) } + userIdMaybe.map { case (uId, username, aId) => UserId(uId, username, aId, source) } } beforeDestroy { diff --git a/server/src/main/scala/com/lbs/server/conversation/Login.scala b/server/src/main/scala/com/lbs/server/conversation/Login.scala index 05b8c34..9345365 100644 --- a/server/src/main/scala/com/lbs/server/conversation/Login.scala +++ b/server/src/main/scala/com/lbs/server/conversation/Login.scala @@ -52,10 +52,10 @@ class Login( goto(requestUsername) case Right(session) => val credentials = dataService.saveCredentials(source, username, password) - userId = UserId(credentials.userId, credentials.accountId, source) + userId = UserId(credentials.userId, credentials.username, credentials.accountId, source) apiService.addSession(credentials.accountId, session) bot.sendMessage(source, lang.loginAndPasswordAreOk) - originator ! LoggedIn(forwardCommand, credentials.userId, credentials.accountId) + originator ! LoggedIn(forwardCommand, credentials.userId, credentials.username, credentials.accountId) end() } } @@ -65,8 +65,8 @@ object Login { case class ForwardCommand(cmd: Command) - case class UserId(userId: Long, accountId: Long, source: MessageSource) + case class UserId(userId: Long, username: String, accountId: Long, source: MessageSource) - case class LoggedIn(forwardCommand: ForwardCommand, userId: Long, accountId: Long) + case class LoggedIn(forwardCommand: ForwardCommand, userId: Long, username: String, accountId: Long) } diff --git a/server/src/main/scala/com/lbs/server/lang/En.scala b/server/src/main/scala/com/lbs/server/lang/En.scala index 27f3484..5333a55 100644 --- a/server/src/main/scala/com/lbs/server/lang/En.scala +++ b/server/src/main/scala/com/lbs/server/lang/En.scala @@ -300,7 +300,7 @@ object En extends Lang { | Create new monitoring /book""".stripMargin override def appointmentIsBooked(term: TermExt, monitoring: Monitoring): String = - s"""👍 We just booked an appointment for you! + s"""👍 We just booked an appointment for ${monitoring.username}! | |⏱ ${formatDateTime(term.term.dateTimeFrom, locale)} |${capitalize(doctor)}: ${term.term.doctor.firstName} ${term.term.doctor.lastName} diff --git a/server/src/main/scala/com/lbs/server/lang/Pl.scala b/server/src/main/scala/com/lbs/server/lang/Pl.scala index a072d9d..1804bae 100644 --- a/server/src/main/scala/com/lbs/server/lang/Pl.scala +++ b/server/src/main/scala/com/lbs/server/lang/Pl.scala @@ -302,7 +302,7 @@ object Pl extends Lang { | Stwórz nowy monitoring przez /book""".stripMargin override def appointmentIsBooked(term: TermExt, monitoring: Monitoring): String = - s"""👍 Zarezerwowaliśmy za Ciebie termin! + s"""👍 Zarezerwowaliśmy termin dla ${monitoring.username}! | |⏱ ${formatDateTime(term.term.dateTimeFrom, locale)} |${capitalize(doctor)}: ${term.term.doctor.firstName} ${term.term.doctor.lastName} diff --git a/server/src/main/scala/com/lbs/server/lang/Ua.scala b/server/src/main/scala/com/lbs/server/lang/Ua.scala index c248784..e8722d6 100644 --- a/server/src/main/scala/com/lbs/server/lang/Ua.scala +++ b/server/src/main/scala/com/lbs/server/lang/Ua.scala @@ -300,7 +300,7 @@ object Ua extends Lang { | Створити новий моніторінг /book""".stripMargin override def appointmentIsBooked(term: TermExt, monitoring: Monitoring): String = - s"""👍 Ми зерезевували візит для вас! + s"""👍 Ми зерезевували візит для ${monitoring.username}! | |⏱ ${formatDateTime(term.term.dateTimeFrom, locale)} |${capitalize(doctor)}: ${term.term.doctor.firstName} ${term.term.doctor.lastName} diff --git a/server/src/main/scala/com/lbs/server/repository/DataRepository.scala b/server/src/main/scala/com/lbs/server/repository/DataRepository.scala index cc7bf8a..90145d1 100644 --- a/server/src/main/scala/com/lbs/server/repository/DataRepository.scala +++ b/server/src/main/scala/com/lbs/server/repository/DataRepository.scala @@ -265,6 +265,16 @@ class DataRepository(@Autowired em: EntityManager) { .toSeq } + def getUsernameById(userId: Long): Option[String] = { + em.createQuery( + "select credentials.username from Credentials credentials where credentials.userId = :userId", + classOf[String] + ).setParameter("userId", userId) + .getResultList + .asScala + .headOption + } + def findUserCredentialsByUserIdAndAccountId(userId: Long, accountId: Long): Option[Credentials] = { em.createQuery( """select credentials from Credentials credentials where credentials.userId = :userId diff --git a/server/src/main/scala/com/lbs/server/repository/model/Monitoring.scala b/server/src/main/scala/com/lbs/server/repository/model/Monitoring.scala index f916029..6746306 100644 --- a/server/src/main/scala/com/lbs/server/repository/model/Monitoring.scala +++ b/server/src/main/scala/com/lbs/server/repository/model/Monitoring.scala @@ -11,6 +11,10 @@ class Monitoring extends RecordId { @Column(name = "user_id", nullable = false) var userId: JLong = _ + @BeanProperty + @Column(name = "username", nullable = false) + var username: String = _ + @BeanProperty @Column(name = "account_id", nullable = false) var accountId: JLong = _ @@ -99,6 +103,7 @@ class Monitoring extends RecordId { object Monitoring { def apply( userId: Long, + username: String, accountId: Long, chatId: String, sourceSystemId: Long, @@ -123,6 +128,7 @@ object Monitoring { ): Monitoring = { val monitoring = new Monitoring monitoring.userId = userId + monitoring.username = username monitoring.accountId = accountId monitoring.chatId = chatId monitoring.sourceSystemId = sourceSystemId diff --git a/server/src/main/scala/com/lbs/server/service/DataService.scala b/server/src/main/scala/com/lbs/server/service/DataService.scala index f521792..a39691d 100644 --- a/server/src/main/scala/com/lbs/server/service/DataService.scala +++ b/server/src/main/scala/com/lbs/server/service/DataService.scala @@ -80,11 +80,12 @@ class DataService { dataRepository.findSettings(userId) } - def findUserAndAccountIdBySource(source: MessageSource): Option[(Long, Long)] = { - val userIdMaybe = dataRepository.findUserId(source.chatId, source.sourceSystem.id).map(_.toLong) - userIdMaybe.flatMap(userId => - dataRepository.findAccountId(userId).map(_.toLong).map(accountId => userId -> accountId) - ) + def findUserAndAccountIdBySource(source: MessageSource): Option[(Long, String, Long)] = { + for { + userId <- dataRepository.findUserId(source.chatId, source.sourceSystem.id).map(_.toLong) + accountId <- dataRepository.findAccountId(userId).map(_.toLong) + username <- dataRepository.getUsernameById(userId) + } yield (userId, username, accountId) } def findCredentialsByUsername(username: String, userId: Long): Option[Credentials] = { @@ -95,6 +96,10 @@ class DataService { dataRepository.getUserCredentials(userId) } + def getUsernameById(userId: Long): Option[String] = { + dataRepository.getUsernameById(userId) + } + def findUserCredentialsByAccountId(userId: Long, accountId: Long): Option[Credentials] = { dataRepository.findUserCredentialsByUserIdAndAccountId(userId, accountId) } diff --git a/server/src/main/scala/com/lbs/server/util/package.scala b/server/src/main/scala/com/lbs/server/util/package.scala index 4017b70..ff55a81 100644 --- a/server/src/main/scala/com/lbs/server/util/package.scala +++ b/server/src/main/scala/com/lbs/server/util/package.scala @@ -22,6 +22,7 @@ package object util { val (userId, bookingData) = data Monitoring( userId = userId.userId, + username = userId.username, accountId = userId.accountId, chatId = userId.source.chatId, sourceSystemId = userId.source.sourceSystem.id, diff --git a/server/src/test/scala/com/lbs/server/conversation/AuthSpec.scala b/server/src/test/scala/com/lbs/server/conversation/AuthSpec.scala index d9fe5dd..fa89667 100644 --- a/server/src/test/scala/com/lbs/server/conversation/AuthSpec.scala +++ b/server/src/test/scala/com/lbs/server/conversation/AuthSpec.scala @@ -11,7 +11,7 @@ class AuthSpec extends AkkaTestKit { "An Auth actor " when { val source = MessageSource(TelegramMessageSourceSystem, "1") - val userId = UserId(1L, 1L, source) + val userId = UserId(1L, "", 1L, source) "user is unauthorized" must { val unauthorizedHelpActor = ConversationTestProbe[UnauthorizedHelp]() @@ -53,7 +53,7 @@ class AuthSpec extends AkkaTestKit { "forward initial message to chat actor after the user has logged in" in { val cmd = Command(source, Message("1", Some("any"))) - val msg = LoggedIn(ForwardCommand(cmd), 1L, 1L) + val msg = LoggedIn(ForwardCommand(cmd), 1L, "", 1L) auth ! msg chatActor.expectMsg(cmd) } @@ -75,7 +75,7 @@ class AuthSpec extends AkkaTestKit { val loginActorFactory: MessageSourceWithOriginatorTo[Login] = (_, _) => loginActor.conversation val chatActorFactory: UserIdTo[Chat] = _ => chatActor.conversation val dataService = mock(classOf[DataService]) - when(dataService.findUserAndAccountIdBySource(source)).thenReturn(Some(userId.userId, userId.accountId)) + when(dataService.findUserAndAccountIdBySource(source)).thenReturn(Some(userId.userId, "", userId.accountId)) val auth = new Auth(source, dataService, unauthorizedHelpFactory, loginActorFactory, chatActorFactory)(system)