Skip to content

Commit 68d7ec9

Browse files
authored
Merge pull request Wei-Shaw#1220 from weak-fox/feat/account-privacy-mode-filter
feat: 管理员账号列表支持按 Privacy 状态筛选
2 parents 7537dce + 4838ab7 commit 68d7ec9

23 files changed

Lines changed: 168 additions & 34 deletions

backend/internal/handler/admin/account_data.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ func (h *AccountHandler) listAccountsFiltered(ctx context.Context, platform, acc
352352
pageSize := dataPageCap
353353
var out []service.Account
354354
for {
355-
items, total, err := h.adminService.ListAccounts(ctx, page, pageSize, platform, accountType, status, search, 0)
355+
items, total, err := h.adminService.ListAccounts(ctx, page, pageSize, platform, accountType, status, search, 0, "")
356356
if err != nil {
357357
return nil, err
358358
}

backend/internal/handler/admin/account_handler.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ func (h *AccountHandler) List(c *gin.Context) {
219219
accountType := c.Query("type")
220220
status := c.Query("status")
221221
search := c.Query("search")
222+
privacyMode := strings.TrimSpace(c.Query("privacy_mode"))
222223
// 标准化和验证 search 参数
223224
search = strings.TrimSpace(search)
224225
if len(search) > 100 {
@@ -244,7 +245,7 @@ func (h *AccountHandler) List(c *gin.Context) {
244245
}
245246
}
246247

247-
accounts, total, err := h.adminService.ListAccounts(c.Request.Context(), page, pageSize, platform, accountType, status, search, groupID)
248+
accounts, total, err := h.adminService.ListAccounts(c.Request.Context(), page, pageSize, platform, accountType, status, search, groupID, privacyMode)
248249
if err != nil {
249250
response.ErrorFrom(c, err)
250251
return
@@ -1936,7 +1937,7 @@ func (h *AccountHandler) BatchRefreshTier(c *gin.Context) {
19361937
accounts := make([]*service.Account, 0)
19371938

19381939
if len(req.AccountIDs) == 0 {
1939-
allAccounts, _, err := h.adminService.ListAccounts(ctx, 1, 10000, "gemini", "oauth", "", "", 0)
1940+
allAccounts, _, err := h.adminService.ListAccounts(ctx, 1, 10000, "gemini", "oauth", "", "", 0, "")
19401941
if err != nil {
19411942
response.ErrorFrom(c, err)
19421943
return

backend/internal/handler/admin/admin_service_stub_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ func (s *stubAdminService) BatchSetGroupRateMultipliers(_ context.Context, _ int
187187
return nil
188188
}
189189

190-
func (s *stubAdminService) ListAccounts(ctx context.Context, page, pageSize int, platform, accountType, status, search string, groupID int64) ([]service.Account, int64, error) {
190+
func (s *stubAdminService) ListAccounts(ctx context.Context, page, pageSize int, platform, accountType, status, search string, groupID int64, privacyMode string) ([]service.Account, int64, error) {
191191
return s.accounts, int64(len(s.accounts)), nil
192192
}
193193

backend/internal/handler/sora_client_handler_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2072,7 +2072,7 @@ func (r *stubAccountRepoForHandler) Delete(context.Context, int64) error
20722072
func (r *stubAccountRepoForHandler) List(context.Context, pagination.PaginationParams) ([]service.Account, *pagination.PaginationResult, error) {
20732073
return nil, nil, nil
20742074
}
2075-
func (r *stubAccountRepoForHandler) ListWithFilters(context.Context, pagination.PaginationParams, string, string, string, string, int64) ([]service.Account, *pagination.PaginationResult, error) {
2075+
func (r *stubAccountRepoForHandler) ListWithFilters(context.Context, pagination.PaginationParams, string, string, string, string, int64, string) ([]service.Account, *pagination.PaginationResult, error) {
20762076
return nil, nil, nil
20772077
}
20782078
func (r *stubAccountRepoForHandler) ListByGroup(context.Context, int64) ([]service.Account, error) {

backend/internal/handler/sora_gateway_handler_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ func (r *stubAccountRepo) Delete(ctx context.Context, id int64) error
130130
func (r *stubAccountRepo) List(ctx context.Context, params pagination.PaginationParams) ([]service.Account, *pagination.PaginationResult, error) {
131131
return nil, nil, nil
132132
}
133-
func (r *stubAccountRepo) ListWithFilters(ctx context.Context, params pagination.PaginationParams, platform, accountType, status, search string, groupID int64) ([]service.Account, *pagination.PaginationResult, error) {
133+
func (r *stubAccountRepo) ListWithFilters(ctx context.Context, params pagination.PaginationParams, platform, accountType, status, search string, groupID int64, privacyMode string) ([]service.Account, *pagination.PaginationResult, error) {
134134
return nil, nil, nil
135135
}
136136
func (r *stubAccountRepo) ListByGroup(ctx context.Context, groupID int64) ([]service.Account, error) {

backend/internal/repository/account_repo.go

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -443,10 +443,10 @@ func (r *accountRepository) Delete(ctx context.Context, id int64) error {
443443
}
444444

445445
func (r *accountRepository) List(ctx context.Context, params pagination.PaginationParams) ([]service.Account, *pagination.PaginationResult, error) {
446-
return r.ListWithFilters(ctx, params, "", "", "", "", 0)
446+
return r.ListWithFilters(ctx, params, "", "", "", "", 0, "")
447447
}
448448

449-
func (r *accountRepository) ListWithFilters(ctx context.Context, params pagination.PaginationParams, platform, accountType, status, search string, groupID int64) ([]service.Account, *pagination.PaginationResult, error) {
449+
func (r *accountRepository) ListWithFilters(ctx context.Context, params pagination.PaginationParams, platform, accountType, status, search string, groupID int64, privacyMode string) ([]service.Account, *pagination.PaginationResult, error) {
450450
q := r.client.Account.Query()
451451

452452
if platform != "" {
@@ -479,6 +479,20 @@ func (r *accountRepository) ListWithFilters(ctx context.Context, params paginati
479479
} else if groupID > 0 {
480480
q = q.Where(dbaccount.HasAccountGroupsWith(dbaccountgroup.GroupIDEQ(groupID)))
481481
}
482+
if privacyMode != "" {
483+
q = q.Where(dbpredicate.Account(func(s *entsql.Selector) {
484+
path := sqljson.Path("privacy_mode")
485+
switch privacyMode {
486+
case service.AccountPrivacyModeUnsetFilter:
487+
s.Where(entsql.Or(
488+
entsql.Not(sqljson.HasKey(dbaccount.FieldExtra, path)),
489+
sqljson.ValueEQ(dbaccount.FieldExtra, "", path),
490+
))
491+
default:
492+
s.Where(sqljson.ValueEQ(dbaccount.FieldExtra, privacyMode, path))
493+
}
494+
}))
495+
}
482496

483497
total, err := q.Count(ctx)
484498
if err != nil {

backend/internal/repository/account_repo_integration_test.go

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -208,15 +208,16 @@ func (s *AccountRepoSuite) TestList() {
208208

209209
func (s *AccountRepoSuite) TestListWithFilters() {
210210
tests := []struct {
211-
name string
212-
setup func(client *dbent.Client)
213-
platform string
214-
accType string
215-
status string
216-
search string
217-
groupID int64
218-
wantCount int
219-
validate func(accounts []service.Account)
211+
name string
212+
setup func(client *dbent.Client)
213+
platform string
214+
accType string
215+
status string
216+
search string
217+
groupID int64
218+
privacyMode string
219+
wantCount int
220+
validate func(accounts []service.Account)
220221
}{
221222
{
222223
name: "filter_by_platform",
@@ -281,6 +282,32 @@ func (s *AccountRepoSuite) TestListWithFilters() {
281282
s.Require().Empty(accounts[0].GroupIDs)
282283
},
283284
},
285+
{
286+
name: "filter_by_privacy_mode",
287+
setup: func(client *dbent.Client) {
288+
mustCreateAccount(s.T(), client, &service.Account{Name: "privacy-ok", Extra: map[string]any{"privacy_mode": service.PrivacyModeTrainingOff}})
289+
mustCreateAccount(s.T(), client, &service.Account{Name: "privacy-fail", Extra: map[string]any{"privacy_mode": service.PrivacyModeFailed}})
290+
},
291+
privacyMode: service.PrivacyModeTrainingOff,
292+
wantCount: 1,
293+
validate: func(accounts []service.Account) {
294+
s.Require().Equal("privacy-ok", accounts[0].Name)
295+
},
296+
},
297+
{
298+
name: "filter_by_privacy_mode_unset",
299+
setup: func(client *dbent.Client) {
300+
mustCreateAccount(s.T(), client, &service.Account{Name: "privacy-unset", Extra: nil})
301+
mustCreateAccount(s.T(), client, &service.Account{Name: "privacy-empty", Extra: map[string]any{"privacy_mode": ""}})
302+
mustCreateAccount(s.T(), client, &service.Account{Name: "privacy-set", Extra: map[string]any{"privacy_mode": service.PrivacyModeTrainingOff}})
303+
},
304+
privacyMode: service.AccountPrivacyModeUnsetFilter,
305+
wantCount: 2,
306+
validate: func(accounts []service.Account) {
307+
names := []string{accounts[0].Name, accounts[1].Name}
308+
s.ElementsMatch([]string{"privacy-unset", "privacy-empty"}, names)
309+
},
310+
},
284311
}
285312

286313
for _, tt := range tests {
@@ -293,7 +320,7 @@ func (s *AccountRepoSuite) TestListWithFilters() {
293320

294321
tt.setup(client)
295322

296-
accounts, _, err := repo.ListWithFilters(ctx, pagination.PaginationParams{Page: 1, PageSize: 10}, tt.platform, tt.accType, tt.status, tt.search, tt.groupID)
323+
accounts, _, err := repo.ListWithFilters(ctx, pagination.PaginationParams{Page: 1, PageSize: 10}, tt.platform, tt.accType, tt.status, tt.search, tt.groupID, tt.privacyMode)
297324
s.Require().NoError(err)
298325
s.Require().Len(accounts, tt.wantCount)
299326
if tt.validate != nil {
@@ -360,7 +387,7 @@ func (s *AccountRepoSuite) TestPreload_And_VirtualFields() {
360387
s.Require().Len(got.Groups, 1, "expected Groups to be populated")
361388
s.Require().Equal(group.ID, got.Groups[0].ID)
362389

363-
accounts, page, err := s.repo.ListWithFilters(s.ctx, pagination.PaginationParams{Page: 1, PageSize: 10}, "", "", "", "acc", 0)
390+
accounts, page, err := s.repo.ListWithFilters(s.ctx, pagination.PaginationParams{Page: 1, PageSize: 10}, "", "", "", "acc", 0, "")
364391
s.Require().NoError(err, "ListWithFilters")
365392
s.Require().Equal(int64(1), page.Total)
366393
s.Require().Len(accounts, 1)

backend/internal/server/api_contract_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -990,7 +990,7 @@ func (s *stubAccountRepo) List(ctx context.Context, params pagination.Pagination
990990
return nil, nil, errors.New("not implemented")
991991
}
992992

993-
func (s *stubAccountRepo) ListWithFilters(ctx context.Context, params pagination.PaginationParams, platform, accountType, status, search string, groupID int64) ([]service.Account, *pagination.PaginationResult, error) {
993+
func (s *stubAccountRepo) ListWithFilters(ctx context.Context, params pagination.PaginationParams, platform, accountType, status, search string, groupID int64, privacyMode string) ([]service.Account, *pagination.PaginationResult, error) {
994994
return nil, nil, errors.New("not implemented")
995995
}
996996

backend/internal/service/account_service.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ var (
1515
)
1616

1717
const AccountListGroupUngrouped int64 = -1
18+
const AccountPrivacyModeUnsetFilter = "__unset__"
1819

1920
type AccountRepository interface {
2021
Create(ctx context.Context, account *Account) error
@@ -37,7 +38,7 @@ type AccountRepository interface {
3738
Delete(ctx context.Context, id int64) error
3839

3940
List(ctx context.Context, params pagination.PaginationParams) ([]Account, *pagination.PaginationResult, error)
40-
ListWithFilters(ctx context.Context, params pagination.PaginationParams, platform, accountType, status, search string, groupID int64) ([]Account, *pagination.PaginationResult, error)
41+
ListWithFilters(ctx context.Context, params pagination.PaginationParams, platform, accountType, status, search string, groupID int64, privacyMode string) ([]Account, *pagination.PaginationResult, error)
4142
ListByGroup(ctx context.Context, groupID int64) ([]Account, error)
4243
ListActive(ctx context.Context) ([]Account, error)
4344
ListByPlatform(ctx context.Context, platform string) ([]Account, error)

backend/internal/service/account_service_delete_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ func (s *accountRepoStub) List(ctx context.Context, params pagination.Pagination
7979
panic("unexpected List call")
8080
}
8181

82-
func (s *accountRepoStub) ListWithFilters(ctx context.Context, params pagination.PaginationParams, platform, accountType, status, search string, groupID int64) ([]Account, *pagination.PaginationResult, error) {
82+
func (s *accountRepoStub) ListWithFilters(ctx context.Context, params pagination.PaginationParams, platform, accountType, status, search string, groupID int64, privacyMode string) ([]Account, *pagination.PaginationResult, error) {
8383
panic("unexpected ListWithFilters call")
8484
}
8585

0 commit comments

Comments
 (0)