package db import ( "database/sql" "lostcavewireplanner/internal/models" ) func (s *Store) PortGetByDeviceID(deviceID int64) ([]models.DevicePort, error) { rows, err := s.DB.Query(`SELECT id, device_id, name, side, position FROM device_ports WHERE device_id = ? ORDER BY side, position`, deviceID) if err != nil { return nil, err } defer rows.Close() var ports []models.DevicePort for rows.Next() { var p models.DevicePort if err := rows.Scan(&p.ID, &p.DeviceID, &p.Name, &p.Side, &p.Position); err != nil { return nil, err } ports = append(ports, p) } return ports, rows.Err() } func (s *Store) PortGetByID(id int64) (*models.DevicePort, error) { p := &models.DevicePort{} err := s.DB.QueryRow(`SELECT id, device_id, name, side, position FROM device_ports WHERE id = ?`, id). Scan(&p.ID, &p.DeviceID, &p.Name, &p.Side, &p.Position) if err == sql.ErrNoRows { return nil, nil } if err != nil { return nil, err } return p, nil } func (s *Store) PortGetPaired(deviceID int64, name string, side string) (*models.DevicePort, error) { p := &models.DevicePort{} err := s.DB.QueryRow(`SELECT id, device_id, name, side, position FROM device_ports WHERE device_id = ? AND name = ? AND side = ?`, deviceID, name, side). Scan(&p.ID, &p.DeviceID, &p.Name, &p.Side, &p.Position) if err == sql.ErrNoRows { return nil, nil } if err != nil { return nil, err } return p, nil } func (s *Store) portCreateFromModelTx(tx *sql.Tx, deviceID int64, model *models.DeviceModel) error { for _, mp := range model.Ports { if model.IsPatchPanel || model.IsWallSocket { _, err := tx.Exec(`INSERT INTO device_ports (device_id, name, side, position) VALUES (?, ?, 'front', ?)`, deviceID, mp.Name, mp.Position) if err != nil { return err } _, err = tx.Exec(`INSERT INTO device_ports (device_id, name, side, position) VALUES (?, ?, 'back', ?)`, deviceID, mp.Name, mp.Position) if err != nil { return err } } else { _, err := tx.Exec(`INSERT INTO device_ports (device_id, name, side, position) VALUES (?, ?, ?, ?)`, deviceID, mp.Name, mp.Side, mp.Position) if err != nil { return err } } } return nil }