feat: add subscription models
parent
3c4af12fa1
commit
caad08c99e
|
@ -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"] }
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
drop table subscriptions;
|
|
@ -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)
|
||||
);
|
|
@ -1,3 +1,4 @@
|
|||
pub mod device;
|
||||
pub mod session;
|
||||
pub mod subscription;
|
||||
pub mod user;
|
||||
|
|
|
@ -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()?)?)
|
||||
}
|
||||
}
|
|
@ -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,
|
||||
);
|
||||
|
|
Loading…
Reference in New Issue