omni_orchestrator/schemas/v1/db/queries/
provider.rs1use crate::models::provider::{Provider, ProviderAuditLog};
2use crate::models::instance::Instance;
3use serde::{Deserialize, Serialize};
4use sqlx::{MySql, Pool};
5use anyhow::Context;
6
7pub 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
23pub 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
29pub 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
66pub 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
79pub 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
103pub 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}