omni_orchestrator/schemas/v1/db/queries/platforms/
mod.rs1use crate::models::platform::{Platform};
2use crate::models::instance::Instance;
3use anyhow::Context;
4use serde::Serialize;
5use sqlx::{MySql, Pool};
6
7pub 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
15pub 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
24pub 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
33pub 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
42pub async fn create_platform(
44 pool: &Pool<MySql>,
45 name: &str,
46 description: Option<&str>
47) -> Result<Platform, sqlx::Error> {
48 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); }
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 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
75pub 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 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 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 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 db_query = db_query.bind(platform_id);
115
116 db_query.execute(pool).await?;
118
119 get_platform_by_id(pool, platform_id).await
121}
122
123pub async fn delete_platform(pool: &Pool<MySql>, platform_id: i64) -> Result<(), sqlx::Error> {
125 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
140pub 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
148pub 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
167pub 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}