feat: add independent load_factor field for scheduling load calculation

- Separate load factor from concurrency: concurrency controls actual
  slot acquisition, load_factor controls load rate calculation
- Add EffectiveLoadFactor() method: LoadFactor > Concurrency > 1
- Add load_factor field to Create/Edit/BulkEdit account forms
- Fix RPM default value: auto-fill 15 when RPM enabled but not set
- Fix stale test compilation errors in server and handler packages
This commit is contained in:
erio
2026-03-06 03:42:24 +08:00
parent c746964936
commit 440c3f46a7
34 changed files with 602 additions and 86 deletions

View File

@@ -1096,6 +1096,14 @@ func (s *stubAccountRepo) UpdateExtra(ctx context.Context, id int64, updates map
return errors.New("not implemented")
}
func (s *stubAccountRepo) IncrementQuotaUsed(ctx context.Context, id int64, amount float64) error {
return errors.New("not implemented")
}
func (s *stubAccountRepo) ResetQuotaUsed(ctx context.Context, id int64) error {
return errors.New("not implemented")
}
func (s *stubAccountRepo) BulkUpdate(ctx context.Context, ids []int64, updates service.AccountBulkUpdate) (int64, error) {
s.bulkUpdateIDs = append([]int64{}, ids...)
return int64(len(ids)), nil
@@ -1617,10 +1625,6 @@ func (r *stubUsageLogRepo) GetGroupStatsWithFilters(ctx context.Context, startTi
return nil, errors.New("not implemented")
}
func (r *stubUsageLogRepo) GetGroupStatsWithFilters(ctx context.Context, startTime, endTime time.Time, userID, apiKeyID, accountID, groupID int64, stream *bool, billingType *int8) ([]usagestats.GroupStat, error) {
return nil, errors.New("not implemented")
}
func (r *stubUsageLogRepo) GetAPIKeyUsageTrend(ctx context.Context, startTime, endTime time.Time, granularity string, limit int) ([]usagestats.APIKeyUsageTrendPoint, error) {
return nil, errors.New("not implemented")
}

View File

@@ -1,36 +0,0 @@
//go:build unit
package server
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestExtractOrigin(t *testing.T) {
tests := []struct {
name string
input string
want string
}{
{"empty string", "", ""},
{"whitespace only", " ", ""},
{"valid https", "https://pay.example.com/checkout", "https://pay.example.com"},
{"valid http", "http://pay.example.com/checkout", "http://pay.example.com"},
{"https with port", "https://pay.example.com:8443/checkout", "https://pay.example.com:8443"},
{"protocol-relative //host", "//pay.example.com/path", ""},
{"no scheme", "pay.example.com/path", ""},
{"ftp scheme rejected", "ftp://pay.example.com/file", ""},
{"empty host after parse", "https:///path", ""},
{"invalid url", "://bad url", ""},
{"only scheme", "https://", ""},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := extractOrigin(tt.input)
assert.Equal(t, tt.want, got)
})
}
}