/**
  * @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;
 }
Example #2
0
 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')]);
 }