Skip to content
Merged
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 @@ -739,6 +739,13 @@ class DocumentSqlBeDao(
?: emptyList()
}

fun loadFoldersByParentId(parentId: String): List<Folder> {
return foldersQueries?.selectChildrenFolder(parentId)
?.executeAsList()
?.map { it.toModel(0) }
?: emptyList()
}

fun deleteDocumentsByUserId(userId: String) {
documentQueries?.deleteByUserId(Clock.System.now().toEpochMilliseconds(), userId)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,9 @@ suspend fun WriteopiaDbBackend.getFolderById(id: String = "test", userId: String
suspend fun WriteopiaDbBackend.getIdsByParentId(parentId: String = "root"): List<String> =
getDocumentDaoFn().loadDocumentIdsByParentId(parentId)

fun WriteopiaDbBackend.getFoldersByParentId(parentId: String = "root"): List<Folder> =
getDocumentDaoFn().loadFoldersByParentId(parentId)

suspend fun WriteopiaDbBackend.deleteDocumentById(vararg documentIds: String) {
val dao = getDocumentDaoFn()
documentIds.forEach(dao::deleteDocumentById)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import io.writeopia.api.documents.documents.repository.allFoldersByWorkspaceId
import io.writeopia.api.documents.documents.repository.documentsDiffByFolder
import io.writeopia.api.documents.documents.repository.documentsDiffByWorkspace
import io.writeopia.api.documents.documents.repository.getDocumentsByParentId
import io.writeopia.api.documents.documents.repository.getFoldersByParentId
import io.writeopia.api.documents.documents.repository.getIdsByParentId
import io.writeopia.backend.models.ImageStorageService
import io.writeopia.buckets.GcpBucketImageStorageService
Expand All @@ -28,6 +29,7 @@ import io.writeopia.sdk.serialization.json.SendDocumentsRequest
import io.writeopia.sdk.serialization.json.SendFoldersRequest
import io.writeopia.sdk.serialization.request.ImageUploadRequest
import io.writeopia.sdk.serialization.request.WorkspaceDiffRequest
import io.writeopia.sdk.serialization.response.FolderContentResponse
import io.writeopia.sdk.serialization.response.WorkspaceDiffResponse
import io.writeopia.sql.WriteopiaDbBackend
import kotlin.time.Clock
Expand Down Expand Up @@ -163,6 +165,34 @@ fun Routing.documentsRoute(
}
}

authenticate("auth-jwt", optional = debug) {
get("/api/workspace/{workspaceId}/folder/{folderId}/contents") {
val folderId = call.pathParameters["folderId"]!!
val userId = getUserId() ?: ""
val workspaceId = call.pathParameters["workspaceId"] ?: ""

runIfMember(userId, workspaceId, writeopiaDb, debug) {
try {
val folders = writeopiaDb.getFoldersByParentId(folderId)
val documents = writeopiaDb.getDocumentsByParentId(folderId)

call.respond(
status = HttpStatusCode.OK,
message = FolderContentResponse(
folders = folders.map { it.toApi() },
documents = documents.map { it.toApi() }
)
)
} catch (e: Exception) {
call.respond(
status = HttpStatusCode.InternalServerError,
message = "${e.message}"
)
}
}
}
}

authenticate("auth-jwt", optional = debug) {
post<SendDocumentsRequest>("/api/workspace/document") { request ->
val userId = getUserId() ?: ""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import io.writeopia.sdk.serialization.extensions.toApi
import io.writeopia.sdk.serialization.json.SendDocumentsRequest
import io.writeopia.sdk.serialization.json.SendFoldersRequest
import io.writeopia.sdk.serialization.request.WorkspaceDiffRequest
import io.writeopia.sdk.serialization.response.FolderContentResponse
import io.writeopia.sdk.serialization.response.WorkspaceDiffResponse
import kotlin.time.Clock
import kotlin.random.Random
Expand Down Expand Up @@ -325,4 +326,98 @@ class DocumentationIntegrationTests {
db.deleteDocumentById(documentApi.id)
db.deleteDocumentById(documentApi2.id)
}

@Test
fun `it should be possible to get folder contents with folders and documents`() = testApplication {
application {
module(db, debugMode = true)
}

val client = defaultClient()
val workspaceId = Random.nextInt().toString()
val parentFolderId = "parentFolderId"

val childFolder1 = FolderApi(
id = "childFolder1",
title = "Child Folder 1",
parentId = parentFolderId,
createdAt = Clock.System.now(),
lastUpdatedAt = Clock.System.now(),
workspaceId = workspaceId,
itemCount = 0L,
)

val childFolder2 = FolderApi(
id = "childFolder2",
title = "Child Folder 2",
parentId = parentFolderId,
createdAt = Clock.System.now(),
lastUpdatedAt = Clock.System.now(),
workspaceId = workspaceId,
itemCount = 0L,
)

val document1 = DocumentApi(
id = "document1",
title = "Document 1",
workspaceId = workspaceId,
parentId = parentFolderId,
isLocked = false,
createdAt = 1000L,
lastUpdatedAt = 2000L,
lastSyncedAt = 0L
)

val document2 = DocumentApi(
id = "document2",
title = "Document 2",
workspaceId = workspaceId,
parentId = parentFolderId,
isLocked = false,
createdAt = 1000L,
lastUpdatedAt = 2000L,
lastSyncedAt = 0L
)

// Save folders
val folderResponse = client.post("/api/workspace/folder") {
contentType(ContentType.Application.Json)
setBody(SendFoldersRequest(listOf(childFolder1, childFolder2), workspaceId))
}

assertEquals(HttpStatusCode.OK, folderResponse.status)

// Save documents
val documentResponse = client.post("/api/workspace/document") {
contentType(ContentType.Application.Json)
setBody(SendDocumentsRequest(listOf(document1, document2), workspaceId))
}

assertEquals(HttpStatusCode.OK, documentResponse.status)

// Get folder contents
val contentsResponse = client.get("/api/workspace/$workspaceId/folder/$parentFolderId/contents")

assertEquals(HttpStatusCode.OK, contentsResponse.status)

val contents = contentsResponse.body<FolderContentResponse>()

// Verify folders
assertEquals(2, contents.folders.size)
assertEquals(
listOf(childFolder1.id, childFolder2.id).sorted(),
contents.folders.map { it.id }.sorted()
)

// Verify documents
assertEquals(2, contents.documents.size)
assertEquals(
listOf(document1.id, document2.id).sorted(),
contents.documents.map { it.id }.sorted()
)

// Clean up
db.deleteDocumentById(document1.id)
db.deleteDocumentById(document2.id)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package io.writeopia.sdk.serialization.response

import io.writeopia.sdk.serialization.data.DocumentApi
import io.writeopia.sdk.serialization.data.FolderApi
import kotlinx.serialization.Serializable

@Serializable
data class FolderContentResponse(
val folders: List<FolderApi> = emptyList(),
val documents: List<DocumentApi> = emptyList()
)