This commit is contained in:
2026-06-18 21:16:02 +08:00
parent 9685d34187
commit 3a5a0d0028
36 changed files with 1566 additions and 66 deletions

View File

@@ -0,0 +1,152 @@
package api
import (
"context"
"fmt"
"tyapi-server/internal/domains/api/entities"
"tyapi-server/internal/domains/api/repositories"
"tyapi-server/internal/shared/database"
"tyapi-server/internal/shared/interfaces"
"go.uber.org/zap"
"gorm.io/gorm"
)
const QueryWhitelistTable = "query_whitelist_entries"
type GormQueryWhitelistRepository struct {
*database.BaseRepositoryImpl
}
var _ repositories.QueryWhitelistRepository = (*GormQueryWhitelistRepository)(nil)
func NewGormQueryWhitelistRepository(db *gorm.DB, logger *zap.Logger) repositories.QueryWhitelistRepository {
return &GormQueryWhitelistRepository{
BaseRepositoryImpl: database.NewBaseRepositoryImpl(db, logger),
}
}
func (r *GormQueryWhitelistRepository) Create(ctx context.Context, entry *entities.QueryWhitelistEntry) error {
return r.CreateEntity(ctx, entry)
}
func (r *GormQueryWhitelistRepository) Update(ctx context.Context, entry *entities.QueryWhitelistEntry) error {
return r.UpdateEntity(ctx, entry)
}
func (r *GormQueryWhitelistRepository) Delete(ctx context.Context, id string) error {
return r.GetDB(ctx).Where("id = ?", id).Delete(&entities.QueryWhitelistEntry{}).Error
}
func (r *GormQueryWhitelistRepository) FindByID(ctx context.Context, id string) (*entities.QueryWhitelistEntry, error) {
var entry entities.QueryWhitelistEntry
if err := r.GetDB(ctx).Where("id = ?", id).First(&entry).Error; err != nil {
return nil, err
}
return &entry, nil
}
func (r *GormQueryWhitelistRepository) FindEnabledByUserIDsAndIDCardHash(
ctx context.Context,
userIDs []string,
idCardHash string,
) ([]*entities.QueryWhitelistEntry, error) {
if len(userIDs) == 0 || idCardHash == "" {
return nil, nil
}
var entries []*entities.QueryWhitelistEntry
err := r.GetDB(ctx).
Where("user_id IN ? AND id_card_hash = ? AND status = ?", userIDs, idCardHash, entities.QueryWhitelistStatusEnabled).
Find(&entries).Error
if err != nil {
return nil, err
}
return entries, nil
}
func (r *GormQueryWhitelistRepository) FindAllEnabled(ctx context.Context) ([]*entities.QueryWhitelistEntry, error) {
var entries []*entities.QueryWhitelistEntry
err := r.GetDB(ctx).
Where("status = ?", entities.QueryWhitelistStatusEnabled).
Find(&entries).Error
if err != nil {
return nil, err
}
return entries, nil
}
func (r *GormQueryWhitelistRepository) List(
ctx context.Context,
filters map[string]interface{},
options interfaces.ListOptions,
) ([]*entities.QueryWhitelistEntry, int64, error) {
query := r.GetDB(ctx).Model(&entities.QueryWhitelistEntry{})
if userID, ok := filters["user_id"].(string); ok && userID != "" {
query = query.Where("user_id = ?", userID)
}
if status, ok := filters["status"].(string); ok && status != "" {
query = query.Where("status = ?", status)
}
if apiCode, ok := filters["api_code"].(string); ok && apiCode != "" {
query = query.Where("api_codes::text LIKE ?", fmt.Sprintf("%%\"%s\"%%", apiCode))
}
if idCardHash, ok := filters["id_card_hash"].(string); ok && idCardHash != "" {
query = query.Where("id_card_hash = ?", idCardHash)
}
if keyword, ok := filters["keyword"].(string); ok && keyword != "" {
like := "%" + keyword + "%"
query = query.Where("name LIKE ? OR remark LIKE ? OR id_card_masked LIKE ?", like, like, like)
}
var total int64
if err := query.Count(&total).Error; err != nil {
return nil, 0, err
}
page := options.Page
if page < 1 {
page = 1
}
pageSize := options.PageSize
if pageSize < 1 {
pageSize = 20
}
if pageSize > 100 {
pageSize = 100
}
offset := (page - 1) * pageSize
order := "created_at DESC"
if options.Sort != "" {
dir := "ASC"
if options.Order == "desc" {
dir = "DESC"
}
order = fmt.Sprintf("%s %s", options.Sort, dir)
}
var entries []*entities.QueryWhitelistEntry
if err := query.Order(order).Offset(offset).Limit(pageSize).Find(&entries).Error; err != nil {
return nil, 0, err
}
return entries, total, nil
}
func (r *GormQueryWhitelistRepository) ExistsByUserIDCardHashAndName(
ctx context.Context,
userID, idCardHash, name string,
excludeID string,
) (bool, error) {
query := r.GetDB(ctx).Model(&entities.QueryWhitelistEntry{}).
Where("user_id = ? AND id_card_hash = ? AND name = ?", userID, idCardHash, name)
if excludeID != "" {
query = query.Where("id <> ?", excludeID)
}
var count int64
if err := query.Count(&count).Error; err != nil {
return false, err
}
return count > 0, nil
}