mirror of
https://github.com/andwati/telecom-platform.git
synced 2026-10-18 02:52:53 +00:00
feat: Add comprehensive database schema migrations for all platform tables
- Add subscribers table with IMSI, MSISDN, authentication keys, and eSIM profile fields - Add service_plans table for data/voice/SMS limits and QoS parameters (ARPA, AMBR) - Add sessions table for tracking PDU sessions with QoS and usage metrics - Add usage_records table for billing and charging data - Add users table with role-based access control fields - Add roles, permissions, and role_permissions junction table for RBAC - Add auth
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
-- +goose Up
|
||||
-- Create subscribers table
|
||||
CREATE TABLE IF NOT EXISTS subscribers (
|
||||
id SERIAL PRIMARY KEY,
|
||||
imsi TEXT NOT NULL UNIQUE,
|
||||
msisdn TEXT UNIQUE,
|
||||
imei TEXT,
|
||||
first_name TEXT NOT NULL,
|
||||
last_name TEXT NOT NULL,
|
||||
email TEXT UNIQUE,
|
||||
organization_id TEXT,
|
||||
status TEXT NOT NULL DEFAULT 'active',
|
||||
plan_id INTEGER,
|
||||
balance DOUBLE PRECISION NOT NULL DEFAULT 0,
|
||||
auth_key TEXT NOT NULL,
|
||||
opc TEXT NOT NULL,
|
||||
serving_plmn_mcc TEXT NOT NULL,
|
||||
serving_plmn_mnc TEXT NOT NULL,
|
||||
euicc_id TEXT,
|
||||
profile_id TEXT,
|
||||
profile_status TEXT NOT NULL DEFAULT 'inactive',
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
deleted_at TIMESTAMPTZ
|
||||
);
|
||||
|
||||
-- Create indexes
|
||||
CREATE INDEX IF NOT EXISTS idx_subscribers_imsi ON subscribers(imsi);
|
||||
CREATE INDEX IF NOT EXISTS idx_subscribers_msisdn ON subscribers(msisdn);
|
||||
CREATE INDEX IF NOT EXISTS idx_subscribers_email ON subscribers(email);
|
||||
CREATE INDEX IF NOT EXISTS idx_subscribers_status ON subscribers(status);
|
||||
CREATE INDEX IF NOT EXISTS idx_subscribers_organization_id ON subscribers(organization_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_subscribers_plan_id ON subscribers(plan_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_subscribers_deleted_at ON subscribers(deleted_at);
|
||||
|
||||
-- +goose Down
|
||||
-- Drop subscribers table
|
||||
DROP TABLE IF EXISTS subscribers CASCADE;
|
||||
@@ -0,0 +1,28 @@
|
||||
-- +goose Up
|
||||
-- Create service_plans table
|
||||
CREATE TABLE IF NOT EXISTS service_plans (
|
||||
id SERIAL PRIMARY KEY,
|
||||
name TEXT NOT NULL,
|
||||
description TEXT,
|
||||
data_limit BIGINT,
|
||||
voice_limit INTEGER,
|
||||
sms_limit INTEGER,
|
||||
monthly_fee DOUBLE PRECISION,
|
||||
data_rate DOUBLE PRECISION,
|
||||
voice_rate DOUBLE PRECISION,
|
||||
sms_rate DOUBLE PRECISION,
|
||||
arpa INTEGER,
|
||||
ambr_uplink INTEGER,
|
||||
ambr_downlink INTEGER,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
deleted_at TIMESTAMPTZ
|
||||
);
|
||||
|
||||
-- Create indexes
|
||||
CREATE INDEX IF NOT EXISTS idx_service_plans_name ON service_plans(name);
|
||||
CREATE INDEX IF NOT EXISTS idx_service_plans_deleted_at ON service_plans(deleted_at);
|
||||
|
||||
-- +goose Down
|
||||
-- Drop service_plans table
|
||||
DROP TABLE IF EXISTS service_plans CASCADE;
|
||||
@@ -0,0 +1,37 @@
|
||||
-- +goose Up
|
||||
-- Create sessions table
|
||||
CREATE TABLE IF NOT EXISTS sessions (
|
||||
id SERIAL PRIMARY KEY,
|
||||
subscriber_id INTEGER NOT NULL,
|
||||
session_id TEXT NOT NULL UNIQUE,
|
||||
pdu_address TEXT,
|
||||
dnn TEXT,
|
||||
snssai_sst SMALLINT,
|
||||
snssai_sd INTEGER,
|
||||
qos_qci SMALLINT,
|
||||
qos_arpa INTEGER,
|
||||
qos_mbr_uplink INTEGER,
|
||||
qos_mbr_downlink INTEGER,
|
||||
qos_gbr_uplink INTEGER,
|
||||
qos_gbr_downlink INTEGER,
|
||||
qos_priority SMALLINT,
|
||||
status TEXT NOT NULL DEFAULT 'active',
|
||||
start_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
end_time TIMESTAMPTZ,
|
||||
data_used BIGINT NOT NULL DEFAULT 0,
|
||||
voice_used INTEGER NOT NULL DEFAULT 0,
|
||||
sms_used INTEGER NOT NULL DEFAULT 0,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
deleted_at TIMESTAMPTZ
|
||||
);
|
||||
|
||||
-- Create indexes
|
||||
CREATE INDEX IF NOT EXISTS idx_sessions_subscriber_id ON sessions(subscriber_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_sessions_session_id ON sessions(session_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_sessions_status ON sessions(status);
|
||||
CREATE INDEX IF NOT EXISTS idx_sessions_deleted_at ON sessions(deleted_at);
|
||||
|
||||
-- +goose Down
|
||||
-- Drop sessions table
|
||||
DROP TABLE IF EXISTS sessions CASCADE;
|
||||
@@ -0,0 +1,27 @@
|
||||
-- +goose Up
|
||||
-- Create usage_records table
|
||||
CREATE TABLE IF NOT EXISTS usage_records (
|
||||
id SERIAL PRIMARY KEY,
|
||||
subscriber_id INTEGER NOT NULL,
|
||||
session_id INTEGER,
|
||||
usage_type TEXT NOT NULL,
|
||||
start_time TIMESTAMPTZ NOT NULL,
|
||||
end_time TIMESTAMPTZ NOT NULL,
|
||||
volume BIGINT NOT NULL,
|
||||
rate DOUBLE PRECISION,
|
||||
cost DOUBLE PRECISION,
|
||||
billing_cycle TEXT,
|
||||
invoice_id INTEGER,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Create indexes
|
||||
CREATE INDEX IF NOT EXISTS idx_usage_records_subscriber_id ON usage_records(subscriber_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_usage_records_session_id ON usage_records(session_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_usage_records_usage_type ON usage_records(usage_type);
|
||||
CREATE INDEX IF NOT EXISTS idx_usage_records_billing_cycle ON usage_records(billing_cycle);
|
||||
|
||||
-- +goose Down
|
||||
-- Drop usage_records table
|
||||
DROP TABLE IF EXISTS usage_records CASCADE;
|
||||
@@ -0,0 +1,26 @@
|
||||
-- +goose Up
|
||||
-- Create users table
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
id SERIAL PRIMARY KEY,
|
||||
username TEXT NOT NULL UNIQUE,
|
||||
email TEXT NOT NULL UNIQUE,
|
||||
password TEXT NOT NULL,
|
||||
first_name TEXT NOT NULL,
|
||||
last_name TEXT NOT NULL,
|
||||
role TEXT NOT NULL DEFAULT 'viewer',
|
||||
is_active BOOLEAN NOT NULL DEFAULT true,
|
||||
last_login TIMESTAMPTZ,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
deleted_at TIMESTAMPTZ
|
||||
);
|
||||
|
||||
-- Create indexes
|
||||
CREATE INDEX IF NOT EXISTS idx_users_username ON users(username);
|
||||
CREATE INDEX IF NOT EXISTS idx_users_email ON users(email);
|
||||
CREATE INDEX IF NOT EXISTS idx_users_role ON users(role);
|
||||
CREATE INDEX IF NOT EXISTS idx_users_deleted_at ON users(deleted_at);
|
||||
|
||||
-- +goose Down
|
||||
-- Drop users table
|
||||
DROP TABLE IF EXISTS users CASCADE;
|
||||
@@ -0,0 +1,37 @@
|
||||
-- +goose Up
|
||||
-- Create roles table
|
||||
CREATE TABLE IF NOT EXISTS roles (
|
||||
id SERIAL PRIMARY KEY,
|
||||
name TEXT NOT NULL UNIQUE,
|
||||
description TEXT,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Create permissions table
|
||||
CREATE TABLE IF NOT EXISTS permissions (
|
||||
id SERIAL PRIMARY KEY,
|
||||
name TEXT NOT NULL UNIQUE,
|
||||
resource TEXT NOT NULL,
|
||||
action TEXT NOT NULL,
|
||||
description TEXT,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Create role_permissions junction table
|
||||
CREATE TABLE IF NOT EXISTS role_permissions (
|
||||
role_id INTEGER NOT NULL REFERENCES roles(id) ON DELETE CASCADE,
|
||||
permission_id INTEGER NOT NULL REFERENCES permissions(id) ON DELETE CASCADE,
|
||||
PRIMARY KEY (role_id, permission_id)
|
||||
);
|
||||
|
||||
-- Create indexes
|
||||
CREATE INDEX IF NOT EXISTS idx_role_permissions_role_id ON role_permissions(role_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_role_permissions_permission_id ON role_permissions(permission_id);
|
||||
|
||||
-- +goose Down
|
||||
-- Drop role_permissions, permissions, and roles tables
|
||||
DROP TABLE IF EXISTS role_permissions CASCADE;
|
||||
DROP TABLE IF EXISTS permissions CASCADE;
|
||||
DROP TABLE IF EXISTS roles CASCADE;
|
||||
@@ -0,0 +1,40 @@
|
||||
-- +goose Up
|
||||
-- Create auth_sessions table
|
||||
CREATE TABLE IF NOT EXISTS auth_sessions (
|
||||
id TEXT PRIMARY KEY,
|
||||
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
token TEXT NOT NULL,
|
||||
refresh_token TEXT NOT NULL,
|
||||
expires_at TIMESTAMPTZ NOT NULL,
|
||||
ip_address TEXT,
|
||||
user_agent TEXT,
|
||||
is_active BOOLEAN NOT NULL DEFAULT true,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Create api_keys table
|
||||
CREATE TABLE IF NOT EXISTS api_keys (
|
||||
id SERIAL PRIMARY KEY,
|
||||
name TEXT NOT NULL,
|
||||
key TEXT NOT NULL UNIQUE,
|
||||
secret TEXT NOT NULL,
|
||||
permissions JSONB,
|
||||
is_active BOOLEAN NOT NULL DEFAULT true,
|
||||
expires_at TIMESTAMPTZ,
|
||||
last_used TIMESTAMPTZ,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Create indexes
|
||||
CREATE INDEX IF NOT EXISTS idx_auth_sessions_user_id ON auth_sessions(user_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_auth_sessions_token ON auth_sessions(token);
|
||||
CREATE INDEX IF NOT EXISTS idx_auth_sessions_expires_at ON auth_sessions(expires_at);
|
||||
CREATE INDEX IF NOT EXISTS idx_api_keys_key ON api_keys(key);
|
||||
CREATE INDEX IF NOT EXISTS idx_api_keys_is_active ON api_keys(is_active);
|
||||
|
||||
-- +goose Down
|
||||
-- Drop auth_sessions and api_keys tables
|
||||
DROP TABLE IF EXISTS auth_sessions CASCADE;
|
||||
DROP TABLE IF EXISTS api_keys CASCADE;
|
||||
@@ -0,0 +1,30 @@
|
||||
-- +goose Up
|
||||
-- Create plugins table
|
||||
CREATE TABLE IF NOT EXISTS plugins (
|
||||
id SERIAL PRIMARY KEY,
|
||||
name TEXT NOT NULL UNIQUE,
|
||||
version TEXT NOT NULL,
|
||||
description TEXT,
|
||||
author TEXT,
|
||||
type TEXT,
|
||||
category TEXT,
|
||||
license TEXT,
|
||||
homepage TEXT,
|
||||
repository TEXT,
|
||||
enabled BOOLEAN NOT NULL DEFAULT false,
|
||||
status TEXT NOT NULL DEFAULT 'installed',
|
||||
config JSONB,
|
||||
installed_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
deleted_at TIMESTAMPTZ
|
||||
);
|
||||
|
||||
-- Create indexes
|
||||
CREATE INDEX IF NOT EXISTS idx_plugins_name ON plugins(name);
|
||||
CREATE INDEX IF NOT EXISTS idx_plugins_enabled ON plugins(enabled);
|
||||
CREATE INDEX IF NOT EXISTS idx_plugins_deleted_at ON plugins(deleted_at);
|
||||
|
||||
-- +goose Down
|
||||
-- Drop plugins table
|
||||
DROP TABLE IF EXISTS plugins CASCADE;
|
||||
@@ -0,0 +1,46 @@
|
||||
-- +goose Up
|
||||
-- Create automations table
|
||||
CREATE TABLE IF NOT EXISTS automations (
|
||||
id SERIAL PRIMARY KEY,
|
||||
name TEXT NOT NULL UNIQUE,
|
||||
description TEXT,
|
||||
type TEXT,
|
||||
enabled BOOLEAN NOT NULL DEFAULT true,
|
||||
schedule_type TEXT,
|
||||
schedule_cron TEXT,
|
||||
schedule_interval_sec INTEGER,
|
||||
timezone TEXT NOT NULL DEFAULT 'UTC',
|
||||
definition JSONB,
|
||||
last_run_at TIMESTAMPTZ,
|
||||
next_run_at TIMESTAMPTZ,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
deleted_at TIMESTAMPTZ
|
||||
);
|
||||
|
||||
-- Create automation_runs table
|
||||
CREATE TABLE IF NOT EXISTS automation_runs (
|
||||
id SERIAL PRIMARY KEY,
|
||||
automation_id INTEGER NOT NULL REFERENCES automations(id) ON DELETE CASCADE,
|
||||
status TEXT NOT NULL,
|
||||
started_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
ended_at TIMESTAMPTZ,
|
||||
duration_ms BIGINT NOT NULL DEFAULT 0,
|
||||
output TEXT,
|
||||
error TEXT,
|
||||
details JSONB,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Create indexes
|
||||
CREATE INDEX IF NOT EXISTS idx_automations_name ON automations(name);
|
||||
CREATE INDEX IF NOT EXISTS idx_automations_enabled ON automations(enabled);
|
||||
CREATE INDEX IF NOT EXISTS idx_automations_deleted_at ON automations(deleted_at);
|
||||
CREATE INDEX IF NOT EXISTS idx_automation_runs_automation_id ON automation_runs(automation_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_automation_runs_status ON automation_runs(status);
|
||||
CREATE INDEX IF NOT EXISTS idx_automation_runs_started_at ON automation_runs(started_at);
|
||||
|
||||
-- +goose Down
|
||||
-- Drop automation_runs and automations tables
|
||||
DROP TABLE IF EXISTS automation_runs CASCADE;
|
||||
DROP TABLE IF EXISTS automations CASCADE;
|
||||
@@ -0,0 +1,23 @@
|
||||
-- +goose Up
|
||||
-- Create config_entries table
|
||||
CREATE TABLE IF NOT EXISTS config_entries (
|
||||
id SERIAL PRIMARY KEY,
|
||||
section TEXT NOT NULL,
|
||||
key TEXT NOT NULL,
|
||||
value TEXT,
|
||||
type TEXT,
|
||||
sensitive BOOLEAN NOT NULL DEFAULT false,
|
||||
description TEXT,
|
||||
updated_by TEXT,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
UNIQUE(section, key)
|
||||
);
|
||||
|
||||
-- Create indexes
|
||||
CREATE INDEX IF NOT EXISTS idx_config_entries_section ON config_entries(section);
|
||||
CREATE INDEX IF NOT EXISTS idx_config_entries_key ON config_entries(key);
|
||||
|
||||
-- +goose Down
|
||||
-- Drop config_entries table
|
||||
DROP TABLE IF EXISTS config_entries CASCADE;
|
||||
@@ -0,0 +1,28 @@
|
||||
-- +goose Up
|
||||
-- Create deployment_records table
|
||||
CREATE TABLE IF NOT EXISTS deployment_records (
|
||||
id SERIAL PRIMARY KEY,
|
||||
service TEXT NOT NULL,
|
||||
version TEXT NOT NULL,
|
||||
environment TEXT,
|
||||
status TEXT NOT NULL,
|
||||
strategy TEXT,
|
||||
replicas INTEGER NOT NULL DEFAULT 1,
|
||||
triggered_by TEXT,
|
||||
reason TEXT,
|
||||
started_at TIMESTAMPTZ,
|
||||
completed_at TIMESTAMPTZ,
|
||||
rollback_to TEXT,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Create indexes
|
||||
CREATE INDEX IF NOT EXISTS idx_deployment_records_service ON deployment_records(service);
|
||||
CREATE INDEX IF NOT EXISTS idx_deployment_records_environment ON deployment_records(environment);
|
||||
CREATE INDEX IF NOT EXISTS idx_deployment_records_status ON deployment_records(status);
|
||||
CREATE INDEX IF NOT EXISTS idx_deployment_records_created_at ON deployment_records(created_at);
|
||||
|
||||
-- +goose Down
|
||||
-- Drop deployment_records table
|
||||
DROP TABLE IF EXISTS deployment_records CASCADE;
|
||||
@@ -0,0 +1,28 @@
|
||||
-- +goose Up
|
||||
-- Create chaos_experiment_records table
|
||||
CREATE TABLE IF NOT EXISTS chaos_experiment_records (
|
||||
id SERIAL PRIMARY KEY,
|
||||
external_id TEXT UNIQUE,
|
||||
name TEXT,
|
||||
type TEXT,
|
||||
target TEXT,
|
||||
status TEXT,
|
||||
duration_ms BIGINT NOT NULL DEFAULT 0,
|
||||
probability DOUBLE PRECISION,
|
||||
amount INTEGER NOT NULL DEFAULT 0,
|
||||
started_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
finished_at TIMESTAMPTZ,
|
||||
error TEXT,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Create indexes
|
||||
CREATE INDEX IF NOT EXISTS idx_chaos_experiment_records_external_id ON chaos_experiment_records(external_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_chaos_experiment_records_status ON chaos_experiment_records(status);
|
||||
CREATE INDEX IF NOT EXISTS idx_chaos_experiment_records_target ON chaos_experiment_records(target);
|
||||
CREATE INDEX IF NOT EXISTS idx_chaos_experiment_records_started_at ON chaos_experiment_records(started_at);
|
||||
|
||||
-- +goose Down
|
||||
-- Drop chaos_experiment_records table
|
||||
DROP TABLE IF EXISTS chaos_experiment_records CASCADE;
|
||||
@@ -0,0 +1,14 @@
|
||||
-- +goose Up
|
||||
-- Create imsi_allocations table
|
||||
CREATE TABLE IF NOT EXISTS imsi_allocations (
|
||||
id SERIAL PRIMARY KEY,
|
||||
last_imsi BIGINT NOT NULL DEFAULT 0,
|
||||
min_imsi BIGINT NOT NULL DEFAULT 1,
|
||||
max_imsi BIGINT NOT NULL DEFAULT 999999999,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- +goose Down
|
||||
-- Drop imsi_allocations table
|
||||
DROP TABLE IF EXISTS imsi_allocations CASCADE;
|
||||
@@ -0,0 +1,23 @@
|
||||
-- +goose Up
|
||||
-- Create payment_methods table
|
||||
CREATE TABLE IF NOT EXISTS payment_methods (
|
||||
id TEXT PRIMARY KEY,
|
||||
subscriber_id INTEGER NOT NULL,
|
||||
gateway_id TEXT,
|
||||
type TEXT NOT NULL,
|
||||
customer_id TEXT,
|
||||
last4 TEXT,
|
||||
brand TEXT,
|
||||
expiry_month INTEGER,
|
||||
expiry_year INTEGER,
|
||||
is_default BOOLEAN NOT NULL DEFAULT false,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Create indexes
|
||||
CREATE INDEX IF NOT EXISTS idx_payment_methods_subscriber_id ON payment_methods(subscriber_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_payment_methods_gateway_id ON payment_methods(gateway_id);
|
||||
|
||||
-- +goose Down
|
||||
-- Drop payment_methods table
|
||||
DROP TABLE IF EXISTS payment_methods CASCADE;
|
||||
@@ -0,0 +1,25 @@
|
||||
-- +goose Up
|
||||
-- Create transactions table
|
||||
CREATE TABLE IF NOT EXISTS transactions (
|
||||
id SERIAL PRIMARY KEY,
|
||||
subscriber_id INTEGER NOT NULL,
|
||||
transaction_id TEXT NOT NULL,
|
||||
type TEXT NOT NULL,
|
||||
amount DOUBLE PRECISION NOT NULL,
|
||||
currency TEXT NOT NULL,
|
||||
status TEXT NOT NULL,
|
||||
description TEXT,
|
||||
parent_id INTEGER,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Create indexes
|
||||
CREATE INDEX IF NOT EXISTS idx_transactions_subscriber_id ON transactions(subscriber_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_transactions_transaction_id ON transactions(transaction_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_transactions_status ON transactions(status);
|
||||
CREATE INDEX IF NOT EXISTS idx_transactions_created_at ON transactions(created_at);
|
||||
|
||||
-- +goose Down
|
||||
-- Drop transactions table
|
||||
DROP TABLE IF EXISTS transactions CASCADE;
|
||||
@@ -0,0 +1,35 @@
|
||||
-- +goose Up
|
||||
-- Create notifications table
|
||||
CREATE TABLE IF NOT EXISTS notifications (
|
||||
id SERIAL PRIMARY KEY,
|
||||
subscriber_id INTEGER NOT NULL,
|
||||
type TEXT NOT NULL,
|
||||
title TEXT NOT NULL,
|
||||
message TEXT NOT NULL,
|
||||
read BOOLEAN NOT NULL DEFAULT false,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Create alerts table
|
||||
CREATE TABLE IF NOT EXISTS alerts (
|
||||
id SERIAL PRIMARY KEY,
|
||||
type TEXT NOT NULL,
|
||||
severity TEXT NOT NULL,
|
||||
message TEXT NOT NULL,
|
||||
subscriber_id INTEGER,
|
||||
timestamp TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
resolved BOOLEAN NOT NULL DEFAULT false
|
||||
);
|
||||
|
||||
-- Create indexes
|
||||
CREATE INDEX IF NOT EXISTS idx_notifications_subscriber_id ON notifications(subscriber_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_notifications_read ON notifications(read);
|
||||
CREATE INDEX IF NOT EXISTS idx_alerts_subscriber_id ON alerts(subscriber_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_alerts_type ON alerts(type);
|
||||
CREATE INDEX IF NOT EXISTS idx_alerts_severity ON alerts(severity);
|
||||
CREATE INDEX IF NOT EXISTS idx_alerts_resolved ON alerts(resolved);
|
||||
|
||||
-- +goose Down
|
||||
-- Drop notifications and alerts tables
|
||||
DROP TABLE IF EXISTS notifications CASCADE;
|
||||
DROP TABLE IF EXISTS alerts CASCADE;
|
||||
Reference in New Issue
Block a user