Browse Source

Message notification settings

moell 11 months ago
parent
commit
2dc8567a41

+ 42 - 2
app/Http/Controllers/API/ConfigController.php

@@ -5,6 +5,7 @@ namespace App\Http\Controllers\API;
 use App\Http\Controllers\Controller;
 use App\Http\Requests\API\Config\AllowSettingConfig;
 use App\Models\Config;
+use App\Models\Enums\ConfigGroup;
 use App\Models\Enums\ObjectAction;
 use Illuminate\Http\Request;
 
@@ -55,6 +56,13 @@ class ConfigController extends Controller
     {
         $relations = ObjectAction::messageNotificationItems();
 
+        $settingResult = Config::query()
+            ->where("group", ConfigGroup::MESSAGE_NOTIFICATION)
+            ->where("key", "setting")
+            ->first();
+
+        $setting = $settingResult ? json_decode($settingResult->value, true) : [];
+
         $items = [];
         foreach ($relations as $group => $relation) {
             $item = [
@@ -72,12 +80,12 @@ class ConfigController extends Controller
 
                 $item['email'] = [
                     ...$actionItem,
-                    'checked' => true,
+                    'checked' => in_array($action->value, $setting['email'] ?? []),
                 ];
 
                 $item['browser'] = [
                     ...$actionItem,
-                    'checked' => true,
+                    'checked' => in_array($action->value, $setting['browser'] ?? []),
                 ];
             }
 
@@ -88,4 +96,36 @@ class ConfigController extends Controller
             'data' => $items
         ]);
     }
+
+    public function storeMessageNotificationSetting(Request $request)
+    {
+        $relations = ObjectAction::messageNotificationItems();
+
+        $settings = [];
+        foreach ($request->all() as $group => $items) {
+            if (! isset($relations[$group])) {
+                return $this->badRequest(sprintf("Group '%s' does not exist", $group));
+            }
+
+            foreach(['email', 'browser'] as $settingItem) {
+                foreach ($items[$settingItem] as $item) {
+                    $action = ObjectAction::tryFrom($item);
+                    if (! in_array($action, $relations[$group])) {
+                        return $this->badRequest(sprintf("In group '%s', '%s' exists", $group, $item));
+                    }
+                }
+            }
+
+            $settings[$group] = $items;
+        }
+
+        Config::query()->updateOrCreate([
+            'group' => ConfigGroup::MESSAGE_NOTIFICATION,
+            'key' => 'setting',
+        ], [
+            'value' => json_encode($settings),
+        ]);
+
+        return $this->noContent();
+    }
 }

+ 10 - 0
app/Models/Enums/ConfigGroup.php

@@ -0,0 +1,10 @@
+<?php
+
+namespace App\Models\Enums;
+
+enum ConfigGroup: string
+{
+    case EMAIL = "email";
+
+    case MESSAGE_NOTIFICATION = "message_notification";
+}

+ 28 - 0
database/migrations/2024_04_06_215057_change_value_to_configs_table.php

@@ -0,0 +1,28 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     */
+    public function up(): void
+    {
+        Schema::table('configs', function (Blueprint $table) {
+            $table->text("value")->nullable()->change();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     */
+    public function down(): void
+    {
+        Schema::table('configs', function (Blueprint $table) {
+            $table->string("value")->nullable()->change();
+        });
+    }
+};

+ 2 - 0
routes/api.php

@@ -26,6 +26,8 @@ Route::middleware(['auth:sanctum'])->group(function () {
         Route::post("config-setting", [API\ConfigController::class, "setting"])->name("config.setting");
         Route::get("config/message-notification-setting", [API\ConfigController::class, "messageNotificationSetting"])
             ->name("config.message-notification-setting");
+        Route::post("config/message-notification-setting", [API\ConfigController::class, "storeMessageNotificationSetting"])
+            ->name("config.store-message-notification-setting");
     });
 
     Route::middleware(['permission'])->group(function() {