From 64c96942a965e680b5eb1216099573ea3fd7d714 Mon Sep 17 00:00:00 2001 From: Eike Kettner Date: Wed, 24 Jun 2020 23:47:58 +0200 Subject: [PATCH] Fix deleting items that have sent mails --- .../main/scala/docspell/store/queries/QItem.scala | 5 +++-- .../scala/docspell/store/records/RSentMail.scala | 12 ++++++++++++ .../scala/docspell/store/records/RSentMailItem.scala | 6 ++++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/modules/store/src/main/scala/docspell/store/queries/QItem.scala b/modules/store/src/main/scala/docspell/store/queries/QItem.scala index 5b463517..a5a72ff2 100644 --- a/modules/store/src/main/scala/docspell/store/queries/QItem.scala +++ b/modules/store/src/main/scala/docspell/store/queries/QItem.scala @@ -448,10 +448,11 @@ object QItem { def delete[F[_]: Sync](store: Store[F])(itemId: Ident, collective: Ident): F[Int] = for { - tn <- store.transact(RTagItem.deleteItemTags(itemId)) rn <- QAttachment.deleteItemAttachments(store)(itemId, collective) + tn <- store.transact(RTagItem.deleteItemTags(itemId)) + mn <- store.transact(RSentMail.deleteByItem(itemId)) n <- store.transact(RItem.deleteByIdAndCollective(itemId, collective)) - } yield tn + rn + n + } yield tn + rn + n + mn def findByFileIds(fileMetaIds: Seq[Ident]): ConnectionIO[Vector[RItem]] = { val IC = RItem.Columns diff --git a/modules/store/src/main/scala/docspell/store/records/RSentMail.scala b/modules/store/src/main/scala/docspell/store/records/RSentMail.scala index 4d02a8bd..461fdc23 100644 --- a/modules/store/src/main/scala/docspell/store/records/RSentMail.scala +++ b/modules/store/src/main/scala/docspell/store/records/RSentMail.scala @@ -3,6 +3,7 @@ package docspell.store.records import fs2.Stream import cats.effect._ import cats.implicits._ +import cats.data.NonEmptyList import doobie._ import doobie.implicits._ import docspell.common._ @@ -115,4 +116,15 @@ object RSentMail { def delete(mailId: Ident): ConnectionIO[Int] = deleteFrom(table, id.is(mailId)).update.run + + def deleteByItem(item: Ident): ConnectionIO[Int] = + for { + list <- RSentMailItem.findSentMailIdsByItem(item) + n1 <- RSentMailItem.deleteAllByItem(item) + n0 <- NonEmptyList.fromList(list.toList) match { + case Some(nel) => deleteFrom(table, id.isIn(nel)).update.run + case None => 0.pure[ConnectionIO] + } + } yield n0 + n1 + } diff --git a/modules/store/src/main/scala/docspell/store/records/RSentMailItem.scala b/modules/store/src/main/scala/docspell/store/records/RSentMailItem.scala index 5f796c6e..41fbcf90 100644 --- a/modules/store/src/main/scala/docspell/store/records/RSentMailItem.scala +++ b/modules/store/src/main/scala/docspell/store/records/RSentMailItem.scala @@ -54,4 +54,10 @@ object RSentMailItem { def deleteMail(mailId: Ident): ConnectionIO[Int] = deleteFrom(table, sentMailId.is(mailId)).update.run + + def findSentMailIdsByItem(item: Ident): ConnectionIO[Set[Ident]] = + selectSimple(Seq(sentMailId), table, itemId.is(item)).query[Ident].to[Set] + + def deleteAllByItem(item: Ident): ConnectionIO[Int] = + deleteFrom(table, itemId.is(item)).update.run }