Allow to start a user task once

This commit is contained in:
Eike Kettner
2020-04-21 22:32:43 +02:00
parent af5b62c057
commit bbfd694b45
9 changed files with 157 additions and 55 deletions

View File

@ -33,13 +33,13 @@ object QUserTask {
def insert(account: AccountId, task: UserTask[String]): ConnectionIO[Int] =
for {
r <- makePeriodicTask(account, task)
r <- task.toPeriodicTask[ConnectionIO](account)
n <- RPeriodicTask.insert(r)
} yield n
def update(account: AccountId, task: UserTask[String]): ConnectionIO[Int] =
for {
r <- makePeriodicTask(account, task)
r <- task.toPeriodicTask[ConnectionIO](account)
n <- RPeriodicTask.update(r)
} yield n
@ -69,21 +69,4 @@ object QUserTask {
def makeUserTask(r: RPeriodicTask): UserTask[String] =
UserTask(r.id, r.task, r.enabled, r.timer, r.args)
def makePeriodicTask(
account: AccountId,
t: UserTask[String]
): ConnectionIO[RPeriodicTask] =
RPeriodicTask
.create[ConnectionIO](
t.enabled,
t.name,
account.collective,
t.args,
s"${account.user.id}: ${t.name.id}",
account.user,
Priority.Low,
t.timer
)
.map(r => r.copy(id = t.id))
}

View File

@ -36,6 +36,8 @@ trait PeriodicTaskStore[F[_]] {
*/
def add(task: RPeriodicTask): F[AddResult]
/** Find all joex nodes as registered in the database.
*/
def findJoexNodes: F[Vector[RNode]]
}

View File

@ -1,33 +1,53 @@
package docspell.store.usertask
import cats.effect._
import cats.implicits._
import com.github.eikek.calev.CalEvent
import io.circe.Decoder
import io.circe.Encoder
import docspell.common._
import docspell.common.syntax.all._
import docspell.store.records.RPeriodicTask
case class UserTask[A](
id: Ident,
name: Ident,
enabled: Boolean,
timer: CalEvent,
args: A
id: Ident,
name: Ident,
enabled: Boolean,
timer: CalEvent,
args: A
) {
def encode(implicit E: Encoder[A]): UserTask[String] =
copy(args = E(args).noSpaces)
}
object UserTask {
implicit final class UserTaskCodec(ut: UserTask[String]) {
def decode[A](implicit D: Decoder[A]): Either[String, UserTask[A]] =
ut.args.parseJsonAs[A]
.left.map(_.getMessage)
ut.args
.parseJsonAs[A]
.left
.map(_.getMessage)
.map(a => ut.copy(args = a))
def toPeriodicTask[F[_]: Sync](
account: AccountId
): F[RPeriodicTask] =
RPeriodicTask
.create[F](
ut.enabled,
ut.name,
account.collective,
ut.args,
s"${account.user.id}: ${ut.name.id}",
account.user,
Priority.Low,
ut.timer
)
.map(r => r.copy(id = ut.id))
}
}