|
1 /* |
|
2 * Copyright 2023 Mike Becker. All rights reserved. |
|
3 * |
|
4 * Redistribution and use in source and binary forms, with or without |
|
5 * modification, are permitted provided that the following conditions are met: |
|
6 * |
|
7 * 1. Redistributions of source code must retain the above copyright |
|
8 * notice, this list of conditions and the following disclaimer. |
|
9 * |
|
10 * 2. Redistributions in binary form must reproduce the above copyright |
|
11 * notice, this list of conditions and the following disclaimer in the |
|
12 * documentation and/or other materials provided with the distribution. |
|
13 * |
|
14 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
|
15 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
|
17 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE |
|
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
|
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
|
20 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
|
21 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
|
22 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
24 */ |
|
25 |
|
26 package de.uapcore.lightpit.viewmodel |
|
27 |
|
28 import de.uapcore.lightpit.HttpRequest |
|
29 import de.uapcore.lightpit.OptionalPathInfo |
|
30 import de.uapcore.lightpit.dao.DataAccessObject |
|
31 import de.uapcore.lightpit.entities.Component |
|
32 import de.uapcore.lightpit.entities.Version |
|
33 |
|
34 data class PathInfos( |
|
35 val projectInfo: ProjectInfo, |
|
36 val versionInfo: OptionalPathInfo<Version>, |
|
37 val componentInfo: OptionalPathInfo<Component> |
|
38 ) { |
|
39 val issuesHref by lazyOf("projects/${projectInfo.project.node}/issues/${versionInfo.node}/${componentInfo.node}/") |
|
40 } |
|
41 |
|
42 private fun obtainProjectInfo(http: HttpRequest, dao: DataAccessObject): ProjectInfo? { |
|
43 val pathParam = http.pathParams["project"] ?: return null |
|
44 val project = dao.findProjectByNode(pathParam) ?: return null |
|
45 |
|
46 val versions: List<Version> = dao.listVersions(project) |
|
47 val components: List<Component> = dao.listComponents(project) |
|
48 |
|
49 return ProjectInfo( |
|
50 project, |
|
51 versions, |
|
52 components, |
|
53 dao.collectIssueSummary(project) |
|
54 ) |
|
55 } |
|
56 |
|
57 fun withPathInfo(http: HttpRequest, dao: DataAccessObject): PathInfos? { |
|
58 val projectInfo = obtainProjectInfo(http, dao) |
|
59 if (projectInfo == null) { |
|
60 http.response.sendError(404) |
|
61 return null |
|
62 } |
|
63 |
|
64 val version = http.lookupPathParam("version", projectInfo.versions) |
|
65 val component = http.lookupPathParam("component", projectInfo.components) |
|
66 |
|
67 if (version == OptionalPathInfo.NotFound || component == OptionalPathInfo.NotFound) { |
|
68 http.response.sendError(404) |
|
69 return null |
|
70 } |
|
71 |
|
72 return PathInfos(projectInfo, version, component) |
|
73 } |