feat: Implement course team management with dedicated UI and API, add course preview token generation, and refactor course settings UI.

This commit is contained in:
2026-02-18 00:01:47 -03:00
parent 89b1d1353d
commit f365e585a2
13 changed files with 798 additions and 301 deletions
+43 -4
View File
@@ -1,7 +1,7 @@
use jsonwebtoken::{encode, Header, EncodingKey};
use chrono::{Duration, Utc};
use jsonwebtoken::{EncodingKey, Header, encode};
use serde::{Deserialize, Serialize};
use uuid::Uuid;
use chrono::{Utc, Duration};
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Claims {
@@ -9,9 +9,15 @@ pub struct Claims {
pub org: Uuid,
pub exp: i64,
pub role: String,
pub course_id: Option<Uuid>,
pub token_type: Option<String>, // "access", "preview"
}
pub fn create_jwt(user_id: Uuid, organization_id: Uuid, role: &str) -> Result<String, jsonwebtoken::errors::Error> {
pub fn create_jwt(
user_id: Uuid,
organization_id: Uuid,
role: &str,
) -> Result<String, jsonwebtoken::errors::Error> {
let expiration = Utc::now()
.checked_add_signed(Duration::hours(24))
.expect("valid timestamp")
@@ -22,8 +28,41 @@ pub fn create_jwt(user_id: Uuid, organization_id: Uuid, role: &str) -> Result<St
org: organization_id,
exp: expiration,
role: role.to_string(),
course_id: None,
token_type: Some("access".to_string()),
};
let secret = std::env::var("JWT_SECRET").unwrap_or_else(|_| "secret".to_string());
encode(&Header::default(), &claims, &EncodingKey::from_secret(secret.as_ref()))
encode(
&Header::default(),
&claims,
&EncodingKey::from_secret(secret.as_ref()),
)
}
pub fn create_preview_token(
user_id: Uuid,
organization_id: Uuid,
course_id: Uuid,
) -> Result<String, jsonwebtoken::errors::Error> {
let expiration = Utc::now()
.checked_add_signed(Duration::hours(1))
.expect("valid timestamp")
.timestamp();
let claims = Claims {
sub: user_id,
org: organization_id,
exp: expiration,
role: "instructor".to_string(),
course_id: Some(course_id),
token_type: Some("preview".to_string()),
};
let secret = std::env::var("JWT_SECRET").unwrap_or_else(|_| "secret".to_string());
encode(
&Header::default(),
&claims,
&EncodingKey::from_secret(secret.as_ref()),
)
}