feat: add subscription models

episode-actions
Jef Roosens 2025-02-24 14:46:18 +01:00
parent 3c4af12fa1
commit caad08c99e
No known key found for this signature in database
GPG Key ID: 21FD3D77D56BAF49
6 changed files with 61 additions and 1 deletions

View File

@ -5,7 +5,7 @@ edition = "2021"
[dependencies]
argon2 = "0.5.3"
axum = "0.8.1"
axum = { version = "0.8.1" }
axum-extra = { version = "0.10", features = ["cookie", "typed-header"] }
clap = { version = "4.5.30", features = ["derive", "env"] }
diesel = { version = "2.2.7", features = ["r2d2", "sqlite", "returning_clauses_for_sqlite_3_35"] }

View File

@ -0,0 +1 @@
drop table subscriptions;

View File

@ -0,0 +1,9 @@
create table subscriptions (
id integer primary key not null,
device_id bigint not null
references devices (id)
on delete cascade,
url text not null,
unique (device_id, url)
);

View File

@ -1,3 +1,4 @@
pub mod device;
pub mod session;
pub mod subscription;
pub mod user;

View File

@ -0,0 +1,39 @@
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::dsl::subscriptions
.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()?)?)
}
}

View File

@ -18,6 +18,14 @@ diesel::table! {
}
}
diesel::table! {
subscriptions (id) {
id -> BigInt,
device_id -> BigInt,
url -> Text,
}
}
diesel::table! {
users (id) {
id -> BigInt,
@ -28,9 +36,11 @@ diesel::table! {
diesel::joinable!(devices -> users (user_id));
diesel::joinable!(sessions -> users (user_id));
diesel::joinable!(subscriptions -> devices (device_id));
diesel::allow_tables_to_appear_in_same_query!(
devices,
sessions,
subscriptions,
users,
);