Skip to content

Commit e66dc03

Browse files
authored
Exclude extension from file UUIDs (#173)
Signed-off-by: Arnau Mora Gras <[email protected]>
1 parent 6eaf36a commit e66dc03

File tree

6 files changed

+40
-15
lines changed

6 files changed

+40
-15
lines changed

src/main/kotlin/database/entity/Sector.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,18 @@ class Sector(id: EntityID<Int>): BaseEntity(id), ResponseData {
3030
var walkingTime: UInt? by Sectors.walkingTime
3131
var weight: String by Sectors.weight
3232

33+
private fun findFileByUUID(uuid: String, dir: File): File {
34+
return dir.listFiles { _, name -> name.startsWith(uuid) }
35+
?.firstOrNull()
36+
?: throw IllegalArgumentException("File ($uuid) not found in $dir")
37+
}
38+
3339
var image: File
34-
get() = File(Storage.ImagesDir, _image)
40+
get() = findFileByUUID(_image, Storage.ImagesDir)
3541
set(value) { _image = value.toRelativeString(Storage.ImagesDir) }
3642

3743
var gpx: File?
38-
get() = _gpx?.let { File(Storage.TracksDir, it) }
44+
get() = _gpx?.let { findFileByUUID(it, Storage.TracksDir) }
3945
set(value) { _gpx = value?.toRelativeString(Storage.TracksDir) }
4046

4147
var point: LatLng?

src/main/kotlin/database/serialization/SectorSerializer.kt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,17 @@ object SectorSerializer : KSerializer<Sector> {
4747
encodeBooleanElement(descriptor, idx++, value.kidsApt)
4848
encodeSerializableElement(descriptor, idx++, Sector.SunTime.serializer(), value.sunTime)
4949
encodeNullableSerializableElement(descriptor, idx++, Long.serializer(), value.walkingTime?.toLong())
50-
encodeStringElement(descriptor, idx++, value.image.toRelativeString(Storage.ImagesDir))
51-
encodeNullableSerializableElement(descriptor, idx++, String.serializer(), value.gpx?.toRelativeString(Storage.TracksDir))
50+
encodeStringElement(
51+
descriptor,
52+
idx++,
53+
value.image.toRelativeString(Storage.ImagesDir).substringBeforeLast('.')
54+
)
55+
encodeNullableSerializableElement(
56+
descriptor,
57+
idx++,
58+
String.serializer(),
59+
value.gpx?.toRelativeString(Storage.TracksDir)?.substringBeforeLast('.')
60+
)
5261
encodeNullableSerializableElement(descriptor, idx++, LatLng.serializer(), value.point)
5362
encodeStringElement(descriptor, idx++, value.weight)
5463
encodeIntElement(descriptor, idx++, value.zone.id.value)

src/test/kotlin/database/entity/DatabaseHelper.kt

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,31 @@ import data.Grade
1010
import data.LatLng
1111
import data.PitchInfo
1212
import java.io.File
13+
import java.net.URI
1314
import java.net.URL
1415
import java.time.Instant
1516
import java.time.LocalDateTime
1617
import server.DataProvider
1718
import storage.Storage
1819

1920
object DatabaseHelper {
21+
fun createTestFile(dir: File, name: String): File {
22+
return File(dir, name)
23+
.also { it.parentFile.mkdirs() }
24+
.also(File::createNewFile)
25+
.also(File::deleteOnExit)
26+
}
27+
2028
suspend fun createTestArea(
2129
displayName: String = DataProvider.SampleArea.displayName,
2230
webUrl: String = DataProvider.SampleArea.webUrl
2331
): Area = ServerDatabase.instance.query {
2432
Area.new {
2533
this.displayName = displayName
26-
this.webUrl = URL(webUrl)
34+
this.webUrl = URI.create(webUrl).toURL()
2735

2836
// Required, but not used
29-
image = File(Storage.ImagesDir, "abc")
37+
image = createTestFile(Storage.ImagesDir, "abc")
3038
}
3139
}
3240

@@ -44,8 +52,8 @@ object DatabaseHelper {
4452
this.points = points
4553

4654
// Required, but not used
47-
image = File(Storage.ImagesDir, "abc")
48-
kmz = File(Storage.TracksDir, "abc")
55+
image = createTestFile(Storage.ImagesDir, "abc")
56+
kmz = createTestFile(Storage.TracksDir, "abc")
4957

5058
// Must specify a parent
5159
this.area = area
@@ -68,8 +76,8 @@ object DatabaseHelper {
6876
this.walkingTime = walkingTime
6977

7078
// Required, but not used
71-
image = File(Storage.ImagesDir, "abc")
72-
gpx = File(Storage.TracksDir, "abc")
79+
image = createTestFile(Storage.ImagesDir, "abc")
80+
gpx = createTestFile(Storage.TracksDir, "abc")
7381

7482
// Must specify a parent
7583
this.zone = zone
@@ -133,8 +141,8 @@ object DatabaseHelper {
133141
this.description = description
134142

135143
this.images = listOf(
136-
File(Storage.ImagesDir, "abc"),
137-
File(Storage.ImagesDir, "def")
144+
createTestFile(Storage.ImagesDir, "abc"),
145+
createTestFile(Storage.ImagesDir, "def")
138146
)
139147

140148
// Must specify a parent

src/test/kotlin/database/entity/TestSector.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ class TestSector: ApplicationTestBase() {
4545
assertTrue(json.containsKey("image"))
4646
assertTrue(json.containsKey("gpx"))
4747
assertTrue(json.containsKey("point"))
48+
assertTrue(json.containsKey("weight"))
4849
assertTrue(json.containsKey("zone_id"))
4950
}
5051
}

src/test/kotlin/server/base/delete/SingleFileRemoval.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@ import java.io.File
66
class SingleFileRemoval<EntityType : BaseEntity>(
77
val fileAccessor: (EntityType) -> File?
88
) : FileRemoval<EntityType> {
9+
private val entities = mutableMapOf<Int, File?>()
10+
911
override fun exists(entity: EntityType): Boolean {
10-
val file = fileAccessor(entity)
12+
val file = entities.getOrPut(entity.id.value) { fileAccessor(entity) }
1113
return file?.exists() != false
1214
}
1315
}

src/test/kotlin/server/endpoints/delete/TestDeleteSectorEndpoint.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package server.endpoints.delete
22

33
import database.EntityTypes
4-
import database.entity.Sector
54
import kotlin.test.Test
65
import server.base.ApplicationTestBase
76
import server.base.delete.SingleFileRemoval
@@ -12,7 +11,7 @@ class TestDeleteSectorEndpoint: ApplicationTestBase() {
1211
@Test
1312
fun `test deleting Sector`() = testDeleting(
1413
EntityTypes.SECTOR,
15-
listOf(SingleFileRemoval(Sector::image), SingleFileRemoval(Sector::gpx))
14+
listOf(SingleFileRemoval { it.image }, SingleFileRemoval { it.gpx })
1615
)
1716

1817
@Test

0 commit comments

Comments
 (0)