feat: fixing certificate and block

This commit is contained in:
2026-04-14 13:07:45 -04:00
parent e0e6655b91
commit 169a0a18a2
21 changed files with 837 additions and 1226 deletions
+7
View File
@@ -2779,6 +2779,13 @@ pub async fn register(
State(pool): State<PgPool>,
Json(payload): Json<AuthPayload>,
) -> Result<Json<AuthResponse>, (StatusCode, String)> {
if payload.email.trim().is_empty() || payload.password.trim().is_empty() {
return Err((
StatusCode::BAD_REQUEST,
"El email y la contraseña son obligatorios".into(),
));
}
let password_hash = hash(payload.password, DEFAULT_COST)
.map_err(|_| (StatusCode::INTERNAL_SERVER_ERROR, "Hashing failed".into()))?;
@@ -98,7 +98,9 @@ async fn upsert_organization_exercise_settings(
organization_id: Uuid,
payload: &UpdateOrganizationExerciseSettingsPayload,
) -> Result<OrganizationExerciseSettings, sqlx::Error> {
sqlx::query_as::<_, OrganizationExerciseSettings>(
let mut tx = pool.begin().await?;
let settings = sqlx::query_as::<_, OrganizationExerciseSettings>(
r#"
INSERT INTO organization_exercise_settings (
organization_id,
@@ -144,8 +146,21 @@ async fn upsert_organization_exercise_settings(
.bind(payload.mermaid_enabled)
.bind(payload.code_lab_enabled)
.bind(payload.certificates_enabled)
.fetch_one(pool)
.await
.fetch_one(&mut *tx)
.await?;
// Sincronizar con la tabla organizations para que el LMS reciba el valor correcto al publicar
sqlx::query(
"UPDATE organizations SET certificates_enabled = $1, updated_at = NOW() WHERE id = $2"
)
.bind(payload.certificates_enabled)
.bind(organization_id)
.execute(&mut *tx)
.await?;
tx.commit().await?;
Ok(settings)
}
pub async fn get_organization_exercise_settings(
+6 -6
View File
@@ -60,8 +60,8 @@ pub async fn sync_sam_students(
State(pool): State<PgPool>,
) -> Result<Json<SamSyncResponse>, (StatusCode, String)> {
// Conectar a la base de datos externa de SAM
let sam_url = std::env::var("SAM_DATABASE_URL")
.map_err(|_| (StatusCode::INTERNAL_SERVER_ERROR, "SAM_DATABASE_URL no configurada".to_string()))?;
let sam_url = std::env::var("SAM_DIAGNOSTICO_DATABASE_URL")
.map_err(|_| (StatusCode::INTERNAL_SERVER_ERROR, "SAM_DIAGNOSTICO_DATABASE_URL no configurada".to_string()))?;
let sam_pool = sqlx::PgPool::connect(&sam_url)
.await
@@ -191,8 +191,8 @@ pub async fn sync_sam_assignments(
State(pool): State<PgPool>,
) -> Result<Json<SamSyncResponse>, (StatusCode, String)> {
// Conectar a la base de datos externa de SAM
let sam_url = std::env::var("SAM_DATABASE_URL")
.map_err(|_| (StatusCode::INTERNAL_SERVER_ERROR, "SAM_DATABASE_URL no configurada".to_string()))?;
let sam_url = std::env::var("SAM_DIAGNOSTICO_DATABASE_URL")
.map_err(|_| (StatusCode::INTERNAL_SERVER_ERROR, "SAM_DIAGNOSTICO_DATABASE_URL no configurada".to_string()))?;
let sam_pool = sqlx::PgPool::connect(&sam_url)
.await
@@ -382,8 +382,8 @@ pub async fn sync_all_sam(
let mut assignments_synced = 0;
// Conectar a la base de datos externa de SAM
let sam_url = std::env::var("SAM_DATABASE_URL")
.map_err(|_| (StatusCode::INTERNAL_SERVER_ERROR, "SAM_DATABASE_URL no configurada".to_string()))?;
let sam_url = std::env::var("SAM_DIAGNOSTICO_DATABASE_URL")
.map_err(|_| (StatusCode::INTERNAL_SERVER_ERROR, "SAM_DIAGNOSTICO_DATABASE_URL no configurada".to_string()))?;
let sam_pool = sqlx::PgPool::connect(&sam_url)
.await
+14 -3
View File
@@ -161,8 +161,16 @@ async fn main() {
])
.expose_headers([header::CONTENT_LENGTH, header::CONTENT_TYPE, header::CONTENT_RANGE, header::ACCEPT_RANGES]);
// Rate limiting: Deshabilitado temporalmente por problemas de compatibilidad con tower-governor
// Para habilitar en producción, configurar con GovernorLayer y ajustar los límites apropiadamente
use tower_governor::{GovernorConfigBuilder, GovernorLayer};
use std::sync::Arc;
let governor_conf = Arc::new(
GovernorConfigBuilder::default()
.per_second(5) // CMS usually has more complex operations, slightly lower limit
.burst_size(20)
.finish()
.unwrap(),
);
// Rutas protegidas que requieren autenticación y contexto de organización
let protected_routes = Router::new()
@@ -500,7 +508,10 @@ async fn main() {
)
.route_layer(middleware::from_fn(
common::middleware::org_extractor_middleware,
));
))
.route_layer(GovernorLayer {
config: governor_conf,
});
let api_routes = Router::new()
.route(