暂无描述

SavedProfilesStore.swift 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. //
  2. // SavedProfilesStore.swift
  3. // App for Indeed
  4. //
  5. import Foundation
  6. struct PersonalInformation: Codable, Equatable {
  7. var fullName: String
  8. var email: String
  9. var phone: String
  10. var jobTitle: String
  11. var address: String
  12. static let empty = PersonalInformation(fullName: "", email: "", phone: "", jobTitle: "", address: "")
  13. }
  14. struct WorkExperiencePayload: Codable, Equatable {
  15. var jobTitle: String
  16. var company: String
  17. var duration: String
  18. var description: String
  19. static let empty = WorkExperiencePayload(jobTitle: "", company: "", duration: "", description: "")
  20. }
  21. struct EducationPayload: Codable, Equatable {
  22. var degree: String
  23. var institution: String
  24. var year: String
  25. static let empty = EducationPayload(degree: "", institution: "", year: "")
  26. }
  27. struct SavedProfile: Codable, Equatable, Identifiable {
  28. var id: UUID
  29. var profileDisplayName: String
  30. var personal: PersonalInformation
  31. var careerSummary: String
  32. var workExperiences: [WorkExperiencePayload]
  33. var educations: [EducationPayload]
  34. var certificates: String
  35. var interests: String
  36. var languages: String
  37. var referral: String
  38. }
  39. enum SavedProfilesStore {
  40. private static let profilesKey = "com.appforindeed.savedProfiles.v1"
  41. private static let legacyPersonalKey = "com.appforindeed.personalInformation.v1"
  42. static func loadAll() -> [SavedProfile] {
  43. migrateLegacyPersonalInformationIfNeeded()
  44. guard let data = UserDefaults.standard.data(forKey: profilesKey) else { return [] }
  45. do {
  46. return try JSONDecoder().decode([SavedProfile].self, from: data)
  47. } catch {
  48. return []
  49. }
  50. }
  51. static func saveAll(_ profiles: [SavedProfile]) {
  52. do {
  53. let data = try JSONEncoder().encode(profiles)
  54. UserDefaults.standard.set(data, forKey: profilesKey)
  55. } catch {
  56. // Best-effort persistence.
  57. }
  58. }
  59. static func upsert(_ profile: SavedProfile) {
  60. var all = loadAll()
  61. if let i = all.firstIndex(where: { $0.id == profile.id }) {
  62. all[i] = profile
  63. } else {
  64. all.append(profile)
  65. }
  66. saveAll(all)
  67. }
  68. static func delete(id: UUID) {
  69. var all = loadAll()
  70. all.removeAll { $0.id == id }
  71. saveAll(all)
  72. }
  73. static func profile(id: UUID) -> SavedProfile? {
  74. loadAll().first { $0.id == id }
  75. }
  76. /// Imports the older single `PersonalInformation` blob into the first saved profile when the new store has never been written.
  77. private static func migrateLegacyPersonalInformationIfNeeded() {
  78. guard UserDefaults.standard.object(forKey: profilesKey) == nil else { return }
  79. guard let data = UserDefaults.standard.data(forKey: legacyPersonalKey) else { return }
  80. guard let personal = try? JSONDecoder().decode(PersonalInformation.self, from: data) else {
  81. UserDefaults.standard.removeObject(forKey: legacyPersonalKey)
  82. return
  83. }
  84. let imported = SavedProfile(
  85. id: UUID(),
  86. profileDisplayName: "My profile",
  87. personal: personal,
  88. careerSummary: "",
  89. workExperiences: [.empty],
  90. educations: [.empty],
  91. certificates: "",
  92. interests: "",
  93. languages: "",
  94. referral: ""
  95. )
  96. saveAll([imported])
  97. UserDefaults.standard.removeObject(forKey: legacyPersonalKey)
  98. }
  99. }