Skip to content

Commit b01d34c

Browse files
committed
Merge branch 'feat/file-uploading'
2 parents ffac134 + 4c10285 commit b01d34c

File tree

68 files changed

+4156
-490
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

68 files changed

+4156
-490
lines changed

Cargo.lock

Lines changed: 96 additions & 95 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ opt-level = 's'
2020

2121
[workspace.package]
2222
edition = "2021"
23-
version = "2.5.2"
23+
version = "2.6.0"
2424
repository = "https://github.com/ldclabs/ic-panda"
2525
keywords = ["canister", "icp", "panda"]
2626
categories = ["web-programming"]

pnpm-lock.yaml

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

proposals/proposal-163.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,4 @@ quill sns make-proposal --canister-ids-file ./sns_canister_ids.json --pem-file $
2222
}
2323
)" > proposal-message.json
2424

25-
# quill send proposal-message.json
25+
# quill send proposal-message.json

src/ic_message/ic_message.did

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@ type ChannelECDHInput = record {
2121
ecdh_remote : opt record { blob; blob };
2222
ecdh_pub : opt blob;
2323
};
24+
type ChannelFilesState = record {
25+
files_size_total : nat64;
26+
file_max_size : nat64;
27+
files_total : nat64;
28+
file_storage : record { principal; nat32 };
29+
};
2430
type ChannelInfo = record {
2531
id : nat32;
2632
dek : blob;
@@ -44,6 +50,7 @@ type ChannelInfo = record {
4450
latest_message_at : nat64;
4551
latest_message_by : principal;
4652
latest_message_id : nat32;
53+
files_state : opt ChannelFilesState;
4754
my_setting : ChannelSetting;
4855
};
4956
type ChannelKEKInput = record { id : nat32; kek : blob; canister : principal };

src/ic_message/src/api_update.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ async fn update_my_name(name: String) -> Result<UserInfo, String> {
6464

6565
#[ic_cdk::update(guard = "is_authenticated")]
6666
async fn update_my_image(image: String) -> Result<(), String> {
67-
if !image.starts_with("https://") {
67+
if !image.starts_with("http") {
6868
Err("invalid image url".to_string())?;
6969
}
7070

src/ic_message_channel/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,4 @@ getrandom = { workspace = true }
2323
ic-cdk = { workspace = true }
2424
ic-stable-structures = { workspace = true }
2525
ic_cose_types = { workspace = true }
26+
ic-oss-types = { workspace = true }

src/ic_message_channel/ic_message_channel.did

Lines changed: 55 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ type AddMessageOutput = record {
99
created_at : nat64;
1010
channel : nat32;
1111
};
12+
type CanisterKind = variant { OssBucket; OssCluster };
1213
type CanisterStatusResponse = record {
1314
status : CanisterStatusType;
1415
memory_size : nat;
@@ -38,6 +39,12 @@ type ChannelECDHInput = record {
3839
ecdh_remote : opt record { blob; blob };
3940
ecdh_pub : opt blob;
4041
};
42+
type ChannelFilesState = record {
43+
files_size_total : nat64;
44+
file_max_size : nat64;
45+
files_total : nat64;
46+
file_storage : record { principal; nat32 };
47+
};
4148
type ChannelInfo = record {
4249
id : nat32;
4350
dek : blob;
@@ -61,6 +68,7 @@ type ChannelInfo = record {
6168
latest_message_at : nat64;
6269
latest_message_by : principal;
6370
latest_message_id : nat32;
71+
files_state : opt ChannelFilesState;
6472
my_setting : ChannelSetting;
6573
};
6674
type ChannelSetting = record {
@@ -96,6 +104,10 @@ type DefiniteCanisterSettings = record {
96104
compute_allocation : nat;
97105
};
98106
type DeleteMessageInput = record { id : nat32; channel : nat32 };
107+
type DownloadFilesToken = record {
108+
storage : record { principal; nat32 };
109+
access_token : blob;
110+
};
99111
type InitArgs = record { managers : vec principal; name : text };
100112
type LogVisibility = variant { controllers; public };
101113
type Message = record {
@@ -114,22 +126,26 @@ type QueryStats = record {
114126
};
115127
type Result = variant { Ok : AddMessageOutput; Err : text };
116128
type Result_1 = variant { Ok; Err : text };
117-
type Result_10 = variant { Ok : record { nat64; opt Message }; Err : text };
118-
type Result_11 = variant { Ok : ChannelSetting; Err : text };
119-
type Result_12 = variant { Ok : text; Err : text };
129+
type Result_10 = variant { Ok : vec nat32; Err : text };
130+
type Result_11 = variant { Ok : record { nat64; opt Message }; Err : text };
131+
type Result_12 = variant { Ok : ChannelSetting; Err : text };
132+
type Result_13 = variant { Ok : UploadFileOutput; Err : text };
133+
type Result_14 = variant { Ok : text; Err : text };
120134
type Result_2 = variant { Ok : ChannelInfo; Err : text };
121135
type Result_3 = variant { Ok : vec ChannelBasicInfo; Err : text };
122-
type Result_4 = variant { Ok : CanisterStatusResponse; Err : text };
123-
type Result_5 = variant { Ok : opt ChannelInfo; Err : text };
124-
type Result_6 = variant { Ok : Message; Err : text };
125-
type Result_7 = variant { Ok : StateInfo; Err : text };
126-
type Result_8 = variant { Ok : vec Message; Err : text };
127-
type Result_9 = variant { Ok : vec nat32; Err : text };
136+
type Result_4 = variant { Ok : DownloadFilesToken; Err : text };
137+
type Result_5 = variant { Ok : CanisterStatusResponse; Err : text };
138+
type Result_6 = variant { Ok : opt ChannelInfo; Err : text };
139+
type Result_7 = variant { Ok : Message; Err : text };
140+
type Result_8 = variant { Ok : StateInfo; Err : text };
141+
type Result_9 = variant { Ok : vec Message; Err : text };
128142
type StateInfo = record {
129143
channel_id : nat32;
130144
incoming_gas : nat;
131145
managers : vec principal;
132146
name : text;
147+
ic_oss_cluster : opt principal;
148+
ic_oss_buckets : vec principal;
133149
burned_gas : nat;
134150
channels_total : nat64;
135151
messages_total : nat64;
@@ -146,37 +162,55 @@ type UpdateChannelMemberInput = record {
146162
member : principal;
147163
ecdh : ChannelECDHInput;
148164
};
165+
type UpdateChannelStorageInput = record { id : nat32; file_max_size : nat64 };
149166
type UpdateMySettingInput = record {
150167
id : nat32;
151168
ecdh : opt ChannelECDHInput;
152169
mute : opt bool;
153170
last_read : opt nat32;
154171
};
155172
type UpgradeArgs = record { managers : opt vec principal; name : opt text };
173+
type UploadFileInput = record {
174+
size : nat64;
175+
content_type : text;
176+
channel : nat32;
177+
};
178+
type UploadFileOutput = record {
179+
id : nat32;
180+
storage : record { principal; nat32 };
181+
name : text;
182+
access_token : blob;
183+
};
156184
service : (opt ChainArgs) -> {
157185
add_message : (AddMessageInput) -> (Result);
186+
admin_add_canister : (CanisterKind, principal) -> (Result_1);
158187
admin_add_managers : (vec principal) -> (Result_1);
159188
admin_create_channel : (CreateChannelInput) -> (Result_2);
160189
admin_remove_managers : (vec principal) -> (Result_1);
161190
admin_topup_channel : (ChannelTopupInput) -> (Result_2);
162191
batch_get_channels : (vec nat32) -> (Result_3) query;
163192
delete_message : (DeleteMessageInput) -> (Result_1);
164-
get_canister_status : () -> (Result_4) query;
165-
get_channel_if_update : (nat32, nat64) -> (Result_5) query;
166-
get_message : (nat32, nat32) -> (Result_6) query;
167-
get_state : () -> (Result_7) query;
193+
download_files_token : (nat32) -> (Result_4);
194+
get_canister_status : () -> (Result_5) query;
195+
get_channel_if_update : (nat32, nat64) -> (Result_6) query;
196+
get_message : (nat32, nat32) -> (Result_7) query;
197+
get_state : () -> (Result_8) query;
168198
leave_channel : (UpdateMySettingInput, bool) -> (Result_1);
169-
list_messages : (nat32, opt nat32, opt nat32) -> (Result_8) query;
170-
my_channel_ids : () -> (Result_9) query;
199+
list_messages : (nat32, opt nat32, opt nat32) -> (Result_9) query;
200+
my_channel_ids : () -> (Result_10) query;
171201
my_channels_if_update : (opt nat64) -> (Result_3) query;
172202
remove_member : (UpdateChannelMemberInput) -> (Result_1);
173203
truncate_messages : (TruncateMessageInput) -> (Result_1);
174-
update_channel : (UpdateChannelInput) -> (Result_6);
175-
update_manager : (UpdateChannelMemberInput) -> (Result_10);
176-
update_member : (UpdateChannelMemberInput) -> (Result_10);
177-
update_my_setting : (UpdateMySettingInput) -> (Result_11);
178-
validate2_admin_add_managers : (vec principal) -> (Result_12);
179-
validate2_admin_remove_managers : (vec principal) -> (Result_12);
204+
update_channel : (UpdateChannelInput) -> (Result_7);
205+
update_manager : (UpdateChannelMemberInput) -> (Result_11);
206+
update_member : (UpdateChannelMemberInput) -> (Result_11);
207+
update_my_setting : (UpdateMySettingInput) -> (Result_12);
208+
update_storage : (UpdateChannelStorageInput) -> (Result_7);
209+
upload_file_token : (UploadFileInput) -> (Result_13);
210+
upload_image_token : (UploadFileInput) -> (Result_13);
211+
validate2_admin_add_managers : (vec principal) -> (Result_14);
212+
validate2_admin_remove_managers : (vec principal) -> (Result_14);
213+
validate_admin_add_canister : (CanisterKind, principal) -> (Result_14);
180214
validate_admin_add_managers : (vec principal) -> (Result_1);
181215
validate_admin_remove_managers : (vec principal) -> (Result_1);
182216
}

src/ic_message_channel/src/api_admin.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,22 @@ fn admin_remove_managers(args: BTreeSet<Principal>) -> Result<(), String> {
2222
})
2323
}
2424

25+
#[ic_cdk::update(guard = "is_controller")]
26+
fn admin_add_canister(kind: types::CanisterKind, id: Principal) -> Result<(), String> {
27+
validate_admin_add_canister(kind, id)?;
28+
store::state::with_mut(|s| {
29+
match kind {
30+
types::CanisterKind::OssCluster => {
31+
s.ic_oss_cluster = Some(id);
32+
}
33+
types::CanisterKind::OssBucket => {
34+
s.ic_oss_buckets.push(id);
35+
}
36+
}
37+
Ok(())
38+
})
39+
}
40+
2541
#[ic_cdk::update]
2642
fn admin_create_channel(input: types::CreateChannelInput) -> Result<types::ChannelInfo, String> {
2743
input.validate()?;
@@ -63,3 +79,22 @@ fn validate2_admin_remove_managers(args: BTreeSet<Principal>) -> Result<String,
6379
validate_principals(&args)?;
6480
Ok("ok".to_string())
6581
}
82+
83+
#[ic_cdk::update]
84+
fn validate_admin_add_canister(kind: types::CanisterKind, id: Principal) -> Result<String, String> {
85+
store::state::with(|s| {
86+
match kind {
87+
types::CanisterKind::OssCluster => {
88+
if s.ic_oss_cluster.is_some() {
89+
Err("OSS cluster canister is already added".to_string())?;
90+
}
91+
}
92+
types::CanisterKind::OssBucket => {
93+
if s.ic_oss_buckets.contains(&id) {
94+
Err("OSS bucket canister is already added".to_string())?;
95+
}
96+
}
97+
}
98+
Ok("ok".to_string())
99+
})
100+
}

src/ic_message_channel/src/api_query.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ fn get_state() -> Result<types::StateInfo, String> {
1111
Ok(store::state::with(|s| types::StateInfo {
1212
name: s.name.clone(),
1313
managers: s.managers.clone(),
14+
ic_oss_cluster: s.ic_oss_cluster.clone(),
15+
ic_oss_buckets: s.ic_oss_buckets.clone(),
1416
channel_id: s.channel_id,
1517
incoming_gas: s.incoming_gas,
1618
burned_gas: s.burned_gas,

0 commit comments

Comments
 (0)