You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
2.5 KiB
77 lines
2.5 KiB
drop table if exists users; |
|
drop table if exists accounts; |
|
drop table if exists users_accounts; |
|
drop table if exists transactions; |
|
drop table if exists accounts_transactions; |
|
drop table if exists notifications; |
|
drop table if exists users_notifications; |
|
drop table if exists exchange; |
|
|
|
create table users ( |
|
id integer primary key autoincrement, |
|
username text unique not null, |
|
email text unique not null, |
|
otp text not null, |
|
fullname text not null |
|
); |
|
|
|
create table accounts ( |
|
id integer primary key autoincrement, |
|
iban text unique not null, -- RO16 FOXB 0000 0000 0000 0000 |
|
currency text not null, -- EUR, RON, USD, ? |
|
account_type text not null, -- checking, savings, ? |
|
custom_name text -- 'Car Savings'; name set by user |
|
); |
|
|
|
create table users_accounts ( |
|
user_id integer not null, -- one user can have multiple accounts |
|
account_id integer UNIQUE not null, -- one account can only have one user |
|
foreign key (user_id) references users (id), |
|
foreign key (account_id) references accounts (id) |
|
); |
|
|
|
create table transactions ( |
|
id integer primary key autoincrement, |
|
datetime text not null, |
|
other_party text not null, -- JSON data describing sender/recipient/etc |
|
-- depending on transaction type |
|
status text not null, -- processed, failed, reverted, pending, etc |
|
type text not null, -- send_transfer, receive_transfer, card_payment, fee, ... |
|
extra text -- depending on type, JSON data describing extra info |
|
); |
|
|
|
create table accounts_transactions ( |
|
account_id integer not null, |
|
transaction_id integer UNIQUE not null, |
|
foreign key (account_id) references accounts (id), |
|
foreign key (transaction_id) references transactions (id) |
|
); |
|
|
|
create table notifications ( |
|
id integer primary key autoincrement, |
|
body text not null, |
|
datetime text not null, |
|
read integer not null |
|
); |
|
|
|
create table users_notifications ( |
|
user_id integer not null, |
|
notification_id integer UNIQUE not null, |
|
foreign key (user_id) references users (id), |
|
foreign key (notification_id) references notifications (id) |
|
); |
|
|
|
create table exchange ( |
|
id integer primary key autoincrement, |
|
currency text not null, |
|
to_ron real not null, |
|
from_ron real not null |
|
); |
|
|
|
create view V_account_balance as |
|
select |
|
accounts_transactions.account_id as "account_id", |
|
sum(json_extract(transactions.extra, '$.amount')) as "balance" |
|
from transactions |
|
inner join accounts_transactions on accounts_transactions.transaction_id = transactions.id |
|
group by accounts_transactions.account_id;
|
|
|