Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import ru.netology.nmedia.dto.Post

interface PostRepository {
fun getAll(): List<Post>
fun likeById(id: Long)
fun likeById(id: Long, isLike: Boolean)
fun save(post: Post)
fun removeById(id: Long)
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package ru.netology.nmedia.repository

import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import okhttp3.FormBody
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.Request
Expand Down Expand Up @@ -35,8 +36,23 @@ class PostRepositoryImpl: PostRepository {
}
}

override fun likeById(id: Long) {
// TODO: do this in homework
override fun likeById(id: Long, isLike: Boolean) {
var request: Request
if (isLike) {
request = Request.Builder()
.delete(FormBody.Builder().build())
.url("${BASE_URL}/api/slow/posts/${id}/likes")
.build()
} else {
request = Request.Builder()
.post(FormBody.Builder().build())
.url("${BASE_URL}/api/slow/posts/${id}/likes")
.build()
}

client.newCall(request)
.execute()
.close()
}

override fun save(post: Post) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,29 @@ class PostViewModel(application: Application) : AndroidViewModel(application) {
}

fun likeById(id: Long) {
thread { repository.likeById(id) }

val currentState = _data.value
val currentPosts = currentState?.posts.orEmpty().toMutableList()

val index = currentPosts.indexOfFirst { it.id == id }

val oldPost = currentPosts[index]
val newPost = oldPost.copy(
likedByMe = !oldPost.likedByMe,
likes = if (oldPost.likedByMe) oldPost.likes - 1 else oldPost.likes + 1
)

currentPosts[index] = newPost
_data.postValue(currentState?.copy(posts = currentPosts))

// Отправляем запрос на сервер (оптимистично считаем, что он пройдет успешно)
try {
thread { repository.likeById(id, oldPost.likedByMe) }
// Если запрос успешен, интерфейс уже обновлен, ничего делать не нужно.
} catch (e: IOException) {
currentPosts[index] = oldPost // Возвращаем старый пост
_data.postValue(currentState?.copy(posts = currentPosts))
}
}

fun removeById(id: Long) {
Expand Down
12 changes: 12 additions & 0 deletions 02_threads/android/gradle/gradle-daemon-jvm.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#This file is generated by updateDaemonJvm
toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/ec7520a1e057cd116f9544c42142a16b/redirect
toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/4c4f879899012ff0a8b2e2117df03b0e/redirect
toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/ec7520a1e057cd116f9544c42142a16b/redirect
toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/4c4f879899012ff0a8b2e2117df03b0e/redirect
toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/73bcfb608d1fde9fb62e462f834a3299/redirect
toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/846ee0d876d26a26f37aa1ce8de73224/redirect
toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/ec7520a1e057cd116f9544c42142a16b/redirect
toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/4c4f879899012ff0a8b2e2117df03b0e/redirect
toolchainUrl.WINDOWS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/9482ddec596298c84656d31d16652665/redirect
toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/39701d92e1756bb2f141eb67cd4c660e/redirect
toolchainVersion=21
12 changes: 12 additions & 0 deletions 02_threads/server/gradle/gradle-daemon-jvm.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#This file is generated by updateDaemonJvm
toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/ec7520a1e057cd116f9544c42142a16b/redirect
toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/4c4f879899012ff0a8b2e2117df03b0e/redirect
toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/ec7520a1e057cd116f9544c42142a16b/redirect
toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/4c4f879899012ff0a8b2e2117df03b0e/redirect
toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/73bcfb608d1fde9fb62e462f834a3299/redirect
toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/846ee0d876d26a26f37aa1ce8de73224/redirect
toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/ec7520a1e057cd116f9544c42142a16b/redirect
toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/4c4f879899012ff0a8b2e2117df03b0e/redirect
toolchainUrl.WINDOWS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/9482ddec596298c84656d31d16652665/redirect
toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/39701d92e1756bb2f141eb67cd4c660e/redirect
toolchainVersion=21