// // CalendarModel.swift // LMS // // Created by Suraj Kumar Mandal on 02/09/22. // let calendarModel = try? newJSONDecoder().decode(CalendarModel.self, from: jsonData) import Foundation // MARK: - CalendarModel class CalendarModel: Codable { var id, scheduleId, userId: Int? var date, startTime, endTime: String? var linkCreated: Bool? var link: String? var batch: Batch? var scheduleTitle, schedulePlace, status, workFlowStatus: String? var eventNo: Int? var notes: JSONNull? var offline: Bool? var batchName: String? var schoolName: String? var interventionName: String? var interventionLevelName: String? var teacherFirstName: String? var teacherLastName: String? var interventionId: Int? var interventionLevelId: Int? var batchId: Int? var schoolId: String? init(id: Int?, scheduleId: Int?, userId: Int?, date: String?, startTime: String?, endTime: String?, linkCreated: Bool?, link: String?, batch: Batch?, scheduleTitle: String?, schedulePlace: String?, status: String?, workFlowStatus: String?, eventNo: Int?, notes: JSONNull?, offline: Bool?, batchName: String?, schoolName: String? ,interventionName: String? ,interventionLevelName: String? ,teacherFirstName: String? ,teacherLastName: String?, interventionId: Int? ,interventionLevelId: Int?, batchId: Int?, schoolId: String?) { self.id = id self.scheduleId = scheduleId self.userId = userId self.date = date self.startTime = startTime self.endTime = endTime self.linkCreated = linkCreated self.link = link self.batch = batch self.scheduleTitle = scheduleTitle self.schedulePlace = schedulePlace self.status = status self.workFlowStatus = workFlowStatus self.eventNo = eventNo self.notes = notes self.offline = offline self.batchName = batchName self.schoolName = schoolName self.interventionName = interventionName self.interventionLevelName = interventionLevelName self.teacherFirstName = teacherFirstName self.teacherLastName = teacherLastName self.interventionId = interventionId self.interventionLevelId = interventionLevelId self.batchId = batchId self.schoolId = schoolId } } // MARK: - Batch class Batch: Codable { var viewBatchRS: ViewBatchRS? var teacher: Teacher? var comments: String? var substituteTeachers: [Teacher]? var status: String? var id: Int? init(viewBatchRS: ViewBatchRS?, teacher: Teacher?, comments: String?, substituteTeachers: [Teacher]?, status: String?, id: Int?) { self.viewBatchRS = viewBatchRS self.teacher = teacher self.comments = comments self.substituteTeachers = substituteTeachers self.status = status self.id = id } } // MARK: - Teacher class Teacher: Codable { var id: Int? var name: String? var middleName: JSONNull? var lastName, username, email, mobile: String? var userType: User? var keycloakUserId: String? var enable: Bool? var intervantions: [Int]? init(id: Int?, name: String?, middleName: JSONNull?, lastName: String?, username: String?, email: String?, mobile: String?, userType: User?, keycloakUserId: String?, enable: Bool?, intervantions: [Int]?) { self.id = id self.name = name self.middleName = middleName self.lastName = lastName self.username = username self.email = email self.mobile = mobile self.userType = userType self.keycloakUserId = keycloakUserId self.enable = enable self.intervantions = intervantions } } // MARK: - UserType class User: Codable { var id: Int? var actor, parentActor, discription, defaultRealmRole: String? var createAccess, deleteAccess, editAccess, viewAccess: String? var appUrl: String? init(id: Int?, actor: String?, parentActor: String?, discription: String?, defaultRealmRole: String?, createAccess: String?, deleteAccess: String?, editAccess: String?, viewAccess: String?, appUrl: String?) { self.id = id self.actor = actor self.parentActor = parentActor self.discription = discription self.defaultRealmRole = defaultRealmRole self.createAccess = createAccess self.deleteAccess = deleteAccess self.editAccess = editAccess self.viewAccess = viewAccess self.appUrl = appUrl } } // MARK: - ViewBatchRS class ViewBatchRS: Codable { var createdBy, createdDate, lastModifiedBy, lastModifiedDate: String? var id: Int? var academicYear, batchName: String? var studentBatch, deleted, active: Bool? var status, comments: String? var interventionDTO: InterventionDTO? var schoolDTO: SchoolDTO? var batachUserDtos: JSONNull? var level: Level? init(createdBy: String?, createdDate: String?, lastModifiedBy: String?, lastModifiedDate: String?, id: Int?, academicYear: String?, batchName: String?, studentBatch: Bool?, deleted: Bool?, active: Bool?, status: String?, comments: String?, interventionDTO: InterventionDTO?, schoolDTO: SchoolDTO?, batachUserDtos: JSONNull?, level: Level?) { self.createdBy = createdBy self.createdDate = createdDate self.lastModifiedBy = lastModifiedBy self.lastModifiedDate = lastModifiedDate self.id = id self.academicYear = academicYear self.batchName = batchName self.studentBatch = studentBatch self.deleted = deleted self.active = active self.status = status self.comments = comments self.interventionDTO = interventionDTO self.schoolDTO = schoolDTO self.batachUserDtos = batachUserDtos self.level = level } } // MARK: - InterventionDTO class InterventionDTO: Codable { var id: Int? var incrementor: JSONNull? var interventionId, interventionName: String? var interventionLevels: [String]? var beneficiaryIds: [Int]? var deleted, active: Bool? var status: String? var interventionSchoolMappings, mappedProgramHeads: JSONNull? init(id: Int?, incrementor: JSONNull?, interventionId: String?, interventionName: String?, interventionLevels: [String]?, beneficiaryIds: [Int]?, deleted: Bool?, active: Bool?, status: String?, interventionSchoolMappings: JSONNull?, mappedProgramHeads: JSONNull?) { self.id = id self.incrementor = incrementor self.interventionId = interventionId self.interventionName = interventionName self.interventionLevels = interventionLevels self.beneficiaryIds = beneficiaryIds self.deleted = deleted self.active = active self.status = status self.interventionSchoolMappings = interventionSchoolMappings self.mappedProgramHeads = mappedProgramHeads } } // MARK: - Level class Level: Codable { var id, interventionTableId: Int? var interventionLevels: String? init(id: Int?, interventionTableId: Int?, interventionLevels: String?) { self.id = id self.interventionTableId = interventionTableId self.interventionLevels = interventionLevels } } // MARK: - SchoolDTO class SchoolDTO: Codable { var schoolId, schoolName, state, city: String? var pincode: Int? var active, deleted: Bool? var status: String? init(schoolId: String?, schoolName: String?, state: String?, city: String?, pincode: Int?, active: Bool?, deleted: Bool?, status: String?) { self.schoolId = schoolId self.schoolName = schoolName self.state = state self.city = city self.pincode = pincode self.active = active self.deleted = deleted self.status = status } } // MARK: - Encode/decode helpers class JSONNull: Codable, Hashable { public static func == (lhs: JSONNull, rhs: JSONNull) -> Bool { return true } public var hashValue: Int { return 0 } public func hash(into hasher: inout Hasher) { // No-op } public init() {} public required init(from decoder: Decoder) throws { let container = try decoder.singleValueContainer() if !container.decodeNil() { throw DecodingError.typeMismatch(JSONNull.self, DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Wrong type for JSONNull")) } } public func encode(to encoder: Encoder) throws { var container = encoder.singleValueContainer() try container.encodeNil() } } class JSONCodingKey: CodingKey { let key: String required init?(intValue: Int) { return nil } required init?(stringValue: String) { key = stringValue } var intValue: Int? { return nil } var stringValue: String { return key } } class JSONAny: Codable { let value: Any static func decodingError(forCodingPath codingPath: [CodingKey]) -> DecodingError { let context = DecodingError.Context(codingPath: codingPath, debugDescription: "Cannot decode JSONAny") return DecodingError.typeMismatch(JSONAny.self, context) } static func encodingError(forValue value: Any, codingPath: [CodingKey]) -> EncodingError { let context = EncodingError.Context(codingPath: codingPath, debugDescription: "Cannot encode JSONAny") return EncodingError.invalidValue(value, context) } static func decode(from container: SingleValueDecodingContainer) throws -> Any { if let value = try? container.decode(Bool.self) { return value } if let value = try? container.decode(Int64.self) { return value } if let value = try? container.decode(Double.self) { return value } if let value = try? container.decode(String.self) { return value } if container.decodeNil() { return JSONNull() } throw decodingError(forCodingPath: container.codingPath) } static func decode(from container: inout UnkeyedDecodingContainer) throws -> Any { if let value = try? container.decode(Bool.self) { return value } if let value = try? container.decode(Int64.self) { return value } if let value = try? container.decode(Double.self) { return value } if let value = try? container.decode(String.self) { return value } if let value = try? container.decodeNil() { if value { return JSONNull() } } if var container = try? container.nestedUnkeyedContainer() { return try decodeArray(from: &container) } if var container = try? container.nestedContainer(keyedBy: JSONCodingKey.self) { return try decodeDictionary(from: &container) } throw decodingError(forCodingPath: container.codingPath) } static func decode(from container: inout KeyedDecodingContainer, forKey key: JSONCodingKey) throws -> Any { if let value = try? container.decode(Bool.self, forKey: key) { return value } if let value = try? container.decode(Int64.self, forKey: key) { return value } if let value = try? container.decode(Double.self, forKey: key) { return value } if let value = try? container.decode(String.self, forKey: key) { return value } if let value = try? container.decodeNil(forKey: key) { if value { return JSONNull() } } if var container = try? container.nestedUnkeyedContainer(forKey: key) { return try decodeArray(from: &container) } if var container = try? container.nestedContainer(keyedBy: JSONCodingKey.self, forKey: key) { return try decodeDictionary(from: &container) } throw decodingError(forCodingPath: container.codingPath) } static func decodeArray(from container: inout UnkeyedDecodingContainer) throws -> [Any] { var arr: [Any] = [] while !container.isAtEnd { let value = try decode(from: &container) arr.append(value) } return arr } static func decodeDictionary(from container: inout KeyedDecodingContainer) throws -> [String: Any] { var dict = [String: Any]() for key in container.allKeys { let value = try decode(from: &container, forKey: key) dict[key.stringValue] = value } return dict } static func encode(to container: inout UnkeyedEncodingContainer, array: [Any]) throws { for value in array { if let value = value as? Bool { try container.encode(value) } else if let value = value as? Int64 { try container.encode(value) } else if let value = value as? Double { try container.encode(value) } else if let value = value as? String { try container.encode(value) } else if value is JSONNull { try container.encodeNil() } else if let value = value as? [Any] { var container = container.nestedUnkeyedContainer() try encode(to: &container, array: value) } else if let value = value as? [String: Any] { var container = container.nestedContainer(keyedBy: JSONCodingKey.self) try encode(to: &container, dictionary: value) } else { throw encodingError(forValue: value, codingPath: container.codingPath) } } } static func encode(to container: inout KeyedEncodingContainer, dictionary: [String: Any]) throws { for (key, value) in dictionary { let key = JSONCodingKey(stringValue: key)! if let value = value as? Bool { try container.encode(value, forKey: key) } else if let value = value as? Int64 { try container.encode(value, forKey: key) } else if let value = value as? Double { try container.encode(value, forKey: key) } else if let value = value as? String { try container.encode(value, forKey: key) } else if value is JSONNull { try container.encodeNil(forKey: key) } else if let value = value as? [Any] { var container = container.nestedUnkeyedContainer(forKey: key) try encode(to: &container, array: value) } else if let value = value as? [String: Any] { var container = container.nestedContainer(keyedBy: JSONCodingKey.self, forKey: key) try encode(to: &container, dictionary: value) } else { throw encodingError(forValue: value, codingPath: container.codingPath) } } } static func encode(to container: inout SingleValueEncodingContainer, value: Any) throws { if let value = value as? Bool { try container.encode(value) } else if let value = value as? Int64 { try container.encode(value) } else if let value = value as? Double { try container.encode(value) } else if let value = value as? String { try container.encode(value) } else if value is JSONNull { try container.encodeNil() } else { throw encodingError(forValue: value, codingPath: container.codingPath) } } public required init(from decoder: Decoder) throws { if var arrayContainer = try? decoder.unkeyedContainer() { self.value = try JSONAny.decodeArray(from: &arrayContainer) } else if var container = try? decoder.container(keyedBy: JSONCodingKey.self) { self.value = try JSONAny.decodeDictionary(from: &container) } else { let container = try decoder.singleValueContainer() self.value = try JSONAny.decode(from: container) } } public func encode(to encoder: Encoder) throws { if let arr = self.value as? [Any] { var container = encoder.unkeyedContainer() try JSONAny.encode(to: &container, array: arr) } else if let dict = self.value as? [String: Any] { var container = encoder.container(keyedBy: JSONCodingKey.self) try JSONAny.encode(to: &container, dictionary: dict) } else { var container = encoder.singleValueContainer() try JSONAny.encode(to: &container, value: self.value) } } }