@@ -17,14 +17,22 @@ import kotlin.io.path.*
1717
1818private const val REQUIRED_DEP : String = " required"
1919
20+ @Serializable
21+ data class ModrinthProjectVersion (
22+ override val projectId : String ,
23+ override val versionId : String ,
24+ override val versionNumber : String ,
25+ override val dependencies : List <String >
26+ ) : ProjectVersion
27+
2028@Serializable
2129data class ModrinthResolvedVersion (
2230 override val projectId : String ,
2331 override val versionId : String ,
2432 override val versionNumber : String ,
2533 override val path : String ,
2634 override val dependencies : List <String >
27- ) : ProjectVersion
35+ ) : ProjectResolvedVersion
2836
2937class ModrinthPlatform (
3038 private val storagePath : Path ,
@@ -64,21 +72,33 @@ class ModrinthPlatform(
6472 }
6573
6674 override suspend fun getVersion (slug : String , versionId : String ): ProjectVersion ? {
67- val key = versionKey(versionId)
68-
69- cache.getObject<ModrinthResolvedVersion >(key)
70- ?.let { return it }
75+ val version = getCachedMRVersion(slug, versionId) ? : return null
76+ val dependencies = version.dependencies
77+ .filter { it.dependencyType == REQUIRED_DEP && it.projectId != FAPI_ID }
78+ .map(ModrinthVersionDependency ::projectId)
79+ val projectVersion = ModrinthProjectVersion (version.projectId, version.id, version.versionNumber, dependencies)
7180
72- LOGGER .info(" Fetching '{}' version {}" , slug, versionId)
81+ return projectVersion
82+ }
7383
74- val version = ModrinthAPI .getVersion(versionId) ? : return null
84+ override suspend fun getResolvedVersion (slug : String , versionId : String ): ProjectResolvedVersion ? {
85+ val version = getCachedMRVersion(slug, versionId) ? : return null
7586 val resolved = downloadVersionFile(version)
76-
77- cache.setObject(key, resolved)
78-
7987 return resolved
8088 }
8189
90+ suspend fun getCachedMRVersion (slug : String , versionId : String ): ModrinthVersion ? {
91+ val key = versionKey(versionId)
92+ val version = cache.getObject<ModrinthVersion >(key)
93+ ? : coroutineScope {
94+ LOGGER .info(" Fetching '{}' version {}" , slug, versionId)
95+ ModrinthAPI .getVersion(versionId)
96+ }
97+ ? : return null
98+ cache.setObject(key, version)
99+ return version
100+ }
101+
82102 suspend fun hasVersion (versionId : String ): Boolean {
83103 val key = versionKey(versionId)
84104 return cache.exists(key)
@@ -114,7 +134,7 @@ class ModrinthPlatform(
114134 return resolveProjectInternal(project.id, gameVersions.first(), gameVersions, fallbackLoader)
115135 }
116136
117- override suspend fun resolveProjectVersion (slug : String , gameVersion : String , loader : String ): ProjectVersion ? =
137+ override suspend fun resolveProjectVersion (slug : String , gameVersion : String , loader : String ): ProjectResolvedVersion ? =
118138 getOrComputeVersion(slug, gameVersion, listOf (gameVersion), loader, false )
119139
120140 suspend fun searchProjects (limit : Int , offset : Int , gameVersion : String , loader : String , excludeLoader : String? ): List <ProjectSearchResult >? =
0 commit comments