Add events table and event functions to database

Signed-off-by: trivernis <trivernis@protonmail.com>
feature/events
trivernis 3 years ago
parent bf2f01a46d
commit 0f2969085b
Signed by: Trivernis
GPG Key ID: DFFFCC2C7A02DB45

@ -0,0 +1,2 @@
-- This file should undo anything in `up.sql`
DROP TABLE events;

@ -0,0 +1,10 @@
-- Your SQL goes here
CREATE TABLE events (
id SERIAL PRIMARY KEY,
guild_id BIGINT NOT NULL,
channel_id BIGINT NOT NULL,
name VARCHAR(128) NOT NULL,
description VARCHAR(4096) NOT NULL,
event_start timestamp NOT NULL,
event_end timestamp
)

@ -0,0 +1,84 @@
use std::time::SystemTime;
use diesel::insert_into;
use diesel::prelude::*;
use tokio_diesel::*;
use crate::error::DatabaseResult;
use crate::models::*;
use crate::schema::*;
use crate::Database;
use diesel::dsl::now;
impl Database {
/// Adds a command statistic to the database
pub async fn add_event(
&self,
guild_id: u64,
channel_id: u64,
name: String,
description: String,
event_start: SystemTime,
event_end: Option<SystemTime>,
) -> DatabaseResult<()> {
use events::dsl;
log::trace!("Adding event to database");
insert_into(dsl::events)
.values(EventInsert {
guild_id: guild_id as i64,
channel_id: channel_id as i64,
name,
description,
event_start,
event_end,
})
.execute_async(&self.pool)
.await?;
Ok(())
}
/// Returns events for a given guild started before a given timestamp
pub async fn get_events_started_before(
&self,
time: SystemTime,
guild_id: u64,
) -> DatabaseResult<Vec<Event>> {
use events::dsl;
log::trace!("Querying events before {:?}", time);
let events: Vec<Event> = dsl::events
.filter(dsl::event_start.lt(time))
.filter(dsl::guild_id.eq(guild_id as i64))
.load_async::<Event>(&self.pool)
.await?;
Ok(events)
}
/// Returns events for a given guild started after a given timestamp
pub async fn get_events_starting_after(
&self,
time: SystemTime,
guild_id: u64,
) -> DatabaseResult<Vec<Event>> {
use events::dsl;
log::trace!("Querying events after {:?}", time);
let events: Vec<Event> = dsl::events
.filter(dsl::event_start.gt(time))
.filter(dsl::guild_id.eq(guild_id as i64))
.load_async::<Event>(&self.pool)
.await?;
Ok(events)
}
/// Deletes events that completed in the past
pub async fn delete_completed_events(&self) -> DatabaseResult<()> {
use events::dsl;
log::trace!("Deleting completed events");
diesel::delete(dsl::events.filter(dsl::event_end.lt(now)))
.execute_async(&self.pool)
.await?;
Ok(())
}
}

@ -8,6 +8,7 @@ pub use youtube_songs::*;
use crate::PoolConnection;
mod ephemeral_messages;
mod events;
mod guild_playlists;
mod guild_settings;
mod media;

@ -92,3 +92,25 @@ pub struct EphemeralMessageInsert {
pub message_id: i64,
pub timeout: SystemTime,
}
#[derive(Queryable, Debug, Clone)]
pub struct Event {
pub id: i32,
pub guild_id: i64,
pub channel_id: i64,
pub name: String,
pub description: String,
pub event_start: SystemTime,
pub event_end: Option<SystemTime>,
}
#[derive(Insertable, Debug)]
#[table_name = "events"]
pub struct EventInsert {
pub guild_id: i64,
pub channel_id: i64,
pub name: String,
pub description: String,
pub event_start: SystemTime,
pub event_end: Option<SystemTime>,
}

@ -6,6 +6,18 @@ table! {
}
}
table! {
events (id) {
id -> Int4,
guild_id -> Int8,
channel_id -> Int8,
name -> Varchar,
description -> Varchar,
event_start -> Timestamp,
event_end -> Nullable<Timestamp>,
}
}
table! {
guild_playlists (guild_id, name) {
guild_id -> Int8,
@ -56,6 +68,7 @@ table! {
allow_tables_to_appear_in_same_query!(
ephemeral_messages,
events,
guild_playlists,
guild_settings,
media,

Loading…
Cancel
Save