Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
09be561
Setup data module
hitherejoe Jan 2, 2018
7495a5c
Create data models
hitherejoe Jan 2, 2018
5ffe69d
Fix compilation issues
hitherejoe Jan 2, 2018
c212898
Create data layer interfaces and data stores
hitherejoe Jan 7, 2018
008c3bd
Implement data stores
hitherejoe Jan 7, 2018
9a1cb8b
Implement project use cases
hitherejoe Jan 28, 2018
9a6e6ea
Add model classes
hitherejoe Jan 28, 2018
6192f65
Add repository
hitherejoe Feb 11, 2018
03fb79f
Create remote layer
hitherejoe Feb 14, 2018
414fe4d
Add mapper class and repository class
hitherejoe Feb 19, 2018
376d3b8
Implement remote impl
hitherejoe Mar 4, 2018
14f5164
Add project mapper
hitherejoe Mar 4, 2018
7d69d87
Build cache layer
hitherejoe Mar 5, 2018
78fde31
Implement cache layer
hitherejoe Mar 10, 2018
a2ea5b5
Add cache tests
hitherejoe Mar 10, 2018
5842790
Merge master
hitherejoe Mar 12, 2018
1eb7f30
Implement the view model layer
hitherejoe Apr 2, 2018
46fb608
Create ui layer
hitherejoe Apr 24, 2018
a081b2e
Create view models
hitherejoe Apr 24, 2018
58996f3
Add browse activity
hitherejoe Apr 28, 2018
6d718e1
Fix domain classes
hitherejoe Apr 28, 2018
b607cdf
Fix cache setup
hitherejoe May 1, 2018
ce6f97b
Merge data
hitherejoe May 1, 2018
c808633
Merge domain
hitherejoe May 1, 2018
0a18dea
Fix kotlin version
hitherejoe May 1, 2018
cf9f9cc
Start fixing tests
hitherejoe May 1, 2018
f8bcf8b
Fix injection
hitherejoe May 1, 2018
88da7f1
Merge cache layer
hitherejoe May 1, 2018
10c3131
Fix data layer
hitherejoe May 1, 2018
bc918d7
Fix data layer tests
hitherejoe May 1, 2018
a2fb88a
Merge domain
hitherejoe May 2, 2018
837e283
Fix presentation layer
hitherejoe May 2, 2018
b3c1516
Fix presentation layer
hitherejoe May 2, 2018
6455313
Add bookmarked screen
hitherejoe May 13, 2018
13f6734
Finish browse implementation
hitherejoe May 13, 2018
55a0fb0
Add bookmarked activity
hitherejoe May 13, 2018
82eb5e9
Add tests
hitherejoe May 16, 2018
0791c48
Merge master
hitherejoe May 16, 2018
d411323
Merge cache
hitherejoe May 16, 2018
5470429
Add repo test
hitherejoe May 20, 2018
bdf5149
Add repo test
hitherejoe May 20, 2018
3cdd8c1
Add UI tests
hitherejoe Jun 10, 2018
b30e7c1
Fix test
hitherejoe Jun 15, 2018
9e72f52
Prep for OS
hitherejoe Jun 21, 2018
57faf5a
Prep for OS
hitherejoe Jun 21, 2018
81aabfb
Merge domain
hitherejoe Jun 21, 2018
64a5819
Merge data
hitherejoe Jun 21, 2018
ff27e19
Merge base
hitherejoe Jun 21, 2018
739cd65
Merge presentation
hitherejoe Jun 21, 2018
da09a1d
Fix data source bug
hitherejoe Jun 22, 2018
2104e45
Fix failing test
hitherejoe Nov 13, 2018
05d366b
Fix config source
hitherejoe Nov 15, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Data/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/build
21 changes: 21 additions & 0 deletions Data/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
apply plugin: 'kotlin'

dependencies {
def dataDependencies = rootProject.ext.dataDependencies
def dataTestDependencies = rootProject.ext.dataTestDependencies

compile project(':Domain')

implementation dataDependencies.javaxAnnotation
implementation dataDependencies.kotlin
implementation dataDependencies.javaxInject
implementation dataDependencies.rxKotlin

testImplementation dataTestDependencies.junit
testImplementation dataTestDependencies.kotlinJUnit
testImplementation dataTestDependencies.mockito
testImplementation dataTestDependencies.assertj
}

sourceCompatibility = "1.6"
targetCompatibility = "1.6"
54 changes: 54 additions & 0 deletions Data/src/main/java/co/joebirch/data/ProjectsDataRepository.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package co.joebirch.data

import co.joebirch.data.mapper.ProjectMapper
import co.joebirch.data.repository.ProjectsCache
import co.joebirch.data.store.ProjectsDataStoreFactory
import co.joebirch.domain.model.Project
import co.joebirch.domain.repository.ProjectsRepository
import io.reactivex.Completable
import io.reactivex.Observable
import io.reactivex.functions.BiFunction
import javax.inject.Inject

class ProjectsDataRepository @Inject constructor(
private val mapper: ProjectMapper,
private val cache: ProjectsCache,
private val factory: ProjectsDataStoreFactory)
: ProjectsRepository {

override fun getProjects(): Observable<List<Project>> {
return Observable.zip(cache.areProjectsCached().toObservable(),
cache.isProjectsCacheExpired().toObservable(),
BiFunction<Boolean, Boolean, Pair<Boolean, Boolean>> { areCached, isExpired ->
Pair(areCached, isExpired)
})
.flatMap {
factory.getDataStore(it.first, it.second).getProjects().toObservable()
.distinctUntilChanged()
}
.flatMap { projects ->
factory.getCacheDataStore()
.saveProjects(projects)
.andThen(Observable.just(projects))
}
.map {
it.map {
mapper.mapFromEntity(it)
}
}
}

override fun bookmarkProject(projectId: String): Completable {
return factory.getCacheDataStore().setProjectAsBookmarked(projectId)
}

override fun unbookmarkProject(projectId: String): Completable {
return factory.getCacheDataStore().setProjectAsNotBookmarked(projectId)
}

override fun getBookmarkedProjects(): Observable<List<Project>> {
return factory.getCacheDataStore().getBookmarkedProjects().toObservable()
.map { it.map { mapper.mapFromEntity(it) } }
}

}
9 changes: 9 additions & 0 deletions Data/src/main/java/co/joebirch/data/mapper/EntityMapper.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package co.joebirch.data.mapper

interface EntityMapper<E, D> {

fun mapFromEntity(entity: E): D

fun mapToEntity(domain: D): E

}
20 changes: 20 additions & 0 deletions Data/src/main/java/co/joebirch/data/mapper/ProjectMapper.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package co.joebirch.data.mapper

import co.joebirch.data.model.ProjectEntity
import co.joebirch.domain.model.Project
import javax.inject.Inject

open class ProjectMapper @Inject constructor() : EntityMapper<ProjectEntity, Project> {

override fun mapFromEntity(entity: ProjectEntity): Project {
return Project(entity.id, entity.name, entity.fullName, entity.starCount,
entity.dateCreated, entity.ownerName, entity.ownerAvatar, entity.isBookmarked)
}

override fun mapToEntity(domain: Project): ProjectEntity {
return ProjectEntity(domain.id, domain.name, domain.fullName,
domain.starCount, domain.dateCreated, domain.ownerName,
domain.ownerAvatar, domain.isBookmarked)
}

}
6 changes: 6 additions & 0 deletions Data/src/main/java/co/joebirch/data/model/ProjectEntity.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package co.joebirch.data.model

data class ProjectEntity(val id: String, val name: String, val fullName: String,
val starCount: String, val dateCreated: String,
val ownerName: String, val ownerAvatar: String,
val isBookmarked: Boolean)
28 changes: 28 additions & 0 deletions Data/src/main/java/co/joebirch/data/repository/ProjectsCache.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package co.joebirch.data.repository

import co.joebirch.data.model.ProjectEntity
import io.reactivex.Completable
import io.reactivex.Flowable
import io.reactivex.Single

interface ProjectsCache {

fun clearProjects(): Completable

fun saveProjects(projects: List<ProjectEntity>): Completable

fun getProjects(): Flowable<List<ProjectEntity>>

fun getBookmarkedProjects(): Flowable<List<ProjectEntity>>

fun setProjectAsBookmarked(projectId: String): Completable

fun setProjectAsNotBookmarked(projectId: String): Completable

fun areProjectsCached(): Single<Boolean>

fun setLastCacheTime(lastCache: Long): Completable

fun isProjectsCacheExpired(): Flowable<Boolean>

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package co.joebirch.data.repository

import co.joebirch.data.model.ProjectEntity
import io.reactivex.Completable
import io.reactivex.Flowable

interface ProjectsDataStore {

fun getProjects(): Flowable<List<ProjectEntity>>

fun saveProjects(projects: List<ProjectEntity>): Completable

fun clearProjects(): Completable

fun getBookmarkedProjects(): Flowable<List<ProjectEntity>>

fun setProjectAsBookmarked(projectId: String): Completable

fun setProjectAsNotBookmarked(projectId: String): Completable

}
10 changes: 10 additions & 0 deletions Data/src/main/java/co/joebirch/data/repository/ProjectsRemote.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package co.joebirch.data.repository

import co.joebirch.data.model.ProjectEntity
import io.reactivex.Flowable

interface ProjectsRemote {

fun getProjects(): Flowable<List<ProjectEntity>>

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package co.joebirch.data.store

import co.joebirch.data.model.ProjectEntity
import co.joebirch.data.repository.ProjectsCache
import co.joebirch.data.repository.ProjectsDataStore
import io.reactivex.Completable
import io.reactivex.Flowable
import io.reactivex.Observable
import javax.inject.Inject

open class ProjectsCacheDataStore @Inject constructor(
private val projectsCache: ProjectsCache)
: ProjectsDataStore {

override fun getProjects(): Flowable<List<ProjectEntity>> {
return projectsCache.getProjects()
}

override fun saveProjects(projects: List<ProjectEntity>): Completable {
return projectsCache.saveProjects(projects)
.andThen(projectsCache.setLastCacheTime(System.currentTimeMillis()))
}

override fun clearProjects(): Completable {
return projectsCache.clearProjects()
}

override fun getBookmarkedProjects(): Flowable<List<ProjectEntity>> {
return projectsCache.getBookmarkedProjects()
}

override fun setProjectAsBookmarked(projectId: String): Completable {
return projectsCache.setProjectAsBookmarked(projectId)
}

override fun setProjectAsNotBookmarked(projectId: String): Completable {
return projectsCache.setProjectAsNotBookmarked(projectId)
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package co.joebirch.data.store

import co.joebirch.data.repository.ProjectsDataStore
import javax.inject.Inject

open class ProjectsDataStoreFactory @Inject constructor(
private val projectsCacheDataStore: ProjectsCacheDataStore,
private val projectsRemoteDataStore: ProjectsRemoteDataStore) {

open fun getDataStore(projectsCached: Boolean,
cacheExpired: Boolean): ProjectsDataStore {
return if (projectsCached && !cacheExpired) {
projectsCacheDataStore
} else {
projectsRemoteDataStore
}
}

open fun getCacheDataStore(): ProjectsDataStore {
return projectsCacheDataStore
}

fun getRemoteDataStore(): ProjectsDataStore {
return projectsRemoteDataStore
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package co.joebirch.data.store

import co.joebirch.data.model.ProjectEntity
import co.joebirch.data.repository.ProjectsDataStore
import co.joebirch.data.repository.ProjectsRemote
import io.reactivex.Completable
import io.reactivex.Flowable
import javax.inject.Inject

open class ProjectsRemoteDataStore @Inject constructor(
private val projectsRemote: ProjectsRemote)
: ProjectsDataStore {

override fun getProjects(): Flowable<List<ProjectEntity>> {
return projectsRemote.getProjects()
}

override fun saveProjects(projects: List<ProjectEntity>): Completable {
throw UnsupportedOperationException("Saving projects isn't supported here...")
}

override fun clearProjects(): Completable {
throw UnsupportedOperationException("Clearing projects isn't supported here...")
}

override fun getBookmarkedProjects(): Flowable<List<ProjectEntity>> {
throw UnsupportedOperationException("Getting bookmarked projects isn't supported here...")
}

override fun setProjectAsBookmarked(projectId: String): Completable {
throw UnsupportedOperationException("Setting bookmarks isn't supported here...")
}

override fun setProjectAsNotBookmarked(projectId: String): Completable {
throw UnsupportedOperationException("Setting bookmarks isn't supported here...")
}

}
Loading