|
@@ -147,6 +147,7 @@ class CharController extends Controller
|
|
|
'msg' => 'Items successfully sent.'
|
|
'msg' => 'Items successfully sent.'
|
|
|
], 200);
|
|
], 200);
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* Получение всех данных персонажа из указанной таблицы.
|
|
* Получение всех данных персонажа из указанной таблицы.
|
|
@@ -157,26 +158,21 @@ class CharController extends Controller
|
|
|
*/
|
|
*/
|
|
|
public function GetCharacterData($char_id, $table_name)
|
|
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);
|
|
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);
|
|
return response()->json(['code' => -2, 'msg' => 'Character not found.'], 404);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // Получаем данные
|
|
|
$data = $modelClass::where($key, $char_id)->get();
|
|
$data = $modelClass::where($key, $char_id)->get();
|
|
|
|
|
|
|
|
if ($data->isEmpty()) {
|
|
if ($data->isEmpty()) {
|
|
@@ -185,8 +181,93 @@ class CharController extends Controller
|
|
|
|
|
|
|
|
return response()->json([
|
|
return response()->json([
|
|
|
'code' => 0,
|
|
'code' => 0,
|
|
|
- 'msg' => 'Data successfully received.',
|
|
|
|
|
|
|
+ 'msg' => 'Data successfully received.',
|
|
|
'data' => $data
|
|
'data' => $data
|
|
|
], 200);
|
|
], 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'],
|
|
|
|
|
+ ];
|
|
|
}
|
|
}
|