Răsfoiți Sursa

GetCharItem()/UpdateCharItem(),
общий _updateAndRespond()

ilg2005 4 luni în urmă
părinte
comite
68a7cabb1f
2 a modificat fișierele cu 98 adăugiri și 31 ștergeri
  1. 91 27
      app/Http/Controllers/CharController.php
  2. 7 4
      routes/api.php

+ 91 - 27
app/Http/Controllers/CharController.php

@@ -230,7 +230,93 @@ class CharController extends Controller
         // 3. Подготавливаем данные к обновлению – защищаем PK и владение
         $data = $request->except([$primaryKey, $ownerKey, 'DBKey', 'Owner', 'Account']);
 
-        // 4. Фильтруем поля для массового присвоения
+        // 4. Обновляем модель и возвращаем ответ
+        return $this->_updateAndRespond($model, $data);
+    }
+
+
+    /**
+     * Возвращает конфигурацию таблицы или 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'],
+    ];
+
+    /**
+     * Получить конкретный предмет по CharItemID.
+     *
+     * @param int $char_item_id
+     * @return \Illuminate\Http\JsonResponse
+     */
+    public function GetCharItem(int $char_item_id)
+    {
+        $item = CharItem::find($char_item_id);
+
+        if (!$item) {
+            return response()->json([
+                'code' => -2,
+                'msg'  => 'CharItem not found.'
+            ], 404);
+        }
+
+        return response()->json([
+            'code' => 0,
+            'msg'  => 'CharItem successfully received.',
+            'data' => $item,
+        ], 200);
+    }
+
+    /**
+     * Обновить конкретный предмет по CharItemID.
+     *
+     * @param \Illuminate\Http\Request $request
+     * @param int $char_item_id
+     * @return \Illuminate\Http\JsonResponse
+     */
+    public function UpdateCharItem(Request $request, int $char_item_id)
+    {
+        $item = CharItem::find($char_item_id);
+
+        if (!$item) {
+            return response()->json([
+                'code' => -2,
+                'msg'  => 'CharItem not found.'
+            ], 404);
+        }
+
+        // Определяем защищённые поля, которые нельзя обновлять
+        $protected = ['CharItemID', 'Owner', 'Account'];
+        $data = $request->except($protected);
+
+        return $this->_updateAndRespond($item, $data, 'CharItem successfully updated.');
+    }
+
+    /**
+     * Общий метод для обновления модели и формирования ответа.
+     *
+     * @param \Illuminate\Database\Eloquent\Model $model
+     * @param array $data
+     * @param string $successMsg
+     * @return \Illuminate\Http\JsonResponse
+     */
+    private function _updateAndRespond(\Illuminate\Database\Eloquent\Model $model, array $data, string $successMsg = 'Data successfully updated.')
+    {
+        // 1. Фильтруем поля для массового присвоения
         $fillable = $model->getFillable();
         $guarded = $model->getGuarded();
         
@@ -245,14 +331,14 @@ class CharController extends Controller
             $filteredData = array_diff_key($data, array_flip($guarded));
         }
 
-        // Конвертируем null-поля в '', чтобы вместо NULL в БД сохранялась пустая строка
+        // 2. Конвертируем null-поля в '', чтобы вместо NULL в БД сохранялась пустая строка
         $filteredData = array_map(static fn ($v) => $v === null ? '' : $v, $filteredData);
 
         if (empty($filteredData)) {
             return response()->json(['code' => -6, 'msg' => 'No valid fields to update.'], 400);
         }
 
-        // 5. Пытаемся обновить запись; если что-то пошло не так — отправляем ошибку
+        // 3. Пытаемся обновить запись
         try {
             $ok = $model->update($filteredData);
         } catch (\Throwable $e) {
@@ -270,33 +356,11 @@ class CharController extends Controller
             ], 500);
         }
 
+        // 4. Возвращаем успешный ответ
         return response()->json([
             'code' => 0,
-            'msg'  => 'Data successfully updated.',
+            'msg'  => $successMsg,
             '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'],
-    ];
 }

+ 7 - 4
routes/api.php

@@ -23,7 +23,7 @@ use Illuminate\Support\Facades\Route;
 |
 */
 
-Route::group(['prefix'=>'api'], function(){
+Route::group(['prefix' => 'api'], function () {
 
     Route::post('LoginAction', 'Auth\AuthController@LoginAccountActionPost');
     Route::post('ActionBanAccountUseHack', 'Auth\AntiHackController@ActionBanAccountUseHack');
@@ -35,17 +35,20 @@ Route::group(['prefix'=>'api'], function(){
     Route::post('UpdateCharacterData/{char_id}/{table_name}', 'CharController@UpdateCharacterData');
     Route::post('SendItemToCharacter', 'CharController@SendItemToCharacter');
 
-    Route::group(['prefix'=>'funcs_adm'], function(){
+    Route::get('GetCharItem/{char_item_id}', 'CharController@GetCharItem');
+    Route::post('UpdateCharItem/{char_item_id}', 'CharController@UpdateCharItem');
+
+    Route::group(['prefix' => 'funcs_adm'], function () {
         Route::get('UpdateCharItemAccount/{CharID?}', 'ADMIN\AdminController@UpdateCharItemAccount');
         Route::get('CheckCharItemAccount/{CharID?}/{StrRecordKind?}', 'ADMIN\AdminController@CheckCharItemAccount');
         Route::post('SendItemForAccount', 'ADMIN\AdminController@SendItemForAccount');
         Route::get('GetAccountsSpecialChar', 'ADMIN\AdminController@GetAccountsSpecialChar');
-        Route::get('GetPCID', 'ADMIN\AdminController@GetPCID');
+        Route::get('GetPCID', 'ADMIN\\AdminController@GetPCID');
     });
 
 });
 
-Route::group(['prefix'=>'nexon'], function(){
+Route::group(['prefix' => 'nexon'], function () {
     Route::get('loginCheck/loginCheck', 'Auth\AuthController@LoginAccountCheck');
     Route::post('inquiryBalance/json', 'Cash\CashShopController@inquiryBalance');
     Route::post('nexonCash/charge/json', 'Cash\CashShopController@nexonCash');