This commit is contained in:
2025-07-28 01:46:39 +08:00
parent b03129667a
commit 357639462a
219 changed files with 21634 additions and 8138 deletions

View File

@@ -0,0 +1,238 @@
package api
import (
"context"
"time"
"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 (
ApiCallsTable = "api_calls"
ApiCallCacheTTL = 10 * time.Minute
)
// ApiCallWithProduct 包含产品名称的API调用记录
type ApiCallWithProduct struct {
entities.ApiCall
ProductName string `json:"product_name" gorm:"column:product_name"`
}
type GormApiCallRepository struct {
*database.CachedBaseRepositoryImpl
}
var _ repositories.ApiCallRepository = (*GormApiCallRepository)(nil)
func NewGormApiCallRepository(db *gorm.DB, logger *zap.Logger) repositories.ApiCallRepository {
return &GormApiCallRepository{
CachedBaseRepositoryImpl: database.NewCachedBaseRepositoryImpl(db, logger, ApiCallsTable),
}
}
func (r *GormApiCallRepository) Create(ctx context.Context, call *entities.ApiCall) error {
return r.CreateEntity(ctx, call)
}
func (r *GormApiCallRepository) Update(ctx context.Context, call *entities.ApiCall) error {
return r.UpdateEntity(ctx, call)
}
func (r *GormApiCallRepository) FindById(ctx context.Context, id string) (*entities.ApiCall, error) {
var call entities.ApiCall
err := r.SmartGetByID(ctx, id, &call)
if err != nil {
return nil, err
}
return &call, nil
}
func (r *GormApiCallRepository) FindByUserId(ctx context.Context, userId string, limit, offset int) ([]*entities.ApiCall, error) {
var calls []*entities.ApiCall
options := database.CacheListOptions{
Where: "user_id = ?",
Args: []interface{}{userId},
Order: "created_at DESC",
Limit: limit,
Offset: offset,
}
err := r.ListWithCache(ctx, &calls, ApiCallCacheTTL, options)
return calls, err
}
func (r *GormApiCallRepository) ListByUserId(ctx context.Context, userId string, options interfaces.ListOptions) ([]*entities.ApiCall, int64, error) {
var calls []*entities.ApiCall
var total int64
// 构建查询条件
whereCondition := "user_id = ?"
whereArgs := []interface{}{userId}
// 获取总数
count, err := r.CountWhere(ctx, &entities.ApiCall{}, whereCondition, whereArgs...)
if err != nil {
return nil, 0, err
}
total = count
// 使用基础仓储的分页查询方法
err = r.ListWithOptions(ctx, &entities.ApiCall{}, &calls, options)
return calls, total, err
}
func (r *GormApiCallRepository) ListByUserIdWithFilters(ctx context.Context, userId string, filters map[string]interface{}, options interfaces.ListOptions) ([]*entities.ApiCall, int64, error) {
var calls []*entities.ApiCall
var total int64
// 构建基础查询条件
whereCondition := "user_id = ?"
whereArgs := []interface{}{userId}
// 应用筛选条件
if filters != nil {
// 时间范围筛选
if startTime, ok := filters["start_time"].(time.Time); ok {
whereCondition += " AND created_at >= ?"
whereArgs = append(whereArgs, startTime)
}
if endTime, ok := filters["end_time"].(time.Time); ok {
whereCondition += " AND created_at <= ?"
whereArgs = append(whereArgs, endTime)
}
// TransactionID筛选
if transactionId, ok := filters["transaction_id"].(string); ok && transactionId != "" {
whereCondition += " AND transaction_id LIKE ?"
whereArgs = append(whereArgs, "%"+transactionId+"%")
}
// 产品ID筛选
if productId, ok := filters["product_id"].(string); ok && productId != "" {
whereCondition += " AND product_id = ?"
whereArgs = append(whereArgs, productId)
}
// 状态筛选
if status, ok := filters["status"].(string); ok && status != "" {
whereCondition += " AND status = ?"
whereArgs = append(whereArgs, status)
}
}
// 获取总数
count, err := r.CountWhere(ctx, &entities.ApiCall{}, whereCondition, whereArgs...)
if err != nil {
return nil, 0, err
}
total = count
// 使用基础仓储的分页查询方法
err = r.ListWithOptions(ctx, &entities.ApiCall{}, &calls, options)
return calls, total, err
}
// ListByUserIdWithFiltersAndProductName 根据用户ID和筛选条件获取API调用记录包含产品名称
func (r *GormApiCallRepository) ListByUserIdWithFiltersAndProductName(ctx context.Context, userId string, filters map[string]interface{}, options interfaces.ListOptions) (map[string]string, []*entities.ApiCall, int64, error) {
var callsWithProduct []*ApiCallWithProduct
var total int64
// 构建基础查询条件
whereCondition := "ac.user_id = ?"
whereArgs := []interface{}{userId}
// 应用筛选条件
if filters != nil {
// 时间范围筛选
if startTime, ok := filters["start_time"].(time.Time); ok {
whereCondition += " AND ac.created_at >= ?"
whereArgs = append(whereArgs, startTime)
}
if endTime, ok := filters["end_time"].(time.Time); ok {
whereCondition += " AND ac.created_at <= ?"
whereArgs = append(whereArgs, endTime)
}
// TransactionID筛选
if transactionId, ok := filters["transaction_id"].(string); ok && transactionId != "" {
whereCondition += " AND ac.transaction_id LIKE ?"
whereArgs = append(whereArgs, "%"+transactionId+"%")
}
// 产品名称筛选
if productName, ok := filters["product_name"].(string); ok && productName != "" {
whereCondition += " AND p.name LIKE ?"
whereArgs = append(whereArgs, "%"+productName+"%")
}
// 状态筛选
if status, ok := filters["status"].(string); ok && status != "" {
whereCondition += " AND ac.status = ?"
whereArgs = append(whereArgs, status)
}
}
// 构建JOIN查询
query := r.GetDB(ctx).Table("api_calls ac").
Select("ac.*, p.name as product_name").
Joins("LEFT JOIN product p ON ac.product_id = p.id").
Where(whereCondition, whereArgs...)
// 获取总数
var count int64
err := query.Count(&count).Error
if err != nil {
return nil, nil, 0, err
}
total = count
// 应用排序和分页
if options.Sort != "" {
query = query.Order("ac." + options.Sort + " " + options.Order)
} else {
query = query.Order("ac.created_at DESC")
}
if options.Page > 0 && options.PageSize > 0 {
offset := (options.Page - 1) * options.PageSize
query = query.Offset(offset).Limit(options.PageSize)
}
// 执行查询
err = query.Find(&callsWithProduct).Error
if err != nil {
return nil, nil, 0, err
}
// 转换为entities.ApiCall并构建产品名称映射
var calls []*entities.ApiCall
productNameMap := make(map[string]string)
for _, c := range callsWithProduct {
call := c.ApiCall
calls = append(calls, &call)
// 构建产品ID到产品名称的映射
if c.ProductName != "" {
productNameMap[call.ID] = c.ProductName
}
}
return productNameMap, calls, total, nil
}
func (r *GormApiCallRepository) CountByUserId(ctx context.Context, userId string) (int64, error) {
return r.CountWhere(ctx, &entities.ApiCall{}, "user_id = ?", userId)
}
func (r *GormApiCallRepository) FindByTransactionId(ctx context.Context, transactionId string) (*entities.ApiCall, error) {
var call entities.ApiCall
err := r.FindOne(ctx, &call, "transaction_id = ?", transactionId)
if err != nil {
return nil, err
}
return &call, nil
}

View File

@@ -0,0 +1,56 @@
package api
import (
"context"
"tyapi-server/internal/domains/api/entities"
"tyapi-server/internal/domains/api/repositories"
"tyapi-server/internal/shared/database"
"time"
"go.uber.org/zap"
"gorm.io/gorm"
)
const (
ApiUsersTable = "api_users"
ApiUserCacheTTL = 30 * time.Minute
)
type GormApiUserRepository struct {
*database.CachedBaseRepositoryImpl
}
var _ repositories.ApiUserRepository = (*GormApiUserRepository)(nil)
func NewGormApiUserRepository(db *gorm.DB, logger *zap.Logger) repositories.ApiUserRepository {
return &GormApiUserRepository{
CachedBaseRepositoryImpl: database.NewCachedBaseRepositoryImpl(db, logger, ApiUsersTable),
}
}
func (r *GormApiUserRepository) Create(ctx context.Context, user *entities.ApiUser) error {
return r.CreateEntity(ctx, user)
}
func (r *GormApiUserRepository) Update(ctx context.Context, user *entities.ApiUser) error {
return r.UpdateEntity(ctx, user)
}
func (r *GormApiUserRepository) FindByAccessId(ctx context.Context, accessId string) (*entities.ApiUser, error) {
var user entities.ApiUser
err := r.SmartGetByField(ctx, &user, "access_id", accessId, ApiUserCacheTTL)
if err != nil {
return nil, err
}
return &user, nil
}
func (r *GormApiUserRepository) FindByUserId(ctx context.Context, userId string) (*entities.ApiUser, error) {
var user entities.ApiUser
err := r.SmartGetByField(ctx, &user, "user_id", userId, ApiUserCacheTTL)
if err != nil {
return nil, err
}
return &user, nil
}