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 {}