Skip to content

Instantly share code, notes, and snippets.

@jarsen
Last active August 29, 2015 14:15
Show Gist options
  • Save jarsen/83df77d6242dd83d5cb2 to your computer and use it in GitHub Desktop.
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
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