use uuid::Uuid;
use crate::{
AgendaItem, Body, Meeting, Membership, NewBody, NewMeeting, NewUser, Organization, Person,
Result, System, UpdateUser, User,
};
mod stock_impls;
#[cfg_attr(feature = "mockall", mockall::automock)]
#[async_trait::async_trait]
pub trait Inventory: Send {
async fn create_user(&mut self, user: NewUser) -> Result<User>;
async fn get_user_by_sub(&mut self, sub: String) -> Result<User>;
async fn update_user(&mut self, update: UpdateUser) -> Result<User>;
async fn has_user_body_permission(&mut self, user_id: Uuid, body_id: &str) -> Result<bool>;
async fn get_system(&mut self) -> Result<System>;
async fn create_body(&mut self, body: NewBody) -> Result<Body>;
async fn get_bodies(&mut self) -> Result<Vec<Body>>;
async fn get_bodies_for_user(&mut self, user_id: Uuid) -> Result<Vec<Body>>;
async fn get_body(&mut self, body_id: &str) -> Result<Body>;
async fn get_persons(&mut self, body_id: &str) -> Result<Vec<Person>>;
async fn get_person(&mut self, body_id: &str, person_id: &str) -> Result<Person>;
async fn get_person_memberships(&mut self, person_id: &str) -> Result<Vec<Membership>>;
async fn get_organizations(&mut self, body_id: &str) -> Result<Vec<Organization>>;
async fn get_organization(
&mut self,
body_id: &str,
organization_id: &str,
) -> Result<Organization>;
async fn get_organization_meetings(
&mut self,
body_id: &str,
organization_id: &str,
) -> Result<Vec<Meeting>>;
async fn get_organization_memberships(
&mut self,
organization_id: &str,
) -> Result<Vec<Membership>>;
async fn get_agenda_items(&mut self, body_id: &str) -> Result<Vec<AgendaItem>>;
async fn get_agenda_item(&mut self, body_id: &str, agenda_item_id: &str) -> Result<AgendaItem>;
async fn get_meetings(&mut self, body_id: &str) -> Result<Vec<Meeting>>;
async fn get_meeting(&mut self, body_id: &str, meeting_id: &str) -> Result<Meeting>;
async fn create_meeting(&mut self, meeting: NewMeeting) -> Result<Meeting>;
async fn get_memberships(&mut self, body_id: &str) -> Result<Vec<Membership>>;
async fn get_membership(&mut self, body_id: &str, membership_id: &str) -> Result<Membership>;
}