Skip to content

Commit 95c3843

Browse files
committed
feat(website)
1 parent 2ac9d5d commit 95c3843

File tree

9 files changed

+270
-23
lines changed

9 files changed

+270
-23
lines changed

index.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { errorMessage, otherMessage } from './src/logger';
2-
import { loadEndpoints } from './src/helper';
2+
import { loadEndpoints } from './src/functions';
33
import fileUpload from 'express-fileupload';
44
import { existsSync, mkdirSync } from 'fs';
55
import { PORT } from './config.json';
@@ -12,6 +12,9 @@ if (!existsSync('./src/files')) {
1212
const app = express();
1313
try {
1414
(async () => {
15+
app.use(express.static('src/public'));
16+
app.set('views', './src/views');
17+
app.set('view engine', 'ejs');
1518
app.use(fileUpload());
1619
const result = await loadEndpoints(app);
1720
if (result !== undefined) {

package-lock.json

Lines changed: 72 additions & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,18 @@
55
"main": "index.ts",
66
"scripts": {
77
"start": "npm run build && cd dist/ && node index.js",
8-
"prettier": "npx prettier --write index.ts src/",
98
"prettier:check": "npx prettier --check index.ts src/",
10-
"lint": "npx eslint --fix index.ts src/",
9+
"prettier": "npx prettier --write index.ts src/",
10+
"copy-web-data": "npx ncp src/views/ dist/src/views/ && npx ncp src/public/ dist/src/public/ && npx ncp src/files/ dist/src/files/ ",
1111
"lint:check": "npx eslint index.ts src/",
12-
"build": "npx tsc --build"
12+
"lint": "npx eslint --fix index.ts src/",
13+
"build": "npx tsc --build && npm run copy-web-data"
1314
},
1415
"keywords": [],
1516
"author": "",
1617
"license": "MIT",
1718
"dependencies": {
19+
"ejs": "^3.1.9",
1820
"express": "^4.18.2",
1921
"express-fileupload": "^1.4.3",
2022
"winston": "^3.11.0"
@@ -25,6 +27,7 @@
2527
"@typescript-eslint/eslint-plugin": "^6.20.0",
2628
"eslint": "^8.56.0",
2729
"eslint-plugin-import": "^2.29.1",
30+
"ncp": "^2.0.0",
2831
"prettier": "^3.2.5",
2932
"typescript": "^5.3.3"
3033
}

src/endpoints/file.ts

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1+
import { getDate, getFileSize, getTime } from '../functions';
12
import { Application, Request, Response } from 'express';
23
import { apiMessage, errorMessage } from '../logger';
3-
import { existsSync, mkdirSync } from 'fs';
4+
import { existsSync, mkdirSync, statSync } from 'fs';
45
import { resolve, dirname } from 'path';
6+
import { url } from '../../config.json';
57

68
export default (app: Application) => {
79
app.get('/:name', async (req: Request, res: Response) => {
@@ -19,11 +21,24 @@ export default (app: Application) => {
1921
}
2022
const filePath = resolve(dir, fileName);
2123
if (!existsSync(filePath)) {
22-
errorMessage(`File ${fileName} dosent exists`);
23-
return res.status(400).json({ success: false, message: `File ${fileName} dosent exist` });
24+
errorMessage(`File ${fileName} doesn't exists`);
25+
return res.status(400).json({ success: false, message: `File ${fileName} doesn't exist` });
2426
}
2527
apiMessage(req.path, `File ${fileName} found`);
26-
return res.sendFile(filePath);
28+
const stats = statSync(filePath);
29+
return res.render('pages/index', {
30+
data: {
31+
name: fileName.split('.')[0],
32+
timestamp: {
33+
raw: stats.birthtimeMs,
34+
date: getDate(stats.birthtimeMs),
35+
time: getTime(stats.birthtimeMs),
36+
utc: getTime(stats.birthtimeMs, 'UTC'),
37+
},
38+
size: getFileSize(stats.size),
39+
},
40+
img: `${url}/raw/${fileName}`,
41+
});
2742
} catch (err) {
2843
errorMessage(err as string);
2944
return res.status(500).send({ success: false, message: 'Internal server error' });

src/endpoints/raw.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { Application, Request, Response } from 'express';
2+
import { apiMessage, errorMessage } from '../logger';
3+
import { existsSync, mkdirSync, statSync } from 'fs';
4+
import { resolve, dirname } from 'path';
5+
import { getFileSize } from '../functions';
6+
7+
export default (app: Application) => {
8+
app.get('/raw/:name', async (req: Request, res: Response) => {
9+
try {
10+
const fileName = req.params.name;
11+
apiMessage(req.path, `User is trying to get a file - ${fileName}`);
12+
const fileNamePattern = /^[a-zA-Z0-9_-]+\.[a-zA-Z0-9]+$/;
13+
if (!fileNamePattern.test(fileName)) {
14+
return res.status(400).json({ error: 'Invalid file name' });
15+
}
16+
const dir = resolve(dirname(''), 'src/files');
17+
errorMessage(dir);
18+
if (!existsSync(dir)) {
19+
mkdirSync(dir, { recursive: true });
20+
}
21+
const filePath = resolve(dir, fileName);
22+
if (!existsSync(filePath)) {
23+
errorMessage(`File ${fileName} doesn't exists`);
24+
return res.status(400).json({ success: false, message: `File ${fileName} doesn't exist` });
25+
}
26+
apiMessage(req.path, `File ${fileName} found`);
27+
return res.sendFile(filePath);
28+
} catch (err) {
29+
errorMessage(err as string);
30+
console.log(err);
31+
return res.status(500).send({ success: false, message: 'Internal server error' });
32+
}
33+
});
34+
};

src/endpoints/save.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { Application, Request, Response } from 'express';
2-
import { apiMessage, errorMessage } from '../logger';
32
import { url, key, nameHide } from '../../config.json';
3+
import { apiMessage, errorMessage } from '../logger';
44
import { existsSync, mkdirSync } from 'fs';
55
import { resolve, dirname } from 'path';
6-
import { generateID } from '../helper';
6+
import { generateID } from '../functions';
77

88
export default (app: Application) => {
99
app.post('/save/:name', async (req: Request, res: Response) => {

src/helper.ts renamed to src/functions.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,25 @@ export const generateID = (length: number) => {
2727
}
2828
return result;
2929
};
30+
31+
export const getFileSize = (size: number) => {
32+
return {
33+
raw: size,
34+
dynamic:
35+
size < 1024
36+
? size + ' B'
37+
: size < 1048576
38+
? (size / 1024).toFixed(2) + ' KB'
39+
: (size / 1048576).toFixed(2) + ' MB',
40+
};
41+
};
42+
43+
export const getDate = (timeStamp: number) => {
44+
const date = new Date(timeStamp);
45+
return date.toDateString();
46+
};
47+
48+
export const getTime = (timeStamp: number, timeZone?: string) => {
49+
const date = new Date(timeStamp);
50+
return date.toLocaleTimeString('en-US', { timeZone: timeZone });
51+
};

0 commit comments

Comments
 (0)