simple_mode_admin_concurrency.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package repository
  2. import (
  3. "context"
  4. "fmt"
  5. "time"
  6. dbent "github.com/Wei-Shaw/sub2api/ent"
  7. "github.com/Wei-Shaw/sub2api/ent/setting"
  8. dbuser "github.com/Wei-Shaw/sub2api/ent/user"
  9. "github.com/Wei-Shaw/sub2api/internal/service"
  10. )
  11. const (
  12. simpleModeAdminConcurrencyUpgradeKey = "simple_mode_admin_concurrency_upgraded_30"
  13. simpleModeLegacyAdminConcurrency = 5
  14. simpleModeTargetAdminConcurrency = 30
  15. )
  16. func ensureSimpleModeAdminConcurrency(ctx context.Context, client *dbent.Client) error {
  17. if client == nil {
  18. return fmt.Errorf("nil ent client")
  19. }
  20. upgraded, err := client.Setting.Query().Where(setting.KeyEQ(simpleModeAdminConcurrencyUpgradeKey)).Exist(ctx)
  21. if err != nil {
  22. return fmt.Errorf("check admin concurrency upgrade marker: %w", err)
  23. }
  24. if upgraded {
  25. return nil
  26. }
  27. if _, err := client.User.Update().
  28. Where(
  29. dbuser.RoleIn(service.RoleAdmin, service.RoleSuperAdmin),
  30. dbuser.ConcurrencyEQ(simpleModeLegacyAdminConcurrency),
  31. ).
  32. SetConcurrency(simpleModeTargetAdminConcurrency).
  33. Save(ctx); err != nil {
  34. return fmt.Errorf("upgrade simple mode admin concurrency: %w", err)
  35. }
  36. now := time.Now()
  37. if err := client.Setting.Create().
  38. SetKey(simpleModeAdminConcurrencyUpgradeKey).
  39. SetValue(now.Format(time.RFC3339)).
  40. SetUpdatedAt(now).
  41. OnConflictColumns(setting.FieldKey).
  42. UpdateNewValues().
  43. Exec(ctx); err != nil {
  44. return fmt.Errorf("persist admin concurrency upgrade marker: %w", err)
  45. }
  46. return nil
  47. }