Initial work on payouts (badges, perms, splits) (#440)

* Initial work on payouts (badges, perms, splits)

* Fix clippy error, bitflag consistency
This commit is contained in:
Geometrically
2022-09-02 12:38:58 -07:00
committed by GitHub
parent 4c1dca73c4
commit e7c3f8bf47
13 changed files with 1030 additions and 801 deletions

View File

@@ -15,7 +15,7 @@ use crate::database::models::{generate_state_id, User};
use crate::models::error::ApiError;
use crate::models::ids::base62_impl::{parse_base62, to_base62};
use crate::models::ids::DecodingError;
use crate::models::users::Role;
use crate::models::users::{Badges, Role};
use crate::parse_strings_from_var;
use crate::util::auth::get_github_user_from_token;
use actix_web::http::StatusCode;
@@ -272,6 +272,7 @@ pub async fn auth_callback(
bio: user.bio,
created: Utc::now(),
role: Role::Developer.to_string(),
badges: Badges::default(),
}
.insert(&mut transaction)
.await?;

View File

@@ -628,6 +628,7 @@ pub async fn project_create_inner(
role: crate::models::teams::OWNER_ROLE.to_owned(),
permissions: crate::models::teams::Permissions::ALL,
accepted: true,
payouts_split: 100.0,
}],
};

View File

@@ -189,6 +189,7 @@ pub async fn join_team(
None,
None,
Some(true),
None,
&mut transaction,
)
.await?;
@@ -214,6 +215,8 @@ pub struct NewTeamMember {
pub role: String,
#[serde(default = "Permissions::default")]
pub permissions: Permissions,
#[serde(default)]
pub payouts_split: f32,
}
#[post("{id}/members")]
@@ -255,6 +258,13 @@ pub async fn add_team_member(
"The `Owner` role is restricted to one person".to_string(),
));
}
if !(0.0..=5000.0).contains(&new_member.payouts_split) {
return Err(ApiError::InvalidInput(
"Payouts split must be between 0 and 5000!".to_string(),
));
}
let request = crate::database::models::team_item::TeamMember::get_from_user_id_pending(
team_id,
new_member.user_id.into(),
@@ -291,6 +301,7 @@ pub async fn add_team_member(
role: new_member.role.clone(),
permissions: new_member.permissions,
accepted: false,
payouts_split: new_member.payouts_split,
}
.insert(&mut transaction)
.await?;
@@ -349,6 +360,7 @@ pub async fn add_team_member(
pub struct EditTeamMember {
pub permissions: Option<Permissions>,
pub role: Option<String>,
pub payouts_split: Option<f32>,
}
#[patch("{id}/members/{user_id}")]
@@ -406,6 +418,14 @@ pub async fn edit_team_member(
}
}
if let Some(payouts_split) = edit_member.payouts_split {
if !(0.0..=5000.0).contains(&payouts_split) {
return Err(ApiError::InvalidInput(
"Payouts split must be between 0 and 5000!".to_string(),
));
}
}
if edit_member.role.as_deref() == Some(crate::models::teams::OWNER_ROLE) {
return Err(ApiError::InvalidInput(
"The `Owner` role is restricted to one person".to_string(),
@@ -418,6 +438,7 @@ pub async fn edit_team_member(
edit_member.permissions,
edit_member.role.clone(),
None,
edit_member.payouts_split,
&mut transaction,
)
.await?;
@@ -491,6 +512,7 @@ pub async fn transfer_ownership(
None,
Some(crate::models::teams::DEFAULT_ROLE.to_string()),
None,
None,
&mut transaction,
)
.await?;
@@ -501,6 +523,7 @@ pub async fn transfer_ownership(
Some(Permissions::ALL),
Some(crate::models::teams::OWNER_ROLE.to_string()),
None,
None,
&mut transaction,
)
.await?;

View File

@@ -2,7 +2,7 @@ use crate::database::models::User;
use crate::file_hosting::FileHost;
use crate::models::notifications::Notification;
use crate::models::projects::{Project, ProjectStatus};
use crate::models::users::{Role, UserId};
use crate::models::users::{Badges, Role, UserId};
use crate::routes::ApiError;
use crate::util::auth::get_user_from_headers;
use crate::util::routes::read_from_payload;
@@ -154,6 +154,7 @@ pub struct EditUser {
#[validate(length(max = 160))]
pub bio: Option<Option<String>>,
pub role: Option<Role>,
pub badges: Option<Badges>,
}
#[patch("{id}")]
@@ -277,6 +278,27 @@ pub async fn user_edit(
.await?;
}
if let Some(badges) = &new_user.badges {
if !user.role.is_admin() {
return Err(ApiError::CustomAuthentication(
"You do not have the permissions to edit the badges of this user!"
.to_string(),
));
}
sqlx::query!(
"
UPDATE users
SET badges = $1
WHERE (id = $2)
",
badges.bits() as i64,
id as crate::database::models::ids::UserId,
)
.execute(&mut *transaction)
.await?;
}
transaction.commit().await?;
Ok(HttpResponse::NoContent().body(""))
} else {