SaddleActions.vala 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. using Inversion;
  2. using Spry;
  3. using Spry.Authentication;
  4. using Statum;
  5. using ClankerSaddle.Services;
  6. namespace ClankerSaddle {
  7. /** Sealed saddle id carried by the saddle row actions. */
  8. public class SaddleActionPrivate : Object {
  9. public int64 saddle_id { get; set; }
  10. }
  11. /**
  12. * Registers a saddle container (admin-only): name plus the host:port
  13. * of its control server.
  14. */
  15. public class RegisterSaddleAction : StatumAction {
  16. private SaddleService saddles = inject<SaddleService>();
  17. private UserService users = inject<UserService>();
  18. public override async DirectiveBuilder handle() throws GLib.Error {
  19. var guard = yield SpryAuth.require_permission(directives(), request, users,
  20. SpryAuth.ADMIN_PERMISSION, "/login");
  21. if (guard != null) {
  22. return (!)guard;
  23. }
  24. string name = Forms.field(request, "name");
  25. string host = Forms.field(request, "host");
  26. if (name.length == 0 || host.length == 0) {
  27. return directives().notify("error", "Name and host are required").navigate("/saddles");
  28. }
  29. try {
  30. var registration = yield saddles.register_saddle(name, host);
  31. return directives().notify("success",
  32. @"Saddle '$(registration.saddle.name)' registered — API token $(registration.token)")
  33. .navigate("/saddles");
  34. } catch (Error e) {
  35. return directives().notify("error", @"Could not register the saddle: $(e.message)").navigate("/saddles");
  36. }
  37. }
  38. }
  39. /**
  40. * Removes a saddle registration (admin-only); a task it was still
  41. * running is re-queued.
  42. */
  43. public class UnregisterSaddleAction : TypedStatumAction<SaddleActionPrivate> {
  44. private SaddleService saddles = inject<SaddleService>();
  45. private TaskService tasks = inject<TaskService>();
  46. private UserService users = inject<UserService>();
  47. protected override Type private_type { get { return typeof(SaddleActionPrivate); } }
  48. public override async DirectiveBuilder handle() throws GLib.Error {
  49. var guard = yield SpryAuth.require_permission(directives(), request, users,
  50. SpryAuth.ADMIN_PERMISSION, "/login");
  51. if (guard != null) {
  52. return (!)guard;
  53. }
  54. var ctx = request_private;
  55. if (ctx == null) {
  56. return directives().navigate("/saddles");
  57. }
  58. try {
  59. yield saddles.abort_saddle_session(tasks, ((!)ctx).saddle_id, "saddle removed");
  60. yield saddles.unregister_saddle(((!)ctx).saddle_id);
  61. return directives().notify("success", "Saddle removed").navigate("/saddles");
  62. } catch (Error e) {
  63. return directives().notify("error", @"Could not remove the saddle: $(e.message)").navigate("/saddles");
  64. }
  65. }
  66. }
  67. /**
  68. * Probes a saddle's control server and refreshes its registered
  69. * status (idle, busy or offline) — the manual counterpart of the
  70. * dispatcher's polling.
  71. */
  72. /**
  73. * Saves a saddle's git identity (`git_name` / `git_email`): the
  74. * name/email the daemon commits as — sent with every assignment as
  75. * `git_identity`; empty values clear the fields so the daemon's
  76. * fallback identity applies.
  77. */
  78. public class UpdateSaddleIdentityAction : TypedStatumAction<SaddleActionPrivate> {
  79. private SaddleService saddles = inject<SaddleService>();
  80. private UserService users = inject<UserService>();
  81. protected override Type private_type { get { return typeof(SaddleActionPrivate); } }
  82. public override async DirectiveBuilder handle() throws GLib.Error {
  83. var guard = yield SpryAuth.require_permission(directives(), request, users,
  84. SpryAuth.ADMIN_PERMISSION, "/login");
  85. if (guard != null) {
  86. return (!)guard;
  87. }
  88. var ctx = request_private;
  89. if (ctx == null) {
  90. return directives().navigate("/saddles");
  91. }
  92. try {
  93. yield saddles.update_git_identity(((!)ctx).saddle_id,
  94. Forms.optional(request, "git_name"),
  95. Forms.optional(request, "git_email"));
  96. return directives().notify("success", "Git identity saved").navigate("/saddles");
  97. } catch (Error e) {
  98. return directives().notify("error", @"Could not save the identity: $(e.message)")
  99. .navigate("/saddles");
  100. }
  101. }
  102. }
  103. public class RefreshSaddleStatusAction : TypedStatumAction<SaddleActionPrivate> {
  104. private SaddleService saddles = inject<SaddleService>();
  105. private UserService users = inject<UserService>();
  106. protected override Type private_type { get { return typeof(SaddleActionPrivate); } }
  107. public override async DirectiveBuilder handle() throws GLib.Error {
  108. var guard = yield SpryAuth.require_permission(directives(), request, users,
  109. SpryAuth.ADMIN_PERMISSION, "/login");
  110. if (guard != null) {
  111. return (!)guard;
  112. }
  113. var ctx = request_private;
  114. if (ctx == null) {
  115. return directives().navigate("/saddles");
  116. }
  117. try {
  118. yield saddles.refresh_saddle_status(((!)ctx).saddle_id);
  119. return directives().notify("success", "Saddle status refreshed").navigate("/saddles");
  120. } catch (Error e) {
  121. return directives().notify("error", @"Could not refresh the saddle: $(e.message)").navigate("/saddles");
  122. }
  123. }
  124. }
  125. }