Skip to main content

junobuild_satellite/
lib.rs

1#![doc = include_str!("../README.md")]
2
3mod access_keys;
4mod api;
5mod assets;
6mod auth;
7mod automation;
8mod certification;
9mod db;
10mod errors;
11mod hooks;
12mod impls;
13mod logs;
14mod memory;
15mod random;
16mod rules;
17mod sdk;
18mod types;
19mod user;
20
21use crate::db::types::config::DbConfig;
22use crate::db::types::interface::SetDbConfig;
23use crate::types::interface::{
24    AuthenticateAutomationResultResponse, AuthenticateResultResponse, AuthenticationArgs,
25    CertifyAssetsArgs, CertifyAssetsResult, Config, DeleteProposalAssets, GetDelegationArgs,
26    GetDelegationResultResponse,
27};
28use crate::types::state::CollectionType;
29use automation::types::AuthenticateAutomationArgs;
30use ic_cdk_macros::{init, post_upgrade, pre_upgrade, query, update};
31use junobuild_auth::state::types::automation::AutomationConfig;
32use junobuild_auth::state::types::config::AuthenticationConfig;
33use junobuild_auth::state::types::interface::{SetAuthenticationConfig, SetAutomationConfig};
34use junobuild_cdn::proposals::{
35    CommitProposal, ListProposalResults, ListProposalsParams, Proposal, ProposalId, ProposalType,
36    RejectProposal,
37};
38use junobuild_collections::types::core::CollectionKey;
39use junobuild_collections::types::interface::{
40    DelRule, ListRulesParams, ListRulesResults, SetRule,
41};
42use junobuild_collections::types::rules::Rule;
43use junobuild_shared::ic::response::ManualReply;
44use junobuild_shared::ic::UnwrapOrTrap;
45use junobuild_shared::types::core::DomainName;
46use junobuild_shared::types::core::Key;
47use junobuild_shared::types::domain::CustomDomains;
48use junobuild_shared::types::interface::{
49    DeleteControllersArgs, DepositCyclesArgs, InitSatelliteArgs, MemorySize, SetControllersArgs,
50};
51use junobuild_shared::types::list::ListParams;
52use junobuild_shared::types::list::ListResults;
53use junobuild_shared::types::state::AccessKeys;
54use junobuild_storage::http::types::{
55    HttpRequest, HttpResponse, StreamingCallbackHttpResponse, StreamingCallbackToken,
56};
57use junobuild_storage::types::config::StorageConfig;
58use junobuild_storage::types::interface::{
59    AssetNoContent, CommitBatch, InitAssetKey, InitUploadResult, SetStorageConfig,
60    SetStorageConfigWithOptions, UploadChunk, UploadChunkResult,
61};
62use junobuild_storage::types::state::{AssetAccessToken, FullPath};
63use memory::lifecycle;
64
65// ============================================================================================
66// These types are made available for use in Serverless Functions.
67// ============================================================================================
68pub use sdk::core::*;
69pub use sdk::internal;
70
71// ---------------------------------------------------------
72// Init and Upgrade
73// ---------------------------------------------------------
74
75#[doc(hidden)]
76#[init]
77pub fn init(args: InitSatelliteArgs) {
78    lifecycle::init(args);
79}
80
81#[doc(hidden)]
82#[pre_upgrade]
83pub fn pre_upgrade() {
84    lifecycle::pre_upgrade();
85}
86
87#[doc(hidden)]
88#[post_upgrade]
89pub fn post_upgrade() {
90    lifecycle::post_upgrade();
91}
92
93// ---------------------------------------------------------
94// Db
95// ---------------------------------------------------------
96
97#[doc(hidden)]
98#[update]
99pub fn set_doc(collection: CollectionKey, key: Key, doc: SetDoc) -> Doc {
100    api::db::set_doc(collection, key, doc)
101}
102
103#[doc(hidden)]
104#[query]
105pub fn get_doc(collection: CollectionKey, key: Key) -> Option<Doc> {
106    api::db::get_doc(collection, key)
107}
108
109#[doc(hidden)]
110#[update]
111pub fn del_doc(collection: CollectionKey, key: Key, doc: DelDoc) {
112    api::db::del_doc(collection, key, doc);
113}
114
115#[doc(hidden)]
116#[query]
117pub fn list_docs(collection: CollectionKey, filter: ListParams) -> ListResults<Doc> {
118    api::db::list_docs(collection, filter)
119}
120
121#[doc(hidden)]
122#[query]
123pub fn count_docs(collection: CollectionKey, filter: ListParams) -> usize {
124    api::db::count_docs(collection, filter)
125}
126
127#[doc(hidden)]
128#[query]
129pub fn get_many_docs(docs: Vec<(CollectionKey, Key)>) -> Vec<(Key, Option<Doc>)> {
130    api::db::get_many_docs(docs)
131}
132
133#[doc(hidden)]
134#[update]
135pub fn set_many_docs(docs: Vec<(CollectionKey, Key, SetDoc)>) -> Vec<(Key, Doc)> {
136    api::db::set_many_docs(docs)
137}
138
139#[doc(hidden)]
140#[update]
141pub fn del_many_docs(docs: Vec<(CollectionKey, Key, DelDoc)>) {
142    api::db::del_many_docs(docs)
143}
144
145#[doc(hidden)]
146#[update]
147pub fn del_filtered_docs(collection: CollectionKey, filter: ListParams) {
148    api::db::del_filtered_docs(collection, filter)
149}
150
151#[doc(hidden)]
152#[update(guard = "caller_has_write_permission")]
153pub fn del_docs(collection: CollectionKey) {
154    api::db::del_docs(collection)
155}
156
157#[doc(hidden)]
158#[query(guard = "caller_has_write_permission")]
159pub fn count_collection_docs(collection: CollectionKey) -> usize {
160    api::db::count_collection_docs(collection)
161}
162
163// ---------------------------------------------------------
164// Authentication
165// ---------------------------------------------------------
166
167#[doc(hidden)]
168#[update]
169pub async fn authenticate(args: AuthenticationArgs) -> AuthenticateResultResponse {
170    api::auth::authenticate(&args).await.into()
171}
172
173#[doc(hidden)]
174#[query]
175pub fn get_delegation(args: GetDelegationArgs) -> GetDelegationResultResponse {
176    api::auth::get_delegation(&args).into()
177}
178
179#[doc(hidden)]
180#[update]
181pub async fn authenticate_automation(
182    args: AuthenticateAutomationArgs,
183) -> AuthenticateAutomationResultResponse {
184    api::automation::authenticate_automation(args).await.into()
185}
186
187// ---------------------------------------------------------
188// Rules
189// ---------------------------------------------------------
190
191#[doc(hidden)]
192#[query(guard = "caller_is_admin")]
193pub fn get_rule(collection_type: CollectionType, collection: CollectionKey) -> Option<Rule> {
194    api::rules::get_rule(&collection_type, &collection)
195}
196
197#[doc(hidden)]
198#[query(guard = "caller_is_admin")]
199pub fn list_rules(collection_type: CollectionType, filter: ListRulesParams) -> ListRulesResults {
200    api::rules::list_rules(&collection_type, &filter)
201}
202
203#[doc(hidden)]
204#[update(guard = "caller_is_admin")]
205pub fn set_rule(collection_type: CollectionType, collection: CollectionKey, rule: SetRule) -> Rule {
206    api::rules::set_rule(collection_type, collection, rule)
207}
208
209#[doc(hidden)]
210#[update(guard = "caller_is_admin")]
211pub fn del_rule(collection_type: CollectionType, collection: CollectionKey, rule: DelRule) {
212    api::rules::del_rule(collection_type, collection, rule)
213}
214
215#[doc(hidden)]
216#[update(guard = "caller_is_admin")]
217pub fn switch_storage_system_memory() {
218    api::rules::switch_storage_system_memory()
219}
220
221// ---------------------------------------------------------
222// Controllers
223// ---------------------------------------------------------
224
225#[doc(hidden)]
226#[update(guard = "caller_is_admin")]
227pub fn set_controllers(args: SetControllersArgs) -> AccessKeys {
228    api::controllers::set_controllers(args)
229}
230
231#[doc(hidden)]
232#[update(guard = "caller_is_admin")]
233pub fn del_controllers(args: DeleteControllersArgs) -> AccessKeys {
234    api::controllers::del_controllers(args)
235}
236
237#[doc(hidden)]
238#[update(guard = "caller_is_access_key")]
239pub fn del_controller_self() {
240    api::controllers::del_controller_self()
241}
242
243#[doc(hidden)]
244#[query(guard = "caller_is_admin")]
245pub fn list_controllers() -> AccessKeys {
246    api::controllers::list_controllers()
247}
248
249// ---------------------------------------------------------
250// Proposal
251// ---------------------------------------------------------
252
253#[doc(hidden)]
254#[query(guard = "caller_is_access_key")]
255pub fn get_proposal(proposal_id: ProposalId) -> Option<Proposal> {
256    api::cdn::get_proposal(&proposal_id)
257}
258
259#[doc(hidden)]
260#[query(guard = "caller_is_access_key")]
261pub fn list_proposals(filter: ListProposalsParams) -> ListProposalResults {
262    api::cdn::list_proposals(&filter)
263}
264
265#[doc(hidden)]
266#[query(guard = "caller_is_access_key")]
267pub fn count_proposals() -> usize {
268    api::cdn::count_proposals()
269}
270
271#[doc(hidden)]
272#[update(guard = "caller_is_access_key")]
273pub fn init_proposal(proposal_type: ProposalType) -> (ProposalId, Proposal) {
274    api::cdn::init_proposal(&proposal_type)
275}
276
277#[doc(hidden)]
278#[update(guard = "caller_is_access_key")]
279pub fn submit_proposal(proposal_id: ProposalId) -> (ProposalId, Proposal) {
280    api::cdn::submit_proposal(&proposal_id)
281}
282
283#[doc(hidden)]
284#[update(guard = "caller_has_write_permission", manual_reply = true)]
285pub fn reject_proposal(proposal: RejectProposal) -> ManualReply<()> {
286    api::cdn::reject_proposal(&proposal)
287}
288
289#[doc(hidden)]
290#[update(guard = "caller_has_write_permission", manual_reply = true)]
291pub fn commit_proposal(proposal: CommitProposal) -> ManualReply<()> {
292    api::cdn::commit_proposal(&proposal)
293}
294
295#[doc(hidden)]
296#[update(guard = "caller_has_write_permission")]
297pub fn delete_proposal_assets(params: DeleteProposalAssets) {
298    api::cdn::delete_proposal_assets(&params)
299}
300
301// ---------------------------------------------------------
302// Internal storage
303// ---------------------------------------------------------
304
305#[doc(hidden)]
306#[update(guard = "caller_is_access_key")]
307pub fn init_proposal_asset_upload(init: InitAssetKey, proposal_id: ProposalId) -> InitUploadResult {
308    api::cdn::init_proposal_asset_upload(init, proposal_id)
309}
310
311#[doc(hidden)]
312#[update(guard = "caller_is_access_key")]
313pub fn init_proposal_many_assets_upload(
314    init_asset_keys: Vec<InitAssetKey>,
315    proposal_id: ProposalId,
316) -> Vec<(FullPath, InitUploadResult)> {
317    api::cdn::init_proposal_many_assets_upload(init_asset_keys, proposal_id)
318}
319
320#[doc(hidden)]
321#[update(guard = "caller_is_access_key")]
322pub fn upload_proposal_asset_chunk(chunk: UploadChunk) -> UploadChunkResult {
323    api::cdn::upload_proposal_asset_chunk(chunk)
324}
325
326#[doc(hidden)]
327#[update(guard = "caller_is_access_key")]
328pub fn commit_proposal_asset_upload(commit: CommitBatch) {
329    api::cdn::commit_proposal_asset_upload(commit)
330}
331
332#[doc(hidden)]
333#[update(guard = "caller_is_access_key")]
334pub fn commit_proposal_many_assets_upload(commits: Vec<CommitBatch>) {
335    api::cdn::commit_proposal_many_assets_upload(commits)
336}
337
338// ---------------------------------------------------------
339// Custom domains
340// ---------------------------------------------------------
341
342#[doc(hidden)]
343#[query(guard = "caller_is_admin")]
344pub fn list_custom_domains() -> CustomDomains {
345    api::cdn::list_custom_domains()
346}
347
348#[doc(hidden)]
349#[update(guard = "caller_is_admin")]
350pub fn set_custom_domain(domain_name: DomainName, bn_id: Option<String>) {
351    api::cdn::set_custom_domain(domain_name, bn_id);
352}
353
354#[doc(hidden)]
355#[update(guard = "caller_is_admin")]
356pub fn del_custom_domain(domain_name: DomainName) {
357    api::cdn::del_custom_domain(domain_name);
358}
359
360// ---------------------------------------------------------
361// Config
362// ---------------------------------------------------------
363
364#[doc(hidden)]
365#[update(guard = "caller_is_admin")]
366pub fn get_config() -> Config {
367    api::config::get_config()
368}
369
370// ---------------------------------------------------------
371// Authentication config
372// ---------------------------------------------------------
373
374#[doc(hidden)]
375#[update(guard = "caller_is_admin")]
376pub async fn set_auth_config(config: SetAuthenticationConfig) -> AuthenticationConfig {
377    api::config::set_auth_config(config).await
378}
379
380#[doc(hidden)]
381#[query(guard = "caller_is_admin")]
382pub fn get_auth_config() -> Option<AuthenticationConfig> {
383    api::config::get_auth_config()
384}
385
386// ---------------------------------------------------------
387// Automation config
388// ---------------------------------------------------------
389
390#[doc(hidden)]
391#[update(guard = "caller_is_admin")]
392pub async fn set_automation_config(config: SetAutomationConfig) -> AutomationConfig {
393    api::config::set_automation_config(config).await
394}
395
396#[doc(hidden)]
397#[query(guard = "caller_is_admin")]
398pub fn get_automation_config() -> Option<AutomationConfig> {
399    api::config::get_automation_config()
400}
401
402// ---------------------------------------------------------
403// Db config
404// ---------------------------------------------------------
405
406#[doc(hidden)]
407#[update(guard = "caller_is_admin")]
408pub fn set_db_config(config: SetDbConfig) -> DbConfig {
409    api::config::set_db_config(config)
410}
411
412#[doc(hidden)]
413#[query(guard = "caller_is_admin")]
414pub fn get_db_config() -> Option<DbConfig> {
415    api::config::get_db_config()
416}
417
418// ---------------------------------------------------------
419// Storage config
420// ---------------------------------------------------------
421
422#[doc(hidden)]
423#[update(guard = "caller_is_admin")]
424pub fn set_storage_config(config: SetStorageConfig) -> StorageConfig {
425    api::config::set_storage_config(config)
426}
427
428#[doc(hidden)]
429#[update(guard = "caller_is_admin")]
430pub fn set_storage_config_with_options(options: SetStorageConfigWithOptions) -> StorageConfig {
431    api::config::set_storage_config_with_options(options)
432}
433
434#[doc(hidden)]
435#[query(guard = "caller_is_admin")]
436pub fn get_storage_config() -> StorageConfig {
437    api::config::get_storage_config()
438}
439
440// ---------------------------------------------------------
441// Http
442// ---------------------------------------------------------
443
444#[doc(hidden)]
445#[query]
446pub fn http_request(request: HttpRequest) -> HttpResponse {
447    api::http::http_request(request)
448}
449
450#[doc(hidden)]
451#[query]
452pub fn http_request_streaming_callback(
453    callback: StreamingCallbackToken,
454) -> StreamingCallbackHttpResponse {
455    api::http::http_request_streaming_callback(callback)
456}
457
458// ---------------------------------------------------------
459// Storage
460// ---------------------------------------------------------
461
462#[doc(hidden)]
463#[update]
464pub fn init_asset_upload(init: InitAssetKey) -> InitUploadResult {
465    api::storage::init_asset_upload(init)
466}
467
468#[doc(hidden)]
469#[update]
470pub fn upload_asset_chunk(chunk: UploadChunk) -> UploadChunkResult {
471    api::storage::upload_asset_chunk(chunk)
472}
473
474#[doc(hidden)]
475#[update]
476pub fn commit_asset_upload(commit: CommitBatch) {
477    api::storage::commit_asset_upload(commit);
478}
479
480#[doc(hidden)]
481#[query]
482pub fn list_assets(collection: CollectionKey, filter: ListParams) -> ListResults<AssetNoContent> {
483    api::storage::list_assets(collection, filter)
484}
485
486#[doc(hidden)]
487#[query]
488pub fn count_assets(collection: CollectionKey, filter: ListParams) -> usize {
489    api::storage::count_assets(collection, filter)
490}
491
492#[doc(hidden)]
493#[update]
494pub fn del_asset(collection: CollectionKey, full_path: FullPath) {
495    api::storage::del_asset(collection, full_path);
496}
497
498#[doc(hidden)]
499#[update]
500pub fn del_many_assets(assets: Vec<(CollectionKey, String)>) {
501    api::storage::del_many_assets(assets);
502}
503
504#[doc(hidden)]
505#[update]
506pub fn del_filtered_assets(collection: CollectionKey, filter: ListParams) {
507    api::storage::del_filtered_assets(collection, filter)
508}
509
510#[doc(hidden)]
511#[update(guard = "caller_has_write_permission")]
512pub fn del_assets(collection: CollectionKey) {
513    api::storage::del_assets(collection);
514}
515
516#[doc(hidden)]
517#[update]
518pub fn set_asset_token(collection: CollectionKey, full_path: FullPath, token: AssetAccessToken) {
519    api::storage::set_asset_token(collection, full_path, token);
520}
521
522#[doc(hidden)]
523#[query(guard = "caller_has_write_permission")]
524pub fn count_collection_assets(collection: CollectionKey) -> usize {
525    api::storage::count_collection_assets(collection)
526}
527
528#[doc(hidden)]
529#[query]
530pub fn get_asset(collection: CollectionKey, full_path: FullPath) -> Option<AssetNoContent> {
531    api::storage::get_asset(collection, full_path)
532}
533
534#[doc(hidden)]
535#[query]
536pub fn get_many_assets(
537    assets: Vec<(CollectionKey, FullPath)>,
538) -> Vec<(FullPath, Option<AssetNoContent>)> {
539    api::storage::get_many_assets(assets)
540}
541
542#[doc(hidden)]
543#[update(guard = "caller_is_admin")]
544pub fn certify_assets_chunk(args: CertifyAssetsArgs) -> CertifyAssetsResult {
545    api::storage::certify_assets_chunk(args)
546}
547
548// ---------------------------------------------------------
549// Mgmt
550// ---------------------------------------------------------
551
552#[doc(hidden)]
553#[update(guard = "caller_is_admin")]
554pub async fn deposit_cycles(args: DepositCyclesArgs) {
555    junobuild_shared::mgmt::ic::deposit_cycles(args)
556        .await
557        .unwrap_or_trap()
558}
559
560#[doc(hidden)]
561#[query(guard = "caller_is_access_key")]
562pub fn memory_size() -> MemorySize {
563    junobuild_shared::segments::utils::memory_size()
564}
565
566/// Include the stock Juno satellite features into your Juno application.
567///
568/// The `include_satellite!` macro allows you to easily import and use all the essential features and
569/// functionalities provided by the Juno satellite crate (`junobuild_satellite`). These features include
570/// various functions and utilities for managing documents, assets, controllers, rules, custom domains,
571/// and more, effectively supercharging the functionality of your Juno dapp.
572///
573/// Example:
574/// ```rust
575/// use junobuild_satellite::include_satellite;
576///
577/// // Include Juno satellite features
578/// include_satellite!();
579/// ```
580///
581#[macro_export]
582macro_rules! include_satellite {
583    () => {
584        use junobuild_satellite::{
585            authenticate, authenticate_automation, certify_assets_chunk, commit_asset_upload,
586            commit_proposal, commit_proposal_asset_upload, commit_proposal_many_assets_upload,
587            count_assets, count_collection_assets, count_collection_docs, count_docs,
588            count_proposals, del_asset, del_assets, del_controller_self, del_controllers,
589            del_custom_domain, del_doc, del_docs, del_filtered_assets, del_filtered_docs,
590            del_many_assets, del_many_docs, del_rule, delete_proposal_assets, deposit_cycles,
591            get_asset, get_auth_config, get_automation_config, get_config, get_db_config,
592            get_delegation, get_doc, get_many_assets, get_many_docs, get_proposal,
593            get_storage_config, http_request, http_request_streaming_callback, init,
594            init_asset_upload, init_proposal, init_proposal_asset_upload,
595            init_proposal_many_assets_upload, list_assets, list_controllers, list_custom_domains,
596            list_docs, list_proposals, list_rules, post_upgrade, pre_upgrade, reject_proposal,
597            set_asset_token, set_auth_config, set_automation_config, set_controllers,
598            set_custom_domain, set_db_config, set_doc, set_many_docs, set_rule, set_storage_config,
599            set_storage_config_with_options, submit_proposal, switch_storage_system_memory,
600            upload_asset_chunk, upload_proposal_asset_chunk,
601        };
602
603        ic_cdk::export_candid!();
604    };
605}