Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
陈曦
sub2api
Commits
1ef3782d
Unverified
Commit
1ef3782d
authored
Apr 11, 2026
by
Wesley Liddick
Committed by
GitHub
Apr 11, 2026
Browse files
Merge pull request #1538 from IanShaw027/fix/bug-cleanup-main
fix: 修复多个 UI 和功能问题 - 表格排序搜索、导出逻辑、分页配置和状态筛选
parents
00c08c57
f480e573
Changes
117
Expand all
Show whitespace changes
Inline
Side-by-side
backend/internal/service/domain_constants.go
View file @
1ef3782d
...
...
@@ -143,6 +143,8 @@ const (
SettingKeyHideCcsImportButton
=
"hide_ccs_import_button"
// 是否隐藏 API Keys 页面的导入 CCS 按钮
SettingKeyPurchaseSubscriptionEnabled
=
"purchase_subscription_enabled"
// 是否展示"购买订阅"页面入口
SettingKeyPurchaseSubscriptionURL
=
"purchase_subscription_url"
// "购买订阅"页面 URL(作为 iframe src)
SettingKeyTableDefaultPageSize
=
"table_default_page_size"
// 表格默认每页条数
SettingKeyTablePageSizeOptions
=
"table_page_size_options"
// 表格可选每页条数(JSON 数组)
SettingKeyCustomMenuItems
=
"custom_menu_items"
// 自定义菜单项(JSON 数组)
SettingKeyCustomEndpoints
=
"custom_endpoints"
// 自定义端点列表(JSON 数组)
...
...
backend/internal/service/openai_ws_ratelimit_signal_test.go
View file @
1ef3782d
...
...
@@ -492,7 +492,7 @@ func TestAdminService_ListAccounts_ExhaustedCodexExtraReturnsRateLimitedAccount(
}
svc
:=
&
adminServiceImpl
{
accountRepo
:
repo
}
accounts
,
total
,
err
:=
svc
.
ListAccounts
(
context
.
Background
(),
1
,
20
,
PlatformOpenAI
,
AccountTypeOAuth
,
""
,
""
,
0
,
""
)
accounts
,
total
,
err
:=
svc
.
ListAccounts
(
context
.
Background
(),
1
,
20
,
PlatformOpenAI
,
AccountTypeOAuth
,
""
,
""
,
0
,
""
,
""
,
""
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
int64
(
1
),
total
)
require
.
Len
(
t
,
accounts
,
1
)
...
...
backend/internal/service/setting_service.go
View file @
1ef3782d
...
...
@@ -9,6 +9,7 @@ import (
"fmt"
"log/slog"
"net/url"
"sort"
"strconv"
"strings"
"sync/atomic"
...
...
@@ -161,6 +162,8 @@ func (s *SettingService) GetPublicSettings(ctx context.Context) (*PublicSettings
SettingKeyHideCcsImportButton
,
SettingKeyPurchaseSubscriptionEnabled
,
SettingKeyPurchaseSubscriptionURL
,
SettingKeyTableDefaultPageSize
,
SettingKeyTablePageSizeOptions
,
SettingKeyCustomMenuItems
,
SettingKeyCustomEndpoints
,
SettingKeyLinuxDoConnectEnabled
,
...
...
@@ -200,6 +203,10 @@ func (s *SettingService) GetPublicSettings(ctx context.Context) (*PublicSettings
registrationEmailSuffixWhitelist
:=
ParseRegistrationEmailSuffixWhitelist
(
settings
[
SettingKeyRegistrationEmailSuffixWhitelist
],
)
tableDefaultPageSize
,
tablePageSizeOptions
:=
parseTablePreferences
(
settings
[
SettingKeyTableDefaultPageSize
],
settings
[
SettingKeyTablePageSizeOptions
],
)
return
&
PublicSettings
{
RegistrationEnabled
:
settings
[
SettingKeyRegistrationEnabled
]
==
"true"
,
...
...
@@ -221,6 +228,8 @@ func (s *SettingService) GetPublicSettings(ctx context.Context) (*PublicSettings
HideCcsImportButton
:
settings
[
SettingKeyHideCcsImportButton
]
==
"true"
,
PurchaseSubscriptionEnabled
:
settings
[
SettingKeyPurchaseSubscriptionEnabled
]
==
"true"
,
PurchaseSubscriptionURL
:
strings
.
TrimSpace
(
settings
[
SettingKeyPurchaseSubscriptionURL
]),
TableDefaultPageSize
:
tableDefaultPageSize
,
TablePageSizeOptions
:
tablePageSizeOptions
,
CustomMenuItems
:
settings
[
SettingKeyCustomMenuItems
],
CustomEndpoints
:
settings
[
SettingKeyCustomEndpoints
],
LinuxDoOAuthEnabled
:
linuxDoEnabled
,
...
...
@@ -270,6 +279,8 @@ func (s *SettingService) GetPublicSettingsForInjection(ctx context.Context) (any
HideCcsImportButton
bool
`json:"hide_ccs_import_button"`
PurchaseSubscriptionEnabled
bool
`json:"purchase_subscription_enabled"`
PurchaseSubscriptionURL
string
`json:"purchase_subscription_url,omitempty"`
TableDefaultPageSize
int
`json:"table_default_page_size"`
TablePageSizeOptions
[]
int
`json:"table_page_size_options"`
CustomMenuItems
json
.
RawMessage
`json:"custom_menu_items"`
CustomEndpoints
json
.
RawMessage
`json:"custom_endpoints"`
LinuxDoOAuthEnabled
bool
`json:"linuxdo_oauth_enabled"`
...
...
@@ -297,6 +308,8 @@ func (s *SettingService) GetPublicSettingsForInjection(ctx context.Context) (any
HideCcsImportButton
:
settings
.
HideCcsImportButton
,
PurchaseSubscriptionEnabled
:
settings
.
PurchaseSubscriptionEnabled
,
PurchaseSubscriptionURL
:
settings
.
PurchaseSubscriptionURL
,
TableDefaultPageSize
:
settings
.
TableDefaultPageSize
,
TablePageSizeOptions
:
settings
.
TablePageSizeOptions
,
CustomMenuItems
:
filterUserVisibleMenuItems
(
settings
.
CustomMenuItems
),
CustomEndpoints
:
safeRawJSONArray
(
settings
.
CustomEndpoints
),
LinuxDoOAuthEnabled
:
settings
.
LinuxDoOAuthEnabled
,
...
...
@@ -522,6 +535,16 @@ func (s *SettingService) UpdateSettings(ctx context.Context, settings *SystemSet
updates
[
SettingKeyHideCcsImportButton
]
=
strconv
.
FormatBool
(
settings
.
HideCcsImportButton
)
updates
[
SettingKeyPurchaseSubscriptionEnabled
]
=
strconv
.
FormatBool
(
settings
.
PurchaseSubscriptionEnabled
)
updates
[
SettingKeyPurchaseSubscriptionURL
]
=
strings
.
TrimSpace
(
settings
.
PurchaseSubscriptionURL
)
tableDefaultPageSize
,
tablePageSizeOptions
:=
normalizeTablePreferences
(
settings
.
TableDefaultPageSize
,
settings
.
TablePageSizeOptions
,
)
updates
[
SettingKeyTableDefaultPageSize
]
=
strconv
.
Itoa
(
tableDefaultPageSize
)
tablePageSizeOptionsJSON
,
err
:=
json
.
Marshal
(
tablePageSizeOptions
)
if
err
!=
nil
{
return
fmt
.
Errorf
(
"marshal table page size options: %w"
,
err
)
}
updates
[
SettingKeyTablePageSizeOptions
]
=
string
(
tablePageSizeOptionsJSON
)
updates
[
SettingKeyCustomMenuItems
]
=
settings
.
CustomMenuItems
updates
[
SettingKeyCustomEndpoints
]
=
settings
.
CustomEndpoints
...
...
@@ -875,6 +898,8 @@ func (s *SettingService) InitializeDefaultSettings(ctx context.Context) error {
SettingKeySiteLogo
:
""
,
SettingKeyPurchaseSubscriptionEnabled
:
"false"
,
SettingKeyPurchaseSubscriptionURL
:
""
,
SettingKeyTableDefaultPageSize
:
"20"
,
SettingKeyTablePageSizeOptions
:
"[10,20,50,100]"
,
SettingKeyCustomMenuItems
:
"[]"
,
SettingKeyCustomEndpoints
:
"[]"
,
SettingKeyOIDCConnectEnabled
:
"false"
,
...
...
@@ -946,6 +971,10 @@ func (s *SettingService) parseSettings(settings map[string]string) *SystemSettin
CustomEndpoints
:
settings
[
SettingKeyCustomEndpoints
],
BackendModeEnabled
:
settings
[
SettingKeyBackendModeEnabled
]
==
"true"
,
}
result
.
TableDefaultPageSize
,
result
.
TablePageSizeOptions
=
parseTablePreferences
(
settings
[
SettingKeyTableDefaultPageSize
],
settings
[
SettingKeyTablePageSizeOptions
],
)
// 解析整数类型
if
port
,
err
:=
strconv
.
Atoi
(
settings
[
SettingKeySMTPPort
]);
err
==
nil
{
...
...
@@ -1221,6 +1250,50 @@ func parseDefaultSubscriptions(raw string) []DefaultSubscriptionSetting {
return
normalized
}
func
parseTablePreferences
(
defaultPageSizeRaw
,
optionsRaw
string
)
(
int
,
[]
int
)
{
defaultPageSize
:=
20
if
v
,
err
:=
strconv
.
Atoi
(
strings
.
TrimSpace
(
defaultPageSizeRaw
));
err
==
nil
{
defaultPageSize
=
v
}
var
options
[]
int
if
strings
.
TrimSpace
(
optionsRaw
)
!=
""
{
_
=
json
.
Unmarshal
([]
byte
(
optionsRaw
),
&
options
)
}
return
normalizeTablePreferences
(
defaultPageSize
,
options
)
}
func
normalizeTablePreferences
(
defaultPageSize
int
,
options
[]
int
)
(
int
,
[]
int
)
{
const
minPageSize
=
5
const
maxPageSize
=
1000
const
fallbackPageSize
=
20
seen
:=
make
(
map
[
int
]
struct
{},
len
(
options
))
normalizedOptions
:=
make
([]
int
,
0
,
len
(
options
))
for
_
,
option
:=
range
options
{
if
option
<
minPageSize
||
option
>
maxPageSize
{
continue
}
if
_
,
ok
:=
seen
[
option
];
ok
{
continue
}
seen
[
option
]
=
struct
{}{}
normalizedOptions
=
append
(
normalizedOptions
,
option
)
}
sort
.
Ints
(
normalizedOptions
)
if
defaultPageSize
<
minPageSize
||
defaultPageSize
>
maxPageSize
{
defaultPageSize
=
fallbackPageSize
}
if
len
(
normalizedOptions
)
==
0
{
normalizedOptions
=
[]
int
{
10
,
20
,
50
}
}
return
defaultPageSize
,
normalizedOptions
}
// getStringOrDefault 获取字符串值或默认值
func
(
s
*
SettingService
)
getStringOrDefault
(
settings
map
[
string
]
string
,
key
,
defaultValue
string
)
string
{
if
value
,
ok
:=
settings
[
key
];
ok
&&
value
!=
""
{
...
...
backend/internal/service/setting_service_public_test.go
View file @
1ef3782d
...
...
@@ -62,3 +62,18 @@ func TestSettingService_GetPublicSettings_ExposesRegistrationEmailSuffixWhitelis
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
[]
string
{
"@example.com"
,
"@foo.bar"
},
settings
.
RegistrationEmailSuffixWhitelist
)
}
func
TestSettingService_GetPublicSettings_ExposesTablePreferences
(
t
*
testing
.
T
)
{
repo
:=
&
settingPublicRepoStub
{
values
:
map
[
string
]
string
{
SettingKeyTableDefaultPageSize
:
"50"
,
SettingKeyTablePageSizeOptions
:
"[20,50,100]"
,
},
}
svc
:=
NewSettingService
(
repo
,
&
config
.
Config
{})
settings
,
err
:=
svc
.
GetPublicSettings
(
context
.
Background
())
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
50
,
settings
.
TableDefaultPageSize
)
require
.
Equal
(
t
,
[]
int
{
20
,
50
,
100
},
settings
.
TablePageSizeOptions
)
}
backend/internal/service/setting_service_update_test.go
View file @
1ef3782d
...
...
@@ -202,3 +202,24 @@ func TestParseDefaultSubscriptions_NormalizesValues(t *testing.T) {
{
GroupID
:
12
,
ValidityDays
:
MaxValidityDays
},
},
got
)
}
func
TestSettingService_UpdateSettings_TablePreferences
(
t
*
testing
.
T
)
{
repo
:=
&
settingUpdateRepoStub
{}
svc
:=
NewSettingService
(
repo
,
&
config
.
Config
{})
err
:=
svc
.
UpdateSettings
(
context
.
Background
(),
&
SystemSettings
{
TableDefaultPageSize
:
50
,
TablePageSizeOptions
:
[]
int
{
20
,
50
,
100
},
})
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
"50"
,
repo
.
updates
[
SettingKeyTableDefaultPageSize
])
require
.
Equal
(
t
,
"[20,50,100]"
,
repo
.
updates
[
SettingKeyTablePageSizeOptions
])
err
=
svc
.
UpdateSettings
(
context
.
Background
(),
&
SystemSettings
{
TableDefaultPageSize
:
1000
,
TablePageSizeOptions
:
[]
int
{
20
,
100
},
})
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
"1000"
,
repo
.
updates
[
SettingKeyTableDefaultPageSize
])
require
.
Equal
(
t
,
"[20,100]"
,
repo
.
updates
[
SettingKeyTablePageSizeOptions
])
}
backend/internal/service/settings_view.go
View file @
1ef3782d
...
...
@@ -66,6 +66,8 @@ type SystemSettings struct {
HideCcsImportButton
bool
PurchaseSubscriptionEnabled
bool
PurchaseSubscriptionURL
string
TableDefaultPageSize
int
TablePageSizeOptions
[]
int
CustomMenuItems
string
// JSON array of custom menu items
CustomEndpoints
string
// JSON array of custom endpoints
...
...
@@ -132,6 +134,8 @@ type PublicSettings struct {
PurchaseSubscriptionEnabled
bool
PurchaseSubscriptionURL
string
TableDefaultPageSize
int
TablePageSizeOptions
[]
int
CustomMenuItems
string
// JSON array of custom menu items
CustomEndpoints
string
// JSON array of custom endpoints
...
...
frontend/package.json
View file @
1ef3782d
...
...
@@ -18,7 +18,7 @@
"@lobehub/icons"
:
"^4.0.2"
,
"@tanstack/vue-virtual"
:
"^3.13.23"
,
"@vueuse/core"
:
"^10.7.0"
,
"axios"
:
"^1.1
3.5
"
,
"axios"
:
"^1.1
5.0
"
,
"chart.js"
:
"^4.4.1"
,
"dompurify"
:
"^3.3.1"
,
"driver.js"
:
"^1.4.0"
,
...
...
frontend/pnpm-lock.yaml
View file @
1ef3782d
This diff is collapsed.
Click to expand it.
frontend/src/api/admin/accounts.ts
View file @
1ef3782d
...
...
@@ -38,6 +38,8 @@ export async function list(
search
?:
string
privacy_mode
?:
string
lite
?:
string
sort_by
?:
string
sort_order
?:
'
asc
'
|
'
desc
'
},
options
?:
{
signal
?:
AbortSignal
...
...
@@ -71,6 +73,8 @@ export async function listWithEtag(
search
?:
string
privacy_mode
?:
string
lite
?:
string
sort_by
?:
string
sort_order
?:
'
asc
'
|
'
desc
'
},
options
?:
{
signal
?:
AbortSignal
...
...
@@ -500,7 +504,11 @@ export async function exportData(options?: {
platform
?:
string
type
?:
string
status
?:
string
group
?:
string
privacy_mode
?:
string
search
?:
string
sort_by
?:
string
sort_order
?:
'
asc
'
|
'
desc
'
}
includeProxies
?:
boolean
}):
Promise
<
AdminDataPayload
>
{
...
...
@@ -508,11 +516,15 @@ export async function exportData(options?: {
if
(
options
?.
ids
&&
options
.
ids
.
length
>
0
)
{
params
.
ids
=
options
.
ids
.
join
(
'
,
'
)
}
else
if
(
options
?.
filters
)
{
const
{
platform
,
type
,
status
,
search
}
=
options
.
filters
const
{
platform
,
type
,
status
,
group
,
privacy_mode
,
search
,
sort_by
,
sort_order
}
=
options
.
filters
if
(
platform
)
params
.
platform
=
platform
if
(
type
)
params
.
type
=
type
if
(
status
)
params
.
status
=
status
if
(
group
)
params
.
group
=
group
if
(
privacy_mode
)
params
.
privacy_mode
=
privacy_mode
if
(
search
)
params
.
search
=
search
if
(
sort_by
)
params
.
sort_by
=
sort_by
if
(
sort_order
)
params
.
sort_order
=
sort_order
}
if
(
options
?.
includeProxies
===
false
)
{
params
.
include_proxies
=
'
false
'
...
...
frontend/src/api/admin/announcements.ts
View file @
1ef3782d
...
...
@@ -17,10 +17,16 @@ export async function list(
filters
?:
{
status
?:
string
search
?:
string
sort_by
?:
string
sort_order
?:
'
asc
'
|
'
desc
'
},
options
?:
{
signal
?:
AbortSignal
}
):
Promise
<
BasePaginationResponse
<
Announcement
>>
{
const
{
data
}
=
await
apiClient
.
get
<
BasePaginationResponse
<
Announcement
>>
(
'
/admin/announcements
'
,
{
params
:
{
page
,
page_size
:
pageSize
,
...
filters
}
params
:
{
page
,
page_size
:
pageSize
,
...
filters
},
signal
:
options
?.
signal
})
return
data
}
...
...
@@ -49,11 +55,21 @@ export async function getReadStatus(
id
:
number
,
page
:
number
=
1
,
pageSize
:
number
=
20
,
search
:
string
=
''
filters
?:
{
search
?:
string
sort_by
?:
string
sort_order
?:
'
asc
'
|
'
desc
'
},
options
?:
{
signal
?:
AbortSignal
}
):
Promise
<
BasePaginationResponse
<
AnnouncementUserReadStatus
>>
{
const
{
data
}
=
await
apiClient
.
get
<
BasePaginationResponse
<
AnnouncementUserReadStatus
>>
(
`/admin/announcements/
${
id
}
/read-status`
,
{
params
:
{
page
,
page_size
:
pageSize
,
search
}
}
{
params
:
{
page
,
page_size
:
pageSize
,
...
filters
},
signal
:
options
?.
signal
}
)
return
data
}
...
...
@@ -68,4 +84,3 @@ const announcementsAPI = {
}
export
default
announcementsAPI
frontend/src/api/admin/channels.ts
View file @
1ef3782d
...
...
@@ -83,6 +83,8 @@ export async function list(
filters
?:
{
status
?:
string
search
?:
string
sort_by
?:
string
sort_order
?:
'
asc
'
|
'
desc
'
},
options
?:
{
signal
?:
AbortSignal
}
):
Promise
<
PaginatedResponse
<
Channel
>>
{
...
...
frontend/src/api/admin/groups.ts
View file @
1ef3782d
...
...
@@ -27,6 +27,8 @@ export async function list(
status
?:
'
active
'
|
'
inactive
'
is_exclusive
?:
boolean
search
?:
string
sort_by
?:
string
sort_order
?:
'
asc
'
|
'
desc
'
},
options
?:
{
signal
?:
AbortSignal
...
...
frontend/src/api/admin/promo.ts
View file @
1ef3782d
...
...
@@ -17,10 +17,16 @@ export async function list(
filters
?:
{
status
?:
string
search
?:
string
sort_by
?:
string
sort_order
?:
'
asc
'
|
'
desc
'
},
options
?:
{
signal
?:
AbortSignal
}
):
Promise
<
BasePaginationResponse
<
PromoCode
>>
{
const
{
data
}
=
await
apiClient
.
get
<
BasePaginationResponse
<
PromoCode
>>
(
'
/admin/promo-codes
'
,
{
params
:
{
page
,
page_size
:
pageSize
,
...
filters
}
params
:
{
page
,
page_size
:
pageSize
,
...
filters
},
signal
:
options
?.
signal
})
return
data
}
...
...
frontend/src/api/admin/proxies.ts
View file @
1ef3782d
...
...
@@ -29,6 +29,8 @@ export async function list(
protocol
?:
string
status
?:
'
active
'
|
'
inactive
'
search
?:
string
sort_by
?:
string
sort_order
?:
'
asc
'
|
'
desc
'
},
options
?:
{
signal
?:
AbortSignal
...
...
@@ -227,16 +229,20 @@ export async function exportData(options?: {
protocol
?:
string
status
?:
'
active
'
|
'
inactive
'
search
?:
string
sort_by
?:
string
sort_order
?:
'
asc
'
|
'
desc
'
}
}):
Promise
<
AdminDataPayload
>
{
const
params
:
Record
<
string
,
string
>
=
{}
if
(
options
?.
ids
&&
options
.
ids
.
length
>
0
)
{
params
.
ids
=
options
.
ids
.
join
(
'
,
'
)
}
else
if
(
options
?.
filters
)
{
const
{
protocol
,
status
,
search
}
=
options
.
filters
const
{
protocol
,
status
,
search
,
sort_by
,
sort_order
}
=
options
.
filters
if
(
protocol
)
params
.
protocol
=
protocol
if
(
status
)
params
.
status
=
status
if
(
search
)
params
.
search
=
search
if
(
sort_by
)
params
.
sort_by
=
sort_by
if
(
sort_order
)
params
.
sort_order
=
sort_order
}
const
{
data
}
=
await
apiClient
.
get
<
AdminDataPayload
>
(
'
/admin/proxies/data
'
,
{
params
})
return
data
...
...
frontend/src/api/admin/redeem.ts
View file @
1ef3782d
...
...
@@ -25,6 +25,8 @@ export async function list(
type
?:
RedeemCodeType
status
?:
'
active
'
|
'
used
'
|
'
expired
'
|
'
unused
'
search
?:
string
sort_by
?:
string
sort_order
?:
'
asc
'
|
'
desc
'
},
options
?:
{
signal
?:
AbortSignal
...
...
@@ -151,7 +153,10 @@ export async function getStats(): Promise<{
*/
export
async
function
exportCodes
(
filters
?:
{
type
?:
RedeemCodeType
status
?:
'
active
'
|
'
used
'
|
'
expired
'
status
?:
'
used
'
|
'
expired
'
|
'
unused
'
search
?:
string
sort_by
?:
string
sort_order
?:
'
asc
'
|
'
desc
'
}):
Promise
<
Blob
>
{
const
response
=
await
apiClient
.
get
(
'
/admin/redeem-codes/export
'
,
{
params
:
filters
,
...
...
frontend/src/api/admin/settings.ts
View file @
1ef3782d
...
...
@@ -40,6 +40,8 @@ export interface SystemSettings {
hide_ccs_import_button
:
boolean
purchase_subscription_enabled
:
boolean
purchase_subscription_url
:
string
table_default_page_size
:
number
table_page_size_options
:
number
[]
backend_mode_enabled
:
boolean
custom_menu_items
:
CustomMenuItem
[]
custom_endpoints
:
CustomEndpoint
[]
...
...
@@ -138,6 +140,8 @@ export interface UpdateSettingsRequest {
hide_ccs_import_button
?:
boolean
purchase_subscription_enabled
?:
boolean
purchase_subscription_url
?:
string
table_default_page_size
?:
number
table_page_size_options
?:
number
[]
backend_mode_enabled
?:
boolean
custom_menu_items
?:
CustomMenuItem
[]
custom_endpoints
?:
CustomEndpoint
[]
...
...
frontend/src/api/admin/usage.ts
View file @
1ef3782d
...
...
@@ -81,6 +81,8 @@ export interface AdminUsageQueryParams extends UsageQueryParams {
user_id
?:
number
exact_total
?:
boolean
billing_mode
?:
string
sort_by
?:
string
sort_order
?:
'
asc
'
|
'
desc
'
}
// ==================== API Functions ====================
...
...
frontend/src/api/admin/users.ts
View file @
1ef3782d
...
...
@@ -24,6 +24,8 @@ export async function list(
group_name
?:
string
// fuzzy filter by allowed group name
attributes
?:
Record
<
number
,
string
>
// attributeId -> value
include_subscriptions
?:
boolean
sort_by
?:
string
sort_order
?:
'
asc
'
|
'
desc
'
},
options
?:
{
signal
?:
AbortSignal
...
...
@@ -37,7 +39,9 @@ export async function list(
role
:
filters
?.
role
,
search
:
filters
?.
search
,
group_name
:
filters
?.
group_name
,
include_subscriptions
:
filters
?.
include_subscriptions
include_subscriptions
:
filters
?.
include_subscriptions
,
sort_by
:
filters
?.
sort_by
,
sort_order
:
filters
?.
sort_order
}
// Add attribute filters as attr[id]=value
...
...
frontend/src/api/keys.ts
View file @
1ef3782d
...
...
@@ -17,7 +17,13 @@ import type { ApiKey, CreateApiKeyRequest, UpdateApiKeyRequest, PaginatedRespons
export
async
function
list
(
page
:
number
=
1
,
pageSize
:
number
=
10
,
filters
?:
{
search
?:
string
;
status
?:
string
;
group_id
?:
number
|
string
},
filters
?:
{
search
?:
string
status
?:
string
group_id
?:
number
|
string
sort_by
?:
string
sort_order
?:
'
asc
'
|
'
desc
'
},
options
?:
{
signal
?:
AbortSignal
}
...
...
frontend/src/api/usage.ts
View file @
1ef3782d
...
...
@@ -91,7 +91,7 @@ export async function list(
* @returns Paginated list of usage logs
*/
export
async
function
query
(
params
:
UsageQueryParams
,
params
:
UsageQueryParams
&
{
sort_by
?:
string
;
sort_order
?:
'
asc
'
|
'
desc
'
}
,
config
:
{
signal
?:
AbortSignal
}
=
{}
):
Promise
<
PaginatedResponse
<
UsageLog
>>
{
const
{
data
}
=
await
apiClient
.
get
<
PaginatedResponse
<
UsageLog
>>
(
'
/usage
'
,
{
...
...
Prev
1
2
3
4
5
6
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment