nestjsx / crud

NestJs CRUD for RESTful APIs
https://github.com/nestjsx/crud/wiki
MIT License
4.1k stars 542 forks source link

Database JSON column and query WHERE support #824

Closed LucusWebsites closed 1 year ago

LucusWebsites commented 1 year ago

Just for future souls who are looking for support for WHERE and database JSON columns. This patch might help and/or push you in the right direction. Use at your own risk, it's not thorougly tested!


diff --git a/node_modules/@nestjsx/crud-typeorm/lib/typeorm-crud.service.js b/node_modules/@nestjsx/crud-typeorm/lib/typeorm-crud.service.js
index 541c2a8..6907f5a 100644
--- a/node_modules/@nestjsx/crud-typeorm/lib/typeorm-crud.service.js
+++ b/node_modules/@nestjsx/crud-typeorm/lib/typeorm-crud.service.js
@@ -573,6 +573,10 @@ class TypeOrmCrudService extends crud_1.CrudService {
         if (cond.operator[0] !== '$') {
             cond.operator = ('$' + cond.operator);
         }
+
+        param = param.replaceAll('-', '_')
+        param = param.replaceAll(' ', '_')
+
         switch (cond.operator) {
             case '$eq':
                 str = `${field} = :${param}`;
@@ -666,6 +670,21 @@ class TypeOrmCrudService extends crud_1.CrudService {
                 str = `${field} = :${param}`;
                 break;
         }
+
+        if (field.startsWith('customer.')) {
+            const jsonFieldName = field.substring(9)
+
+            if (str.startsWith('LOWER(')) {
+                const start = str.substring(0, 6)
+                const end = str.substring(6 + field.length)
+                str = start + `JSON_EXTRACT(\`customer\`, '$."${jsonFieldName}"')` + end
+            } else {
+                const start = ''
+                const end = str.substring(field.length)
+                str = start + `JSON_EXTRACT(\`customer\`, '$."${jsonFieldName}"')` + end
+            }
+        }
+
         if (typeof params === 'undefined') {
             params = { [param]: cond.value };
         }