use dbnexus::db_entity;
use sea_orm::entity::prelude::DateTimeUtc;
use sea_orm::entity::prelude::*;
#[db_entity(table_name = "limiteron_bans", primary_key = "id")]
#[derive(Clone, Debug, PartialEq, DeriveEntityModel)]
#[sea_orm(table_name = "limiteron_bans")]
pub struct Model {
#[sea_orm(primary_key)]
pub id: i64,
#[sea_orm(column_type = "Text")]
pub target_type: String,
#[sea_orm(column_name = "target_value")]
pub target_value: String,
#[sea_orm(unique)]
#[sea_orm(column_name = "target_key")]
pub target_key: String,
pub ban_times: u32,
pub duration: i64,
pub banned_at: DateTimeUtc,
pub expires_at: DateTimeUtc,
pub is_manual: bool,
pub reason: String,
pub created_at: DateTimeUtc,
pub updated_at: DateTimeUtc,
}
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
pub enum Relation {}
pub fn create_table_ddl() -> &'static str {
r#"
CREATE TABLE IF NOT EXISTS limiteron_bans (
id BIGSERIAL PRIMARY KEY,
target_type VARCHAR(50) NOT NULL,
target_value TEXT NOT NULL,
target_key VARCHAR(511) NOT NULL UNIQUE,
ban_times INTEGER NOT NULL DEFAULT 1,
duration BIGINT NOT NULL,
banned_at TIMESTAMP WITH TIME ZONE NOT NULL,
expires_at TIMESTAMP WITH TIME ZONE NOT NULL,
is_manual BOOLEAN NOT NULL DEFAULT FALSE,
reason TEXT NOT NULL,
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
)
"#
}
pub fn create_target_key(target_type: &str, target_value: &str) -> String {
format!("{}:{}", target_type, target_value)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_create_target_key() {
assert_eq!(create_target_key("ip", "192.168.1.1"), "ip:192.168.1.1");
assert_eq!(create_target_key("user", "user123"), "user:user123");
assert_eq!(
create_target_key("mac", "aa:bb:cc:dd:ee:ff"),
"mac:aa:bb:cc:dd:ee:ff"
);
}
#[test]
fn test_create_table_ddl() {
let ddl = create_table_ddl();
assert!(ddl.contains("limiteron_bans"));
assert!(ddl.contains("target_type"));
assert!(ddl.contains("target_value"));
assert!(ddl.contains("expires_at"));
}
}