Skip to content

Commit f8a6f5d

Browse files
authored
Merge pull request #177 from devforth/next
Next
2 parents 5d69501 + 0192566 commit f8a6f5d

File tree

12 files changed

+446
-757
lines changed

12 files changed

+446
-757
lines changed

adapters/install-adapters.sh

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,35 @@
1-
ADAPTERS="adminforth-completion-adapter-open-ai-chat-gpt adminforth-email-adapter-aws-ses adminforth-google-oauth-adapter adminforth-github-oauth-adapter"
1+
#!/usr/bin/env bash
2+
ADAPTERS="adminforth-completion-adapter-open-ai-chat-gpt adminforth-email-adapter-aws-ses adminforth-google-oauth-adapter adminforth-github-oauth-adapter adminforth-facebook-oauth-adapter adminforth-keycloak-oauth-adapter adminforth-microsoft-oauth-adapter"
23

3-
# for each plugin
4-
for adapter in $ADAPTERS; do
4+
# for each
5+
install_adapter() {
6+
adapter=$1
57

68
if [ -d "$adapter/.git" ]; then
79
echo "Repository for $adapter exists. Pulling latest changes..."
810
cd "$adapter"
911
git pull
1012
else
1113
echo "Repository for $adapter does not exist. Cloning..."
12-
git clone [email protected]:devforth/$adapter.git
13-
cd $adapter
14+
git clone [email protected]:devforth/$adapter.git "$adapter"
15+
cd "$adapter"
1416
fi
15-
17+
18+
cd ..
19+
}
20+
21+
do_npm_ci() {
22+
adapter=$1
23+
cd "$adapter"
1624
npm ci
1725
cd ..
18-
done
26+
}
27+
28+
export -f install_adapter
29+
export -f do_npm_ci
1930

31+
echo $ADAPTERS | tr ' ' '\n' | xargs -P 0 -I {} bash -c 'install_adapter "$@"' _ {}
2032

33+
echo $ADAPTERS | tr ' ' '\n' | while read adapter; do
34+
do_npm_ci "$adapter"
35+
done

adminforth/dataConnectors/baseConnector.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,27 @@ export default class AdminForthBaseConnector implements IAdminForthDataSourceCon
4242
return data.length > 0 ? data[0] : null;
4343
}
4444

45+
validateAndNormalizeInputFilters(filter: IAdminForthSingleFilter | IAdminForthAndOrFilter | Array<IAdminForthSingleFilter | IAdminForthAndOrFilter> | undefined): IAdminForthAndOrFilter {
46+
if (!filter) {
47+
// if no filter, return empty "and" filter
48+
return { operator: AdminForthFilterOperators.AND, subFilters: [] };
49+
}
50+
if (typeof filter !== 'object') {
51+
throw new Error(`Filter should be an array or an object`);
52+
}
53+
if (Array.isArray(filter)) {
54+
// if filter is an array, combine them using "and" operator
55+
return { operator: AdminForthFilterOperators.AND, subFilters: filter };
56+
}
57+
if ((filter as IAdminForthAndOrFilter).subFilters) {
58+
// if filter is already AndOr filter - return as is
59+
return filter as IAdminForthAndOrFilter;
60+
}
61+
62+
// by default, assume filter is Single filter, turn it into AndOr filter
63+
return { operator: AdminForthFilterOperators.AND, subFilters: [filter] };
64+
}
65+
4566
validateAndNormalizeFilters(filters: IAdminForthSingleFilter | IAdminForthAndOrFilter | Array<IAdminForthSingleFilter | IAdminForthAndOrFilter>, resource: AdminForthResource): { ok: boolean, error: string } {
4667
if (Array.isArray(filters)) {
4768
// go through all filters in array and call validation+normalization for each

adminforth/documentation/docs/tutorial/03-Customization/03-virtualColumns.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ columns: [
138138
...
139139
]
140140
```
141+
141142
This way, when admin selects, for example, "Luxury" option for "Apartment Type" filter, it will be replace with a more complex "or" filter.
142143
143144
### Custom SQL queries with `insecureRawSQL`

adminforth/modules/operationalResource.ts

Lines changed: 3 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,6 @@
11
import { IAdminForthSingleFilter, IAdminForthAndOrFilter, IAdminForthSort, IOperationalResource, IAdminForthDataSourceConnectorBase, AdminForthResource } from '../types/Back.js';
22
import { AdminForthFilterOperators } from '../types/Common.js';
33

4-
5-
function filtersIfFilter(filter: IAdminForthSingleFilter | IAdminForthAndOrFilter | Array<IAdminForthSingleFilter | IAdminForthAndOrFilter> | undefined): IAdminForthAndOrFilter {
6-
if (!filter) {
7-
// if no filter, return empty "and" filter
8-
return { operator: AdminForthFilterOperators.AND, subFilters: [] };
9-
}
10-
if (typeof filter !== 'object') {
11-
throw new Error(`Filter should be an array or an object`);
12-
}
13-
if (Array.isArray(filter)) {
14-
// if filter is an array, combine them using "and" operator
15-
return { operator: AdminForthFilterOperators.AND, subFilters: filter };
16-
}
17-
if ((filter as IAdminForthAndOrFilter).subFilters) {
18-
// if filter is already AndOr filter - return as is
19-
return filter as IAdminForthAndOrFilter;
20-
}
21-
22-
// by default, assume filter is Single filter, turn it into AndOr filter
23-
return { operator: AdminForthFilterOperators.AND, subFilters: [filter] };
24-
}
25-
264
function sortsIfSort(sort: IAdminForthSort | IAdminForthSort[]): IAdminForthSort[] {
275
return (Array.isArray(sort) ? sort : [sort]) as IAdminForthSort[];
286
}
@@ -40,7 +18,7 @@ export default class OperationalResource implements IOperationalResource {
4018
return (
4119
await this.dataConnector.getData({
4220
resource: this.resourceConfig,
43-
filters: filtersIfFilter(filter),
21+
filters: this.dataConnector.validateAndNormalizeInputFilters(filter),
4422
limit: 1,
4523
offset: 0,
4624
sort: [],
@@ -73,7 +51,7 @@ export default class OperationalResource implements IOperationalResource {
7351

7452
const { data } = await this.dataConnector.getData({
7553
resource: this.resourceConfig,
76-
filters: filtersIfFilter(filter),
54+
filters: this.dataConnector.validateAndNormalizeInputFilters(filter),
7755
limit: appliedLimit,
7856
offset: appliedOffset,
7957
sort: sortsIfSort(sort),
@@ -86,7 +64,7 @@ export default class OperationalResource implements IOperationalResource {
8664
async count(filter: IAdminForthSingleFilter | IAdminForthAndOrFilter | Array<IAdminForthSingleFilter | IAdminForthAndOrFilter> | undefined): Promise<number> {
8765
return await this.dataConnector.getCount({
8866
resource: this.resourceConfig,
89-
filters: filtersIfFilter(filter),
67+
filters: this.dataConnector.validateAndNormalizeInputFilters(filter),
9068
});
9169
}
9270

adminforth/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121
"docs": "typedoc",
2222
"--comment_postinstall": "postinstall executed after package installed in other project package and when we do npm ci in the package",
2323
"postinstall": "if test -d ./dist/spa/; then cd ./dist/spa/ && npm ci && echo 'installed spa dependencies'; fi",
24-
"install-plugins": "cd ../plugins && sh install-plugins.sh",
25-
"install-adapters": "cd ../adapters && sh install-adapters.sh"
24+
"install-plugins": "cd ../plugins && bash install-plugins.sh",
25+
"install-adapters": "cd ../adapters && bash install-adapters.sh"
2626
},
2727
"release": {
2828
"plugins": [

adminforth/types/Adapters.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ export interface EmailAdapter {
77
text: string,
88
html: string,
99
subject: string
10-
): Promise<void>;
10+
): Promise<{
11+
error?: string;
12+
ok?: boolean;
13+
}>;
1114
}
1215

1316
export interface CompletionAdapter {
@@ -29,4 +32,5 @@ export interface OAuth2Adapter {
2932
getAuthUrl(): string;
3033
getTokenFromCode(code: string, redirect_uri: string): Promise<{ email: string }>;
3134
getIcon(): string;
35+
getButtonText?(): string;
3236
}

adminforth/types/Back.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,8 @@ export interface IAdminForthDataSourceConnector {
236236
*/
237237
export interface IAdminForthDataSourceConnectorBase extends IAdminForthDataSourceConnector {
238238

239+
validateAndNormalizeInputFilters(filter: IAdminForthSingleFilter | IAdminForthAndOrFilter | Array<IAdminForthSingleFilter | IAdminForthAndOrFilter> | undefined): IAdminForthAndOrFilter;
240+
239241
getPrimaryKey(resource: AdminForthResource): string;
240242

241243
getData({ resource, limit, offset, sort, filters }: {

dev-demo/.env.local

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
KEYCLOAK_URL=http://localhost:8080
2+
3+
ADMINFORTH_SECRET=123
4+
NODE_ENV=development
5+
DATABASE_URL=sqlite://.db.sqlite
6+
PRISMA_DATABASE_URL=file:.db.sqlite

0 commit comments

Comments
 (0)