Files
scoutiq/database/seeds/DatabaseSeeder.php

155 lines
6.7 KiB
PHP

<?php
namespace Database\Seeds;
use App\Services\Database\Connection;
use PDO;
class DatabaseSeeder
{
private PDO $pdo;
public function __construct(Connection $connection)
{
$this->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.'],
];
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";
}
}
}
}