mirror of
https://github.com/TheAnachronism/docspell.git
synced 2025-02-15 20:33:26 +00:00
Delete items by introducing a deleted state
When deleting items via the http api, they are not deleted anymore but a new status "Deleted" is set. The collective insights contains now a count separately for deleted items.
This commit is contained in:
parent
48d13a35fc
commit
cb777e30c0
@ -144,6 +144,8 @@ trait OItem[F[_]] {
|
||||
|
||||
def deleteAttachment(id: Ident, collective: Ident): F[Int]
|
||||
|
||||
def setDeletedState(items: NonEmptyList[Ident], collective: Ident): F[Int]
|
||||
|
||||
def deleteAttachmentMultiple(
|
||||
attachments: NonEmptyList[Ident],
|
||||
collective: Ident
|
||||
@ -612,6 +614,9 @@ object OItem {
|
||||
n = results.sum
|
||||
} yield n
|
||||
|
||||
def setDeletedState(items: NonEmptyList[Ident], collective: Ident): F[Int] =
|
||||
store.transact(RItem.setState(items, collective, ItemState.Deleted))
|
||||
|
||||
def getProposals(item: Ident, collective: Ident): F[MetaProposalList] =
|
||||
store.transact(QAttachment.getMetaProposals(item, collective))
|
||||
|
||||
|
@ -28,6 +28,7 @@ object ItemState {
|
||||
case object Processing extends ItemState
|
||||
case object Created extends ItemState
|
||||
case object Confirmed extends ItemState
|
||||
case object Deleted extends ItemState
|
||||
|
||||
def premature: ItemState = Premature
|
||||
def processing: ItemState = Processing
|
||||
@ -40,6 +41,7 @@ object ItemState {
|
||||
case "processing" => Right(Processing)
|
||||
case "created" => Right(Created)
|
||||
case "confirmed" => Right(Confirmed)
|
||||
case "deleted" => Right(Deleted)
|
||||
case _ => Left(s"Invalid item state: $str")
|
||||
}
|
||||
|
||||
|
@ -4569,6 +4569,7 @@ components:
|
||||
required:
|
||||
- incomingCount
|
||||
- outgoingCount
|
||||
- deletedCount
|
||||
- itemSize
|
||||
- tagCloud
|
||||
properties:
|
||||
@ -4578,6 +4579,9 @@ components:
|
||||
outgoingCount:
|
||||
type: integer
|
||||
format: int32
|
||||
deletedCount:
|
||||
type: integer
|
||||
format: int32
|
||||
itemSize:
|
||||
type: integer
|
||||
format: int64
|
||||
|
@ -63,6 +63,7 @@ trait Conversions {
|
||||
ItemInsights(
|
||||
d.incoming,
|
||||
d.outgoing,
|
||||
d.deleted,
|
||||
d.bytes,
|
||||
mkTagCloud(d.tags)
|
||||
)
|
||||
|
@ -179,7 +179,7 @@ object ItemMultiRoutes extends MultiIdSupport {
|
||||
for {
|
||||
json <- req.as[IdList]
|
||||
items <- readIds[F](json.ids)
|
||||
n <- backend.item.deleteItemMultiple(items, user.account.collective)
|
||||
n <- backend.item.setDeletedState(items, user.account.collective)
|
||||
res = BasicResult(
|
||||
n > 0,
|
||||
if (n > 0) "Item(s) deleted" else "Item deletion failed."
|
||||
|
@ -393,7 +393,7 @@ object ItemRoutes {
|
||||
|
||||
case DELETE -> Root / Ident(id) =>
|
||||
for {
|
||||
n <- backend.item.deleteItem(id, user.account.collective)
|
||||
n <- backend.item.setDeletedState(NonEmptyList.of(id), user.account.collective)
|
||||
res = BasicResult(n > 0, if (n > 0) "Item deleted" else "Item deletion failed.")
|
||||
resp <- Ok(res)
|
||||
} yield resp
|
||||
@ -440,7 +440,7 @@ object ItemRoutes {
|
||||
}
|
||||
}
|
||||
|
||||
def searchItemStats[F[_]: Sync](
|
||||
private def searchItemStats[F[_]: Sync](
|
||||
backend: BackendApp[F],
|
||||
dsl: Http4sDsl[F]
|
||||
)(ftsEnabled: Boolean, fixQuery: Query.Fix, itemQuery: ItemQueryString) = {
|
||||
|
@ -65,6 +65,7 @@ object QCollective {
|
||||
case class InsightData(
|
||||
incoming: Int,
|
||||
outgoing: Int,
|
||||
deleted: Int,
|
||||
bytes: Long,
|
||||
tags: List[TagCount]
|
||||
)
|
||||
@ -84,6 +85,11 @@ object QCollective {
|
||||
ItemState.validStates
|
||||
)
|
||||
).build.query[Int].unique
|
||||
val q2 = Select(
|
||||
count(i.id).s,
|
||||
from(i),
|
||||
i.cid === coll && i.state === ItemState.Deleted
|
||||
).build.query[Int].unique
|
||||
|
||||
val fileSize = sql"""
|
||||
select sum(length) from (
|
||||
@ -106,11 +112,12 @@ object QCollective {
|
||||
) as t""".query[Option[Long]].unique
|
||||
|
||||
for {
|
||||
n0 <- q0
|
||||
n1 <- q1
|
||||
n2 <- fileSize
|
||||
n3 <- tagCloud(coll)
|
||||
} yield InsightData(n0, n1, n2.getOrElse(0L), n3)
|
||||
incoming <- q0
|
||||
outgoing <- q1
|
||||
size <- fileSize
|
||||
tags <- tagCloud(coll)
|
||||
deleted <- q2
|
||||
} yield InsightData(incoming, outgoing, deleted, size.getOrElse(0L), tags)
|
||||
}
|
||||
|
||||
def tagCloud(coll: Ident): ConnectionIO[List[TagCount]] = {
|
||||
|
@ -336,6 +336,20 @@ object RItem {
|
||||
def deleteByIdAndCollective(itemId: Ident, coll: Ident): ConnectionIO[Int] =
|
||||
DML.delete(T, T.id === itemId && T.cid === coll)
|
||||
|
||||
def setState(
|
||||
itemIds: NonEmptyList[Ident],
|
||||
coll: Ident,
|
||||
state: ItemState
|
||||
): ConnectionIO[Int] =
|
||||
for {
|
||||
t <- currentTime
|
||||
n <- DML.update(
|
||||
T,
|
||||
T.id.in(itemIds) && T.cid === coll,
|
||||
DML.set(T.state.setTo(state), T.updated.setTo(t))
|
||||
)
|
||||
} yield n
|
||||
|
||||
def existsById(itemId: Ident): ConnectionIO[Boolean] =
|
||||
Select(count(T.id).s, from(T), T.id === itemId).build.query[Int].unique.map(_ > 0)
|
||||
|
||||
|
@ -15,6 +15,7 @@ module Messages.Basics exposing
|
||||
type alias Texts =
|
||||
{ incoming : String
|
||||
, outgoing : String
|
||||
, deleted : String
|
||||
, tags : String
|
||||
, items : String
|
||||
, submit : String
|
||||
@ -51,6 +52,7 @@ gb : Texts
|
||||
gb =
|
||||
{ incoming = "Incoming"
|
||||
, outgoing = "Outgoing"
|
||||
, deleted = "Deleted"
|
||||
, tags = "Tags"
|
||||
, items = "Items"
|
||||
, submit = "Submit"
|
||||
@ -92,6 +94,7 @@ de : Texts
|
||||
de =
|
||||
{ incoming = "Eingehend"
|
||||
, outgoing = "Ausgehend"
|
||||
, deleted = "Gelöscht"
|
||||
, tags = "Tags"
|
||||
, items = "Dokumente"
|
||||
, submit = "Speichern"
|
||||
|
@ -171,6 +171,7 @@ viewInsights texts flags model =
|
||||
[ stats (String.fromInt (model.insights.incomingCount + model.insights.outgoingCount)) texts.basics.items
|
||||
, stats (String.fromInt model.insights.incomingCount) texts.basics.incoming
|
||||
, stats (String.fromInt model.insights.outgoingCount) texts.basics.outgoing
|
||||
, stats (String.fromInt model.insights.deletedCount) texts.basics.deleted
|
||||
]
|
||||
]
|
||||
, div
|
||||
|
Loading…
Reference in New Issue
Block a user