/** * @param Request $request * @param CmfDbModel $model * @param string $inputNamePrefix - input name prefix * For example if you use '_ids' instead of 'ids' - use prefix '_' * @return array|Response * @throws \PeskyCMF\Scaffold\ScaffoldException * @throws \PeskyCMF\PeskyCmfException * @throws \PeskyORM\Exception\DbQueryException * @throws \PeskyORM\Exception\DbException * @throws \PeskyORM\Exception\DbTableConfigException * @throws \PeskyORM\Exception\DbUtilsException * @throws \PeskyORM\Exception\DbModelException */ private function getConditionsForBulkActions(Request $request, CmfDbModel $model, $inputNamePrefix = '') { $specialConditions = $this->getScaffoldConfig()->getFormConfig()->getSpecialConditions(); $conditions = $specialConditions; $idsField = $inputNamePrefix . 'ids'; $conditionsField = $inputNamePrefix . 'conditions'; if ($request->has($idsField)) { $this->validate($request->data(), [$idsField => 'required|array', $idsField . '.*' => 'integer|min:1']); $conditions[$model->getPkColumnName()] = $request->data($idsField); } else { if ($request->has($conditionsField)) { $this->validate($request->data(), [$conditionsField => 'string|regex:%^[\\{\\[].*[\\}\\]]$%s']); $encodedConditions = $request->data($conditionsField) !== '' ? json_decode($request->data($conditionsField), true) : []; if ($encodedConditions === false || !is_array($encodedConditions) || empty($encodedConditions['r'])) { return cmfJsonResponseForValidationErrors([$conditionsField => 'JSON expected']); } if (!empty($encodedConditions)) { $dataGridConfig = $this->getScaffoldConfig()->getDataGridConfig(); $filterConditions = $this->getScaffoldConfig()->getDataGridFilterConfig()->buildConditionsFromSearchRules($encodedConditions); if ($dataGridConfig->hasContains()) { $subQueryConditions = array_merge(['CONTAIN' => $dataGridConfig->getContains()], $filterConditions, $specialConditions); $subQuery = $model->builder()->fromOptions($model->resolveContains($subQueryConditions))->fields(['id'])->buildQuery(DbExpr::create("`{$model->getAlias()}`.`id`"), false, false); $conditions = [DbExpr::create("`{$model->getPkColumnName()}` IN ({$subQuery})")]; } else { $conditions = array_merge($filterConditions, $specialConditions); } } } else { return cmfJsonResponseForValidationErrors([$idsField => 'List of items IDs of filtering conditions expected', $conditionsField => 'List of items IDs of filtering conditions expected']); } } return $conditions; }
public function replacePassword(Request $request, $accessKey) { $this->validate($request->data(), ['id' => 'required|integer|min:1', 'password' => 'required|min:6', 'password_confirm' => 'required|min:6|same:password']); $user = $this->getUserFromPasswordRecoveryAccessKey($accessKey); if (!empty($user) && $user->_getPkValue() !== $request->data('id')) { /** @var CmfDbObject $user */ $user->begin()->_setFieldValue('password', $request->data('password')); if ($user->commit()) { return cmfServiceJsonResponse()->setMessage(CmfConfig::transCustom('.replace_password.password_replaced'))->setRedirect(route(CmfConfig::getInstance()->login_route())); } else { return cmfServiceJsonResponse(HttpCode::SERVER_ERROR)->setMessage(CmfConfig::transCustom('.replace_password.failed_to_save')); } } else { return cmfServiceJsonResponse(HttpCode::FORBIDDEN)->setMessage(CmfConfig::transCustom('.replace_password.invalid_access_key'))->setRedirect(route(CmfConfig::getInstance()->login_route())); } }
public function updateItem(Request $request) { $model = self::getModel(); if (!$this->getScaffoldConfig()->isEditAllowed()) { return response()->json(['_message' => CmfConfig::transBase('.action.edit.forbidden'), 'redirect' => 'back', 'redirect_fallback' => route('cmf_items_table', [$model->getTableName()])], HttpCode::FORBIDDEN); } $formConfig = $this->getScaffoldConfig()->getFormConfig(); $expectedFields = array_keys($formConfig->getFields()); $expectedFields[] = $model->getPkColumnName(); $data = array_intersect_key($request->data(), array_flip($expectedFields)); $errors = $formConfig->validateDataForEdit($data); if (!empty($errors)) { return response()->json(['_message' => CmfConfig::transBase('.form.validation_errors'), 'errors' => $errors], HttpCode::INVALID); } if (!$request->data($model->getPkColumnName())) { return self::sendItemNotFoundResponse($model); } $id = $request->data($model->getPkColumnName()); $object = $model->getOwnDbObject(); if (!$object->_getPkField()->isValidValueFormat($id)) { return self::sendItemNotFoundResponse($model); } $conditions = $formConfig->getSpecialConditions(); $conditions[$model->getPkColumnName()] = $id; if (!$object->find($conditions)->exists()) { return self::sendItemNotFoundResponse($model); } if (!$this->getScaffoldConfig()->isRecordEditAllowed($object->toPublicArrayWithoutFiles())) { return response()->json(['_message' => CmfConfig::transBase('.action.edit.forbidden_for_record'), 'redirect' => 'back', 'redirect_fallback' => route('cmf_items_table', [$model->getTableName()])], HttpCode::FORBIDDEN); } $data = $formConfig->beforeSave(false, $data); if ($formConfig->shouldRevalidateDataAfterBeforeSaveCallback(false)) { // revalidate $errors = $formConfig->validateDataForCreate($data); if (!empty($errors)) { return response()->json(['_message' => CmfConfig::transBase('.form.validation_errors'), 'errors' => $errors], HttpCode::INVALID); } } unset($data[$model->getPkColumnName()]); if (!empty($data)) { try { $success = $object->begin()->updateValues($data)->commit(); if (!$success) { return response()->json(['_message' => CmfConfig::transBase('.form.failed_to_save_data')], HttpCode::SERVER_ERROR); } } catch (DbObjectValidationException $exc) { return response()->json(['_message' => CmfConfig::transBase('.form.validation_errors'), 'errors' => $exc->getValidationErrors()], HttpCode::INVALID); } } return response()->json(['_message' => CmfConfig::transBase('.form.resource_updated_successfully')]); }