← back to Open Seo

drizzle/0000_fantastic_vanisher.sql

146 lines

CREATE TABLE `audit_pages` (
	`id` text PRIMARY KEY NOT NULL,
	`audit_id` text NOT NULL,
	`url` text NOT NULL,
	`status_code` integer,
	`redirect_url` text,
	`title` text,
	`meta_description` text,
	`canonical_url` text,
	`robots_meta` text,
	`og_title` text,
	`og_description` text,
	`og_image` text,
	`h1_count` integer DEFAULT 0 NOT NULL,
	`h2_count` integer DEFAULT 0 NOT NULL,
	`h3_count` integer DEFAULT 0 NOT NULL,
	`h4_count` integer DEFAULT 0 NOT NULL,
	`h5_count` integer DEFAULT 0 NOT NULL,
	`h6_count` integer DEFAULT 0 NOT NULL,
	`heading_order_json` text,
	`word_count` integer DEFAULT 0 NOT NULL,
	`images_total` integer DEFAULT 0 NOT NULL,
	`images_missing_alt` integer DEFAULT 0 NOT NULL,
	`images_json` text,
	`internal_link_count` integer DEFAULT 0 NOT NULL,
	`external_link_count` integer DEFAULT 0 NOT NULL,
	`has_structured_data` integer DEFAULT false NOT NULL,
	`hreflang_tags_json` text,
	`is_indexable` integer DEFAULT true NOT NULL,
	`response_time_ms` integer,
	FOREIGN KEY (`audit_id`) REFERENCES `audits`(`id`) ON UPDATE no action ON DELETE cascade
);
--> statement-breakpoint
CREATE INDEX `audit_pages_audit_id_idx` ON `audit_pages` (`audit_id`);--> statement-breakpoint
CREATE TABLE `audit_psi_results` (
	`id` text PRIMARY KEY NOT NULL,
	`audit_id` text NOT NULL,
	`page_id` text NOT NULL,
	`strategy` text NOT NULL,
	`performance_score` integer,
	`accessibility_score` integer,
	`best_practices_score` integer,
	`seo_score` integer,
	`lcp_ms` real,
	`cls` real,
	`inp_ms` real,
	`ttfb_ms` real,
	`error_message` text,
	`r2_key` text,
	`payload_size_bytes` integer,
	FOREIGN KEY (`audit_id`) REFERENCES `audits`(`id`) ON UPDATE no action ON DELETE cascade,
	FOREIGN KEY (`page_id`) REFERENCES `audit_pages`(`id`) ON UPDATE no action ON DELETE cascade
);
--> statement-breakpoint
CREATE INDEX `audit_psi_results_audit_id_idx` ON `audit_psi_results` (`audit_id`);--> statement-breakpoint
CREATE TABLE `audits` (
	`id` text PRIMARY KEY NOT NULL,
	`project_id` text NOT NULL,
	`user_id` text NOT NULL,
	`start_url` text NOT NULL,
	`status` text DEFAULT 'running' NOT NULL,
	`workflow_instance_id` text,
	`config` text DEFAULT '{}' NOT NULL,
	`pages_crawled` integer DEFAULT 0 NOT NULL,
	`pages_total` integer DEFAULT 0 NOT NULL,
	`psi_total` integer DEFAULT 0 NOT NULL,
	`psi_completed` integer DEFAULT 0 NOT NULL,
	`psi_failed` integer DEFAULT 0 NOT NULL,
	`current_phase` text DEFAULT 'discovery',
	`started_at` text DEFAULT (current_timestamp) NOT NULL,
	`completed_at` text,
	FOREIGN KEY (`project_id`) REFERENCES `projects`(`id`) ON UPDATE no action ON DELETE cascade,
	FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE cascade
);
--> statement-breakpoint
CREATE INDEX `audits_project_id_idx` ON `audits` (`project_id`);--> statement-breakpoint
CREATE INDEX `audits_user_id_idx` ON `audits` (`user_id`);--> statement-breakpoint
CREATE TABLE `keyword_metrics` (
	`id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
	`keyword` text NOT NULL,
	`location_code` integer NOT NULL,
	`language_code` text DEFAULT 'en' NOT NULL,
	`search_volume` integer,
	`cpc` real,
	`competition` real,
	`keyword_difficulty` integer,
	`intent` text,
	`monthly_searches` text,
	`fetched_at` text DEFAULT (current_timestamp) NOT NULL
);
--> statement-breakpoint
CREATE TABLE `projects` (
	`id` text PRIMARY KEY NOT NULL,
	`user_id` text NOT NULL,
	`name` text NOT NULL,
	`domain` text,
	`pagespeed_api_key` text,
	`created_at` text DEFAULT (current_timestamp) NOT NULL,
	FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE cascade
);
--> statement-breakpoint
CREATE TABLE `psi_audit_results` (
	`id` text PRIMARY KEY NOT NULL,
	`project_id` text NOT NULL,
	`requested_url` text NOT NULL,
	`final_url` text NOT NULL,
	`strategy` text NOT NULL,
	`status` text DEFAULT 'completed' NOT NULL,
	`performance_score` integer,
	`accessibility_score` integer,
	`best_practices_score` integer,
	`seo_score` integer,
	`first_contentful_paint` text,
	`largest_contentful_paint` text,
	`total_blocking_time` text,
	`cumulative_layout_shift` text,
	`speed_index` text,
	`time_to_interactive` text,
	`lighthouse_version` text,
	`error_message` text,
	`r2_key` text,
	`payload_size_bytes` integer,
	`created_at` text DEFAULT (current_timestamp) NOT NULL,
	FOREIGN KEY (`project_id`) REFERENCES `projects`(`id`) ON UPDATE no action ON DELETE cascade
);
--> statement-breakpoint
CREATE INDEX `psi_audit_results_project_created_idx` ON `psi_audit_results` (`project_id`,`created_at`);--> statement-breakpoint
CREATE INDEX `psi_audit_results_project_strategy_idx` ON `psi_audit_results` (`project_id`,`strategy`);--> statement-breakpoint
CREATE TABLE `saved_keywords` (
	`id` text PRIMARY KEY NOT NULL,
	`project_id` text NOT NULL,
	`keyword` text NOT NULL,
	`location_code` integer DEFAULT 2840 NOT NULL,
	`language_code` text DEFAULT 'en' NOT NULL,
	`created_at` text DEFAULT (current_timestamp) NOT NULL,
	FOREIGN KEY (`project_id`) REFERENCES `projects`(`id`) ON UPDATE no action ON DELETE cascade
);
--> statement-breakpoint
CREATE UNIQUE INDEX `saved_keywords_unique_project_keyword_location` ON `saved_keywords` (`project_id`,`keyword`,`location_code`);--> statement-breakpoint
CREATE TABLE `users` (
	`id` text PRIMARY KEY NOT NULL,
	`email` text NOT NULL,
	`created_at` text DEFAULT (current_timestamp) NOT NULL
);
--> statement-breakpoint
CREATE UNIQUE INDEX `users_email_unique` ON `users` (`email`);