ConfigController.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. <?php
  2. namespace App\Http\Controllers\API;
  3. use App\Http\Controllers\Controller;
  4. use App\Http\Requests\API\Config\AllowSettingConfig;
  5. use App\Models\Config;
  6. use App\Models\Enums\ConfigGroup;
  7. use App\Models\Enums\ObjectAction;
  8. use Illuminate\Http\Request;
  9. class ConfigController extends Controller
  10. {
  11. public function index(Request $request)
  12. {
  13. $groups = $request->get("group", []);
  14. $data = [];
  15. if ($groups) {
  16. $data = Config::query()->whereIn("group", $groups)->get([
  17. 'group', 'key', 'value'
  18. ])->groupBy("group");
  19. }
  20. return $this->success([
  21. 'data' => $data
  22. ]);
  23. }
  24. public function setting(Request $request)
  25. {
  26. $allowSettingConfig = new AllowSettingConfig();
  27. foreach ($request->all() as $item) {
  28. try {
  29. $allowSettingConfig->check($item['group'], $item['key'], $item['value']);
  30. } catch (\Exception $exception) {
  31. return $this->forbidden($exception->getMessage());
  32. }
  33. }
  34. foreach ($request->all() as $item) {
  35. Config::query()->updateOrCreate([
  36. 'group' => $item['group'],
  37. 'key' => $item['key'],
  38. ], [
  39. 'value' => $item['value']
  40. ]);
  41. }
  42. return $this->noContent();
  43. }
  44. public function messageNotificationSetting()
  45. {
  46. $relations = ObjectAction::messageNotificationItems();
  47. $settingResult = Config::query()
  48. ->where("group", ConfigGroup::MESSAGE_NOTIFICATION)
  49. ->where("key", "setting")
  50. ->first();
  51. $setting = $settingResult ? json_decode($settingResult->value, true) : [];
  52. $items = [];
  53. foreach ($relations as $group => $relation) {
  54. $item = [
  55. 'group_key' => $group,
  56. 'group_name' => __("action-labels.object_type." . $group),
  57. 'email' => [],
  58. 'browser' => [],
  59. ];
  60. foreach ($relation as $action) {
  61. $actionItem = [
  62. 'key' => $action->value,
  63. 'name' => __("action-labels.label." . $action->value),
  64. ];
  65. $item['email'][] = [
  66. ...$actionItem,
  67. 'checked' => in_array($action->value, $setting[$group]['email'] ?? []),
  68. ];
  69. $item['browser'][] = [
  70. ...$actionItem,
  71. 'checked' => in_array($action->value, $setting[$group]['browser'] ?? []),
  72. ];
  73. }
  74. $items[] = $item;
  75. }
  76. return $this->success([
  77. 'data' => $items
  78. ]);
  79. }
  80. public function storeMessageNotificationSetting(Request $request)
  81. {
  82. $relations = ObjectAction::messageNotificationItems();
  83. $settings = [];
  84. foreach ($request->all() as $group => $items) {
  85. if (! isset($relations[$group])) {
  86. return $this->badRequest(sprintf("Group '%s' does not exist", $group));
  87. }
  88. foreach(['email', 'browser'] as $settingItem) {
  89. foreach ($items[$settingItem] as $item) {
  90. $action = ObjectAction::tryFrom($item);
  91. if (! in_array($action, $relations[$group])) {
  92. return $this->badRequest(sprintf("In group '%s', '%s' exists", $group, $item));
  93. }
  94. }
  95. }
  96. $settings[$group] = $items;
  97. }
  98. Config::query()->updateOrCreate([
  99. 'group' => ConfigGroup::MESSAGE_NOTIFICATION,
  100. 'key' => 'setting',
  101. ], [
  102. 'value' => json_encode($settings),
  103. ]);
  104. return $this->noContent();
  105. }
  106. }