Showing
2 changed files
with
281 additions
and
0 deletions
| ... | @@ -39,6 +39,23 @@ public class ProfileModel: NSObject { | ... | @@ -39,6 +39,23 @@ public class ProfileModel: NSObject { |
| 39 | private var uuid: String? | 39 | private var uuid: String? |
| 40 | private var verified: Bool? | 40 | private var verified: Bool? |
| 41 | 41 | ||
| 42 | + // NEW: Missing API Response Fields | ||
| 43 | + private var user_segments: [String]? | ||
| 44 | + private var eligibility_type: String? | ||
| 45 | + private var favorite_couponsets: [String]? | ||
| 46 | + private var user_id: String? | ||
| 47 | + private var is_eligible: Bool? | ||
| 48 | + private var questionnaire: [String: Any]? | ||
| 49 | + private var user_answers: [QuestionnaireAnswerModel]? | ||
| 50 | + private var questionnaire_answers: [QuestionnaireAnswerModel]? | ||
| 51 | + | ||
| 52 | + // Enhanced profile_metadata fields | ||
| 53 | + private var username: String? | ||
| 54 | + private var contract_accounts: [String]? | ||
| 55 | + private var master_id: String? | ||
| 56 | + private var questionnaire_v2: [String: Any]? | ||
| 57 | + private var answered_count: Int? | ||
| 58 | + | ||
| 42 | // optin | 59 | // optin |
| 43 | private var optin_newsletter: Bool? | 60 | private var optin_newsletter: Bool? |
| 44 | private var optin_sms: Bool? | 61 | private var optin_sms: Bool? |
| ... | @@ -83,6 +100,23 @@ public class ProfileModel: NSObject { | ... | @@ -83,6 +100,23 @@ public class ProfileModel: NSObject { |
| 83 | self.uuid = "" | 100 | self.uuid = "" |
| 84 | self.verified = false | 101 | self.verified = false |
| 85 | 102 | ||
| 103 | + // NEW: Missing API Response Fields | ||
| 104 | + self.user_segments = [] | ||
| 105 | + self.eligibility_type = "" | ||
| 106 | + self.favorite_couponsets = [] | ||
| 107 | + self.user_id = "" | ||
| 108 | + self.is_eligible = false | ||
| 109 | + self.questionnaire = [String: Any]() | ||
| 110 | + self.user_answers = [] | ||
| 111 | + self.questionnaire_answers = [] | ||
| 112 | + | ||
| 113 | + // Enhanced profile_metadata fields | ||
| 114 | + self.username = "" | ||
| 115 | + self.contract_accounts = [] | ||
| 116 | + self.master_id = "" | ||
| 117 | + self.questionnaire_v2 = [String: Any]() | ||
| 118 | + self.answered_count = 0 | ||
| 119 | + | ||
| 86 | // optin | 120 | // optin |
| 87 | self.optin_newsletter = false | 121 | self.optin_newsletter = false |
| 88 | self.optin_sms = false | 122 | self.optin_sms = false |
| ... | @@ -126,6 +160,28 @@ public class ProfileModel: NSObject { | ... | @@ -126,6 +160,28 @@ public class ProfileModel: NSObject { |
| 126 | self.uuid = dictionary["uuid"] as? String? ?? "" | 160 | self.uuid = dictionary["uuid"] as? String? ?? "" |
| 127 | self.verified = dictionary["verified"] as? Bool? ?? false | 161 | self.verified = dictionary["verified"] as? Bool? ?? false |
| 128 | 162 | ||
| 163 | + // NEW: Missing API Response Fields | ||
| 164 | + self.user_segments = dictionary["user_segments"] as? [String] ?? [] | ||
| 165 | + self.eligibility_type = dictionary["eligibility_type"] as? String ?? "" | ||
| 166 | + self.favorite_couponsets = dictionary["favorite_couponsets"] as? [String] ?? [] | ||
| 167 | + self.user_id = dictionary["user_id"] as? String ?? "" | ||
| 168 | + self.is_eligible = dictionary["is_eligible"] as? Bool ?? false | ||
| 169 | + self.questionnaire = dictionary["questionnaire"] as? [String: Any] ?? [String: Any]() | ||
| 170 | + | ||
| 171 | + // Parse user_answers array | ||
| 172 | + if let userAnswersArray = dictionary["user_answers"] as? [[String: Any]] { | ||
| 173 | + self.user_answers = userAnswersArray.map { QuestionnaireAnswerModel(dictionary: $0) } | ||
| 174 | + } else { | ||
| 175 | + self.user_answers = [] | ||
| 176 | + } | ||
| 177 | + | ||
| 178 | + // Parse questionnaire_answers array | ||
| 179 | + if let questionnaireAnswersArray = dictionary["questionnaire_answers"] as? [[String: Any]] { | ||
| 180 | + self.questionnaire_answers = questionnaireAnswersArray.map { QuestionnaireAnswerModel(dictionary: $0) } | ||
| 181 | + } else { | ||
| 182 | + self.questionnaire_answers = [] | ||
| 183 | + } | ||
| 184 | + | ||
| 129 | // optin | 185 | // optin |
| 130 | let optin = dictionary["optin"] as? [String: Any]? ?? ["":""] | 186 | let optin = dictionary["optin"] as? [String: Any]? ?? ["":""] |
| 131 | self.optin_newsletter = optin?["newsletter"] as? Bool? ?? false | 187 | self.optin_newsletter = optin?["newsletter"] as? Bool? ?? false |
| ... | @@ -149,12 +205,26 @@ public class ProfileModel: NSObject { | ... | @@ -149,12 +205,26 @@ public class ProfileModel: NSObject { |
| 149 | self.msisdnList = (tempMsisdnList ?? []).filter { $0 != "" } | 205 | self.msisdnList = (tempMsisdnList ?? []).filter { $0 != "" } |
| 150 | self.answered = profile_metadata_parsed["answered"] as? Bool? ?? false | 206 | self.answered = profile_metadata_parsed["answered"] as? Bool? ?? false |
| 151 | self.nonTelco = profile_metadata_parsed["nonTelco"] as? Bool? ?? false | 207 | self.nonTelco = profile_metadata_parsed["nonTelco"] as? Bool? ?? false |
| 208 | + | ||
| 209 | + // Enhanced profile_metadata fields | ||
| 210 | + self.username = profile_metadata_parsed["username"] as? String? ?? "" | ||
| 211 | + self.contract_accounts = profile_metadata_parsed["contract_accounts"] as? [String] ?? [] | ||
| 212 | + self.master_id = profile_metadata_parsed["master_id"] as? String? ?? "" | ||
| 213 | + self.questionnaire_v2 = profile_metadata_parsed["questionnaire_v2"] as? [String: Any] ?? [String: Any]() | ||
| 214 | + self.answered_count = profile_metadata_parsed["answered_count"] as? Int? ?? 0 | ||
| 152 | } else { | 215 | } else { |
| 153 | self.profile_metadata = [String: Any]() | 216 | self.profile_metadata = [String: Any]() |
| 154 | self.badge = "" | 217 | self.badge = "" |
| 155 | self.msisdnList = [] | 218 | self.msisdnList = [] |
| 156 | self.answered = false | 219 | self.answered = false |
| 157 | self.nonTelco = false | 220 | self.nonTelco = false |
| 221 | + | ||
| 222 | + // Enhanced profile_metadata fields defaults | ||
| 223 | + self.username = "" | ||
| 224 | + self.contract_accounts = [] | ||
| 225 | + self.master_id = "" | ||
| 226 | + self.questionnaire_v2 = [String: Any]() | ||
| 227 | + self.answered_count = 0 | ||
| 158 | print("bad json") | 228 | print("bad json") |
| 159 | } | 229 | } |
| 160 | } catch let error as NSError { | 230 | } catch let error as NSError { |
| ... | @@ -163,6 +233,13 @@ public class ProfileModel: NSObject { | ... | @@ -163,6 +233,13 @@ public class ProfileModel: NSObject { |
| 163 | self.msisdnList = [] | 233 | self.msisdnList = [] |
| 164 | self.answered = false | 234 | self.answered = false |
| 165 | self.nonTelco = false | 235 | self.nonTelco = false |
| 236 | + | ||
| 237 | + // Enhanced profile_metadata fields defaults | ||
| 238 | + self.username = "" | ||
| 239 | + self.contract_accounts = [] | ||
| 240 | + self.master_id = "" | ||
| 241 | + self.questionnaire_v2 = [String: Any]() | ||
| 242 | + self.answered_count = 0 | ||
| 166 | print(error) | 243 | print(error) |
| 167 | } | 244 | } |
| 168 | 245 | ||
| ... | @@ -172,6 +249,13 @@ public class ProfileModel: NSObject { | ... | @@ -172,6 +249,13 @@ public class ProfileModel: NSObject { |
| 172 | self.msisdnList = [] | 249 | self.msisdnList = [] |
| 173 | self.answered = false | 250 | self.answered = false |
| 174 | self.nonTelco = false | 251 | self.nonTelco = false |
| 252 | + | ||
| 253 | + // Enhanced profile_metadata fields defaults | ||
| 254 | + self.username = "" | ||
| 255 | + self.contract_accounts = [] | ||
| 256 | + self.master_id = "" | ||
| 257 | + self.questionnaire_v2 = [String: Any]() | ||
| 258 | + self.answered_count = 0 | ||
| 175 | } | 259 | } |
| 176 | 260 | ||
| 177 | } else { | 261 | } else { |
| ... | @@ -180,6 +264,13 @@ public class ProfileModel: NSObject { | ... | @@ -180,6 +264,13 @@ public class ProfileModel: NSObject { |
| 180 | self.msisdnList = [] | 264 | self.msisdnList = [] |
| 181 | self.answered = false | 265 | self.answered = false |
| 182 | self.nonTelco = false | 266 | self.nonTelco = false |
| 267 | + | ||
| 268 | + // Enhanced profile_metadata fields defaults | ||
| 269 | + self.username = "" | ||
| 270 | + self.contract_accounts = [] | ||
| 271 | + self.master_id = "" | ||
| 272 | + self.questionnaire_v2 = [String: Any]() | ||
| 273 | + self.answered_count = 0 | ||
| 183 | } | 274 | } |
| 184 | } | 275 | } |
| 185 | 276 | ||
| ... | @@ -364,6 +455,73 @@ public class ProfileModel: NSObject { | ... | @@ -364,6 +455,73 @@ public class ProfileModel: NSObject { |
| 364 | set(newValue) { self.nonTelco = newValue } | 455 | set(newValue) { self.nonTelco = newValue } |
| 365 | } | 456 | } |
| 366 | 457 | ||
| 458 | + // MARK: - NEW Public Accessors for Missing API Response Fields | ||
| 459 | + public var _user_segments: [String] { | ||
| 460 | + get { return self.user_segments ?? [] } | ||
| 461 | + set(newValue) { self.user_segments = newValue } | ||
| 462 | + } | ||
| 463 | + | ||
| 464 | + public var _eligibility_type: String { | ||
| 465 | + get { return self.eligibility_type ?? "" } | ||
| 466 | + set(newValue) { self.eligibility_type = newValue } | ||
| 467 | + } | ||
| 468 | + | ||
| 469 | + public var _favorite_couponsets: [String] { | ||
| 470 | + get { return self.favorite_couponsets ?? [] } | ||
| 471 | + set(newValue) { self.favorite_couponsets = newValue } | ||
| 472 | + } | ||
| 473 | + | ||
| 474 | + public var _user_id: String { | ||
| 475 | + get { return self.user_id ?? "" } | ||
| 476 | + set(newValue) { self.user_id = newValue } | ||
| 477 | + } | ||
| 478 | + | ||
| 479 | + public var _is_eligible: Bool { | ||
| 480 | + get { return self.is_eligible ?? false } | ||
| 481 | + set(newValue) { self.is_eligible = newValue } | ||
| 482 | + } | ||
| 483 | + | ||
| 484 | + public var _questionnaire: [String: Any] { | ||
| 485 | + get { return self.questionnaire ?? [String: Any]() } | ||
| 486 | + set(newValue) { self.questionnaire = newValue } | ||
| 487 | + } | ||
| 488 | + | ||
| 489 | + public var _user_answers: [QuestionnaireAnswerModel] { | ||
| 490 | + get { return self.user_answers ?? [] } | ||
| 491 | + set(newValue) { self.user_answers = newValue } | ||
| 492 | + } | ||
| 493 | + | ||
| 494 | + public var _questionnaire_answers: [QuestionnaireAnswerModel] { | ||
| 495 | + get { return self.questionnaire_answers ?? [] } | ||
| 496 | + set(newValue) { self.questionnaire_answers = newValue } | ||
| 497 | + } | ||
| 498 | + | ||
| 499 | + // MARK: - Enhanced profile_metadata Public Accessors | ||
| 500 | + public var _username: String { | ||
| 501 | + get { return self.username ?? "" } | ||
| 502 | + set(newValue) { self.username = newValue } | ||
| 503 | + } | ||
| 504 | + | ||
| 505 | + public var _contract_accounts: [String] { | ||
| 506 | + get { return self.contract_accounts ?? [] } | ||
| 507 | + set(newValue) { self.contract_accounts = newValue } | ||
| 508 | + } | ||
| 509 | + | ||
| 510 | + public var _master_id: String { | ||
| 511 | + get { return self.master_id ?? "" } | ||
| 512 | + set(newValue) { self.master_id = newValue } | ||
| 513 | + } | ||
| 514 | + | ||
| 515 | + public var _questionnaire_v2: [String: Any] { | ||
| 516 | + get { return self.questionnaire_v2 ?? [String: Any]() } | ||
| 517 | + set(newValue) { self.questionnaire_v2 = newValue } | ||
| 518 | + } | ||
| 519 | + | ||
| 520 | + public var _answered_count: Int { | ||
| 521 | + get { return self.answered_count ?? 0 } | ||
| 522 | + set(newValue) { self.answered_count = newValue } | ||
| 523 | + } | ||
| 524 | + | ||
| 367 | // MARK: - Computed Properties | 525 | // MARK: - Computed Properties |
| 368 | public var fullName: String { | 526 | public var fullName: String { |
| 369 | let first = firstname ?? "" | 527 | let first = firstname ?? "" | ... | ... |
| 1 | +// | ||
| 2 | +// QuestionnaireAnswerModel.swift | ||
| 3 | +// SwiftWarplyFramework | ||
| 4 | +// | ||
| 5 | +// Created by Warply on 04/09/2025. | ||
| 6 | +// | ||
| 7 | + | ||
| 8 | +import Foundation | ||
| 9 | + | ||
| 10 | +@objc public class QuestionnaireAnswerModel: NSObject { | ||
| 11 | + | ||
| 12 | + // MARK: - Private Properties | ||
| 13 | + private var _question_id: String? | ||
| 14 | + private var _question_text: String? | ||
| 15 | + private var _answer: Any? // Can be String or [String] | ||
| 16 | + private var _answer_id: String? | ||
| 17 | + private var _answer_text: String? | ||
| 18 | + | ||
| 19 | + // MARK: - Public Accessors | ||
| 20 | + @objc public var question_id: String { | ||
| 21 | + get { return _question_id ?? "" } | ||
| 22 | + set { _question_id = newValue } | ||
| 23 | + } | ||
| 24 | + | ||
| 25 | + @objc public var question_text: String { | ||
| 26 | + get { return _question_text ?? "" } | ||
| 27 | + set { _question_text = newValue } | ||
| 28 | + } | ||
| 29 | + | ||
| 30 | + @objc public var answer_id: String { | ||
| 31 | + get { return _answer_id ?? "" } | ||
| 32 | + set { _answer_id = newValue } | ||
| 33 | + } | ||
| 34 | + | ||
| 35 | + @objc public var answer_text: String { | ||
| 36 | + get { return _answer_text ?? "" } | ||
| 37 | + set { _answer_text = newValue } | ||
| 38 | + } | ||
| 39 | + | ||
| 40 | + // MARK: - Answer Handling (Mixed Types) | ||
| 41 | + @objc public var answerAsString: String { | ||
| 42 | + if let stringAnswer = _answer as? String { | ||
| 43 | + return stringAnswer | ||
| 44 | + } else if let arrayAnswer = _answer as? [String] { | ||
| 45 | + return arrayAnswer.joined(separator: ", ") | ||
| 46 | + } | ||
| 47 | + return "" | ||
| 48 | + } | ||
| 49 | + | ||
| 50 | + @objc public var answerAsArray: [String] { | ||
| 51 | + if let arrayAnswer = _answer as? [String] { | ||
| 52 | + return arrayAnswer | ||
| 53 | + } else if let stringAnswer = _answer as? String { | ||
| 54 | + return [stringAnswer] | ||
| 55 | + } | ||
| 56 | + return [] | ||
| 57 | + } | ||
| 58 | + | ||
| 59 | + @objc public var rawAnswer: Any? { | ||
| 60 | + return _answer | ||
| 61 | + } | ||
| 62 | + | ||
| 63 | + // MARK: - Initializers | ||
| 64 | + @objc public override init() { | ||
| 65 | + super.init() | ||
| 66 | + } | ||
| 67 | + | ||
| 68 | + @objc public init(dictionary: [String: Any]) { | ||
| 69 | + super.init() | ||
| 70 | + | ||
| 71 | + if let questionId = dictionary["question_id"] as? String { | ||
| 72 | + self._question_id = questionId | ||
| 73 | + } | ||
| 74 | + | ||
| 75 | + if let questionText = dictionary["question_text"] as? String { | ||
| 76 | + self._question_text = questionText | ||
| 77 | + } | ||
| 78 | + | ||
| 79 | + if let answerId = dictionary["answer_id"] as? String { | ||
| 80 | + self._answer_id = answerId | ||
| 81 | + } | ||
| 82 | + | ||
| 83 | + if let answerText = dictionary["answer_text"] as? String { | ||
| 84 | + self._answer_text = answerText | ||
| 85 | + } | ||
| 86 | + | ||
| 87 | + // Handle mixed answer types (String or [String]) | ||
| 88 | + if let answer = dictionary["answer"] { | ||
| 89 | + self._answer = answer | ||
| 90 | + } | ||
| 91 | + } | ||
| 92 | + | ||
| 93 | + // MARK: - Utility Methods | ||
| 94 | + @objc public func toDictionary() -> [String: Any] { | ||
| 95 | + var dict: [String: Any] = [:] | ||
| 96 | + | ||
| 97 | + if let questionId = _question_id { | ||
| 98 | + dict["question_id"] = questionId | ||
| 99 | + } | ||
| 100 | + | ||
| 101 | + if let questionText = _question_text { | ||
| 102 | + dict["question_text"] = questionText | ||
| 103 | + } | ||
| 104 | + | ||
| 105 | + if let answerId = _answer_id { | ||
| 106 | + dict["answer_id"] = answerId | ||
| 107 | + } | ||
| 108 | + | ||
| 109 | + if let answerText = _answer_text { | ||
| 110 | + dict["answer_text"] = answerText | ||
| 111 | + } | ||
| 112 | + | ||
| 113 | + if let answer = _answer { | ||
| 114 | + dict["answer"] = answer | ||
| 115 | + } | ||
| 116 | + | ||
| 117 | + return dict | ||
| 118 | + } | ||
| 119 | + | ||
| 120 | + @objc public var description: String { | ||
| 121 | + return "QuestionnaireAnswerModel(question_id: \(question_id), question_text: \(question_text), answer: \(answerAsString), answer_id: \(answer_id), answer_text: \(answer_text))" | ||
| 122 | + } | ||
| 123 | +} |
-
Please register or login to post a comment