ldap-rest 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/README.md +48 -0
- package/bin/cleanup-external-users.mjs +219 -0
- package/bin/index.mjs +54 -0
- package/bin/sync-james.mjs +190 -0
- package/dist/abstract/ldapFlat.js +1 -0
- package/dist/abstract/plugin.js +1 -0
- package/dist/abstract/twakePlugin.js +1 -0
- package/dist/bin/index.js +1 -0
- package/dist/config/args.js +1 -0
- package/dist/lib/auth/base.js +1 -0
- package/dist/lib/authz/base.js +1 -0
- package/dist/lib/expressFormatedResponses.js +1 -0
- package/dist/lib/ldapActions.js +1 -0
- package/dist/lib/parseConfig.js +1 -0
- package/dist/lib/utils.js +1 -0
- package/dist/logger/winston.js +1 -0
- package/dist/plugins/auth/authzLinid1.js +1 -0
- package/dist/plugins/auth/authzPerBranch.js +1 -0
- package/dist/plugins/auth/crowdsec.js +1 -0
- package/dist/plugins/auth/llng.js +1 -0
- package/dist/plugins/auth/openidconnect.js +1 -0
- package/dist/plugins/auth/rateLimit.js +1 -0
- package/dist/plugins/auth/token.js +1 -0
- package/dist/plugins/configApi.js +1 -0
- package/dist/plugins/demo/helloworld.js +1 -0
- package/dist/plugins/ldap/bulkImport.js +1 -0
- package/dist/plugins/ldap/departmentSync.js +1 -0
- package/dist/plugins/ldap/externalUsersInGroups.js +1 -0
- package/dist/plugins/ldap/flatGeneric.js +1 -0
- package/dist/plugins/ldap/groups.js +1 -0
- package/dist/plugins/ldap/onChange.js +1 -0
- package/dist/plugins/ldap/organization.js +1 -0
- package/dist/plugins/ldap/trash.js +1 -0
- package/dist/plugins/priority.json.js +1 -0
- package/dist/plugins/static.js +1 -0
- package/dist/plugins/twake/calendarResources.js +1 -0
- package/dist/plugins/twake/james.js +1 -0
- package/dist/plugins/weblogs.js +1 -0
- package/dist/src/abstract/ldapFlat.d.ts +94 -0
- package/dist/src/abstract/plugin.d.ts +43 -0
- package/dist/src/abstract/twakePlugin.d.ts +90 -0
- package/dist/src/bin/index.d.ts +43 -0
- package/dist/src/browser/ldap-group-editor/LdapGroupEditor.d.ts +31 -0
- package/dist/src/browser/ldap-group-editor/api/GroupApiClient.d.ts +23 -0
- package/dist/src/browser/ldap-group-editor/components/CreateGroupModal.d.ts +19 -0
- package/dist/src/browser/ldap-group-editor/components/GroupPropertyEditor.d.ts +30 -0
- package/dist/src/browser/ldap-group-editor/components/GroupTree.d.ts +17 -0
- package/dist/src/browser/ldap-group-editor/components/MoveGroupModal.d.ts +20 -0
- package/dist/src/browser/ldap-group-editor/index.d.ts +6 -0
- package/dist/src/browser/ldap-group-editor/types.d.ts +58 -0
- package/dist/src/browser/ldap-resource-editor/api/ResourceApiClient.d.ts +53 -0
- package/dist/src/browser/ldap-resource-editor/cache/CacheManager.d.ts +65 -0
- package/dist/src/browser/ldap-resource-editor/index.d.ts +6 -0
- package/dist/src/browser/ldap-resource-editor/types.d.ts +78 -0
- package/dist/src/browser/ldap-tree-viewer/LdapTreeViewer.d.ts +26 -0
- package/dist/src/browser/ldap-tree-viewer/api/LdapApiClient.d.ts +30 -0
- package/dist/src/browser/ldap-tree-viewer/components/TreeNode.d.ts +17 -0
- package/dist/src/browser/ldap-tree-viewer/components/TreeRoot.d.ts +14 -0
- package/dist/src/browser/ldap-tree-viewer/index.d.ts +7 -0
- package/dist/src/browser/ldap-tree-viewer/store/Store.d.ts +18 -0
- package/dist/src/browser/ldap-tree-viewer/store/actions.d.ts +28 -0
- package/dist/src/browser/ldap-tree-viewer/store/reducers.d.ts +7 -0
- package/dist/src/browser/ldap-tree-viewer/types.d.ts +34 -0
- package/dist/src/browser/ldap-unit-editor/LdapUnitEditor.d.ts +27 -0
- package/dist/src/browser/ldap-unit-editor/api/UnitApiClient.d.ts +24 -0
- package/dist/src/browser/ldap-unit-editor/components/MoveUnitModal.d.ts +28 -0
- package/dist/src/browser/ldap-unit-editor/components/UnitPropertyEditor.d.ts +28 -0
- package/dist/src/browser/ldap-unit-editor/components/UnitTree.d.ts +18 -0
- package/dist/src/browser/ldap-unit-editor/index.d.ts +6 -0
- package/dist/src/browser/ldap-unit-editor/types.d.ts +55 -0
- package/dist/src/browser/ldap-user-editor/LdapUserEditor.d.ts +32 -0
- package/dist/src/browser/ldap-user-editor/api/UserApiClient.d.ts +55 -0
- package/dist/src/browser/ldap-user-editor/cache/CacheManager.d.ts +65 -0
- package/dist/src/browser/ldap-user-editor/components/MoveUserModal.d.ts +28 -0
- package/dist/src/browser/ldap-user-editor/components/PointerField.d.ts +22 -0
- package/dist/src/browser/ldap-user-editor/components/UserEditor.d.ts +46 -0
- package/dist/src/browser/ldap-user-editor/components/UserList.d.ts +24 -0
- package/dist/src/browser/ldap-user-editor/components/UserTree.d.ts +24 -0
- package/dist/src/browser/ldap-user-editor/index.d.ts +7 -0
- package/dist/src/browser/ldap-user-editor/types.d.ts +67 -0
- package/dist/src/browser/shared/components/Modal.d.ts +38 -0
- package/dist/src/browser/shared/components/StatusMessage.d.ts +48 -0
- package/dist/src/browser/shared/index.d.ts +10 -0
- package/dist/src/browser/shared/types/index.d.ts +65 -0
- package/dist/src/browser/shared/utils/dom.d.ts +33 -0
- package/dist/src/browser/shared/utils/form.d.ts +28 -0
- package/dist/src/browser/shared/utils/schema.d.ts +29 -0
- package/dist/src/config/args.d.ts +128 -0
- package/dist/src/config/schema.d.ts +18 -0
- package/dist/src/hooks.d.ts +76 -0
- package/dist/src/lib/auth/base.d.ts +9 -0
- package/dist/src/lib/authz/base.d.ts +63 -0
- package/dist/src/lib/expressFormatedResponses.d.ts +26 -0
- package/dist/src/lib/ldapActions.d.ts +91 -0
- package/dist/src/lib/parseConfig.d.ts +23 -0
- package/dist/src/lib/utils.d.ts +73 -0
- package/dist/src/logger/winston.d.ts +3 -0
- package/dist/src/plugins/auth/authzLinid1.d.ts +46 -0
- package/dist/src/plugins/auth/authzPerBranch.d.ts +59 -0
- package/dist/src/plugins/auth/crowdsec.d.ts +29 -0
- package/dist/src/plugins/auth/llng.d.ts +8 -0
- package/dist/src/plugins/auth/openidconnect.d.ts +11 -0
- package/dist/src/plugins/auth/rateLimit.d.ts +24 -0
- package/dist/src/plugins/auth/token.d.ts +17 -0
- package/dist/src/plugins/configApi.d.ts +24 -0
- package/dist/src/plugins/demo/helloworld.d.ts +12 -0
- package/dist/src/plugins/ldap/bulkImport.d.ts +48 -0
- package/dist/src/plugins/ldap/departmentSync.d.ts +35 -0
- package/dist/src/plugins/ldap/externalUsersInGroups.d.ts +21 -0
- package/dist/src/plugins/ldap/flatGeneric.d.ts +31 -0
- package/dist/src/plugins/ldap/groups.d.ts +95 -0
- package/dist/src/plugins/ldap/onChange.d.ts +32 -0
- package/dist/src/plugins/ldap/organization.d.ts +65 -0
- package/dist/src/plugins/ldap/trash.d.ts +52 -0
- package/dist/src/plugins/static.d.ts +7 -0
- package/dist/src/plugins/twake/calendarResources.d.ts +31 -0
- package/dist/src/plugins/twake/james.d.ts +83 -0
- package/dist/src/plugins/weblogs.d.ts +8 -0
- package/docs/DEVELOPER_GUIDE.md +298 -0
- package/docs/OPENAPI.md +440 -0
- package/docs/PLUGIN_DEPENDENCIES.md +612 -0
- package/docs/README.md +466 -0
- package/docs/api/REFERENCE.md +983 -0
- package/docs/api/REST_API.md +1237 -0
- package/docs/authentication.md +469 -0
- package/docs/authzLinid1.md +521 -0
- package/docs/authzPerBranch.md +596 -0
- package/docs/browser/LIBRARIES.md +1196 -0
- package/docs/examples/EXAMPLES.md +1659 -0
- package/docs/examples/twake-mailbox-type-nomenclature.ldif +37 -0
- package/docs/examples/twake-mailbox-type-schema-amendment.ldif +30 -0
- package/docs/jamesTeamMailboxes.md +343 -0
- package/docs/ldapBulkImport.md +722 -0
- package/docs/ldapExternalUsersInGroups.md +325 -0
- package/docs/ldapFlatGeneric.md +444 -0
- package/docs/ldapGroups.md +589 -0
- package/docs/ldapOrganizations.md +659 -0
- package/docs/ldapTrash.md +260 -0
- package/docs/linagora.png +0 -0
- package/docs/onChange.md +318 -0
- package/docs/plugins/DEVELOPMENT.md +1219 -0
- package/docs/presenterm-fr.md +721 -0
- package/docs/presenterm.md +721 -0
- package/docs/schemas/SCHEMAS.md +1212 -0
- package/docs/static.md +410 -0
- package/docs/twakeCalendarResources.md +148 -0
- package/docs/twakeJames.md +661 -0
- package/docs/weblogs.md +399 -0
- package/examples/web/ldap-group-editor.html +113 -0
- package/examples/web/ldap-tree-viewer.html +368 -0
- package/examples/web/ldap-unit-editor.html +108 -0
- package/examples/web/ldap-user-editor.html +412 -0
- package/package.json +458 -0
- package/static/browser/common-demo.css +450 -0
- package/static/browser/ldap-group-editor/LdapGroupEditor.js +207 -0
- package/static/browser/ldap-group-editor/LdapGroupEditor.js.map +1 -0
- package/static/browser/ldap-group-editor/api/GroupApiClient.js +112 -0
- package/static/browser/ldap-group-editor/api/GroupApiClient.js.map +1 -0
- package/static/browser/ldap-group-editor/components/CreateGroupModal.js +212 -0
- package/static/browser/ldap-group-editor/components/CreateGroupModal.js.map +1 -0
- package/static/browser/ldap-group-editor/components/GroupPropertyEditor.js +497 -0
- package/static/browser/ldap-group-editor/components/GroupPropertyEditor.js.map +1 -0
- package/static/browser/ldap-group-editor/components/GroupTree.js +153 -0
- package/static/browser/ldap-group-editor/components/GroupTree.js.map +1 -0
- package/static/browser/ldap-group-editor/components/MoveGroupModal.js +235 -0
- package/static/browser/ldap-group-editor/components/MoveGroupModal.js.map +1 -0
- package/static/browser/ldap-group-editor/index.js +2 -0
- package/static/browser/ldap-group-editor/index.js.map +1 -0
- package/static/browser/ldap-group-editor/types.js +2 -0
- package/static/browser/ldap-group-editor/types.js.map +1 -0
- package/static/browser/ldap-group-editor.esm.js +1399 -0
- package/static/browser/ldap-group-editor.esm.js.map +1 -0
- package/static/browser/ldap-group-editor.js +1407 -0
- package/static/browser/ldap-group-editor.js.map +1 -0
- package/static/browser/ldap-group-editor.min.js +2 -0
- package/static/browser/ldap-group-editor.min.js.map +1 -0
- package/static/browser/ldap-resource-editor/api/ResourceApiClient.js +226 -0
- package/static/browser/ldap-resource-editor/api/ResourceApiClient.js.map +1 -0
- package/static/browser/ldap-resource-editor/cache/CacheManager.js +123 -0
- package/static/browser/ldap-resource-editor/cache/CacheManager.js.map +1 -0
- package/static/browser/ldap-resource-editor/index.js +2 -0
- package/static/browser/ldap-resource-editor/index.js.map +1 -0
- package/static/browser/ldap-resource-editor/types.js +2 -0
- package/static/browser/ldap-resource-editor/types.js.map +1 -0
- package/static/browser/ldap-tree-viewer/LdapTreeViewer.js +187 -0
- package/static/browser/ldap-tree-viewer/LdapTreeViewer.js.map +1 -0
- package/static/browser/ldap-tree-viewer/api/LdapApiClient.js +50 -0
- package/static/browser/ldap-tree-viewer/api/LdapApiClient.js.map +1 -0
- package/static/browser/ldap-tree-viewer/components/TreeNode.js +140 -0
- package/static/browser/ldap-tree-viewer/components/TreeNode.js.map +1 -0
- package/static/browser/ldap-tree-viewer/components/TreeRoot.js +98 -0
- package/static/browser/ldap-tree-viewer/components/TreeRoot.js.map +1 -0
- package/static/browser/ldap-tree-viewer/index.js +2 -0
- package/static/browser/ldap-tree-viewer/index.js.map +1 -0
- package/static/browser/ldap-tree-viewer/store/Store.js +29 -0
- package/static/browser/ldap-tree-viewer/store/Store.js.map +1 -0
- package/static/browser/ldap-tree-viewer/store/actions.js +53 -0
- package/static/browser/ldap-tree-viewer/store/actions.js.map +1 -0
- package/static/browser/ldap-tree-viewer/store/reducers.js +79 -0
- package/static/browser/ldap-tree-viewer/store/reducers.js.map +1 -0
- package/static/browser/ldap-tree-viewer/types.js +2 -0
- package/static/browser/ldap-tree-viewer/types.js.map +1 -0
- package/static/browser/ldap-tree-viewer.css +2 -0
- package/static/browser/ldap-tree-viewer.css.map +1 -0
- package/static/browser/ldap-tree-viewer.esm.js +606 -0
- package/static/browser/ldap-tree-viewer.esm.js.map +1 -0
- package/static/browser/ldap-tree-viewer.js +614 -0
- package/static/browser/ldap-tree-viewer.js.map +1 -0
- package/static/browser/ldap-tree-viewer.min.js +2 -0
- package/static/browser/ldap-tree-viewer.min.js.map +1 -0
- package/static/browser/ldap-unit-editor/LdapUnitEditor.js +119 -0
- package/static/browser/ldap-unit-editor/LdapUnitEditor.js.map +1 -0
- package/static/browser/ldap-unit-editor/api/UnitApiClient.js +95 -0
- package/static/browser/ldap-unit-editor/api/UnitApiClient.js.map +1 -0
- package/static/browser/ldap-unit-editor/components/MoveUnitModal.js +295 -0
- package/static/browser/ldap-unit-editor/components/MoveUnitModal.js.map +1 -0
- package/static/browser/ldap-unit-editor/components/UnitPropertyEditor.js +321 -0
- package/static/browser/ldap-unit-editor/components/UnitPropertyEditor.js.map +1 -0
- package/static/browser/ldap-unit-editor/components/UnitTree.js +197 -0
- package/static/browser/ldap-unit-editor/components/UnitTree.js.map +1 -0
- package/static/browser/ldap-unit-editor/index.js +2 -0
- package/static/browser/ldap-unit-editor/index.js.map +1 -0
- package/static/browser/ldap-unit-editor/types.js +2 -0
- package/static/browser/ldap-unit-editor/types.js.map +1 -0
- package/static/browser/ldap-unit-editor.esm.js +1013 -0
- package/static/browser/ldap-unit-editor.esm.js.map +1 -0
- package/static/browser/ldap-unit-editor.js +1021 -0
- package/static/browser/ldap-unit-editor.js.map +1 -0
- package/static/browser/ldap-unit-editor.min.js +2 -0
- package/static/browser/ldap-unit-editor.min.js.map +1 -0
- package/static/browser/ldap-user-editor/LdapUserEditor.js +184 -0
- package/static/browser/ldap-user-editor/LdapUserEditor.js.map +1 -0
- package/static/browser/ldap-user-editor/api/UserApiClient.js +209 -0
- package/static/browser/ldap-user-editor/api/UserApiClient.js.map +1 -0
- package/static/browser/ldap-user-editor/cache/CacheManager.js +123 -0
- package/static/browser/ldap-user-editor/cache/CacheManager.js.map +1 -0
- package/static/browser/ldap-user-editor/components/MoveUserModal.js +302 -0
- package/static/browser/ldap-user-editor/components/MoveUserModal.js.map +1 -0
- package/static/browser/ldap-user-editor/components/PointerField.js +152 -0
- package/static/browser/ldap-user-editor/components/PointerField.js.map +1 -0
- package/static/browser/ldap-user-editor/components/UserEditor.js +608 -0
- package/static/browser/ldap-user-editor/components/UserEditor.js.map +1 -0
- package/static/browser/ldap-user-editor/components/UserList.js +181 -0
- package/static/browser/ldap-user-editor/components/UserList.js.map +1 -0
- package/static/browser/ldap-user-editor/components/UserTree.js +164 -0
- package/static/browser/ldap-user-editor/components/UserTree.js.map +1 -0
- package/static/browser/ldap-user-editor/index.js +2 -0
- package/static/browser/ldap-user-editor/index.js.map +1 -0
- package/static/browser/ldap-user-editor/types.js +2 -0
- package/static/browser/ldap-user-editor/types.js.map +1 -0
- package/static/browser/ldap-user-editor.css +2 -0
- package/static/browser/ldap-user-editor.css.map +1 -0
- package/static/browser/ldap-user-editor.esm.js +1897 -0
- package/static/browser/ldap-user-editor.esm.js.map +1 -0
- package/static/browser/ldap-user-editor.js +1905 -0
- package/static/browser/ldap-user-editor.js.map +1 -0
- package/static/browser/ldap-user-editor.min.js +2 -0
- package/static/browser/ldap-user-editor.min.js.map +1 -0
- package/static/browser/shared/components/Modal.js +121 -0
- package/static/browser/shared/components/Modal.js.map +1 -0
- package/static/browser/shared/components/StatusMessage.js +119 -0
- package/static/browser/shared/components/StatusMessage.js.map +1 -0
- package/static/browser/shared/index.js +7 -0
- package/static/browser/shared/index.js.map +1 -0
- package/static/browser/shared/types/index.js +37 -0
- package/static/browser/shared/types/index.js.map +1 -0
- package/static/browser/shared/utils/dom.js +78 -0
- package/static/browser/shared/utils/dom.js.map +1 -0
- package/static/browser/shared/utils/form.js +234 -0
- package/static/browser/shared/utils/form.js.map +1 -0
- package/static/browser/shared/utils/schema.js +121 -0
- package/static/browser/shared/utils/schema.js.map +1 -0
- package/static/browser/shared.esm.js +694 -0
- package/static/browser/shared.esm.js.map +1 -0
- package/static/browser/shared.js +723 -0
- package/static/browser/shared.js.map +1 -0
- package/static/browser/shared.min.js +2 -0
- package/static/browser/shared.min.js.map +1 -0
- package/static/schemas/ad/computers.json +92 -0
- package/static/schemas/ad/groups.json +55 -0
- package/static/schemas/ad/organizations.json +66 -0
- package/static/schemas/ad/users.json +116 -0
- package/static/schemas/standard/devices.json +72 -0
- package/static/schemas/standard/groups.json +54 -0
- package/static/schemas/standard/organizations.json +49 -0
- package/static/schemas/standard/users.json +86 -0
- package/static/schemas/twake/groups.json +75 -0
- package/static/schemas/twake/nomenclature/twakeAccountStatus.json +31 -0
- package/static/schemas/twake/nomenclature/twakeDeliveryMode.json +31 -0
- package/static/schemas/twake/nomenclature/twakeListType.json +31 -0
- package/static/schemas/twake/nomenclature/twakeMailboxType.json +31 -0
- package/static/schemas/twake/nomenclature/twakeTitle.json +31 -0
- package/static/schemas/twake/organizations.json +52 -0
- package/static/schemas/twake/positions.json +32 -0
- package/static/schemas/twake/users.json +112 -0
package/docs/OPENAPI.md
ADDED
|
@@ -0,0 +1,440 @@
|
|
|
1
|
+
# OpenAPI Documentation Generation
|
|
2
|
+
|
|
3
|
+
LDAP-Rest includes an automatic OpenAPI 3.0 specification generator that analyzes TypeScript source code to generate API documentation without modifying production code.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Zero runtime overhead**: Generator runs as a build tool, not in production
|
|
8
|
+
- **TypeScript AST analysis**: Parses TypeScript directly to extract routes
|
|
9
|
+
- **No code annotations required**: Works with existing code structure
|
|
10
|
+
- **Automatic route discovery**: Finds all `app.get()`, `app.post()`, etc. calls
|
|
11
|
+
- **Template variable resolution**: Converts `${this.config.api_prefix}` to `/api`
|
|
12
|
+
- **Express to OpenAPI conversion**: Translates `:param` to `{param}` format
|
|
13
|
+
- **Plugin categorization**: Groups routes by plugin with proper tags
|
|
14
|
+
|
|
15
|
+
## Quick Start
|
|
16
|
+
|
|
17
|
+
### Generate OpenAPI Specification
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npm run generate:openapi
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
This creates `openapi.json` in the project root containing the complete API specification for all loaded plugins.
|
|
24
|
+
|
|
25
|
+
### View the Specification
|
|
26
|
+
|
|
27
|
+
You can use the generated `openapi.json` with various tools:
|
|
28
|
+
|
|
29
|
+
**Swagger UI** (online viewer):
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
# Serve the spec with a simple HTTP server
|
|
33
|
+
npx http-server -p 8080
|
|
34
|
+
|
|
35
|
+
# Visit: https://editor.swagger.io/
|
|
36
|
+
# File → Import URL → http://localhost:8080/openapi.json
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
**Redoc** (documentation generator):
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
npx @redocly/cli preview-docs openapi.json
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**Postman**: Import `openapi.json` directly
|
|
46
|
+
|
|
47
|
+
**VS Code**: Use "OpenAPI (Swagger) Editor" extension
|
|
48
|
+
|
|
49
|
+
## How It Works
|
|
50
|
+
|
|
51
|
+
### 1. TypeScript AST Parsing
|
|
52
|
+
|
|
53
|
+
The generator uses the TypeScript Compiler API to parse all plugin files:
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
// Creates a TypeScript program
|
|
57
|
+
const program = ts.createProgram(fileNames, options);
|
|
58
|
+
const checker = program.getTypeChecker();
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 2. Plugin Discovery
|
|
62
|
+
|
|
63
|
+
Searches for classes extending `DmPlugin`:
|
|
64
|
+
|
|
65
|
+
```typescript
|
|
66
|
+
class LdapGroups extends DmPlugin {
|
|
67
|
+
name = 'ldapGroups'; // Extracted as plugin name
|
|
68
|
+
|
|
69
|
+
api(app: Express): void {
|
|
70
|
+
// Routes extracted from here
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### 3. Route Extraction
|
|
76
|
+
|
|
77
|
+
Finds all Express route definitions:
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
// Input (in plugin code):
|
|
81
|
+
app.get(`${this.config.api_prefix}/v1/ldap/groups/:cn`, (req, res) => {...});
|
|
82
|
+
|
|
83
|
+
// Output (in openapi.json):
|
|
84
|
+
{
|
|
85
|
+
"/api/v1/ldap/groups/{cn}": {
|
|
86
|
+
"get": {
|
|
87
|
+
"summary": "Get groups",
|
|
88
|
+
"tags": ["Groups"],
|
|
89
|
+
"parameters": [
|
|
90
|
+
{
|
|
91
|
+
"name": "cn",
|
|
92
|
+
"in": "path",
|
|
93
|
+
"required": true,
|
|
94
|
+
"schema": { "type": "string" }
|
|
95
|
+
}
|
|
96
|
+
]
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### 4. Template Variable Resolution
|
|
103
|
+
|
|
104
|
+
Replaces template variables with actual values:
|
|
105
|
+
|
|
106
|
+
| Template Variable | Replacement |
|
|
107
|
+
| ---------------------------- | ------------ |
|
|
108
|
+
| `${this.config.api_prefix}` | `/api` |
|
|
109
|
+
| `${apiPrefix}` | `/api` |
|
|
110
|
+
| `${this.config.static_name}` | `static` |
|
|
111
|
+
| `${resourceName}` | `{resource}` |
|
|
112
|
+
|
|
113
|
+
### 5. Special Handling
|
|
114
|
+
|
|
115
|
+
**Multipart Form Data** (Bulk Import):
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
// Detected from path pattern
|
|
119
|
+
if (pathTemplate.includes('bulk-import')) {
|
|
120
|
+
requestBody.content = {
|
|
121
|
+
'multipart/form-data': {
|
|
122
|
+
schema: {
|
|
123
|
+
properties: {
|
|
124
|
+
file: { type: 'string', format: 'binary' },
|
|
125
|
+
dryRun: { type: 'boolean' },
|
|
126
|
+
// ...
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**CSV Templates**:
|
|
135
|
+
|
|
136
|
+
```typescript
|
|
137
|
+
// Detected from path pattern
|
|
138
|
+
if (method === 'get' && pathTemplate.includes('template.csv')) {
|
|
139
|
+
responses = {
|
|
140
|
+
'200': {
|
|
141
|
+
description: 'CSV template',
|
|
142
|
+
content: {
|
|
143
|
+
'text/csv': { schema: { type: 'string' } },
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## Generated Structure
|
|
151
|
+
|
|
152
|
+
The `openapi.json` file contains:
|
|
153
|
+
|
|
154
|
+
```json
|
|
155
|
+
{
|
|
156
|
+
"openapi": "3.0.0",
|
|
157
|
+
"info": {
|
|
158
|
+
"title": "LDAP-Rest API",
|
|
159
|
+
"version": "1.0.0",
|
|
160
|
+
"description": "RESTful API for LDAP management with LDAP-Rest"
|
|
161
|
+
},
|
|
162
|
+
"servers": [
|
|
163
|
+
{
|
|
164
|
+
"url": "http://localhost:8081",
|
|
165
|
+
"description": "Development server"
|
|
166
|
+
}
|
|
167
|
+
],
|
|
168
|
+
"paths": {
|
|
169
|
+
"/api/v1/ldap/groups": { ... },
|
|
170
|
+
"/api/v1/ldap/organizations": { ... }
|
|
171
|
+
},
|
|
172
|
+
"tags": [
|
|
173
|
+
{ "name": "Groups", "description": "Groups operations" },
|
|
174
|
+
{ "name": "Organizations", "description": "Organizations operations" }
|
|
175
|
+
]
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## Supported Plugins
|
|
180
|
+
|
|
181
|
+
The generator automatically discovers routes from all plugins:
|
|
182
|
+
|
|
183
|
+
| Plugin | Tag | Routes |
|
|
184
|
+
| ------------------- | ------------- | ----------- |
|
|
185
|
+
| `ldapGroups` | Groups | 8 endpoints |
|
|
186
|
+
| `ldapOrganizations` | Organizations | 7 endpoints |
|
|
187
|
+
| `ldapBulkImport` | Bulk Import | 2 endpoints |
|
|
188
|
+
| `configApi` | Configuration | 1 endpoint |
|
|
189
|
+
| `static` | Static Files | 2 endpoints |
|
|
190
|
+
|
|
191
|
+
_Note: Number of routes may vary based on configuration and loaded plugins_
|
|
192
|
+
|
|
193
|
+
## Customizing Summaries
|
|
194
|
+
|
|
195
|
+
While the generator provides default summaries, you can add JSDoc comments to improve them:
|
|
196
|
+
|
|
197
|
+
```typescript
|
|
198
|
+
/**
|
|
199
|
+
* @openapi summary: List all groups with optional filtering
|
|
200
|
+
* @openapi description: Returns all LDAP groups, optionally filtered by match query
|
|
201
|
+
*/
|
|
202
|
+
app.get(`${this.config.api_prefix}/v1/ldap/groups`, async (req, res) => {
|
|
203
|
+
// ...
|
|
204
|
+
});
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
The generator will extract these annotations:
|
|
208
|
+
|
|
209
|
+
- `@openapi summary:` → `summary` field
|
|
210
|
+
- `@openapi description:` → `description` field
|
|
211
|
+
|
|
212
|
+
## Plugin Tag Mapping
|
|
213
|
+
|
|
214
|
+
The generator maps plugin names to human-readable tags:
|
|
215
|
+
|
|
216
|
+
```typescript
|
|
217
|
+
private pluginTags: Map<string, string> = new Map([
|
|
218
|
+
['ldapGroups', 'Groups'],
|
|
219
|
+
['ldapOrganizations', 'Organizations'],
|
|
220
|
+
['ldapFlatGeneric', 'Entities'],
|
|
221
|
+
['ldapBulkImport', 'Bulk Import'],
|
|
222
|
+
['james', 'Apache James Integration'],
|
|
223
|
+
['calendarResources', 'Calendar Resources'],
|
|
224
|
+
['configApi', 'Configuration'],
|
|
225
|
+
['static', 'Static Files'],
|
|
226
|
+
]);
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
To add mappings for custom plugins, edit `scripts/generate-openapi.ts`.
|
|
230
|
+
|
|
231
|
+
## Integration with CI/CD
|
|
232
|
+
|
|
233
|
+
### Verify Spec is Up-to-Date
|
|
234
|
+
|
|
235
|
+
Add to your CI pipeline:
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
# Generate fresh spec
|
|
239
|
+
npm run generate:openapi
|
|
240
|
+
|
|
241
|
+
# Check if it differs from committed version
|
|
242
|
+
git diff --exit-code openapi.json
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### Generate on Pre-Commit
|
|
246
|
+
|
|
247
|
+
Add to `.git/hooks/pre-commit`:
|
|
248
|
+
|
|
249
|
+
```bash
|
|
250
|
+
#!/bin/sh
|
|
251
|
+
npm run generate:openapi
|
|
252
|
+
git add openapi.json
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### Publish to API Documentation Platform
|
|
256
|
+
|
|
257
|
+
```bash
|
|
258
|
+
# After generation, upload to your docs platform
|
|
259
|
+
npm run generate:openapi
|
|
260
|
+
npx @redocly/cli push openapi.json
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
## Limitations
|
|
264
|
+
|
|
265
|
+
### Current Limitations
|
|
266
|
+
|
|
267
|
+
1. **No type inference**: Schemas are generic `{ type: 'object' }`
|
|
268
|
+
2. **No JSDoc parsing**: Only basic `@openapi` annotations supported
|
|
269
|
+
3. **Static analysis only**: Cannot analyze dynamic routes
|
|
270
|
+
4. **No response schemas**: All responses use generic object type
|
|
271
|
+
|
|
272
|
+
### Why These Limitations?
|
|
273
|
+
|
|
274
|
+
The generator uses **static analysis** to avoid runtime dependencies. This means:
|
|
275
|
+
|
|
276
|
+
- ✅ Zero impact on production code
|
|
277
|
+
- ✅ No decorators or annotations required
|
|
278
|
+
- ✅ Fast generation
|
|
279
|
+
- ❌ Limited type information
|
|
280
|
+
|
|
281
|
+
### Future Enhancements
|
|
282
|
+
|
|
283
|
+
Planned improvements:
|
|
284
|
+
|
|
285
|
+
- [ ] Extract TypeScript interfaces for request/response bodies
|
|
286
|
+
- [ ] Parse JSDoc `@param` and `@returns` annotations
|
|
287
|
+
- [ ] Generate schema definitions from TypeScript types
|
|
288
|
+
- [ ] Support for custom response status codes
|
|
289
|
+
- [ ] Query parameter detection from `req.query`
|
|
290
|
+
|
|
291
|
+
## Troubleshooting
|
|
292
|
+
|
|
293
|
+
### "tsconfig.json not found"
|
|
294
|
+
|
|
295
|
+
The generator needs a valid TypeScript configuration:
|
|
296
|
+
|
|
297
|
+
```bash
|
|
298
|
+
# Ensure tsconfig.json exists
|
|
299
|
+
ls tsconfig.json
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
### "Found 0 plugins"
|
|
303
|
+
|
|
304
|
+
Check that:
|
|
305
|
+
|
|
306
|
+
1. Plugins extend `DmPlugin`
|
|
307
|
+
2. Plugins have an `api(app: Express)` method
|
|
308
|
+
3. TypeScript compilation succeeds: `npm run check:ts`
|
|
309
|
+
|
|
310
|
+
### Wrong paths generated
|
|
311
|
+
|
|
312
|
+
Template variables not replaced correctly? Check:
|
|
313
|
+
|
|
314
|
+
```typescript
|
|
315
|
+
// Supported:
|
|
316
|
+
`${this.config.api_prefix}/v1/...``${apiPrefix}/v1/...``${this.config.static_name}/...`
|
|
317
|
+
// Not supported:
|
|
318
|
+
`${someOtherVariable}/...`;
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
Add custom replacements in `scripts/generate-openapi.ts`:
|
|
322
|
+
|
|
323
|
+
```typescript
|
|
324
|
+
pathTemplate = text.replace(/\$\{myVariable\}/g, 'replacement');
|
|
325
|
+
// ...
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
### Routes missing
|
|
329
|
+
|
|
330
|
+
The generator only finds routes in `api()` methods of plugin classes. Routes defined elsewhere won't be detected.
|
|
331
|
+
|
|
332
|
+
## Examples
|
|
333
|
+
|
|
334
|
+
### Example 1: View API in Swagger Editor
|
|
335
|
+
|
|
336
|
+
```bash
|
|
337
|
+
# 1. Generate spec
|
|
338
|
+
npm run generate:openapi
|
|
339
|
+
|
|
340
|
+
# 2. Start local server
|
|
341
|
+
npx http-server -p 8080
|
|
342
|
+
|
|
343
|
+
# 3. Visit https://editor.swagger.io/
|
|
344
|
+
# 4. File → Import URL → http://localhost:8080/openapi.json
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
### Example 2: Generate TypeScript Client
|
|
348
|
+
|
|
349
|
+
```bash
|
|
350
|
+
# Generate spec
|
|
351
|
+
npm run generate:openapi
|
|
352
|
+
|
|
353
|
+
# Generate TypeScript axios client
|
|
354
|
+
npx @openapitools/openapi-generator-cli generate \
|
|
355
|
+
-i openapi.json \
|
|
356
|
+
-g typescript-axios \
|
|
357
|
+
-o ./generated-client
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
### Example 3: Validate API Responses
|
|
361
|
+
|
|
362
|
+
```bash
|
|
363
|
+
# Generate spec
|
|
364
|
+
npm run generate:openapi
|
|
365
|
+
|
|
366
|
+
# Install validator
|
|
367
|
+
npm install --save-dev @seriousme/openapi-schema-validator
|
|
368
|
+
|
|
369
|
+
# Use in tests
|
|
370
|
+
import { Validator } from '@seriousme/openapi-schema-validator';
|
|
371
|
+
|
|
372
|
+
const validator = new Validator();
|
|
373
|
+
await validator.validate('./openapi.json');
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
## Comparison with Alternatives
|
|
377
|
+
|
|
378
|
+
### tsoa (TypeScript OpenAPI)
|
|
379
|
+
|
|
380
|
+
**Pros**:
|
|
381
|
+
|
|
382
|
+
- Full type inference
|
|
383
|
+
- Automatic validation
|
|
384
|
+
- Schema generation
|
|
385
|
+
|
|
386
|
+
**Cons**:
|
|
387
|
+
|
|
388
|
+
- ❌ Requires decorators in production code
|
|
389
|
+
- ❌ Changes code structure
|
|
390
|
+
- ❌ Runtime overhead
|
|
391
|
+
|
|
392
|
+
### swagger-jsdoc
|
|
393
|
+
|
|
394
|
+
**Pros**:
|
|
395
|
+
|
|
396
|
+
- JSDoc annotations
|
|
397
|
+
- Familiar syntax
|
|
398
|
+
|
|
399
|
+
**Cons**:
|
|
400
|
+
|
|
401
|
+
- ❌ Requires extensive annotations
|
|
402
|
+
- ❌ Pollutes code with comments
|
|
403
|
+
- ❌ Manual maintenance
|
|
404
|
+
|
|
405
|
+
### LDAP-Rest Generator
|
|
406
|
+
|
|
407
|
+
**Pros**:
|
|
408
|
+
|
|
409
|
+
- ✅ No production code changes
|
|
410
|
+
- ✅ Zero runtime overhead
|
|
411
|
+
- ✅ Automatic route discovery
|
|
412
|
+
- ✅ Works with existing code
|
|
413
|
+
|
|
414
|
+
**Cons**:
|
|
415
|
+
|
|
416
|
+
- ⚠️ Limited type information
|
|
417
|
+
- ⚠️ Generic schemas
|
|
418
|
+
|
|
419
|
+
## Contributing
|
|
420
|
+
|
|
421
|
+
To improve the generator:
|
|
422
|
+
|
|
423
|
+
1. Edit `scripts/generate-openapi.ts`
|
|
424
|
+
2. Test with `npm run generate:openapi`
|
|
425
|
+
3. Verify output in `openapi.json`
|
|
426
|
+
4. Submit PR with changes
|
|
427
|
+
|
|
428
|
+
Common improvements:
|
|
429
|
+
|
|
430
|
+
- Add plugin tag mappings
|
|
431
|
+
- Improve summary generation
|
|
432
|
+
- Add more template variable replacements
|
|
433
|
+
- Extract TypeScript types for schemas
|
|
434
|
+
|
|
435
|
+
## See Also
|
|
436
|
+
|
|
437
|
+
- [Plugin Development Guide](DEVELOPER_GUIDE.md)
|
|
438
|
+
- [Plugin Dependencies](PLUGIN_DEPENDENCIES.md)
|
|
439
|
+
- [OpenAPI 3.0 Specification](https://swagger.io/specification/)
|
|
440
|
+
- [TypeScript Compiler API](https://github.com/Microsoft/TypeScript/wiki/Using-the-Compiler-API)
|