From 3e933808d5bb783ff25e4d53ec421ff838221791 Mon Sep 17 00:00:00 2001 From: Samuel Tallet Date: Sat, 18 Jul 2020 23:10:28 +0200 Subject: [PATCH] Fix dot notation issue --- index.php | 2 +- routes.php | 30 ++++---- src/Controllers/CollectionController.php | 87 +++++++++++++++++++----- src/Controllers/DatabaseController.php | 50 +++++++++++--- static/js/mpg.collection.indexes.js | 49 ++++++++----- static/js/mpg.database.create.js | 11 ++- static/js/mpg.database.query.js | 62 +++++++++++------ 7 files changed, 209 insertions(+), 82 deletions(-) diff --git a/index.php b/index.php index 2bd2bd9..9cb7710 100644 --- a/index.php +++ b/index.php @@ -19,7 +19,7 @@ * * @var string */ -define('MPG_APP_VERSION', '0.9.8'); +define('MPG_APP_VERSION', '0.9.9'); /** * Development mode? diff --git a/routes.php b/routes.php index 9ea86d5..57728fb 100644 --- a/routes.php +++ b/routes.php @@ -21,43 +21,43 @@ DatabaseController::class . '@renderQueryViewAction' ); -$router->get( - '/ajax/database/{databaseName}/listCollections', +$router->post( + '/ajax/database/listCollections', DatabaseController::class . '@listCollectionsAction' ); -$router->get( - '/ajax/database/{databaseName}/createCollection/{collectionName}', +$router->post( + '/ajax/database/createCollection', DatabaseController::class . '@createCollectionAction' ); $router->post( - '/ajax/database/{databaseName}/collection/{collectionName}/insertOne', + '/ajax/collection/insertOne', CollectionController::class . '@insertOneAction' ); $router->post( - '/ajax/database/{databaseName}/collection/{collectionName}/count', + '/ajax/collection/count', CollectionController::class . '@countAction' ); $router->post( - '/ajax/database/{databaseName}/collection/{collectionName}/deleteOne', + '/ajax/collection/deleteOne', CollectionController::class . '@deleteOneAction' ); $router->post( - '/ajax/database/{databaseName}/collection/{collectionName}/find', + '/ajax/collection/find', CollectionController::class . '@findAction' ); $router->post( - '/ajax/database/{databaseName}/collection/{collectionName}/updateOne', + '/ajax/collection/updateOne', CollectionController::class . '@updateOneAction' ); -$router->get( - '/ajax/database/{databaseName}/collection/{collectionName}/enumFields', +$router->post( + '/ajax/collection/enumFields', CollectionController::class . '@enumFieldsAction' ); @@ -67,16 +67,16 @@ ); $router->post( - '/ajax/database/{databaseName}/collection/{collectionName}/createIndex', + '/ajax/collection/createIndex', CollectionController::class . '@createIndexAction' ); -$router->get( - '/ajax/database/{databaseName}/collection/{collectionName}/listIndexes', +$router->post( + '/ajax/collection/listIndexes', CollectionController::class . '@listIndexesAction' ); $router->post( - '/ajax/database/{databaseName}/collection/{collectionName}/dropIndex', + '/ajax/collection/dropIndex', CollectionController::class . '@dropIndexAction' ); diff --git a/src/Controllers/CollectionController.php b/src/Controllers/CollectionController.php index a0bbf4e..2379d8e 100644 --- a/src/Controllers/CollectionController.php +++ b/src/Controllers/CollectionController.php @@ -19,10 +19,9 @@ public function renderIndexesViewAction() : Response { /** * @see https://docs.mongodb.com/php-library/v1.6/reference/method/MongoDBCollection-insertOne/index.html */ - public function insertOneAction($databaseName, $collectionName) : Response { + public function insertOneAction() : Response { $mongoDBClient = MongoDBHelper::getClient(); - $collection = $mongoDBClient->selectCollection($databaseName, $collectionName); $requestBody = $this->getRequestBody(); @@ -36,6 +35,10 @@ public function insertOneAction($databaseName, $collectionName) : Response { return new Response(400, 'Request body is invalid.'); } + $collection = $mongoDBClient->selectCollection( + $decodedRequestBody['databaseName'], $decodedRequestBody['collectionName'] + ); + try { $insertOneResult = $collection->insertOne($decodedRequestBody['document']); } catch (\Throwable $th) { @@ -57,10 +60,9 @@ public function insertOneAction($databaseName, $collectionName) : Response { /** * @see https://docs.mongodb.com/php-library/v1.6/reference/method/MongoDBCollection-countDocuments/ */ - public function countAction($databaseName, $collectionName) : Response { + public function countAction() : Response { $mongoDBClient = MongoDBHelper::getClient(); - $collection = $mongoDBClient->selectCollection($databaseName, $collectionName); $requestBody = $this->getRequestBody(); @@ -74,6 +76,10 @@ public function countAction($databaseName, $collectionName) : Response { return new Response(400, 'Request body is invalid.'); } + $collection = $mongoDBClient->selectCollection( + $decodedRequestBody['databaseName'], $decodedRequestBody['collectionName'] + ); + if ( isset($decodedRequestBody['filter']['_id']) && is_string($decodedRequestBody['filter']['_id']) ) { $decodedRequestBody['filter']['_id'] = @@ -99,10 +105,9 @@ public function countAction($databaseName, $collectionName) : Response { /** * @see https://docs.mongodb.com/php-library/v1.6/reference/method/MongoDBCollection-deleteOne/index.html */ - public function deleteOneAction($databaseName, $collectionName) : Response { + public function deleteOneAction() : Response { $mongoDBClient = MongoDBHelper::getClient(); - $collection = $mongoDBClient->selectCollection($databaseName, $collectionName); $requestBody = $this->getRequestBody(); @@ -116,6 +121,10 @@ public function deleteOneAction($databaseName, $collectionName) : Response { return new Response(400, 'Request body is invalid.'); } + $collection = $mongoDBClient->selectCollection( + $decodedRequestBody['databaseName'], $decodedRequestBody['collectionName'] + ); + if ( isset($decodedRequestBody['filter']['_id']) && is_string($decodedRequestBody['filter']['_id']) ) { $decodedRequestBody['filter']['_id'] = @@ -143,10 +152,9 @@ public function deleteOneAction($databaseName, $collectionName) : Response { /** * @see https://docs.mongodb.com/php-library/v1.6/reference/method/MongoDBCollection-find/index.html */ - public function findAction($databaseName, $collectionName) : Response { + public function findAction() : Response { $mongoDBClient = MongoDBHelper::getClient(); - $collection = $mongoDBClient->selectCollection($databaseName, $collectionName); $requestBody = $this->getRequestBody(); @@ -160,6 +168,10 @@ public function findAction($databaseName, $collectionName) : Response { return new Response(400, 'Request body is invalid.'); } + $collection = $mongoDBClient->selectCollection( + $decodedRequestBody['databaseName'], $decodedRequestBody['collectionName'] + ); + if ( isset($decodedRequestBody['filter']['_id']) && is_string($decodedRequestBody['filter']['_id']) ) { $decodedRequestBody['filter']['_id'] = @@ -187,10 +199,9 @@ public function findAction($databaseName, $collectionName) : Response { /** * @see https://docs.mongodb.com/php-library/v1.6/reference/method/MongoDBCollection-updateOne/index.html */ - public function updateOneAction($databaseName, $collectionName) : Response { + public function updateOneAction() : Response { $mongoDBClient = MongoDBHelper::getClient(); - $collection = $mongoDBClient->selectCollection($databaseName, $collectionName); $requestBody = $this->getRequestBody(); @@ -204,6 +215,10 @@ public function updateOneAction($databaseName, $collectionName) : Response { return new Response(400, 'Request body is invalid.'); } + $collection = $mongoDBClient->selectCollection( + $decodedRequestBody['databaseName'], $decodedRequestBody['collectionName'] + ); + if ( isset($decodedRequestBody['filter']['_id']) && is_string($decodedRequestBody['filter']['_id']) ) { $decodedRequestBody['filter']['_id'] = @@ -230,10 +245,25 @@ public function updateOneAction($databaseName, $collectionName) : Response { } - public function enumFieldsAction($databaseName, $collectionName) : Response { + public function enumFieldsAction() : Response { $mongoDBClient = MongoDBHelper::getClient(); - $collection = $mongoDBClient->selectCollection($databaseName, $collectionName); + + $requestBody = $this->getRequestBody(); + + if ( is_null($requestBody) ) { + return new Response(400, 'Request body is missing.'); + } + + $decodedRequestBody = json_decode($requestBody, JSON_OBJECT_AS_ARRAY); + + if ( is_null($decodedRequestBody) ) { + return new Response(400, 'Request body is invalid.'); + } + + $collection = $mongoDBClient->selectCollection( + $decodedRequestBody['databaseName'], $decodedRequestBody['collectionName'] + ); try { $documents = $collection->find([], ['limit' => 1])->toArray(); @@ -280,10 +310,9 @@ public function enumFieldsAction($databaseName, $collectionName) : Response { /** * @see https://docs.mongodb.com/php-library/v1.6/reference/method/MongoDBCollection-createIndex/index.html */ - public function createIndexAction($databaseName, $collectionName) : Response { + public function createIndexAction() : Response { $mongoDBClient = MongoDBHelper::getClient(); - $collection = $mongoDBClient->selectCollection($databaseName, $collectionName); $requestBody = $this->getRequestBody(); @@ -297,6 +326,10 @@ public function createIndexAction($databaseName, $collectionName) : Response { return new Response(400, 'Request body is invalid.'); } + $collection = $mongoDBClient->selectCollection( + $decodedRequestBody['databaseName'], $decodedRequestBody['collectionName'] + ); + try { $createdIndexName = $collection->createIndex( $decodedRequestBody['key'], $decodedRequestBody['options'] @@ -318,10 +351,25 @@ public function createIndexAction($databaseName, $collectionName) : Response { /** * @see https://docs.mongodb.com/php-library/v1.6/reference/method/MongoDBCollection-listIndexes/index.html */ - public function listIndexesAction($databaseName, $collectionName) : Response { + public function listIndexesAction() : Response { $mongoDBClient = MongoDBHelper::getClient(); - $collection = $mongoDBClient->selectCollection($databaseName, $collectionName); + + $requestBody = $this->getRequestBody(); + + if ( is_null($requestBody) ) { + return new Response(400, 'Request body is missing.'); + } + + $decodedRequestBody = json_decode($requestBody, JSON_OBJECT_AS_ARRAY); + + if ( is_null($decodedRequestBody) ) { + return new Response(400, 'Request body is invalid.'); + } + + $collection = $mongoDBClient->selectCollection( + $decodedRequestBody['databaseName'], $decodedRequestBody['collectionName'] + ); $indexes = []; @@ -349,10 +397,9 @@ public function listIndexesAction($databaseName, $collectionName) : Response { /** * @see https://docs.mongodb.com/php-library/v1.6/reference/method/MongoDBCollection-dropIndex/index.html */ - public function dropIndexAction($databaseName, $collectionName) : Response { + public function dropIndexAction() : Response { $mongoDBClient = MongoDBHelper::getClient(); - $collection = $mongoDBClient->selectCollection($databaseName, $collectionName); $requestBody = $this->getRequestBody(); @@ -366,6 +413,10 @@ public function dropIndexAction($databaseName, $collectionName) : Response { return new Response(400, 'Request body is invalid.'); } + $collection = $mongoDBClient->selectCollection( + $decodedRequestBody['databaseName'], $decodedRequestBody['collectionName'] + ); + try { $collection->dropIndex($decodedRequestBody['indexName']); } catch (\Throwable $th) { diff --git a/src/Controllers/DatabaseController.php b/src/Controllers/DatabaseController.php index f0649ed..abce93a 100644 --- a/src/Controllers/DatabaseController.php +++ b/src/Controllers/DatabaseController.php @@ -50,16 +50,29 @@ public function renderQueryViewAction() : Response { /** * @see https://docs.mongodb.com/php-library/v1.6/reference/method/MongoDBDatabase-listCollections/index.html */ - public function listCollectionsAction($databaseName) : Response { + public function listCollectionsAction() : Response { $mongoDBClient = MongoDBHelper::getClient(); - $database = $mongoDBClient->selectDatabase($databaseName); - $collectionsNames = []; + $requestBody = $this->getRequestBody(); + + if ( is_null($requestBody) ) { + return new Response(400, 'Request body is missing.'); + } + + $decodedRequestBody = json_decode($requestBody, JSON_OBJECT_AS_ARRAY); + + if ( is_null($decodedRequestBody) ) { + return new Response(400, 'Request body is invalid.'); + } + + $database = $mongoDBClient->selectDatabase($decodedRequestBody['databaseName']); + + $collectionNames = []; try { foreach ($database->listCollections() as $collectionInfo) { - $collectionsNames[] = $collectionInfo['name']; + $collectionNames[] = $collectionInfo['name']; } } catch (\Throwable $th) { return new Response( @@ -70,7 +83,7 @@ public function listCollectionsAction($databaseName) : Response { } return new Response( - 200, json_encode($collectionsNames), ['Content-Type' => 'application/json'] + 200, json_encode($collectionNames), ['Content-Type' => 'application/json'] ); } @@ -78,12 +91,33 @@ public function listCollectionsAction($databaseName) : Response { /** * @see https://docs.mongodb.com/php-library/v1.6/reference/method/MongoDBDatabase-createCollection/index.html */ - public function createCollectionAction($databaseName, $collectionName) : Response { + public function createCollectionAction() : Response { $mongoDBClient = MongoDBHelper::getClient(); - $database = $mongoDBClient->selectDatabase($databaseName); - $database->createCollection($collectionName); + $requestBody = $this->getRequestBody(); + + if ( is_null($requestBody) ) { + return new Response(400, 'Request body is missing.'); + } + + $decodedRequestBody = json_decode($requestBody, JSON_OBJECT_AS_ARRAY); + + if ( is_null($decodedRequestBody) ) { + return new Response(400, 'Request body is invalid.'); + } + + $database = $mongoDBClient->selectDatabase($decodedRequestBody['databaseName']); + + try { + $database->createCollection($decodedRequestBody['collectionName']); + } catch (\Throwable $th) { + return new Response( + 500, + json_encode(ErrorNormalizer::normalize($th, __METHOD__)), + ['Content-Type' => 'application/json'] + ); + } return new Response( 200, json_encode(true), ['Content-Type' => 'application/json'] diff --git a/static/js/mpg.collection.indexes.js b/static/js/mpg.collection.indexes.js index 9983db2..d1f28cd 100644 --- a/static/js/mpg.collection.indexes.js +++ b/static/js/mpg.collection.indexes.js @@ -81,8 +81,10 @@ MPG.helpers.doAjaxRequest = function(method, url, successCallback, body) { */ MPG.reloadCollections = function(databaseName) { + var requestBody = { 'databaseName': databaseName }; + MPG.helpers.doAjaxRequest( - 'GET', '/ajax/database/' + databaseName + '/listCollections', function(response) { + 'POST', '/ajax/database/listCollections', function(response) { var collectionsList = document.querySelector('#mpg-collections-list'); @@ -105,7 +107,8 @@ MPG.reloadCollections = function(databaseName) { MPG.eventListeners.addCollections(); - }, null + }, + JSON.stringify(requestBody) ); }; @@ -117,10 +120,14 @@ MPG.reloadCollections = function(databaseName) { */ MPG.reloadCollectionFields = function() { + var requestBody = { + 'databaseName': MPG.databaseName, + 'collectionName': MPG.collectionName + }; + MPG.helpers.doAjaxRequest( - 'GET', - '/ajax/database/' + MPG.databaseName + '/collection/' - + MPG.collectionName + '/enumFields', + 'POST', + '/ajax/collection/enumFields', function(response) { JSON.parse(response).forEach(function(collectionField) { @@ -142,7 +149,7 @@ MPG.reloadCollectionFields = function() { }); }, - null + JSON.stringify(requestBody) ); }; @@ -154,10 +161,14 @@ MPG.reloadCollectionFields = function() { */ MPG.reloadCollectionIndexes = function() { + var requestBody = { + 'databaseName': MPG.databaseName, + 'collectionName': MPG.collectionName + }; + MPG.helpers.doAjaxRequest( - 'GET', - '/ajax/database/' + MPG.databaseName + '/collection/' - + MPG.collectionName + '/listIndexes', + 'POST', + '/ajax/collection/listIndexes', function(response) { MPG.collectionIndexes = JSON.parse(response); @@ -201,7 +212,7 @@ MPG.reloadCollectionIndexes = function() { }); }, - null + JSON.stringify(requestBody) ); }; @@ -300,7 +311,11 @@ MPG.eventListeners.addCreateIndex = function() { var uniqueIndex = document.querySelector('#mpg-unique-index-select').value; var indexIsUnique = ( uniqueIndex === 'true' ) ? true : false; - var requestBody = {}; + var requestBody = { + 'databaseName': MPG.databaseName, + 'collectionName': MPG.collectionName + }; + requestBody.key = {}; requestBody.options = { "unique" : indexIsUnique }; @@ -310,8 +325,7 @@ MPG.eventListeners.addCreateIndex = function() { MPG.helpers.doAjaxRequest( 'POST', - '/ajax/database/' + MPG.databaseName + '/collection/' - + MPG.collectionName + '/createIndex', + '/ajax/collection/createIndex', function(response) { var createdIndexName = JSON.parse(response); @@ -340,12 +354,15 @@ MPG.eventListeners.addDropIndex = function() { indexDropButton.addEventListener('click', function(_event) { - var requestBody = { "indexName": indexDropButton.dataset.indexName }; + var requestBody = { + 'databaseName': MPG.databaseName, + 'collectionName': MPG.collectionName, + 'indexName': indexDropButton.dataset.indexName + }; MPG.helpers.doAjaxRequest( 'POST', - '/ajax/database/' + MPG.databaseName + '/collection/' - + MPG.collectionName + '/dropIndex', + '/ajax/collection/dropIndex', function(response) { if ( JSON.parse(response) === true ) { diff --git a/static/js/mpg.database.create.js b/static/js/mpg.database.create.js index b064775..633f79c 100644 --- a/static/js/mpg.database.create.js +++ b/static/js/mpg.database.create.js @@ -61,13 +61,18 @@ MPG.createDatabase = function() { return window.location = '/'; } + var requestBody = { + 'databaseName': databaseName, + 'collectionName': collectionName + }; + MPG.helpers.doAjaxRequest( - 'GET', - '/ajax/database/' + databaseName + '/createCollection/' + collectionName, + 'POST', + '/ajax/database/createCollection/', function(_response) { window.location = '/'; }, - null + JSON.stringify(requestBody) ); }; diff --git a/static/js/mpg.database.query.js b/static/js/mpg.database.query.js index 8b7a3d9..1b2a63e 100644 --- a/static/js/mpg.database.query.js +++ b/static/js/mpg.database.query.js @@ -234,8 +234,10 @@ MPG.helpers.downloadFile = function(filename, data, type) { */ MPG.reloadCollections = function(databaseName) { + var requestBody = { 'databaseName': databaseName }; + MPG.helpers.doAjaxRequest( - 'GET', '/ajax/database/' + databaseName + '/listCollections', function(response) { + 'POST', '/ajax/database/listCollections', function(response) { var collectionsList = document.querySelector('#mpg-collections-list'); @@ -258,7 +260,8 @@ MPG.reloadCollections = function(databaseName) { MPG.eventListeners.addCollections(); - }, null + }, + JSON.stringify(requestBody) ); }; @@ -318,10 +321,14 @@ MPG.eventListeners.addCollections = function() { MPG.collectionFields = []; + var requestBody = { + 'databaseName': MPG.databaseName, + 'collectionName': MPG.collectionName + }; + MPG.helpers.doAjaxRequest( - 'GET', - '/ajax/database/' + MPG.databaseName + '/collection/' - + MPG.collectionName + '/enumFields', + 'POST', + '/ajax/collection/enumFields', function(response) { JSON.parse(response).forEach(function(collectionField) { @@ -343,7 +350,7 @@ MPG.eventListeners.addCollections = function() { document.querySelector('#mpg-output-code').innerHTML = ''; }, - null + JSON.stringify(requestBody) ); }); @@ -368,7 +375,11 @@ MPG.eventListeners.addInsertOne = function() { // Synchronizes CodeMirror with Filter or Document text area. MPG.codeMirror.save(); - var requestBody = {}; + var requestBody = { + 'databaseName': MPG.databaseName, + 'collectionName': MPG.collectionName + }; + var filterOrDocTextAreaValue = document.querySelector('#mpg-filter-or-doc-textarea').value; if ( filterOrDocTextAreaValue === '' ) { @@ -379,8 +390,7 @@ MPG.eventListeners.addInsertOne = function() { MPG.helpers.doAjaxRequest( 'POST', - '/ajax/database/' + MPG.databaseName + '/collection/' - + MPG.collectionName + '/insertOne', + '/ajax/collection/insertOne', function(response) { var outputCode = document.querySelector('#mpg-output-code'); @@ -410,7 +420,11 @@ MPG.eventListeners.addCount = function() { // Synchronizes CodeMirror with Filter or Document text area. MPG.codeMirror.save(); - var requestBody = {}; + var requestBody = { + 'databaseName': MPG.databaseName, + 'collectionName': MPG.collectionName + }; + var filterOrDocTextAreaValue = document.querySelector('#mpg-filter-or-doc-textarea').value; if ( filterOrDocTextAreaValue === '' ) { @@ -421,8 +435,7 @@ MPG.eventListeners.addCount = function() { MPG.helpers.doAjaxRequest( 'POST', - '/ajax/database/' + MPG.databaseName + '/collection/' - + MPG.collectionName + '/count', + '/ajax/collection/count', function(response) { var outputCode = document.querySelector('#mpg-output-code'); @@ -452,7 +465,11 @@ MPG.eventListeners.addDeleteOne = function() { // Synchronizes CodeMirror with Filter or Document text area. MPG.codeMirror.save(); - var requestBody = {}; + var requestBody = { + 'databaseName': MPG.databaseName, + 'collectionName': MPG.collectionName + }; + var filterOrDocTextAreaValue = document.querySelector('#mpg-filter-or-doc-textarea').value; if ( filterOrDocTextAreaValue === '' ) { @@ -471,8 +488,7 @@ MPG.eventListeners.addDeleteOne = function() { MPG.helpers.doAjaxRequest( 'POST', - '/ajax/database/' + MPG.databaseName + '/collection/' - + MPG.collectionName + '/deleteOne', + '/ajax/collection/deleteOne', function(response) { var outputCode = document.querySelector('#mpg-output-code'); @@ -519,7 +535,9 @@ MPG.eventListeners.addUpdate = function() { var documentId = documentField.dataset.documentId; } - var requestBody = { + var requestBody = { + 'databaseName': MPG.databaseName, + 'collectionName': MPG.collectionName, "filter": { "_id": documentId }, @@ -532,8 +550,7 @@ MPG.eventListeners.addUpdate = function() { MPG.helpers.doAjaxRequest( 'POST', - '/ajax/database/' + MPG.databaseName + '/collection/' - + MPG.collectionName + '/updateOne', + '/ajax/collection/updateOne', function(response) { if ( JSON.parse(response) === 1 ) { @@ -568,7 +585,11 @@ MPG.eventListeners.addFind = function() { // Synchronizes CodeMirror with Filter or Document text area. MPG.codeMirror.save(); - var requestBody = {}; + var requestBody = { + 'databaseName': MPG.databaseName, + 'collectionName': MPG.collectionName + }; + var filterOrDocTextAreaValue = document.querySelector('#mpg-filter-or-doc-textarea').value; if ( filterOrDocTextAreaValue === '' ) { @@ -593,8 +614,7 @@ MPG.eventListeners.addFind = function() { MPG.helpers.doAjaxRequest( 'POST', - '/ajax/database/' + MPG.databaseName + '/collection/' - + MPG.collectionName + '/find', + '/ajax/collection/find', function(response) { MPG.cachedOutput = response;