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

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