otter/src/db/models/subscription.rs

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(())
})
}
}