CREATE TABLE moderation_log ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), moderator_id UUID NOT NULL REFERENCES users(id), target_type VARCHAR(20) NOT NULL CHECK (target_type IN ('place', 'service')), target_id UUID NOT NULL, action VARCHAR(20) NOT NULL CHECK (action IN ('approve', 'reject', 'request_changes', 'publish', 'archive')), comment TEXT, created_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX idx_moderation_log_target ON moderation_log(target_type, target_id); CREATE INDEX idx_moderation_log_moderator_id ON moderation_log(moderator_id); CREATE TABLE payments ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), user_id UUID NOT NULL REFERENCES users(id), type VARCHAR(20) NOT NULL CHECK (type IN ('subscription', 'donation', 'listing_fee', 'booking_commission')), provider VARCHAR(20) NOT NULL CHECK (provider IN ('cloudpayments', 'stripe')), provider_payment_id VARCHAR(255), amount INT NOT NULL, currency VARCHAR(3) DEFAULT 'RUB', status VARCHAR(20) NOT NULL CHECK (status IN ('pending', 'succeeded', 'failed', 'refunded')), metadata JSONB, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX idx_payments_user_id ON payments(user_id); CREATE INDEX idx_payments_status ON payments(status); CREATE INDEX idx_payments_provider_id ON payments(provider, provider_payment_id); CREATE TABLE subscriptions ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), user_id UUID NOT NULL REFERENCES users(id), plan VARCHAR(50) NOT NULL CHECK (plan IN ('studio_listing', 'executor_promo', 'premium_user')), status VARCHAR(20) NOT NULL CHECK (status IN ('active', 'cancelled', 'expired')), current_period_start TIMESTAMPTZ, current_period_end TIMESTAMPTZ, provider_subscription_id VARCHAR(255), created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE TABLE visitor_sessions ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), user_id UUID REFERENCES users(id), coordinates GEOGRAPHY(Point, 4326) NOT NULL, last_active_at TIMESTAMPTZ NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX idx_visitor_sessions_coordinates ON visitor_sessions USING GIST (coordinates); CREATE INDEX idx_visitor_sessions_last_active ON visitor_sessions(last_active_at);