|
@@ -0,0 +1,118 @@
|
|
|
|
+import { Request, Response } from "express";
|
|
|
|
+import { HttpMethod, Route, StatusCodes } from "org.crazydoctor.expressts";
|
|
|
|
+import ServerApp from "..";
|
|
|
|
+import { ClassMapEntity, PackageEntity, Sources } from "../sources/Sources";
|
|
|
|
+import { CommentsManager } from "../comments/CommentsManager";
|
|
|
|
+
|
|
|
|
+type DocumentedClassInfo = {
|
|
|
|
+ documentable: number,
|
|
|
|
+ documented: number
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+type DocumentedPackageInfo = DocumentedClassInfo & {
|
|
|
|
+ children?: { [key: string]: DocumentedPackageInfo }
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+class GetDocumentedInfo extends Route {
|
|
|
|
+ protected action = (req: Request, res: Response) => {
|
|
|
|
+ const params = req.body;
|
|
|
|
+
|
|
|
|
+ if(ServerApp.SourcesUpdating) {
|
|
|
|
+ res.status(StatusCodes.ACCEPTED).render('sources-update');
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ const root = params.root;
|
|
|
|
+ const packageName = params.packageName;
|
|
|
|
+ const className = params.className;
|
|
|
|
+
|
|
|
|
+ const cls: ClassMapEntity | null = Sources.findClass(className);
|
|
|
|
+ const pck: PackageEntity | null = Sources.findPackage(root, packageName);
|
|
|
|
+
|
|
|
|
+ if(!root && !packageName && !className) {
|
|
|
|
+ this.getRootsDocumentedInfo().then((result) => {
|
|
|
|
+ res.status(StatusCodes.OK).type('application/json').send(JSON.stringify(result));
|
|
|
|
+ });
|
|
|
|
+ } else if(!cls && !pck) {
|
|
|
|
+ res.status(StatusCodes.NOT_FOUND).type('application/json').send({ success: false });
|
|
|
|
+ } else if(cls) {
|
|
|
|
+ this.getClassDocumentedInfo(cls).then((result) => {
|
|
|
|
+ res.status(StatusCodes.OK).type('application/json').send(JSON.stringify(result));
|
|
|
|
+ });
|
|
|
|
+ } else if(pck) {
|
|
|
|
+ this.getPackageDocumentedInfo(pck).then((result) => {
|
|
|
|
+ res.status(StatusCodes.OK).type('application/json').send(JSON.stringify(result));
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ private async getRootsDocumentedInfo(): Promise<{ [key: string]: DocumentedClassInfo }> {
|
|
|
|
+ const roots = Sources.getRepoNames();
|
|
|
|
+ const result: { [key: string]: DocumentedClassInfo } = {};
|
|
|
|
+
|
|
|
|
+ for(let root of roots) {
|
|
|
|
+ let sumDocumentable = 0;
|
|
|
|
+ let sumDocumented = 0;
|
|
|
|
+ const classes = Sources.findClassesByRoot(root);
|
|
|
|
+
|
|
|
|
+ if(!classes)
|
|
|
|
+ continue;
|
|
|
|
+
|
|
|
|
+ for(let cls of classes) {
|
|
|
|
+ const res = await this.getClassDocumentedInfo(cls);
|
|
|
|
+ sumDocumentable += res.documentable;
|
|
|
|
+ sumDocumented += res.documented;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ result[root] = { documented: sumDocumented, documentable: sumDocumentable };
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return result;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private async getPackageDocumentedInfo(pck: PackageEntity): Promise<DocumentedPackageInfo> {
|
|
|
|
+ const results: Map<string, DocumentedPackageInfo> = new Map();
|
|
|
|
+
|
|
|
|
+ let sumDocumentable = 0;
|
|
|
|
+ let sumDocumented = 0;
|
|
|
|
+
|
|
|
|
+ const promises = pck.children.map(async (child) => {
|
|
|
|
+ const found = Sources.findClass(child);
|
|
|
|
+ if(found) {
|
|
|
|
+ const result = await this.getClassDocumentedInfo(found);
|
|
|
|
+ results.set(child, result);
|
|
|
|
+ sumDocumentable += result.documentable;
|
|
|
|
+ sumDocumented += result.documented;
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ await Promise.all(promises);
|
|
|
|
+
|
|
|
|
+ return { documented: sumDocumented, documentable: sumDocumentable, children: Object.fromEntries(results) };
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private async getClassDocumentedInfo(cls: ClassMapEntity): Promise<DocumentedClassInfo> {
|
|
|
|
+ const excludeList = ['callParent', 'newInstance'];
|
|
|
|
+ let documentable = cls.documentableProperties;
|
|
|
|
+ let documented = 0;
|
|
|
|
+
|
|
|
|
+ const commentsResult = await CommentsManager.getCommentsByClass(cls.root, cls.name);
|
|
|
|
+
|
|
|
|
+ if(!commentsResult.success)
|
|
|
|
+ return { documentable: 0, documented: 0 };
|
|
|
|
+
|
|
|
|
+ commentsResult.comments?.forEach((comment) => {
|
|
|
|
+ if(comment.text && comment.text.length > 0 && !excludeList.includes(comment.propertyName))
|
|
|
|
+ documented++;
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ return { documentable, documented }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ protected method = HttpMethod.POST;
|
|
|
|
+ protected order = 10;
|
|
|
|
+ protected route = '/docinfo';
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+export default GetDocumentedInfo;
|