package repository import ( "database/sql" "pc-monitor-server/model" "time" ) type DeviceRepository struct { db *sql.DB } func NewDeviceRepository(db *sql.DB) *DeviceRepository { return &DeviceRepository{db: db} } func (r *DeviceRepository) Create(device *model.Device) error { _, err := r.db.Exec( `INSERT INTO devices (id, hostname, os, ip, registered_at, last_report_at, status) VALUES (?, ?, ?, ?, ?, ?, ?)`, device.ID, device.Hostname, device.OS, device.IP, device.RegisteredAt, device.LastReportAt, device.Status, ) return err } func (r *DeviceRepository) Update(device *model.Device) error { _, err := r.db.Exec( `UPDATE devices SET hostname=?, os=?, ip=?, last_report_at=?, status=? WHERE id=?`, device.Hostname, device.OS, device.IP, device.LastReportAt, device.Status, device.ID, ) return err } func (r *DeviceRepository) GetByID(id string) (*model.Device, error) { device := &model.Device{} err := r.db.QueryRow( `SELECT id, hostname, os, ip, registered_at, last_report_at, status FROM devices WHERE id=?`, id, ).Scan(&device.ID, &device.Hostname, &device.OS, &device.IP, &device.RegisteredAt, &device.LastReportAt, &device.Status) if err != nil { return nil, err } return device, nil } func (r *DeviceRepository) GetAll() ([]model.Device, error) { rows, err := r.db.Query( `SELECT id, hostname, os, ip, registered_at, last_report_at, status FROM devices ORDER BY last_report_at DESC`) if err != nil { return nil, err } defer rows.Close() var devices []model.Device for rows.Next() { var d model.Device if err := rows.Scan(&d.ID, &d.Hostname, &d.OS, &d.IP, &d.RegisteredAt, &d.LastReportAt, &d.Status); err != nil { return nil, err } devices = append(devices, d) } return devices, nil } func (r *DeviceRepository) Delete(id string) error { _, err := r.db.Exec("DELETE FROM devices WHERE id=?", id) return err } func (r *DeviceRepository) UpdateStatus(id string, status string) error { _, err := r.db.Exec("UPDATE devices SET status=? WHERE id=?", status, id) return err } func (r *DeviceRepository) MarkOffline(threshold time.Duration) error { cutoff := time.Now().Add(-threshold) _, err := r.db.Exec( `UPDATE devices SET status='offline' WHERE last_report_at < ? AND status='online'`, cutoff) return err }