14
14
15
15
package org.modelix.model.server.handlers
16
16
17
- import io.ktor.http.ContentType
18
17
import io.ktor.http.HttpStatusCode
19
18
import io.ktor.server.application.Application
20
19
import io.ktor.server.application.ApplicationCall
21
20
import io.ktor.server.application.call
22
21
import io.ktor.server.plugins.origin
23
22
import io.ktor.server.request.receive
24
- import io.ktor.server.request.receiveParameters
25
23
import io.ktor.server.response.respond
26
24
import io.ktor.server.response.respondText
27
25
import io.ktor.server.routing.Route
28
26
import io.ktor.server.routing.get
29
27
import io.ktor.server.routing.post
30
- import io.ktor.server.routing.put
31
28
import io.ktor.server.routing.route
32
29
import io.ktor.server.routing.routing
33
30
import io.ktor.server.websocket.webSocket
@@ -38,6 +35,7 @@ import kotlinx.serialization.encodeToString
38
35
import kotlinx.serialization.json.Json
39
36
import org.modelix.authorization.getUserName
40
37
import org.modelix.model.api.PBranch
38
+ import org.modelix.model.api.TreePointer
41
39
import org.modelix.model.api.getRootNode
42
40
import org.modelix.model.area.getArea
43
41
import org.modelix.model.client2.checkObjectHashes
@@ -46,14 +44,11 @@ import org.modelix.model.lazy.CLTree
46
44
import org.modelix.model.lazy.CLVersion
47
45
import org.modelix.model.lazy.RepositoryId
48
46
import org.modelix.model.operations.OTBranch
49
- import org.modelix.model.persistent.HashUtil
50
- import org.modelix.model.server.api.ModelQuery
51
47
import org.modelix.model.server.api.v2.VersionDelta
52
48
import org.modelix.model.server.store.IStoreClient
53
49
import org.modelix.model.server.store.LocalModelClient
54
50
import org.modelix.modelql.server.ModelQLServer
55
51
import org.slf4j.LoggerFactory
56
- import java.util.UUID
57
52
58
53
/* *
59
54
* Implements the endpoints used by the 'model-client', but compared to KeyValueLikeModelServer also understands what
@@ -65,10 +60,6 @@ class ModelReplicationServer(val repositoriesManager: RepositoriesManager) {
65
60
66
61
companion object {
67
62
private val LOG = LoggerFactory .getLogger(ModelReplicationServer ::class .java)
68
-
69
- private fun randomUUID (): String {
70
- return UUID .randomUUID().toString().replace(" [^a-zA-Z0-9]" .toRegex(), " " )
71
- }
72
63
}
73
64
74
65
private val modelClient: LocalModelClient get() = repositoriesManager.client
@@ -191,10 +182,43 @@ class ModelReplicationServer(val repositoriesManager: RepositoriesManager) {
191
182
}
192
183
}
193
184
}
185
+ route(" versions" ) {
186
+ route(" {versionHash}" ) {
187
+ get {
188
+ // TODO permission check on the repository ID is not sufficient, because the client could
189
+ // provide any repository ID to access a version inside a different repository.
190
+ // A check if the version belongs to the repository is required.
191
+ val baseVersionHash = call.request.queryParameters[" lastKnown" ]
192
+ val versionHash = call.parameters[" versionHash" ]!!
193
+ if (storeClient[versionHash] == null ) {
194
+ call.respondText(
195
+ " Version '$versionHash ' doesn't exist" ,
196
+ status = HttpStatusCode .NotFound ,
197
+ )
198
+ return @get
199
+ }
200
+ call.respondDelta(versionHash, baseVersionHash)
201
+ }
202
+ get(" history/{oldestVersionHash}" ) {
203
+ TODO ()
204
+ }
205
+ post(" query" ) {
206
+ val versionHash = call.parameters[" versionHash" ]!!
207
+ val version = CLVersion .loadFromHash(versionHash, repositoriesManager.client.storeCache)
208
+ val initialTree = version.getTree()
209
+ val branch = TreePointer (initialTree)
210
+ ModelQLServer .handleCall(call, branch.getRootNode(), branch.getArea())
211
+ }
212
+ }
213
+ }
194
214
}
195
215
}
196
216
route(" versions" ) {
197
217
get(" {versionHash}" ) {
218
+ // TODO versions should be stored inside a repository with permission checks.
219
+ // Knowing a version hash should not give you access to the content.
220
+ // This handler was already moved to the 'repositories' route. Removing it here would be a breaking
221
+ // change, but should be done in some future version.
198
222
val baseVersionHash = call.request.queryParameters[" lastKnown" ]
199
223
val versionHash = call.parameters[" versionHash" ]!!
200
224
if (storeClient[versionHash] == null ) {
@@ -210,47 +234,6 @@ class ModelReplicationServer(val repositoriesManager: RepositoriesManager) {
210
234
TODO ()
211
235
}
212
236
}
213
- route(" objects" ) {
214
- post {
215
- val values = call.receive<List <String >>()
216
- storeClient.putAll(values.associateBy { HashUtil .sha256(it) }, true )
217
- call.respondText(" OK" )
218
- }
219
- get(" {hash}" ) {
220
- val key = call.parameters[" hash" ]!!
221
- val value = storeClient[key]
222
- if (value == null ) {
223
- call.respondText(" object '$key ' not found" , status = HttpStatusCode .NotFound )
224
- } else {
225
- call.respondText(value)
226
- }
227
- }
228
- }
229
- route(" modelql" ) {
230
- put {
231
- val params = call.receiveParameters()
232
- val queryFromClient = params[" query" ]
233
- if (queryFromClient == null ) {
234
- call.respondText(text = " 'query' is missing" , status = HttpStatusCode .BadRequest )
235
- return @put
236
- }
237
- val query = ModelQuery .fromJson(queryFromClient)
238
- val json = query.toJson()
239
- val hash = HashUtil .sha256(json)
240
- storeClient.put(hash, json)
241
- call.respondText(text = hash)
242
- }
243
- get(" {hash}" ) {
244
- val hash = call.parameters[" hash" ]!!
245
- val json = storeClient[hash]
246
- if (json == null ) {
247
- call.respondText(status = HttpStatusCode .NotFound , text = " ModelQL with hash '$hash ' doesn't exist" )
248
- return @get
249
- }
250
- ModelQuery .fromJson(json) // ensure it's a valid ModelQuery
251
- call.respondText(json, ContentType .Application .Json )
252
- }
253
- }
254
237
}
255
238
256
239
private suspend fun ApplicationCall.respondDelta (versionHash : String , baseVersionHash : String? ) {
0 commit comments