Skip to content

Commit 3d3bdf0

Browse files
committed
feat: 🏗️ extract common data logic (#21)
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
1 parent e4c9b4e commit 3d3bdf0

File tree

23 files changed

+413
-118
lines changed

23 files changed

+413
-118
lines changed
Lines changed: 217 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,217 @@
1+
{
2+
"formatVersion": 1,
3+
"database": {
4+
"version": 1,
5+
"identityHash": "843b5908f7967726e53a210136b5cda2",
6+
"entities": [
7+
{
8+
"tableName": "queries",
9+
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`query_identifier` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `search_term` TEXT NOT NULL)",
10+
"fields": [
11+
{
12+
"fieldPath": "queryId",
13+
"columnName": "query_identifier",
14+
"affinity": "INTEGER",
15+
"notNull": true
16+
},
17+
{
18+
"fieldPath": "searchTerm",
19+
"columnName": "search_term",
20+
"affinity": "TEXT",
21+
"notNull": true
22+
}
23+
],
24+
"primaryKey": {
25+
"columnNames": [
26+
"query_identifier"
27+
],
28+
"autoGenerate": true
29+
},
30+
"indices": [
31+
{
32+
"name": "idx_query_identifier",
33+
"unique": false,
34+
"columnNames": [
35+
"query_identifier"
36+
],
37+
"createSql": "CREATE INDEX `idx_query_identifier` ON `${TABLE_NAME}` (`query_identifier`)"
38+
},
39+
{
40+
"name": "idx_query_term",
41+
"unique": false,
42+
"columnNames": [
43+
"search_term"
44+
],
45+
"createSql": "CREATE INDEX `idx_query_term` ON `${TABLE_NAME}` (`search_term`)"
46+
}
47+
],
48+
"foreignKeys": []
49+
},
50+
{
51+
"tableName": "suggestions",
52+
"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 )",
53+
"fields": [
54+
{
55+
"fieldPath": "suggestionId",
56+
"columnName": "suggestionId",
57+
"affinity": "INTEGER",
58+
"notNull": true
59+
},
60+
{
61+
"fieldPath": "queryId",
62+
"columnName": "query_id",
63+
"affinity": "INTEGER",
64+
"notNull": true
65+
},
66+
{
67+
"fieldPath": "title",
68+
"columnName": "title",
69+
"affinity": "TEXT",
70+
"notNull": true
71+
}
72+
],
73+
"primaryKey": {
74+
"columnNames": [
75+
"suggestionId"
76+
],
77+
"autoGenerate": true
78+
},
79+
"indices": [
80+
{
81+
"name": "idx_suggestion_id",
82+
"unique": false,
83+
"columnNames": [
84+
"query_id"
85+
],
86+
"createSql": "CREATE INDEX `idx_suggestion_id` ON `${TABLE_NAME}` (`query_id`)"
87+
}
88+
],
89+
"foreignKeys": [
90+
{
91+
"table": "queries",
92+
"onDelete": "CASCADE",
93+
"onUpdate": "NO ACTION",
94+
"columns": [
95+
"query_id"
96+
],
97+
"referencedColumns": [
98+
"query_identifier"
99+
]
100+
}
101+
]
102+
},
103+
{
104+
"tableName": "search",
105+
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`search_identifier` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `search_term` TEXT NOT NULL)",
106+
"fields": [
107+
{
108+
"fieldPath": "queryId",
109+
"columnName": "search_identifier",
110+
"affinity": "INTEGER",
111+
"notNull": true
112+
},
113+
{
114+
"fieldPath": "searchTerm",
115+
"columnName": "search_term",
116+
"affinity": "TEXT",
117+
"notNull": true
118+
}
119+
],
120+
"primaryKey": {
121+
"columnNames": [
122+
"search_identifier"
123+
],
124+
"autoGenerate": true
125+
},
126+
"indices": [
127+
{
128+
"name": "idx_search_identifier",
129+
"unique": false,
130+
"columnNames": [
131+
"search_identifier"
132+
],
133+
"createSql": "CREATE INDEX `idx_search_identifier` ON `${TABLE_NAME}` (`search_identifier`)"
134+
},
135+
{
136+
"name": "idx_search_term",
137+
"unique": false,
138+
"columnNames": [
139+
"search_term"
140+
],
141+
"createSql": "CREATE INDEX `idx_search_term` ON `${TABLE_NAME}` (`search_term`)"
142+
}
143+
],
144+
"foreignKeys": []
145+
},
146+
{
147+
"tableName": "volumes",
148+
"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 )",
149+
"fields": [
150+
{
151+
"fieldPath": "suggestionId",
152+
"columnName": "suggestionId",
153+
"affinity": "INTEGER",
154+
"notNull": true
155+
},
156+
{
157+
"fieldPath": "queryId",
158+
"columnName": "search_id",
159+
"affinity": "INTEGER",
160+
"notNull": true
161+
},
162+
{
163+
"fieldPath": "title",
164+
"columnName": "title",
165+
"affinity": "TEXT",
166+
"notNull": true
167+
},
168+
{
169+
"fieldPath": "author",
170+
"columnName": "author",
171+
"affinity": "TEXT",
172+
"notNull": true
173+
},
174+
{
175+
"fieldPath": "url",
176+
"columnName": "url",
177+
"affinity": "TEXT",
178+
"notNull": true
179+
}
180+
],
181+
"primaryKey": {
182+
"columnNames": [
183+
"suggestionId"
184+
],
185+
"autoGenerate": true
186+
},
187+
"indices": [
188+
{
189+
"name": "idx_search_id",
190+
"unique": false,
191+
"columnNames": [
192+
"search_id"
193+
],
194+
"createSql": "CREATE INDEX `idx_search_id` ON `${TABLE_NAME}` (`search_id`)"
195+
}
196+
],
197+
"foreignKeys": [
198+
{
199+
"table": "search",
200+
"onDelete": "CASCADE",
201+
"onUpdate": "NO ACTION",
202+
"columns": [
203+
"search_id"
204+
],
205+
"referencedColumns": [
206+
"search_identifier"
207+
]
208+
}
209+
]
210+
}
211+
],
212+
"setupQueries": [
213+
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
214+
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"843b5908f7967726e53a210136b5cda2\")"
215+
]
216+
}
217+
}

app/src/main/java/es/ffgiraldez/comicsearch/comics/ComicRepository.kt

Lines changed: 0 additions & 86 deletions
This file was deleted.

app/src/main/java/es/ffgiraldez/comicsearch/comics/Volume.kt

Lines changed: 0 additions & 8 deletions
This file was deleted.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package es.ffgiraldez.comicsearch.comics.data
2+
3+
import arrow.core.Option
4+
import es.ffgiraldez.comicsearch.comics.domain.Query
5+
import io.reactivex.Completable
6+
import io.reactivex.Flowable
7+
import io.reactivex.Single
8+
9+
interface ComicLocalDataSource<T> {
10+
fun findQueryByTerm(searchTerm: String): Flowable<Option<Query>>
11+
fun findByQuery(query: Query): Flowable<List<T>>
12+
fun insert(query: String, titles: List<T>): Completable
13+
}
14+
15+
interface ComicRemoteDataSource<T> {
16+
fun findByTerm(searchTerm: String): Single<List<T>>
17+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package es.ffgiraldez.comicsearch.comics.data
2+
3+
import arrow.core.None
4+
import arrow.core.Some
5+
import io.reactivex.Flowable
6+
7+
abstract class ComicRepository<T>(
8+
private val local: ComicLocalDataSource<T>,
9+
private val remote: ComicRemoteDataSource<T>
10+
) {
11+
fun findByTerm(term: String): Flowable<List<T>> =
12+
local.findQueryByTerm(term)
13+
.flatMap {
14+
when (it) {
15+
is None -> remote.findByTerm(term)
16+
.flatMapPublisher { local.insert(term, it).toFlowable<List<T>>() }
17+
is Some -> local.findByQuery(it.t)
18+
}
19+
}
20+
}

app/src/main/java/es/ffgiraldez/comicsearch/comics/data/ComicVineApi.kt renamed to app/src/main/java/es/ffgiraldez/comicsearch/comics/data/network/ComicVineApi.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package es.ffgiraldez.comicsearch.comics.data
1+
package es.ffgiraldez.comicsearch.comics.data.network
22

33
import io.reactivex.Single
44
import retrofit2.http.GET

app/src/main/java/es/ffgiraldez/comicsearch/comics/data/ComicVineResponses.kt renamed to app/src/main/java/es/ffgiraldez/comicsearch/comics/data/network/ComicVineResponses.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package es.ffgiraldez.comicsearch.comics.data
1+
package es.ffgiraldez.comicsearch.comics.data.network
22

33
import com.google.gson.annotations.SerializedName
44

app/src/main/java/es/ffgiraldez/comicsearch/comics/store/ComicDao.kt renamed to app/src/main/java/es/ffgiraldez/comicsearch/comics/data/storage/ComicDao.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
package es.ffgiraldez.comicsearch.comics.store
1+
package es.ffgiraldez.comicsearch.comics.data.storage
22

33
import android.arch.persistence.room.Dao
44
import android.arch.persistence.room.Insert
55
import android.arch.persistence.room.Query
66
import android.arch.persistence.room.Transaction
7-
import es.ffgiraldez.comicsearch.comics.Volume
7+
import es.ffgiraldez.comicsearch.comics.domain.Volume
88
import io.reactivex.Flowable
99

1010
@Dao

app/src/main/java/es/ffgiraldez/comicsearch/comics/store/ComicDatabase.kt renamed to app/src/main/java/es/ffgiraldez/comicsearch/comics/data/storage/ComicDatabase.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package es.ffgiraldez.comicsearch.comics.store
1+
package es.ffgiraldez.comicsearch.comics.data.storage
22

33
import android.arch.persistence.room.Database
44
import android.arch.persistence.room.RoomDatabase

app/src/main/java/es/ffgiraldez/comicsearch/comics/store/ComicEntities.kt renamed to app/src/main/java/es/ffgiraldez/comicsearch/comics/data/storage/ComicEntities.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package es.ffgiraldez.comicsearch.comics.store
1+
package es.ffgiraldez.comicsearch.comics.data.storage
22

33
import android.arch.persistence.room.*
44
import android.arch.persistence.room.ForeignKey.CASCADE

0 commit comments

Comments
 (0)