Include links to items into mail template

This commit is contained in:
Eike Kettner 2020-04-22 21:53:25 +02:00
parent 52800a51d8
commit e1f9ae2629
9 changed files with 46 additions and 46 deletions

View File

@ -1,7 +1,7 @@
package docspell.backend package docspell.backend
import docspell.backend.signup.{Config => SignupConfig} import docspell.backend.signup.{Config => SignupConfig}
import docspell.common.MimeType import docspell.common._
import docspell.store.JdbcConfig import docspell.store.JdbcConfig
case class Config(jdbc: JdbcConfig, signup: SignupConfig, files: Config.Files) {} case class Config(jdbc: JdbcConfig, signup: SignupConfig, files: Config.Files) {}
@ -9,4 +9,5 @@ case class Config(jdbc: JdbcConfig, signup: SignupConfig, files: Config.Files) {
object Config { object Config {
case class Files(chunkSize: Int, validMimeTypes: Seq[MimeType]) case class Files(chunkSize: Int, validMimeTypes: Seq[MimeType])
} }

View File

@ -4,6 +4,7 @@ import cats.implicits._
import cats.effect._ import cats.effect._
import com.github.eikek.calev.CalEvent import com.github.eikek.calev.CalEvent
import io.circe.Encoder import io.circe.Encoder
import docspell.store.queue.JobQueue import docspell.store.queue.JobQueue
import docspell.store.usertask._ import docspell.store.usertask._
import docspell.common._ import docspell.common._
@ -76,8 +77,9 @@ object OUserTask {
CalEvent.unsafe("*-*-1/7 12:00"), CalEvent.unsafe("*-*-1/7 12:00"),
NotifyDueItemsArgs( NotifyDueItemsArgs(
account, account,
Ident.unsafe("none"), Ident.unsafe(""),
Nil, Nil,
None,
5, 5,
Nil, Nil,
Nil Nil

View File

@ -15,6 +15,7 @@ case class NotifyDueItemsArgs(
account: AccountId, account: AccountId,
smtpConnection: Ident, smtpConnection: Ident,
recipients: List[String], recipients: List[String],
itemDetailUrl: Option[LenientUri],
remindDays: Int, remindDays: Int,
tagsInclude: List[Ident], tagsInclude: List[Ident],
tagsExclude: List[Ident] tagsExclude: List[Ident]

View File

@ -7,15 +7,26 @@ import docspell.common._
import docspell.store.queries.QItem import docspell.store.queries.QItem
import docspell.joex.notify.YamuscaConverter._ import docspell.joex.notify.YamuscaConverter._
case class MailContext(items: List[MailContext.ItemData], more: Boolean, account: AccountId) case class MailContext(
items: List[MailContext.ItemData],
more: Boolean,
account: AccountId,
itemUri: Option[LenientUri]
)
object MailContext { object MailContext {
def from(items: Vector[QItem.ListItem], max: Int, account: AccountId): MailContext = def from(
items: Vector[QItem.ListItem],
max: Int,
account: AccountId,
itemBaseUri: Option[LenientUri]
): MailContext =
MailContext( MailContext(
items.take(max - 1).map(ItemData.apply).toList.sortBy(_.dueDate), items.take(max - 1).map(ItemData.apply).toList.sortBy(_.dueDate),
items.sizeCompare(max) >= 0, items.sizeCompare(max) >= 0,
account account,
itemBaseUri
) )
case class ItemData( case class ItemData(
@ -35,7 +46,6 @@ object MailContext {
ValueConverter.deriveConverter[ItemData] ValueConverter.deriveConverter[ItemData]
} }
implicit val yamusca: ValueConverter[MailContext] = implicit val yamusca: ValueConverter[MailContext] =
ValueConverter.deriveConverter[MailContext] ValueConverter.deriveConverter[MailContext]

View File

@ -9,12 +9,20 @@ object MailTemplate {
this is Docspell informing you about due items coming up. this is Docspell informing you about due items coming up.
{{#itemUri}}
{{#items}}
- [{{name}}]({{itemUri}}/{{id}}), due on *{{dueDate}}*
(received on {{date}} via {{source}})
{{/items}}
{{/itemUri}}
{{^itemUri}}
{{#items}} {{#items}}
- *{{name}}*, due on *{{dueDate}}* - *{{name}}*, due on *{{dueDate}}*
(received on {{date}} via {{source}}) (received on {{date}} via {{source}})
{{/items}} {{/items}}
{{/itemUri}}
{{#more}} {{#more}}
- ... - (There are more due items, left out for brevity)
{{/more}} {{/more}}

View File

@ -83,7 +83,8 @@ object NotifyDueItemsTask {
args: Args, args: Args,
items: Vector[QItem.ListItem] items: Vector[QItem.ListItem]
): F[Mail[F]] = Sync[F].delay { ): F[Mail[F]] = Sync[F].delay {
val templateCtx = MailContext.from(items, maxItems.toInt - 1, args.account) val templateCtx =
MailContext.from(items, maxItems.toInt, args.account, args.itemDetailUrl)
val md = MailTemplate.render(templateCtx) val md = MailTemplate.render(templateCtx)
val recp = args.recipients val recp = args.recipients
.map(MailAddress.parse) .map(MailAddress.parse)

View File

@ -1,11 +1,8 @@
package docspell.restserver package docspell.restserver
import docspell.backend.auth.Login import docspell.backend.auth.Login
import docspell.backend.signup.{Config => SignupConfig}
import docspell.store.JdbcConfig
import docspell.backend.{Config => BackendConfig} import docspell.backend.{Config => BackendConfig}
import docspell.common._ import docspell.common._
import scodec.bits.ByteVector
case class Config( case class Config(
appName: String, appName: String,
@ -17,33 +14,6 @@ case class Config(
) )
object Config { object Config {
val postgres =
JdbcConfig(
LenientUri.unsafe("jdbc:postgresql://localhost:5432/docspelldev"),
"dev",
"dev"
)
val h2 = JdbcConfig(
LenientUri.unsafe(
"jdbc:h2:./target/docspelldev.db;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE"
),
"sa",
""
)
val default: Config =
Config(
"Docspell",
Ident.unsafe("restserver1"),
LenientUri.unsafe("http://localhost:7880"),
Config.Bind("localhost", 7880),
BackendConfig(
postgres,
SignupConfig(SignupConfig.invite, Password("testpass"), Duration.hours(5 * 24)),
BackendConfig.Files(512 * 1024, List(MimeType.pdf))
),
Login.Config(ByteVector.fromValidHex("caffee"), Duration.minutes(2))
)
case class Bind(address: String, port: Int) case class Bind(address: String, port: Int)
} }

View File

@ -76,7 +76,7 @@ object RestServer {
"email/send" -> MailSendRoutes(restApp.backend, token), "email/send" -> MailSendRoutes(restApp.backend, token),
"email/settings" -> MailSettingsRoutes(restApp.backend, token), "email/settings" -> MailSettingsRoutes(restApp.backend, token),
"email/sent" -> SentMailRoutes(restApp.backend, token), "email/sent" -> SentMailRoutes(restApp.backend, token),
"usertask/notifydueitems" -> NotifyDueItemsRoutes(restApp.backend, token), "usertask/notifydueitems" -> NotifyDueItemsRoutes(cfg, restApp.backend, token),
"calevent/check" -> CalEventCheckRoutes() "calevent/check" -> CalEventCheckRoutes()
) )

View File

@ -13,10 +13,15 @@ import docspell.common._
import docspell.restapi.model._ import docspell.restapi.model._
import docspell.store.usertask._ import docspell.store.usertask._
import docspell.restserver.conv.Conversions import docspell.restserver.conv.Conversions
import docspell.restserver.Config
object NotifyDueItemsRoutes { object NotifyDueItemsRoutes {
def apply[F[_]: Effect](backend: BackendApp[F], user: AuthToken): HttpRoutes[F] = { def apply[F[_]: Effect](
cfg: Config,
backend: BackendApp[F],
user: AuthToken
): HttpRoutes[F] = {
val dsl = new Http4sDsl[F] {} val dsl = new Http4sDsl[F] {}
val ut = backend.userTask val ut = backend.userTask
import dsl._ import dsl._
@ -25,7 +30,7 @@ object NotifyDueItemsRoutes {
case req @ POST -> Root / "startonce" => case req @ POST -> Root / "startonce" =>
for { for {
data <- req.as[NotificationSettings] data <- req.as[NotificationSettings]
task = makeTask(user.account, data) task = makeTask(cfg, user.account, data)
res <- ut res <- ut
.executeNow(user.account, task) .executeNow(user.account, task)
.attempt .attempt
@ -43,7 +48,7 @@ object NotifyDueItemsRoutes {
case req @ POST -> Root => case req @ POST -> Root =>
for { for {
data <- req.as[NotificationSettings] data <- req.as[NotificationSettings]
task = makeTask(user.account, data) task = makeTask(cfg, user.account, data)
res <- ut res <- ut
.submitNotifyDueItems(user.account, task) .submitNotifyDueItems(user.account, task)
.attempt .attempt
@ -54,6 +59,7 @@ object NotifyDueItemsRoutes {
} }
def makeTask( def makeTask(
cfg: Config,
user: AccountId, user: AccountId,
settings: NotificationSettings settings: NotificationSettings
): UserTask[NotifyDueItemsArgs] = ): UserTask[NotifyDueItemsArgs] =
@ -66,6 +72,7 @@ object NotifyDueItemsRoutes {
user, user,
settings.smtpConnection, settings.smtpConnection,
settings.recipients, settings.recipients,
Some(cfg.baseUrl / "app" / "item"),
settings.remindDays, settings.remindDays,
settings.tagsInclude.map(_.id), settings.tagsInclude.map(_.id),
settings.tagsExclude.map(_.id) settings.tagsExclude.map(_.id)