package be.simplenotes.app.controllers import be.simplenotes.app.extensions.html import be.simplenotes.app.extensions.redirect import be.simplenotes.app.views.SettingView import be.simplenotes.domain.security.JwtPayload import be.simplenotes.domain.usecases.UserService import be.simplenotes.domain.usecases.users.delete.DeleteError import be.simplenotes.domain.usecases.users.delete.DeleteForm import org.http4k.core.* import org.http4k.core.body.form import org.http4k.core.cookie.invalidateCookie class SettingsController( private val userService: UserService, private val settingView: SettingView, ) { fun settings(request: Request, jwtPayload: JwtPayload): Response { if (request.method == Method.GET) return Response(Status.OK).html(settingView.settings(jwtPayload)) val deleteForm = request.deleteForm(jwtPayload) val result = userService.delete(deleteForm) return result.fold( { when (it) { DeleteError.Unregistered -> Response.redirect("/").invalidateCookie("Bearer") DeleteError.WrongPassword -> Response(Status.OK).html( settingView.settings( jwtPayload, error = "Wrong password" ) ) is DeleteError.InvalidForm -> Response(Status.OK).html( settingView.settings( jwtPayload, validationErrors = it.validationErrors ) ) } }, { Response.redirect("/").invalidateCookie("Bearer") } ) } private fun attachment(filename: String, contentType: String) = { response: Response -> val name = filename.replace("[^a-zA-Z0-9-_.]".toRegex(), "_") response .header("Content-Disposition", "attachment; filename=\"$name\"") .header("Content-Type", contentType) } fun export(request: Request, jwtPayload: JwtPayload): Response { val isDownload = request.form("download") != null return if (isDownload) { val filename = "simplenotes-export-${jwtPayload.username}" if (request.form("format") == "zip") { val zip = userService.exportAsZip(jwtPayload.userId) Response(Status.OK) .with(attachment("$filename.zip", "application/zip")) .body(zip) } else Response(Status.OK) .with(attachment("$filename.json", "application/json")) .body(userService.exportAsJson(jwtPayload.userId)) } else Response(Status.OK).body(userService.exportAsJson(jwtPayload.userId)).header("Content-Type", "application/json") } private fun Request.deleteForm(jwtPayload: JwtPayload) = DeleteForm(jwtPayload.username, form("password"), form("checked") != null) }