// Code scaffolded by goctl. Safe to edit. // goctl 1.9.2 package ai import ( "context" "github.com/youruser/base/internal/svc" "github.com/youruser/base/internal/types" "github.com/youruser/base/model" "github.com/zeromicro/go-zero/core/logx" ) type AiApiKeyListLogic struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } // 获取我的API Key列表 func NewAiApiKeyListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AiApiKeyListLogic { return &AiApiKeyListLogic{ Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } func (l *AiApiKeyListLogic) AiApiKeyList(req *types.AIApiKeyListRequest) (resp *types.AIApiKeyListResponse, err error) { userId, _ := l.ctx.Value("userId").(int64) // Query keys belonging to current user or system keys (userId=0) var keys []model.AIApiKey var total int64 query := l.svcCtx.DB.WithContext(l.ctx).Model(&model.AIApiKey{}).Where("user_id = ? OR user_id = 0", userId) if err = query.Count(&total).Error; err != nil { return nil, err } offset := (req.Page - 1) * req.PageSize if offset < 0 { offset = 0 } if err = query.Order("created_at DESC").Offset(int(offset)).Limit(int(req.PageSize)).Find(&keys).Error; err != nil { return nil, err } // Build provider name cache to avoid repeated queries providerCache := make(map[int64]string) list := make([]types.AIApiKeyInfo, 0, len(keys)) for _, key := range keys { providerName := "" if name, ok := providerCache[key.ProviderId]; ok { providerName = name } else { provider, provErr := model.AIProviderFindOne(l.ctx, l.svcCtx.DB, key.ProviderId) if provErr == nil { providerName = provider.DisplayName } providerCache[key.ProviderId] = providerName } list = append(list, types.AIApiKeyInfo{ Id: key.Id, ProviderId: key.ProviderId, ProviderName: providerName, UserId: key.UserId, KeyPreview: maskKey(key.KeyValue), IsActive: key.IsActive, Remark: key.Remark, CreatedAt: key.CreatedAt.Format("2006-01-02 15:04:05"), }) } resp = &types.AIApiKeyListResponse{ List: list, Total: total, } return resp, nil } func maskKey(key string) string { if len(key) <= 10 { return "sk-***" } return key[:6] + "..." + key[len(key)-4:] }