-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathusers.cpp
79 lines (65 loc) · 2.31 KB
/
users.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
// Endpoints for user metadata get & set
#include "users.h"
#include <string>
#include "canister.h"
#include "chats.h"
#include "http.h"
#include "ic_api.h"
#include "run.h"
void whoami() {
IC_API ic_api(CanisterQuery{std::string(__func__)}, false);
CandidTypePrincipal caller = ic_api.get_caller();
ic_api.to_wire(CandidTypeText{caller.get_text()});
}
void get_users() {
IC_API ic_api(CanisterQuery{std::string(__func__)}, false);
if (!is_canister_owner(ic_api, false)) {
std::string error_msg = "Access Denied";
ic_api.to_wire(CandidTypeVariant{
"Err", CandidTypeVariant{"Other", CandidTypeText{error_msg}}});
return;
}
// Get the number of users
uint64_t user_count = 0;
if (p_metadata_users) {
user_count = p_metadata_users->umap.size();
}
// Get the user ids
std::vector<std::string> user_ids;
if (p_metadata_users) {
for (const auto &pair : p_metadata_users->umap) {
user_ids.push_back(pair.first);
}
}
CandidTypeRecord users_record;
users_record.append("user_count", CandidTypeNat64{user_count});
users_record.append("user_ids", CandidTypeVecText{user_ids});
ic_api.to_wire(CandidTypeVariant{"Ok", users_record});
}
void get_user_metadata() {
IC_API ic_api(CanisterQuery{std::string(__func__)}, false);
if (!is_canister_owner(ic_api, false)) {
std::string error_msg = "Access Denied";
ic_api.to_wire(CandidTypeVariant{
"Err", CandidTypeVariant{"Other", CandidTypeText{error_msg}}});
return;
}
std::string in_principal;
ic_api.from_wire(CandidTypeText{&in_principal});
std::vector<uint64_t> chats_start_time;
std::vector<uint64_t> chats_total_steps;
auto it = p_metadata_users->umap.find(in_principal);
if (it != p_metadata_users->umap.end()) {
// Found the user metadata for the given in_principal
for (const MetadataChat &chat : it->second.metadata_chats) {
chats_start_time.push_back(chat.start_time);
chats_total_steps.push_back(chat.total_steps);
}
}
CandidTypeRecord user_metadata_record;
user_metadata_record.append("chats_start_time",
CandidTypeVecNat64{chats_start_time});
user_metadata_record.append("chats_total_steps",
CandidTypeVecNat64{chats_total_steps});
ic_api.to_wire(CandidTypeVariant{"Ok", user_metadata_record});
}