Skip to content

Commit f173ea8

Browse files
authored
Merge pull request #569 from devforth/next
Next
2 parents 02e3986 + d32e755 commit f173ea8

61 files changed

Lines changed: 3000 additions & 377 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ plugins/*
33
!plugins/README.md
44
adapters/*
55
!adapters/README.md
6-
background-jobs-dbs
6+
background-jobs-dbs
7+
tests/jest_tests/db/

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
[![Ask AI](http://tluma.ai/badge)](http://tluma.ai/ask-ai/devforth/adminforth)
77

8-
* [Try live demo](https://demo.adminforth.dev/) (Read-only mode)
8+
* [Try live demo](https://demo.adminforth.dev/)
99

1010
* [Hello world in 5 minutes](https://adminforth.dev/docs/tutorial/gettingStarted) with AdminForth
1111

adminforth/dataConnectors/baseConnector.ts

Lines changed: 102 additions & 53 deletions
Large diffs are not rendered by default.

adminforth/dataConnectors/clickhouse.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -498,14 +498,17 @@ class ClickhouseConnector extends AdminForthBaseConnector implements IAdminForth
498498
filters: IAdminForthAndOrFilter;
499499
}): Promise<number> {
500500
const tableName = resource.table;
501+
let normalizedFilters = filters;
502+
501503
// validate and normalize in case this method is called from dataAPI
502504
if (filters) {
503505
const filterValidation = this.validateAndNormalizeFilters(filters, resource);
504506
if (!filterValidation.ok) {
505507
throw new Error(filterValidation.error);
506508
}
509+
normalizedFilters = filterValidation.normalizedFilters as IAdminForthAndOrFilter;
507510
}
508-
const { where, params } = this.whereClause(resource, filters);
511+
const { where, params } = this.whereClause(resource, normalizedFilters);
509512

510513
const countQ = await this.client.query({
511514
query: `SELECT COUNT(*) as count FROM ${tableName} ${where}`,

adminforth/dataConnectors/mongo.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,15 +340,18 @@ class MongoConnector extends AdminForthBaseConnector implements IAdminForthDataS
340340
resource: AdminForthResource,
341341
filters: IAdminForthAndOrFilter,
342342
}): Promise<number> {
343+
let normalizedFilters = filters;
344+
343345
if (filters) {
344346
// validate and normalize in case this method is called from dataAPI
345347
const filterValidation = this.validateAndNormalizeFilters(filters, resource);
346348
if (!filterValidation.ok) {
347349
throw new Error(filterValidation.error);
348350
}
351+
normalizedFilters = filterValidation.normalizedFilters as IAdminForthAndOrFilter;
349352
}
350353
const collection = this.client.db().collection(resource.table);
351-
const query = filters.subFilters.length ? this.getFilterQuery(resource, filters) : {};
354+
const query = normalizedFilters.subFilters.length ? this.getFilterQuery(resource, normalizedFilters) : {};
352355
return await collection.countDocuments(query);
353356
}
354357

adminforth/dataConnectors/mysql.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,14 +365,17 @@ class MysqlConnector extends AdminForthBaseConnector implements IAdminForthDataS
365365

366366
async getCount({ resource, filters }: { resource: AdminForthResource; filters: IAdminForthAndOrFilter; }): Promise<number> {
367367
const tableName = resource.table;
368+
let normalizedFilters = filters;
369+
368370
// validate and normalize in case this method is called from dataAPI
369371
if (filters) {
370372
const filterValidation = this.validateAndNormalizeFilters(filters, resource);
371373
if (!filterValidation.ok) {
372374
throw new Error(filterValidation.error);
373375
}
376+
normalizedFilters = filterValidation.normalizedFilters as IAdminForthAndOrFilter;
374377
}
375-
const { sql: where, values: filterValues } = this.whereClauseAndValues(filters);
378+
const { sql: where, values: filterValues } = this.whereClauseAndValues(normalizedFilters);
376379
const q = `SELECT COUNT(*) FROM ${tableName} ${where}`;
377380
dbLogger.trace(`🪲📜 MySQL Q: ${q} values: ${JSON.stringify(filterValues)}`);
378381
const [results] = await this.client.execute(q, filterValues);

adminforth/dataConnectors/postgres.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -396,14 +396,17 @@ class PostgresConnector extends AdminForthBaseConnector implements IAdminForthDa
396396

397397
async getCount({ resource, filters }: { resource: AdminForthResource; filters: IAdminForthAndOrFilter; }): Promise<number> {
398398
const tableName = resource.table;
399+
let normalizedFilters = filters;
400+
399401
// validate and normalize in case this method is called from dataAPI
400402
if (filters) {
401403
const filterValidation = this.validateAndNormalizeFilters(filters, resource);
402404
if (!filterValidation.ok) {
403405
throw new Error(filterValidation.error);
404406
}
407+
normalizedFilters = filterValidation.normalizedFilters as IAdminForthAndOrFilter;
405408
}
406-
const { sql: where, values: filterValues } = this.whereClauseAndValues(resource, filters);
409+
const { sql: where, values: filterValues } = this.whereClauseAndValues(resource, normalizedFilters);
407410
const q = `SELECT COUNT(*) FROM "${tableName}" ${where}`;
408411
dbLogger.trace(`🪲📜 PG Q: ${q}, values: ${JSON.stringify(filterValues)}`);
409412
const stmt = await this.client.query(q, filterValues);

adminforth/dataConnectors/sqlite.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -326,16 +326,19 @@ class SQLiteConnector extends AdminForthBaseConnector implements IAdminForthData
326326
}
327327

328328
async getCount({ resource, filters }) {
329+
let normalizedFilters = filters;
330+
329331
if (filters) {
330332
// validate and normalize in case this method is called from dataAPI
331333
const filterValidation = this.validateAndNormalizeFilters(filters, resource);
332334
if (!filterValidation.ok) {
333335
throw new Error(filterValidation.error);
334336
}
337+
normalizedFilters = filterValidation.normalizedFilters as IAdminForthAndOrFilter;
335338
}
336339
const tableName = resource.table;
337-
const where = this.whereClause(filters);
338-
const filterValues = this.getFilterParams(filters);
340+
const where = this.whereClause(normalizedFilters);
341+
const filterValues = this.getFilterParams(normalizedFilters);
339342
const q = `SELECT COUNT(*) FROM ${tableName} ${where}`;
340343
dbLogger.trace(`🪲📜 SQLITE Q: ${q}, params: ${JSON.stringify(filterValues)}`);
341344
const totalStmt = this.client.prepare(q);

adminforth/documentation/docs/tutorial/03-Customization/06-customPages.md

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -317,9 +317,9 @@ Now we have to define this endpoint in the backend to make our page work:
317317
318318
319319
320-
Open `index.ts` file and add the following code *BEFORE* `admin.express.serve(` !
320+
Open `api.ts` file and add the following code *BEFORE* `admin.express.authorize` !
321321
322-
```ts title="/index.ts"
322+
```ts title="/api.ts"
323323
324324
import type { IAdminUserExpressRequest } from 'adminforth';
325325
import express from 'express';
@@ -429,11 +429,6 @@ app.get(`${ADMIN_BASE_URL}/api/dashboard/`,
429429
)
430430
)
431431
);
432-
433-
// serve after you added all api
434-
admin.express.serve(app)
435-
admin.discoverDatabases();
436-
437432
```
438433
439434
Install and import Zod before using this pattern: `pnpm add zod` or `npm install zod`, then `import * as z from 'zod';`. `admin.express.withSchema(...)` will convert the Zod schema to OpenAPI for you.

adminforth/documentation/docs/tutorial/03-Customization/08-pageInjections.md

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ Now create file `ApartsPie.vue` in the `custom` folder of your project:
109109
110110
Also we have to add an Api to get percentages:
111111
112-
```ts title="./index.ts"
112+
```ts title="/api.ts"
113113
import type { IAdminUserExpressRequest } from 'adminforth';
114114
import express from 'express';
115115
import * as z from 'zod';
@@ -152,10 +152,6 @@ import * as z from 'zod';
152152
)
153153
)
154154
);
155-
156-
// serve after you added all api
157-
admin.discoverDatabases();
158-
admin.express.serve(app)
159155
```
160156
161157
Install and import Zod before using this pattern: `pnpm add zod` or `npm install zod`, then `import * as z from 'zod';`. `admin.express.withSchema(...)` will convert the Zod schema to OpenAPI for you.

0 commit comments

Comments
 (0)