67 lines
1.9 KiB
Go
67 lines
1.9 KiB
Go
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
|
|
}
|