Skip to content

Commit 58e42ca

Browse files
author
Leandro Ferreira
committed
implementing workspace sync
1 parent 4564095 commit 58e42ca

10 files changed

Lines changed: 72 additions & 15 deletions

File tree

application/core/documents/src/commonMain/kotlin/io/writeopia/core/folders/api/DocumentsApi.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import io.ktor.http.contentType
99
import io.ktor.http.isSuccess
1010
import io.writeopia.sdk.models.api.request.documents.FolderDiffRequest
1111
import io.writeopia.sdk.models.document.Document
12+
import io.writeopia.sdk.models.document.Folder
13+
import io.writeopia.sdk.models.document.MenuItem
1214
import io.writeopia.sdk.models.utils.ResultData
1315
import io.writeopia.sdk.serialization.data.DocumentApi
1416
import io.writeopia.sdk.serialization.extensions.toApi
@@ -34,7 +36,14 @@ class DocumentsApi(private val client: HttpClient, private val baseUrl: String)
3436
}
3537
}
3638

37-
suspend fun sendDocuments(documents: List<Document>): ResultData<Unit> {
39+
suspend fun getWorkspaceNewData(
40+
workspaceId: String,
41+
lastSync: Instant
42+
): ResultData<Pair<List<Document>, List<Folder>>> {
43+
44+
}
45+
46+
suspend fun sendDocuments(documents: List<MenuItem>): ResultData<Unit> {
3847
val response = client.post("$baseUrl/api/document") {
3948
contentType(ContentType.Application.Json)
4049
setBody(SendDocumentsRequest(documents.map { it.toApi() }))

application/core/documents/src/commonMain/kotlin/io/writeopia/core/folders/repository/folder/FolderRepository.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ interface FolderRepository {
1010

1111
suspend fun getFolderByParentId(parentId: String): List<Folder>
1212

13-
suspend fun getFoldersForUserAfterTime(userId: String, instant: Instant): List<Folder>
13+
suspend fun getFoldersForWorkspaceAfterTime(workspaceId: String, instant: Instant): List<Folder>
1414

15-
suspend fun getFoldersForUser(userId: String): List<Folder>
15+
suspend fun getFoldersForWorkspace(workspaceId: String): List<Folder>
1616

1717
suspend fun createFolder(folder: Folder)
1818

@@ -35,4 +35,6 @@ interface FolderRepository {
3535
suspend fun listenForFoldersByParentId(parentId: String): Flow<Map<String, List<Folder>>>
3636

3737
suspend fun stopListeningForFoldersByParentId(parentId: String)
38+
39+
suspend fun localOutDatedFolders(workspaceId: String): List<Folder>
3840
}

application/core/documents/src/commonMain/kotlin/io/writeopia/core/folders/repository/folder/FolderRepositorySqlDelight.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class FolderRepositorySqlDelight(
1515
override suspend fun getFolderById(id: String): Folder? =
1616
folderDao.getFolderById(id)?.toModel(0)
1717

18-
override suspend fun getFoldersForUserAfterTime(
18+
override suspend fun getFoldersForWorkspaceAfterTime(
1919
userId: String,
2020
instant: Instant
2121
): List<Folder> {
@@ -25,8 +25,8 @@ class FolderRepositorySqlDelight(
2525
)
2626
}
2727

28-
override suspend fun getFoldersForUser(userId: String): List<Folder> =
29-
folderDao.selectByUserId(userId)
28+
override suspend fun getFoldersForWorkspace(workspaceId: String): List<Folder> =
29+
folderDao.selectByUserId(workspaceId)
3030

3131
override suspend fun createFolder(folder: Folder) {
3232
folderDao.createFolder(folder.toEntity())

application/core/documents/src/commonMain/kotlin/io/writeopia/core/folders/repository/folder/InMemoryFolderRepository.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@ class InMemoryFolderRepository : FolderRepository {
2222
refreshState()
2323
}
2424

25-
override suspend fun getFoldersForUserAfterTime(
25+
override suspend fun getFoldersForWorkspaceAfterTime(
2626
userId: String,
2727
instant: Instant
2828
): List<Folder> {
2929
TODO("Not yet implemented")
3030
}
3131

32-
override suspend fun getFoldersForUser(userId: String): List<Folder> {
32+
override suspend fun getFoldersForWorkspace(workspaceId: String): List<Folder> {
3333
TODO("Not yet implemented")
3434
}
3535

application/core/documents/src/commonMain/kotlin/io/writeopia/core/folders/repository/folder/NotesUseCase.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,10 @@ class NotesUseCase private constructor(
9090
}
9191

9292
suspend fun loadFolderForUserAfterTime(userId: String, time: Instant): List<Folder> =
93-
folderRepository.getFoldersForUserAfterTime(userId, time)
93+
folderRepository.getFoldersForWorkspaceAfterTime(userId, time)
9494

9595
suspend fun loadFoldersForUser(userId: String): List<Folder> =
96-
folderRepository.getFoldersForUser(userId)
96+
folderRepository.getFoldersForWorkspace(userId)
9797

9898
private suspend fun loadDocumentsByIds(ids: Iterable<String>): List<MenuItem> {
9999
val folders = ids.mapNotNull { id -> folderRepository.getFolderById(id) }

application/core/documents/src/commonMain/kotlin/io/writeopia/core/folders/repository/folder/RoomFolderRepository.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,14 @@ class RoomFolderRepository(
2727
}
2828
}
2929

30-
override suspend fun getFoldersForUserAfterTime(
30+
override suspend fun getFoldersForWorkspaceAfterTime(
3131
userId: String,
3232
instant: Instant
3333
): List<Folder> {
3434
TODO("Not yet implemented")
3535
}
3636

37-
override suspend fun getFoldersForUser(userId: String): List<Folder> {
37+
override suspend fun getFoldersForWorkspace(workspaceId: String): List<Folder> {
3838
TODO("Not yet implemented")
3939
}
4040

application/core/documents/src/commonMain/kotlin/io/writeopia/core/folders/sync/DocumentConflictHandler.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package io.writeopia.core.folders.sync
22

33
import io.writeopia.auth.core.manager.AuthRepository
4+
import io.writeopia.core.folders.repository.folder.FolderRepository
45
import io.writeopia.sdk.models.document.Document
56
import io.writeopia.sdk.repository.DocumentRepository
67
import kotlinx.datetime.Clock
78

89
class DocumentConflictHandler(
910
private val documentRepository: DocumentRepository,
11+
private val folderRepository: FolderRepository,
1012
private val authRepository: AuthRepository
1113
) {
1214

application/core/documents/src/commonMain/kotlin/io/writeopia/core/folders/sync/FolderSync.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,6 @@ class FolderSync(
7575

7676
documentRepository.refreshDocuments()
7777
folderRepository.updateFolder(folder.copy(lastSyncedAt = now))
78-
} else {
79-
return
8078
}
8179
}
8280
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package io.writeopia.core.folders.sync
2+
3+
import io.writeopia.auth.core.manager.AuthRepository
4+
import io.writeopia.core.folders.api.DocumentsApi
5+
import io.writeopia.core.folders.repository.folder.FolderRepository
6+
import io.writeopia.sdk.models.sorting.OrderBy
7+
import io.writeopia.sdk.models.utils.ResultData
8+
import io.writeopia.sdk.repository.DocumentRepository
9+
10+
//Todo: Implement sync for workspace
11+
class WorkspaceSync(
12+
private val folderRepository: FolderRepository,
13+
private val documentRepository: DocumentRepository,
14+
private val authRepository: AuthRepository,
15+
private val documentsApi: DocumentsApi,
16+
private val documentConflictHandler: DocumentConflictHandler,
17+
) {
18+
19+
suspend fun syncWorkspace(workspaceId: String) {
20+
val workspace = authRepository.getWorkspace()
21+
22+
val folders = folderRepository.getFoldersForWorkspace(workspaceId)
23+
val documents = documentRepository.loadDocumentsForWorkspace(
24+
orderBy = OrderBy.NAME.type,
25+
workspaceId = workspaceId,
26+
instant = workspace.lastSync
27+
)
28+
29+
val response = documentsApi.getWorkspaceNewData(workspaceId, workspace.lastSync)
30+
val (newDocuments, newFolders) = if (response is ResultData.Complete) response.data else return
31+
32+
val localOutdatedDocs = documentRepository.loadOutdatedDocuments(workspaceId)
33+
val localOutdatedFolders = folderRepository.localOutDatedFolders(workspaceId)
34+
35+
val documentsNotSent = documentConflictHandler.handleConflict(
36+
localOutdatedDocs,
37+
newDocuments,
38+
)
39+
40+
val documentsNotSent = documentConflictHandler.handleConflict(
41+
localOutdatedDocs,
42+
newDocuments,
43+
)
44+
45+
}
46+
}

application/features/documents_graph/src/commonMain/kotlin/io/writeopia/documents/graph/repository/GraphRepository.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class GraphRepository(
1111
) {
1212

1313
suspend fun loadAllDocumentsAsAdjacencyList(userId: String): Map<ItemData, List<ItemData>> {
14-
val folders = folderRepository.getFoldersForUser(userId)
14+
val folders = folderRepository.getFoldersForWorkspace(userId)
1515
val documents = documentRepository.loadDocumentsWorkspace(userId)
1616

1717
val root = ItemData(id = "root", title = "", parentId = "", isFolder = true)

0 commit comments

Comments
 (0)