mirror of
https://github.com/TheAnachronism/docspell.git
synced 2025-04-05 10:59:33 +00:00
Move user task to scheduler module
This commit is contained in:
parent
83d3644b39
commit
69765f05ff
@ -15,8 +15,8 @@ import docspell.ftsclient.FtsClient
|
|||||||
import docspell.notification.api.{EventExchange, NotificationModule}
|
import docspell.notification.api.{EventExchange, NotificationModule}
|
||||||
import docspell.pubsub.api.PubSubT
|
import docspell.pubsub.api.PubSubT
|
||||||
import docspell.scheduler.msg.JobQueuePublish
|
import docspell.scheduler.msg.JobQueuePublish
|
||||||
|
import docspell.scheduler.usertask.UserTaskStore
|
||||||
import docspell.store.Store
|
import docspell.store.Store
|
||||||
import docspell.store.usertask.UserTaskStore
|
|
||||||
import docspell.totp.Totp
|
import docspell.totp.Totp
|
||||||
import emil.Emil
|
import emil.Emil
|
||||||
|
|
||||||
|
@ -16,10 +16,10 @@ import docspell.common._
|
|||||||
import docspell.store.UpdateResult
|
import docspell.store.UpdateResult
|
||||||
import docspell.store.queries.{QCollective, QUser}
|
import docspell.store.queries.{QCollective, QUser}
|
||||||
import docspell.store.records._
|
import docspell.store.records._
|
||||||
import docspell.store.usertask.{UserTask, UserTaskScope, UserTaskStore}
|
|
||||||
import docspell.store.{AddResult, Store}
|
import docspell.store.{AddResult, Store}
|
||||||
import com.github.eikek.calev._
|
import com.github.eikek.calev._
|
||||||
import docspell.scheduler.JobQueue
|
import docspell.scheduler.JobQueue
|
||||||
|
import docspell.scheduler.usertask.{UserTask, UserTaskScope, UserTaskStore}
|
||||||
|
|
||||||
trait OCollective[F[_]] {
|
trait OCollective[F[_]] {
|
||||||
|
|
||||||
|
@ -13,9 +13,9 @@ import fs2.Stream
|
|||||||
import docspell.common._
|
import docspell.common._
|
||||||
import docspell.notification.api.{ChannelRef, PeriodicDueItemsArgs, PeriodicQueryArgs}
|
import docspell.notification.api.{ChannelRef, PeriodicDueItemsArgs, PeriodicQueryArgs}
|
||||||
import docspell.scheduler.JobQueue
|
import docspell.scheduler.JobQueue
|
||||||
|
import docspell.scheduler.usertask.{UserTask, UserTaskScope, UserTaskStore}
|
||||||
import docspell.store.Store
|
import docspell.store.Store
|
||||||
import docspell.store.records.RNotificationChannel
|
import docspell.store.records.RNotificationChannel
|
||||||
import docspell.store.usertask._
|
|
||||||
import io.circe.Encoder
|
import io.circe.Encoder
|
||||||
|
|
||||||
trait OUserTask[F[_]] {
|
trait OUserTask[F[_]] {
|
||||||
|
@ -41,10 +41,9 @@ import docspell.notification.api.NotificationModule
|
|||||||
import docspell.notification.impl.NotificationModuleImpl
|
import docspell.notification.impl.NotificationModuleImpl
|
||||||
import docspell.pubsub.api.{PubSub, PubSubT}
|
import docspell.pubsub.api.{PubSub, PubSubT}
|
||||||
import docspell.scheduler.msg.JobQueuePublish
|
import docspell.scheduler.msg.JobQueuePublish
|
||||||
|
import docspell.scheduler.usertask.{UserTaskScope, UserTaskStore}
|
||||||
import docspell.store.Store
|
import docspell.store.Store
|
||||||
import docspell.store.records.{REmptyTrashSetting, RJobLog}
|
import docspell.store.records.{REmptyTrashSetting, RJobLog}
|
||||||
import docspell.store.usertask.UserTaskScope
|
|
||||||
import docspell.store.usertask.UserTaskStore
|
|
||||||
import emil.javamail._
|
import emil.javamail._
|
||||||
import org.http4s.client.Client
|
import org.http4s.client.Client
|
||||||
|
|
||||||
|
@ -9,14 +9,12 @@ package docspell.joex.emptytrash
|
|||||||
import cats.effect._
|
import cats.effect._
|
||||||
import cats.implicits._
|
import cats.implicits._
|
||||||
import fs2.Stream
|
import fs2.Stream
|
||||||
|
|
||||||
import docspell.backend.ops.{OItem, OItemSearch}
|
import docspell.backend.ops.{OItem, OItemSearch}
|
||||||
import docspell.common._
|
import docspell.common._
|
||||||
import docspell.scheduler._
|
import docspell.scheduler._
|
||||||
import docspell.store.records.RItem
|
import docspell.store.records.RItem
|
||||||
import docspell.store.usertask.UserTask
|
|
||||||
|
|
||||||
import com.github.eikek.calev.CalEvent
|
import com.github.eikek.calev.CalEvent
|
||||||
|
import docspell.scheduler.usertask.UserTask
|
||||||
|
|
||||||
object EmptyTrashTask {
|
object EmptyTrashTask {
|
||||||
type Args = EmptyTrashArgs
|
type Args = EmptyTrashArgs
|
||||||
|
@ -8,16 +8,14 @@ package docspell.joex.hk
|
|||||||
|
|
||||||
import cats.effect._
|
import cats.effect._
|
||||||
import cats.implicits._
|
import cats.implicits._
|
||||||
|
|
||||||
import docspell.backend.ops.OFileRepository
|
import docspell.backend.ops.OFileRepository
|
||||||
import docspell.common._
|
import docspell.common._
|
||||||
import docspell.joex.Config
|
import docspell.joex.Config
|
||||||
import docspell.joex.filecopy.FileIntegrityCheckTask
|
import docspell.joex.filecopy.FileIntegrityCheckTask
|
||||||
import docspell.scheduler.{JobTaskResultEncoder, Task}
|
import docspell.scheduler.{JobTaskResultEncoder, Task}
|
||||||
import docspell.store.records._
|
import docspell.store.records._
|
||||||
import docspell.store.usertask.UserTaskScope
|
|
||||||
|
|
||||||
import com.github.eikek.calev._
|
import com.github.eikek.calev._
|
||||||
|
import docspell.scheduler.usertask.{QUserTask, UserTaskScope}
|
||||||
import io.circe.Encoder
|
import io.circe.Encoder
|
||||||
import io.circe.generic.semiauto.deriveEncoder
|
import io.circe.generic.semiauto.deriveEncoder
|
||||||
|
|
||||||
@ -48,7 +46,7 @@ object HouseKeepingTask {
|
|||||||
Task.log[F, Unit](_.warn("Cancelling house-keeping task"))
|
Task.log[F, Unit](_.warn("Cancelling house-keeping task"))
|
||||||
|
|
||||||
def periodicTask[F[_]: Sync](ce: CalEvent): F[RPeriodicTask] =
|
def periodicTask[F[_]: Sync](ce: CalEvent): F[RPeriodicTask] =
|
||||||
RPeriodicTask
|
QUserTask
|
||||||
.createJson(
|
.createJson(
|
||||||
true,
|
true,
|
||||||
UserTaskScope(DocspellSystem.taskGroup),
|
UserTaskScope(DocspellSystem.taskGroup),
|
||||||
|
@ -9,15 +9,12 @@ package docspell.joex.updatecheck
|
|||||||
import cats.data.OptionT
|
import cats.data.OptionT
|
||||||
import cats.effect._
|
import cats.effect._
|
||||||
import cats.implicits._
|
import cats.implicits._
|
||||||
|
|
||||||
import docspell.common._
|
import docspell.common._
|
||||||
import docspell.scheduler.Context
|
import docspell.scheduler.Context
|
||||||
import docspell.scheduler.Task
|
import docspell.scheduler.Task
|
||||||
|
import docspell.scheduler.usertask.{UserTask, UserTaskScope}
|
||||||
import docspell.store.records.RPeriodicTask
|
import docspell.store.records.RPeriodicTask
|
||||||
import docspell.store.records.RUserEmail
|
import docspell.store.records.RUserEmail
|
||||||
import docspell.store.usertask.UserTask
|
|
||||||
import docspell.store.usertask.UserTaskScope
|
|
||||||
|
|
||||||
import emil._
|
import emil._
|
||||||
|
|
||||||
object UpdateCheckTask {
|
object UpdateCheckTask {
|
||||||
|
@ -9,7 +9,6 @@ package docspell.restserver.routes
|
|||||||
import cats.data.OptionT
|
import cats.data.OptionT
|
||||||
import cats.effect._
|
import cats.effect._
|
||||||
import cats.implicits._
|
import cats.implicits._
|
||||||
|
|
||||||
import docspell.backend.BackendApp
|
import docspell.backend.BackendApp
|
||||||
import docspell.backend.MailAddressCodec
|
import docspell.backend.MailAddressCodec
|
||||||
import docspell.backend.auth.AuthToken
|
import docspell.backend.auth.AuthToken
|
||||||
@ -19,8 +18,7 @@ import docspell.restapi.model._
|
|||||||
import docspell.restserver.Config
|
import docspell.restserver.Config
|
||||||
import docspell.restserver.conv.{Conversions, NonEmptyListSupport}
|
import docspell.restserver.conv.{Conversions, NonEmptyListSupport}
|
||||||
import docspell.restserver.http4s.ClientRequestInfo
|
import docspell.restserver.http4s.ClientRequestInfo
|
||||||
import docspell.store.usertask._
|
import docspell.scheduler.usertask._
|
||||||
|
|
||||||
import org.http4s._
|
import org.http4s._
|
||||||
import org.http4s.circe.CirceEntityDecoder._
|
import org.http4s.circe.CirceEntityDecoder._
|
||||||
import org.http4s.circe.CirceEntityEncoder._
|
import org.http4s.circe.CirceEntityEncoder._
|
||||||
|
@ -9,7 +9,6 @@ package docspell.restserver.routes
|
|||||||
import cats.data.{NonEmptyList, OptionT}
|
import cats.data.{NonEmptyList, OptionT}
|
||||||
import cats.effect._
|
import cats.effect._
|
||||||
import cats.implicits._
|
import cats.implicits._
|
||||||
|
|
||||||
import docspell.backend.BackendApp
|
import docspell.backend.BackendApp
|
||||||
import docspell.backend.MailAddressCodec
|
import docspell.backend.MailAddressCodec
|
||||||
import docspell.backend.auth.AuthToken
|
import docspell.backend.auth.AuthToken
|
||||||
@ -20,8 +19,7 @@ import docspell.restapi.model._
|
|||||||
import docspell.restserver.Config
|
import docspell.restserver.Config
|
||||||
import docspell.restserver.conv.{Conversions, NonEmptyListSupport}
|
import docspell.restserver.conv.{Conversions, NonEmptyListSupport}
|
||||||
import docspell.restserver.http4s.ClientRequestInfo
|
import docspell.restserver.http4s.ClientRequestInfo
|
||||||
import docspell.store.usertask._
|
import docspell.scheduler.usertask._
|
||||||
|
|
||||||
import org.http4s._
|
import org.http4s._
|
||||||
import org.http4s.circe.CirceEntityDecoder._
|
import org.http4s.circe.CirceEntityDecoder._
|
||||||
import org.http4s.circe.CirceEntityEncoder._
|
import org.http4s.circe.CirceEntityEncoder._
|
||||||
|
@ -9,14 +9,12 @@ package docspell.restserver.routes
|
|||||||
import cats.data.OptionT
|
import cats.data.OptionT
|
||||||
import cats.effect._
|
import cats.effect._
|
||||||
import cats.implicits._
|
import cats.implicits._
|
||||||
|
|
||||||
import docspell.backend.BackendApp
|
import docspell.backend.BackendApp
|
||||||
import docspell.backend.auth.AuthToken
|
import docspell.backend.auth.AuthToken
|
||||||
import docspell.common._
|
import docspell.common._
|
||||||
import docspell.restapi.model._
|
import docspell.restapi.model._
|
||||||
import docspell.restserver.conv.Conversions
|
import docspell.restserver.conv.Conversions
|
||||||
import docspell.store.usertask._
|
import docspell.scheduler.usertask._
|
||||||
|
|
||||||
import org.http4s._
|
import org.http4s._
|
||||||
import org.http4s.circe.CirceEntityDecoder._
|
import org.http4s.circe.CirceEntityDecoder._
|
||||||
import org.http4s.circe.CirceEntityEncoder._
|
import org.http4s.circe.CirceEntityEncoder._
|
||||||
|
@ -1,20 +1,15 @@
|
|||||||
/*
|
package docspell.scheduler.usertask
|
||||||
* Copyright 2020 Eike K. & Contributors
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
*/
|
|
||||||
|
|
||||||
package docspell.store.queries
|
|
||||||
|
|
||||||
import fs2._
|
|
||||||
|
|
||||||
|
import cats.implicits._
|
||||||
|
import cats.effect.Sync
|
||||||
|
import com.github.eikek.calev.CalEvent
|
||||||
import docspell.common._
|
import docspell.common._
|
||||||
|
import docspell.store.qb.DML
|
||||||
import docspell.store.qb.DSL._
|
import docspell.store.qb.DSL._
|
||||||
import docspell.store.qb._
|
import docspell.store.records.RPeriodicTask
|
||||||
import docspell.store.records._
|
import doobie.ConnectionIO
|
||||||
import docspell.store.usertask.{UserTask, UserTaskScope}
|
import fs2.Stream
|
||||||
|
import io.circe.Encoder
|
||||||
import doobie._
|
|
||||||
|
|
||||||
object QUserTask {
|
object QUserTask {
|
||||||
private val RT = RPeriodicTask.T
|
private val RT = RPeriodicTask.T
|
||||||
@ -101,4 +96,64 @@ object QUserTask {
|
|||||||
def makeUserTask(r: RPeriodicTask): UserTask[String] =
|
def makeUserTask(r: RPeriodicTask): UserTask[String] =
|
||||||
UserTask(r.id, r.task, r.enabled, r.timer, r.summary, r.args)
|
UserTask(r.id, r.task, r.enabled, r.timer, r.summary, r.args)
|
||||||
|
|
||||||
|
def create[F[_]: Sync](
|
||||||
|
enabled: Boolean,
|
||||||
|
scope: UserTaskScope,
|
||||||
|
task: Ident,
|
||||||
|
args: String,
|
||||||
|
subject: String,
|
||||||
|
priority: Priority,
|
||||||
|
timer: CalEvent,
|
||||||
|
summary: Option[String]
|
||||||
|
): F[RPeriodicTask] =
|
||||||
|
Ident
|
||||||
|
.randomId[F]
|
||||||
|
.flatMap(id =>
|
||||||
|
Timestamp
|
||||||
|
.current[F]
|
||||||
|
.map { now =>
|
||||||
|
RPeriodicTask(
|
||||||
|
id,
|
||||||
|
enabled,
|
||||||
|
task,
|
||||||
|
scope.collective,
|
||||||
|
args,
|
||||||
|
subject,
|
||||||
|
scope.fold(_.user, identity),
|
||||||
|
priority,
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
timer,
|
||||||
|
timer
|
||||||
|
.nextElapse(now.atZone(Timestamp.UTC))
|
||||||
|
.map(_.toInstant)
|
||||||
|
.map(Timestamp.apply)
|
||||||
|
.getOrElse(Timestamp.Epoch),
|
||||||
|
now,
|
||||||
|
summary
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
def createJson[F[_]: Sync, A](
|
||||||
|
enabled: Boolean,
|
||||||
|
scope: UserTaskScope,
|
||||||
|
task: Ident,
|
||||||
|
args: A,
|
||||||
|
subject: String,
|
||||||
|
priority: Priority,
|
||||||
|
timer: CalEvent,
|
||||||
|
summary: Option[String]
|
||||||
|
)(implicit E: Encoder[A]): F[RPeriodicTask] =
|
||||||
|
create[F](
|
||||||
|
enabled,
|
||||||
|
scope,
|
||||||
|
task,
|
||||||
|
E(args).noSpaces,
|
||||||
|
subject,
|
||||||
|
priority,
|
||||||
|
timer,
|
||||||
|
summary
|
||||||
|
)
|
||||||
|
|
||||||
}
|
}
|
@ -4,18 +4,15 @@
|
|||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package docspell.store.usertask
|
package docspell.scheduler.usertask
|
||||||
|
|
||||||
import cats.effect._
|
import cats.effect._
|
||||||
import cats.implicits._
|
import cats.implicits._
|
||||||
|
import com.github.eikek.calev.CalEvent
|
||||||
import docspell.common._
|
import docspell.common._
|
||||||
import docspell.common.syntax.all._
|
import docspell.common.syntax.all._
|
||||||
import docspell.store.records.RPeriodicTask
|
import docspell.store.records.RPeriodicTask
|
||||||
|
import io.circe.{Decoder, Encoder}
|
||||||
import com.github.eikek.calev.CalEvent
|
|
||||||
import io.circe.Decoder
|
|
||||||
import io.circe.Encoder
|
|
||||||
|
|
||||||
case class UserTask[A](
|
case class UserTask[A](
|
||||||
id: Ident,
|
id: Ident,
|
||||||
@ -51,7 +48,7 @@ object UserTask {
|
|||||||
scope: UserTaskScope,
|
scope: UserTaskScope,
|
||||||
subject: Option[String]
|
subject: Option[String]
|
||||||
): F[RPeriodicTask] =
|
): F[RPeriodicTask] =
|
||||||
RPeriodicTask
|
QUserTask
|
||||||
.create[F](
|
.create[F](
|
||||||
ut.enabled,
|
ut.enabled,
|
||||||
scope,
|
scope,
|
@ -4,7 +4,7 @@
|
|||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package docspell.store.usertask
|
package docspell.scheduler.usertask
|
||||||
|
|
||||||
import docspell.common._
|
import docspell.common._
|
||||||
|
|
@ -4,17 +4,14 @@
|
|||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package docspell.store.usertask
|
package docspell.scheduler.usertask
|
||||||
|
|
||||||
import cats.data.OptionT
|
import cats.data.OptionT
|
||||||
import cats.effect._
|
import cats.effect._
|
||||||
import cats.implicits._
|
import cats.implicits._
|
||||||
import fs2.Stream
|
|
||||||
|
|
||||||
import docspell.common._
|
import docspell.common._
|
||||||
import docspell.store.queries.QUserTask
|
|
||||||
import docspell.store.{AddResult, Store}
|
import docspell.store.{AddResult, Store}
|
||||||
|
import fs2.Stream
|
||||||
import io.circe._
|
import io.circe._
|
||||||
|
|
||||||
/** User tasks are `RPeriodicTask`s that can be managed by the user. The user can change
|
/** User tasks are `RPeriodicTask`s that can be managed by the user. The user can change
|
@ -9,16 +9,12 @@ package docspell.store.records
|
|||||||
import cats.data.NonEmptyList
|
import cats.data.NonEmptyList
|
||||||
import cats.effect._
|
import cats.effect._
|
||||||
import cats.implicits._
|
import cats.implicits._
|
||||||
|
|
||||||
import docspell.common._
|
import docspell.common._
|
||||||
import docspell.store.qb.DSL._
|
import docspell.store.qb.DSL._
|
||||||
import docspell.store.qb._
|
import docspell.store.qb._
|
||||||
import docspell.store.usertask.UserTaskScope
|
|
||||||
|
|
||||||
import com.github.eikek.calev.CalEvent
|
import com.github.eikek.calev.CalEvent
|
||||||
import doobie._
|
import doobie._
|
||||||
import doobie.implicits._
|
import doobie.implicits._
|
||||||
import io.circe.Encoder
|
|
||||||
|
|
||||||
/** A periodic task is a special job description, that shares a few properties of a
|
/** A periodic task is a special job description, that shares a few properties of a
|
||||||
* `RJob`. It must provide all information to create a `RJob` value eventually.
|
* `RJob`. It must provide all information to create a `RJob` value eventually.
|
||||||
@ -65,66 +61,6 @@ case class RPeriodicTask(
|
|||||||
|
|
||||||
object RPeriodicTask {
|
object RPeriodicTask {
|
||||||
|
|
||||||
def create[F[_]: Sync](
|
|
||||||
enabled: Boolean,
|
|
||||||
scope: UserTaskScope,
|
|
||||||
task: Ident,
|
|
||||||
args: String,
|
|
||||||
subject: String,
|
|
||||||
priority: Priority,
|
|
||||||
timer: CalEvent,
|
|
||||||
summary: Option[String]
|
|
||||||
): F[RPeriodicTask] =
|
|
||||||
Ident
|
|
||||||
.randomId[F]
|
|
||||||
.flatMap(id =>
|
|
||||||
Timestamp
|
|
||||||
.current[F]
|
|
||||||
.map { now =>
|
|
||||||
RPeriodicTask(
|
|
||||||
id,
|
|
||||||
enabled,
|
|
||||||
task,
|
|
||||||
scope.collective,
|
|
||||||
args,
|
|
||||||
subject,
|
|
||||||
scope.fold(_.user, identity),
|
|
||||||
priority,
|
|
||||||
None,
|
|
||||||
None,
|
|
||||||
timer,
|
|
||||||
timer
|
|
||||||
.nextElapse(now.atZone(Timestamp.UTC))
|
|
||||||
.map(_.toInstant)
|
|
||||||
.map(Timestamp.apply)
|
|
||||||
.getOrElse(Timestamp.Epoch),
|
|
||||||
now,
|
|
||||||
summary
|
|
||||||
)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
def createJson[F[_]: Sync, A](
|
|
||||||
enabled: Boolean,
|
|
||||||
scope: UserTaskScope,
|
|
||||||
task: Ident,
|
|
||||||
args: A,
|
|
||||||
subject: String,
|
|
||||||
priority: Priority,
|
|
||||||
timer: CalEvent,
|
|
||||||
summary: Option[String]
|
|
||||||
)(implicit E: Encoder[A]): F[RPeriodicTask] =
|
|
||||||
create[F](
|
|
||||||
enabled,
|
|
||||||
scope,
|
|
||||||
task,
|
|
||||||
E(args).noSpaces,
|
|
||||||
subject,
|
|
||||||
priority,
|
|
||||||
timer,
|
|
||||||
summary
|
|
||||||
)
|
|
||||||
|
|
||||||
final case class Table(alias: Option[String]) extends TableDef {
|
final case class Table(alias: Option[String]) extends TableDef {
|
||||||
val tableName = "periodic_task"
|
val tableName = "periodic_task"
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user