Skip to content

Commit c95dc74

Browse files
committed
Optimize ACL ability types
1 parent 628c4ae commit c95dc74

15 files changed

Lines changed: 135 additions & 99 deletions

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@povio/openapi-codegen-cli",
3-
"version": "1.0.3",
3+
"version": "1.1.0",
44
"main": "./dist/index.js",
55
"bin": {
66
"openapi-codegen": "./dist/sh.js"

src/generators/const/acl.const.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { GenerateFile, Import } from "src/generators/types/generate";
22

33
export const ACL_APP_ABILITY_FILE: GenerateFile = { fileName: "acl/app.ability", extension: "ts" };
4-
export const ACL_ALL_ABILITIES = "AllAbilities";
54
export const ACL_APP_ABILITIES = "AppAbilities";
65

76
export const ACL_CHECK_FILE: GenerateFile = { fileName: "acl/useAclCheck", extension: "ts" };

src/generators/generate/generateAcl.ts

Lines changed: 13 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,17 @@
1-
import {
2-
ACL_ALL_ABILITIES,
3-
ACL_APP_ABILITIES,
4-
CASL_ABILITY_BINDING,
5-
CASL_ABILITY_IMPORT,
6-
} from "src/generators/const/acl.const";
7-
import { SchemaResolver } from "src/generators/core/SchemaResolver.class";
1+
import { ACL_APP_ABILITIES, CASL_ABILITY_BINDING, CASL_ABILITY_IMPORT } from "src/generators/const/acl.const";
82
import { GenerateType, GenerateTypeParams, Import } from "src/generators/types/generate";
9-
import { getUniqueArray } from "src/generators/utils/array.utils";
10-
import { getTagAllAbilitiesName } from "src/generators/utils/generate/generate.acl.utils";
11-
import { getEntityImports, getModelsImports } from "src/generators/utils/generate/generate.imports.utils";
3+
import { getAclData, getAppAbilitiesType } from "src/generators/utils/generate/generate.acl.utils";
124
import { getNamespaceName } from "src/generators/utils/generate/generate.utils";
135
import { getHbsTemplateDelegate } from "src/generators/utils/hbs/hbs-template.utils";
146

157
export function generateAcl({ resolver, data, tag = "" }: GenerateTypeParams) {
16-
const endpoints = data.get(tag)?.endpoints.filter(({ acl }) => acl && acl.length > 0);
17-
if (!endpoints || endpoints.length === 0) {
8+
const aclData = getAclData({ resolver, data, tag });
9+
if (!aclData) {
1810
return;
1911
}
2012

21-
const hasAdditionalAbilityImports = endpoints.some(
22-
({ acl }) => acl?.[0].conditions && Object.keys(acl[0].conditions).length > 0,
23-
);
13+
const { hasAdditionalAbilityImports, modelsImports, endpoints } = aclData;
14+
2415
const caslAbilityTupleImport: Import = {
2516
bindings: [
2617
CASL_ABILITY_BINDING.abilityTuple,
@@ -29,20 +20,6 @@ export function generateAcl({ resolver, data, tag = "" }: GenerateTypeParams) {
2920
from: CASL_ABILITY_IMPORT.from,
3021
};
3122

32-
const aclZodSchemas = endpoints.reduce((acc, endpoint) => {
33-
const zodSchemas = endpoint.acl?.[0].conditionsTypes?.reduce(
34-
(acc, propertyType) => [...acc, ...(propertyType?.zodSchemaName ? [propertyType.zodSchemaName] : [])],
35-
[] as string[],
36-
);
37-
return [...acc, ...(zodSchemas ?? [])];
38-
}, [] as string[]);
39-
40-
const modelsImports = getModelsImports({
41-
resolver,
42-
tag,
43-
zodSchemasAsTypes: getUniqueArray(aclZodSchemas),
44-
});
45-
4623
const hbsTemplate = getHbsTemplateDelegate(resolver, "acl");
4724

4825
return hbsTemplate({
@@ -54,35 +31,25 @@ export function generateAcl({ resolver, data, tag = "" }: GenerateTypeParams) {
5431
});
5532
}
5633

57-
export function generateAppAcl(resolver: SchemaResolver, tags: string[]) {
34+
export function generateAppAcl({ resolver, data }: Omit<GenerateTypeParams, "tag">) {
35+
const { appAbilitiesType, hasAdditionalAbilityImports, modelsImports } = getAppAbilitiesType({ resolver, data });
36+
5837
const caslAbilityTupleImport: Import = {
5938
bindings: [
6039
CASL_ABILITY_BINDING.pureAbility,
61-
...(tags.length === 0 ? [CASL_ABILITY_BINDING.subjectType, CASL_ABILITY_BINDING.abilityTuple] : []),
40+
CASL_ABILITY_BINDING.abilityTuple,
41+
...(hasAdditionalAbilityImports ? [CASL_ABILITY_BINDING.forcedSubject] : []),
6242
],
6343
from: CASL_ABILITY_IMPORT.from,
6444
};
6545

66-
const imports = getEntityImports({
67-
tags,
68-
entityName: ACL_ALL_ABILITIES,
69-
getAliasEntityName: getTagAllAbilitiesName,
70-
type: GenerateType.Acl,
71-
options: resolver.options,
72-
});
73-
74-
const namespaces = tags.map((tag) => getNamespaceName({ type: GenerateType.Acl, tag, options: resolver.options }));
75-
7646
const hbsTemplate = getHbsTemplateDelegate(resolver, "app-acl");
7747

7848
return hbsTemplate({
7949
caslAbilityTupleImport,
80-
imports,
81-
allAbilities: ACL_ALL_ABILITIES,
50+
modelsImports,
51+
appAbilitiesType,
8252
appAbilities: ACL_APP_ABILITIES,
83-
includeNamespace: resolver.options.tsNamespaces,
84-
tags,
85-
namespaces,
8653
abilityTuple: CASL_ABILITY_BINDING.abilityTuple,
8754
subjectType: CASL_ABILITY_BINDING.subjectType,
8855
});

src/generators/generate/generateModels.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ export function generateModels({ resolver, data, tag = "" }: GenerateTypeParams)
2424

2525
const zodSchemasData: Record<string, GenerateZodSchemaData> = Object.entries(zodSchemas).reduce(
2626
(acc, [key, code]) => {
27-
const ref = resolver.getRefByZodSchemaName(key);
2827
const schemaObj = resolver.getZodSchemaObj(key);
2928

3029
const value = {

src/generators/generateCodeFromOpenAPIDoc.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ export function generateCodeFromOpenAPIDoc(openApiDoc: OpenAPIV3.Document, optio
5151
});
5252

5353
generateFilesData.push(
54-
...getAclFiles(appAclTags, resolver),
54+
...getAclFiles(data, resolver),
5555
...getMutationEffectsFiles(data, resolver),
5656
...getZodExtendedFiles(data, resolver),
5757
...getStandaloneFiles(resolver),

src/generators/templates/acl.hbs

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,6 @@
88
{{#if includeNamespace}}
99
export namespace {{namespace}} {
1010
{{/if}}
11-
{{! Ability types }}
12-
{{#each endpoints as | endpoint |}}
13-
{{{genCaslAbilityType endpoint}}}
14-
15-
{{/each}}
16-
{{! All abilities type }}
17-
export type AllAbilities =
18-
{{#each endpoints as | endpoint |}} | {{abilityTypeName endpoint}} {{/each}};
1911

2012
{{! Ability functions }}
2113
{{#each endpoints as | endpoint |}}
@@ -24,4 +16,4 @@ export type AllAbilities =
2416
{{/each}}
2517
{{#if includeNamespace}}
2618
}
27-
{{/if}}
19+
{{/if}}
Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
{{! Casl AbilityTuple import}}
22
{{{genImport caslAbilityTupleImport}}}
3-
{{! Acl imports }}
4-
{{#each imports as | import |}}
5-
{{{genImport import}}}
3+
{{! Models import }}
4+
{{#each modelsImports as | modelsImport |}}
5+
{{{genImport modelsImport}}}
66
{{/each}}
77

88
{{! AppAbilities union type }}
9-
export type {{appAbilities}} =
10-
{{#if tags}}
11-
{{#if includeNamespace}}{{#each namespaces as | namespace |}} | {{namespace}}.{{../allAbilities}}{{/each}}
12-
{{else}}{{#each tags as | tag |}} | {{tagAllAbilitiesName tag}}{{/each}}{{/if}}
9+
export type {{appAbilities}} = {{#if appAbilitiesType}}
10+
{{#each appAbilitiesType as | appAbilityType |}}
11+
| {{../abilityTuple}}<"{{@key}}", {{{union appAbilityType}}}>
12+
{{/each}}
1313
{{else}}
1414
{{abilityTuple}}<string, {{subjectType}}>;
1515
{{/if}}
1616

17-
export type AppAbility = PureAbility<{{appAbilities}}>;
17+
export type AppAbility = PureAbility<{{appAbilities}}>;

src/generators/templates/partials/casl-ability-function.hbs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22
* Use for {{{genCaslAbilityQuery endpoint}}} ability. {{#if (hasAbilityConditions endpoint)}}For global ability, omit the object parameter.{{/if}}{{#if (abilityDescription endpoint)}}
33
* @description {{abilityDescription endpoint}}{{/if}}
44
{{#if (hasAbilityConditions endpoint)}}{{#each (abilityConditionsTypes endpoint) as | propertyType |}} * @param { {{propertyType.type}}{{propertyType.zodSchemaName}} } object.{{propertyType.name}} {{propertyType.name}} from {{propertyType.info}}
5-
{{/each}}{{/if}} * @returns { {{abilityTypeName endpoint}} } An ability tuple indicating the user's ability to use {{{genCaslAbilityQuery endpoint}}}
5+
{{/each}}{{/if}} * @returns { AbilityTuple } An ability tuple indicating the user's ability to use {{{genCaslAbilityQuery endpoint}}}
66
*/
77
export const {{abilityFunctionName endpoint}} = (
88
{{#if (hasAbilityConditions endpoint)}}object?: { {{#each (abilityConditionsTypes endpoint) as | propertyType |}}{{propertyType.name}}{{#unless propertyType.required}}?{{/unless}}: {{propertyType.type}}{{propertyType.zodSchemaName}}, {{/each}} } {{/if}}
99
) => [
1010
"{{ablityAction endpoint}}",
1111
{{#if (hasAbilityConditions endpoint)}}object ? subject("{{ablitySubject endpoint}}", object) : "{{ablitySubject endpoint}}"{{else}}"{{ablitySubject endpoint}}"{{/if}}
12-
] as {{abilityTypeName endpoint}};
12+
] as {{{genCaslAbilityType endpoint}}};
Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1 @@
1-
type {{abilityTypeName endpoint}} = {{abilityTupleType}}<
2-
"{{ablityAction endpoint}}",
3-
"{{ablitySubject endpoint}}"
4-
{{#if (hasAbilityConditions endpoint)}}| (ForcedSubject<"{{ablitySubject endpoint}}"> & { {{#each (abilityConditionsTypes endpoint) as | propertyType |}}{{propertyType.name}}{{#unless propertyType.required}}?{{/unless}}: {{propertyType.type}}{{propertyType.zodSchemaName}}, {{/each}} }){{/if}}
5-
>;
1+
{{abilityTuple}}<"{{ablityAction endpoint}}", {{{union (abilitySubjectTypes endpoint)}}}>

src/generators/utils/generate-files.utils.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import { GenerateData, GenerateFile, GenerateFileData } from "src/generators/typ
1717
import { getOutputFileName, readAssetSync } from "./file.utils";
1818
import { getFileNameWithExtension } from "./generate/generate.utils";
1919

20-
export function getAclFiles(appAclTags: string[], resolver: SchemaResolver): GenerateFileData[] {
20+
export function getAclFiles(data: GenerateData, resolver: SchemaResolver): GenerateFileData[] {
2121
if (!resolver.options.acl) {
2222
return [];
2323
}
@@ -28,7 +28,7 @@ export function getAclFiles(appAclTags: string[], resolver: SchemaResolver): Gen
2828
output: resolver.options.output,
2929
fileName: getFileNameWithExtension(ACL_APP_ABILITY_FILE),
3030
}),
31-
content: generateAppAcl(resolver, appAclTags),
31+
content: generateAppAcl({ resolver, data }),
3232
},
3333
...(resolver.options.checkAcl
3434
? [

0 commit comments

Comments
 (0)