headless_lms_models/
pending_roles.rs1use 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}