package repository import ( "context" "database/sql" "fmt" "strings" "github.com/luxsin/app-api/internal/model" ) type NavConfigRepository struct { db *sql.DB } func NewNavConfigRepository(db *sql.DB) *NavConfigRepository { return &NavConfigRepository{db: db} } // NormalizeMac 将各种格式的 MAC 统一为大写冒号分隔格式(如 40:D9:5A:D8:06:9C)。 // 兼容设备可能上报的小写、无分隔符(40d95ad8069c)、或短横线分隔(40-d9-5a-...)等形式。 // 无法识别为 12 位十六进制时,返回去除首尾空白并大写后的原值,保证匹配行为可预期。 func NormalizeMac(raw string) string { trimmed := strings.TrimSpace(raw) if trimmed == "" { return "" } hexOnly := strings.ToUpper(strings.NewReplacer(":", "", "-", "", ".", "", " ", "").Replace(trimmed)) if len(hexOnly) != 12 { return strings.ToUpper(trimmed) } for _, c := range hexOnly { if !((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F')) { return strings.ToUpper(trimmed) } } parts := make([]string, 0, 6) for i := 0; i < 12; i += 2 { parts = append(parts, hexOnly[i:i+2]) } return strings.Join(parts, ":") } // FindByMac 按归一化后的 MAC 查询隐藏配置,未命中返回 (nil, nil)。 func (r *NavConfigRepository) FindByMac(ctx context.Context, mac string) (*model.NavHiddenConfig, error) { const query = `SELECT id, mac, hidden_keys, model, create_at FROM nav_hidden_config WHERE mac = ? LIMIT 1` normalized := NormalizeMac(mac) if normalized == "" { return nil, nil } var cfg model.NavHiddenConfig var mdl sql.NullString err := r.db.QueryRowContext(ctx, query, normalized).Scan(&cfg.ID, &cfg.Mac, &cfg.HiddenKeys, &mdl, &cfg.CreateAt) if err == sql.ErrNoRows { return nil, nil } if err != nil { return nil, fmt.Errorf("query nav_hidden_config: %w", err) } if mdl.Valid { cfg.Model = &mdl.String } return &cfg, nil }