From c2f192917b07891358f79b7287c31ded0017eee1 Mon Sep 17 00:00:00 2001 From: Jurgis Sakalauskas Date: Mon, 5 Dec 2022 17:28:37 +0200 Subject: [PATCH] add html folder index response to static module --- README.md | 46 ++------- package-lock.json | 4 +- src/Static/static.controller.ts | 178 +++++++++----------------------- 3 files changed, 60 insertions(+), 168 deletions(-) diff --git a/README.md b/README.md index 00a13b1..ea3082e 100644 --- a/README.md +++ b/README.md @@ -1,30 +1,14 @@ -

- Nest Logo -

- -[circleci-image]: https://img.shields.io/circleci/build/github/nestjs/nest/master?token=abc123def456 -[circleci-url]: https://circleci.com/gh/nestjs/nest - -

A progressive Node.js framework for building efficient and scalable server-side applications.

-

-NPM Version -Package License -NPM Downloads -CircleCI -Coverage -Discord -Backers on Open Collective -Sponsors on Open Collective - - Support us - -

- +An API server for personal KODI plugin. ## Description -[Nest](https://github.com/nestjs/nest) framework TypeScript starter repository. +A rewrite attempt from "vanilla" node.js into framework based (Nest.js). + +## License + +No licence (Nest is MIT) + +## Below are left from nest readme ## Installation @@ -57,17 +41,3 @@ $ npm run test:e2e # test coverage $ npm run test:cov ``` - -## Support - -Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you'd like to join them, please [read more here](https://docs.nestjs.com/support). - -## Stay in touch - -- Author - [Kamil Myƛliwiec](https://kamilmysliwiec.com) -- Website - [https://nestjs.com](https://nestjs.com/) -- Twitter - [@nestframework](https://twitter.com/nestframework) - -## License - -Nest is [MIT licensed](LICENSE). diff --git a/package-lock.json b/package-lock.json index 28087e9..c45b500 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "nest-test", + "name": "kodi-api-server", "version": "0.0.1", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "nest-test", + "name": "kodi-api-server", "version": "0.0.1", "license": "UNLICENSED", "dependencies": { diff --git a/src/Static/static.controller.ts b/src/Static/static.controller.ts index 2a73764..64e66f9 100644 --- a/src/Static/static.controller.ts +++ b/src/Static/static.controller.ts @@ -10,6 +10,7 @@ import { import { NextFunction, Request, Response } from 'express'; import { readdir, stat } from 'fs/promises'; import { join } from 'path'; +import { Stats } from 'fs'; @Controller('*') export class StaticController { @@ -19,6 +20,7 @@ export class StaticController { @Res() response: Response, @Next() next: NextFunction, ) { + //todo - refactor to use service const relPath = request.url; //relPath = relPath.split('%2E').join('.'); //relPath = relPath.split('%2e').join('.'); @@ -31,154 +33,74 @@ export class StaticController { const path = join(__dirname, process.env.STATIC_SERVE_FOLDER, relPath); - const stats: any = await stat(path).catch(() => false); + const stats: Stats | false = await stat(path).catch(() => false); if (stats === false) { throw new NotFoundException('Path not found: ' + relPath); } - if (stats.isDirectory()) { - response.status(200).send(await readDirectory(path, relPath)); - //.send(JSON.stringify(await readDirectory(path, relPath), null, ' ')); - - return; + if (!stats.isDirectory()) { + return next(); } - return next(); + response.status(200).send(await readDirectory(path, relPath)); + + return; } } +//todo - move this to service async function readDirectory(path: string, relPath: string) { let files = await readdir(path); - let longestFileLenght = 0; + let longestFileLength = 0; files = files.filter((fileName: string) => { const fileIncluded = fileName[0] !== '.'; - longestFileLenght = fileIncluded ? fileName.length : longestFileLenght; + longestFileLength = + fileIncluded && longestFileLength < fileName.length + ? fileName.length + : longestFileLength; return fileIncluded; }); - let result: string; + longestFileLength += 10; - if (files.length == 0) { - //strPath = strPath.replace(strRootDir, "") - result = "\n" - result = result + "Index of " + relPath + "\n" - result = result + '\n' - result = result + '

Index of ' + relPath + '


../'
-    result = result + "\n

" - result = result + "" + let result: string; + const resultHtmlStart = ` + + Index of ${relPath} + +

Index of ${relPath}

+
`;
+
+  result = `../`;
+
+  for (const file of files) {
+    const stats: Stats | false = await stat(join(path, file)).catch(
+      () => false,
+    );
+
+    if (stats === false) {
+      continue;
+    }
+    const arrDate: Array = stats.birthtime.toUTCString().split(' ');
+    const strDate: string =
+      ' '.repeat(longestFileLength - file.length) +
+      `${arrDate[1]}-${arrDate[2]}-${arrDate[3]} ${arrDate[4]}`;
+
+    if (stats.isDirectory()) {
+      const strSize = ' '.repeat(19) + '-';
+      result += '\n' + `${file}/${strDate + strSize}`;
+      continue;
+    }
+    let strSize = stats.size.toString();
+    strSize = ' '.repeat(20 - strSize.length) + strSize;
+
+    result += '\n' + `${file} ${strDate + strSize}`;
   }
 
-  return result;
+  const resultHtmlEnd = `

`; + + return resultHtmlStart + result + resultHtmlEnd; } - -// function getFilesInDirHtml(strPath, callback) { -// readdir - -// fs.readdir(strPath, function (err, arrItemsAll) { - -// if (err) { callback(err, null) } - -// var arrItemsNotHidden = [] -// var numLength = 0 - -// if (!arrItemsAll) arrItemsAll = [] - -// //remove hidden (with dot in front) -// //find longest item length -// arrItemsAll.forEach(function (strItem) { - -// if (strItem[0] != ".") { - -// arrItemsNotHidden[arrItemsNotHidden.length] = strItem -// if (strItem.length > numLength) { numLength = strItem.length } - -// } - -// }); - -// numLength = numLength + 10 - -// var arrRows = [] -// arrItemsNotHidden.sort() - -// if (arrItemsNotHidden.length == 0) { -// strPath = strPath.replace(strRootDir, "") -// var result = "\n" -// result = result + "Index of " + strPath + "\n" -// result = result + '\n' -// result = result + '

Index of ' + strPath + '


../'
-//       result = result + "\n

" -// result = result + "" -// callback(null, result) -// } - -// arrItemsNotHidden.forEach(function (strItem) { - -// fs.stat(strPath + strItem, function (err, stats) { - -// if (err) { -// arrRows[arrRows.length] = "error" -// return -// } - -// var strRow = "" -// var strSize = "" -// var strDate = "" -// var strName = "" - -// //get size and name and date -// if (!stats.isDirectory()) { - -// strSize = stats.size.toString() -// strSize = space(20 - strSize.length) + strSize - -// //add name -// strName = strItem -// //get date -// var arrDate = stats.birthtime.toUTCString().split(" ") -// strDate = space(numLength - strItem.length) + arrDate[1] + "-" + arrDate[2] + "-" + arrDate[3] + " " + arrDate[4] -// //strDate = space(numLength - strItem.length) + stats.birthtime.toISOString() - -// } else { -// strSize = space(19) + "-" -// //add name -// strName = strItem + "/" -// //get date -// var arrDate = stats.birthtime.toUTCString().split(" ") -// strDate = space(numLength - strItem.length - 1) + arrDate[1] + "-" + arrDate[2] + "-" + arrDate[3] + " " + arrDate[4] -// //strDate = space(numLength - strItem.length - 1) + stats.birthtime.toISOString() -// } - -// //combine row -// //Animation/ 28-Apr-2018 20:56 - -// strRow = '' + strName + '' + strDate + strSize - -// //strRow = strName + strDate + strSize -// arrRows[arrRows.length] = strRow - -// //check if all done, call callback -// if (arrRows.length == arrItemsNotHidden.length) { -// //callback(null, result) -// arrRows.sort() -// strPath = strPath.replace(strRootDir, ""); -// var result = '\n'; -// result = -// result + 'Index of ' + strPath + '\n'; -// result = result + '\n' -// result = -// result + -// '

Index of ' + -// strPath + -// '


../\n';
-//           result = result + arrRows.join('\n');
-//           result = result + '\n

'; -// result = result + ''; -// callback(null, result); -// } -// }); -// }); -// }); -// }