76 lines
3.0 KiB
Kotlin
76 lines
3.0 KiB
Kotlin
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)
|
|
}
|