Last active
August 29, 2015 14:15
-
-
Save jarsen/83df77d6242dd83d5cb2 to your computer and use it in GitHub Desktop.
Database facade in front of realm that translates to and from our immutable structs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
extension RLMRealm { | |
public func write(@noescape transaction: ()->()) { | |
self.beginWriteTransaction() | |
transaction() | |
self.commitWriteTransaction() | |
} | |
} | |
public struct Patient { | |
public let info: ModelInfo | |
public let fullName: String | |
public let firstName: String | |
public let lastName: String | |
public let authToken: String | |
public static func create(info: ModelInfo)(fullName: String)(firstName: String)(lastName: String)(authToken: String) -> Patient { | |
return Patient(info: info, fullName: fullName, firstName: firstName, lastName: lastName, authToken: authToken) | |
} | |
public static func decode(json: JSONObject) -> Result<Patient> { | |
return Patient.create | |
<^> ModelInfo.decode(json) | |
<*> JSON.decodeString(json)(key: "full_name") | |
<*> JSON.decodeString(json)(key: "first_name") | |
<*> JSON.decodeString(json)(key: "last_name") | |
<*> JSON.decodeString(json)(key: "auth_token") | |
} | |
} | |
public struct Database { | |
let realm: RLMRealm | |
init(realm: RLMRealm) { | |
self.realm = realm | |
} | |
internal class Model : RLMObject { | |
dynamic var id: Int = 0 | |
dynamic var createdAt = NSDate() | |
dynamic var updatedAt = NSDate() | |
dynamic var deleted = false | |
init(info: ModelInfo) { | |
id = info.id | |
createdAt = info.createdAt | |
updatedAt = info.updatedAt | |
deleted = info.deleted | |
super.init() | |
} | |
func infoValue() -> ModelInfo { | |
return ModelInfo(id: id, createdAt: createdAt, updatedAt: updatedAt, deleted: deleted) | |
} | |
override class func primaryKey() -> String { | |
return "id" | |
} | |
} | |
} | |
extension Database { | |
private class Patient : Database.Model { | |
dynamic var fullName = "" | |
dynamic var firstName = "" | |
dynamic var lastName = "" | |
dynamic var authToken = "" | |
init(patient: Orcinus.Patient) { | |
fullName = patient.fullName | |
lastName = patient.firstName | |
lastName = patient.lastName | |
authToken = patient.authToken | |
super.init(info: patient.info) | |
} | |
func valueType() -> Orcinus.Patient { | |
let info = infoValue() | |
return Orcinus.Patient(info: info, fullName: fullName, firstName: firstName, lastName: lastName, authToken: authToken) | |
} | |
} | |
public func save(patient: Orcinus.Patient) { | |
let dbPatient = Database.Patient(patient: patient) | |
realm.write { | |
realm.addObject(dbPatient) | |
} | |
} | |
public func save(patients: [Orcinus.Patient]) { | |
let dbPatients = map(patients) { Database.Patient(patient: $0) } | |
realm.write { | |
realm.addObjects(dbPatients) | |
} | |
} | |
public func fetchAllPatients() -> [Orcinus.Patient] { | |
let results = Database.Patient.allObjects() | |
return map(results) { ($0 as! Database.Patient).valueType() } | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment