1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
use crate::{
  newtypes::PersonId,
  source::person_block::{PersonBlock, PersonBlockForm},
  traits::Blockable,
};
use diesel::{dsl::*, result::Error, *};

impl PersonBlock {
  pub fn read(
    conn: &PgConnection,
    for_person_id: PersonId,
    for_recipient_id: PersonId,
  ) -> Result<Self, Error> {
    use crate::schema::person_block::dsl::*;
    person_block
      .filter(person_id.eq(for_person_id))
      .filter(target_id.eq(for_recipient_id))
      .first::<Self>(conn)
  }
}

impl Blockable for PersonBlock {
  type Form = PersonBlockForm;
  fn block(conn: &PgConnection, person_block_form: &PersonBlockForm) -> Result<Self, Error> {
    use crate::schema::person_block::dsl::*;
    insert_into(person_block)
      .values(person_block_form)
      .on_conflict((person_id, target_id))
      .do_update()
      .set(person_block_form)
      .get_result::<Self>(conn)
  }
  fn unblock(conn: &PgConnection, person_block_form: &Self::Form) -> Result<usize, Error> {
    use crate::schema::person_block::dsl::*;
    diesel::delete(
      person_block
        .filter(person_id.eq(person_block_form.person_id))
        .filter(target_id.eq(person_block_form.target_id)),
    )
    .execute(conn)
  }
}