Skip to content

Commit 818f833

Browse files
committed
Multisig_threshold
Get from blockchain Get from db Write to db Use it propose,approve and create allocator blockchain models added
1 parent 7478fd4 commit 818f833

File tree

11 files changed

+632
-323
lines changed

11 files changed

+632
-323
lines changed

fplus-database/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,3 @@ serde = { version = "1.0.164", features = ["derive", "std",
2424
serial_test = "3.0.0"
2525
sha1 = "0.10.6"
2626
serde_json = "1.0.96"
27-

fplus-database/src/database/allocators.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ pub async fn create_or_update_allocator(
118118
allocator_active_model.installation_id = Set(installation_id);
119119
allocator_active_model.multisig_address = Set(multisig_address);
120120
allocator_active_model.verifiers_gh_handles = Set(verifiers_gh_handles);
121+
allocator_active_model.multisig_threshold = Set(multisig_threshold);
121122

122123
let updated_model = allocator_active_model.update(&conn).await?;
123124

fplus-http-server/src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ async fn main() -> std::io::Result<()> {
5858
.service(router::allocator::allocator)
5959
.service(router::allocator::delete)
6060
.service(router::allocator::create_from_json)
61+
.service(router::application::propose)
6162
})
6263
.bind(("0.0.0.0", 8080))?
6364
.run()

fplus-http-server/src/router/application.rs

Lines changed: 105 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
use actix_web::{get, post, web, HttpResponse, Responder};
22
use fplus_lib::core::{
3-
application::file::VerifierInput, ApplicationQueryParams, CompleteNewApplicationProposalInfo, CreateApplicationInfo, DcReachedInfo, GithubQueryParams, LDNApplication, RefillInfo, ValidationPullRequestData, VerifierActionsQueryParams
4-
};
3+
application::file::VerifierInput, ApplicationQueryParams,
4+
CompleteNewApplicationProposalInfo, CreateApplicationInfo, DcReachedInfo,
5+
GithubQueryParams, LDNApplication, RefillInfo, ValidationPullRequestData,
6+
VerifierActionsQueryParams,
7+
};
58

69
#[post("/application")]
710
pub async fn create(info: web::Json<CreateApplicationInfo>) -> impl Responder {
@@ -21,24 +24,30 @@ pub async fn single(query: web::Query<ApplicationQueryParams>) -> impl Responder
2124
let ApplicationQueryParams { id, owner, repo } = query.into_inner();
2225

2326
match LDNApplication::load_from_db(id, owner, repo).await {
24-
Ok(app_file) => return HttpResponse::Ok().body(serde_json::to_string_pretty(&app_file).unwrap()),
27+
Ok(app_file) => {
28+
return HttpResponse::Ok().body(serde_json::to_string_pretty(&app_file).unwrap())
29+
}
2530
Err(e) => return HttpResponse::BadRequest().body(e.to_string()),
2631
};
2732
}
2833

2934
#[post("/application/trigger")]
30-
pub async fn trigger(
31-
query: web::Query<VerifierActionsQueryParams>,
32-
) -> impl Responder {
33-
let ldn_application = match LDNApplication::load(query.id.clone(), query.owner.clone(), query.repo.clone()).await {
34-
Ok(app) => app,
35-
Err(e) => {
36-
return HttpResponse::BadRequest().body(e.to_string());
37-
}
38-
};
35+
pub async fn trigger(query: web::Query<VerifierActionsQueryParams>) -> impl Responder {
36+
let ldn_application =
37+
match LDNApplication::load(query.id.clone(), query.owner.clone(), query.repo.clone()).await
38+
{
39+
Ok(app) => app,
40+
Err(e) => {
41+
return HttpResponse::BadRequest().body(e.to_string());
42+
}
43+
};
3944
dbg!(&ldn_application);
4045
match ldn_application
41-
.complete_governance_review(query.github_username.clone(), query.owner.clone(), query.repo.clone())
46+
.complete_governance_review(
47+
query.github_username.clone(),
48+
query.owner.clone(),
49+
query.repo.clone(),
50+
)
4251
.await
4352
{
4453
Ok(app) => HttpResponse::Ok().body(serde_json::to_string_pretty(&app).unwrap()),
@@ -54,24 +63,28 @@ pub async fn propose(
5463
info: web::Json<CompleteNewApplicationProposalInfo>,
5564
query: web::Query<VerifierActionsQueryParams>,
5665
) -> impl Responder {
57-
let CompleteNewApplicationProposalInfo {
58-
signer,
59-
request_id,
60-
} = info.into_inner();
61-
let ldn_application = match LDNApplication::load(query.id.clone(), query.owner.clone(), query.repo.clone()).await {
62-
Ok(app) => app,
63-
Err(e) => {
64-
return HttpResponse::BadRequest().body(e.to_string());
65-
}
66-
};
66+
let CompleteNewApplicationProposalInfo { signer, request_id } = info.into_inner();
67+
let ldn_application =
68+
match LDNApplication::load(query.id.clone(), query.owner.clone(), query.repo.clone()).await
69+
{
70+
Ok(app) => app,
71+
Err(e) => {
72+
return HttpResponse::BadRequest().body(e.to_string());
73+
}
74+
};
6775
let updated_signer = VerifierInput {
6876
github_username: query.github_username.clone(), // Use the provided `github_username` parameter
6977
signing_address: signer.signing_address,
7078
created_at: signer.created_at,
7179
message_cid: signer.message_cid,
7280
};
7381
match ldn_application
74-
.complete_new_application_proposal(updated_signer, request_id, query.owner.clone(), query.repo.clone())
82+
.complete_new_application_proposal(
83+
updated_signer,
84+
request_id,
85+
query.owner.clone(),
86+
query.repo.clone(),
87+
)
7588
.await
7689
{
7790
Ok(app) => HttpResponse::Ok().body(serde_json::to_string_pretty(&app).unwrap()),
@@ -86,24 +99,28 @@ pub async fn approve(
8699
query: web::Query<VerifierActionsQueryParams>,
87100
info: web::Json<CompleteNewApplicationProposalInfo>,
88101
) -> impl Responder {
89-
let CompleteNewApplicationProposalInfo {
90-
signer,
91-
request_id,
92-
} = info.into_inner();
93-
let ldn_application = match LDNApplication::load(query.id.clone(), query.owner.clone(), query.repo.clone()).await {
94-
Ok(app) => app,
95-
Err(e) => {
96-
return HttpResponse::BadRequest().body(e.to_string());
97-
}
98-
};
102+
let CompleteNewApplicationProposalInfo { signer, request_id } = info.into_inner();
103+
let ldn_application =
104+
match LDNApplication::load(query.id.clone(), query.owner.clone(), query.repo.clone()).await
105+
{
106+
Ok(app) => app,
107+
Err(e) => {
108+
return HttpResponse::BadRequest().body(e.to_string());
109+
}
110+
};
99111
let updated_signer = VerifierInput {
100112
github_username: query.github_username.clone(), // Use the provided `github_username` parameter
101113
signing_address: signer.signing_address,
102114
created_at: signer.created_at,
103115
message_cid: signer.message_cid,
104116
};
105117
match ldn_application
106-
.complete_new_application_approval(updated_signer, request_id, query.owner.clone(), query.repo.clone())
118+
.complete_new_application_approval(
119+
updated_signer,
120+
request_id,
121+
query.owner.clone(),
122+
query.repo.clone(),
123+
)
107124
.await
108125
{
109126
Ok(app) => HttpResponse::Ok().body(serde_json::to_string_pretty(&app).unwrap()),
@@ -114,17 +131,19 @@ pub async fn approve(
114131
#[get("/applications")]
115132
pub async fn all_applications() -> impl Responder {
116133
match LDNApplication::all_applications().await {
117-
Ok(apps) => {
118-
match serde_json::to_string_pretty(&apps) {
119-
Ok(json) => HttpResponse::Ok().content_type("application/json").body(json),
120-
Err(e) => HttpResponse::InternalServerError().body(format!("Failed to serialize applications: {}", e)),
121-
}
134+
Ok(apps) => match serde_json::to_string_pretty(&apps) {
135+
Ok(json) => HttpResponse::Ok()
136+
.content_type("application/json")
137+
.body(json),
138+
Err(e) => HttpResponse::InternalServerError()
139+
.body(format!("Failed to serialize applications: {}", e)),
122140
},
123-
Err(errors) => {
124-
match serde_json::to_string_pretty(&errors) {
125-
Ok(json) => HttpResponse::BadRequest().content_type("application/json").body(json),
126-
Err(e) => HttpResponse::InternalServerError().body(format!("Failed to serialize errors: {}", e)),
127-
}
141+
Err(errors) => match serde_json::to_string_pretty(&errors) {
142+
Ok(json) => HttpResponse::BadRequest()
143+
.content_type("application/json")
144+
.body(json),
145+
Err(e) => HttpResponse::InternalServerError()
146+
.body(format!("Failed to serialize errors: {}", e)),
128147
},
129148
}
130149
}
@@ -160,7 +179,7 @@ pub async fn refill(data: web::Json<RefillInfo>) -> actix_web::Result<impl Respo
160179

161180
#[post("/application/totaldcreached")]
162181
pub async fn total_dc_reached(data: web::Json<DcReachedInfo>) -> actix_web::Result<impl Responder> {
163-
let DcReachedInfo {id, owner, repo} = data.into_inner();
182+
let DcReachedInfo { id, owner, repo } = data.into_inner();
164183
match LDNApplication::total_dc_reached(id, owner, repo).await {
165184
Ok(applications) => Ok(HttpResponse::Ok().json(applications)),
166185
Err(e) => Ok(HttpResponse::BadRequest().body(e.to_string())),
@@ -171,7 +190,12 @@ pub async fn total_dc_reached(data: web::Json<DcReachedInfo>) -> actix_web::Resu
171190
pub async fn validate_application_flow(
172191
info: web::Json<ValidationPullRequestData>,
173192
) -> impl Responder {
174-
let ValidationPullRequestData { pr_number, user_handle, owner, repo } = info.into_inner();
193+
let ValidationPullRequestData {
194+
pr_number,
195+
user_handle,
196+
owner,
197+
repo,
198+
} = info.into_inner();
175199
let pr_number = pr_number.trim_matches('"').parse::<u64>();
176200
match pr_number {
177201
Ok(pr_number) => {
@@ -188,7 +212,12 @@ pub async fn validate_application_flow(
188212
pub async fn validate_application_trigger(
189213
info: web::Json<ValidationPullRequestData>,
190214
) -> impl Responder {
191-
let ValidationPullRequestData { pr_number, user_handle, owner, repo } = info.into_inner();
215+
let ValidationPullRequestData {
216+
pr_number,
217+
user_handle,
218+
owner,
219+
repo,
220+
} = info.into_inner();
192221
let pr_number = pr_number.trim_matches('"').parse::<u64>();
193222

194223
match pr_number {
@@ -206,7 +235,12 @@ pub async fn validate_application_trigger(
206235
pub async fn validate_application_proposal(
207236
info: web::Json<ValidationPullRequestData>,
208237
) -> impl Responder {
209-
let ValidationPullRequestData { pr_number, user_handle: _, owner, repo } = info.into_inner();
238+
let ValidationPullRequestData {
239+
pr_number,
240+
user_handle: _,
241+
owner,
242+
repo,
243+
} = info.into_inner();
210244
let pr_number = pr_number.trim_matches('"').parse::<u64>();
211245

212246
match pr_number {
@@ -222,7 +256,12 @@ pub async fn validate_application_proposal(
222256
pub async fn validate_application_approval(
223257
info: web::Json<ValidationPullRequestData>,
224258
) -> impl Responder {
225-
let ValidationPullRequestData { pr_number, user_handle: _, owner, repo } = info.into_inner();
259+
let ValidationPullRequestData {
260+
pr_number,
261+
user_handle: _,
262+
owner,
263+
repo,
264+
} = info.into_inner();
226265
let pr_number = pr_number.trim_matches('"').parse::<u64>();
227266

228267
match pr_number {
@@ -238,29 +277,36 @@ pub async fn validate_application_approval(
238277
pub async fn validate_application_merge(
239278
info: web::Json<ValidationPullRequestData>,
240279
) -> impl Responder {
241-
let ValidationPullRequestData { pr_number, user_handle: _, owner, repo } = info.into_inner();
280+
let ValidationPullRequestData {
281+
pr_number,
282+
user_handle: _,
283+
owner,
284+
repo,
285+
} = info.into_inner();
242286
let pr_number = pr_number.trim_matches('"').parse::<u64>();
243287

244288
match pr_number {
245-
Ok(pr_number) => match LDNApplication::validate_merge_application(pr_number, owner, repo).await {
246-
Ok(result) => HttpResponse::Ok().json(result),
247-
Err(e) => HttpResponse::InternalServerError().json(e.to_string()),
248-
},
289+
Ok(pr_number) => {
290+
match LDNApplication::validate_merge_application(pr_number, owner, repo).await {
291+
Ok(result) => HttpResponse::Ok().json(result),
292+
Err(e) => HttpResponse::InternalServerError().json(e.to_string()),
293+
}
294+
}
249295
Err(_) => HttpResponse::BadRequest().json("Invalid PR Number"),
250296
}
251297
}
252298

253299
#[post("application/cache/renewal")]
254-
pub async fn cache_renewal(
255-
info: web::Json<GithubQueryParams>,
256-
) -> impl Responder {
300+
pub async fn cache_renewal(info: web::Json<GithubQueryParams>) -> impl Responder {
257301
let GithubQueryParams { owner, repo } = info.into_inner();
258302
let active_result = LDNApplication::cache_renewal_active(owner.clone(), repo.clone()).await;
259303

260304
let merged_result = LDNApplication::cache_renewal_merged(owner, repo).await;
261305

262306
match (active_result, merged_result) {
263-
(Ok(_), Ok(_)) => HttpResponse::Ok().json("Cache renewal for active and merged applications succeeded"),
307+
(Ok(_), Ok(_)) => {
308+
HttpResponse::Ok().json("Cache renewal for active and merged applications succeeded")
309+
}
264310
(Err(e), _) | (_, Err(e)) => HttpResponse::InternalServerError().json(e.to_string()),
265311
}
266312
}

fplus-lib/src/core/allocator/mod.rs

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,46 @@
11
use octocrab::models::repos::ContentItems;
22

33
use crate::config::get_env_var_or_default;
4-
use crate::{base64::decode_allocator_model, error::LDNError, external_services::github::GithubWrapper};
4+
use crate::external_services::filecoin::get_multisig_threshold_for_actor;
5+
use crate::{
6+
base64::decode_allocator_model, error::LDNError, external_services::github::GithubWrapper,
7+
};
58

69
use self::file::AllocatorModel;
710

811
pub mod file;
912

1013
pub async fn process_allocator_file(file_name: &str) -> Result<AllocatorModel, LDNError> {
11-
1214
let owner = get_env_var_or_default("ALLOCATOR_GOVERNANCE_OWNER");
1315
let repo = get_env_var_or_default("ALLOCATOR_GOVERNANCE_REPO");
1416
let branch = "main";
1517
let path = file_name.to_string();
1618

1719
let gh = GithubWrapper::new(owner.to_string(), repo.to_string());
18-
let content_items = gh.get_file(&path, branch).await.map_err(|e| LDNError::Load(e.to_string()))?;
19-
let model = content_items_to_allocator_model(content_items).map_err(|e| LDNError::Load(e.to_string()))?;
20+
let content_items = gh
21+
.get_file(&path, branch)
22+
.await
23+
.map_err(|e| LDNError::Load(e.to_string()))?;
24+
let mut model = content_items_to_allocator_model(content_items)
25+
.map_err(|e| LDNError::Load(e.to_string()))?;
26+
27+
// Get multisig threshold from the blockchain if multisig address is available
28+
if let Ok(blockchain_threshold) = get_multisig_threshold_for_actor(&model.multisig_address).await {
29+
model.multisig_threshold = Some(blockchain_threshold as i32);
30+
} else {
31+
log::warn!("Blockchain multisig threshold not found, using default or provided value");
32+
model.multisig_threshold = model.multisig_threshold.or(Some(2));
33+
}
2034

2135
Ok(model)
2236
}
2337

24-
2538
fn content_items_to_allocator_model(file: ContentItems) -> Result<AllocatorModel, LDNError> {
2639
let encoded_content = match file.items.get(0).and_then(|f| f.content.clone()) {
2740
Some(content) => {
2841
log::info!("Fetched content: {:?}", content);
2942
content
30-
},
43+
}
3144
None => {
3245
log::error!("Allocator file is corrupted or empty");
3346
return Err(LDNError::Load("Allocator file is corrupted".to_string()));
@@ -41,10 +54,12 @@ fn content_items_to_allocator_model(file: ContentItems) -> Result<AllocatorModel
4154
Some(model) => {
4255
log::info!("Parsed allocator model successfully");
4356
Ok(model)
44-
},
57+
}
4558
None => {
4659
log::error!("Failed to parse allocator model");
47-
Err(LDNError::Load("Failed to parse allocator model".to_string()))
60+
Err(LDNError::Load(
61+
"Failed to parse allocator model".to_string(),
62+
))
4863
}
4964
}
50-
}
65+
}

0 commit comments

Comments
 (0)