Skip to content

Commit cacdd16

Browse files
committed
deleting blog posts
1 parent 3147a08 commit cacdd16

File tree

7 files changed

+119
-4
lines changed

7 files changed

+119
-4
lines changed

app/src/main/java/com/codingwithmitch/openapi/api/main/OpenApiMainService.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ interface OpenApiMainService {
4848
): LiveData<GenericApiResponse<GenericResponse>>
4949

5050

51+
@DELETE("blog/{slug}/delete")
52+
fun deleteBlogPost(
53+
@Header("Authorization") authorization: String,
54+
@Path("slug") slug: String
55+
): LiveData<GenericApiResponse<GenericResponse>>
5156
}
5257

5358

app/src/main/java/com/codingwithmitch/openapi/persistence/BlogPostDao.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
package com.codingwithmitch.openapi.persistence
22

33
import androidx.lifecycle.LiveData
4-
import androidx.room.Dao
5-
import androidx.room.Insert
6-
import androidx.room.OnConflictStrategy
7-
import androidx.room.Query
4+
import androidx.room.*
85
import com.codingwithmitch.openapi.models.BlogPost
96
import com.codingwithmitch.openapi.util.Constants.Companion.PAGINATION_PAGE_SIZE
107

@@ -14,6 +11,9 @@ interface BlogPostDao {
1411
@Insert(onConflict = OnConflictStrategy.REPLACE)
1512
suspend fun insert(blogPost: BlogPost): Long
1613

14+
@Delete
15+
suspend fun deleteBlogPost(blogPost: BlogPost)
16+
1717
@Query("""
1818
SELECT * FROM blog_post
1919
WHERE title LIKE '%' || :query || '%'
@@ -76,6 +76,8 @@ interface BlogPostDao {
7676
page: Int,
7777
pageSize: Int = PAGINATION_PAGE_SIZE
7878
): LiveData<List<BlogPost>>
79+
80+
7981
}
8082

8183

app/src/main/java/com/codingwithmitch/openapi/repository/main/BlogRepository.kt

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import com.codingwithmitch.openapi.repository.JobManager
1414
import com.codingwithmitch.openapi.repository.NetworkBoundResource
1515
import com.codingwithmitch.openapi.session.SessionManager
1616
import com.codingwithmitch.openapi.ui.DataState
17+
import com.codingwithmitch.openapi.ui.Response
18+
import com.codingwithmitch.openapi.ui.ResponseType
1719
import com.codingwithmitch.openapi.ui.main.blog.state.BlogViewState
1820
import com.codingwithmitch.openapi.ui.main.blog.state.BlogViewState.*
1921
import com.codingwithmitch.openapi.util.AbsentLiveData
@@ -24,6 +26,7 @@ import com.codingwithmitch.openapi.util.ErrorHandling.Companion.ERROR_UNKNOWN
2426
import com.codingwithmitch.openapi.util.GenericApiResponse
2527
import com.codingwithmitch.openapi.util.SuccessHandling.Companion.RESPONSE_HAS_PERMISSION_TO_EDIT
2628
import com.codingwithmitch.openapi.util.SuccessHandling.Companion.RESPONSE_NO_PERMISSION_TO_EDIT
29+
import com.codingwithmitch.openapi.util.SuccessHandling.Companion.SUCCESS_BLOG_DELETED
2730
import kotlinx.coroutines.Dispatchers
2831
import kotlinx.coroutines.Dispatchers.IO
2932
import kotlinx.coroutines.Job
@@ -233,6 +236,71 @@ constructor(
233236

234237
}.asLiveData()
235238
}
239+
240+
fun deleteBlogPost(
241+
authToken: AuthToken,
242+
blogPost: BlogPost
243+
): LiveData<DataState<BlogViewState>>{
244+
return object: NetworkBoundResource<GenericResponse, BlogPost, BlogViewState>(
245+
sessionManager.isConnectedToTheInternet(),
246+
true,
247+
true,
248+
false
249+
){
250+
251+
// not applicable
252+
override suspend fun createCacheRequestAndReturn() {
253+
254+
}
255+
256+
override suspend fun handleApiSuccessResponse(response: ApiSuccessResponse<GenericResponse>) {
257+
258+
if(response.body.response == SUCCESS_BLOG_DELETED){
259+
updateLocalDb(blogPost)
260+
}
261+
else{
262+
onCompleteJob(
263+
DataState.error(
264+
Response(
265+
ERROR_UNKNOWN,
266+
ResponseType.Dialog()
267+
)
268+
)
269+
)
270+
}
271+
}
272+
273+
// not applicable
274+
override fun loadFromCache(): LiveData<BlogViewState> {
275+
return AbsentLiveData.create()
276+
}
277+
278+
override fun createCall(): LiveData<GenericApiResponse<GenericResponse>> {
279+
return openApiMainService.deleteBlogPost(
280+
"Token ${authToken.token!!}",
281+
blogPost.slug
282+
)
283+
}
284+
285+
override suspend fun updateLocalDb(cacheObject: BlogPost?) {
286+
cacheObject?.let{blogPost ->
287+
blogPostDao.deleteBlogPost(blogPost)
288+
onCompleteJob(
289+
DataState.data(
290+
null,
291+
Response(SUCCESS_BLOG_DELETED, ResponseType.Toast())
292+
)
293+
)
294+
}
295+
}
296+
297+
override fun setJob(job: Job) {
298+
addJob("deleteBlogPost", job)
299+
}
300+
301+
}.asLiveData()
302+
}
303+
236304
}
237305

238306

app/src/main/java/com/codingwithmitch/openapi/ui/main/blog/ViewBlogFragment.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,16 @@ class ViewBlogFragment : BaseBlogFragment(){
3030
subscribeObservers()
3131
checkIsAuthorOfBlogPost()
3232
stateChangeListener.expandAppBar()
33+
34+
delete_button.setOnClickListener {
35+
deleteBlogPost()
36+
}
37+
}
38+
39+
fun deleteBlogPost(){
40+
viewModel.setStateEvent(
41+
DeleteBlogPostEvent()
42+
)
3343
}
3444

3545
fun checkIsAuthorOfBlogPost(){

app/src/main/java/com/codingwithmitch/openapi/ui/main/blog/state/BlogStateEvent.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,7 @@ sealed class BlogStateEvent {
66

77
class CheckAuthorOfBlogPost: BlogStateEvent()
88

9+
class DeleteBlogPostEvent: BlogStateEvent()
10+
911
class None: BlogStateEvent()
1012
}

app/src/main/java/com/codingwithmitch/openapi/ui/main/blog/viewmodel/BlogViewModel.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,15 @@ constructor(
6666
}?: AbsentLiveData.create()
6767
}
6868

69+
is DeleteBlogPostEvent -> {
70+
return sessionManager.cachedToken.value?.let { authToken ->
71+
blogRepository.deleteBlogPost(
72+
authToken = authToken,
73+
blogPost = getBlogPost()
74+
)
75+
}?: AbsentLiveData.create()
76+
}
77+
6978
is None ->{
7079
return object: LiveData<DataState<BlogViewState>>(){
7180
override fun onActive() {

app/src/main/java/com/codingwithmitch/openapi/ui/main/blog/viewmodel/Getters.kt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.codingwithmitch.openapi.ui.main.blog.viewmodel
22

3+
import com.codingwithmitch.openapi.models.BlogPost
4+
35
fun BlogViewModel.getFilter(): String {
46
getCurrentViewStateOrNew().let {
57
return it.blogFields.filter
@@ -40,6 +42,23 @@ fun BlogViewModel.isAuthorOfBlogPost(): Boolean{
4042
}
4143

4244

45+
fun BlogViewModel.getBlogPost(): BlogPost {
46+
getCurrentViewStateOrNew().let {
47+
return it.viewBlogFields.blogPost?.let {
48+
return it
49+
}?: getDummyBlogPost()
50+
}
51+
}
52+
53+
fun BlogViewModel.getDummyBlogPost(): BlogPost{
54+
return BlogPost(-1, "" , "", "", "", 1, "")
55+
}
56+
57+
58+
59+
60+
61+
4362

4463

4564

0 commit comments

Comments
 (0)