junobuild_satellite/
lib.rs

1#![doc = include_str!("../README.md")]
2
3mod api;
4mod assets;
5mod auth;
6mod certification;
7mod controllers;
8mod db;
9mod errors;
10mod guards;
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::guards::{
23    caller_is_admin_controller, caller_is_controller, caller_is_controller_with_write,
24};
25use crate::types::interface::{
26    AuthenticateResultResponse, AuthenticationArgs, Config, DeleteProposalAssets,
27    GetDelegationArgs, GetDelegationResultResponse,
28};
29use crate::types::state::CollectionType;
30use ic_cdk_macros::{init, post_upgrade, pre_upgrade, query, update};
31use junobuild_auth::state::types::config::AuthenticationConfig;
32use junobuild_cdn::proposals::{
33    CommitProposal, ListProposalResults, ListProposalsParams, Proposal, ProposalId, ProposalType,
34    RejectProposal,
35};
36use junobuild_collections::types::core::CollectionKey;
37use junobuild_collections::types::interface::{
38    DelRule, ListRulesParams, ListRulesResults, SetRule,
39};
40use junobuild_collections::types::rules::Rule;
41use junobuild_shared::ic::response::ManualReply;
42use junobuild_shared::ic::UnwrapOrTrap;
43use junobuild_shared::types::core::DomainName;
44use junobuild_shared::types::core::Key;
45use junobuild_shared::types::domain::CustomDomains;
46use junobuild_shared::types::interface::{
47    DeleteControllersArgs, DepositCyclesArgs, InitSatelliteArgs, MemorySize, SetControllersArgs,
48};
49use junobuild_shared::types::list::ListParams;
50use junobuild_shared::types::list::ListResults;
51use junobuild_shared::types::state::Controllers;
52use junobuild_storage::http::types::{
53    HttpRequest, HttpResponse, StreamingCallbackHttpResponse, StreamingCallbackToken,
54};
55use junobuild_storage::types::config::StorageConfig;
56use junobuild_storage::types::interface::{
57    AssetNoContent, CommitBatch, InitAssetKey, InitUploadResult, SetStorageConfig, UploadChunk,
58    UploadChunkResult,
59};
60use junobuild_storage::types::state::{AssetAccessToken, FullPath};
61use memory::lifecycle;
62
63// ============================================================================================
64// These types are made available for use in Serverless Functions.
65// ============================================================================================
66use crate::db::types::interface::SetDbConfig;
67use junobuild_auth::state::types::interface::SetAuthenticationConfig;
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_is_controller_with_write")]
153pub fn del_docs(collection: CollectionKey) {
154    api::db::del_docs(collection)
155}
156
157#[doc(hidden)]
158#[query(guard = "caller_is_controller_with_write")]
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// ---------------------------------------------------------
180// Rules
181// ---------------------------------------------------------
182
183#[doc(hidden)]
184#[query(guard = "caller_is_admin_controller")]
185pub fn get_rule(collection_type: CollectionType, collection: CollectionKey) -> Option<Rule> {
186    api::rules::get_rule(&collection_type, &collection)
187}
188
189#[doc(hidden)]
190#[query(guard = "caller_is_admin_controller")]
191pub fn list_rules(collection_type: CollectionType, filter: ListRulesParams) -> ListRulesResults {
192    api::rules::list_rules(&collection_type, &filter)
193}
194
195#[doc(hidden)]
196#[update(guard = "caller_is_admin_controller")]
197pub fn set_rule(collection_type: CollectionType, collection: CollectionKey, rule: SetRule) -> Rule {
198    api::rules::set_rule(collection_type, collection, rule)
199}
200
201#[doc(hidden)]
202#[update(guard = "caller_is_admin_controller")]
203pub fn del_rule(collection_type: CollectionType, collection: CollectionKey, rule: DelRule) {
204    api::rules::del_rule(collection_type, collection, rule)
205}
206
207#[doc(hidden)]
208#[update(guard = "caller_is_admin_controller")]
209pub fn switch_storage_system_memory() {
210    api::rules::switch_storage_system_memory()
211}
212
213// ---------------------------------------------------------
214// Controllers
215// ---------------------------------------------------------
216
217#[doc(hidden)]
218#[update(guard = "caller_is_admin_controller")]
219pub fn set_controllers(args: SetControllersArgs) -> Controllers {
220    api::controllers::set_controllers(args)
221}
222
223#[doc(hidden)]
224#[update(guard = "caller_is_admin_controller")]
225pub fn del_controllers(args: DeleteControllersArgs) -> Controllers {
226    api::controllers::del_controllers(args)
227}
228
229#[doc(hidden)]
230#[query(guard = "caller_is_admin_controller")]
231pub fn list_controllers() -> Controllers {
232    api::controllers::list_controllers()
233}
234
235// ---------------------------------------------------------
236// Proposal
237// ---------------------------------------------------------
238
239#[doc(hidden)]
240#[query(guard = "caller_is_controller")]
241pub fn get_proposal(proposal_id: ProposalId) -> Option<Proposal> {
242    api::cdn::get_proposal(&proposal_id)
243}
244
245#[doc(hidden)]
246#[query(guard = "caller_is_controller")]
247pub fn list_proposals(filter: ListProposalsParams) -> ListProposalResults {
248    api::cdn::list_proposals(&filter)
249}
250
251#[doc(hidden)]
252#[query(guard = "caller_is_controller")]
253pub fn count_proposals() -> usize {
254    api::cdn::count_proposals()
255}
256
257#[doc(hidden)]
258#[update(guard = "caller_is_controller")]
259pub fn init_proposal(proposal_type: ProposalType) -> (ProposalId, Proposal) {
260    api::cdn::init_proposal(&proposal_type)
261}
262
263#[doc(hidden)]
264#[update(guard = "caller_is_controller")]
265pub fn submit_proposal(proposal_id: ProposalId) -> (ProposalId, Proposal) {
266    api::cdn::submit_proposal(&proposal_id)
267}
268
269#[doc(hidden)]
270#[update(guard = "caller_is_controller_with_write", manual_reply = true)]
271pub fn reject_proposal(proposal: RejectProposal) -> ManualReply<()> {
272    api::cdn::reject_proposal(&proposal)
273}
274
275#[doc(hidden)]
276#[update(guard = "caller_is_controller_with_write", manual_reply = true)]
277pub fn commit_proposal(proposal: CommitProposal) -> ManualReply<()> {
278    api::cdn::commit_proposal(&proposal)
279}
280
281#[doc(hidden)]
282#[update(guard = "caller_is_controller_with_write")]
283pub fn delete_proposal_assets(params: DeleteProposalAssets) {
284    api::cdn::delete_proposal_assets(&params)
285}
286
287// ---------------------------------------------------------
288// Internal storage
289// ---------------------------------------------------------
290
291#[doc(hidden)]
292#[update(guard = "caller_is_controller")]
293pub fn init_proposal_asset_upload(init: InitAssetKey, proposal_id: ProposalId) -> InitUploadResult {
294    api::cdn::init_proposal_asset_upload(init, proposal_id)
295}
296
297#[doc(hidden)]
298#[update(guard = "caller_is_controller")]
299pub fn init_proposal_many_assets_upload(
300    init_asset_keys: Vec<InitAssetKey>,
301    proposal_id: ProposalId,
302) -> Vec<(FullPath, InitUploadResult)> {
303    api::cdn::init_proposal_many_assets_upload(init_asset_keys, proposal_id)
304}
305
306#[doc(hidden)]
307#[update(guard = "caller_is_controller")]
308pub fn upload_proposal_asset_chunk(chunk: UploadChunk) -> UploadChunkResult {
309    api::cdn::upload_proposal_asset_chunk(chunk)
310}
311
312#[doc(hidden)]
313#[update(guard = "caller_is_controller")]
314pub fn commit_proposal_asset_upload(commit: CommitBatch) {
315    api::cdn::commit_proposal_asset_upload(commit)
316}
317
318#[doc(hidden)]
319#[update(guard = "caller_is_controller")]
320pub fn commit_proposal_many_assets_upload(commits: Vec<CommitBatch>) {
321    api::cdn::commit_proposal_many_assets_upload(commits)
322}
323
324// ---------------------------------------------------------
325// Custom domains
326// ---------------------------------------------------------
327
328#[doc(hidden)]
329#[query(guard = "caller_is_admin_controller")]
330pub fn list_custom_domains() -> CustomDomains {
331    api::cdn::list_custom_domains()
332}
333
334#[doc(hidden)]
335#[update(guard = "caller_is_admin_controller")]
336pub fn set_custom_domain(domain_name: DomainName, bn_id: Option<String>) {
337    api::cdn::set_custom_domain(domain_name, bn_id);
338}
339
340#[doc(hidden)]
341#[update(guard = "caller_is_admin_controller")]
342pub fn del_custom_domain(domain_name: DomainName) {
343    api::cdn::del_custom_domain(domain_name);
344}
345
346// ---------------------------------------------------------
347// Config
348// ---------------------------------------------------------
349
350#[doc(hidden)]
351#[update(guard = "caller_is_admin_controller")]
352pub fn get_config() -> Config {
353    api::config::get_config()
354}
355
356// ---------------------------------------------------------
357// Authentication config
358// ---------------------------------------------------------
359
360#[doc(hidden)]
361#[update(guard = "caller_is_admin_controller")]
362pub async fn set_auth_config(config: SetAuthenticationConfig) -> AuthenticationConfig {
363    api::config::set_auth_config(config).await
364}
365
366#[doc(hidden)]
367#[query(guard = "caller_is_admin_controller")]
368pub fn get_auth_config() -> Option<AuthenticationConfig> {
369    api::config::get_auth_config()
370}
371
372// ---------------------------------------------------------
373// Db config
374// ---------------------------------------------------------
375
376#[doc(hidden)]
377#[update(guard = "caller_is_admin_controller")]
378pub fn set_db_config(config: SetDbConfig) -> DbConfig {
379    api::config::set_db_config(config)
380}
381
382#[doc(hidden)]
383#[query(guard = "caller_is_admin_controller")]
384pub fn get_db_config() -> Option<DbConfig> {
385    api::config::get_db_config()
386}
387
388// ---------------------------------------------------------
389// Storage config
390// ---------------------------------------------------------
391
392#[doc(hidden)]
393#[update(guard = "caller_is_admin_controller")]
394pub fn set_storage_config(config: SetStorageConfig) -> StorageConfig {
395    api::config::set_storage_config(config)
396}
397
398#[doc(hidden)]
399#[query(guard = "caller_is_admin_controller")]
400pub fn get_storage_config() -> StorageConfig {
401    api::config::get_storage_config()
402}
403
404// ---------------------------------------------------------
405// Http
406// ---------------------------------------------------------
407
408#[doc(hidden)]
409#[query]
410pub fn http_request(request: HttpRequest) -> HttpResponse {
411    api::http::http_request(request)
412}
413
414#[doc(hidden)]
415#[query]
416pub fn http_request_streaming_callback(
417    callback: StreamingCallbackToken,
418) -> StreamingCallbackHttpResponse {
419    api::http::http_request_streaming_callback(callback)
420}
421
422// ---------------------------------------------------------
423// Storage
424// ---------------------------------------------------------
425
426#[doc(hidden)]
427#[update]
428pub fn init_asset_upload(init: InitAssetKey) -> InitUploadResult {
429    api::storage::init_asset_upload(init)
430}
431
432#[doc(hidden)]
433#[update]
434pub fn upload_asset_chunk(chunk: UploadChunk) -> UploadChunkResult {
435    api::storage::upload_asset_chunk(chunk)
436}
437
438#[doc(hidden)]
439#[update]
440pub fn commit_asset_upload(commit: CommitBatch) {
441    api::storage::commit_asset_upload(commit);
442}
443
444#[doc(hidden)]
445#[query]
446pub fn list_assets(collection: CollectionKey, filter: ListParams) -> ListResults<AssetNoContent> {
447    api::storage::list_assets(collection, filter)
448}
449
450#[doc(hidden)]
451#[query]
452pub fn count_assets(collection: CollectionKey, filter: ListParams) -> usize {
453    api::storage::count_assets(collection, filter)
454}
455
456#[doc(hidden)]
457#[update]
458pub fn del_asset(collection: CollectionKey, full_path: FullPath) {
459    api::storage::del_asset(collection, full_path);
460}
461
462#[doc(hidden)]
463#[update]
464pub fn del_many_assets(assets: Vec<(CollectionKey, String)>) {
465    api::storage::del_many_assets(assets);
466}
467
468#[doc(hidden)]
469#[update]
470pub fn del_filtered_assets(collection: CollectionKey, filter: ListParams) {
471    api::storage::del_filtered_assets(collection, filter)
472}
473
474#[doc(hidden)]
475#[update(guard = "caller_is_controller_with_write")]
476pub fn del_assets(collection: CollectionKey) {
477    api::storage::del_assets(collection);
478}
479
480#[doc(hidden)]
481#[update]
482pub fn set_asset_token(collection: CollectionKey, full_path: FullPath, token: AssetAccessToken) {
483    api::storage::set_asset_token(collection, full_path, token);
484}
485
486#[doc(hidden)]
487#[query(guard = "caller_is_controller_with_write")]
488pub fn count_collection_assets(collection: CollectionKey) -> usize {
489    api::storage::count_collection_assets(collection)
490}
491
492#[doc(hidden)]
493#[query]
494pub fn get_asset(collection: CollectionKey, full_path: FullPath) -> Option<AssetNoContent> {
495    api::storage::get_asset(collection, full_path)
496}
497
498#[doc(hidden)]
499#[query]
500pub fn get_many_assets(
501    assets: Vec<(CollectionKey, FullPath)>,
502) -> Vec<(FullPath, Option<AssetNoContent>)> {
503    api::storage::get_many_assets(assets)
504}
505
506// ---------------------------------------------------------
507// Mgmt
508// ---------------------------------------------------------
509
510#[doc(hidden)]
511#[update(guard = "caller_is_admin_controller")]
512pub async fn deposit_cycles(args: DepositCyclesArgs) {
513    junobuild_shared::mgmt::ic::deposit_cycles(args)
514        .await
515        .unwrap_or_trap()
516}
517
518#[doc(hidden)]
519#[query(guard = "caller_is_controller")]
520pub fn memory_size() -> MemorySize {
521    junobuild_shared::canister::memory_size()
522}
523
524/// Include the stock Juno satellite features into your Juno application.
525///
526/// The `include_satellite!` macro allows you to easily import and use all the essential features and
527/// functionalities provided by the Juno satellite crate (`junobuild_satellite`). These features include
528/// various functions and utilities for managing documents, assets, controllers, rules, custom domains,
529/// and more, effectively supercharging the functionality of your Juno dapp.
530///
531/// Example:
532/// ```rust
533/// use junobuild_satellite::include_satellite;
534///
535/// // Include Juno satellite features
536/// include_satellite!();
537/// ```
538///
539#[macro_export]
540macro_rules! include_satellite {
541    () => {
542        use junobuild_satellite::{
543            authenticate, commit_asset_upload, commit_proposal, commit_proposal_asset_upload,
544            commit_proposal_many_assets_upload, count_assets, count_collection_assets,
545            count_collection_docs, count_docs, count_proposals, del_asset, del_assets,
546            del_controllers, del_custom_domain, del_doc, del_docs, del_filtered_assets,
547            del_filtered_docs, del_many_assets, del_many_docs, del_rule, delete_proposal_assets,
548            deposit_cycles, get_asset, get_auth_config, get_config, get_db_config, get_delegation,
549            get_doc, get_many_assets, get_many_docs, get_proposal, get_storage_config,
550            http_request, http_request_streaming_callback, init, init_asset_upload, init_proposal,
551            init_proposal_asset_upload, init_proposal_many_assets_upload, list_assets,
552            list_controllers, list_custom_domains, list_docs, list_proposals, list_rules,
553            post_upgrade, pre_upgrade, reject_proposal, set_asset_token, set_auth_config,
554            set_controllers, set_custom_domain, set_db_config, set_doc, set_many_docs, set_rule,
555            set_storage_config, submit_proposal, switch_storage_system_memory, upload_asset_chunk,
556            upload_proposal_asset_chunk,
557        };
558
559        ic_cdk::export_candid!();
560    };
561}