Skip to main content

headless_lms_models/
pending_roles.rs

1use crate::{
2    prelude::*,
3    roles::{RoleDomain, UserRole},
4};
5use utoipa::ToSchema;
6
7#[derive(Debug, Serialize, ToSchema)]
8
9pub struct PendingRole {
10    pub id: Uuid,
11    pub created_at: DateTime<Utc>,
12    pub updated_at: DateTime<Utc>,
13    pub deleted_at: Option<DateTime<Utc>>,
14    pub user_email: String,
15    pub role: UserRole,
16    pub course_id: Option<Uuid>,
17    pub course_instance_id: Option<Uuid>,
18    pub expires_at: DateTime<Utc>,
19}
20
21pub async fn get_all(conn: &mut PgConnection, domain: RoleDomain) -> ModelResult<Vec<PendingRole>> {
22    let res = match domain {
23        RoleDomain::Global | RoleDomain::Organization(_) | RoleDomain::Exam(_) => {
24            return Ok(Vec::new());
25        }
26        RoleDomain::Course(course_id) => {
27            sqlx::query_as!(
28                PendingRole,
29                r#"
30SELECT * FROM pending_roles
31WHERE course_id = $1
32AND deleted_at IS NULL
33AND expires_at > NOW()
34          "#,
35                course_id
36            )
37            .fetch_all(&mut *conn)
38            .await?
39        }
40        RoleDomain::CourseInstance(course_instance_id) => {
41            sqlx::query_as!(
42                PendingRole,
43                r#"
44SELECT * FROM pending_roles
45WHERE course_instance_id = $1
46AND deleted_at IS NULL
47AND expires_at > NOW()
48        "#,
49                course_instance_id
50            )
51            .fetch_all(&mut *conn)
52            .await?
53        }
54    };
55    Ok(res)
56}