/
delphin
/
CatRW
Обзор
Документация
Войти
/
delphin
/
CatRW
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
multilang
api/RailwayCompanyService.php
387 строк
15 KB
delphin
multilang add
11 мар 2026, 09:25
Верифицирован
11 мар 2026, 09:25
90e28cc
Код
Авторство
О чём код?
<?php // /api/RailwayCompanyService.php - СЕРВИС ЖЕЛЕЗНОДОРОЖНЫХ КОМПАНИЙ class RailwayCompanyService { // Получить все компании public static function getAll($filters = []) { try { $where = []; $params = []; if (!empty($filters['search'])) { $where[] = "(name LIKE :search_name OR code LIKE :search_code)"; $params[':search_name'] = "%" . $filters['search'] . "%"; $params[':search_code'] = "%" . $filters['search'] . "%"; // то же значение, другое имя } $sql = "SELECT * FROM railway_companies"; if (!empty($where)) { $sql .= " WHERE " . implode(" AND ", $where); } $sql .= " ORDER BY name"; return Database::select($sql, $params); } catch (Exception $e) { error_log("RailwayCompanyService::getAll error: " . $e->getMessage()); return []; } } // Получить компанию по коду public static function getByCode($code) { try { return Database::selectOne( "SELECT * FROM railway_companies WHERE code = :code", [':code' => $code] ); } catch (Exception $e) { error_log("RailwayCompanyService::getByCode error for code '$code': " . $e->getMessage()); return null; } } // Получить компанию по ID public static function getById($id) { try { return Database::selectOne( "SELECT * FROM railway_companies WHERE id = :id", [':id' => $id] ); } catch (Exception $e) { error_log("RailwayCompanyService::getById error for id '$id': " . $e->getMessage()); return null; } } // Добавить компанию public static function add($data) { try { error_log("RailwayCompanyService::add: " . print_r($data, true)); if (empty($data['code'])) { throw new Exception("Код обязателен"); } if (empty($data['name'])) { throw new Exception("Название обязательно"); } // Проверка уникальности кода $existing = Database::selectOne( "SELECT code FROM railway_companies WHERE code = ?", [$data['code']] ); if ($existing) { throw new Exception("Компания с таким кодом уже существует"); } // Очистка и подготовка данных $cleanData = [ 'code' => trim($data['code']), 'name' => trim($data['name']), 'country_code' => !empty($data['country_code']) ? strtoupper(trim($data['country_code'])) : null, 'founded_year' => !empty($data['founded_year']) ? (int)$data['founded_year'] : null, 'closed_year' => !empty($data['closed_year']) ? (int)$data['closed_year'] : null, 'notes' => !empty($data['notes']) ? trim($data['notes']) : null, 'created_at' => date('Y-m-d H:i:s') ]; return Database::insert('railway_companies', $cleanData); } catch (Exception $e) { error_log("RailwayCompanyService::add error: " . $e->getMessage()); throw $e; } } // Обновить компанию по ID public static function updateById($id, $data) { try { error_log("=== RailwayCompanyService::updateById() START ==="); error_log("Updating railway company by ID: $id"); error_log("Data: " . print_r($data, true)); // Проверяем существование $company = self::getById($id); if (!$company) { error_log("ERROR: Railway company not found ID: $id"); throw new Exception("Железнодорожная компания не найдена"); } // Если меняем код - проверяем уникальность нового кода $newCode = !empty($data['code']) ? trim($data['code']) : $company['code']; if ($newCode !== $company['code']) { $existing = Database::selectOne( "SELECT id FROM railway_companies WHERE code = :code AND id != :id", [':code' => $newCode, ':id' => $id] ); if ($existing) { throw new Exception("Компания с таким кодом уже существует"); } } // Подготавливаем данные для обновления $updateData = []; if (isset($data['code'])) { $updateData['code'] = trim($data['code']); } if (isset($data['name'])) { $updateData['name'] = trim($data['name']); } if (isset($data['country_code'])) { $updateData['country_code'] = !empty($data['country_code']) ? strtoupper(trim($data['country_code'])) : null; } if (isset($data['founded_year'])) { $updateData['founded_year'] = !empty($data['founded_year']) ? (int)$data['founded_year'] : null; } if (isset($data['closed_year'])) { $updateData['closed_year'] = !empty($data['closed_year']) ? (int)$data['closed_year'] : null; } if (isset($data['notes'])) { $updateData['notes'] = trim($data['notes']); } // Если нет изменений if (empty($updateData)) { throw new Exception("Нет изменений для обновления"); } // Обновляем запись по ID error_log("Updating railway company ID '$id'"); $result = Database::update( 'railway_companies', $updateData, 'id = :id_where', ['id_where' => $id] ); error_log("Update result: $result rows affected"); error_log("=== RailwayCompanyService::updateById() SUCCESS ==="); return $result; } catch (Exception $e) { error_log("RailwayCompanyService::updateById ERROR: " . $e->getMessage()); throw $e; } } // Удалить компанию по ID public static function deleteById($id) { try { error_log("RailwayCompanyService::deleteById called for ID: " . $id); // 1. Проверяем существование компании $company = self::getById($id); if (!$company) { throw new Exception("Железнодорожная компания #$id не найдена"); } error_log("Company found: " . $company['name'] . " (code: " . $company['code'] . ")"); // 2. Проверяем, есть ли модели этой компании $modelsCount = Database::selectOne( "SELECT COUNT(*) as cnt FROM catalog_models WHERE railway_company = :id", [':id' => $id] ); error_log("Models count for company ID '{$id}': " . ($modelsCount['cnt'] ?? 0)); if ($modelsCount && $modelsCount['cnt'] > 0) { throw new Exception("Нельзя удалить компанию: есть модели этой компании"); } // 3. Удаляем компанию error_log("Deleting railway company from database..."); $result = Database::delete('railway_companies', 'id = :id', [':id' => $id]); error_log("Database delete result: " . $result . " rows affected"); return [ 'type' => 'deleted', 'message' => 'Железнодорожная компания удалена' ]; } catch (Exception $e) { error_log("RailwayCompanyService::deleteById ERROR for id '$id': " . $e->getMessage()); throw $e; } } // Поиск компаний public static function search($query, $limit = 20) { try { if (empty($query)) { return Database::select( "SELECT * FROM railway_companies ORDER BY name LIMIT :limit", [':limit' => $limit] ); } $searchPattern = "%" . $query . "%"; return Database::select( "SELECT * FROM railway_companies WHERE name LIKE :search OR code LIKE :search ORDER BY name LIMIT :limit", [':search' => $searchPattern, ':limit' => $limit] ); } catch (Exception $e) { error_log("RailwayCompanyService::search error for query '$query': " . $e->getMessage()); return []; } } // Получить статистику public static function getStats() { try { $result = Database::selectOne(" SELECT COUNT(*) as total_companies, COUNT(DISTINCT country_code) as countries_count, (SELECT COUNT(*) FROM catalog_models WHERE railway_company IS NOT NULL) as total_models FROM railway_companies "); return $result; } catch (Exception $e) { error_log("RailwayCompanyService::getStats error: " . $e->getMessage()); return ['total_companies' => 0, 'countries_count' => 0, 'total_models' => 0]; } } // Получить список стран с компаниями public static function getCountries() { try { return Database::select( "SELECT DISTINCT country_code FROM railway_companies WHERE country_code IS NOT NULL ORDER BY country_code" ); } catch (Exception $e) { error_log("RailwayCompanyService::getCountries error: " . $e->getMessage()); return []; } } // Получить количество моделей для компании по ID public static function getModelsCount($companyId) { try { $result = Database::selectOne( "SELECT COUNT(*) as cnt FROM catalog_models WHERE railway_company = :id", [':id' => $companyId] ); return $result ? (int)$result['cnt'] : 0; } catch (Exception $e) { error_log("RailwayCompanyService::getModelsCount error: " . $e->getMessage()); return 0; } } // Получить URL логотипа public static function getLogoUrl($id) { try { $dir = ROOT_PATH . '/uploads/railways/'; $extensions = ['jpg', 'jpeg', 'png', 'gif', 'webp']; foreach ($extensions as $ext) { $filename = $id . '.' . $ext; if (file_exists($dir . $filename)) { return '/uploads/railways/' . $filename; } } return null; } catch (Exception $e) { error_log("RailwayCompanyService::getLogoUrl error for id $id: " . $e->getMessage()); return null; } } // Загрузить логотип public static function uploadLogo($id, $file) { try { $dir = ROOT_PATH . '/uploads/railways/'; // Создаём папку если нет if (!is_dir($dir)) { if (!mkdir($dir, 0777, true)) { throw new Exception("Не удалось создать папку для логотипов"); } } // Проверяем файл if ($file['error'] !== UPLOAD_ERR_OK) { throw new Exception("Ошибка загрузки файла: код " . $file['error']); } if ($file['size'] > 2 * 1024 * 1024) { // 2MB throw new Exception("Файл слишком большой (макс. 2MB)"); } // Определяем расширение $ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION)); $allowed = ['jpg', 'jpeg', 'png', 'gif', 'webp']; if (!in_array($ext, $allowed)) { throw new Exception("Допустимые форматы: " . implode(', ', $allowed)); } // Удаляем старый логотип self::deleteLogo($id); // Сохраняем $filename = $id . '.' . $ext; $filepath = $dir . $filename; if (move_uploaded_file($file['tmp_name'], $filepath)) { // Меняем права chmod($filepath, 0644); return '/uploads/railways/' . $filename; } throw new Exception("Не удалось сохранить файл"); } catch (Exception $e) { error_log("RailwayCompanyService::uploadLogo error for id $id: " . $e->getMessage()); throw $e; } } // Удалить логотип public static function deleteLogo($id) { try { $dir = ROOT_PATH . '/uploads/railways/'; $extensions = ['jpg', 'jpeg', 'png', 'gif', 'webp']; foreach ($extensions as $ext) { $filepath = $dir . $id . '.' . $ext; if (file_exists($filepath)) { unlink($filepath); return true; } } return false; } catch (Exception $e) { error_log("RailwayCompanyService::deleteLogo error for id $id: " . $e->getMessage()); return false; } } } ?>