Allow server/user deletion

This commit is contained in:
Ethan Pippin 2021-10-14 16:50:08 -06:00
parent 1aa2716f42
commit b13877cddd
7 changed files with 91 additions and 17 deletions

View File

@ -15,7 +15,7 @@ struct ServerDetailView: View {
var body: some View {
Form {
Section(header: Text("")) {
Section(header: Text("Server Details")) {
HStack {
Text("Name")
Spacer()

View File

@ -52,6 +52,13 @@ struct ServerListView: View {
}
.padding()
}
.contextMenu {
Button(role: .destructive) {
viewModel.remove(server: server)
} label: {
Label("Remove", systemImage: "trash")
}
}
}
}
}
@ -60,7 +67,7 @@ struct ServerListView: View {
@ViewBuilder
private var noServerView: some View {
VStack {
Text("Connect to a Jellyfin server to get started.")
Text("Connect to a Jellyfin server to get started")
.frame(minWidth: 50, maxWidth: 240)
.multilineTextAlignment(.center)

View File

@ -28,23 +28,48 @@ struct SettingsView: View {
var body: some View {
Form {
Section(header: EmptyView()) {
HStack {
Text("User")
Spacer()
Text(SessionManager.main.currentLogin.user.username)
.foregroundColor(.jellyfinPurple)
}
Button {
settingsRouter.route(to: \.serverDetail)
} label: {
// There is a bug where the SettingsView attmempts to remake itself upon signing out
// so this check is made
if SessionManager.main.currentLogin == nil {
HStack {
Text("Server")
Text("User")
Spacer()
Text(SessionManager.main.currentLogin.server.name)
Text("")
.foregroundColor(.jellyfinPurple)
}
Image(systemName: "chevron.right")
Button {
settingsRouter.route(to: \.serverDetail)
} label: {
HStack {
Text("Server")
Spacer()
Text("")
.foregroundColor(.jellyfinPurple)
Image(systemName: "chevron.right")
}
}
} else {
HStack {
Text("User")
Spacer()
Text(SessionManager.main.currentLogin.user.username)
.foregroundColor(.jellyfinPurple)
}
Button {
settingsRouter.route(to: \.serverDetail)
} label: {
HStack {
Text("Server")
Spacer()
Text(SessionManager.main.currentLogin.server.name)
.foregroundColor(.jellyfinPurple)
Image(systemName: "chevron.right")
}
}
}

View File

@ -45,6 +45,13 @@ struct UserListView: View {
}
.padding()
}
.contextMenu {
Button(role: .destructive) {
viewModel.remove(user: user)
} label: {
Label("Remove", systemImage: "trash")
}
}
}
}
}
@ -53,7 +60,7 @@ struct UserListView: View {
@ViewBuilder
private var noUserView: some View {
VStack {
Text("Sign in to get started.")
Text("Sign in to get started")
.frame(minWidth: 50, maxWidth: 240)
.multilineTextAlignment(.center)

View File

@ -175,6 +175,7 @@ final class SessionManager {
}
func logout() {
currentLogin = nil
JellyfinAPI.basePath = ""
setAuthHeader(with: "")
SwiftfinStore.Defaults.suite[.lastServerUserID] = nil
@ -182,11 +183,35 @@ final class SessionManager {
}
func delete(user: SwiftfinStore.State.User) {
guard let storedUser = try? SwiftfinStore.dataStack.fetchOne(From<SwiftfinStore.Models.StoredUser>(),
[Where<SwiftfinStore.Models.StoredUser>("id == %@", user.id)]) else { fatalError("No stored user for state user?")}
_delete(user: storedUser, transaction: nil)
}
func delete(server: SwiftfinStore.State.Server) {
guard let storedServer = try? SwiftfinStore.dataStack.fetchOne(From<SwiftfinStore.Models.StoredServer>(),
[Where<SwiftfinStore.Models.StoredServer>("id == %@", server.id)]) else { fatalError("No stored server for state server?")}
_delete(server: storedServer, transaction: nil)
}
private func _delete(user: SwiftfinStore.Models.StoredUser, transaction: UnsafeDataTransaction?) {
guard let storedAccessToken = user.accessToken else { fatalError("No access token for stored user?")}
let transaction = transaction == nil ? SwiftfinStore.dataStack.beginUnsafe() : transaction!
transaction.delete(storedAccessToken)
transaction.delete(user)
try? transaction.commitAndWait()
}
private func _delete(server: SwiftfinStore.Models.StoredServer, transaction: UnsafeDataTransaction?) {
let transaction = transaction == nil ? SwiftfinStore.dataStack.beginUnsafe() : transaction!
for user in server.users {
_delete(user: user, transaction: transaction)
}
transaction.delete(server)
try? transaction.commitAndWait()
}
private func setAuthHeader(with accessToken: String) {

View File

@ -25,4 +25,9 @@ class ServerListViewModel: ObservableObject {
return "\(server.userIDs.count) users"
}
}
func remove(server: SwiftfinStore.State.Server) {
SessionManager.main.delete(server: server)
fetchServers()
}
}

View File

@ -29,4 +29,9 @@ class UserListViewModel: ViewModel {
SessionManager.main.loginUser(server: server, user: user)
SwiftfinNotificationCenter.main.post(name: SwiftfinNotificationCenter.Keys.didSignIn, object: nil)
}
func remove(user: SwiftfinStore.State.User) {
SessionManager.main.delete(user: user)
fetchUsers()
}
}