Skip to content
This repository has been archived by the owner on Apr 27, 2024. It is now read-only.

Commit

Permalink
Implemented caching mechanism for ownJobs, upcomingJobs and ownApplic…
Browse files Browse the repository at this point in the history
…ations
  • Loading branch information
carlobortolan committed Sep 9, 2023
1 parent 7ca9c54 commit 7d235f1
Show file tree
Hide file tree
Showing 6 changed files with 104 additions and 13 deletions.
9 changes: 9 additions & 0 deletions mobile/Controllers/ApplicationManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,12 @@ class ApplicationManager: ObservableObject {
self.errorHandlingManager = errorHandlingManager
self._ownApplications = Published(wrappedValue: [])

if let cachedOwnApplicationsJSON = UserDefaults.standard.string(forKey: "cachedOwnApplicationsJSON"),
let cachedOwnApplications = ApplicationsResponse.fromJSON(cachedOwnApplicationsJSON) {
self.ownApplications = cachedOwnApplications
} else {
self.ownApplications = []
}
self.loadOwnApplications(iteration: 0) {}
}

Expand All @@ -37,6 +43,9 @@ class ApplicationManager: ObservableObject {
DispatchQueue.main.async {
print("case .success")
self.ownApplications = applicationsResponse.applications
if let ownApplications = applicationsResponse.toJSON() {
UserDefaults.standard.set(ownApplications, forKey: "cachedOwnApplicationsJSON")
}
self.errorHandlingManager.errorMessage = nil
completion() // Call the completion closure when loading is complete
}
Expand Down
7 changes: 6 additions & 1 deletion mobile/Controllers/AuthenticationManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ class AuthenticationManager: ObservableObject {
self.current = cachedUser
} else {
self.current = User()
}
}
}

private func saveRefreshToken(refreshToken: String?) {
Expand Down Expand Up @@ -118,6 +118,11 @@ class AuthenticationManager: ObservableObject {
self.current.email = ""
self.current.firstName = ""
self.current.lastName = ""
self.errorHandlingManager.errorMessage = nil
UserDefaults.standard.set(nil, forKey: "cachedUserJSON")
UserDefaults.standard.set(nil, forKey: "cachedOwnJobsJSON")
UserDefaults.standard.set(nil, forKey: "cachedUpcomingJobsJSON")
UserDefaults.standard.set(nil, forKey: "cachedOwnApplicationsJSON")
print("Successfully signed out")
}
}
Expand Down
28 changes: 25 additions & 3 deletions mobile/Controllers/JobManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,26 @@ class JobManager: ObservableObject {
errorHandlingManager: ErrorHandlingManager) {
self.authenticationManager = authenticationManager
self.errorHandlingManager = errorHandlingManager
self._ownJobs = Published(wrappedValue: [])
self._upcomingJobs = Published(wrappedValue: JobModel.generateRandomJobsResponse().jobs)
self._nearbyJobs = Published(wrappedValue: [])


if let cachedOwnJobsJSON = UserDefaults.standard.string(forKey: "cachedOwnJobsJSON"),
let cachedOwnJobs = JobsResponse.fromJSON(cachedOwnJobsJSON) {
print("cachedOwnJobsJSON: TRUE")
self._ownJobs = Published(wrappedValue: cachedOwnJobs)
} else {
print("cachedOwnJobsJSON: FALSE")
self._ownJobs = Published(wrappedValue: [])
}

if let cachedUpcomingJobsJSON = UserDefaults.standard.string(forKey: "cachedUpcomingJobsJSON"),
let cachedUpcomingJobs = JobsResponse.fromJSON(cachedUpcomingJobsJSON) {
print("cachedUpcomingJobsJSON: TRUE")
self._upcomingJobs = Published(wrappedValue: cachedUpcomingJobs)
} else {
print("cachedUpcomingJobsJSON: FALSE")
self._upcomingJobs = Published(wrappedValue: JobModel.generateRandomJobsResponse().jobs)
}
self.loadUpcomingJobs(iteration: 0) {}
self.loadOwnJobs(iteration: 0) {}
self.loadUpcomingJobs(iteration: 0) {}
}
Expand All @@ -36,6 +52,9 @@ class JobManager: ObservableObject {
DispatchQueue.main.async {
print("case .success")
self.ownJobs = jobsResponse.jobs
if let ownJobsJSON = jobsResponse.toJSON() {
UserDefaults.standard.set(ownJobsJSON, forKey: "cachedOwnJobsJSON")
}
self.errorHandlingManager.errorMessage = nil
completion()
}
Expand Down Expand Up @@ -80,6 +99,9 @@ class JobManager: ObservableObject {
DispatchQueue.main.async {
print("case .success")
self.upcomingJobs = jobsResponse.jobs
if let upcomingJobs = jobsResponse.toJSON() {
UserDefaults.standard.set(upcomingJobs, forKey: "cachedUpcomingJobsJSON")
}
self.errorHandlingManager.errorMessage = nil
completion()
}
Expand Down
18 changes: 18 additions & 0 deletions mobile/Models/ApplicationModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,24 @@ import Foundation

struct ApplicationsResponse: Codable {
let applications: [Application]

func toJSON() -> String? {
let encoder = JSONEncoder()
if let data = try? encoder.encode(self) {
return String(data: data, encoding: .utf8)
}
return nil
}

static func fromJSON(_ jsonString: String) -> [Application]? {
let decoder = JSONDecoder()
if let data = jsonString.data(using: .utf8) {
if let applicationsResponse = try? decoder.decode(ApplicationsResponse.self, from: data) {
return applicationsResponse.applications
}
}
return nil
}
}

struct ApplicationResponse: Codable {
Expand Down
38 changes: 38 additions & 0 deletions mobile/Models/JobModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,24 @@ import Foundation

struct JobsResponse: Codable {
let jobs: [Job]

func toJSON() -> String? {
let encoder = JSONEncoder()
if let data = try? encoder.encode(self) {
return String(data: data, encoding: .utf8)
}
return nil
}

static func fromJSON(_ jsonString: String) -> [Job]? {
let decoder = JSONDecoder()
if let data = jsonString.data(using: .utf8) {
if let jobsResponse = try? decoder.decode(JobsResponse.self, from: data) {
return jobsResponse.jobs
}
}
return nil
}
}

struct FeedResponse: Codable {
Expand Down Expand Up @@ -97,6 +115,24 @@ struct Job: Codable, Hashable, Identifiable {
case allowedCvFormat = "allowed_cv_format"
case imageUrl = "image_url"
}

func toJSON() -> String? {
let encoder = JSONEncoder()
if let data = try? encoder.encode(self) {
return String(data: data, encoding: .utf8)
}
return nil
}

static func fromJSON(_ jsonString: String) -> Job? {
let decoder = JSONDecoder()
if let data = jsonString.data(using: .utf8) {
if let job = try? decoder.decode(Job.self, from: data) {
return job
}
}
return nil
}
}

struct JobDescription: Codable {
Expand Down Expand Up @@ -168,6 +204,7 @@ class JobModel {
return randomJob
}


static func generateRandomJobsResponse() -> JobsResponse {
let randomJobs = (1...5).map { _ in generateRandomJob() }
return JobsResponse(jobs: randomJobs)
Expand All @@ -178,3 +215,4 @@ class JobModel {
return FeedResponse(feed: randomJobs)
}
}

17 changes: 8 additions & 9 deletions mobile/Models/UserModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -392,17 +392,16 @@ struct User: Codable {
}

static func fromJSON(_ jsonString: String) -> User? {
print("User - FROM JSON: \(jsonString)")
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(DateFormattedISO8601.dateFormatter)

if let data = jsonString.data(using: .utf8) {
if let user = try? decoder.decode(User.self, from: data) {
return user
print("User - FROM JSON: \(jsonString)")
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(DateFormattedISO8601.dateFormatter)
if let data = jsonString.data(using: .utf8) {
if let user = try? decoder.decode(User.self, from: data) {
return user
}
}
return nil
}
return nil
}

static func generateRandomUser() -> User {
let userId = Int.random(in: 1...1000)
Expand Down

0 comments on commit 7d235f1

Please sign in to comment.