daShangDao_kfz_goods_pricing/internal/repository/token_repository.go

246 lines
6.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package repository
import (
"database/sql"
"fmt"
"log"
"strings"
"kfz-goods-pricing/internal/database"
)
// KfzToken Token记录
type KfzToken struct {
ID int64
LoginName string
Username string
Password string
Token string
IsEnable bool
}
// TokenRepository Token仓储
type TokenRepository struct{}
// NewTokenRepository 创建Token仓储实例
func NewTokenRepository() *TokenRepository {
return &TokenRepository{}
}
// BatchInsert 批量插入Token记录
func (r *TokenRepository) BatchInsert(tokens []string, username string) (int64, error) {
if len(tokens) == 0 {
return 0, nil
}
var validTokens []string
for _, t := range tokens {
t := strings.TrimSpace(t)
if t != "" {
validTokens = append(validTokens, t)
}
}
if len(validTokens) == 0 {
return 0, nil
}
valuePlaceholders := make([]string, len(validTokens))
args := make([]interface{}, 0, len(validTokens)*2)
for i, t := range validTokens {
valuePlaceholders[i] = "(?, ?, 1)"
args = append(args, username, t)
}
query := fmt.Sprintf("INSERT INTO kfz_token (username, token, is_enable) VALUES %s", strings.Join(valuePlaceholders, ","))
result, err := database.DB.Exec(query, args...)
if err != nil {
return 0, fmt.Errorf("批量插入失败: %w", err)
}
id, err := result.LastInsertId()
if err != nil {
return 0, fmt.Errorf("获取自增ID失败: %w", err)
}
return id, nil
}
// Insert 插入单条Token记录
func (r *TokenRepository) Insert(loginName, username, password, token string, isEnable bool) (int64, error) {
query := `INSERT INTO kfz_token (login_name, username, password, token, is_enable) VALUES (?, ?, ?, ?, ?)`
result, err := database.DB.Exec(query, loginName, username, password, token, isEnable)
if err != nil {
return 0, fmt.Errorf("插入失败: %w", err)
}
id, err := result.LastInsertId()
if err != nil {
return 0, fmt.Errorf("获取自增ID失败: %w", err)
}
return id, nil
}
// UpsertByLoginName 根据登录名插入或更新记录
func (r *TokenRepository) UpsertByLoginName(loginName, username, password, token string) error {
var count int
err := database.DB.QueryRow("SELECT COUNT(*) FROM kfz_token WHERE login_name = ?", loginName).Scan(&count)
if err != nil {
return fmt.Errorf("查询记录失败: %w", err)
}
if count == 0 {
_, err = database.DB.Exec(
`INSERT INTO kfz_token (login_name, username, password, token, is_enable) VALUES (?, ?, ?, ?, 1)`,
loginName, username, password, token,
)
} else {
_, err = database.DB.Exec(
`UPDATE kfz_token SET username = ?, password = ?, token = ?, is_enable = 1 WHERE login_name = ?`,
username, password, token, loginName,
)
}
if err != nil {
return fmt.Errorf("保存Token记录失败: %w", err)
}
log.Printf("[Repo/Token] 保存Token成功: login_name=%s, username=%s", loginName, username)
return nil
}
// GetAll 查询所有记录
func (r *TokenRepository) GetAll() ([]*KfzToken, error) {
query := `SELECT id, login_name, username, token, is_enable FROM kfz_token ORDER BY id ASC`
rows, err := database.DB.Query(query)
if err != nil {
return nil, fmt.Errorf("查询失败: %w", err)
}
defer rows.Close()
var records []*KfzToken
for rows.Next() {
var rec KfzToken
err := rows.Scan(&rec.ID, &rec.LoginName, &rec.Username, &rec.Token, &rec.IsEnable)
if err != nil {
return nil, fmt.Errorf("扫描失败: %w", err)
}
records = append(records, &rec)
}
return records, nil
}
// GetByID 根据ID查询单条记录
func (r *TokenRepository) GetByID(id int64) (*KfzToken, error) {
query := `SELECT id, login_name, username, password, token, is_enable FROM kfz_token WHERE id = ?`
row := database.DB.QueryRow(query, id)
var rec KfzToken
err := row.Scan(&rec.ID, &rec.LoginName, &rec.Username, &rec.Password, &rec.Token, &rec.IsEnable)
if err != nil {
if err == sql.ErrNoRows {
return nil, fmt.Errorf("记录不存在")
}
return nil, fmt.Errorf("查询失败: %w", err)
}
return &rec, nil
}
// GetByLoginName 根据登录名查询记录
func (r *TokenRepository) GetByLoginName(loginName string) (*KfzToken, error) {
query := `SELECT id, login_name, username, password, token, is_enable FROM kfz_token WHERE login_name = ?`
row := database.DB.QueryRow(query, loginName)
var rec KfzToken
err := row.Scan(&rec.ID, &rec.LoginName, &rec.Username, &rec.Password, &rec.Token, &rec.IsEnable)
if err != nil {
if err == sql.ErrNoRows {
return nil, nil
}
return nil, fmt.Errorf("查询失败: %w", err)
}
return &rec, nil
}
// Update 更新记录
func (r *TokenRepository) Update(id int64, loginName, username, password, token string, isEnable bool) error {
query := `UPDATE kfz_token SET login_name = ?, username = ?, password = ?, token = ?, is_enable = ? WHERE id = ?`
result, err := database.DB.Exec(query, loginName, username, password, token, isEnable, id)
if err != nil {
return fmt.Errorf("更新失败: %w", err)
}
rowsAffected, _ := result.RowsAffected()
if rowsAffected == 0 {
return fmt.Errorf("记录不存在")
}
return nil
}
// UpdateToken 只更新token字段用于自动重新登录
func (r *TokenRepository) UpdateToken(id int64, token string) error {
query := `UPDATE kfz_token SET token = ? WHERE id = ?`
result, err := database.DB.Exec(query, token, id)
if err != nil {
return fmt.Errorf("更新Token失败: %w", err)
}
rowsAffected, _ := result.RowsAffected()
if rowsAffected == 0 {
return fmt.Errorf("记录不存在")
}
log.Printf("[Repo/Token] 更新Token成功: id=%d", id)
return nil
}
// Delete 删除记录
func (r *TokenRepository) Delete(id int64) error {
query := `DELETE FROM kfz_token WHERE id = ?`
result, err := database.DB.Exec(query, id)
if err != nil {
return fmt.Errorf("删除失败: %w", err)
}
rowsAffected, _ := result.RowsAffected()
if rowsAffected == 0 {
return fmt.Errorf("记录不存在")
}
return nil
}
// GetEnabledTokens 获取所有启用状态的Token
func (r *TokenRepository) GetEnabledTokens() ([]*KfzToken, error) {
query := `SELECT id, login_name, username, password, token, is_enable FROM kfz_token WHERE is_enable = 1 ORDER BY id ASC`
rows, err := database.DB.Query(query)
if err != nil {
return nil, fmt.Errorf("查询失败: %w", err)
}
defer rows.Close()
var records []*KfzToken
for rows.Next() {
var rec KfzToken
err := rows.Scan(&rec.ID, &rec.LoginName, &rec.Username, &rec.Password, &rec.Token, &rec.IsEnable)
if err != nil {
return nil, fmt.Errorf("扫描失败: %w", err)
}
records = append(records, &rec)
}
return records, nil
}