From e53b295cb1c323e1a1516b595595a33492b03917 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Mon, 16 May 2022 11:18:30 -0700 Subject: [PATCH] replace fetchViewer call in extension with a verift token call for faster feedback --- .../Share/ShareExtensionScene.swift | 10 ++++---- .../Sources/Models/AuthModels.swift | 14 +++++++++++ .../Services/DataService/DataService.swift | 4 +++ .../DataService/Networking/Networker.swift | 25 +++++++++++++++++++ .../Networking/ServerResource.swift | 3 +++ 5 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 apple/OmnivoreKit/Sources/Models/AuthModels.swift diff --git a/apple/OmnivoreKit/Sources/App/AppExtensions/Share/ShareExtensionScene.swift b/apple/OmnivoreKit/Sources/App/AppExtensions/Share/ShareExtensionScene.swift index acc01f73a..2a4149d3c 100644 --- a/apple/OmnivoreKit/Sources/App/AppExtensions/Share/ShareExtensionScene.swift +++ b/apple/OmnivoreKit/Sources/App/AppExtensions/Share/ShareExtensionScene.swift @@ -79,12 +79,12 @@ final class ShareExtensionViewModel: ObservableObject { } .store(in: &subscriptions) - // Using viewerPublisher to get fast feedback for auth/network errors + // Check connection to get fast feedback for auth/network errors Task { - do { - _ = try await services.dataService.fetchViewer() - } catch { - debugText = "saveArticleError: \(error)" + let hasConnectionAndValidToken = await services.dataService.hasConnectionAndValidToken() + + if !hasConnectionAndValidToken { + debugText = "saveArticleError: No connection or invalid token." status = .failed(error: .unknown(description: "")) } } diff --git a/apple/OmnivoreKit/Sources/Models/AuthModels.swift b/apple/OmnivoreKit/Sources/Models/AuthModels.swift new file mode 100644 index 000000000..d6bb85af6 --- /dev/null +++ b/apple/OmnivoreKit/Sources/Models/AuthModels.swift @@ -0,0 +1,14 @@ +import Foundation + +public struct AuthVerification: Decodable { + public let authStatus: AuthStatus +} + +public enum AuthStatus: String, Decodable { + case authenticated = "AUTHENTICATED" + case unAuthenticated = "NOT_AUTHENTICATED" + + public var isAuthenticated: Bool { + self == .authenticated + } +} diff --git a/apple/OmnivoreKit/Sources/Services/DataService/DataService.swift b/apple/OmnivoreKit/Sources/Services/DataService/DataService.swift index 3528a3dab..6878a40dc 100644 --- a/apple/OmnivoreKit/Sources/Services/DataService/DataService.swift +++ b/apple/OmnivoreKit/Sources/Services/DataService/DataService.swift @@ -55,6 +55,10 @@ public final class DataService: ObservableObject { } } + public func hasConnectionAndValidToken() async -> Bool { + await networker.hasConnectionAndValidToken() + } + private func resetCoreData() { let storeContainer = persistentContainer.persistentStoreCoordinator diff --git a/apple/OmnivoreKit/Sources/Services/DataService/Networking/Networker.swift b/apple/OmnivoreKit/Sources/Services/DataService/Networking/Networker.swift index 7e3320f83..753bfc10c 100644 --- a/apple/OmnivoreKit/Sources/Services/DataService/Networking/Networker.swift +++ b/apple/OmnivoreKit/Sources/Services/DataService/Networking/Networker.swift @@ -20,3 +20,28 @@ public final class Networker { self.urlSession = urlSession } } + +extension Networker { + /// Test if the user has a network connection and a valid auth token + /// - Returns: A `Bool` value + func hasConnectionAndValidToken() async -> Bool { + let urlRequest = URLRequest.create( + baseURL: appEnvironment.serverBaseURL, + urlPath: "/api/auth/verify", + requestMethod: .get, + includeAuthToken: false + ) + + let resource = ServerResource( + urlRequest: urlRequest, + decode: AuthVerification.decode + ) + + do { + let authVerification = try await urlSession.performReq(resource: resource) + return authVerification.authStatus.isAuthenticated + } catch { + return false + } + } +} diff --git a/apple/OmnivoreKit/Sources/Services/DataService/Networking/ServerResource.swift b/apple/OmnivoreKit/Sources/Services/DataService/Networking/ServerResource.swift index 4357931f9..5bdb206c7 100644 --- a/apple/OmnivoreKit/Sources/Services/DataService/Networking/ServerResource.swift +++ b/apple/OmnivoreKit/Sources/Services/DataService/Networking/ServerResource.swift @@ -33,6 +33,9 @@ extension ServerResponse { } } +/// Empty struct to use when a successful network call does not include any JSON +struct EmptyResponse: Decodable {} + extension URLSession { func performReq( resource: ServerResource