1.1 --- a/src/main/kotlin/de/uapcore/lightpit/servlet/ProjectServlet.kt Tue Aug 03 13:41:32 2021 +0200 1.2 +++ b/src/main/kotlin/de/uapcore/lightpit/servlet/ProjectServlet.kt Tue Aug 03 14:08:08 2021 +0200 1.3 @@ -103,21 +103,20 @@ 1.4 selectedComponent 1.5 ) 1.6 1.7 - sealed class LookupResult<T> { 1.8 - class NotFound<T> : LookupResult<T>() 1.9 - data class Found<T>(val elem: T?) : LookupResult<T>() 1.10 - } 1.11 + private sealed interface LookupResult<T> 1.12 + private class NotFound<T> : LookupResult<T> 1.13 + private data class Found<T>(val elem: T?) : LookupResult<T> 1.14 1.15 private fun <T : HasNode> HttpRequest.lookupPathParam(paramName: String, list: List<T>): LookupResult<T> { 1.16 val node = pathParams[paramName] 1.17 return if (node == null || node == "-") { 1.18 - LookupResult.Found(null) 1.19 + Found(null) 1.20 } else { 1.21 val result = list.find { it.node == node } 1.22 if (result == null) { 1.23 - LookupResult.NotFound() 1.24 + NotFound() 1.25 } else { 1.26 - LookupResult.Found(result) 1.27 + Found(result) 1.28 } 1.29 } 1.30 } 1.31 @@ -147,7 +146,7 @@ 1.32 1.33 private fun feedPath(project: Project) = "feed/${project.node}/issues.rss" 1.34 1.35 - data class PathInfos( 1.36 + private data class PathInfos( 1.37 val projectInfo: ProjectInfo, 1.38 val version: Version?, 1.39 val component: Component? 1.40 @@ -164,20 +163,20 @@ 1.41 } 1.42 1.43 val version = when (val result = http.lookupPathParam("version", projectInfo.versions)) { 1.44 - is LookupResult.NotFound -> { 1.45 + is NotFound -> { 1.46 http.response.sendError(404) 1.47 return null 1.48 } 1.49 - is LookupResult.Found -> { 1.50 + is Found -> { 1.51 result.elem 1.52 } 1.53 } 1.54 val component = when (val result = http.lookupPathParam("component", projectInfo.components)) { 1.55 - is LookupResult.NotFound -> { 1.56 + is NotFound -> { 1.57 http.response.sendError(404) 1.58 return null 1.59 } 1.60 - is LookupResult.Found -> { 1.61 + is Found -> { 1.62 result.elem 1.63 } 1.64 } 1.65 @@ -231,7 +230,6 @@ 1.66 } 1.67 1.68 private fun projectCommit(http: HttpRequest, dao: DataAccessObject) { 1.69 - // TODO: replace defaults with throwing validator exceptions 1.70 val project = Project(http.param("id")?.toIntOrNull() ?: -1).apply { 1.71 name = http.param("name") ?: "" 1.72 node = http.param("node") ?: "" 1.73 @@ -288,11 +286,11 @@ 1.74 1.75 val version: Version 1.76 when (val result = http.lookupPathParam("version", projectInfo.versions)) { 1.77 - is LookupResult.NotFound -> { 1.78 + is NotFound -> { 1.79 http.response.sendError(404) 1.80 return 1.81 } 1.82 - is LookupResult.Found -> { 1.83 + is Found -> { 1.84 version = result.elem ?: Version(-1, projectInfo.project.id) 1.85 } 1.86 } 1.87 @@ -310,17 +308,23 @@ 1.88 } 1.89 } 1.90 1.91 - private fun versionCommit(http: HttpRequest, dao: DataAccessObject) { 1.92 + private fun obtainIdAndProject(http: HttpRequest, dao:DataAccessObject): Pair<Int, Project>? { 1.93 val id = http.param("id")?.toIntOrNull() 1.94 val projectid = http.param("projectid")?.toIntOrNull() ?: -1 1.95 val project = dao.findProject(projectid) 1.96 - if (id == null || project == null) { 1.97 + return if (id == null || project == null) { 1.98 http.response.sendError(400) 1.99 - return 1.100 + null 1.101 + } else { 1.102 + Pair(id, project) 1.103 } 1.104 + } 1.105 1.106 - // TODO: replace defaults with throwing validator exceptions 1.107 - val version = Version(id, projectid).apply { 1.108 + private fun versionCommit(http: HttpRequest, dao: DataAccessObject) { 1.109 + val idParams = obtainIdAndProject(http, dao) ?: return 1.110 + val (id, project) = idParams 1.111 + 1.112 + val version = Version(id, project.id).apply { 1.113 name = http.param("name") ?: "" 1.114 node = http.param("node") ?: "" 1.115 ordinal = http.param("ordinal")?.toIntOrNull() ?: 0 1.116 @@ -372,11 +376,11 @@ 1.117 1.118 val component: Component 1.119 when (val result = http.lookupPathParam("component", projectInfo.components)) { 1.120 - is LookupResult.NotFound -> { 1.121 + is NotFound -> { 1.122 http.response.sendError(404) 1.123 return 1.124 } 1.125 - is LookupResult.Found -> { 1.126 + is Found -> { 1.127 component = result.elem ?: Component(-1, projectInfo.project.id) 1.128 } 1.129 } 1.130 @@ -395,16 +399,10 @@ 1.131 } 1.132 1.133 private fun componentCommit(http: HttpRequest, dao: DataAccessObject) { 1.134 - val id = http.param("id")?.toIntOrNull() 1.135 - val projectid = http.param("projectid")?.toIntOrNull() ?: -1 1.136 - val project = dao.findProject(projectid) 1.137 - if (id == null || project == null) { 1.138 - http.response.sendError(400) 1.139 - return 1.140 - } 1.141 + val idParams = obtainIdAndProject(http, dao) ?: return 1.142 + val (id, project) = idParams 1.143 1.144 - // TODO: replace defaults with throwing validator exceptions 1.145 - val component = Component(id, projectid).apply { 1.146 + val component = Component(id, project.id).apply { 1.147 name = http.param("name") ?: "" 1.148 node = http.param("node") ?: "" 1.149 ordinal = http.param("ordinal")?.toIntOrNull() ?: 0 1.150 @@ -506,8 +504,6 @@ 1.151 return 1.152 } 1.153 1.154 - // TODO: throw validator exception instead of using a default 1.155 - 1.156 val commentId = http.param("commentid")?.toIntOrNull() ?: -1 1.157 if (commentId > 0) { 1.158 val comment = dao.findComment(commentId) 1.159 @@ -533,7 +529,6 @@ 1.160 1.161 private fun issueCommit(http: HttpRequest, dao: DataAccessObject) { 1.162 withPathInfo(http, dao)?.run { 1.163 - // TODO: throw validator exception instead of using defaults 1.164 val issue = Issue( 1.165 http.param("id")?.toIntOrNull() ?: -1, 1.166 project