omni_orchestrator/schemas/v1/db/queries/platforms/
mod.rs

1use crate::models::platform::{Platform};
2use crate::models::instance::Instance;
3use anyhow::Context;
4use serde::Serialize;
5use sqlx::{MySql, Pool};
6
7// Get all platforms
8pub async fn get_all_platforms(pool: &Pool<MySql>) -> Result<Vec<Platform>, sqlx::Error> {
9    let platforms = sqlx::query_as::<_, Platform>("SELECT * FROM platforms")
10        .fetch_all(pool)
11        .await?;
12    Ok(platforms)
13}
14
15// Get platform by ID
16pub async fn get_platform_by_id(pool: &Pool<MySql>, platform_id: i64) -> Result<Platform, sqlx::Error> {
17    let platform = sqlx::query_as::<_, Platform>("SELECT * FROM platforms WHERE id = ?")
18        .bind(platform_id)
19        .fetch_one(pool)
20        .await?;
21    Ok(platform)
22}
23
24// Check if platform exists
25pub async fn check_platform_exists(pool: &Pool<MySql>, platform_id: i64) -> Result<bool, sqlx::Error> {
26    let exists = sqlx::query_scalar::<_, bool>("SELECT EXISTS(SELECT 1 FROM platforms WHERE id = ?)")
27        .bind(platform_id)
28        .fetch_one(pool)
29        .await?;
30    Ok(exists)
31}
32
33// Get platform name by ID
34pub async fn get_platform_name(pool: &Pool<MySql>, platform_id: i64) -> Result<String, sqlx::Error> {
35    let name = sqlx::query_scalar::<_, String>("SELECT name FROM platforms WHERE id = ?")
36        .bind(platform_id)
37        .fetch_one(pool)
38        .await?;
39    Ok(name)
40}
41
42// Create a new platform
43pub async fn create_platform(
44    pool: &Pool<MySql>, 
45    name: &str, 
46    description: Option<&str>
47) -> Result<Platform, sqlx::Error> {
48    // First check if a platform with this name already exists
49    let exists = sqlx::query_scalar::<_, bool>("SELECT EXISTS(SELECT 1 FROM platforms WHERE name = ?)")
50        .bind(name)
51        .fetch_one(pool)
52        .await?;
53    
54    if exists {
55        return Err(sqlx::Error::RowNotFound); // Using this error type as a simple way to indicate the row already exists
56    }
57    
58    sqlx::query(
59        "INSERT INTO platforms (name, description) VALUES (?, ?)",
60    )
61    .bind(name)
62    .bind(description)
63    .execute(pool)
64    .await?;
65    
66    // Retrieve the newly created platform
67    let platform = sqlx::query_as::<_, Platform>("SELECT * FROM platforms WHERE name = ?")
68        .bind(name)
69        .fetch_one(pool)
70        .await?;
71    
72    Ok(platform)
73}
74
75// Update platform
76pub async fn update_platform(
77    pool: &Pool<MySql>, 
78    platform_id: i64, 
79    name: Option<&str>, 
80    description: Option<&str>
81) -> Result<Platform, sqlx::Error> {
82    // Build update query dynamically based on provided fields
83    let mut query_parts = Vec::new();
84    let mut query = String::from("UPDATE platforms SET ");
85    
86    if let Some(name_val) = name {
87        query_parts.push("name = ?");
88    }
89    
90    if let Some(desc_val) = description {
91        query_parts.push("description = ?");
92    }
93    
94    // If no fields to update, return the current platform
95    if query_parts.is_empty() {
96        return get_platform_by_id(pool, platform_id).await;
97    }
98    
99    query.push_str(&query_parts.join(", "));
100    query.push_str(" WHERE id = ?");
101    
102    let mut db_query = sqlx::query(&query);
103    
104    // Bind parameters in the order they appear in the query
105    if let Some(name_val) = name {
106        db_query = db_query.bind(name_val);
107    }
108    
109    if let Some(desc_val) = description {
110        db_query = db_query.bind(desc_val);
111    }
112    
113    // Bind the WHERE clause parameter
114    db_query = db_query.bind(platform_id);
115    
116    // Execute the update
117    db_query.execute(pool).await?;
118    
119    // Return the updated platform
120    get_platform_by_id(pool, platform_id).await
121}
122
123// Delete platform
124pub async fn delete_platform(pool: &Pool<MySql>, platform_id: i64) -> Result<(), sqlx::Error> {
125    // Check if platform exists first
126    let exists = check_platform_exists(pool, platform_id).await?;
127    
128    if !exists {
129        return Err(sqlx::Error::RowNotFound);
130    }
131    
132    sqlx::query("DELETE FROM platforms WHERE id = ?")
133        .bind(platform_id)
134        .execute(pool)
135        .await?;
136    
137    Ok(())
138}
139
140// Get count of platforms
141pub async fn count_platforms(pool: &Pool<MySql>) -> Result<i64, sqlx::Error> {
142    let count = sqlx::query_scalar::<_, i64>("SELECT COUNT(*) FROM platforms")
143        .fetch_one(pool)
144        .await?;
145    Ok(count)
146}
147
148// List platforms with pagination
149pub async fn list_platforms(
150    pool: &Pool<MySql>, 
151    page: i64, 
152    per_page: i64
153) -> Result<Vec<Platform>, sqlx::Error> {
154    let offset = (page - 1) * per_page;
155    
156    let platforms = sqlx::query_as::<_, Platform>(
157        "SELECT * FROM platforms ORDER BY id LIMIT ? OFFSET ?"
158    )
159    .bind(per_page)
160    .bind(offset)
161    .fetch_all(pool)
162    .await?;
163    
164    Ok(platforms)
165}
166
167// Search platforms by name
168pub async fn search_platforms_by_name(
169    pool: &Pool<MySql>,
170    name_pattern: &str
171) -> Result<Vec<Platform>, sqlx::Error> {
172    let search_pattern = format!("%{}%", name_pattern);
173    
174    let platforms = sqlx::query_as::<_, Platform>(
175        "SELECT * FROM platforms WHERE name LIKE ? ORDER BY name"
176    )
177    .bind(search_pattern)
178    .fetch_all(pool)
179    .await?;
180    
181    Ok(platforms)
182}