Skip to main content

sofie_db/
soft_delete.rs

1use sofie_core::{Cast, Instant, SqlValue};
2
3use crate::behavior::{stored, stored_time};
4use crate::requested::{STAMP_REQUESTED, stamp_requested, stored_mut};
5use crate::{Aggregate, Behavior, Column, Field, Uses, Write};
6
7pub struct SoftDelete;
8
9impl Behavior for SoftDelete {
10    fn columns(&self) -> &'static [Field] {
11        const { &[Field::new("deleted_at", Instant::COLUMNS, true)] }
12    }
13
14    fn written(&self, write: &Write<'_>, values: &mut [SqlValue]) {
15        stamp_requested(write, &mut values[0]);
16    }
17
18    fn hides(&self) -> Option<&'static str> {
19        Some("deleted_at")
20    }
21}
22
23pub trait SoftDeletes: Aggregate {
24    const DELETED_AT: Column<Self, Option<Instant>> = Column::new("deleted_at");
25
26    fn delete(&mut self) {
27        if !self.is_deleted() {
28            *stored_mut::<Self>(self, "deleted_at") = STAMP_REQUESTED;
29        }
30    }
31
32    fn restore(&mut self) {
33        *stored_mut::<Self>(self, "deleted_at") = SqlValue::Null;
34    }
35
36    fn is_deleted(&self) -> bool {
37        stored::<Self>(self, "deleted_at").is_some_and(|value| *value != SqlValue::Null)
38    }
39
40    fn deleted_at(&self) -> Option<Instant> {
41        stored_time::<Self>(self, "deleted_at")
42    }
43}
44
45impl<A: Uses<SoftDelete>> SoftDeletes for A {}