pdo = $connection->getPdo(); } /** * Seed all defaults. */ public function seed(): void { echo "Seeding roles and permissions...\n"; $this->seedRolesAndPermissions(); echo "Seeding default settings...\n"; $this->seedSettings(); echo "Seeding sample crawler sources...\n"; $this->seedSources(); echo "Seeding default administrator...\n"; $this->seedDefaultAdmin(); echo "Seeding completed successfully!\n"; } private function seedRolesAndPermissions(): void { // Insert Roles $roles = [ ['name' => 'Administrator', 'code' => 'admin', 'description' => 'Full administrative access to the platform.'], ['name' => 'Member', 'code' => 'member', 'description' => 'Access to CRM, Opportunities and Reports.'], ]; foreach ($roles as $role) { $stmt = $this->pdo->prepare("INSERT IGNORE INTO roles (name, code, description) VALUES (?, ?, ?)"); $stmt->execute([$role['name'], $role['code'], $role['description']]); } // Insert Permissions $permissions = [ ['name' => 'View Dashboard', 'code' => 'view_dashboard', 'description' => 'Access the admin dashboard metrics.'], ['name' => 'Manage CRM', 'code' => 'manage_crm', 'description' => 'Create/update contacts and log interactions.'], ['name' => 'View Opportunities', 'code' => 'view_opportunities', 'description' => 'Browse VCs, grants and accelerators.'], ['name' => 'Run Collectors', 'code' => 'run_collectors', 'description' => 'Manually trigger crawler collections.'], ['name' => 'Generate Reports', 'code' => 'generate_reports', 'description' => 'Trigger AI daily summaries.'], ['name' => 'Manage Settings', 'code' => 'manage_settings', 'description' => 'Update application parameters.'], ['name' => 'Manage Users', 'code' => 'manage_users', 'description' => 'Manage roles and accounts of users.'], ]; foreach ($permissions as $permission) { $stmt = $this->pdo->prepare("INSERT IGNORE INTO permissions (name, code, description) VALUES (?, ?, ?)"); $stmt->execute([$permission['name'], $permission['code'], $permission['description']]); } // Fetch Role IDs and Permission IDs $roleIds = $this->pdo->query("SELECT code, id FROM roles")->fetchAll(PDO::FETCH_KEY_PAIR); $permissionIds = $this->pdo->query("SELECT code, id FROM permissions")->fetchAll(PDO::FETCH_KEY_PAIR); // Map Permissions to Admin (All permissions) foreach ($permissionIds as $pId => $pCode) { $stmt = $this->pdo->prepare("INSERT IGNORE INTO role_permissions (role_id, permission_id) VALUES (?, ?)"); $stmt->execute([$roleIds['admin'], $pId]); } // Map Permissions to Member (Subset of permissions) $memberPermissions = ['view_dashboard', 'manage_crm', 'view_opportunities', 'generate_reports']; foreach ($permissionIds as $pId => $pCode) { if (in_array($pCode, $memberPermissions)) { $stmt = $this->pdo->prepare("INSERT IGNORE INTO role_permissions (role_id, permission_id) VALUES (?, ?)"); $stmt->execute([$roleIds['member'], $pId]); } } } private function seedSettings(): void { $settings = [ ['key' => 'system_email', 'value' => 'info@scoutiq.intaleqapp.com', 'description' => 'Primary sender email address.'], ['key' => 'crawler_enabled', 'value' => 'true', 'description' => 'Global toggle for data collection crawlers.'], ['key' => 'crawler_interval_hours', 'value' => '24', 'description' => 'Delay between crawler runs.'], ['key' => 'crawler_max_new_per_feed', 'value' => '5', 'description' => 'Maximum new opportunities to process per feed in a single run.'], ['key' => 'crawler_max_new_total', 'value' => '100', 'description' => 'Maximum total new opportunities to process in a single collector run.'], ['key' => 'telegram_min_score', 'value' => '75', 'description' => 'Minimum opportunity score to trigger Telegram notifications.'], ]; foreach ($settings as $setting) { $stmt = $this->pdo->prepare("INSERT IGNORE INTO settings (`key`, value, description) VALUES (?, ?, ?)"); $stmt->execute([$setting['key'], $setting['value'], $setting['description']]); } } private function seedSources(): void { $sources = [ ['name' => 'TechCrunch Mobility Feed', 'url' => 'https://techcrunch.com/category/transportation/feed/', 'type' => 'rss'], ['name' => 'VentureBeat AI Feed', 'url' => 'https://venturebeat.com/category/ai/feed/', 'type' => 'rss'], ['name' => 'YC Directory API', 'url' => 'https://api.ycombinator.com/v1/companies', 'type' => 'api'], ]; foreach ($sources as $source) { $stmt = $this->pdo->prepare("SELECT id FROM sources WHERE url = ?"); $stmt->execute([$source['url']]); if (!$stmt->fetch()) { $stmt = $this->pdo->prepare("INSERT INTO sources (name, url, type, status) VALUES (?, ?, ?, 'active')"); $stmt->execute([$source['name'], $source['url'], $source['type']]); $sourceId = (int)$this->pdo->lastInsertId(); $category = str_contains($source['name'], 'Mobility') ? 'mobility' : 'ai'; $stmt = $this->pdo->prepare("INSERT INTO source_categories (source_id, category) VALUES (?, ?)"); $stmt->execute([$sourceId, $category]); } } } private function seedDefaultAdmin(): void { $email = 'admin@scoutiq.com'; $stmt = $this->pdo->prepare("SELECT id FROM users WHERE email = ?"); $stmt->execute([$email]); if (!$stmt->fetch()) { $passwordHash = password_hash('AdminScout123!', PASSWORD_BCRYPT); $this->pdo->beginTransaction(); try { $stmt = $this->pdo->prepare("INSERT INTO users (name, email, password_hash, status) VALUES (?, ?, ?, 'active')"); $stmt->execute(['ScoutIQ Admin', $email, $passwordHash]); $userId = (int)$this->pdo->lastInsertId(); $stmt = $this->pdo->prepare("SELECT id FROM roles WHERE code = 'admin'"); $stmt->execute(); $roleId = $stmt->fetchColumn(); if ($roleId) { $stmt = $this->pdo->prepare("INSERT INTO user_roles (user_id, role_id) VALUES (?, ?)"); $stmt->execute([$userId, $roleId]); } $this->pdo->commit(); echo "Admin User Created: {$email} / AdminScout123!\n"; } catch (\Exception $e) { $this->pdo->rollBack(); echo "Failed to create default admin: " . $e->getMessage() . "\n"; } } } }