diff --git a/app/src/main/java/org/jellyfin/mobile/controller/ServerController.kt b/app/src/main/java/org/jellyfin/mobile/controller/ServerController.kt index c8e7c8ab..208cd23e 100644 --- a/app/src/main/java/org/jellyfin/mobile/controller/ServerController.kt +++ b/app/src/main/java/org/jellyfin/mobile/controller/ServerController.kt @@ -28,13 +28,13 @@ class ServerController( suspend fun setupServer(hostname: String) { appPreferences.currentServerId = withContext(Dispatchers.IO) { - serverDao.insert(hostname) + serverDao.getServerByHostname(hostname)?.id ?: serverDao.insert(hostname) } } suspend fun setupUser(serverId: Long, userId: String, accessToken: String) { appPreferences.currentUserId = withContext(Dispatchers.IO) { - userDao.insert(serverId, userId, accessToken) + userDao.upsert(serverId, userId, accessToken) } apiClient.SetAuthenticationInfo(accessToken, userId) } diff --git a/app/src/main/java/org/jellyfin/mobile/model/sql/dao/ServerDao.kt b/app/src/main/java/org/jellyfin/mobile/model/sql/dao/ServerDao.kt index a098ab7c..f0528ca9 100644 --- a/app/src/main/java/org/jellyfin/mobile/model/sql/dao/ServerDao.kt +++ b/app/src/main/java/org/jellyfin/mobile/model/sql/dao/ServerDao.kt @@ -9,11 +9,14 @@ import org.jellyfin.mobile.model.sql.entity.ServerEntity.Key.TABLE_NAME @Dao interface ServerDao { - @Insert(onConflict = OnConflictStrategy.REPLACE) + @Insert(onConflict = OnConflictStrategy.ABORT) fun insert(entity: ServerEntity): Long fun insert(hostname: String) = insert(ServerEntity(hostname)) @Query("SELECT * FROM $TABLE_NAME WHERE id = :id") fun getServer(id: Long): ServerEntity? + + @Query("SELECT * FROM $TABLE_NAME WHERE hostname = :hostname") + fun getServerByHostname(hostname: String): ServerEntity? } diff --git a/app/src/main/java/org/jellyfin/mobile/model/sql/dao/UserDao.kt b/app/src/main/java/org/jellyfin/mobile/model/sql/dao/UserDao.kt index 5d667071..d3a16915 100644 --- a/app/src/main/java/org/jellyfin/mobile/model/sql/dao/UserDao.kt +++ b/app/src/main/java/org/jellyfin/mobile/model/sql/dao/UserDao.kt @@ -7,20 +7,40 @@ import org.jellyfin.mobile.model.sql.entity.UserEntity.Key.ACCESS_TOKEN import org.jellyfin.mobile.model.sql.entity.UserEntity.Key.ID import org.jellyfin.mobile.model.sql.entity.UserEntity.Key.SERVER_ID import org.jellyfin.mobile.model.sql.entity.UserEntity.Key.TABLE_NAME +import org.jellyfin.mobile.model.sql.entity.UserEntity.Key.USER_ID @Dao interface UserDao { - @Insert(onConflict = OnConflictStrategy.REPLACE) + @Insert(onConflict = OnConflictStrategy.ABORT) fun insert(entity: UserEntity): Long fun insert(serverId: Long, userId: String, accessToken: String?) = insert(UserEntity(serverId, userId, accessToken)) + @Transaction + fun upsert(serverId: Long, userId: String, accessToken: String?): Long { + val user = getByUserId(serverId, userId) + return if (user != null) { + update(user.id, accessToken) + user.id + } else insert(serverId, userId, accessToken) + } + @Transaction @Query("SELECT * FROM $TABLE_NAME WHERE $SERVER_ID = :serverId AND $ID = :userId") fun getServerUser(serverId: Long, userId: Long): ServerUser? + @Transaction + @Query("SELECT * FROM $TABLE_NAME WHERE $SERVER_ID = :serverId AND $USER_ID = :userId") + fun getServerUser(serverId: Long, userId: String): ServerUser? + + @Query("SELECT * FROM $TABLE_NAME WHERE $SERVER_ID = :serverId AND $USER_ID = :userId") + fun getByUserId(serverId: Long, userId: String): UserEntity? + @Query("SELECT * FROM $TABLE_NAME WHERE $SERVER_ID = :serverId") - fun getUsersForServer(serverId: Long): List + fun getAllForServer(serverId: Long): List + + @Query("UPDATE $TABLE_NAME SET access_token = :accessToken WHERE $ID = :userId") + fun update(userId: Long, accessToken: String?): Int @Query("UPDATE $TABLE_NAME SET $ACCESS_TOKEN = NULL WHERE $ID = :userId") fun logout(userId: Long)