use diesel::{
dsl::delete,
prelude::*,
sql_types::{Binary, Integer, Nullable, SmallInt, Text},
};
use crate::admin::store::{
diesel::{
models::{CircuitProposalModel, ProposedCircuitModel, ProposedNodeModel, VoteRecordModel},
schema::circuit_proposal,
},
error::AdminServiceStoreError,
};
use super::{get_proposal::AdminServiceStoreFetchProposalOperation, AdminServiceStoreOperations};
pub(in crate::admin::store::diesel) trait AdminServiceStoreRemoveProposalOperation {
fn remove_proposal(&self, proposal_id: &str) -> Result<(), AdminServiceStoreError>;
}
impl<'a, C> AdminServiceStoreRemoveProposalOperation for AdminServiceStoreOperations<'a, C>
where
C: diesel::Connection,
String: diesel::deserialize::FromSql<diesel::sql_types::Text, C::Backend>,
i64: diesel::deserialize::FromSql<diesel::sql_types::BigInt, C::Backend>,
i32: diesel::deserialize::FromSql<diesel::sql_types::Integer, C::Backend>,
CircuitProposalModel: diesel::Queryable<(Text, Text, Text, Binary, Text), C::Backend>,
ProposedCircuitModel: diesel::Queryable<
(
Text,
Text,
Text,
Text,
Text,
Text,
Nullable<Binary>,
Nullable<Text>,
Nullable<Text>,
Integer,
SmallInt,
),
C::Backend,
>,
VoteRecordModel: diesel::Queryable<(Text, Binary, Text, Text, Integer), C::Backend>,
ProposedNodeModel: diesel::Queryable<(Text, Text, Integer, Nullable<Binary>), C::Backend>,
{
fn remove_proposal(&self, proposal_id: &str) -> Result<(), AdminServiceStoreError> {
self.conn.transaction::<(), _, _>(|| {
self.get_proposal(proposal_id).and_then(|_| {
delete(circuit_proposal::table.find(&proposal_id)).execute(self.conn)?;
Ok(())
})
})
}
}