begin migrating to postgres

This commit is contained in:
mykola2312 2024-03-08 07:01:12 +02:00
parent 0082d1feb5
commit cc9979086f
6 changed files with 71 additions and 45 deletions

1
Cargo.lock generated
View file

@ -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",

View file

@ -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"

View file

@ -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
END; UPDATE "chat" SET can_download = TRUE WHERE "chat".id = new.requested_for;
END IF;
RETURN new;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER approve_chat
AFTER UPDATE OF is_approved ON request_chat
FOR EACH ROW
EXECUTE FUNCTION approve_chat();

View file

@ -22,12 +22,11 @@ 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(());
} }
}; };
out out
}}; }};
} }

View file

@ -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;

View file

@ -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