|
|
@@ -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'],
|
|
|
- ];
|
|
|
}
|