Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
645 changes: 311 additions & 334 deletions Cargo.lock

Large diffs are not rendered by default.

23 changes: 12 additions & 11 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ orion = { path = "orion" }
orion-client = { path = "clients/orion-client" }
orion-scheduler-client = { path = "clients/orion-scheduler-client" }

git-internal = "0.7.6"
git-internal = "0.8.3"
libvault-core = "0.1.0"

#====
Expand Down Expand Up @@ -81,9 +81,9 @@ sea-orm = "1.1.20"
sea-orm-migration = "1.1.20"

#====
rand = "0.10.1"
rand = "0.10.2"
smallvec = "1.15.2"
bytes = "1.12.0"
bytes = "1.12.1"
chrono = { version = "0.4.45", features = ["serde"] }
hex = "0.4.3"
sha1 = "0.11"
Expand All @@ -95,8 +95,8 @@ idgenerator = "2.0.0"
config = "0.15.25"
reqwest = "0.13.4"
lazy_static = "1.5.0"
uuid = "1.23.4"
regex = "1.12.4"
uuid = "1.23.5"
regex = "1.13.0"
ed25519-dalek = "2.2.0"
ctrlc = "3.5.2"
cedar-policy = "4.11.2"
Expand All @@ -106,32 +106,33 @@ base64 = "0.22.1"

utoipa = { version = "5.5.0", features = ["chrono"] }
utoipa-axum = "0.2.0"
utoipa-swagger-ui = "9.0.2"
# vendored: ship Swagger UI from crates.io so CI/airgapped builds don't curl github.com
utoipa-swagger-ui = { version = "9.0.2", features = ["vendored"] }
tempfile = "3.27.0"
dashmap = "6.2.1"
once_cell = "1.21.4"
serial_test = "3.5.0"
sysinfo = "0.39.5"
sysinfo = "0.39.6"
http = "1.4.2"
url = "2.5.8"
jemallocator = "0.5.4"
mimalloc = "0.1.52"
dotenvy = "0.15.7"
tokio-tungstenite = "0.29"
tungstenite = "0.29"
tokio-tungstenite = "0.30"
tungstenite = "0.30"
itertools = "0.15.0"
bs58 = "0.5.1"
indexmap = "2.14"
envsubst = "0.2.1"
directories = "6.0.0"
redis = "1.3.0"
redis-test = "1.0.4"
rustls = "0.23.41"
rustls = "0.23.42"
object_store = "0.14.0"
parse-display = "0.11.0"
qlean = "0.3.0"
toml = "1.1.2"
rkyv = "0.8.16"
rkyv = "0.8.17"
percent-encoding = "2.3"


Expand Down
2 changes: 1 addition & 1 deletion ceres/src/application/api_service/mono/admin/group.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ use crate::{
fn normalize_optional_description(description: Option<String>) -> Option<String> {
description
.map(|item| item.trim().to_string())
.and_then(|item| if item.is_empty() { None } else { Some(item) })
.filter(|item| !item.is_empty())
}

fn validate_group_name(name: &str) -> Result<String, MegaError> {
Expand Down
1 change: 1 addition & 0 deletions ceres/src/application/api_service/mono/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ pub mod stack;
pub mod sync;
pub mod tag;
pub mod user;
pub mod user_approval;

pub use admin::{ADMIN_FILE, EffectiveResourcePermission};
pub use app_services::MonoAppServices;
Expand Down
84 changes: 84 additions & 0 deletions ceres/src/application/api_service/mono/user_approval.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
//! User approval status operations for [`UserApplicationService`].

use callisto::user_approval_status;
use common::errors::MegaError;
use jupiter::storage::user_approval_storage::{
APPROVAL_STATUS_APPROVED, APPROVAL_STATUS_REJECTED, UserApprovalProfile,
};

use super::context::UserApplicationService;
use crate::model::user::UserApprovalStatusRes;

impl UserApplicationService {
pub async fn get_or_init_user_approval_status(
&self,
username: &str,
campsite_user_id: &str,
display_name: &str,
email: &str,
) -> Result<user_approval_status::Model, MegaError> {
self.ctx
.storage()
.user_approval_storage()
.get_or_create(
username,
UserApprovalProfile {
campsite_user_id: campsite_user_id.to_string(),
display_name: display_name.to_string(),
email: email.to_string(),
},
)
.await
}

pub async fn list_user_approvals(
&self,
status: Option<&str>,
limit: u64,
) -> Result<Vec<user_approval_status::Model>, MegaError> {
self.ctx
.storage()
.user_approval_storage()
.list_by_status(status, limit)
.await
}

pub async fn approve_user(
&self,
username: &str,
reviewed_by: &str,
) -> Result<user_approval_status::Model, MegaError> {
self.ctx
.storage()
.user_approval_storage()
.set_status(username, APPROVAL_STATUS_APPROVED, reviewed_by)
.await
}

pub async fn reject_user(
&self,
username: &str,
reviewed_by: &str,
) -> Result<user_approval_status::Model, MegaError> {
self.ctx
.storage()
.user_approval_storage()
.set_status(username, APPROVAL_STATUS_REJECTED, reviewed_by)
.await
}
}

impl From<user_approval_status::Model> for UserApprovalStatusRes {
fn from(value: user_approval_status::Model) -> Self {
Self {
username: value.username,
campsite_user_id: value.campsite_user_id,
display_name: value.display_name,
email: value.email,
status: value.status,
reviewed_by: value.reviewed_by,
reviewed_at: value.reviewed_at.map(|dt| dt.and_utc().timestamp()),
registered_at: value.created_at.and_utc().timestamp(),
}
}
}
30 changes: 29 additions & 1 deletion ceres/src/model/user.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use callisto::{access_token, ssh_keys};
use serde::{Deserialize, Serialize};
use utoipa::ToSchema;
use utoipa::{IntoParams, ToSchema};

#[derive(Debug, Deserialize, ToSchema)]
pub struct AddSSHKey {
Expand Down Expand Up @@ -71,3 +71,31 @@ pub struct UpdateClaContentPayload {
pub struct ClaContentRes {
pub content: String,
}

#[derive(Debug, Serialize, Deserialize, ToSchema)]
pub struct UserApprovalStatusRes {
pub username: String,
pub campsite_user_id: String,
pub display_name: String,
pub email: String,
/// One of: pending, approved, rejected
pub status: String,
pub reviewed_by: Option<String>,
/// Unix timestamp
pub reviewed_at: Option<i64>,
/// Unix timestamp
pub registered_at: i64,
}

#[derive(Debug, Deserialize, IntoParams, ToSchema)]
pub struct ListUserApprovalsQuery {
/// Filter by status: pending, approved, rejected, or all (default: pending)
pub status: Option<String>,
/// Max rows to return (default 100, max 500)
pub limit: Option<u64>,
}

#[derive(Debug, Serialize, Deserialize, ToSchema)]
pub struct UserApprovalListRes {
pub items: Vec<UserApprovalStatusRes>,
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
use sea_orm_migration::{prelude::*, schema::*};

#[derive(DeriveMigrationName)]
pub struct Migration;

#[async_trait::async_trait]
impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
manager
.create_table(
Table::create()
.table(UserApprovalStatus::Table)
.if_not_exists()
.col(
ColumnDef::new(UserApprovalStatus::Username)
.string()
.not_null()
.primary_key(),
)
.col(
ColumnDef::new(UserApprovalStatus::CampsiteUserId)
.string()
.not_null()
.default(""),
)
.col(
ColumnDef::new(UserApprovalStatus::DisplayName)
.string()
.not_null()
.default(""),
)
.col(
ColumnDef::new(UserApprovalStatus::Email)
.string()
.not_null()
.default(""),
)
.col(
ColumnDef::new(UserApprovalStatus::Status)
.string()
.not_null()
.default("pending"),
)
.col(string_null(UserApprovalStatus::ReviewedBy))
.col(date_time_null(UserApprovalStatus::ReviewedAt))
.col(date_time(UserApprovalStatus::CreatedAt))
.col(date_time(UserApprovalStatus::UpdatedAt))
.to_owned(),
)
.await?;

manager
.create_index(
Index::create()
.if_not_exists()
.name("idx_user_approval_status_status_created_at")
.table(UserApprovalStatus::Table)
.col(UserApprovalStatus::Status)
.col(UserApprovalStatus::CreatedAt)
.to_owned(),
)
.await?;

Ok(())
}

async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
manager
.drop_index(
Index::drop()
.name("idx_user_approval_status_status_created_at")
.table(UserApprovalStatus::Table)
.to_owned(),
)
.await?;

manager
.drop_table(Table::drop().table(UserApprovalStatus::Table).to_owned())
.await
}
}

#[derive(DeriveIden)]
enum UserApprovalStatus {
Table,
Username,
CampsiteUserId,
DisplayName,
Email,
Status,
ReviewedBy,
ReviewedAt,
CreatedAt,
UpdatedAt,
}
2 changes: 2 additions & 0 deletions jupiter-migrate/src/migration/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ mod m20260324_033322_fix_migration;
mod m20260327_034553_drop_legacy_tasks;
mod m20260413_033315_create_artifact_tables;
mod m20260612_011232_drop_build_events_log;
mod m20260714_021900_create_user_approval_status;
mod runner;
pub use runner::apply_migrations;

Expand Down Expand Up @@ -183,6 +184,7 @@ impl MigratorTrait for Migrator {
Box::new(m20260327_034553_drop_legacy_tasks::Migration),
Box::new(m20260413_033315_create_artifact_tables::Migration),
Box::new(m20260612_011232_drop_build_events_log::Migration),
Box::new(m20260714_021900_create_user_approval_status::Migration),
]
}
}
2 changes: 1 addition & 1 deletion jupiter/callisto/src/access_token.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.19
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.20

use sea_orm::entity::prelude::*;
use serde::{Deserialize, Serialize};
Expand Down
2 changes: 1 addition & 1 deletion jupiter/callisto/src/artifact_objects.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.19
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.20

use sea_orm::entity::prelude::*;
use serde::{Deserialize, Serialize};
Expand Down
2 changes: 1 addition & 1 deletion jupiter/callisto/src/artifact_set_files.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.19
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.20

use sea_orm::entity::prelude::*;
use serde::{Deserialize, Serialize};
Expand Down
2 changes: 1 addition & 1 deletion jupiter/callisto/src/artifact_sets.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.19
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.20

use sea_orm::entity::prelude::*;
use serde::{Deserialize, Serialize};
Expand Down
2 changes: 1 addition & 1 deletion jupiter/callisto/src/audit_logs.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.19
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.20

use sea_orm::entity::prelude::*;
use serde::{Deserialize, Serialize};
Expand Down
2 changes: 1 addition & 1 deletion jupiter/callisto/src/bot_installations.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.19
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.20

use sea_orm::entity::prelude::*;
use serde::{Deserialize, Serialize};
Expand Down
2 changes: 1 addition & 1 deletion jupiter/callisto/src/bot_keys.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.19
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.20

use sea_orm::entity::prelude::*;
use serde::{Deserialize, Serialize};
Expand Down
2 changes: 1 addition & 1 deletion jupiter/callisto/src/bot_tokens.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.19
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.20

use sea_orm::entity::prelude::*;
use serde::{Deserialize, Serialize};
Expand Down
2 changes: 1 addition & 1 deletion jupiter/callisto/src/bots.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.19
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.20

use sea_orm::entity::prelude::*;
use serde::{Deserialize, Serialize};
Expand Down
2 changes: 1 addition & 1 deletion jupiter/callisto/src/buck_session.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.19
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.20

use sea_orm::entity::prelude::*;
use serde::{Deserialize, Serialize};
Expand Down
2 changes: 1 addition & 1 deletion jupiter/callisto/src/buck_session_file.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.19
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.20

use sea_orm::entity::prelude::*;
use serde::{Deserialize, Serialize};
Expand Down
2 changes: 1 addition & 1 deletion jupiter/callisto/src/build_events.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.19
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.20

use sea_orm::entity::prelude::*;
use serde::{Deserialize, Serialize};
Expand Down
Loading
Loading