11package server.plugins
22
3+ import ServerDatabase
4+ import database.entity.Area
5+ import database.entity.Path
6+ import database.entity.Sector
7+ import database.entity.Zone
38import io.ktor.http.HttpHeaders
49import io.ktor.http.content.EntityTagVersion
510import io.ktor.server.http.content.LastModifiedVersion
611import io.ktor.server.plugins.conditionalheaders.ConditionalHeadersConfig
712import java.security.MessageDigest
813import server.response.FileSource
914import server.response.FileUUID
15+ import server.response.ResourceId
16+ import server.response.ResourceType
1017import storage.FileType
1118import storage.HashUtils
1219import storage.MessageDigestAlgorithm
1320
21+ @OptIn(ExperimentalStdlibApi ::class )
1422fun ConditionalHeadersConfig.configure () {
1523 version { call, outgoingContent ->
16- val fileUUID = call.response.headers[HttpHeaders .FileUUID ]
17- val fileSource = call.response.headers[HttpHeaders .FileSource ]
24+ val headers = call.response.headers
25+
26+ val fileUUID = headers[HttpHeaders .FileUUID ]
27+ val fileSource = headers[HttpHeaders .FileSource ]
1828 val fileType = FileType .entries.find { it.headerValue == fileSource }
1929 if (fileUUID != null && fileType != null ) {
2030 val file = fileType.fetcher(fileUUID)?.takeIf { it.exists() }
@@ -31,6 +41,28 @@ fun ConditionalHeadersConfig.configure() {
3141 }
3242 }
3343
44+ val resourceType = headers[HttpHeaders .ResourceType ]
45+ val resourceId = headers[HttpHeaders .ResourceId ]?.toIntOrNull()
46+ if (resourceType != null && resourceId != null ) {
47+ val resource = ServerDatabase {
48+ when (resourceType) {
49+ " Area" -> Area [resourceId]
50+ " Zone" -> Zone [resourceId]
51+ " Sector" -> Sector [resourceId]
52+ " Path" -> Path [resourceId]
53+ else -> null
54+ }
55+ }
56+ if (resource != null ) {
57+ return @version listOfNotNull(
58+ EntityTagVersion (
59+ ServerDatabase { resource.hashCode().toHexString() }
60+ ),
61+ LastModifiedVersion (resource.timestamp.toEpochMilli())
62+ )
63+ }
64+ }
65+
3466 emptyList()
3567 }
3668}
0 commit comments