cortex/models/
services.rs1#![allow(clippy::extra_unused_lifetimes)]
2use std::collections::HashMap;
3
4use diesel::result::Error;
5use diesel::*;
6
7use crate::schema::services;
8use crate::schema::worker_metadata;
9
10use super::worker_metadata::WorkerMetadata;
11use crate::concerns::CortexInsertable;
12
13#[derive(Identifiable, Queryable, AsChangeset, Clone, Debug)]
15pub struct Service {
17 pub id: i32,
19 pub name: String,
21 pub version: f32,
23 pub inputformat: String,
25 pub outputformat: String,
27 pub inputconverter: Option<String>,
31 pub complex: bool,
34 pub description: String,
36 pub public_id: uuid::Uuid,
39 pub lease_timeout_seconds: Option<i32>,
45}
46#[derive(Insertable, Clone, Debug)]
48#[diesel(table_name = services)]
49pub struct NewService {
50 pub name: String,
52 pub version: f32,
54 pub inputformat: String,
56 pub outputformat: String,
58 pub inputconverter: Option<String>,
62 pub complex: bool,
65 pub description: String,
67}
68impl CortexInsertable for NewService {
69 fn create(&self, connection: &mut PgConnection) -> Result<usize, Error> {
70 insert_into(services::table)
71 .values(self)
72 .execute(connection)
73 }
74}
75
76impl Service {
77 pub fn find_by_name(name_query: &str, connection: &mut PgConnection) -> Result<Service, Error> {
79 use crate::schema::services::name;
80 services::table
81 .filter(name.eq(name_query))
82 .get_result(connection)
83 }
84
85 pub fn all(connection: &mut PgConnection) -> Result<Vec<Self>, Error> {
88 services::table
89 .order(services::name.asc())
90 .get_results(connection)
91 }
92
93 pub fn set_lease_timeout(
98 &self,
99 seconds: Option<i32>,
100 connection: &mut PgConnection,
101 ) -> Result<usize, Error> {
102 update(services::table.find(self.id))
103 .set(services::lease_timeout_seconds.eq(seconds))
104 .execute(connection)
105 }
106
107 pub fn to_hash(&self) -> HashMap<String, String> {
109 let mut hm = HashMap::new();
110 hm.insert("id".to_string(), self.id.to_string());
111 hm.insert("name".to_string(), self.name.clone());
112 hm.insert("description".to_string(), self.description.clone());
113 hm.insert("version".to_string(), self.version.to_string());
114 hm.insert("inputformat".to_string(), self.inputformat.clone());
115 hm.insert("outputformat".to_string(), self.outputformat.clone());
116 hm.insert(
117 "inputconverter".to_string(),
118 match self.inputconverter.clone() {
119 Some(ic) => ic,
120 None => "None".to_string(),
121 },
122 );
123 hm.insert("complex".to_string(), self.complex.to_string());
124 hm.insert(
127 "lease_timeout_seconds".to_string(),
128 self
129 .lease_timeout_seconds
130 .map(|seconds| seconds.to_string())
131 .unwrap_or_default(),
132 );
133 hm
134 }
135
136 pub fn select_workers(
138 &self,
139 connection: &mut PgConnection,
140 ) -> Result<Vec<WorkerMetadata>, Error> {
141 let workers_query = worker_metadata::table
142 .filter(worker_metadata::service_id.eq(self.id))
143 .order(worker_metadata::name.asc());
144 let workers: Vec<WorkerMetadata> = workers_query.get_results(connection)?;
145 Ok(workers)
146 }
147
148 pub fn task_count_for_corpus(
152 &self,
153 corpus: &super::Corpus,
154 connection: &mut PgConnection,
155 ) -> Result<i64, Error> {
156 use crate::schema::tasks;
157 tasks::table
158 .filter(tasks::service_id.eq(self.id))
159 .filter(tasks::corpus_id.eq(corpus.id))
160 .count()
161 .get_result(connection)
162 }
163
164 pub fn total_task_count(&self, connection: &mut PgConnection) -> Result<i64, Error> {
167 use crate::schema::tasks;
168 tasks::table
169 .filter(tasks::service_id.eq(self.id))
170 .count()
171 .get_result(connection)
172 }
173
174 pub fn deactivate_from_corpus(
183 &self,
184 corpus: &super::Corpus,
185 connection: &mut PgConnection,
186 ) -> Result<usize, Error> {
187 use crate::schema::tasks;
188 use crate::schema::{log_errors, log_fatals, log_infos, log_invalids, log_warnings};
189 let service_id_val = self.id;
190 let corpus_id_val = corpus.id;
191 connection.transaction(|t_connection| {
192 let pair_task_ids = || {
193 tasks::table
194 .filter(tasks::service_id.eq(service_id_val))
195 .filter(tasks::corpus_id.eq(corpus_id_val))
196 .select(tasks::id)
197 };
198 delete(log_infos::table.filter(log_infos::task_id.eq_any(pair_task_ids())))
199 .execute(t_connection)?;
200 delete(log_warnings::table.filter(log_warnings::task_id.eq_any(pair_task_ids())))
201 .execute(t_connection)?;
202 delete(log_errors::table.filter(log_errors::task_id.eq_any(pair_task_ids())))
203 .execute(t_connection)?;
204 delete(log_fatals::table.filter(log_fatals::task_id.eq_any(pair_task_ids())))
205 .execute(t_connection)?;
206 delete(log_invalids::table.filter(log_invalids::task_id.eq_any(pair_task_ids())))
207 .execute(t_connection)?;
208 delete(
209 tasks::table
210 .filter(tasks::service_id.eq(service_id_val))
211 .filter(tasks::corpus_id.eq(corpus_id_val)),
212 )
213 .execute(t_connection)
214 })
215 }
216
217 pub fn destroy(self, connection: &mut PgConnection) -> Result<usize, Error> {
235 use crate::schema::tasks;
236 use crate::schema::{log_errors, log_fatals, log_infos, log_invalids, log_warnings};
237 let service_id_val = self.id;
238 connection.transaction(|t_connection| {
239 let service_task_ids = || {
242 tasks::table
243 .filter(tasks::service_id.eq(service_id_val))
244 .select(tasks::id)
245 };
246 delete(log_infos::table.filter(log_infos::task_id.eq_any(service_task_ids())))
247 .execute(t_connection)?;
248 delete(log_warnings::table.filter(log_warnings::task_id.eq_any(service_task_ids())))
249 .execute(t_connection)?;
250 delete(log_errors::table.filter(log_errors::task_id.eq_any(service_task_ids())))
251 .execute(t_connection)?;
252 delete(log_fatals::table.filter(log_fatals::task_id.eq_any(service_task_ids())))
253 .execute(t_connection)?;
254 delete(log_invalids::table.filter(log_invalids::task_id.eq_any(service_task_ids())))
255 .execute(t_connection)?;
256 delete(tasks::table.filter(tasks::service_id.eq(service_id_val))).execute(t_connection)?;
258 delete(services::table.filter(services::id.eq(service_id_val))).execute(t_connection)
260 })
261 }
262}