junobuild-satellite 0.6.0

Core implementation of a Juno Satellite.
Documentation
use crate::hooks::db::{
    invoke_on_delete_doc, invoke_on_delete_filtered_docs, invoke_on_delete_many_docs,
    invoke_on_set_doc, invoke_on_set_many_docs,
};
use crate::user::internal_hooks::{
    on_delete_many_users, on_delete_user, on_set_many_users, on_set_user,
};
use crate::{
    caller, count_collection_docs_store, count_docs_store, delete_doc_store, delete_docs_store,
    delete_filtered_docs_store, get_doc_store, list_docs_store, set_doc_store, DelDoc, Doc,
    DocContext, DocUpsert, SetDoc,
};
use junobuild_collections::types::core::CollectionKey;
use junobuild_shared::ic::UnwrapOrTrap;
use junobuild_shared::types::core::Key;
use junobuild_shared::types::list::{ListParams, ListResults};

pub fn set_doc(collection: CollectionKey, key: Key, doc: SetDoc) -> Doc {
    let caller = caller();

    let doc = set_doc_store(caller, collection, key, doc).unwrap_or_trap();

    on_set_user(&doc).unwrap_or_trap();

    invoke_on_set_doc(&caller, &doc);

    doc.data.after
}

pub fn get_doc(collection: CollectionKey, key: Key) -> Option<Doc> {
    let caller = caller();

    get_doc_store(caller, collection, key).unwrap_or_trap()
}

pub fn del_doc(collection: CollectionKey, key: Key, doc: DelDoc) {
    let caller = caller();

    let deleted_doc = delete_doc_store(caller, collection, key, doc).unwrap_or_trap();

    on_delete_user(&deleted_doc).unwrap_or_trap();

    invoke_on_delete_doc(&caller, &deleted_doc);
}

pub fn list_docs(collection: CollectionKey, filter: ListParams) -> ListResults<Doc> {
    let caller = caller();

    list_docs_store(caller, collection, &filter).unwrap_or_trap()
}

pub fn count_docs(collection: CollectionKey, filter: ListParams) -> usize {
    let caller = caller();

    count_docs_store(caller, collection, &filter).unwrap_or_trap()
}

pub fn get_many_docs(docs: Vec<(CollectionKey, Key)>) -> Vec<(Key, Option<Doc>)> {
    docs.iter()
        .map(|(collection, key)| {
            let doc = get_doc(collection.clone(), key.clone());
            (key.clone(), doc.clone())
        })
        .collect()
}

pub fn set_many_docs(docs: Vec<(CollectionKey, Key, SetDoc)>) -> Vec<(Key, Doc)> {
    let caller = caller();

    let mut hook_payload: Vec<DocContext<DocUpsert>> = Vec::new();
    let mut results: Vec<(Key, Doc)> = Vec::new();

    for (collection, key, doc) in docs {
        let result = set_doc_store(caller, collection, key.clone(), doc).unwrap_or_trap();

        results.push((result.key.clone(), result.data.after.clone()));

        hook_payload.push(result);
    }

    on_set_many_users(&hook_payload).unwrap_or_trap();

    invoke_on_set_many_docs(&caller, &hook_payload);

    results
}

pub fn del_many_docs(docs: Vec<(CollectionKey, Key, DelDoc)>) {
    let caller = caller();

    let mut results: Vec<DocContext<Option<Doc>>> = Vec::new();

    for (collection, key, doc) in docs {
        let deleted_doc = delete_doc_store(caller, collection, key.clone(), doc).unwrap_or_trap();
        results.push(deleted_doc);
    }

    on_delete_many_users(&results).unwrap_or_trap();

    invoke_on_delete_many_docs(&caller, &results);
}

pub fn del_filtered_docs(collection: CollectionKey, filter: ListParams) {
    let caller = caller();

    let results = delete_filtered_docs_store(caller, collection, &filter).unwrap_or_trap();

    invoke_on_delete_filtered_docs(&caller, &results);
}

pub fn del_docs(collection: CollectionKey) {
    delete_docs_store(&collection).unwrap_or_trap();
}

pub fn count_collection_docs(collection: CollectionKey) -> usize {
    count_collection_docs_store(&collection).unwrap_or_trap()
}