add
This commit is contained in:
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user