Skip to content

Commit

Permalink
feat: 🏗️ extract common data logic (#21)
Browse files Browse the repository at this point in the history
create ComicLocalDataSource & ComicRemoteDataSource polymorphic on T
refactor ComicRepository to use ComicLocalDataSource & ComicRemoteDataSource and polymorphic on T
create specific datasources & repository for Suggestion
create specific datasources & repository for Search

reorganise packages to reflect data common feature.

closes #15
  • Loading branch information
ffgiraldez committed May 6, 2018
1 parent e4c9b4e commit 3d3bdf0
Show file tree
Hide file tree
Showing 23 changed files with 413 additions and 118 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,217 @@
{
"formatVersion": 1,
"database": {
"version": 1,
"identityHash": "843b5908f7967726e53a210136b5cda2",
"entities": [
{
"tableName": "queries",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`query_identifier` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `search_term` TEXT NOT NULL)",
"fields": [
{
"fieldPath": "queryId",
"columnName": "query_identifier",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "searchTerm",
"columnName": "search_term",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"query_identifier"
],
"autoGenerate": true
},
"indices": [
{
"name": "idx_query_identifier",
"unique": false,
"columnNames": [
"query_identifier"
],
"createSql": "CREATE INDEX `idx_query_identifier` ON `${TABLE_NAME}` (`query_identifier`)"
},
{
"name": "idx_query_term",
"unique": false,
"columnNames": [
"search_term"
],
"createSql": "CREATE INDEX `idx_query_term` ON `${TABLE_NAME}` (`search_term`)"
}
],
"foreignKeys": []
},
{
"tableName": "suggestions",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`suggestionId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `query_id` INTEGER NOT NULL, `title` TEXT NOT NULL, FOREIGN KEY(`query_id`) REFERENCES `queries`(`query_identifier`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "suggestionId",
"columnName": "suggestionId",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "queryId",
"columnName": "query_id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "title",
"columnName": "title",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"suggestionId"
],
"autoGenerate": true
},
"indices": [
{
"name": "idx_suggestion_id",
"unique": false,
"columnNames": [
"query_id"
],
"createSql": "CREATE INDEX `idx_suggestion_id` ON `${TABLE_NAME}` (`query_id`)"
}
],
"foreignKeys": [
{
"table": "queries",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"query_id"
],
"referencedColumns": [
"query_identifier"
]
}
]
},
{
"tableName": "search",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`search_identifier` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `search_term` TEXT NOT NULL)",
"fields": [
{
"fieldPath": "queryId",
"columnName": "search_identifier",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "searchTerm",
"columnName": "search_term",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"search_identifier"
],
"autoGenerate": true
},
"indices": [
{
"name": "idx_search_identifier",
"unique": false,
"columnNames": [
"search_identifier"
],
"createSql": "CREATE INDEX `idx_search_identifier` ON `${TABLE_NAME}` (`search_identifier`)"
},
{
"name": "idx_search_term",
"unique": false,
"columnNames": [
"search_term"
],
"createSql": "CREATE INDEX `idx_search_term` ON `${TABLE_NAME}` (`search_term`)"
}
],
"foreignKeys": []
},
{
"tableName": "volumes",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`suggestionId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `search_id` INTEGER NOT NULL, `title` TEXT NOT NULL, `author` TEXT NOT NULL, `url` TEXT NOT NULL, FOREIGN KEY(`search_id`) REFERENCES `search`(`search_identifier`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "suggestionId",
"columnName": "suggestionId",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "queryId",
"columnName": "search_id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "title",
"columnName": "title",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "author",
"columnName": "author",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "url",
"columnName": "url",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"suggestionId"
],
"autoGenerate": true
},
"indices": [
{
"name": "idx_search_id",
"unique": false,
"columnNames": [
"search_id"
],
"createSql": "CREATE INDEX `idx_search_id` ON `${TABLE_NAME}` (`search_id`)"
}
],
"foreignKeys": [
{
"table": "search",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"search_id"
],
"referencedColumns": [
"search_identifier"
]
}
]
}
],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"843b5908f7967726e53a210136b5cda2\")"
]
}
}

This file was deleted.

8 changes: 0 additions & 8 deletions app/src/main/java/es/ffgiraldez/comicsearch/comics/Volume.kt

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package es.ffgiraldez.comicsearch.comics.data

import arrow.core.Option
import es.ffgiraldez.comicsearch.comics.domain.Query
import io.reactivex.Completable
import io.reactivex.Flowable
import io.reactivex.Single

interface ComicLocalDataSource<T> {
fun findQueryByTerm(searchTerm: String): Flowable<Option<Query>>
fun findByQuery(query: Query): Flowable<List<T>>
fun insert(query: String, titles: List<T>): Completable
}

interface ComicRemoteDataSource<T> {
fun findByTerm(searchTerm: String): Single<List<T>>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package es.ffgiraldez.comicsearch.comics.data

import arrow.core.None
import arrow.core.Some
import io.reactivex.Flowable

abstract class ComicRepository<T>(
private val local: ComicLocalDataSource<T>,
private val remote: ComicRemoteDataSource<T>
) {
fun findByTerm(term: String): Flowable<List<T>> =
local.findQueryByTerm(term)
.flatMap {
when (it) {
is None -> remote.findByTerm(term)
.flatMapPublisher { local.insert(term, it).toFlowable<List<T>>() }
is Some -> local.findByQuery(it.t)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package es.ffgiraldez.comicsearch.comics.data
package es.ffgiraldez.comicsearch.comics.data.network

import io.reactivex.Single
import retrofit2.http.GET
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package es.ffgiraldez.comicsearch.comics.data
package es.ffgiraldez.comicsearch.comics.data.network

import com.google.gson.annotations.SerializedName

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package es.ffgiraldez.comicsearch.comics.store
package es.ffgiraldez.comicsearch.comics.data.storage

import android.arch.persistence.room.Dao
import android.arch.persistence.room.Insert
import android.arch.persistence.room.Query
import android.arch.persistence.room.Transaction
import es.ffgiraldez.comicsearch.comics.Volume
import es.ffgiraldez.comicsearch.comics.domain.Volume
import io.reactivex.Flowable

@Dao
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package es.ffgiraldez.comicsearch.comics.store
package es.ffgiraldez.comicsearch.comics.data.storage

import android.arch.persistence.room.Database
import android.arch.persistence.room.RoomDatabase
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package es.ffgiraldez.comicsearch.comics.store
package es.ffgiraldez.comicsearch.comics.data.storage

import android.arch.persistence.room.*
import android.arch.persistence.room.ForeignKey.CASCADE
Expand Down
Loading

0 comments on commit 3d3bdf0

Please sign in to comment.