1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/main/kotlin/de/uapcore/lightpit/viewmodel/PathInfos.kt Mon Oct 30 14:44:36 2023 +0100 1.3 @@ -0,0 +1,73 @@ 1.4 +/* 1.5 + * Copyright 2023 Mike Becker. All rights reserved. 1.6 + * 1.7 + * Redistribution and use in source and binary forms, with or without 1.8 + * modification, are permitted provided that the following conditions are met: 1.9 + * 1.10 + * 1. Redistributions of source code must retain the above copyright 1.11 + * notice, this list of conditions and the following disclaimer. 1.12 + * 1.13 + * 2. Redistributions in binary form must reproduce the above copyright 1.14 + * notice, this list of conditions and the following disclaimer in the 1.15 + * documentation and/or other materials provided with the distribution. 1.16 + * 1.17 + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 1.18 + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1.19 + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 1.20 + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 1.21 + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1.22 + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 1.23 + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 1.24 + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 1.25 + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 1.26 + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 1.27 + */ 1.28 + 1.29 +package de.uapcore.lightpit.viewmodel 1.30 + 1.31 +import de.uapcore.lightpit.HttpRequest 1.32 +import de.uapcore.lightpit.OptionalPathInfo 1.33 +import de.uapcore.lightpit.dao.DataAccessObject 1.34 +import de.uapcore.lightpit.entities.Component 1.35 +import de.uapcore.lightpit.entities.Version 1.36 + 1.37 +data class PathInfos( 1.38 + val projectInfo: ProjectInfo, 1.39 + val versionInfo: OptionalPathInfo<Version>, 1.40 + val componentInfo: OptionalPathInfo<Component> 1.41 +) { 1.42 + val issuesHref by lazyOf("projects/${projectInfo.project.node}/issues/${versionInfo.node}/${componentInfo.node}/") 1.43 +} 1.44 + 1.45 +private fun obtainProjectInfo(http: HttpRequest, dao: DataAccessObject): ProjectInfo? { 1.46 + val pathParam = http.pathParams["project"] ?: return null 1.47 + val project = dao.findProjectByNode(pathParam) ?: return null 1.48 + 1.49 + val versions: List<Version> = dao.listVersions(project) 1.50 + val components: List<Component> = dao.listComponents(project) 1.51 + 1.52 + return ProjectInfo( 1.53 + project, 1.54 + versions, 1.55 + components, 1.56 + dao.collectIssueSummary(project) 1.57 + ) 1.58 +} 1.59 + 1.60 +fun withPathInfo(http: HttpRequest, dao: DataAccessObject): PathInfos? { 1.61 + val projectInfo = obtainProjectInfo(http, dao) 1.62 + if (projectInfo == null) { 1.63 + http.response.sendError(404) 1.64 + return null 1.65 + } 1.66 + 1.67 + val version = http.lookupPathParam("version", projectInfo.versions) 1.68 + val component = http.lookupPathParam("component", projectInfo.components) 1.69 + 1.70 + if (version == OptionalPathInfo.NotFound || component == OptionalPathInfo.NotFound) { 1.71 + http.response.sendError(404) 1.72 + return null 1.73 + } 1.74 + 1.75 + return PathInfos(projectInfo, version, component) 1.76 +}