begin migrating to postgres
This commit is contained in:
parent
0082d1feb5
commit
cc9979086f
6 changed files with 71 additions and 45 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
|
@ -2018,6 +2018,7 @@ dependencies = [
|
||||||
"sha2",
|
"sha2",
|
||||||
"sqlx-core",
|
"sqlx-core",
|
||||||
"sqlx-mysql",
|
"sqlx-mysql",
|
||||||
|
"sqlx-postgres",
|
||||||
"sqlx-sqlite",
|
"sqlx-sqlite",
|
||||||
"syn 1.0.109",
|
"syn 1.0.109",
|
||||||
"tempfile",
|
"tempfile",
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ anyhow = "1.0.75"
|
||||||
dotenv = "0.15.0"
|
dotenv = "0.15.0"
|
||||||
tokio = { version = "1.32.0", features = ["rt-multi-thread", "macros", "process"] }
|
tokio = { version = "1.32.0", features = ["rt-multi-thread", "macros", "process"] }
|
||||||
teloxide = { version = "0.12.2", git ="https://github.com/teloxide/teloxide", features = ["macros"] }
|
teloxide = { version = "0.12.2", git ="https://github.com/teloxide/teloxide", features = ["macros"] }
|
||||||
sqlx = { version = "0.7.3", features = [ "runtime-tokio", "tls-native-tls", "sqlite", "sqlx-sqlite" ] }
|
sqlx = { version = "0.7.3", features = [ "runtime-tokio", "tls-native-tls", "postgres", "sqlx-postgres" ] }
|
||||||
serde = { version = "1.0.196", features = ["derive"] }
|
serde = { version = "1.0.196", features = ["derive"] }
|
||||||
serde_json = "1.0.113"
|
serde_json = "1.0.113"
|
||||||
ordered-float = "4.2.0"
|
ordered-float = "4.2.0"
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,13 @@
|
||||||
CREATE TABLE "user"
|
CREATE TABLE "user"
|
||||||
(
|
(
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
id SERIAL PRIMARY KEY,
|
||||||
tg_id INTEGER NOT NULL UNIQUE,
|
tg_id BIGINT NOT NULL UNIQUE,
|
||||||
username TEXT UNIQUE,
|
username VARCHAR UNIQUE,
|
||||||
first_name TEXT NOT NULL,
|
first_name VARCHAR NOT NULL,
|
||||||
last_name TEXT,
|
last_name VARCHAR,
|
||||||
can_download INTEGER NOT NULL,
|
can_download BOOLEAN NOT NULL,
|
||||||
is_admin INTEGER NOT NULL,
|
is_admin BOOLEAN NOT NULL,
|
||||||
has_private_chat INTEGER NOT NULL
|
has_private_chat BOOLEAN NOT NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE INDEX idx_user_tg_id
|
CREATE INDEX idx_user_tg_id
|
||||||
|
|
@ -15,11 +15,11 @@ CREATE INDEX idx_user_tg_id
|
||||||
|
|
||||||
CREATE TABLE "chat"
|
CREATE TABLE "chat"
|
||||||
(
|
(
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
id SERIAL PRIMARY KEY,
|
||||||
tg_id INTEGER NOT NULL UNIQUE,
|
tg_id BIGINT NOT NULL UNIQUE,
|
||||||
title TEXT NOT NULL,
|
title VARCHAR NOT NULL,
|
||||||
username TEXT,
|
username VARCHAR,
|
||||||
can_download INTEGER NOT NULL
|
can_download BOOLEAN NOT NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE INDEX idx_chat_tg_id
|
CREATE INDEX idx_chat_tg_id
|
||||||
|
|
@ -27,11 +27,11 @@ CREATE INDEX idx_chat_tg_id
|
||||||
|
|
||||||
CREATE TABLE "link"
|
CREATE TABLE "link"
|
||||||
(
|
(
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
id SERIAL PRIMARY KEY,
|
||||||
domain TEXT NOT NULL UNIQUE,
|
domain VARCHAR NOT NULL,
|
||||||
path TEXT,
|
path VARCHAR,
|
||||||
download_allowed INTEGER NOT NULL,
|
download_allowed BOOLEAN NOT NULL,
|
||||||
auto_download INTEGER NOT NULL
|
auto_download BOOLEAN NOT NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE INDEX idx_link_domain
|
CREATE INDEX idx_link_domain
|
||||||
|
|
@ -39,40 +39,56 @@ CREATE INDEX idx_link_domain
|
||||||
|
|
||||||
CREATE TABLE "request"
|
CREATE TABLE "request"
|
||||||
(
|
(
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
id SERIAL PRIMARY KEY,
|
||||||
requested_by INTEGER NOT NULL UNIQUE,
|
requested_by INTEGER NOT NULL UNIQUE,
|
||||||
approved_by INTEGER UNIQUE,
|
approved_by INTEGER UNIQUE,
|
||||||
message TEXT NOT NULL,
|
message VARCHAR NOT NULL,
|
||||||
is_approved INTEGER NOT NULL,
|
is_approved BOOLEAN NOT NULL,
|
||||||
|
|
||||||
FOREIGN KEY(requested_by) REFERENCES "user"(id),
|
FOREIGN KEY(requested_by) REFERENCES "user"(id),
|
||||||
FOREIGN KEY(approved_by) REFERENCES "user"(id)
|
FOREIGN KEY(approved_by) REFERENCES "user"(id)
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TRIGGER "approve"
|
CREATE FUNCTION approve()
|
||||||
AFTER UPDATE OF is_approved ON "request"
|
RETURNS TRIGGER AS $$
|
||||||
WHEN new.is_approved = 1
|
|
||||||
BEGIN
|
BEGIN
|
||||||
UPDATE user SET can_download = 1 WHERE user.id = new.requested_by;
|
IF new.is_approved THEN
|
||||||
|
UPDATE "user" SET can_download = TRUE WHERE "user".id = new.requested_by;
|
||||||
|
END IF;
|
||||||
|
RETURN new;
|
||||||
END;
|
END;
|
||||||
|
$$ LANGUAGE plpgsql;
|
||||||
|
|
||||||
|
CREATE TRIGGER approve
|
||||||
|
AFTER UPDATE OF is_approved ON request
|
||||||
|
FOR EACH ROW
|
||||||
|
EXECUTE FUNCTION approve();
|
||||||
|
|
||||||
CREATE TABLE "request_chat"
|
CREATE TABLE "request_chat"
|
||||||
(
|
(
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
id SERIAL PRIMARY KEY,
|
||||||
requested_by INTEGER NOT NULL UNIQUE,
|
requested_by INTEGER NOT NULL UNIQUE,
|
||||||
requested_for INTEGER NOT NULL UNIQUE,
|
requested_for INTEGER NOT NULL UNIQUE,
|
||||||
approved_by INTEGER UNIQUE,
|
approved_by INTEGER UNIQUE,
|
||||||
message TEXT NOT NULL,
|
message VARCHAR NOT NULL,
|
||||||
is_approved INTEGER NOT NULL,
|
is_approved BOOLEAN NOT NULL,
|
||||||
|
|
||||||
FOREIGN KEY(requested_by) REFERENCES "user"(id),
|
FOREIGN KEY(requested_by) REFERENCES "user"(id),
|
||||||
FOREIGN KEY(requested_for) REFERENCES "chat"(id),
|
FOREIGN KEY(requested_for) REFERENCES "chat"(id),
|
||||||
FOREIGN KEY(approved_by) REFERENCES "user"(id)
|
FOREIGN KEY(approved_by) REFERENCES "user"(id)
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TRIGGER "approve_chat"
|
CREATE FUNCTION approve_chat()
|
||||||
AFTER UPDATE OF is_approved ON "request_chat"
|
RETURNS TRIGGER AS $$
|
||||||
WHEN new.is_approved = 1
|
|
||||||
BEGIN
|
BEGIN
|
||||||
UPDATE chat SET can_download = 1 WHERE chat.id = new.requested_for;
|
IF new.is_approved THEN
|
||||||
|
UPDATE "chat" SET can_download = TRUE WHERE "chat".id = new.requested_for;
|
||||||
|
END IF;
|
||||||
|
RETURN new;
|
||||||
END;
|
END;
|
||||||
|
$$ LANGUAGE plpgsql;
|
||||||
|
|
||||||
|
CREATE TRIGGER approve_chat
|
||||||
|
AFTER UPDATE OF is_approved ON request_chat
|
||||||
|
FOR EACH ROW
|
||||||
|
EXECUTE FUNCTION approve_chat();
|
||||||
|
|
@ -22,8 +22,7 @@ macro_rules! parse_integer {
|
||||||
let out: i64 = match $integer.parse() {
|
let out: i64 = match $integer.parse() {
|
||||||
Ok(integer) => integer,
|
Ok(integer) => integer,
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
$bot.send_message($chat_id, t!("not_valid_integer"))
|
$bot.send_message($chat_id, t!("not_valid_integer")).await?;
|
||||||
.await?;
|
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ use tracing::{event, Level};
|
||||||
use super::start::handle_new_chat_member;
|
use super::start::handle_new_chat_member;
|
||||||
use super::types::*;
|
use super::types::*;
|
||||||
use crate::db::DbPool;
|
use crate::db::DbPool;
|
||||||
use crate::util::{unwrap_env, parse_env};
|
use crate::util::{parse_env, unwrap_env};
|
||||||
|
|
||||||
use super::dl::cmd_download;
|
use super::dl::cmd_download;
|
||||||
use super::op::cmd_op;
|
use super::op::cmd_op;
|
||||||
|
|
|
||||||
24
src/db.rs
24
src/db.rs
|
|
@ -1,10 +1,10 @@
|
||||||
use sqlx::migrate::MigrateDatabase;
|
use sqlx::migrate::MigrateDatabase;
|
||||||
use sqlx::{Sqlite, SqlitePool};
|
use sqlx::{PgPool, Postgres};
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
|
||||||
use super::util::make_database_url;
|
use super::util::unwrap_env;
|
||||||
|
|
||||||
pub type DbPool = SqlitePool;
|
pub type DbPool = PgPool;
|
||||||
|
|
||||||
#[derive(sqlx::FromRow, Debug)]
|
#[derive(sqlx::FromRow, Debug)]
|
||||||
pub struct User {
|
pub struct User {
|
||||||
|
|
@ -83,15 +83,25 @@ pub struct RequestChat {
|
||||||
pub is_approved: i64,
|
pub is_approved: i64,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn db_init() -> SqlitePool {
|
pub fn make_database_url() -> String {
|
||||||
|
format!(
|
||||||
|
"postgres://{}:{}@{}/{}",
|
||||||
|
unwrap_env("POSTGRES_USER"),
|
||||||
|
unwrap_env("POSTGRES_PASSWORD"),
|
||||||
|
unwrap_env("POSTGRES_HOST"),
|
||||||
|
unwrap_env("POSTGRES_DB")
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn db_init() -> PgPool {
|
||||||
let db_url = make_database_url();
|
let db_url = make_database_url();
|
||||||
if !Sqlite::database_exists(&db_url).await.unwrap_or(false) {
|
if !Postgres::database_exists(&db_url).await.unwrap_or(false) {
|
||||||
Sqlite::create_database(&db_url)
|
Postgres::create_database(&db_url)
|
||||||
.await
|
.await
|
||||||
.expect("failed to create database");
|
.expect("failed to create database");
|
||||||
}
|
}
|
||||||
|
|
||||||
let db = SqlitePool::connect(&db_url).await.unwrap();
|
let db = PgPool::connect(&db_url).await.unwrap();
|
||||||
sqlx::migrate!().run(&db).await.unwrap();
|
sqlx::migrate!().run(&db).await.unwrap();
|
||||||
|
|
||||||
db
|
db
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue