63 lines
No EOL
1.7 KiB
Rust
63 lines
No EOL
1.7 KiB
Rust
use diesel::dsl::sql;
|
|
use diesel::prelude::*;
|
|
|
|
|
|
use crate::db::errors::DatabaseError;
|
|
use crate::db::{get_connection, schema};
|
|
use crate::db::models::*;
|
|
use crate::db::schema::tags::dsl::tags;
|
|
use crate::db::schema::junction_tag::dsl::junction_tag;
|
|
|
|
|
|
pub fn create_tag(new_tag: &str) -> Result<Tag, DatabaseError> {
|
|
let connection = get_connection();
|
|
|
|
let new_tag = NewTag {
|
|
tag: new_tag,
|
|
};
|
|
|
|
diesel::insert_into(tags)
|
|
.values(&new_tag)
|
|
.execute(&connection)
|
|
.map_err(DatabaseError::InsertError)?;
|
|
|
|
let result = tags
|
|
.find(sql("last_insert_rowid()"))
|
|
.get_result::<Tag>(&connection)
|
|
.or(Err(DatabaseError::InsertGetError))?;
|
|
|
|
Ok(result)
|
|
}
|
|
|
|
pub fn get_tag(target_tag: &str) -> Result<Tag, DatabaseError> {
|
|
let connection = get_connection();
|
|
|
|
let result = tags
|
|
.filter(schema::tags::tag.eq(target_tag))
|
|
.first::<Tag>(&connection)
|
|
.or(Err(DatabaseError::NotFound))?;
|
|
|
|
Ok(result)
|
|
}
|
|
|
|
pub fn create_junction_tag(target_tag: Tag, target_relay: Option<&Relay>, target_schedule: Option<&Schedule>) -> Result<JunctionTag, DatabaseError> {
|
|
let connection = get_connection();
|
|
|
|
let new_junction_tag = NewJunctionTag {
|
|
relay_id: target_relay.map(|r| r.id),
|
|
schedule_id: target_schedule.map(|s| s.id),
|
|
tag_id: target_tag.id
|
|
};
|
|
|
|
diesel::insert_into(junction_tag)
|
|
.values(&new_junction_tag)
|
|
.execute(&connection)
|
|
.map_err(DatabaseError::InsertError)?;
|
|
|
|
let result = junction_tag
|
|
.find(sql("last_insert_rowid()"))
|
|
.get_result::<JunctionTag>(&connection)
|
|
.or(Err(DatabaseError::InsertGetError))?;
|
|
|
|
Ok(result)
|
|
} |