mirror of
https://github.com/TheAnachronism/docspell.git
synced 2025-06-05 22:55:58 +00:00
Include links to items into mail template
This commit is contained in:
parent
52800a51d8
commit
e1f9ae2629
@ -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])
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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]
|
||||||
|
@ -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]
|
||||||
|
|
||||||
|
@ -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}}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user