src/main/kotlin/de/uapcore/lightpit/servlet/IssuesServlet.kt

Mon, 05 Aug 2024 18:40:47 +0200

author
Mike Becker <universe@uap-core.de>
date
Mon, 05 Aug 2024 18:40:47 +0200
changeset 311
bf67e0ff7131
permissions
-rw-r--r--

add new global issues page - fixes #404

package de.uapcore.lightpit.servlet

import de.uapcore.lightpit.AbstractServlet
import de.uapcore.lightpit.HttpRequest
import de.uapcore.lightpit.dao.DataAccessObject
import de.uapcore.lightpit.entities.Issue
import de.uapcore.lightpit.logic.*
import de.uapcore.lightpit.viewmodel.*
import jakarta.servlet.annotation.WebServlet

@WebServlet(urlPatterns = ["/issues/*"])
class IssuesServlet : AbstractServlet() {

    private val pathInfos = PathInfosOnlyIssues("issues/")

    init {
        get("/", this::issues)

        get("/%issue", this::issue)
        get("/%issue/edit", this::issueForm)
        post("/%issue/comment", this::issueComment)
        post("/%issue/relation", this::issueRelation)
        get("/%issue/removeRelation", this::issueRemoveRelation)
        post("/%issue/commit", this::issueCommit)
    }

    private fun issues(http: HttpRequest, dao: DataAccessObject) {
        val filter = IssueFilter(http, dao)
        val needRelationsMap = filter.onlyBlocker
        val relationsMap = if (needRelationsMap) dao.getIssueRelationMap(filter.includeDone) else emptyMap()

        val issues = dao.listIssues(filter.includeDone)
            .sortedWith(IssueSorter(filter.sortPrimary, filter.sortSecondary, filter.sortTertiary))
            .filter(issueFilterFunction(filter, relationsMap, http.remoteUser ?: "<Anonymous>"))

        with(http) {
            pageTitle = i18n("issues")
            view = IssueOverview(issues, filter)
            styleSheets = listOf("projects")
            javascript = "issue-overview"
            render("issues")
        }
    }

    private fun issue(http: HttpRequest, dao: DataAccessObject) {
        val issue = http.pathParams["issue"]?.toIntOrNull()?.let(dao::findIssue)
        if (issue == null) {
            http.response.sendError(404)
            return
        }
        renderIssueView(http, dao, issue, pathInfos)
    }

    private fun issueForm(http: HttpRequest, dao: DataAccessObject) {
        val issue = http.pathParams["issue"]?.toIntOrNull()?.let(dao::findIssue)
        if (issue == null) {
            http.response.sendError(404)
            return
        }

        with(http) {
            view = IssueEditView(
                issue,
                dao.listVersions(issue.project),
                dao.listComponents(issue.project),
                dao.listUsers(),
                issue.project
            )
            styleSheets = listOf("projects")
            javascript = "issue-editor"
            render("issue-form")
        }
    }

    private fun issueComment(http: HttpRequest, dao: DataAccessObject) {
        commitIssueComment(http, dao, pathInfos)
    }

    private fun issueCommit(http: HttpRequest, dao: DataAccessObject) {
        val reference = http.param("id")?.toIntOrNull()?.let(dao::findIssue)
        if (reference == null) {
            logger.warn("Cannot create issues while not in a project context.")
            http.response.sendError(404)
            return
        }
        val issue = Issue(reference.id, reference.project)
        processIssueForm(issue, reference, http, dao)
        if (http.param("save") != null) {
            http.renderCommit("${pathInfos.issuesHref}${issue.id}")
        } else {
            http.renderCommit(pathInfos.issuesHref)
        }
    }

    private fun issueRelation(http: HttpRequest, dao: DataAccessObject) {
        addIssueRelation(http, dao, pathInfos)
    }

    private fun issueRemoveRelation(http: HttpRequest, dao: DataAccessObject) {
        removeIssueRelation(http, dao, pathInfos)
    }
}

mercurial