Cerco di semplificare il processo di convalida per l'elaborazione delle risposte per le richieste HTTP in Spray (utilizzo Slick per l'accesso al database). Attualmente, controllo in una query se dovrei andare oltre alla seguente query o no (errore di ritorno). Questo finisce con la corrispondenza del modello nidificato. Ogni caso di convalida può restituire un errore diverso, quindi non posso usare nessun flatMap.Scala: evitare la combinazione di motivi nidificati troppo complessi
class LocationDao {
val db = DbProvider.db
// Database tables
val devices = Devices.devices
val locations = Locations.locations
val programs = Programs.programs
val accessTokens = AccessTokens.accessTokens
def loginDevice(deviceSerialNumber: String, login: String, password: String): Either[Error, LocationResponse] = {
try {
db withSession { implicit session =>
val deviceRowOption = devices.filter(d => d.serialNumber === deviceSerialNumber).map(d => (d.id, d.currentLocationId.?, d.serialNumber.?)).firstOption
deviceRowOption match {
case Some(deviceRow) => {
val locationRowOption = locations.filter(l => l.id === deviceRow._2.getOrElse(0L) && l.login === login && l.password === password).firstOption
locationRowOption match {
case Some(locationRow) => {
val programRowOption = programs.filter(p => p.id === locationRow.programId).firstOption
programRowOption match {
case Some(programRow) => {
val program = Program(programRow.name, programRow.logo, programRow.moneyLevel, programRow.pointsForLevel,
programRow.description, programRow.rules, programRow.dailyCustomerScansLimit)
val locationData = LocationData(program)
val locationResponse = LocationResponse("access_token", System.currentTimeMillis(), locationData)
Right(locationResponse)
}
case None => Left(ProgramNotExistError)
}
}
case None => Left(IncorrectLoginOrPasswordError)
}
}
case None => Left(DeviceNotExistError)
}
}
} catch {
case ex: SQLException =>
Left(DatabaseError)
}
}
}
Qual è un buon modo per semplificare questo? Forse c'è altro approccio ..
L'esempio del codice è troppo specifico per quello che stai facendo, cerca di essere più generico. Ma per la tua domanda se cambi i tuoi metodi xxxRowOption per restituire 'O 'sarai in grado di usarlo per la comprensione. – Maxim
Usa una comprensione. –
Ho rifattorizzato questo codice con la comprensione preliminare. Grazie. – piobab