Skip to content

Commit 7e3a156

Browse files
committed
Implement DELETE method for events
1 parent 7ad3b4d commit 7e3a156

File tree

3 files changed

+81
-7
lines changed

3 files changed

+81
-7
lines changed

README.md

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,15 +86,33 @@ Example:
8686
`http://127.0.0.1:8080/event_api/v1/event?limit=5&software_version=~19._&beam_particle=~A_&track_number=11|`
8787

8888

89-
#### Create event records in the metadata catalog:
89+
#### Create event records in the metadata catalog (Writer or Admin role required):
9090
`POST /event_api/v1/event`
9191

9292
Message body must contain the JSON list of events using format as given below.
9393

94-
#### TODO: Delete event records from the metadata catalog
94+
#### Read software records from dictionary
95+
`GET /event_api/v1/software`
96+
97+
#### Create software record in dictionary
98+
`POST /event_api/v1/software`
99+
100+
Message body example `{"software_id": 100, "software_version": "22.11"}`
101+
102+
#### Read storage records from dictionary
103+
`GET /event_api/v1/storage`
104+
105+
#### Create storage record in dictionary
106+
`POST /event_api/v1/storage`
107+
108+
Message body example `{"storage_id": 100, "storage_name": "data1"}`
109+
110+
111+
#### Delete event records from the metadata catalog (Admin role required)
95112
`DELETE /event_api/v1/event`
96113

97-
Message body must contain the JSON list of events (only `reference:` part required).
114+
Message body must contain the JSON list of events (only `reference:` part is required, other fields are
115+
optional and ignored, if present).
98116

99117
#### TODO: Count number of entries in EMS and return just this value
100118
`GET /count[?parameter1=value1[&parameter2=value2[...]]]`

src/jvmMain/kotlin/Application.kt

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -417,11 +417,59 @@ fun Application.main() {
417417
delete("/${EVENT_ENTITY_API_NAME}") {
418418
val roles = call.principal<WithRoles>()?.roles!!
419419
if (!roles.isAdmin) {
420-
call.respond(HttpStatusCode.Unauthorized)
420+
call.respond(HttpStatusCode.Unauthorized, "Only user with Admin role can delete events")
421421
return@delete
422-
} else {
423-
call.respond(HttpStatusCode.NotImplemented)
424-
TODO("To be implemented")
422+
}
423+
var connEMD: Connection? = null
424+
var deletedCount = 0
425+
try {
426+
// Here, we only care about reference to event, other event data is optional and is ignored, if passed
427+
val events = call.receive<Array<EventReprForDelete>>()
428+
connEMD = newEMDConnection(config, this.context)
429+
val storageMap = getStorageMap(connEMD!!)
430+
events.forEach { event ->
431+
println("Deleting event: $event")
432+
// val software_id = softwareMap.str_to_id[event.software_version]
433+
val file_path = event.reference.file_path
434+
val storage_name = event.reference.storage_name
435+
val storage_id = storageMap.str_to_id[storage_name]
436+
437+
val file_guid: Int
438+
val res = connEMD!!.createStatement().executeQuery(
439+
"""SELECT file_guid FROM file_ WHERE
440+
storage_id = $storage_id AND file_path = '$file_path'
441+
""".trimMargin()
442+
)
443+
if (res.next()) {
444+
file_guid = res.getInt("file_guid")
445+
println("File GUID = $file_guid")
446+
} else { // no such file
447+
call.respond(HttpStatusCode.NotFound, "Error: file_guid not found for event")
448+
return@delete
449+
}
450+
val query = """
451+
DELETE FROM ${page.db_table_name}
452+
WHERE (("file_guid" = $file_guid AND "event_number" = ${event.reference.event_number}));
453+
""".trimIndent()
454+
println(query)
455+
val intRes = connEMD!!.createStatement().executeUpdate(query)
456+
if (intRes == 1) {
457+
deletedCount++
458+
}
459+
}
460+
call.respond(HttpStatusCode.OK, "Overall $deletedCount events were deleted")
461+
} catch (err: PSQLException) {
462+
if (err.toString().contains("The connection attempt failed.")) {
463+
call.respond(HttpStatusCode.ServiceUnavailable, "Database connection failed: $err")
464+
} else {
465+
call.respond(HttpStatusCode.Conflict, "Database error: $err")
466+
}
467+
} catch (err: BadRequestException) {
468+
call.respond(HttpStatusCode.UnprocessableEntity, "Error processing content: $err")
469+
} catch (err: Exception) {
470+
call.respond(HttpStatusCode.InternalServerError, "Error deleting events: $err")
471+
} finally {
472+
connEMD?.close()
425473
}
426474
}
427475

src/jvmMain/kotlin/models.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,11 @@ data class Reference(
1313
val file_path: String,
1414
val event_number: Int
1515
)
16+
17+
data class EventReprForDelete(
18+
val reference: Reference,
19+
val software_version: String? = "",
20+
val period_number: Short? = 0,
21+
val run_number: Int? = 0,
22+
val parameters: Map<String, Any>?
23+
)

0 commit comments

Comments
 (0)