- Add AI plans, credits, model routing, LiteLLM client, and orchestrator services - Add AI management endpoints, auto-apply/auto-request handlers, and log endpoints - Add cron jobs for daily action reset and monthly credit reset - Add AI credit purchase flow in payments service - Add ai_credit_packages migration with seed data - Update Dockerfile build tooling across services
166 lines
7.6 KiB
SQL
166 lines
7.6 KiB
SQL
CREATE TABLE ai_plans (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
code VARCHAR(50) UNIQUE NOT NULL,
|
|
name VARCHAR(100) NOT NULL,
|
|
monthly_credits INT NOT NULL,
|
|
daily_action_limit INT NOT NULL,
|
|
allowed_models JSONB NOT NULL,
|
|
allowed_features JSONB NOT NULL,
|
|
is_active BOOLEAN NOT NULL DEFAULT TRUE,
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE TABLE user_ai_subscriptions (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
user_id UUID UNIQUE NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
plan_id UUID NOT NULL REFERENCES ai_plans(id),
|
|
role_code VARCHAR(50),
|
|
monthly_credits_total INT NOT NULL,
|
|
monthly_credits_used INT NOT NULL DEFAULT 0,
|
|
purchased_credits_total INT NOT NULL DEFAULT 0,
|
|
purchased_credits_used INT NOT NULL DEFAULT 0,
|
|
daily_actions_used INT NOT NULL DEFAULT 0,
|
|
current_period_start TIMESTAMP NOT NULL,
|
|
current_period_end TIMESTAMP NOT NULL,
|
|
status VARCHAR(30) NOT NULL DEFAULT 'active',
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE TABLE ai_feature_costs (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
feature_code VARCHAR(100) UNIQUE NOT NULL,
|
|
display_name VARCHAR(150) NOT NULL,
|
|
default_model VARCHAR(100) NOT NULL,
|
|
credit_cost INT NOT NULL,
|
|
max_input_tokens INT,
|
|
max_output_tokens INT,
|
|
is_active BOOLEAN NOT NULL DEFAULT TRUE,
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE TABLE ai_usage_logs (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
user_id UUID NOT NULL REFERENCES users(id),
|
|
role_code VARCHAR(50),
|
|
feature_code VARCHAR(100) NOT NULL,
|
|
model_alias VARCHAR(100) NOT NULL,
|
|
credits_charged INT NOT NULL,
|
|
input_tokens INT,
|
|
output_tokens INT,
|
|
total_tokens INT,
|
|
status VARCHAR(30) NOT NULL,
|
|
request_id VARCHAR(100),
|
|
error_message TEXT,
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE TABLE ai_credit_transactions (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
user_id UUID NOT NULL REFERENCES users(id),
|
|
transaction_type VARCHAR(50) NOT NULL,
|
|
source VARCHAR(50) NOT NULL,
|
|
credits INT NOT NULL,
|
|
balance_after INT NOT NULL,
|
|
reference_id UUID,
|
|
description TEXT,
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE TABLE ai_auto_apply_settings (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
user_id UUID UNIQUE NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
is_enabled BOOLEAN NOT NULL DEFAULT FALSE,
|
|
preferred_titles JSONB,
|
|
preferred_locations JSONB,
|
|
preferred_job_types JSONB,
|
|
preferred_work_modes JSONB,
|
|
preferred_skills JSONB,
|
|
min_salary INT,
|
|
max_salary INT,
|
|
max_applications_per_day INT NOT NULL DEFAULT 3,
|
|
require_user_approval BOOLEAN NOT NULL DEFAULT TRUE,
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE TABLE ai_auto_apply_logs (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
user_id UUID NOT NULL REFERENCES users(id),
|
|
job_id UUID NOT NULL,
|
|
match_score INT,
|
|
status VARCHAR(50) NOT NULL,
|
|
credits_charged INT NOT NULL DEFAULT 0,
|
|
generated_cover_letter TEXT,
|
|
applied_at TIMESTAMP,
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE TABLE ai_auto_request_settings (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
user_id UUID UNIQUE NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
professional_role_code VARCHAR(50) NOT NULL,
|
|
is_enabled BOOLEAN NOT NULL DEFAULT FALSE,
|
|
preferred_categories JSONB,
|
|
preferred_locations JSONB,
|
|
preferred_requirement_types JSONB,
|
|
min_budget INT,
|
|
max_budget INT,
|
|
max_requests_per_day INT NOT NULL DEFAULT 3,
|
|
require_user_approval BOOLEAN NOT NULL DEFAULT TRUE,
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE TABLE ai_auto_request_logs (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
user_id UUID NOT NULL REFERENCES users(id),
|
|
requirement_id UUID NOT NULL,
|
|
professional_role_code VARCHAR(50) NOT NULL,
|
|
match_score INT,
|
|
status VARCHAR(50) NOT NULL,
|
|
credits_charged INT NOT NULL DEFAULT 0,
|
|
requested_at TIMESTAMP,
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE INDEX idx_user_ai_subscriptions_user_id ON user_ai_subscriptions(user_id);
|
|
CREATE INDEX idx_user_ai_subscriptions_plan_id ON user_ai_subscriptions(plan_id);
|
|
CREATE INDEX idx_ai_usage_logs_user_id ON ai_usage_logs(user_id);
|
|
CREATE INDEX idx_ai_usage_logs_feature_code ON ai_usage_logs(feature_code);
|
|
CREATE INDEX idx_ai_usage_logs_created_at ON ai_usage_logs(created_at);
|
|
CREATE INDEX idx_ai_credit_transactions_user_id ON ai_credit_transactions(user_id);
|
|
CREATE INDEX idx_ai_auto_apply_logs_user_id ON ai_auto_apply_logs(user_id);
|
|
CREATE INDEX idx_ai_auto_apply_logs_job_id ON ai_auto_apply_logs(job_id);
|
|
CREATE INDEX idx_ai_auto_request_logs_user_id ON ai_auto_request_logs(user_id);
|
|
CREATE INDEX idx_ai_auto_request_logs_requirement_id ON ai_auto_request_logs(requirement_id);
|
|
|
|
INSERT INTO ai_plans (code, name, monthly_credits, daily_action_limit, allowed_models, allowed_features) VALUES
|
|
('free', 'Free', 10, 3, '["askash-fast"]', '["help_answer", "platform_guidance", "form_fill", "form_validate", "jd_generate"]'),
|
|
('pro', 'Pro', 100, 15, '["askash-fast", "askash-main"]', '["help_answer", "platform_guidance", "form_fill", "form_validate", "job_match", "auto_apply_suggest", "auto_apply_execute", "cover_letter_generate", "requirement_match", "auto_request_suggest", "auto_request_execute"]'),
|
|
('business', 'Business', 300, 40, '["askash-fast", "askash-main"]', '["help_answer", "platform_guidance", "form_fill", "form_validate", "jd_generate", "jd_improve", "skills_extract", "candidate_match", "candidate_shortlist"]'),
|
|
('enterprise', 'Enterprise', 50000, 999999, '["askash-fast", "askash-main"]', '["help_answer", "platform_guidance", "form_fill", "form_validate", "jd_generate", "jd_improve", "skills_extract", "candidate_match", "candidate_shortlist", "job_match", "auto_apply_suggest", "auto_apply_execute", "cover_letter_generate", "requirement_match", "auto_request_suggest", "auto_request_execute", "admin_support_reply", "admin_ticket_summary", "admin_verification_summary", "abuse_check"]');
|
|
|
|
INSERT INTO ai_feature_costs (feature_code, display_name, default_model, credit_cost) VALUES
|
|
('help_answer', 'Help Answer', 'askash-fast', 1),
|
|
('platform_guidance', 'Platform Guidance', 'askash-fast', 1),
|
|
('form_fill', 'Form Fill', 'askash-fast', 2),
|
|
('form_validate', 'Form Validate', 'askash-fast', 1),
|
|
('jd_generate', 'Job Description Generate', 'askash-main', 5),
|
|
('jd_improve', 'Job Description Improve', 'askash-main', 4),
|
|
('skills_extract', 'Skills Extract', 'askash-fast', 1),
|
|
('candidate_match', 'Candidate Match', 'askash-fast', 1),
|
|
('candidate_shortlist', 'Candidate Shortlist', 'askash-fast', 2),
|
|
('job_match', 'Job Match', 'askash-fast', 1),
|
|
('auto_apply_suggest', 'Auto Apply Suggest', 'askash-fast', 2),
|
|
('auto_apply_execute', 'Auto Apply Execute', 'askash-main', 5),
|
|
('cover_letter_generate', 'Cover Letter Generate', 'askash-main', 5),
|
|
('requirement_match', 'Requirement Match', 'askash-fast', 1),
|
|
('auto_request_suggest', 'Auto Request Suggest', 'askash-fast', 2),
|
|
('auto_request_execute', 'Auto Request Execute', 'backend', 3),
|
|
('admin_support_reply', 'Admin Support Reply', 'askash-main', 3),
|
|
('admin_ticket_summary', 'Admin Ticket Summary', 'askash-fast', 1),
|
|
('admin_verification_summary', 'Admin Verification Summary', 'askash-fast', 1),
|
|
('abuse_check', 'Abuse Check', 'askash-fast', 1);
|