from modules.device.repository import ( find_all_devices, find_device_by_id, find_device_by_name, find_device_by_ip, insert_device, update_device_db, delete_device_db ) from modules.device.exceptions import ( DeviceNotFoundException, DeviceAlreadyExistsException, DeviceIPAlreadyExistsException ) from modules.device_type.repository import find_device_type_by_id from modules.device_type.exceptions import DeviceTypeNotFoundException from scheduler.scheduler import ( add_device_monitoring_job, remove_device_monitoring_job, reschedule_device_monitoring_job ) def get_devices_service(): """Lấy danh sách tất cả thiết bị""" return find_all_devices() def get_device_by_id_service(device_id): """ Lấy thông tin chi tiết một thiết bị theo ID. Ném lỗi DeviceNotFoundException nếu không tồn tại. """ device = find_device_by_id(device_id) if not device: raise DeviceNotFoundException(device_id) return device def create_device_service(data): """ Tạo mới một thiết bị mạng. Các bước xử lý: 1. Kiểm tra loại thiết bị (device_type_id) có tồn tại trong hệ thống hay không. 2. Kiểm tra trùng lặp tên thiết bị (case-insensitive). 3. Kiểm tra trùng lặp địa chỉ IP. 4. Thêm thiết bị và cấu hình mặc định (monitor & alert) vào database. 5. Đăng ký công việc giám sát vào Scheduler nền. """ # 1. Kiểm tra DeviceType device_type = find_device_type_by_id(data["device_type_id"]) if not device_type: raise DeviceTypeNotFoundException(data["device_type_id"]) # 2. Kiểm tra trùng tên existing_name = find_device_by_name(data["name"]) if existing_name: raise DeviceAlreadyExistsException(data["name"]) # 3. Kiểm tra trùng IP existing_ip = find_device_by_ip(data["ip_address"]) if existing_ip: raise DeviceIPAlreadyExistsException(data["ip_address"]) # 4. Insert DB new_device = insert_device(data) # 5. Kích hoạt Job giám sát trên Background Scheduler # Truyền kèm thông tin cấu hình mặc định (enable_ping=True, v.v...) add_device_monitoring_job(new_device["id"], None) return new_device def update_device_service(device_id, data): """ Cập nhật thông tin thiết bị mạng. Các bước xử lý: 1. Kiểm tra sự tồn tại của thiết bị. 2. Nếu cập nhật device_type_id -> kiểm tra xem có tồn tại không. 3. Nếu cập nhật name -> kiểm tra xem có bị trùng với thiết bị khác không. 4. Nếu cập nhật ip_address -> kiểm tra xem có bị trùng với thiết bị khác không. 5. Cập nhật dữ liệu vào DB. 6. Cập nhật lại cấu hình giám sát trong Scheduler. """ # 1. Kiểm tra thiết bị có tồn tại hay không existing = find_device_by_id(device_id) if not existing: raise DeviceNotFoundException(device_id) # 2. Kiểm tra loại thiết bị nếu có truyền vào new_device_type_id = data.get("device_type_id") if new_device_type_id and new_device_type_id != existing["device_type_id"]: device_type = find_device_type_by_id(new_device_type_id) if not device_type: raise DeviceTypeNotFoundException(new_device_type_id) # 3. Kiểm tra trùng tên khi tên bị thay đổi new_name = data.get("name") if new_name and new_name.lower() != existing["name"].lower(): conflict_name = find_device_by_name(new_name) if conflict_name and conflict_name["id"] != device_id: raise DeviceAlreadyExistsException(new_name) # 4. Kiểm tra trùng IP khi IP bị thay đổi new_ip = data.get("ip_address") if new_ip and new_ip != existing["ip_address"]: conflict_ip = find_device_by_ip(new_ip) if conflict_ip and conflict_ip["id"] != device_id: raise DeviceIPAlreadyExistsException(new_ip) # 5. Cập nhật DB updated_device = update_device_db(device_id, data) # 6. Cập nhật lại thông tin giám sát trong Scheduler reschedule_device_monitoring_job(device_id, None) return updated_device def delete_device_service(device_id): """ Xóa thiết bị mạng. Các bước xử lý: 1. Kiểm tra sự tồn tại của thiết bị. 2. Thực hiện xóa khỏi DB (tự động xóa cấu hình và lịch sử liên quan). 3. Hủy bỏ job giám sát khỏi Scheduler. """ # 1. Kiểm tra tồn tại existing = find_device_by_id(device_id) if not existing: raise DeviceNotFoundException(device_id) # 2. Xóa khỏi DB delete_device_db(device_id) # 3. Hủy công việc giám sát trong Scheduler remove_device_monitoring_job(device_id)