Răsfoiți Sursa

метод обновления данных персонажа и рефакторинг

ilg2005 4 luni în urmă
părinte
comite
e3ff98dead
2 a modificat fișierele cu 96 adăugiri și 14 ștergeri
  1. 95 14
      app/Http/Controllers/CharController.php
  2. 1 0
      routes/api.php

+ 95 - 14
app/Http/Controllers/CharController.php

@@ -147,6 +147,7 @@ class CharController extends Controller
             'msg' => 'Items successfully sent.'
         ], 200);
     }
+    
 
     /**
      * Получение всех данных персонажа из указанной таблицы.
@@ -157,26 +158,21 @@ class CharController extends Controller
      */
     public function GetCharacterData($char_id, $table_name)
     {
-        // Белый список доступных моделей/таблиц
-        $allowed_tables = [
-            'CharBase' => ['key' => 'DBKey', 'model' => CharBase::class],
-            'CharItem' => ['key' => 'Owner', 'model' => CharItem::class],
-            'CharFellow' => ['key' => 'Owner', 'model' => CharFellow::class],
-        ];
-
-        if (!array_key_exists($table_name, $allowed_tables)) {
+        // Получаем конфигурацию таблицы через приватный метод
+        $config = $this->resolveTable($table_name);
+        if (!$config) {
             return response()->json(['code' => -1, 'msg' => 'Table not allowed or does not exist.'], 400);
         }
 
-        $modelClass = $allowed_tables[$table_name]['model'];
-        $key = $allowed_tables[$table_name]['key'];
+        $modelClass = $config['model'];
+        $key        = $config['key'];
 
-        // Проверка, существует ли персонаж в CharBase
-        $character = CharBase::find($char_id);
-        if (!$character) {
+        // Проверяем существование персонажа
+        if (!CharBase::find($char_id)) {
             return response()->json(['code' => -2, 'msg' => 'Character not found.'], 404);
         }
 
+        // Получаем данные
         $data = $modelClass::where($key, $char_id)->get();
 
         if ($data->isEmpty()) {
@@ -185,8 +181,93 @@ class CharController extends Controller
 
         return response()->json([
             'code' => 0,
-            'msg' => 'Data successfully received.',
+            'msg'  => 'Data successfully received.',
             'data' => $data
         ], 200);
     }
+
+
+    /**
+     * Обновление данных персонажа в указанной таблице.
+     *
+     * @param Request $request
+     * @param int $char_id
+     * @param string $table_name
+     * @return \Illuminate\Http\JsonResponse
+     */
+    public function UpdateCharacterData(Request $request, $char_id, $table_name)
+    {
+        // 1. Получаем конфигурацию таблицы из константы
+        $config = $this->resolveTable($table_name);
+        if (!$config) {
+            return response()->json(['code' => -1, 'msg' => 'Table not allowed or does not exist.'], 400);
+        }
+
+        $modelClass  = $config['model'];
+        $ownerKey    = $config['key'];
+        $primaryKey  = $config['pk'];
+
+        // 2. Определяем, какую запись обновляем
+        if ($table_name === 'CharBase') {
+            $model = $modelClass::find($char_id);
+        } else {
+            $recordId = $request->input($primaryKey);
+            if (!$recordId) {
+                return response()->json(['code' => -4, 'msg' => "Primary key '$primaryKey' is required for this table."], 400);
+            }
+            $model = $modelClass::find($recordId);
+        }
+
+        if (!$model) {
+            return response()->json(['code' => -2, 'msg' => 'Record not found.'], 404);
+        }
+
+        // Проверяем принадлежность записи персонажу
+        if ($model->{$ownerKey} != $char_id) {
+            return response()->json(['code' => -5, 'msg' => 'Record does not belong to the character.'], 403);
+        }
+
+        // 3. Подготавливаем данные к обновлению – защищаем PK и владение
+        $data = $request->except([$primaryKey, $ownerKey, 'DBKey', 'Owner']);
+
+        // 4. Фильтруем только разрешённые к массовому присвоению поля
+        $fillable      = $model->getFillable();
+        $filteredData  = array_intersect_key($data, array_flip($fillable));
+
+        if (empty($filteredData)) {
+            return response()->json(['code' => -6, 'msg' => 'No valid fields to update.'], 400);
+        }
+
+        // 5. Обновляем запись и возвращаем свежие данные
+        $model->update($filteredData);
+
+        return response()->json([
+            'code' => 0,
+            'msg'  => 'Data successfully updated.',
+            'data' => $model->fresh()
+        ], 200);
+    }
+
+
+    /**
+     * Возвращает конфигурацию таблицы или null, если таблица не разрешена.
+     *
+     * @param string $table
+     * @return array|null
+     */
+    private function resolveTable(string $table): ?array
+    {
+        return self::TABLES[$table] ?? null;
+    }
+
+
+    /**
+     * Белый список доступных для обновления таблиц.
+     * Используется в resolveTable(), GetCharacterData(), UpdateCharacterData().
+     */
+    private const TABLES = [
+        'CharBase'   => ['key' => 'DBKey',  'model' => CharBase::class,   'pk' => 'DBKey'],
+        'CharItem'   => ['key' => 'Owner',  'model' => CharItem::class,   'pk' => 'CharItemID'],
+        'CharFellow' => ['key' => 'Owner',  'model' => CharFellow::class, 'pk' => 'FellowID'],
+    ];
 }

+ 1 - 0
routes/api.php

@@ -32,6 +32,7 @@ Route::group(['prefix'=>'api'], function(){
     Route::get('GetAllCharacters', 'CharController@GetAllCharacters');
     Route::get('GetUserCharacters/{username}', 'CharController@GetUserCharacters');
     Route::get('GetCharacterData/{char_id}/{table_name}', 'CharController@GetCharacterData');
+    Route::post('UpdateCharacterData/{char_id}/{table_name}', 'CharController@UpdateCharacterData');
     Route::post('SendItemToCharacter', 'CharController@SendItemToCharacter');
 
     Route::group(['prefix'=>'funcs_adm'], function(){