Initial commit with basic DB layout
This commit is contained in:
commit
a9e300ede2
19
.env.example
Normal file
19
.env.example
Normal file
@ -0,0 +1,19 @@
|
||||
# Database
|
||||
POSTGRES_HOST=0.0.0.0
|
||||
POSTGRES_PASSWORD=changeme
|
||||
POSTGRES_USER=ordabok
|
||||
POSTGRES_DB=ordabok
|
||||
DATABASE_URL=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}/${POSTGRES_DB}
|
||||
|
||||
# S3 Object Storing
|
||||
S3_ENDPOINT=https://s3.example.com
|
||||
S3_REGION=
|
||||
S3_BUCKET_ID=ordabok
|
||||
AWS_ACCESS_KEY_ID=
|
||||
AWS_SECRET_ACCESS_KEY=
|
||||
AWS_SESSION_TOKEN=
|
||||
|
||||
# Session manager
|
||||
APPWRITE_ENDPOINT=appwrite.phundrak.com
|
||||
APPWRITE_PROJECT=
|
||||
APPWRITE_API_KEY=
|
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
/target
|
||||
/.env
|
||||
/Cargo.lock
|
10
Cargo.toml
Normal file
10
Cargo.toml
Normal file
@ -0,0 +1,10 @@
|
||||
[package]
|
||||
name = "ordabok"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
diesel = { version = "2.0", features = ["postgres"] }
|
||||
dotenvy = "0.15"
|
8
diesel.toml
Normal file
8
diesel.toml
Normal file
@ -0,0 +1,8 @@
|
||||
# For documentation on how to configure this file,
|
||||
# see https://diesel.rs/guides/configuring-diesel-cli
|
||||
|
||||
[print_schema]
|
||||
file = "src/schema.rs"
|
||||
|
||||
[migrations_directory]
|
||||
dir = "migrations"
|
21
docker-compose.yml
Normal file
21
docker-compose.yml
Normal file
@ -0,0 +1,21 @@
|
||||
version: '3'
|
||||
|
||||
x-logging: &default-logging
|
||||
options:
|
||||
max-size: "100m"
|
||||
max-file: "5"
|
||||
driver: json-file
|
||||
|
||||
services:
|
||||
database:
|
||||
image: postgres:15-alpine
|
||||
container_name: ordabok_db
|
||||
env_file: .env
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ordabok_db_data:/var/lib/postgresql/data
|
||||
ports:
|
||||
- 5432:5432
|
||||
|
||||
volumes:
|
||||
ordabok_db_data:
|
0
migrations/.keep
Normal file
0
migrations/.keep
Normal file
6
migrations/00000000000000_diesel_initial_setup/down.sql
Normal file
6
migrations/00000000000000_diesel_initial_setup/down.sql
Normal file
@ -0,0 +1,6 @@
|
||||
-- This file was automatically created by Diesel to setup helper functions
|
||||
-- and other internal bookkeeping. This file is safe to edit, any future
|
||||
-- changes will be added to existing projects as new migrations.
|
||||
|
||||
DROP FUNCTION IF EXISTS diesel_manage_updated_at(_tbl regclass);
|
||||
DROP FUNCTION IF EXISTS diesel_set_updated_at();
|
36
migrations/00000000000000_diesel_initial_setup/up.sql
Normal file
36
migrations/00000000000000_diesel_initial_setup/up.sql
Normal file
@ -0,0 +1,36 @@
|
||||
-- This file was automatically created by Diesel to setup helper functions
|
||||
-- and other internal bookkeeping. This file is safe to edit, any future
|
||||
-- changes will be added to existing projects as new migrations.
|
||||
|
||||
|
||||
|
||||
|
||||
-- Sets up a trigger for the given table to automatically set a column called
|
||||
-- `updated_at` whenever the row is modified (unless `updated_at` was included
|
||||
-- in the modified columns)
|
||||
--
|
||||
-- # Example
|
||||
--
|
||||
-- ```sql
|
||||
-- CREATE TABLE users (id SERIAL PRIMARY KEY, updated_at TIMESTAMP NOT NULL DEFAULT NOW());
|
||||
--
|
||||
-- SELECT diesel_manage_updated_at('users');
|
||||
-- ```
|
||||
CREATE OR REPLACE FUNCTION diesel_manage_updated_at(_tbl regclass) RETURNS VOID AS $$
|
||||
BEGIN
|
||||
EXECUTE format('CREATE TRIGGER set_updated_at BEFORE UPDATE ON %s
|
||||
FOR EACH ROW EXECUTE PROCEDURE diesel_set_updated_at()', _tbl);
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
CREATE OR REPLACE FUNCTION diesel_set_updated_at() RETURNS trigger AS $$
|
||||
BEGIN
|
||||
IF (
|
||||
NEW IS DISTINCT FROM OLD AND
|
||||
NEW.updated_at IS NOT DISTINCT FROM OLD.updated_at
|
||||
) THEN
|
||||
NEW.updated_at := current_timestamp;
|
||||
END IF;
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
3
migrations/2023-01-03-134423_create_user/down.sql
Normal file
3
migrations/2023-01-03-134423_create_user/down.sql
Normal file
@ -0,0 +1,3 @@
|
||||
-- This file should undo anything in `up.sql`
|
||||
DROP TABLE UserFollows;
|
||||
DROP TABLE Users;
|
20
migrations/2023-01-03-134423_create_user/up.sql
Normal file
20
migrations/2023-01-03-134423_create_user/up.sql
Normal file
@ -0,0 +1,20 @@
|
||||
-- Your SQL goes here
|
||||
|
||||
CREATE TABLE Users (
|
||||
id VARCHAR(31) PRIMARY KEY, -- Appwrite User ID
|
||||
username VARCHAR(64) NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE UserFollows (
|
||||
id SERIAL PRIMARY KEY,
|
||||
follower VARCHAR(31)
|
||||
REFERENCES Users(id)
|
||||
ON UPDATE CASCADE
|
||||
ON DELETE CASCADE
|
||||
NOT NULL,
|
||||
following VARCHAR(31)
|
||||
REFERENCES Users(id)
|
||||
ON UPDATE CASCADE
|
||||
ON DELETE CASCADE
|
||||
NOT NULL
|
||||
);
|
6
migrations/2023-01-03-134426_create_language/down.sql
Normal file
6
migrations/2023-01-03-134426_create_language/down.sql
Normal file
@ -0,0 +1,6 @@
|
||||
-- This file should undo anything in `up.sql`
|
||||
DROP TABLE LangAndAgents;
|
||||
DROP TABLE Languages;
|
||||
DROP TYPE Release;
|
||||
DROP TYPE DictGenre;
|
||||
DROP TYPE AgentLanguageRelation;
|
37
migrations/2023-01-03-134426_create_language/up.sql
Normal file
37
migrations/2023-01-03-134426_create_language/up.sql
Normal file
@ -0,0 +1,37 @@
|
||||
-- Your SQL goes here
|
||||
CREATE TYPE Release as ENUM ('PUBLIC', 'NONCOMMERCIAL', 'RESEARCH', 'PRIVATE');
|
||||
CREATE TYPE DictGenre as ENUM ('gen', 'lrn', 'ety', 'spe', 'his', 'ort', 'trm');
|
||||
CREATE TYPE AgentLanguageRelation as ENUM ('publisher', 'author');
|
||||
|
||||
CREATE TABLE Languages (
|
||||
name VARCHAR(255) PRIMARY KEY,
|
||||
native VARCHAR(255),
|
||||
relese Release NOT NULL,
|
||||
targetLanguage TEXT[] NOT NULL,
|
||||
genre DictGenre[] NOT NULL,
|
||||
abstract TEXT,
|
||||
created TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||
description TEXT,
|
||||
rights TEXT,
|
||||
license TEXT,
|
||||
owner VARCHAR(31)
|
||||
REFERENCES Users(id)
|
||||
ON UPDATE CASCADE
|
||||
ON DELETE CASCADE
|
||||
NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE LangAndAgents (
|
||||
id SERIAL PRIMARY KEY,
|
||||
agent VARCHAR(31)
|
||||
REFERENCES Users(id)
|
||||
ON UPDATE CASCADE
|
||||
ON DELETE CASCADE
|
||||
NOT NULL,
|
||||
language VARCHAR(255)
|
||||
REFERENCES Languages(name)
|
||||
ON UPDATE CASCADE
|
||||
ON DELETE CASCADE
|
||||
NOT NULL,
|
||||
relationship AgentLanguageRelation NOT NULL
|
||||
);
|
1
migrations/2023-01-03-134434_create_word/down.sql
Normal file
1
migrations/2023-01-03-134434_create_word/down.sql
Normal file
@ -0,0 +1 @@
|
||||
-- This file should undo anything in `up.sql`
|
40
migrations/2023-01-03-134434_create_word/up.sql
Normal file
40
migrations/2023-01-03-134434_create_word/up.sql
Normal file
@ -0,0 +1,40 @@
|
||||
-- Your SQL goes here
|
||||
CREATE TYPE PartOfSpeech as ENUM ('ADJ', 'ADP', 'ADV', 'AUX', 'CCONJ', 'DET', 'INTJ', 'NOUN', 'NUM', 'PART', 'PRON', 'PROPN', 'PUNCT', 'SCONJ', 'SYM', 'VERB', 'X');
|
||||
CREATE TYPE WordRelationship as ENUM('def', 'related');
|
||||
|
||||
CREATE TABLE Words (
|
||||
norm VARCHAR(255) PRIMARY KEY, -- normalized word
|
||||
native VARCHAR(255),
|
||||
lemma VARCHAR(255)
|
||||
REFERENCES Words(norm)
|
||||
ON UPDATE CASCADE
|
||||
ON DELETE SET NULL,
|
||||
language VARCHAR(255)
|
||||
REFERENCES Languages(name)
|
||||
ON UPDATE CASCADE
|
||||
ON DELETE CASCADE
|
||||
NOT NULL,
|
||||
partofspeech PartOfSpeech NOT NULL,
|
||||
audio VARCHAR(511),
|
||||
video VARCHAR(511),
|
||||
image VARCHAR(511),
|
||||
description TEXT, -- Markdown
|
||||
etymology TEXT, -- Markdown
|
||||
lusage TEXT, -- Markdown
|
||||
morphology TEXT -- Markdown
|
||||
);
|
||||
|
||||
CREATE TABLE WordRelation (
|
||||
id SERIAL PRIMARY KEY,
|
||||
wordsource VARCHAR(255)
|
||||
REFERENCES Words(norm)
|
||||
ON UPDATE CASCADE
|
||||
ON DELETE CASCADE
|
||||
NOT NULL,
|
||||
wordtarget VARCHAR(255)
|
||||
REFERENCES Words(norm)
|
||||
ON UPDATE CASCADE
|
||||
ON DELETE CASCADE
|
||||
NOT NULL,
|
||||
relationship WordRelationship NOT NULL
|
||||
);
|
3
src/main.rs
Normal file
3
src/main.rs
Normal file
@ -0,0 +1,3 @@
|
||||
fn main() {
|
||||
println!("Hello, world!");
|
||||
}
|
117
src/schema.rs
Normal file
117
src/schema.rs
Normal file
@ -0,0 +1,117 @@
|
||||
// @generated automatically by Diesel CLI.
|
||||
|
||||
pub mod sql_types {
|
||||
#[derive(diesel::sql_types::SqlType)]
|
||||
#[diesel(postgres_type(name = "agentlanguagerelation"))]
|
||||
pub struct Agentlanguagerelation;
|
||||
|
||||
#[derive(diesel::sql_types::SqlType)]
|
||||
#[diesel(postgres_type(name = "dictgenre"))]
|
||||
pub struct Dictgenre;
|
||||
|
||||
#[derive(diesel::sql_types::SqlType)]
|
||||
#[diesel(postgres_type(name = "partofspeech"))]
|
||||
pub struct Partofspeech;
|
||||
|
||||
#[derive(diesel::sql_types::SqlType)]
|
||||
#[diesel(postgres_type(name = "release"))]
|
||||
pub struct Release;
|
||||
|
||||
#[derive(diesel::sql_types::SqlType)]
|
||||
#[diesel(postgres_type(name = "wordrelationship"))]
|
||||
pub struct Wordrelationship;
|
||||
}
|
||||
|
||||
diesel::table! {
|
||||
use diesel::sql_types::*;
|
||||
use super::sql_types::Agentlanguagerelation;
|
||||
|
||||
langandagents (id) {
|
||||
id -> Int4,
|
||||
agent -> Varchar,
|
||||
language -> Varchar,
|
||||
relationship -> Agentlanguagerelation,
|
||||
}
|
||||
}
|
||||
|
||||
diesel::table! {
|
||||
use diesel::sql_types::*;
|
||||
use super::sql_types::Release;
|
||||
use super::sql_types::Dictgenre;
|
||||
|
||||
languages (name) {
|
||||
name -> Varchar,
|
||||
native -> Nullable<Varchar>,
|
||||
relese -> Release,
|
||||
targetlanguage -> Array<Nullable<Text>>,
|
||||
genre -> Array<Nullable<Dictgenre>>,
|
||||
#[sql_name = "abstract"]
|
||||
abstract_ -> Nullable<Text>,
|
||||
created -> Nullable<Timestamptz>,
|
||||
description -> Nullable<Text>,
|
||||
rights -> Nullable<Text>,
|
||||
license -> Nullable<Text>,
|
||||
owner -> Varchar,
|
||||
}
|
||||
}
|
||||
|
||||
diesel::table! {
|
||||
userfollows (id) {
|
||||
id -> Int4,
|
||||
follower -> Varchar,
|
||||
following -> Varchar,
|
||||
}
|
||||
}
|
||||
|
||||
diesel::table! {
|
||||
users (id) {
|
||||
id -> Varchar,
|
||||
username -> Varchar,
|
||||
}
|
||||
}
|
||||
|
||||
diesel::table! {
|
||||
use diesel::sql_types::*;
|
||||
use super::sql_types::Wordrelationship;
|
||||
|
||||
wordrelation (id) {
|
||||
id -> Int4,
|
||||
wordsource -> Varchar,
|
||||
wordtarget -> Varchar,
|
||||
relationship -> Wordrelationship,
|
||||
}
|
||||
}
|
||||
|
||||
diesel::table! {
|
||||
use diesel::sql_types::*;
|
||||
use super::sql_types::Partofspeech;
|
||||
|
||||
words (norm) {
|
||||
norm -> Varchar,
|
||||
native -> Nullable<Varchar>,
|
||||
lemma -> Nullable<Varchar>,
|
||||
language -> Varchar,
|
||||
partofspeech -> Partofspeech,
|
||||
audio -> Nullable<Varchar>,
|
||||
video -> Nullable<Varchar>,
|
||||
image -> Nullable<Varchar>,
|
||||
description -> Nullable<Text>,
|
||||
etymology -> Nullable<Text>,
|
||||
lusage -> Nullable<Text>,
|
||||
morphology -> Nullable<Text>,
|
||||
}
|
||||
}
|
||||
|
||||
diesel::joinable!(langandagents -> languages (language));
|
||||
diesel::joinable!(langandagents -> users (agent));
|
||||
diesel::joinable!(languages -> users (owner));
|
||||
diesel::joinable!(words -> languages (language));
|
||||
|
||||
diesel::allow_tables_to_appear_in_same_query!(
|
||||
langandagents,
|
||||
languages,
|
||||
userfollows,
|
||||
users,
|
||||
wordrelation,
|
||||
words,
|
||||
);
|
Loading…
Reference in New Issue
Block a user