custom_arrays/model/service/
service_impl.rs

1use crate::model::endpoint_type::Endpoint;
2use crate::model::service::{CreateService, Service, UpdateService};
3use crate::schema::smdb::service::dsl::*;
4use crate::Connection;
5use diesel::{
6    insert_into, ExpressionMethods, OptionalExtension, QueryDsl, QueryResult, RunQueryDsl,
7    SelectableHelper,
8};
9
10impl Service {
11    pub fn create(db: &mut Connection, item: &CreateService) -> QueryResult<Self> {
12        insert_into(crate::schema::smdb::service::table)
13            .values(item)
14            .get_result::<Service>(db)
15    }
16
17    pub fn count(db: &mut Connection) -> QueryResult<i64> {
18        service.count().get_result::<i64>(db)
19    }
20
21    pub fn count_u64(db: &mut Connection) -> QueryResult<u64> {
22        service.count().get_result::<i64>(db).map(|c| c as u64)
23    }
24
25    pub fn check_if_service_id_exists(
26        db: &mut Connection,
27        param_service_id: i32,
28    ) -> QueryResult<bool> {
29        service
30            .find(param_service_id)
31            .first::<Service>(db)
32            .optional()
33            .map(|arg0: Option<Service>| Option::is_some(&arg0))
34    }
35
36    pub fn check_all_services_online(
37        db: &mut Connection,
38        services: &[i32],
39    ) -> QueryResult<(bool, Option<String>)> {
40        for id in services {
41            if !Service::check_if_service_id_online(db, *id)? {
42                return Ok((false, Some(format!("Service {} is offline", id))));
43            }
44        }
45
46        Ok((true, None))
47    }
48
49    pub fn check_if_service_id_online(
50        db: &mut Connection,
51        param_service_id: i32,
52    ) -> QueryResult<bool> {
53        service
54            .filter(service_id.eq(param_service_id))
55            .select(online)
56            .first::<bool>(db)
57    }
58
59    pub fn get_all_online_services(db: &mut Connection) -> QueryResult<Vec<Self>> {
60        service
61            .filter(online.eq(true))
62            .select(Service::as_returning())
63            .load::<Service>(db)
64    }
65
66    pub fn get_all_offline_services(db: &mut Connection) -> QueryResult<Vec<Self>> {
67        service
68            .filter(online.eq(false))
69            .select(Service::as_returning())
70            .load::<Service>(db)
71    }
72
73    pub fn get_all_service_dependencies(
74        db: &mut Connection,
75        param_service_id: i32,
76    ) -> QueryResult<Vec<Option<i32>>> {
77        service
78            .filter(service_id.eq(param_service_id))
79            .select(dependencies)
80            .first::<Vec<Option<i32>>>(db)
81    }
82
83    pub fn get_all_service_endpoints(
84        db: &mut Connection,
85        param_service_id: i32,
86    ) -> QueryResult<Vec<Option<Endpoint>>> {
87        service
88            .filter(service_id.eq(param_service_id))
89            .select(endpoints)
90            .first::<Vec<Option<Endpoint>>>(db)
91    }
92
93    pub fn read(db: &mut Connection, param_service_id: i32) -> QueryResult<Self> {
94        service
95            .filter(service_id.eq(param_service_id))
96            .first::<Service>(db)
97    }
98
99    pub fn read_all(db: &mut Connection) -> QueryResult<Vec<Self>> {
100        service.load::<Service>(db)
101    }
102
103    pub fn set_service_online(db: &mut Connection, param_service_id: i32) -> QueryResult<()> {
104        Self::set_svc_online(db, param_service_id, true)
105    }
106
107    pub fn set_service_offline(db: &mut Connection, param_service_id: i32) -> QueryResult<()> {
108        Self::set_svc_online(db, param_service_id, false)
109    }
110
111    fn set_svc_online(
112        db: &mut Connection,
113        param_service_id: i32,
114        param_online: bool,
115    ) -> QueryResult<()> {
116        diesel::update(service.filter(service_id.eq(param_service_id)))
117            .set(online.eq(param_online))
118            .execute(db)?;
119        Ok(())
120    }
121
122    pub fn update(
123        db: &mut Connection,
124        param_service_id: i32,
125        item: &UpdateService,
126    ) -> QueryResult<Self> {
127        diesel::update(service.filter(service_id.eq(param_service_id)))
128            .set(item)
129            .returning(Service::as_returning())
130            .get_result(db)
131    }
132
133    pub fn delete(db: &mut Connection, param_service_id: i32) -> QueryResult<usize> {
134        diesel::delete(service.filter(service_id.eq(param_service_id))).execute(db)
135    }
136}