feature: add MIEM employees parser service with admin UI and MCP

This commit is contained in:
Anton
2026-04-28 16:20:51 +03:00
parent 6480f31e8f
commit d512580960
29 changed files with 1883 additions and 0 deletions

74
migrations/001_init.sql Normal file
View File

@@ -0,0 +1,74 @@
CREATE TABLE IF NOT EXISTS parser_sources (
id SERIAL PRIMARY KEY,
source_url TEXT NOT NULL UNIQUE,
enabled BOOLEAN NOT NULL DEFAULT TRUE,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE TABLE IF NOT EXISTS crawl_runs (
id SERIAL PRIMARY KEY,
source_url TEXT NOT NULL,
status VARCHAR(32) NOT NULL DEFAULT 'running',
started_at TIMESTAMPTZ NOT NULL DEFAULT now(),
finished_at TIMESTAMPTZ,
found_count INTEGER NOT NULL DEFAULT 0,
parsed_count INTEGER NOT NULL DEFAULT 0,
error_count INTEGER NOT NULL DEFAULT 0,
dismissed_count INTEGER NOT NULL DEFAULT 0,
message TEXT
);
CREATE TABLE IF NOT EXISTS employees (
id SERIAL PRIMARY KEY,
profile_key VARCHAR(255) NOT NULL UNIQUE,
profile_type VARCHAR(50),
profile_id VARCHAR(255),
canonical_url TEXT NOT NULL,
full_name TEXT,
status VARCHAR(32) NOT NULL DEFAULT 'active',
first_seen_at TIMESTAMPTZ NOT NULL DEFAULT now(),
last_seen_at TIMESTAMPTZ NOT NULL DEFAULT now(),
dismissed_at TIMESTAMPTZ,
parser_version VARCHAR(32),
current_data JSONB,
current_checksum VARCHAR(64),
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX IF NOT EXISTS ix_employees_full_name ON employees (full_name);
CREATE INDEX IF NOT EXISTS ix_employees_status ON employees (status);
CREATE TABLE IF NOT EXISTS employee_snapshots (
id SERIAL PRIMARY KEY,
employee_id INTEGER NOT NULL REFERENCES employees(id),
crawl_run_id INTEGER REFERENCES crawl_runs(id),
parsed_data JSONB NOT NULL,
html_snapshot BYTEA,
checksum VARCHAR(64) NOT NULL,
parser_version VARCHAR(32),
captured_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX IF NOT EXISTS ix_employee_snapshots_employee_id ON employee_snapshots (employee_id);
CREATE TABLE IF NOT EXISTS crawl_errors (
id SERIAL PRIMARY KEY,
crawl_run_id INTEGER NOT NULL REFERENCES crawl_runs(id),
profile_url TEXT,
error_type VARCHAR(255) NOT NULL,
message TEXT NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX IF NOT EXISTS ix_crawl_errors_run_id ON crawl_errors (crawl_run_id);
CREATE TABLE IF NOT EXISTS profile_tabs (
id SERIAL PRIMARY KEY,
employee_id INTEGER NOT NULL REFERENCES employees(id),
title TEXT NOT NULL,
href TEXT NOT NULL,
data_index VARCHAR(64)
);
CREATE INDEX IF NOT EXISTS ix_profile_tabs_employee_id ON profile_tabs (employee_id);