omni_orchestrator/schemas/v1/db/queries/
provider.rs

1use crate::models::provider::{Provider, ProviderAuditLog};
2use crate::models::instance::Instance;
3use serde::{Deserialize, Serialize};
4use sqlx::{MySql, Pool};
5use anyhow::Context;
6
7/// Retrieves a paginated  list of providers from the database.
8pub async fn get_providers_paginated(
9    pool: &Pool<MySql>,
10    page: i64,
11    page_size: i64,
12) -> anyhow::Result<Vec<Provider>> {
13    let offset = page * page_size;
14    let query = sqlx::query_as::<_, Provider>(
15        r#"SELECT * FROM providers LIMIT ? OFFSET ?"#,
16    )
17    .bind(page_size)
18    .bind(offset);
19
20    query.fetch_all(pool).await.context("Failed to fetch providers")
21}
22
23/// Counts the total number of providers in the database.
24pub async fn get_provider_count(pool: &Pool<MySql>) -> anyhow::Result<i64> {
25    let query = sqlx::query_scalar::<_, i64>("SELECT COUNT(*) FROM providers");
26    query.fetch_one(pool).await.context("Failed to count providers")
27}
28
29/// Retrieves a pagnated list of audit logs for a specific provider.
30/// 
31/// # Arguments
32/// * `pool` - The database connection pool.
33/// * `provider_id` - The ID of the provider to retrieve audit logs for.
34/// * `page` - The page number to retrieve.
35/// * `per_page` - The number of audit logs to retrieve per page.
36/// 
37/// # Returns
38/// A JSON response containing the list of audit logs and pagination information.
39pub async fn get_provider_audit_logs_paginated(
40    pool: &Pool<MySql>,
41    provider_id: i64,
42    page: i64,
43    per_page: i64,
44) -> anyhow::Result<Vec<ProviderAuditLog>> {
45    let offset = page * per_page;
46    let query = sqlx::query_as::<_, ProviderAuditLog>(
47        r#"SELECT * FROM provider_audit_logs WHERE provider_id = ? LIMIT ? OFFSET ?"#,
48    )
49    .bind(provider_id)
50    .bind(per_page)
51    .bind(offset);
52
53    let data = query.fetch_all(pool).await.with_context(|| format!(
54        "Failed to fetch audit logs for provider_id: {}, page: {}, per_page: {}",
55        provider_id, page, per_page
56    ));
57    match data {
58        Ok(logs) => Ok(logs),
59        Err(e) => {
60            println!("Error fetching provider audit logs: {}", e);
61            Err(anyhow::anyhow!("Failed to fetch provider audit logs: {}", e))
62        },
63    }
64}
65
66/// Counts the total number of audit logs for a given provider.
67pub async fn get_provider_audit_log_count(
68    pool: &Pool<MySql>,
69    provider_id: i64,
70) -> anyhow::Result<i64> {
71    let query = sqlx::query_scalar::<_, i64>(
72        r#"SELECT COUNT(*) FROM provider_audit_logs WHERE provider_id = ?"#,
73    )
74    .bind(provider_id);
75
76    query.fetch_one(pool).await.context("Failed to count provider audit logs")
77}
78
79/// Fetch all the instances a provider is responsible for via the regions table between them, with pagination
80pub async fn get_provider_instances(
81    pool: &Pool<MySql>,
82    provider_id: i64,
83    page: i64,
84    page_size: i64,
85) -> anyhow::Result<Vec<Instance>> {
86    let offset = page * page_size;
87    let query = sqlx::query_as::<_, Instance>(
88        r#"
89        SELECT i.* 
90        FROM instances i
91        INNER JOIN regions r ON r.id = i.region_id
92        WHERE r.provider = ?
93        LIMIT ? OFFSET ?
94        "#,
95    )
96    .bind(provider_id)
97    .bind(page_size)
98    .bind(offset);
99
100    query.fetch_all(pool).await.context("Failed to fetch instances for provider")
101}
102
103/// Counts the total number of instances associated with a provider.
104pub async fn get_provider_instance_count(
105    pool: &Pool<MySql>,
106    provider_id: i64,
107) -> anyhow::Result<i64> {
108    let query = sqlx::query_scalar::<_, i64>(
109        r#"
110        SELECT COUNT(*) 
111        FROM instances i
112        INNER JOIN regions r ON r.id = i.region_id
113        WHERE r.provider = ?
114        "#,
115    )
116    .bind(provider_id);
117
118    query.fetch_one(pool).await.context("Failed to count provider instances")
119}