57 lines
1.7 KiB
Rust
57 lines
1.7 KiB
Rust
use diesel::prelude::*;
|
|
use serde::{Deserialize, Serialize};
|
|
|
|
use crate::db::{schema::*, DbPool, DbResult};
|
|
|
|
#[derive(Serialize, Deserialize, Clone, Queryable, Selectable)]
|
|
#[diesel(table_name = subscriptions)]
|
|
#[diesel(check_for_backend(diesel::sqlite::Sqlite))]
|
|
pub struct Subscription {
|
|
pub id: i64,
|
|
pub device_id: i64,
|
|
pub url: String,
|
|
}
|
|
|
|
#[derive(Deserialize, Insertable)]
|
|
#[diesel(table_name = subscriptions)]
|
|
#[diesel(check_for_backend(diesel::sqlite::Sqlite))]
|
|
pub struct NewSubscription {
|
|
pub device_id: i64,
|
|
pub url: String,
|
|
}
|
|
|
|
impl Subscription {
|
|
pub fn for_device(pool: &DbPool, device_id: i64) -> DbResult<Vec<String>> {
|
|
Ok(subscriptions::table
|
|
.select(subscriptions::url)
|
|
.filter(subscriptions::device_id.eq(device_id))
|
|
.get_results(&mut pool.get()?)?)
|
|
}
|
|
|
|
pub fn for_user(pool: &DbPool, user_id: i64) -> DbResult<Vec<String>> {
|
|
Ok(subscriptions::table
|
|
.inner_join(devices::table)
|
|
.filter(devices::user_id.eq(user_id))
|
|
.select(subscriptions::url)
|
|
.distinct()
|
|
.get_results(&mut pool.get()?)?)
|
|
}
|
|
|
|
pub fn update_for_device(pool: &DbPool, device_id: i64, urls: Vec<String>) -> DbResult<()> {
|
|
pool.get()?.transaction(|conn| {
|
|
diesel::delete(subscriptions::table.filter(subscriptions::device_id.eq(device_id)))
|
|
.execute(conn)?;
|
|
|
|
diesel::insert_into(subscriptions::table)
|
|
.values(
|
|
urls.into_iter()
|
|
.map(|url| NewSubscription { device_id, url })
|
|
.collect::<Vec<_>>(),
|
|
)
|
|
.execute(conn)?;
|
|
|
|
Ok(())
|
|
})
|
|
}
|
|
}
|