mirror of
https://github.com/hanzoai/cloud-backend.git
synced 2026-10-30 18:44:52 +00:00
- Rust-based backend for paid tier inference - PostgreSQL + Redis for data persistence - JWT auth with hanzo.id integration - Stripe billing integration - GRPO/Zoo-Gym for training-free optimization - DigitalOcean App Platform deployment config
85 lines
2.8 KiB
PL/PgSQL
85 lines
2.8 KiB
PL/PgSQL
-- Initial schema for Hanzo Cloud Backend
|
|
|
|
-- Users table
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id UUID PRIMARY KEY,
|
|
email VARCHAR(255) UNIQUE NOT NULL,
|
|
password_hash VARCHAR(255) NOT NULL,
|
|
name VARCHAR(255),
|
|
credits BIGINT DEFAULT 1000,
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE INDEX idx_users_email ON users(email);
|
|
|
|
-- Usage records table
|
|
CREATE TABLE IF NOT EXISTS usage_records (
|
|
id UUID PRIMARY KEY,
|
|
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
model VARCHAR(100) NOT NULL,
|
|
prompt_tokens INTEGER NOT NULL,
|
|
completion_tokens INTEGER NOT NULL,
|
|
total_tokens INTEGER NOT NULL,
|
|
cost_credits BIGINT NOT NULL,
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE INDEX idx_usage_user_id ON usage_records(user_id);
|
|
CREATE INDEX idx_usage_created_at ON usage_records(created_at);
|
|
CREATE INDEX idx_usage_model ON usage_records(model);
|
|
|
|
-- API keys table (for machine-to-machine access)
|
|
CREATE TABLE IF NOT EXISTS api_keys (
|
|
id UUID PRIMARY KEY,
|
|
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
key_hash VARCHAR(255) NOT NULL,
|
|
name VARCHAR(255),
|
|
last_used_at TIMESTAMP WITH TIME ZONE,
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
|
expires_at TIMESTAMP WITH TIME ZONE
|
|
);
|
|
|
|
CREATE INDEX idx_api_keys_user_id ON api_keys(user_id);
|
|
CREATE INDEX idx_api_keys_key_hash ON api_keys(key_hash);
|
|
|
|
-- Stripe customers table (for billing integration)
|
|
CREATE TABLE IF NOT EXISTS stripe_customers (
|
|
id UUID PRIMARY KEY,
|
|
user_id UUID NOT NULL UNIQUE REFERENCES users(id) ON DELETE CASCADE,
|
|
stripe_customer_id VARCHAR(255) UNIQUE NOT NULL,
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE INDEX idx_stripe_customers_user_id ON stripe_customers(user_id);
|
|
CREATE INDEX idx_stripe_customers_stripe_id ON stripe_customers(stripe_customer_id);
|
|
|
|
-- Payment transactions table
|
|
CREATE TABLE IF NOT EXISTS transactions (
|
|
id UUID PRIMARY KEY,
|
|
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
stripe_payment_intent_id VARCHAR(255),
|
|
amount_cents INTEGER NOT NULL,
|
|
credits_purchased BIGINT NOT NULL,
|
|
status VARCHAR(50) NOT NULL,
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE INDEX idx_transactions_user_id ON transactions(user_id);
|
|
CREATE INDEX idx_transactions_status ON transactions(status);
|
|
|
|
-- Function to update updated_at timestamp
|
|
CREATE OR REPLACE FUNCTION update_updated_at_column()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
NEW.updated_at = CURRENT_TIMESTAMP;
|
|
RETURN NEW;
|
|
END;
|
|
$$ language 'plpgsql';
|
|
|
|
-- Trigger for users table
|
|
CREATE TRIGGER update_users_updated_at
|
|
BEFORE UPDATE ON users
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION update_updated_at_column();
|