73 lines
2.2 KiB
PL/PgSQL
73 lines
2.2 KiB
PL/PgSQL
-- Migration: 011_create_auth_tables.sql
|
|
-- Auth system for DAARION.city
|
|
|
|
-- Users table
|
|
CREATE TABLE IF NOT EXISTS auth_users (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
email TEXT UNIQUE NOT NULL,
|
|
password_hash TEXT NOT NULL,
|
|
display_name TEXT,
|
|
avatar_url TEXT,
|
|
is_active BOOLEAN NOT NULL DEFAULT TRUE,
|
|
is_admin BOOLEAN NOT NULL DEFAULT FALSE,
|
|
locale TEXT DEFAULT 'uk',
|
|
timezone TEXT DEFAULT 'Europe/Kyiv',
|
|
meta JSONB DEFAULT '{}'::jsonb,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS ix_auth_users_email ON auth_users(email);
|
|
|
|
-- Roles table
|
|
CREATE TABLE IF NOT EXISTS auth_roles (
|
|
id TEXT PRIMARY KEY,
|
|
description TEXT
|
|
);
|
|
|
|
-- Default roles
|
|
INSERT INTO auth_roles (id, description) VALUES
|
|
('user', 'Regular user'),
|
|
('admin', 'Administrator'),
|
|
('agent-system', 'System agent')
|
|
ON CONFLICT (id) DO NOTHING;
|
|
|
|
-- User-Role mapping
|
|
CREATE TABLE IF NOT EXISTS auth_user_roles (
|
|
user_id UUID NOT NULL REFERENCES auth_users(id) ON DELETE CASCADE,
|
|
role_id TEXT NOT NULL REFERENCES auth_roles(id) ON DELETE CASCADE,
|
|
PRIMARY KEY (user_id, role_id)
|
|
);
|
|
|
|
-- Sessions table for refresh tokens
|
|
CREATE TABLE IF NOT EXISTS auth_sessions (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
user_id UUID NOT NULL REFERENCES auth_users(id) ON DELETE CASCADE,
|
|
user_agent TEXT,
|
|
ip_address INET,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
expires_at TIMESTAMPTZ NOT NULL,
|
|
revoked_at TIMESTAMPTZ,
|
|
meta JSONB DEFAULT '{}'::jsonb
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS ix_auth_sessions_user_id ON auth_sessions(user_id);
|
|
CREATE INDEX IF NOT EXISTS ix_auth_sessions_expires ON auth_sessions(expires_at);
|
|
|
|
-- Function to update updated_at timestamp
|
|
CREATE OR REPLACE FUNCTION update_auth_users_updated_at()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
NEW.updated_at = now();
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
-- Trigger for updated_at
|
|
DROP TRIGGER IF EXISTS trigger_auth_users_updated_at ON auth_users;
|
|
CREATE TRIGGER trigger_auth_users_updated_at
|
|
BEFORE UPDATE ON auth_users
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION update_auth_users_updated_at();
|
|
|