Restructured project

- backend moved to backend directory
- added and initialized frontend with vue
- moved infrastructure files to infra directory
This commit is contained in:
2026-04-01 22:27:26 +03:00
parent 48ef7217eb
commit 9d845c8899
96 changed files with 1591 additions and 118 deletions
@@ -0,0 +1 @@
DROP TABLE IF EXISTS users;
@@ -0,0 +1,13 @@
CREATE TABLE users
(
id BIGSERIAL PRIMARY KEY,
telegram_id BIGINT UNIQUE NOT NULL,
username TEXT,
first_name TEXT NOT NULL,
last_name TEXT,
language_code TEXT,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_users_telegram_id ON users (telegram_id);
@@ -0,0 +1 @@
DROP TABLE IF EXISTS families;
@@ -0,0 +1,14 @@
CREATE TABLE families
(
id BIGSERIAL PRIMARY KEY,
name TEXT NOT NULL,
owner_id BIGINT NOT NULL REFERENCES users (id),
telegram_chat_id BIGINT NOT NULL,
telegram_chat_name TEXT,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_families_owner_id ON families (owner_id);
CREATE UNIQUE INDEX idx_families_chat_id ON families (telegram_chat_id);
@@ -0,0 +1,2 @@
DROP TABLE IF EXISTS family_members;
DROP TYPE IF EXISTS family_role;
@@ -0,0 +1,26 @@
CREATE TYPE family_role AS ENUM (
'owner',
'admin',
'member',
'child'
);
CREATE TABLE family_members
(
id BIGSERIAL PRIMARY KEY,
family_id BIGINT NOT NULL REFERENCES families (id) ON DELETE CASCADE,
user_id BIGINT NOT NULL REFERENCES users (id) ON DELETE CASCADE,
role family_role NOT NULL DEFAULT 'member',
joined_at TIMESTAMP NOT NULL DEFAULT NOW(),
UNIQUE (family_id, user_id)
);
-- быстрый поиск всех членов семьи
CREATE INDEX idx_family_members_family_id ON family_members (family_id);
-- быстрый поиск всех семей пользователя
CREATE INDEX idx_family_members_user_id ON family_members (user_id);
-- composite для частых join’ов
CREATE INDEX idx_family_members_user_family ON family_members (user_id, family_id);
@@ -0,0 +1,2 @@
DROP TABLE IF EXISTS threads;
DROP TYPE IF EXISTS thread_type;
@@ -0,0 +1,19 @@
CREATE TABLE family_threads
(
id BIGSERIAL PRIMARY KEY,
family_id BIGINT NOT NULL REFERENCES families (id) ON DELETE CASCADE,
type TEXT NOT NULL,
title TEXT NOT NULL,
telegram_topic_id BIGINT NOT NULL,
is_system BOOLEAN NOT NULL DEFAULT FALSE,
created_by BIGINT NOT NULL REFERENCES users (id),
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
UNIQUE (family_id, telegram_topic_id)
);
CREATE UNIQUE INDEX idx_unique_system_threads ON family_threads (family_id, type) WHERE is_system = TRUE;
CREATE INDEX idx_threads_family_id ON family_threads (family_id);
CREATE INDEX idx_threads_family_type ON family_threads (family_id, type);
@@ -0,0 +1 @@
DROP TABLE receipts;
@@ -0,0 +1,35 @@
CREATE TABLE receipts
(
id BIGSERIAL PRIMARY KEY,
receipt_number TEXT NOT NULL UNIQUE,
ui TEXT NOT NULL,
status INTEGER NOT NULL,
issued_at TIMESTAMP NOT NULL,
total_amount REAL NOT NULL,
payment_amount REAL NOT NULL,
cash_amount REAL NOT NULL,
another_amount REAL NOT NULL,
clearing_amount REAL NOT NULL,
margin REAL NOT NULL,
currency TEXT NOT NULL,
payment_type INTEGER NOT NULL,
cashbox_number INTEGER NOT NULL,
cashier TEXT,
name_spd TEXT,
name_to TEXT,
name_np TEXT,
type_np TEXT,
street_to TEXT,
house_to TEXT,
kod_soato TEXT,
oblast_soato TEXT,
rayon_soato TEXT,
selsovet_soato TEXT,
doc_num TEXT,
skno_number TEXT,
unp TEXT,
success TEXT,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_receipts_issued_at ON receipts(issued_at);
@@ -0,0 +1 @@
DROP TABLE positions;
@@ -0,0 +1,19 @@
CREATE TABLE positions
(
id BIGSERIAL PRIMARY KEY,
receipt_id BIGINT NOT NULL,
section_number TEXT,
gtin_code TEXT,
product_name TEXT NOT NULL,
product_count REAL NOT NULL,
amount REAL NOT NULL,
discount REAL,
surcharge REAL,
tag TEXT,
marking_code TEXT,
ukz_code TEXT,
FOREIGN KEY (receipt_id) REFERENCES receipts (id) ON DELETE CASCADE
);
CREATE INDEX idx_positions_receipt_id ON positions (receipt_id);
@@ -0,0 +1,3 @@
SELECT cron.unschedule('cleanup-expired-otp');
DROP TABLE IF EXISTS otp;
@@ -0,0 +1,17 @@
CREATE UNLOGGED TABLE otp
(
user_id BIGINT NOT NULL,
otp TEXT NOT NULL,
expired_at TIMESTAMP NOT NULL,
FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE
);
CREATE INDEX idx_otp_user_id ON otp (user_id);
CREATE INDEX idx_otp_expired_at ON otp (expired_at);
SELECT cron.schedule(
'cleanup-expired-otp',
'*/10 * * * *',
$$DELETE FROM otp WHERE expired_at <= NOW()$$
);