Skip to content

Commit 9699059

Browse files
committed
Add ISO date support
1 parent 1234b58 commit 9699059

File tree

5 files changed

+51
-17
lines changed

5 files changed

+51
-17
lines changed

index.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
*
1919
* @var string
2020
*/
21-
define('MPG_APP_VERSION', '1.0.2');
21+
define('MPG_APP_VERSION', '1.0.3');
2222

2323
/**
2424
* Development mode?

src/Controllers/CollectionController.php

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ public function insertOneAction() : Response {
3030
return new JsonResponse(400, ErrorNormalizer::normalize($th, __METHOD__));
3131
}
3232

33+
foreach ($decodedRequestBody['document'] as &$insertValue) {
34+
if ( preg_match(MongoDBHelper::ISO_DATE_TIME_REGEX, $insertValue) ) {
35+
$insertValue = new \MongoDB\BSON\UTCDateTime(new \DateTime($insertValue));
36+
}
37+
}
38+
3339
try {
3440

3541
$collection = MongoDBHelper::getClient()->selectCollection(
@@ -58,7 +64,7 @@ public function countAction() : Response {
5864
}
5965

6066
if ( isset($decodedRequestBody['filter']['_id'])
61-
&& is_string($decodedRequestBody['filter']['_id']) ) {
67+
&& preg_match(MongoDBHelper::MDB_OBJECT_ID_REGEX, $decodedRequestBody['filter']['_id']) ) {
6268
$decodedRequestBody['filter']['_id'] =
6369
new \MongoDB\BSON\ObjectId($decodedRequestBody['filter']['_id']);
6470
}
@@ -91,7 +97,7 @@ public function deleteOneAction() : Response {
9197
}
9298

9399
if ( isset($decodedRequestBody['filter']['_id'])
94-
&& is_string($decodedRequestBody['filter']['_id']) ) {
100+
&& preg_match(MongoDBHelper::MDB_OBJECT_ID_REGEX, $decodedRequestBody['filter']['_id']) ) {
95101
$decodedRequestBody['filter']['_id'] =
96102
new \MongoDB\BSON\ObjectId($decodedRequestBody['filter']['_id']);
97103
}
@@ -124,7 +130,7 @@ public function findAction() : Response {
124130
}
125131

126132
if ( isset($decodedRequestBody['filter']['_id'])
127-
&& is_string($decodedRequestBody['filter']['_id']) ) {
133+
&& preg_match(MongoDBHelper::MDB_OBJECT_ID_REGEX, $decodedRequestBody['filter']['_id']) ) {
128134
$decodedRequestBody['filter']['_id'] =
129135
new \MongoDB\BSON\ObjectId($decodedRequestBody['filter']['_id']);
130136
}
@@ -143,6 +149,16 @@ public function findAction() : Response {
143149
return new JsonResponse(500, ErrorNormalizer::normalize($th, __METHOD__));
144150
}
145151

152+
foreach ($documents as $document) {
153+
foreach ($document as &$documentValue) {
154+
if ( is_a($documentValue, '\MongoDB\BSON\ObjectId') ) {
155+
$documentValue = (string) $documentValue;
156+
} elseif ( is_a($documentValue, '\MongoDB\BSON\UTCDatetime') ) {
157+
$documentValue = $documentValue->toDateTime()->format('Y-m-d\TH:i:s.v\Z');
158+
}
159+
}
160+
}
161+
146162
return new JsonResponse(200, $documents);
147163

148164
}
@@ -159,11 +175,17 @@ public function updateOneAction() : Response {
159175
}
160176

161177
if ( isset($decodedRequestBody['filter']['_id'])
162-
&& is_string($decodedRequestBody['filter']['_id']) ) {
178+
&& preg_match(MongoDBHelper::MDB_OBJECT_ID_REGEX, $decodedRequestBody['filter']['_id']) ) {
163179
$decodedRequestBody['filter']['_id'] =
164180
new \MongoDB\BSON\ObjectId($decodedRequestBody['filter']['_id']);
165181
}
166182

183+
foreach ($decodedRequestBody['update']['$set'] as &$updateValue) {
184+
if ( preg_match(MongoDBHelper::ISO_DATE_TIME_REGEX, $updateValue) ) {
185+
$updateValue = new \MongoDB\BSON\UTCDateTime(new \DateTime($updateValue));
186+
}
187+
}
188+
167189
try {
168190

169191
$collection = MongoDBHelper::getClient()->selectCollection(

src/Helpers/MongoDBHelper.php

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,23 @@
55
use MongoDB\Client;
66

77
class MongoDBHelper {
8-
8+
9+
/**
10+
* Regular expression for a MongoDB ObjectID.
11+
*
12+
* @var string
13+
* @see https://stackoverflow.com/questions/20988446/regex-for-mongodb-objectid
14+
*/
15+
public const MDB_OBJECT_ID_REGEX = '/^[a-f\d]{24}$/i';
16+
17+
/**
18+
* Regular expression for an ISO date-time.
19+
*
20+
* @var string
21+
* @see https://stackoverflow.com/questions/3143070/javascript-regex-iso-datetime
22+
*/
23+
public const ISO_DATE_TIME_REGEX = '/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/';
24+
925
/**
1026
* MongoDB client singleton instance.
1127
*

static/js/jsonview.bundle.mod.js

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -192,13 +192,9 @@ var JsonView = (function (exports) {
192192
// XXX Modification made for MongoDB PHP GUI.
193193
if ( node.key === '_id' ) {
194194
MPG.documentId = node.value;
195-
MPG.documentIdType = 'int';
195+
MPG.documentIdType = _typeof(node.value);
196196
}
197-
if ( node.key === '$oid' ) {
198-
MPG.documentId = node.value;
199-
MPG.documentIdType = 'string';
200-
}
201-
if ( node.depth >= 2 && node.depth <= 5 && !(/(_id|\$oid)/).test(node.key) ) {
197+
if ( node.depth >= 2 && node.depth <= 5 && node.key !== '_id' ) {
202198
var documentFieldIsUpdatable = true;
203199
} else {
204200
var documentFieldIsUpdatable = false;

static/js/mpg.database.query.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -595,19 +595,19 @@ MPG.eventListeners.addUpdate = function() {
595595

596596
updatableJsonValue.addEventListener('click', function(event) {
597597

598-
var documentFieldNewValue = window.prompt('New value');
598+
var documentField = event.currentTarget;
599+
600+
var documentFieldNewValue = window.prompt('New value', documentField.innerHTML);
599601

600602
if ( documentFieldNewValue === null ) {
601603
return;
602604
}
603605

604-
var documentField = event.currentTarget;
605-
606606
documentFieldNewValue = MPG.helpers.convertStringToAny(
607607
documentFieldNewValue, documentField.dataset.documentFieldType
608608
);
609609

610-
if ( MPG.documentIdType === 'int' ) {
610+
if ( MPG.documentIdType === 'number' ) {
611611
var documentId = parseInt(documentField.dataset.documentId);
612612
} else {
613613
var documentId = documentField.dataset.documentId;
@@ -632,7 +632,7 @@ MPG.eventListeners.addUpdate = function() {
632632
function(response) {
633633

634634
if ( JSON.parse(response) === 1 ) {
635-
documentField.innerText = MPG.helpers.convertAnyToString(
635+
documentField.innerHTML = MPG.helpers.convertAnyToString(
636636
documentFieldNewValue
637637
);
638638
}

0 commit comments

Comments
 (0)