package repository import ( "context" "database/sql" "fmt" "github.com/luxsin/app-api/internal/model" ) type DeviceRepository struct { db *sql.DB } func NewDeviceRepository(db *sql.DB) *DeviceRepository { return &DeviceRepository{db: db} } func (r *DeviceRepository) FindDeviceByMac(ctx context.Context, macAddr string) (*model.UserDevice, error) { const query = `SELECT id, mac_addr, model, add_time, ver FROM user_device WHERE mac_addr = ?` var d model.UserDevice var ver sql.NullString err := r.db.QueryRowContext(ctx, query, macAddr).Scan(&d.ID, &d.MacAddr, &d.Model, &d.AddTime, &ver) if err == sql.ErrNoRows { return nil, nil } if err != nil { return nil, fmt.Errorf("query user_device: %w", err) } if ver.Valid { d.Ver = &ver.String } return &d, nil } func (r *DeviceRepository) InsertDevice(ctx context.Context, d model.UserDevice) error { const query = `INSERT INTO user_device (mac_addr, model, ver) VALUES (?, ?, ?)` _, err := r.db.ExecContext(ctx, query, d.MacAddr, d.Model, d.Ver) if err != nil { return fmt.Errorf("insert user_device: %w", err) } return nil } func (r *DeviceRepository) UpdateDeviceVer(ctx context.Context, id int, ver *string) error { const query = `UPDATE user_device SET ver = ? WHERE id = ?` _, err := r.db.ExecContext(ctx, query, ver, id) if err != nil { return fmt.Errorf("update user_device: %w", err) } return nil } func (r *DeviceRepository) FindActiveByMacAndDate(ctx context.Context, macAddr, activeDate string) (*model.UserActive, error) { const query = `SELECT id, mac_addr, model, active_date, ip_addr, create_at FROM user_active WHERE mac_addr = ? AND active_date = ?` var a model.UserActive err := r.db.QueryRowContext(ctx, query, macAddr, activeDate).Scan(&a.ID, &a.MacAddr, &a.Model, &a.ActiveDate, &a.IpAddr, &a.CreateAt) if err == sql.ErrNoRows { return nil, nil } if err != nil { return nil, fmt.Errorf("query user_active: %w", err) } return &a, nil } func (r *DeviceRepository) InsertActive(ctx context.Context, a model.UserActive) error { const query = `INSERT INTO user_active (mac_addr, model, active_date, ip_addr) VALUES (?, ?, ?, ?)` _, err := r.db.ExecContext(ctx, query, a.MacAddr, a.Model, a.ActiveDate, a.IpAddr) if err != nil { return fmt.Errorf("insert user_active: %w", err) } return nil } func (r *DeviceRepository) UpdateActiveIp(ctx context.Context, id int, ipAddr string) error { const query = `UPDATE user_active SET ip_addr = ? WHERE id = ?` _, err := r.db.ExecContext(ctx, query, ipAddr, id) if err != nil { return fmt.Errorf("update user_active: %w", err) } return nil }