omni_orchestrator/schemas/v1/db/queries/
provider.rs1use 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
9pub 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
25pub 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
31pub 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
68pub 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
81pub 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
105pub 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}