new global models
This commit is contained in:
7
models/Cargo.lock
generated
Normal file
7
models/Cargo.lock
generated
Normal file
@ -0,0 +1,7 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "models"
|
||||
version = "0.1.0"
|
8
models/Cargo.toml
Normal file
8
models/Cargo.toml
Normal file
@ -0,0 +1,8 @@
|
||||
[package]
|
||||
name = "models"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
8
models/entity/Cargo.toml
Normal file
8
models/entity/Cargo.toml
Normal file
@ -0,0 +1,8 @@
|
||||
[package]
|
||||
name = "entity"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
chrono-tz = "^0.6"
|
||||
sea-orm = { version = "^0.8", features = ["sqlx-postgres", "runtime-tokio-native-tls", "macros"] }
|
60
models/entity/src/channel.rs
Normal file
60
models/entity/src/channel.rs
Normal file
@ -0,0 +1,60 @@
|
||||
//! SeaORM Entity. Generated by sea-orm-codegen 0.8.0
|
||||
|
||||
use sea_orm::entity::prelude::*;
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, DeriveEntityModel)]
|
||||
#[sea_orm(table_name = "channel")]
|
||||
pub struct Model {
|
||||
#[sea_orm(primary_key, auto_increment = false)]
|
||||
pub id: i64,
|
||||
pub guild_id: Option<i64>,
|
||||
pub nudge: i32,
|
||||
pub webhook_id: Option<i64>,
|
||||
pub webhook_token: Option<String>,
|
||||
pub paused: bool,
|
||||
pub paused_until: Option<DateTimeUtc>,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
|
||||
pub enum Relation {
|
||||
#[sea_orm(
|
||||
belongs_to = "super::guild::Entity",
|
||||
from = "Column::GuildId",
|
||||
to = "super::guild::Column::Id",
|
||||
on_update = "NoAction",
|
||||
on_delete = "Cascade"
|
||||
)]
|
||||
Guild,
|
||||
#[sea_orm(has_many = "super::user::Entity")]
|
||||
User,
|
||||
#[sea_orm(has_many = "super::reminder::Entity")]
|
||||
Reminder,
|
||||
#[sea_orm(has_many = "super::todo::Entity")]
|
||||
Todo,
|
||||
}
|
||||
|
||||
impl Related<super::guild::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::Guild.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl Related<super::user::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::User.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl Related<super::reminder::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::Reminder.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl Related<super::todo::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::Todo.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl ActiveModelBehavior for ActiveModel {}
|
34
models/entity/src/command_macro.rs
Normal file
34
models/entity/src/command_macro.rs
Normal file
@ -0,0 +1,34 @@
|
||||
//! SeaORM Entity. Generated by sea-orm-codegen 0.8.0
|
||||
|
||||
use sea_orm::entity::prelude::*;
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, DeriveEntityModel)]
|
||||
#[sea_orm(table_name = "command_macro")]
|
||||
pub struct Model {
|
||||
#[sea_orm(primary_key)]
|
||||
pub id: i32,
|
||||
pub guild_id: i64,
|
||||
pub name: String,
|
||||
pub description: Option<String>,
|
||||
pub commands: Option<Json>,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
|
||||
pub enum Relation {
|
||||
#[sea_orm(
|
||||
belongs_to = "super::guild::Entity",
|
||||
from = "Column::GuildId",
|
||||
to = "super::guild::Column::Id",
|
||||
on_update = "NoAction",
|
||||
on_delete = "Cascade"
|
||||
)]
|
||||
Guild,
|
||||
}
|
||||
|
||||
impl Related<super::guild::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::Guild.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl ActiveModelBehavior for ActiveModel {}
|
48
models/entity/src/guild.rs
Normal file
48
models/entity/src/guild.rs
Normal file
@ -0,0 +1,48 @@
|
||||
//! SeaORM Entity. Generated by sea-orm-codegen 0.8.0
|
||||
|
||||
use sea_orm::entity::prelude::*;
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, DeriveEntityModel)]
|
||||
#[sea_orm(table_name = "guild")]
|
||||
pub struct Model {
|
||||
#[sea_orm(primary_key, auto_increment = false)]
|
||||
pub id: i64,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
|
||||
pub enum Relation {
|
||||
#[sea_orm(has_many = "super::reminder_template::Entity")]
|
||||
ReminderTemplate,
|
||||
#[sea_orm(has_many = "super::channel::Entity")]
|
||||
Channel,
|
||||
#[sea_orm(has_many = "super::todo::Entity")]
|
||||
Todo,
|
||||
#[sea_orm(has_many = "super::command_macro::Entity")]
|
||||
CommandMacro,
|
||||
}
|
||||
|
||||
impl Related<super::reminder_template::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::ReminderTemplate.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl Related<super::channel::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::Channel.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl Related<super::todo::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::Todo.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl Related<super::command_macro::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::CommandMacro.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl ActiveModelBehavior for ActiveModel {}
|
1
models/entity/src/lib.rs
Normal file
1
models/entity/src/lib.rs
Normal file
@ -0,0 +1 @@
|
||||
|
14
models/entity/src/mod.rs
Normal file
14
models/entity/src/mod.rs
Normal file
@ -0,0 +1,14 @@
|
||||
//! SeaORM Entity. Generated by sea-orm-codegen 0.8.0
|
||||
|
||||
pub mod prelude;
|
||||
|
||||
pub mod channel;
|
||||
pub mod command_macro;
|
||||
pub mod guild;
|
||||
pub mod reminder;
|
||||
pub mod reminder_template;
|
||||
pub mod sea_orm_active_enums;
|
||||
pub mod seaql_migrations;
|
||||
pub mod timer;
|
||||
pub mod todo;
|
||||
pub mod user;
|
8
models/entity/src/prelude.rs
Normal file
8
models/entity/src/prelude.rs
Normal file
@ -0,0 +1,8 @@
|
||||
//! SeaORM Entity. Generated by sea-orm-codegen 0.8.0
|
||||
|
||||
pub use super::{
|
||||
channel::Entity as Channel, command_macro::Entity as CommandMacro, guild::Entity as Guild,
|
||||
reminder::Entity as Reminder, reminder_template::Entity as ReminderTemplate,
|
||||
seaql_migrations::Entity as SeaqlMigrations, timer::Entity as Timer, todo::Entity as Todo,
|
||||
user::Entity as User,
|
||||
};
|
73
models/entity/src/reminder.rs
Normal file
73
models/entity/src/reminder.rs
Normal file
@ -0,0 +1,73 @@
|
||||
//! SeaORM Entity. Generated by sea-orm-codegen 0.8.0
|
||||
|
||||
use sea_orm::entity::prelude::*;
|
||||
|
||||
use super::sea_orm_active_enums::Timezone;
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, DeriveEntityModel)]
|
||||
#[sea_orm(table_name = "reminder")]
|
||||
pub struct Model {
|
||||
#[sea_orm(primary_key)]
|
||||
pub id: i32,
|
||||
pub uid: String,
|
||||
pub name: String,
|
||||
pub channel_id: i64,
|
||||
pub utc_time: DateTimeUtc,
|
||||
pub timezone: Timezone,
|
||||
pub interval_seconds: Option<i32>,
|
||||
pub interval_months: Option<i32>,
|
||||
pub enabled: bool,
|
||||
pub expires: Option<DateTimeUtc>,
|
||||
pub username: Option<String>,
|
||||
pub avatar: Option<String>,
|
||||
pub content: Option<String>,
|
||||
pub tts: bool,
|
||||
pub attachment: Option<Vec<u8>>,
|
||||
pub attachment_name: Option<String>,
|
||||
pub embed_title: Option<String>,
|
||||
pub embed_description: Option<String>,
|
||||
pub embed_image_url: Option<String>,
|
||||
pub embed_thumbnail_url: Option<String>,
|
||||
pub embed_footer: Option<String>,
|
||||
pub embed_footer_url: Option<String>,
|
||||
pub embed_author: Option<String>,
|
||||
pub embed_author_url: Option<String>,
|
||||
pub embed_color: Option<i32>,
|
||||
pub embed_fields: Option<Json>,
|
||||
pub set_at: DateTimeUtc,
|
||||
pub set_by: i64,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
|
||||
pub enum Relation {
|
||||
#[sea_orm(
|
||||
belongs_to = "super::channel::Entity",
|
||||
from = "Column::ChannelId",
|
||||
to = "super::channel::Column::Id",
|
||||
on_update = "NoAction",
|
||||
on_delete = "Cascade"
|
||||
)]
|
||||
Channel,
|
||||
#[sea_orm(
|
||||
belongs_to = "super::user::Entity",
|
||||
from = "Column::SetBy",
|
||||
to = "super::user::Column::Id",
|
||||
on_update = "NoAction",
|
||||
on_delete = "Cascade"
|
||||
)]
|
||||
User,
|
||||
}
|
||||
|
||||
impl Related<super::channel::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::Channel.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl Related<super::user::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::User.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl ActiveModelBehavior for ActiveModel {}
|
48
models/entity/src/reminder_template.rs
Normal file
48
models/entity/src/reminder_template.rs
Normal file
@ -0,0 +1,48 @@
|
||||
//! SeaORM Entity. Generated by sea-orm-codegen 0.8.0
|
||||
|
||||
use sea_orm::entity::prelude::*;
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, DeriveEntityModel)]
|
||||
#[sea_orm(table_name = "reminder_template")]
|
||||
pub struct Model {
|
||||
#[sea_orm(primary_key)]
|
||||
pub id: i32,
|
||||
pub guild_id: i64,
|
||||
pub name: String,
|
||||
pub username: Option<String>,
|
||||
pub avatar: Option<String>,
|
||||
pub content: Option<String>,
|
||||
pub tts: bool,
|
||||
pub attachment: Option<Vec<u8>>,
|
||||
pub attachment_name: Option<String>,
|
||||
pub embed_title: Option<String>,
|
||||
pub embed_description: Option<String>,
|
||||
pub embed_image_url: Option<String>,
|
||||
pub embed_thumbnail_url: Option<String>,
|
||||
pub embed_footer: Option<String>,
|
||||
pub embed_footer_url: Option<String>,
|
||||
pub embed_author: Option<String>,
|
||||
pub embed_author_url: Option<String>,
|
||||
pub embed_color: Option<i32>,
|
||||
pub embed_fields: Option<Json>,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
|
||||
pub enum Relation {
|
||||
#[sea_orm(
|
||||
belongs_to = "super::guild::Entity",
|
||||
from = "Column::GuildId",
|
||||
to = "super::guild::Column::Id",
|
||||
on_update = "NoAction",
|
||||
on_delete = "Cascade"
|
||||
)]
|
||||
Guild,
|
||||
}
|
||||
|
||||
impl Related<super::guild::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::Guild.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl ActiveModelBehavior for ActiveModel {}
|
1196
models/entity/src/sea_orm_active_enums.rs
Normal file
1196
models/entity/src/sea_orm_active_enums.rs
Normal file
File diff suppressed because it is too large
Load Diff
22
models/entity/src/seaql_migrations.rs
Normal file
22
models/entity/src/seaql_migrations.rs
Normal file
@ -0,0 +1,22 @@
|
||||
//! SeaORM Entity. Generated by sea-orm-codegen 0.8.0
|
||||
|
||||
use sea_orm::entity::prelude::*;
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, DeriveEntityModel)]
|
||||
#[sea_orm(table_name = "seaql_migrations")]
|
||||
pub struct Model {
|
||||
#[sea_orm(primary_key, auto_increment = false)]
|
||||
pub version: String,
|
||||
pub applied_at: i64,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, EnumIter)]
|
||||
pub enum Relation {}
|
||||
|
||||
impl RelationTrait for Relation {
|
||||
fn def(&self) -> RelationDef {
|
||||
panic!("No RelationDef")
|
||||
}
|
||||
}
|
||||
|
||||
impl ActiveModelBehavior for ActiveModel {}
|
36
models/entity/src/timer.rs
Normal file
36
models/entity/src/timer.rs
Normal file
@ -0,0 +1,36 @@
|
||||
//! SeaORM Entity. Generated by sea-orm-codegen 0.8.0
|
||||
|
||||
use sea_orm::entity::prelude::*;
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, DeriveEntityModel)]
|
||||
#[sea_orm(table_name = "timer")]
|
||||
pub struct Model {
|
||||
#[sea_orm(primary_key)]
|
||||
pub id: i32,
|
||||
pub start_time: DateTimeUtc,
|
||||
pub name: String,
|
||||
pub user_id: Option<i64>,
|
||||
pub guild_id: Option<i64>,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
|
||||
pub enum Relation {
|
||||
#[sea_orm(
|
||||
belongs_to = "super::guild::Entity",
|
||||
from = "Column::GuildId",
|
||||
to = "super::guild::Column::Id",
|
||||
on_update = "NoAction",
|
||||
on_delete = "Cascade"
|
||||
)]
|
||||
Guild2,
|
||||
#[sea_orm(
|
||||
belongs_to = "super::guild::Entity",
|
||||
from = "Column::UserId",
|
||||
to = "super::guild::Column::Id",
|
||||
on_update = "NoAction",
|
||||
on_delete = "Cascade"
|
||||
)]
|
||||
Guild1,
|
||||
}
|
||||
|
||||
impl ActiveModelBehavior for ActiveModel {}
|
62
models/entity/src/todo.rs
Normal file
62
models/entity/src/todo.rs
Normal file
@ -0,0 +1,62 @@
|
||||
//! SeaORM Entity. Generated by sea-orm-codegen 0.8.0
|
||||
|
||||
use sea_orm::entity::prelude::*;
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, DeriveEntityModel)]
|
||||
#[sea_orm(table_name = "todo")]
|
||||
pub struct Model {
|
||||
#[sea_orm(primary_key)]
|
||||
pub id: i32,
|
||||
pub user_id: Option<i64>,
|
||||
pub guild_id: Option<i64>,
|
||||
pub channel_id: Option<i64>,
|
||||
pub value: String,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
|
||||
pub enum Relation {
|
||||
#[sea_orm(
|
||||
belongs_to = "super::channel::Entity",
|
||||
from = "Column::ChannelId",
|
||||
to = "super::channel::Column::Id",
|
||||
on_update = "NoAction",
|
||||
on_delete = "Cascade"
|
||||
)]
|
||||
Channel,
|
||||
#[sea_orm(
|
||||
belongs_to = "super::guild::Entity",
|
||||
from = "Column::GuildId",
|
||||
to = "super::guild::Column::Id",
|
||||
on_update = "NoAction",
|
||||
on_delete = "Cascade"
|
||||
)]
|
||||
Guild,
|
||||
#[sea_orm(
|
||||
belongs_to = "super::user::Entity",
|
||||
from = "Column::UserId",
|
||||
to = "super::user::Column::Id",
|
||||
on_update = "NoAction",
|
||||
on_delete = "Cascade"
|
||||
)]
|
||||
User,
|
||||
}
|
||||
|
||||
impl Related<super::channel::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::Channel.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl Related<super::guild::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::Guild.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl Related<super::user::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::User.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl ActiveModelBehavior for ActiveModel {}
|
50
models/entity/src/user.rs
Normal file
50
models/entity/src/user.rs
Normal file
@ -0,0 +1,50 @@
|
||||
//! SeaORM Entity. Generated by sea-orm-codegen 0.8.0
|
||||
|
||||
use sea_orm::entity::prelude::*;
|
||||
|
||||
use super::sea_orm_active_enums::Timezone;
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, DeriveEntityModel)]
|
||||
#[sea_orm(table_name = "user")]
|
||||
pub struct Model {
|
||||
#[sea_orm(primary_key, auto_increment = false)]
|
||||
pub id: i64,
|
||||
pub dm_channel: i64,
|
||||
pub timezone: Timezone,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
|
||||
pub enum Relation {
|
||||
#[sea_orm(
|
||||
belongs_to = "super::channel::Entity",
|
||||
from = "Column::DmChannel",
|
||||
to = "super::channel::Column::Id",
|
||||
on_update = "NoAction",
|
||||
on_delete = "Cascade"
|
||||
)]
|
||||
Channel,
|
||||
#[sea_orm(has_many = "super::reminder::Entity")]
|
||||
Reminder,
|
||||
#[sea_orm(has_many = "super::todo::Entity")]
|
||||
Todo,
|
||||
}
|
||||
|
||||
impl Related<super::channel::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::Channel.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl Related<super::reminder::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::Reminder.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl Related<super::todo::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::Todo.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl ActiveModelBehavior for ActiveModel {}
|
2400
models/migration/Cargo.lock
generated
Normal file
2400
models/migration/Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
16
models/migration/Cargo.toml
Normal file
16
models/migration/Cargo.toml
Normal file
@ -0,0 +1,16 @@
|
||||
[package]
|
||||
name = "migration"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
publish = false
|
||||
|
||||
[lib]
|
||||
name = "migration"
|
||||
path = "src/lib.rs"
|
||||
|
||||
[dependencies]
|
||||
entity = { path = "../entity" }
|
||||
chrono-tz = "^0.6"
|
||||
|
||||
[dependencies.sea-orm-migration]
|
||||
version = "^0.8.0"
|
37
models/migration/README.md
Normal file
37
models/migration/README.md
Normal file
@ -0,0 +1,37 @@
|
||||
# Running Migrator CLI
|
||||
|
||||
- Apply all pending migrations
|
||||
```sh
|
||||
cargo run
|
||||
```
|
||||
```sh
|
||||
cargo run -- up
|
||||
```
|
||||
- Apply first 10 pending migrations
|
||||
```sh
|
||||
cargo run -- up -n 10
|
||||
```
|
||||
- Rollback last applied migrations
|
||||
```sh
|
||||
cargo run -- down
|
||||
```
|
||||
- Rollback last 10 applied migrations
|
||||
```sh
|
||||
cargo run -- down -n 10
|
||||
```
|
||||
- Drop all tables from the database, then reapply all migrations
|
||||
```sh
|
||||
cargo run -- fresh
|
||||
```
|
||||
- Rollback all applied migrations, then reapply all migrations
|
||||
```sh
|
||||
cargo run -- refresh
|
||||
```
|
||||
- Rollback all applied migrations
|
||||
```sh
|
||||
cargo run -- reset
|
||||
```
|
||||
- Check the status of all migrations
|
||||
```sh
|
||||
cargo run -- status
|
||||
```
|
12
models/migration/src/lib.rs
Normal file
12
models/migration/src/lib.rs
Normal file
@ -0,0 +1,12 @@
|
||||
pub use sea_orm_migration::prelude::*;
|
||||
|
||||
mod m20220101_000001_create_table;
|
||||
|
||||
pub struct Migrator;
|
||||
|
||||
#[async_trait::async_trait]
|
||||
impl MigratorTrait for Migrator {
|
||||
fn migrations() -> Vec<Box<dyn MigrationTrait>> {
|
||||
vec![Box::new(m20220101_000001_create_table::Migration)]
|
||||
}
|
||||
}
|
553
models/migration/src/m20220101_000001_create_table.rs
Normal file
553
models/migration/src/m20220101_000001_create_table.rs
Normal file
@ -0,0 +1,553 @@
|
||||
use chrono_tz::{Tz, TZ_VARIANTS};
|
||||
use sea_orm_migration::prelude::*;
|
||||
|
||||
use crate::extension::postgres::Type;
|
||||
|
||||
pub struct Migration;
|
||||
|
||||
impl MigrationName for Migration {
|
||||
fn name(&self) -> &str {
|
||||
"m20220101_000001_create_table"
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Iden)]
|
||||
pub enum Guild {
|
||||
Table,
|
||||
Id,
|
||||
}
|
||||
|
||||
#[derive(Iden)]
|
||||
pub enum Channel {
|
||||
Table,
|
||||
Id,
|
||||
GuildId,
|
||||
Nudge,
|
||||
WebhookId,
|
||||
WebhookToken,
|
||||
Paused,
|
||||
PausedUntil,
|
||||
}
|
||||
|
||||
#[derive(Iden)]
|
||||
pub enum User {
|
||||
Table,
|
||||
Id,
|
||||
DmChannel,
|
||||
Timezone,
|
||||
}
|
||||
|
||||
#[derive(Iden)]
|
||||
pub enum Reminder {
|
||||
Table,
|
||||
Id,
|
||||
Uid,
|
||||
Name,
|
||||
ChannelId,
|
||||
UtcTime,
|
||||
Timezone,
|
||||
IntervalSeconds,
|
||||
IntervalMonths,
|
||||
Enabled,
|
||||
Expires,
|
||||
Username,
|
||||
Avatar,
|
||||
Content,
|
||||
Tts,
|
||||
Attachment,
|
||||
AttachmentName,
|
||||
EmbedTitle,
|
||||
EmbedDescription,
|
||||
EmbedImageUrl,
|
||||
EmbedThumbnailUrl,
|
||||
EmbedFooter,
|
||||
EmbedFooterUrl,
|
||||
EmbedAuthor,
|
||||
EmbedAuthorUrl,
|
||||
EmbedColor,
|
||||
EmbedFields,
|
||||
SetAt,
|
||||
SetBy,
|
||||
}
|
||||
|
||||
#[derive(Iden)]
|
||||
pub enum ReminderTemplate {
|
||||
Table,
|
||||
Id,
|
||||
GuildId,
|
||||
Name,
|
||||
Username,
|
||||
Avatar,
|
||||
Content,
|
||||
Tts,
|
||||
Attachment,
|
||||
AttachmentName,
|
||||
EmbedTitle,
|
||||
EmbedDescription,
|
||||
EmbedImageUrl,
|
||||
EmbedThumbnailUrl,
|
||||
EmbedFooter,
|
||||
EmbedFooterUrl,
|
||||
EmbedAuthor,
|
||||
EmbedAuthorUrl,
|
||||
EmbedColor,
|
||||
EmbedFields,
|
||||
}
|
||||
|
||||
#[derive(Iden)]
|
||||
pub enum Timer {
|
||||
Table,
|
||||
Id,
|
||||
StartTime,
|
||||
Name,
|
||||
UserId,
|
||||
GuildId,
|
||||
}
|
||||
|
||||
#[derive(Iden)]
|
||||
pub enum Todo {
|
||||
Table,
|
||||
Id,
|
||||
UserId,
|
||||
GuildId,
|
||||
ChannelId,
|
||||
Value,
|
||||
}
|
||||
|
||||
#[derive(Iden)]
|
||||
pub enum CommandMacro {
|
||||
Table,
|
||||
Id,
|
||||
GuildId,
|
||||
Name,
|
||||
Description,
|
||||
Commands,
|
||||
}
|
||||
|
||||
pub enum Timezone {
|
||||
Type,
|
||||
Tz(Tz),
|
||||
}
|
||||
|
||||
impl Iden for Timezone {
|
||||
fn unquoted(&self, s: &mut dyn Write) {
|
||||
write!(
|
||||
s,
|
||||
"{}",
|
||||
match self {
|
||||
Self::Type => "timezone".to_string(),
|
||||
Self::Tz(tz) => tz.to_string(),
|
||||
}
|
||||
)
|
||||
.unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait::async_trait]
|
||||
impl MigrationTrait for Migration {
|
||||
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
|
||||
manager
|
||||
.create_type(
|
||||
Type::create()
|
||||
.as_enum(Timezone::Type)
|
||||
.values(TZ_VARIANTS.iter().map(|tz| Timezone::Tz(tz.to_owned())))
|
||||
.to_owned(),
|
||||
)
|
||||
.await?;
|
||||
|
||||
manager
|
||||
.create_table(
|
||||
Table::create()
|
||||
.table(Guild::Table)
|
||||
.if_not_exists()
|
||||
.col(ColumnDef::new(Guild::Id).big_integer().not_null().primary_key())
|
||||
.to_owned(),
|
||||
)
|
||||
.await?;
|
||||
|
||||
manager
|
||||
.create_table(
|
||||
Table::create()
|
||||
.table(Channel::Table)
|
||||
.if_not_exists()
|
||||
.col(ColumnDef::new(Channel::Id).big_integer().not_null().primary_key())
|
||||
.col(ColumnDef::new(Channel::GuildId).big_integer())
|
||||
.col(ColumnDef::new(Channel::Nudge).integer().not_null().default(0))
|
||||
.col(ColumnDef::new(Channel::WebhookId).big_integer())
|
||||
.col(ColumnDef::new(Channel::WebhookToken).string())
|
||||
.col(ColumnDef::new(Channel::Paused).boolean().not_null().default(false))
|
||||
.col(ColumnDef::new(Channel::PausedUntil).date_time())
|
||||
.to_owned(),
|
||||
)
|
||||
.await?;
|
||||
|
||||
manager
|
||||
.create_foreign_key(
|
||||
ForeignKey::create()
|
||||
.name("fk_channel_guild")
|
||||
.from(Channel::Table, Channel::GuildId)
|
||||
.to(Guild::Table, Guild::Id)
|
||||
.on_delete(ForeignKeyAction::Cascade)
|
||||
.to_owned(),
|
||||
)
|
||||
.await?;
|
||||
|
||||
manager
|
||||
.create_table(
|
||||
Table::create()
|
||||
.table(User::Table)
|
||||
.if_not_exists()
|
||||
.col(ColumnDef::new(User::Id).big_integer().not_null().primary_key())
|
||||
.col(ColumnDef::new(User::DmChannel).big_integer().not_null())
|
||||
.col(
|
||||
ColumnDef::new(User::Timezone)
|
||||
.custom(Timezone::Type)
|
||||
.not_null()
|
||||
.default("UTC"),
|
||||
)
|
||||
.to_owned(),
|
||||
)
|
||||
.await?;
|
||||
|
||||
manager
|
||||
.create_foreign_key(
|
||||
ForeignKey::create()
|
||||
.name("fk_user_channel")
|
||||
.from(User::Table, User::DmChannel)
|
||||
.to(Channel::Table, Channel::Id)
|
||||
.on_delete(ForeignKeyAction::Cascade)
|
||||
.to_owned(),
|
||||
)
|
||||
.await?;
|
||||
|
||||
manager
|
||||
.create_table(
|
||||
Table::create()
|
||||
.table(Reminder::Table)
|
||||
.if_not_exists()
|
||||
.col(
|
||||
ColumnDef::new(Reminder::Id)
|
||||
.integer()
|
||||
.not_null()
|
||||
.auto_increment()
|
||||
.primary_key(),
|
||||
)
|
||||
.col(ColumnDef::new(Reminder::Uid).string().char_len(64).not_null())
|
||||
.col(
|
||||
ColumnDef::new(Reminder::Name)
|
||||
.string()
|
||||
.char_len(24)
|
||||
.default("Reminder")
|
||||
.not_null(),
|
||||
)
|
||||
.col(ColumnDef::new(Reminder::ChannelId).big_integer().not_null())
|
||||
.col(ColumnDef::new(Reminder::UtcTime).date_time().not_null())
|
||||
.col(
|
||||
ColumnDef::new(Reminder::Timezone)
|
||||
.custom(Timezone::Type)
|
||||
.not_null()
|
||||
.default("UTC"),
|
||||
)
|
||||
.col(ColumnDef::new(Reminder::IntervalSeconds).integer())
|
||||
.col(ColumnDef::new(Reminder::IntervalMonths).integer())
|
||||
.col(ColumnDef::new(Reminder::Enabled).boolean().not_null().default(false))
|
||||
.col(ColumnDef::new(Reminder::Expires).date_time())
|
||||
.col(ColumnDef::new(Reminder::Username).string_len(32))
|
||||
.col(ColumnDef::new(Reminder::Avatar).string_len(512))
|
||||
.col(ColumnDef::new(Reminder::Content).string_len(2000))
|
||||
.col(ColumnDef::new(Reminder::Tts).boolean().not_null().default(false))
|
||||
.col(ColumnDef::new(Reminder::Attachment).binary_len(8 * 1024 * 1024))
|
||||
.col(ColumnDef::new(Reminder::AttachmentName).string_len(260))
|
||||
.col(ColumnDef::new(Reminder::EmbedTitle).string_len(256))
|
||||
.col(ColumnDef::new(Reminder::EmbedDescription).string_len(4096))
|
||||
.col(ColumnDef::new(Reminder::EmbedImageUrl).string_len(500))
|
||||
.col(ColumnDef::new(Reminder::EmbedThumbnailUrl).string_len(500))
|
||||
.col(ColumnDef::new(Reminder::EmbedFooter).string_len(2048))
|
||||
.col(ColumnDef::new(Reminder::EmbedFooterUrl).string_len(500))
|
||||
.col(ColumnDef::new(Reminder::EmbedAuthor).string_len(256))
|
||||
.col(ColumnDef::new(Reminder::EmbedAuthorUrl).string_len(500))
|
||||
.col(ColumnDef::new(Reminder::EmbedColor).integer())
|
||||
.col(ColumnDef::new(Reminder::EmbedFields).json())
|
||||
.col(ColumnDef::new(Reminder::SetAt).date_time().not_null().default("NOW()"))
|
||||
.col(ColumnDef::new(Reminder::SetBy).big_integer().not_null())
|
||||
.to_owned(),
|
||||
)
|
||||
.await?;
|
||||
|
||||
manager
|
||||
.create_foreign_key(
|
||||
ForeignKey::create()
|
||||
.name("fk_reminder_channel")
|
||||
.from(Reminder::Table, Reminder::ChannelId)
|
||||
.to(Channel::Table, Channel::Id)
|
||||
.on_delete(ForeignKeyAction::Cascade)
|
||||
.to_owned(),
|
||||
)
|
||||
.await?;
|
||||
|
||||
manager
|
||||
.create_foreign_key(
|
||||
ForeignKey::create()
|
||||
.name("fk_reminder_user")
|
||||
.from(Reminder::Table, Reminder::SetBy)
|
||||
.to(User::Table, User::Id)
|
||||
.on_delete(ForeignKeyAction::Cascade)
|
||||
.to_owned(),
|
||||
)
|
||||
.await?;
|
||||
|
||||
manager
|
||||
.create_table(
|
||||
Table::create()
|
||||
.table(ReminderTemplate::Table)
|
||||
.if_not_exists()
|
||||
.col(
|
||||
ColumnDef::new(ReminderTemplate::Id)
|
||||
.integer()
|
||||
.not_null()
|
||||
.auto_increment()
|
||||
.primary_key(),
|
||||
)
|
||||
.col(ColumnDef::new(ReminderTemplate::GuildId).big_integer().not_null())
|
||||
.col(
|
||||
ColumnDef::new(ReminderTemplate::Name)
|
||||
.string()
|
||||
.char_len(24)
|
||||
.default("Reminder")
|
||||
.not_null(),
|
||||
)
|
||||
.col(ColumnDef::new(ReminderTemplate::Username).string_len(32))
|
||||
.col(ColumnDef::new(ReminderTemplate::Avatar).string_len(512))
|
||||
.col(ColumnDef::new(ReminderTemplate::Content).string_len(2000))
|
||||
.col(ColumnDef::new(ReminderTemplate::Tts).boolean().not_null().default(false))
|
||||
.col(ColumnDef::new(ReminderTemplate::Attachment).binary_len(8 * 1024 * 1024))
|
||||
.col(ColumnDef::new(ReminderTemplate::AttachmentName).string_len(260))
|
||||
.col(ColumnDef::new(ReminderTemplate::EmbedTitle).string_len(256))
|
||||
.col(ColumnDef::new(ReminderTemplate::EmbedDescription).string_len(4096))
|
||||
.col(ColumnDef::new(ReminderTemplate::EmbedImageUrl).string_len(500))
|
||||
.col(ColumnDef::new(ReminderTemplate::EmbedThumbnailUrl).string_len(500))
|
||||
.col(ColumnDef::new(ReminderTemplate::EmbedFooter).string_len(2048))
|
||||
.col(ColumnDef::new(ReminderTemplate::EmbedFooterUrl).string_len(500))
|
||||
.col(ColumnDef::new(ReminderTemplate::EmbedAuthor).string_len(256))
|
||||
.col(ColumnDef::new(ReminderTemplate::EmbedAuthorUrl).string_len(500))
|
||||
.col(ColumnDef::new(ReminderTemplate::EmbedColor).integer())
|
||||
.col(ColumnDef::new(ReminderTemplate::EmbedFields).json())
|
||||
.to_owned(),
|
||||
)
|
||||
.await?;
|
||||
|
||||
manager
|
||||
.create_foreign_key(
|
||||
ForeignKey::create()
|
||||
.name("fk_reminder_template_guild")
|
||||
.from(ReminderTemplate::Table, ReminderTemplate::GuildId)
|
||||
.to(Guild::Table, Guild::Id)
|
||||
.on_delete(ForeignKeyAction::Cascade)
|
||||
.to_owned(),
|
||||
)
|
||||
.await?;
|
||||
|
||||
manager
|
||||
.create_table(
|
||||
Table::create()
|
||||
.table(Timer::Table)
|
||||
.if_not_exists()
|
||||
.col(
|
||||
ColumnDef::new(Timer::Id)
|
||||
.integer()
|
||||
.not_null()
|
||||
.auto_increment()
|
||||
.primary_key(),
|
||||
)
|
||||
.col(ColumnDef::new(Timer::StartTime).date_time().not_null().default("NOW()"))
|
||||
.col(ColumnDef::new(Timer::Name).string_len(32).not_null().default("Timer"))
|
||||
.col(ColumnDef::new(Timer::UserId).big_integer())
|
||||
.col(ColumnDef::new(Timer::GuildId).big_integer())
|
||||
.to_owned(),
|
||||
)
|
||||
.await?;
|
||||
|
||||
manager
|
||||
.create_foreign_key(
|
||||
ForeignKey::create()
|
||||
.name("fk_timer_user")
|
||||
.from(Timer::Table, Timer::UserId)
|
||||
.to(Guild::Table, Guild::Id)
|
||||
.on_delete(ForeignKeyAction::Cascade)
|
||||
.to_owned(),
|
||||
)
|
||||
.await?;
|
||||
|
||||
manager
|
||||
.create_foreign_key(
|
||||
ForeignKey::create()
|
||||
.name("fk_timer_guild")
|
||||
.from(Timer::Table, Timer::GuildId)
|
||||
.to(Guild::Table, Guild::Id)
|
||||
.on_delete(ForeignKeyAction::Cascade)
|
||||
.to_owned(),
|
||||
)
|
||||
.await?;
|
||||
|
||||
manager
|
||||
.create_table(
|
||||
Table::create()
|
||||
.table(Todo::Table)
|
||||
.if_not_exists()
|
||||
.col(
|
||||
ColumnDef::new(Todo::Id)
|
||||
.integer()
|
||||
.not_null()
|
||||
.auto_increment()
|
||||
.primary_key(),
|
||||
)
|
||||
.col(ColumnDef::new(Todo::UserId).big_integer())
|
||||
.col(ColumnDef::new(Todo::GuildId).big_integer())
|
||||
.col(ColumnDef::new(Todo::ChannelId).big_integer())
|
||||
.col(ColumnDef::new(Todo::Value).string_len(2000).not_null())
|
||||
.to_owned(),
|
||||
)
|
||||
.await?;
|
||||
|
||||
manager
|
||||
.create_foreign_key(
|
||||
ForeignKey::create()
|
||||
.name("fk_todo_user")
|
||||
.from(Todo::Table, Todo::UserId)
|
||||
.to(User::Table, User::Id)
|
||||
.on_delete(ForeignKeyAction::Cascade)
|
||||
.to_owned(),
|
||||
)
|
||||
.await?;
|
||||
|
||||
manager
|
||||
.create_foreign_key(
|
||||
ForeignKey::create()
|
||||
.name("fk_todo_guild")
|
||||
.from(Todo::Table, Todo::GuildId)
|
||||
.to(Guild::Table, Guild::Id)
|
||||
.on_delete(ForeignKeyAction::Cascade)
|
||||
.to_owned(),
|
||||
)
|
||||
.await?;
|
||||
|
||||
manager
|
||||
.create_foreign_key(
|
||||
ForeignKey::create()
|
||||
.name("fk_todo_channel")
|
||||
.from(Todo::Table, Todo::ChannelId)
|
||||
.to(Channel::Table, Channel::Id)
|
||||
.on_delete(ForeignKeyAction::Cascade)
|
||||
.to_owned(),
|
||||
)
|
||||
.await?;
|
||||
|
||||
manager
|
||||
.create_table(
|
||||
Table::create()
|
||||
.table(CommandMacro::Table)
|
||||
.if_not_exists()
|
||||
.col(
|
||||
ColumnDef::new(CommandMacro::Id)
|
||||
.integer()
|
||||
.not_null()
|
||||
.auto_increment()
|
||||
.primary_key(),
|
||||
)
|
||||
.col(ColumnDef::new(CommandMacro::GuildId).big_integer().not_null())
|
||||
.col(ColumnDef::new(CommandMacro::Name).string_len(100).not_null())
|
||||
.col(ColumnDef::new(CommandMacro::Description).string_len(100))
|
||||
.col(ColumnDef::new(CommandMacro::Commands).json())
|
||||
.to_owned(),
|
||||
)
|
||||
.await?;
|
||||
|
||||
manager
|
||||
.create_foreign_key(
|
||||
ForeignKey::create()
|
||||
.name("fk_command_macro_guild")
|
||||
.from(CommandMacro::Table, CommandMacro::GuildId)
|
||||
.to(Guild::Table, Guild::Id)
|
||||
.on_delete(ForeignKeyAction::Cascade)
|
||||
.to_owned(),
|
||||
)
|
||||
.await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
|
||||
manager
|
||||
.drop_foreign_key(
|
||||
ForeignKey::drop().table(Channel::Table).name("fk_channel_guild").to_owned(),
|
||||
)
|
||||
.await?;
|
||||
manager
|
||||
.drop_foreign_key(
|
||||
ForeignKey::drop().table(User::Table).name("fk_user_channel").to_owned(),
|
||||
)
|
||||
.await?;
|
||||
manager
|
||||
.drop_foreign_key(
|
||||
ForeignKey::drop().table(Reminder::Table).name("fk_reminder_channel").to_owned(),
|
||||
)
|
||||
.await?;
|
||||
manager
|
||||
.drop_foreign_key(
|
||||
ForeignKey::drop().table(Reminder::Table).name("fk_reminder_user").to_owned(),
|
||||
)
|
||||
.await?;
|
||||
manager
|
||||
.drop_foreign_key(
|
||||
ForeignKey::drop()
|
||||
.table(ReminderTemplate::Table)
|
||||
.name("fk_reminder_template_guild")
|
||||
.to_owned(),
|
||||
)
|
||||
.await?;
|
||||
manager
|
||||
.drop_foreign_key(
|
||||
ForeignKey::drop().table(Timer::Table).name("fk_timer_user").to_owned(),
|
||||
)
|
||||
.await?;
|
||||
manager
|
||||
.drop_foreign_key(
|
||||
ForeignKey::drop().table(Timer::Table).name("fk_timer_guild").to_owned(),
|
||||
)
|
||||
.await?;
|
||||
manager
|
||||
.drop_foreign_key(ForeignKey::drop().table(Todo::Table).name("fk_todo_user").to_owned())
|
||||
.await?;
|
||||
manager
|
||||
.drop_foreign_key(
|
||||
ForeignKey::drop().table(Todo::Table).name("fk_todo_guild").to_owned(),
|
||||
)
|
||||
.await?;
|
||||
manager
|
||||
.drop_foreign_key(
|
||||
ForeignKey::drop().table(Todo::Table).name("fk_todo_channel").to_owned(),
|
||||
)
|
||||
.await?;
|
||||
manager
|
||||
.drop_foreign_key(
|
||||
ForeignKey::drop()
|
||||
.table(CommandMacro::Table)
|
||||
.name("fk_command_macro_guild")
|
||||
.to_owned(),
|
||||
)
|
||||
.await?;
|
||||
|
||||
manager.drop_table(Table::drop().table(Guild::Table).to_owned()).await?;
|
||||
manager.drop_table(Table::drop().table(Channel::Table).to_owned()).await?;
|
||||
manager.drop_table(Table::drop().table(User::Table).to_owned()).await?;
|
||||
manager.drop_table(Table::drop().table(Reminder::Table).to_owned()).await?;
|
||||
manager.drop_table(Table::drop().table(ReminderTemplate::Table).to_owned()).await?;
|
||||
manager.drop_table(Table::drop().table(Timer::Table).to_owned()).await?;
|
||||
manager.drop_table(Table::drop().table(Todo::Table).to_owned()).await?;
|
||||
manager.drop_table(Table::drop().table(CommandMacro::Table).to_owned()).await?;
|
||||
|
||||
manager.drop_type(Type::drop().name(Timezone::Type).to_owned()).await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
6
models/migration/src/main.rs
Normal file
6
models/migration/src/main.rs
Normal file
@ -0,0 +1,6 @@
|
||||
use sea_orm_migration::prelude::*;
|
||||
|
||||
#[async_std::main]
|
||||
async fn main() {
|
||||
cli::run_cli(migration::Migrator).await;
|
||||
}
|
1
models/src/lib.rs
Normal file
1
models/src/lib.rs
Normal file
@ -0,0 +1 @@
|
||||
|
Reference in New Issue
Block a user