Skip to content

Commit 27ad9a1

Browse files
Adding folder and document endpoint (#569)
* Adding folder and document endpoint * Update DocumentsIntegrationTest.kt
1 parent deb3037 commit 27ad9a1

8 files changed

Lines changed: 306 additions & 15 deletions

File tree

application/web/src/jsMain/kotlin/resources/index.html

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
<title>Writeopia</title>
66

77
<meta name="viewport" content="width=device-width, initial-scale=1">
8+
<script src="skiko.js"> </script>
89

910
<style>
1011
/* Basic styles to ensure the Compose content fills the entire viewport.
@@ -21,11 +22,7 @@
2122
</head>
2223
<body>
2324

24-
<div id="root">
25-
Loading...
26-
</div>
27-
28-
<script src="main.js"></script>
25+
<div id="composeApp"></div>
2926

3027
</body>
3128
</html>

application/web/src/wasmJsMain/kotlin/io/writeopia/web/MainWeb.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
2525

2626
@OptIn(ExperimentalComposeUiApi::class)
2727
fun main() {
28-
ComposeViewport {
28+
ComposeViewport("composeApp") {
2929
ImageLoadConfig.configImageLoad()
3030
CreateAppInMemory()
3131
}

application/web/src/wasmJsMain/kotlin/resources/index.html

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,6 @@
2121
</head>
2222
<body>
2323

24-
<div id="root">
25-
Loading...
26-
</div>
27-
2824
<script src="main.js"></script>
2925

3026
</body>

backend/documents/documents/src/main/java/io/writeopia/api/documents/documents/DocumentsService.kt

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@ import io.writeopia.connection.Urls
1818
import io.writeopia.connection.wrWebClient
1919
import io.writeopia.sdk.models.document.Document
2020
import io.writeopia.sdk.models.document.Folder
21+
import io.writeopia.sdk.models.id.GenerateId
2122
import io.writeopia.sdk.serialization.extensions.toApi
2223
import io.writeopia.sql.WriteopiaDbBackend
24+
import kotlin.time.Clock
2325
import kotlin.time.ExperimentalTime
2426

2527
object DocumentsService {
@@ -65,6 +67,48 @@ object DocumentsService {
6567
writeopiaDb: WriteopiaDbBackend
6668
): Folder? = writeopiaDb.getFolderById(id, userId)
6769

70+
suspend fun createFolder(
71+
parentFolderId: String,
72+
title: String,
73+
workspaceId: String,
74+
writeopiaDb: WriteopiaDbBackend
75+
): Folder {
76+
val now = Clock.System.now()
77+
val folder = Folder(
78+
id = GenerateId.generate(),
79+
parentId = parentFolderId,
80+
title = title,
81+
createdAt = now,
82+
lastUpdatedAt = now,
83+
workspaceId = workspaceId,
84+
itemCount = 0
85+
)
86+
87+
writeopiaDb.saveFolder(folder)
88+
return folder
89+
}
90+
91+
suspend fun upsertDocument(
92+
document: Document,
93+
workspaceId: String,
94+
writeopiaDb: WriteopiaDbBackend,
95+
useAi: Boolean
96+
): Document {
97+
val documentWithWorkspace = document.copy(
98+
workspaceId = workspaceId,
99+
lastUpdatedAt = Clock.System.now(),
100+
lastSyncedAt = Clock.System.now()
101+
)
102+
103+
writeopiaDb.saveDocument(documentWithWorkspace)
104+
105+
if (useAi) {
106+
sendToAiHub(listOf(documentWithWorkspace), workspaceId)
107+
}
108+
109+
return documentWithWorkspace
110+
}
111+
68112
private suspend fun sendToAiHub(documents: List<Document>, workspaceId: String,) =
69113
wrWebClient.post("${Urls.AI_HUB}/documents/") {
70114
contentType(ContentType.Application.Json)

backend/documents/documents/src/main/java/io/writeopia/api/documents/routing/DocumentsRouting.kt

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ import io.writeopia.sdk.serialization.extensions.toApi
2727
import io.writeopia.sdk.serialization.extensions.toModel
2828
import io.writeopia.sdk.serialization.json.SendDocumentsRequest
2929
import io.writeopia.sdk.serialization.json.SendFoldersRequest
30+
import io.writeopia.sdk.serialization.request.CreateFolderRequest
3031
import io.writeopia.sdk.serialization.request.ImageUploadRequest
32+
import io.writeopia.sdk.serialization.request.UpsertDocumentRequest
3133
import io.writeopia.sdk.serialization.request.WorkspaceDiffRequest
3234
import io.writeopia.sdk.serialization.response.FolderContentResponse
3335
import io.writeopia.sdk.serialization.response.WorkspaceDiffResponse
@@ -193,6 +195,35 @@ fun Routing.documentsRoute(
193195
}
194196
}
195197

198+
authenticate("auth-jwt", optional = debug) {
199+
post<CreateFolderRequest>("/api/workspace/{workspaceId}/folder/{parentFolderId}/create") { request ->
200+
val userId = getUserId() ?: ""
201+
val workspaceId = call.pathParameters["workspaceId"] ?: ""
202+
val parentFolderId = call.pathParameters["parentFolderId"] ?: ""
203+
204+
runIfMember(userId, workspaceId, writeopiaDb, debug) {
205+
try {
206+
val folder = DocumentsService.createFolder(
207+
parentFolderId = parentFolderId,
208+
title = request.title,
209+
workspaceId = workspaceId,
210+
writeopiaDb = writeopiaDb
211+
)
212+
213+
call.respond(
214+
status = HttpStatusCode.Created,
215+
message = folder.toApi()
216+
)
217+
} catch (e: Exception) {
218+
call.respond(
219+
status = HttpStatusCode.InternalServerError,
220+
message = "${e.message}"
221+
)
222+
}
223+
}
224+
}
225+
}
226+
196227
authenticate("auth-jwt", optional = debug) {
197228
post<SendDocumentsRequest>("/api/workspace/document") { request ->
198229
val userId = getUserId() ?: ""
@@ -242,6 +273,38 @@ fun Routing.documentsRoute(
242273
}
243274
}
244275

276+
authenticate("auth-jwt", optional = debug) {
277+
post<UpsertDocumentRequest>("/api/workspace/{workspaceId}/document/upsert") { request ->
278+
val userId = getUserId() ?: ""
279+
val workspaceId = call.pathParameters["workspaceId"] ?: ""
280+
281+
runIfMember(userId, workspaceId, writeopiaDb, debug) {
282+
try {
283+
val documentModel = request.document
284+
.copy(workspaceId = workspaceId)
285+
.toModel()
286+
287+
val upsertedDocument = DocumentsService.upsertDocument(
288+
document = documentModel,
289+
workspaceId = workspaceId,
290+
writeopiaDb = writeopiaDb,
291+
useAi = useAi
292+
)
293+
294+
call.respond(
295+
status = HttpStatusCode.OK,
296+
message = upsertedDocument.toApi()
297+
)
298+
} catch (e: Exception) {
299+
call.respond(
300+
status = HttpStatusCode.InternalServerError,
301+
message = "${e.message}"
302+
)
303+
}
304+
}
305+
}
306+
}
307+
245308
authenticate("auth-jwt", optional = debug) {
246309
post<SendFoldersRequest>("/api/workspace/folder") { request ->
247310
val userId = getUserId() ?: ""

0 commit comments

Comments
 (0)