findDataboxById($databox_id); switch ($errorMsg = $request->query->get('error')) { case 'file-error': $errorMsg = $this->app->trans('Error while sending the file'); break; case 'file-invalid': $errorMsg = $this->app->trans('Invalid file format'); break; case 'file-too-big': $errorMsg = $this->app->trans('The file is too big'); break; } return $this->render('admin/databox/databox.html.twig', [ 'databox' => $databox, 'showDetail' => (int)$request->query->get("sta") < 1, 'errorMsg' => $errorMsg, 'reloadTree' => $request->query->get('reload-tree') === '1' ]); } /** * Get databox CGU's * * @param integer $databox_id The requested databox * @return Response */ public function getDatabaseCGU($databox_id) { return $this->render('admin/databox/cgus.html.twig', [ 'languages' => $this->app['locales.available'], 'cgus' => $this->findDataboxById($databox_id)->get_cgus(), 'current_locale' => $this->app['locale'], ]); } /** * Delete a databox * * @param Request $request The current HTTP request * @param integer $databox_id The requested databox * @return JsonResponse|RedirectResponse */ public function deleteBase(Request $request, $databox_id) { $databox = null; $success = false; $msg = $this->app->trans('An error occured'); try { $databox = $this->findDataboxById($databox_id); if ($databox->get_record_amount() > 0) { $msg = $this->app->trans('admin::base: vider la base avant de la supprimer'); } else { $databox->unmount_databox(); $this->getApplicationBox()->write_databox_pic( $this->app['media-alchemyst'], $this->app['filesystem'], $databox, null, \databox::PIC_PDF ); $databox->delete(); $success = true; $msg = $this->app->trans('Successful removal'); } } catch (\Exception $e) { } if (!$databox) { $this->app->abort(404, $this->app->trans('admin::base: databox not found', ['databox_id' => $databox_id])); } if ('json' === $request->getRequestFormat()) { return $this->app->json([ 'success' => $success, 'msg' => $msg, 'sbas_id' => $databox->get_sbas_id() ]); } $params = [ 'databox_id' => $databox->get_sbas_id(), 'success' => (int) $success, ]; if ($databox->get_record_amount() > 0) { $params['error'] = 'databox-not-empty'; } return $this->app->redirectPath('admin_database', $params); } public function setLabels(Request $request, $databox_id) { if (null === $labels = $request->request->get('labels')) { $this->app->abort(400, $this->app->trans('Missing labels parameter')); } if (false === is_array($labels)) { $this->app->abort(400, $this->app->trans('Invalid labels parameter')); } $databox = $this->findDataboxById($databox_id); $success = true; try { foreach ($this->app['locales.available'] as $code => $language) { if (!isset($labels[$code])) { continue; } $value = $labels[$code] ?: null; $databox->set_label($code, $value); } } catch (\Exception $e) { $success = false; } if ('json' === $request->getRequestFormat()) { return $this->app->json([ 'success' => $success, 'msg' => $success ? $this->app->trans('Successful update') : $this->app->trans('An error occured'), ]); } return $this->app->redirect(sprintf( '/admin/databox/%d/?success=%d&reload-tree=1', $databox->get_sbas_id(), (int) $success )); } /** * Reindex databox content * * @param Request $request The current HTTP request * @param integer $databox_id The requested databox * @return JsonResponse|RedirectResponse */ public function reindex(Request $request, $databox_id) { $success = false; try { $this->findDataboxById($databox_id)->reindex(); $success = true; } catch (\Exception $e) { } if ('json' === $request->getRequestFormat()) { return $this->app->json([ 'success' => $success, 'msg' => $success ? $this->app->trans('Successful update') : $this->app->trans('An error occured'), 'sbas_id' => $databox_id, ]); } return $this->app->redirectPath('admin_database', [ 'databox_id' => $databox_id, 'success' => (int) $success, ]); } /** * Make a databox indexable * * @param Request $request The current HTTP request * @param integer $databox_id The requested databox * @return JsonResponse|RedirectResponse */ public function setIndexable(Request $request, $databox_id) { $success = false; try { $databox = $this->findDataboxById($databox_id); $indexable = !!$request->request->get('indexable', false); $this->getApplicationBox()->set_databox_indexable($databox, $indexable); $success = true; } catch (\Exception $e) { } if ('json' === $request->getRequestFormat()) { return $this->app->json([ 'success' => $success, 'msg' => $success ? $this->app->trans('Successful update') : $this->app->trans('An error occured'), 'sbas_id' => $databox_id, ]); } return $this->app->redirectPath('admin_database', [ 'databox_id' => $databox_id, 'success' => (int) $success, ]); } /** * Update databox CGU's * * @param Request $request The current HTTP request * @param integer $databox_id The requested databox * @return RedirectResponse */ public function updateDatabaseCGU(Request $request, $databox_id) { $databox = $this->findDataboxById($databox_id); try { foreach ($request->request->get('TOU', []) as $loc => $terms) { $databox->update_cgus($loc, $terms, !!$request->request->get('valid', false)); } } catch (\Exception $e) { return $this->app->redirectPath('admin_database_display_cgus', [ 'databox_id' => $databox_id, 'success' => 0, ]); } return $this->app->redirectPath('admin_database_display_cgus', [ 'databox_id' => $databox_id, 'success' => 1, ]); } /** * Mount a collection on a databox * * @param Request $request The current HTTP request * @param integer $databox_id The requested databox * @param integer $collection_id The requested collection id * @return RedirectResponse */ public function mountCollection(Request $request, $databox_id, $collection_id) { $connection = $this->getApplicationBox()->get_connection(); $connection->beginTransaction(); try { /** @var Authenticator $authenticator */ $authenticator = $this->app->getAuthenticator(); $baseId = \collection::mount_collection( $this->app, $this->findDataboxById($databox_id), $collection_id, $authenticator->getUser() ); $othCollSel = (int) $request->request->get("othcollsel") ?: null; if (null !== $othCollSel) { $query = $this->createUserQuery(); $n = 0; /** @var ACLProvider $aclProvider */ $aclProvider = $this->app['acl']; while ($n < $query->on_base_ids([$othCollSel])->get_total()) { $results = $query->limit($n, 50)->execute()->get_results(); foreach ($results as $user) { $aclProvider->get($user)->duplicate_right_from_bas($othCollSel, $baseId); } $n += 50; } } $connection->commit(); return $this->app->redirectPath('admin_database', [ 'databox_id' => $databox_id, 'mount' => 'ok', ]); } catch (\Exception $e) { $connection->rollBack(); return $this->app->redirectPath('admin_database', [ 'databox_id' => $databox_id, 'mount' => 'ko', ]); } } /** * Set a new logo for a databox * * @param Request $request The current HTTP request * @param integer $databox_id The requested databox * @return RedirectResponse */ public function sendLogoPdf(Request $request, $databox_id) { try { if (null !== ($file = $request->files->get('newLogoPdf')) && $file->isValid()) { if ($file->getClientSize() < 65536) { $databox = $this->findDataboxById($databox_id); $this->getApplicationBox()->write_databox_pic( $this->app['media-alchemyst'], $this->app['filesystem'], $databox, $file, \databox::PIC_PDF ); unlink($file->getPathname()); return $this->app->redirectPath('admin_database', [ 'databox_id' => $databox_id, 'success' => '1', ]); } else { return $this->app->redirectPath('admin_database', [ 'databox_id' => $databox_id, 'success' => '0', 'error' => 'file-too-big', ]); } } else { return $this->app->redirectPath('admin_database', [ 'databox_id' => $databox_id, 'success' => '0', 'error' => 'file-invalid', ]); } } catch (\Exception $e) { return $this->app->redirectPath('admin_database', [ 'databox_id' => $databox_id, 'success' => '0', 'error' => 'file-error', ]); } } /** * Delete an existing logo for a databox * * @param Request $request The current HTTP request * @param integer $databox_id The requested databox * @return JsonResponse|RedirectResponse */ public function deleteLogoPdf(Request $request, $databox_id) { $success = false; try { $this->getApplicationBox()->write_databox_pic( $this->app['media-alchemyst'], $this->app['filesystem'], $this->findDataboxById($databox_id), null, \databox::PIC_PDF ); $success = true; } catch (\Exception $e) { } if ('json' === $request->getRequestFormat()) { return $this->app->json([ 'success' => $success, 'msg' => $success ? $this->app->trans('Successful removal') : $this->app->trans('An error occured'), 'sbas_id' => $databox_id, ]); } // TODO: Check whether html call is still valid return $this->app->redirectPath('admin_database', [ 'databox_id' => $databox_id, 'error' => 'file-too-big', ]); } /** * Clear databox logs * * @param Request $request The current HTTP request * @param integer $databox_id The requested databox * @return JsonResponse|RedirectResponse */ public function clearLogs(Request $request, $databox_id) { $success = false; try { $this->findDataboxById($databox_id)->clear_logs(); $success = true; } catch (\Exception $e) { } if ('json' === $request->getRequestFormat()) { return $this->app->json([ 'success' => $success, 'msg' => $success ? $this->app->trans('Successful update') : $this->app->trans('An error occured'), 'sbas_id' => $databox_id, ]); } // TODO: Check whether html call is still valid return $this->app->redirectPath('admin_database', [ 'databox_id' => $databox_id, 'error' => 'file-too-big', ]); } /** * Change the name of a databox * * @param Request $request The current HTTP request * @param integer $databox_id The requested databox * @return JsonResponse|RedirectResponse */ public function changeViewName(Request $request, $databox_id) { if (null === $viewName = $request->request->get('viewname')) { $this->app->abort(400, $this->app->trans('Missing view name parameter')); } $success = false; try { $this->findDataboxById($databox_id)->set_viewname($viewName); $success = true; } catch (\Exception $e) { } if ('json' === $request->getRequestFormat()) { return $this->app->json([ 'success' => $success, 'msg' => $success ? $this->app->trans('Successful update') : $this->app->trans('An error occured'), 'sbas_id' => $databox_id, ]); } // TODO: Check whether html call is still valid return $this->app->redirectPath('admin_database', [ 'databox_id' => $databox_id, 'error' => 'file-too-big', ]); } /** * Unmount a databox * * @param Request $request The current HTTP request * @param integer $databox_id The requested databox * @return JsonResponse|RedirectResponse */ public function unmountDatabase(Request $request, $databox_id) { $success = false; try { $databox = $this->findDataboxById($databox_id); $databox->unmount_databox(); $success = true; } catch (\Exception $e) { } if ('json' === $request->getRequestFormat()) { $msg = $success ? $this->app->trans('The publication has been stopped') : $this->app->trans('An error occured'); return $this->app->json([ 'success' => $success, 'msg' => $msg, 'sbas_id' => $databox_id ]); } return $this->app->redirectPath('admin_databases', [ 'reload-tree' => 1, ]); } /** * Empty a databox * * @param Request $request The current HTTP request * @param integer $databox_id The requested databox * @return JsonResponse|RedirectResponse */ public function emptyDatabase(Request $request, $databox_id) { $msg = $this->app->trans('An error occurred'); $success = false; $taskCreated = false; try { $databox = $this->findDataboxById($databox_id); foreach ($databox->get_collections() as $collection) { if ($collection->get_record_amount() <= 500) { $collection->empty_collection(500); } else { /** @var TaskManipulator $taskManipulator */ $taskManipulator = $this->app['manipulator.task']; $taskManipulator->createEmptyCollectionJob($collection); } } $msg = $this->app->trans('Base empty successful'); $success = true; if ($taskCreated) { $msg = $this->app->trans('A task has been created, please run it to complete empty collection'); } } catch (\Exception $e) { } if ('json' === $request->getRequestFormat()) { return $this->app->json([ 'success' => $success, 'msg' => $msg, 'sbas_id' => $databox_id, ]); } // TODO: Can this method be called as HTML? return $this->app->redirectPath('admin_database', [ 'databox_id' => $databox_id, 'error' => 'file-too-big', ]); } /** * Get number of indexed items for a databox * * @param Request $request The current HTTP request * @param integer $databox_id The requested databox * @return JsonResponse */ public function progressBarInfos(Request $request, $databox_id) { if (!$request->isXmlHttpRequest() || 'json' !== $request->getRequestFormat()) { $this->app->abort(400, $this->app->trans('Bad request format, only JSON is allowed')); } $appbox = $this->getApplicationBox(); $ret = [ 'success' => false, 'msg' => $this->app->trans('An error occured'), 'sbas_id' => null, 'indexable' => false, 'records' => 0, 'xml_indexed' => 0, 'thesaurus_indexed' => 0, 'viewname' => null, 'printLogoURL' => null, ]; try { $databox = $this->findDataboxById($databox_id); $data = $databox->get_indexed_record_amount(); $ret['indexable'] = $appbox->is_databox_indexable($databox); $ret['viewname'] = (($databox->get_dbname() == $databox->get_viewname()) ? $this->app->trans('admin::base: aucun alias') : $databox->get_viewname()); $ret['records'] = $databox->get_record_amount(); $ret['sbas_id'] = $databox_id; $ret['xml_indexed'] = $data['xml_indexed']; $ret['thesaurus_indexed'] = $data['thesaurus_indexed']; $ret['jeton_subdef'] = $data['jeton_subdef']; if ($this->app['filesystem']->exists($this->app['root.path'] . '/config/minilogos/logopdf_' . $databox_id . '.jpg')) { $ret['printLogoURL'] = '/custom/minilogos/logopdf_' . $databox_id . '.jpg'; } $ret['success'] = true; $ret['msg'] = $this->app->trans('Successful update'); } catch (\Exception $e) { } return $this->app->json($ret); } /** * Display page for reorder collections on a databox * * @param integer $databox_id The requested databox * @return Response */ public function getReorder($databox_id) { $acl = $this->getAclForUser(); return $this->render('admin/collection/reorder.html.twig', [ 'collections' => $acl->get_granted_base([], [$databox_id]), ]); } /** * Apply collection reorder changes * * @param Request $request The current HTTP request * @param integer $databox_id The requested databox * @return JsonResponse|RedirectResponse */ public function setReorder(Request $request, $databox_id) { try { foreach ($request->request->get('order', []) as $data) { $collection = \collection::getByBaseId($this->app, $data['id']); $collection->set_ord($data['offset']); } $success = true; } catch (\Exception $e) { $success = false; } if ('json' === $request->getRequestFormat()) { return $this->app->json([ 'success' => $success, 'msg' => $success ? $this->app->trans('Successful update') : $this->app->trans('An error occured'), 'sbas_id' => $databox_id, ]); } return $this->app->redirectPath('admin_database_display_collections_order', [ 'databox_id' => $databox_id, 'success' => (int) $success, ]); } /** * Display page to create a new collection * * @return Response */ public function getNewCollection() { return $this->render('admin/collection/create.html.twig'); } /** * Create a new collection * * @param Request $request The current HTTP request * @param integer $databox_id The requested databox * @return Response */ public function createCollection(Request $request, $databox_id) { if (($name = trim($request->request->get('name', ''))) === '') { return $this->app->redirectPath('admin_database_display_new_collection_form', [ 'databox_id' => $databox_id, 'error' => 'name', ]); } try { $databox = $this->findDataboxById($databox_id); $collection = \collection::create( $this->app, $databox, $this->getApplicationBox(), $name, $this->getAuthenticator()->getUser() ); if (($request->request->get('ccusrothercoll') === "on") && (null !== $othcollsel = $request->request->get('othcollsel'))) { $query = $this->createUserQuery(); $total = $query->on_base_ids([$othcollsel])->get_total(); $n = 0; while ($n < $total) { $results = $query->limit($n, 20)->execute()->get_results(); foreach ($results as $user) { $this->getAclForUser($user)->duplicate_right_from_bas($othcollsel, $collection->get_base_id()); } $n += 20; } } return $this->app->redirectPath('admin_display_collection', [ 'bas_id' => $collection->get_base_id(), 'success' => 1, 'reload-tree' => 1, ]); } catch (\Exception $e) { return $this->app->redirectPath('admin_database_submit_collection', [ 'databox_id' => $databox_id, 'error' => 'error', ]); } } /** * Display page to get some details on a appbox * * @param Request $request The current HTTP request * @param integer $databox_id The requested databox * @return Response */ public function getDetails(Request $request, $databox_id) { $databox = $this->findDataboxById($databox_id); $details = []; $total = ['total_subdefs' => 0, 'total_size' => 0]; foreach ($databox->get_record_details($request->query->get('sort')) as $collName => $colDetails) { $details[$collName] = [ 'total_subdefs' => 0, 'total_size' => 0, 'medias' => [] ]; foreach ($colDetails as $subdefName => $subdefDetails) { $details[$collName]['total_subdefs'] += $subdefDetails['n']; $total['total_subdefs'] += $subdefDetails['n']; $details[$collName]['total_size'] += $subdefDetails['siz']; $total['total_size'] += $subdefDetails['siz']; $details[$collName]['medias'][] = [ 'subdef_name' => $subdefName, 'total_subdefs' => $subdefDetails['n'], 'total_size' => $subdefDetails['siz'], ]; } } return $this->render('admin/databox/details.html.twig', [ 'databox' => $databox, 'table' => $details, 'total' => $total ]); } }