universe@184: /* universe@184: * Copyright 2021 Mike Becker. All rights reserved. universe@184: * universe@184: * Redistribution and use in source and binary forms, with or without universe@184: * modification, are permitted provided that the following conditions are met: universe@184: * universe@184: * 1. Redistributions of source code must retain the above copyright universe@184: * notice, this list of conditions and the following disclaimer. universe@184: * universe@184: * 2. Redistributions in binary form must reproduce the above copyright universe@184: * notice, this list of conditions and the following disclaimer in the universe@184: * documentation and/or other materials provided with the distribution. universe@184: * universe@184: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" universe@184: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE universe@184: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE universe@184: * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE universe@184: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL universe@184: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR universe@184: * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER universe@184: * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, universe@184: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE universe@184: * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. universe@184: */ universe@184: universe@184: package de.uapcore.lightpit.servlet universe@184: universe@247: import de.uapcore.lightpit.AbstractServlet universe@247: import de.uapcore.lightpit.HttpRequest universe@247: import de.uapcore.lightpit.ValidatedValue universe@247: import de.uapcore.lightpit.ValidationError universe@184: import de.uapcore.lightpit.dao.DataAccessObject universe@184: import de.uapcore.lightpit.entities.User universe@184: import de.uapcore.lightpit.viewmodel.UserEditView universe@184: import de.uapcore.lightpit.viewmodel.UsersView universe@254: import jakarta.servlet.annotation.WebServlet universe@184: universe@184: @WebServlet(urlPatterns = ["/users/*"]) universe@247: class UsersServlet : AbstractServlet() { universe@184: universe@184: init { universe@184: get("/", this::index) universe@184: get("/-/create", this::create) universe@184: get("/%userid/edit", this::edit) universe@184: post("/-/commit", this::commit) universe@184: } universe@184: universe@184: private val list = "users" universe@184: private val form = "user-form" universe@184: universe@209: private fun index(http: HttpRequest, dao: DataAccessObject) { universe@184: with(http) { universe@184: view = UsersView(dao.listUsers()) universe@184: render(list) universe@184: } universe@184: } universe@184: universe@209: private fun create(http: HttpRequest, dao: DataAccessObject) { universe@184: with(http) { universe@184: view = UserEditView(User(-1)) universe@184: render(form) universe@184: } universe@184: } universe@184: universe@209: private fun edit(http: HttpRequest, dao: DataAccessObject) { universe@184: val id = http.pathParams["userid"]?.toIntOrNull() universe@184: if (id == null) { universe@184: http.response.sendError(404) universe@184: } else { universe@184: val user = dao.findUser(id) universe@184: if (user == null) { universe@184: http.response.sendError(404) universe@184: } else { universe@184: with(http) { universe@184: view = UserEditView(user) universe@184: render(form) universe@184: } universe@184: } universe@184: } universe@184: } universe@184: universe@209: private fun commit(http: HttpRequest, dao: DataAccessObject) { universe@184: val id = http.param("userid")?.toIntOrNull() universe@184: if (id == null) { universe@184: http.response.sendError(400) universe@184: return universe@184: } universe@184: universe@184: val user = User(id) universe@184: with(user) { universe@184: givenname = http.param("givenname") universe@184: lastname = http.param("lastname") universe@184: mail = http.param("mail") universe@184: } universe@184: universe@209: if (user.id > 0) { universe@209: dao.updateUser(user) universe@209: http.renderCommit("users/") universe@209: } else { universe@209: val errorMessages = mutableListOf() universe@210: user.username = http.param("username", { universe@209: if (it == null) ValidationError("validation.username.null") universe@209: else if (dao.findUserByName(it) != null) ValidationError("validation.username.unique") universe@209: else ValidatedValue(it) universe@210: }, "", errorMessages) universe@209: universe@210: if (errorMessages.isEmpty()) { universe@209: dao.insertUser(user) universe@209: http.renderCommit("users/") universe@209: } else { universe@209: http.view = UserEditView(user).apply { this.errorMessages = errorMessages } universe@209: http.render(form) universe@184: } universe@184: } universe@184: } universe@184: }