mirror of
https://github.com/TheAnachronism/docspell.git
synced 2025-06-21 18:08:25 +00:00
Finish mail settings
This commit is contained in:
@ -2,17 +2,21 @@ package docspell.restserver.routes
|
||||
|
||||
import cats.effect._
|
||||
import cats.implicits._
|
||||
import cats.data.OptionT
|
||||
import org.http4s._
|
||||
import org.http4s.dsl.Http4sDsl
|
||||
import org.http4s.circe.CirceEntityEncoder._
|
||||
import org.http4s.circe.CirceEntityDecoder._
|
||||
import emil.MailAddress
|
||||
|
||||
import docspell.backend.BackendApp
|
||||
import docspell.backend.auth.AuthToken
|
||||
import docspell.backend.ops.OMail
|
||||
import docspell.common._
|
||||
import docspell.restapi.model._
|
||||
import docspell.store.records.RUserEmail
|
||||
import docspell.store.EmilUtil
|
||||
import docspell.restserver.conv.Conversions
|
||||
|
||||
object MailSettingsRoutes {
|
||||
|
||||
@ -29,10 +33,51 @@ object MailSettingsRoutes {
|
||||
resp <- Ok(EmailSettingsList(res.toList))
|
||||
} yield resp
|
||||
|
||||
case GET -> Root / Ident(name) =>
|
||||
(for {
|
||||
ems <- backend.mail.findSettings(user.account, name)
|
||||
resp <- OptionT.liftF(Ok(convert(ems)))
|
||||
} yield resp).getOrElseF(NotFound())
|
||||
|
||||
case req @ POST -> Root =>
|
||||
(for {
|
||||
in <- OptionT.liftF(req.as[EmailSettings])
|
||||
ru = makeSettings(in)
|
||||
up <- OptionT.liftF(ru.traverse(r => backend.mail.createSettings(user.account, r)))
|
||||
resp <- OptionT.liftF(
|
||||
Ok(
|
||||
up.fold(
|
||||
err => BasicResult(false, err),
|
||||
ar => Conversions.basicResult(ar, "Mail settings stored.")
|
||||
)
|
||||
)
|
||||
)
|
||||
} yield resp).getOrElseF(NotFound())
|
||||
|
||||
case req @ PUT -> Root / Ident(name) =>
|
||||
(for {
|
||||
in <- OptionT.liftF(req.as[EmailSettings])
|
||||
ru = makeSettings(in)
|
||||
up <- OptionT.liftF(ru.traverse(r => backend.mail.updateSettings(user.account, name, r)))
|
||||
resp <- OptionT.liftF(
|
||||
Ok(
|
||||
up.fold(
|
||||
err => BasicResult(false, err),
|
||||
n =>
|
||||
if (n > 0) BasicResult(true, "Mail settings stored.")
|
||||
else BasicResult(false, "Mail settings could not be saved")
|
||||
)
|
||||
)
|
||||
)
|
||||
} yield resp).getOrElseF(NotFound())
|
||||
|
||||
case DELETE -> Root / Ident(name) =>
|
||||
for {
|
||||
in <- req.as[EmailSettings]
|
||||
resp <- Ok(BasicResult(false, "not implemented"))
|
||||
n <- backend.mail.deleteSettings(user.account, name)
|
||||
resp <- Ok(
|
||||
if (n > 0) BasicResult(true, "Mail settings removed")
|
||||
else BasicResult(false, "Mail settings could not be removed")
|
||||
)
|
||||
} yield resp
|
||||
}
|
||||
|
||||
@ -50,4 +95,29 @@ object MailSettingsRoutes {
|
||||
EmilUtil.sslTypeString(ru.smtpSsl),
|
||||
!ru.smtpCertCheck
|
||||
)
|
||||
|
||||
def makeSettings(ems: EmailSettings): Either[String, OMail.SmtpSettings] = {
|
||||
def readMail(str: String): Either[String, MailAddress] =
|
||||
EmilUtil.readMailAddress(str).left.map(err => s"E-Mail address '$str' invalid: $err")
|
||||
|
||||
def readMailOpt(str: Option[String]): Either[String, Option[MailAddress]] =
|
||||
str.traverse(readMail)
|
||||
|
||||
for {
|
||||
from <- readMail(ems.from)
|
||||
repl <- readMailOpt(ems.replyTo)
|
||||
sslt <- EmilUtil.readSSLType(ems.sslType)
|
||||
} yield OMail.SmtpSettings(
|
||||
ems.name,
|
||||
ems.smtpHost,
|
||||
ems.smtpPort,
|
||||
ems.smtpUser,
|
||||
ems.smtpPassword,
|
||||
sslt,
|
||||
!ems.ignoreCertificates,
|
||||
from,
|
||||
repl
|
||||
)
|
||||
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user