init
This commit is contained in:
commit
73221af968
55
.eslintrc
Executable file
55
.eslintrc
Executable file
@ -0,0 +1,55 @@
|
|||||||
|
{
|
||||||
|
"parserOptions": {
|
||||||
|
"ecmaVersion": 2018,
|
||||||
|
"sourceType": "module",
|
||||||
|
"ecmaFeatures": {
|
||||||
|
"jsx": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"env": {
|
||||||
|
"browser": true,
|
||||||
|
"node": true,
|
||||||
|
"es6": true
|
||||||
|
},
|
||||||
|
"rules": {
|
||||||
|
"arrow-spacing": "error",
|
||||||
|
"block-scoped-var": "error",
|
||||||
|
"block-spacing": "error",
|
||||||
|
"brace-style": ["error", "stroustrup", {}],
|
||||||
|
"camelcase": "error",
|
||||||
|
"comma-dangle": ["error", "never"],
|
||||||
|
"comma-spacing": ["error", { "before": false, "after": true }],
|
||||||
|
"comma-style": [1, "last"],
|
||||||
|
"consistent-this": [1, "_this"],
|
||||||
|
"curly": [1, "multi"],
|
||||||
|
"eol-last": 1,
|
||||||
|
"eqeqeq": 1,
|
||||||
|
"func-names": 1,
|
||||||
|
"indent": ["error", 2, { "SwitchCase": 1 }],
|
||||||
|
"lines-around-comment": ["error", { "beforeBlockComment": true, "allowArrayStart": true }],
|
||||||
|
"max-len": [1, 180, 2, { "ignoreTemplateLiterals": true, "ignoreStrings": true, "ignoreUrls": true, "ignoreTrailingComments": true, "ignoreComments": true }], // 2 spaces per tab, max 80 chars per line
|
||||||
|
"new-cap": 1,
|
||||||
|
"newline-before-return": "error",
|
||||||
|
"no-array-constructor": 1,
|
||||||
|
"no-inner-declarations": [1, "both"],
|
||||||
|
"no-mixed-spaces-and-tabs": 1,
|
||||||
|
"no-multi-spaces": 2,
|
||||||
|
"no-new-object": 1,
|
||||||
|
"no-shadow-restricted-names": 1,
|
||||||
|
"object-curly-spacing": ["error", "always"],
|
||||||
|
"padded-blocks": ["error", { "blocks": "never", "switches": "always" }],
|
||||||
|
"prefer-const": "error",
|
||||||
|
"prefer-template": "error",
|
||||||
|
"one-var": 0,
|
||||||
|
"quote-props": ["error", "always"],
|
||||||
|
"quotes": [1, "single"],
|
||||||
|
"radix": 1,
|
||||||
|
"semi": [1, "always"],
|
||||||
|
"space-before-blocks": [1, "always"],
|
||||||
|
"space-infix-ops": 1,
|
||||||
|
"vars-on-top": 1,
|
||||||
|
"no-multiple-empty-lines": ["error", { "max": 1, "maxEOF": 1 }],
|
||||||
|
"spaced-comment": ["error", "always", { "markers": ["/"] }]
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
166
.gitignore
vendored
Executable file
166
.gitignore
vendored
Executable file
@ -0,0 +1,166 @@
|
|||||||
|
# Created by .ignore support plugin (hsz.mobi)
|
||||||
|
### Node template
|
||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
|
||||||
|
# Runtime data
|
||||||
|
pids
|
||||||
|
*.pid
|
||||||
|
*.seed
|
||||||
|
*.pid.lock
|
||||||
|
|
||||||
|
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||||
|
lib-cov
|
||||||
|
|
||||||
|
# Coverage directory used by tools like istanbul
|
||||||
|
coverage
|
||||||
|
|
||||||
|
# nyc test coverage
|
||||||
|
.nyc_output
|
||||||
|
|
||||||
|
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
|
||||||
|
.grunt
|
||||||
|
|
||||||
|
# Bower dependency directory (https://bower.io/)
|
||||||
|
bower_components
|
||||||
|
|
||||||
|
# node-waf configuration
|
||||||
|
.lock-wscript
|
||||||
|
|
||||||
|
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||||
|
build/Release
|
||||||
|
|
||||||
|
# Dependency directories
|
||||||
|
node_modules/
|
||||||
|
jspm_packages/
|
||||||
|
|
||||||
|
# Typescript v1 declaration files
|
||||||
|
typings/
|
||||||
|
|
||||||
|
# Optional npm cache directory
|
||||||
|
.npm
|
||||||
|
|
||||||
|
# Optional eslint cache
|
||||||
|
.eslintcache
|
||||||
|
|
||||||
|
# Optional REPL history
|
||||||
|
.node_repl_history
|
||||||
|
|
||||||
|
# Output of 'npm pack'
|
||||||
|
*.tgz
|
||||||
|
|
||||||
|
# Yarn Integrity file
|
||||||
|
.yarn-integrity
|
||||||
|
|
||||||
|
# dotenv environment variables file
|
||||||
|
.env
|
||||||
|
|
||||||
|
### macOS template
|
||||||
|
# General
|
||||||
|
.DS_Store
|
||||||
|
.AppleDouble
|
||||||
|
.LSOverride
|
||||||
|
|
||||||
|
# Icon must end with two \r
|
||||||
|
Icon
|
||||||
|
|
||||||
|
# Thumbnails
|
||||||
|
._*
|
||||||
|
|
||||||
|
# Files that might appear in the root of a volume
|
||||||
|
.DocumentRevisions-V100
|
||||||
|
.fseventsd
|
||||||
|
.Spotlight-V100
|
||||||
|
.TemporaryItems
|
||||||
|
.Trashes
|
||||||
|
.VolumeIcon.icns
|
||||||
|
.com.apple.timemachine.donotpresent
|
||||||
|
|
||||||
|
# Directories potentially created on remote AFP share
|
||||||
|
.AppleDB
|
||||||
|
.AppleDesktop
|
||||||
|
Network Trash Folder
|
||||||
|
Temporary Items
|
||||||
|
.apdisk
|
||||||
|
### JetBrains template
|
||||||
|
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
|
||||||
|
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||||
|
|
||||||
|
.idea/
|
||||||
|
# User-specific stuff:
|
||||||
|
.idea/**/workspace.xml
|
||||||
|
.idea/**/tasks.xml
|
||||||
|
.idea/dictionaries
|
||||||
|
|
||||||
|
# Sensitive or high-churn files:
|
||||||
|
.idea/**/dataSources/
|
||||||
|
.idea/**/dataSources.ids
|
||||||
|
.idea/**/dataSources.xml
|
||||||
|
.idea/**/dataSources.local.xml
|
||||||
|
.idea/**/sqlDataSources.xml
|
||||||
|
.idea/**/dynamic.xml
|
||||||
|
.idea/**/uiDesigner.xml
|
||||||
|
|
||||||
|
# Gradle:
|
||||||
|
.idea/**/gradle.xml
|
||||||
|
.idea/**/libraries
|
||||||
|
|
||||||
|
# CMake
|
||||||
|
cmake-build-debug/
|
||||||
|
|
||||||
|
# Mongo Explorer plugin:
|
||||||
|
.idea/**/mongoSettings.xml
|
||||||
|
|
||||||
|
## File-based project format:
|
||||||
|
*.iws
|
||||||
|
|
||||||
|
## Plugin-specific files:
|
||||||
|
|
||||||
|
# IntelliJ
|
||||||
|
out/
|
||||||
|
|
||||||
|
# mpeltonen/sbt-idea plugin
|
||||||
|
.idea_modules/
|
||||||
|
|
||||||
|
# JIRA plugin
|
||||||
|
atlassian-ide-plugin.xml
|
||||||
|
|
||||||
|
# Cursive Clojure plugin
|
||||||
|
.idea/replstate.xml
|
||||||
|
|
||||||
|
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||||
|
com_crashlytics_export_strings.xml
|
||||||
|
crashlytics.properties
|
||||||
|
crashlytics-build.properties
|
||||||
|
fabric.properties
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# artefacts/screenshots/*.png
|
||||||
|
artefacts/*.txt
|
||||||
|
artefacts/*.json
|
||||||
|
# artefacts/*.html
|
||||||
|
# artefacts/*
|
||||||
|
|
||||||
|
/tests/*.zip
|
||||||
|
|
||||||
|
/output/
|
||||||
|
# /dist/
|
||||||
|
!/tests/data/
|
||||||
|
/tests/sink/
|
||||||
|
/debug/
|
||||||
|
/update.sh
|
||||||
|
/setup/web/
|
||||||
|
/backup/
|
||||||
|
/db/
|
||||||
|
|
||||||
|
/archive.tar.gz
|
||||||
|
/user/
|
||||||
|
/zip
|
||||||
|
!/artefacts/
|
||||||
|
menu.db
|
||||||
|
menu.db.backup
|
2
.prettierignore
Executable file
2
.prettierignore
Executable file
@ -0,0 +1,2 @@
|
|||||||
|
node_modules/*
|
||||||
|
public
|
8
.prettierrc
Executable file
8
.prettierrc
Executable file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"semi": true,
|
||||||
|
"singleQuote": true,
|
||||||
|
"trailingComma": "all",
|
||||||
|
"printWidth": 160,
|
||||||
|
"tabWidth": 2,
|
||||||
|
"useTabs": false
|
||||||
|
}
|
4157
package-lock.json
generated
Normal file
4157
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
58
package.json
Normal file
58
package.json
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
{
|
||||||
|
"name": "jwt-test",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "./server/index.js",
|
||||||
|
"scripts": {
|
||||||
|
"run:ts": "ts-node ./src/development.ts",
|
||||||
|
"clean": "rm -rf dist",
|
||||||
|
"prebuild": "rimraf ./server",
|
||||||
|
"test:js": "mocha test/**/*.js",
|
||||||
|
"test:ts": "mocha -r ts-node/register test/**/*.ts",
|
||||||
|
"lint": "eslint . --ext .ts",
|
||||||
|
"coverage": "nyc npm run test:js",
|
||||||
|
"build:js": "rollup -c rollup.config.js",
|
||||||
|
"compile:es": "tsc --declaration true --declarationMap true --module esnext --outDir './server/es'",
|
||||||
|
"compile:commonjs": "tsc --declaration true --declarationMap true --module commonjs --outDir './server/commonjs'",
|
||||||
|
"compile:ts": "tsc --outDir './server'",
|
||||||
|
"compile": "npm run prebuild && npm run compile:es && npm run compile:commonjs"
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"@types/dotenv": "^8.2.0",
|
||||||
|
"@types/helmet": "^4.0.0",
|
||||||
|
"@types/joi": "^17.2.3",
|
||||||
|
"@types/sqlite3": "^3.1.7",
|
||||||
|
"cors": "^2.8.5",
|
||||||
|
"dotenv": "^8.2.0",
|
||||||
|
"express": "^4.17.1",
|
||||||
|
"express-session": "^1.17.1",
|
||||||
|
"fecha": "^4.2.0",
|
||||||
|
"helmet": "^4.4.1",
|
||||||
|
"joi": "^17.4.0",
|
||||||
|
"jsonfile": "^6.1.0",
|
||||||
|
"jsonwebtoken": "^8.5.1",
|
||||||
|
"lodash": "^4.17.21",
|
||||||
|
"log4js": "^6.3.0",
|
||||||
|
"mongoose": "^5.10.11",
|
||||||
|
"morgan": "^1.10.0",
|
||||||
|
"short-hash": "^1.0.0",
|
||||||
|
"sqlite3": "^5.0.2"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/cors": "^2.8.10",
|
||||||
|
"@types/express": "^4.17.8",
|
||||||
|
"@types/express-session": "^1.17.0",
|
||||||
|
"@types/jsonwebtoken": "^8.5.0",
|
||||||
|
"@types/morgan": "^1.9.2",
|
||||||
|
"eslint": "^7.21.0",
|
||||||
|
"prettier": "^2.2.1",
|
||||||
|
"rimraf": "^3.0.2",
|
||||||
|
"rollup": "^2.33.1",
|
||||||
|
"ts-node": "^9.0.0",
|
||||||
|
"typescript": "^4.0.5",
|
||||||
|
"typings": "^2.1.1"
|
||||||
|
}
|
||||||
|
}
|
96
public/index.html
Normal file
96
public/index.html
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta http-equiv=X-UA-Compatible content="IE=edge">
|
||||||
|
<meta name=viewport content="width=device-width,initial-scale=1">
|
||||||
|
<title>Login</title>
|
||||||
|
<style>
|
||||||
|
@import url(https://fonts.googleapis.com/css?family=Open+Sans);
|
||||||
|
|
||||||
|
.btn { display: inline-block; *display: inline; *zoom: 1; padding: 4px 10px 4px; margin-bottom: 0; font-size: 13px; line-height: 18px; color: #333333; text-align: center;text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); vertical-align: middle; background-color: #f5f5f5; background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); background-image: linear-gradient(top, #ffffff, #e6e6e6); background-repeat: repeat-x; filter: progid:dximagetransform.microsoft.gradient(startColorstr=#ffffff, endColorstr=#e6e6e6, GradientType=0); border-color: #e6e6e6 #e6e6e6 #e6e6e6; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); border: 1px solid #e6e6e6; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); cursor: pointer; *margin-left: .3em; }
|
||||||
|
|
||||||
|
.btn:hover, .btn:active, .btn.active, .btn.disabled, .btn[disabled] { background-color: #e6e6e6; }
|
||||||
|
|
||||||
|
.btn-large { padding: 9px 14px; font-size: 15px; line-height: normal; -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; }
|
||||||
|
|
||||||
|
.btn:hover { color: #333333; text-decoration: none; background-color: #e6e6e6; background-position: 0 -15px; -webkit-transition: background-position 0.1s linear; -moz-transition: background-position 0.1s linear; -ms-transition: background-position 0.1s linear; -o-transition: background-position 0.1s linear; transition: background-position 0.1s linear; }
|
||||||
|
|
||||||
|
.btn-primary, .btn-primary:hover { text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); color: #ffffff; }
|
||||||
|
|
||||||
|
.btn-primary.active { color: rgba(255, 255, 255, 0.75); }
|
||||||
|
|
||||||
|
.btn-primary { background-color: #4a77d4; background-image: -moz-linear-gradient(top, #6eb6de, #4a77d4); background-image: -ms-linear-gradient(top, #6eb6de, #4a77d4); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#6eb6de), to(#4a77d4)); background-image: -webkit-linear-gradient(top, #6eb6de, #4a77d4); background-image: -o-linear-gradient(top, #6eb6de, #4a77d4); background-image: linear-gradient(top, #6eb6de, #4a77d4); background-repeat: repeat-x; filter: progid:dximagetransform.microsoft.gradient(startColorstr=#6eb6de, endColorstr=#4a77d4, GradientType=0); border: 1px solid #3762bc; text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.4); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.5); }
|
||||||
|
|
||||||
|
.btn-primary:hover, .btn-primary:active, .btn-primary.active, .btn-primary.disabled, .btn-primary[disabled] { filter: none; background-color: #4a77d4; }
|
||||||
|
|
||||||
|
.btn-block { width: 100%; display: block; }
|
||||||
|
|
||||||
|
* { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; -ms-box-sizing: border-box; -o-box-sizing: border-box; box-sizing: border-box; }
|
||||||
|
|
||||||
|
html { width: 100%; height: 100%; overflow: hidden; }
|
||||||
|
|
||||||
|
body {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
font-family: 'Open Sans', sans-serif;
|
||||||
|
background: #092756;
|
||||||
|
background: -moz-radial-gradient(0% 100%, ellipse cover, #4C4C9D66 10%, rgba(138, 114, 76, 0) 40%), linear-gradient(to bottom, #976391 0%, #712F7966 100%), linear-gradient(135deg, #48639C 0%, #F7996E 100%);
|
||||||
|
background: -webkit-radial-gradient(0% 100%, ellipse cover, #4C4C9D66 10%, rgba(138, 114, 76, 0) 40%), linear-gradient(to bottom, #976391 0%, #712F7966 100%), linear-gradient(135deg, #48639C 0%, #F7996E 100%);
|
||||||
|
background: -o-radial-gradient(0% 100%, ellipse cover, #4C4C9D66 10%, rgba(138, 114, 76, 0) 40%), linear-gradient(to bottom, #976391 0%, #712F7966 100%), linear-gradient(135deg, #48639C 0%, #F7996E 100%);
|
||||||
|
background: -ms-radial-gradient(0% 100%, ellipse cover, #4C4C9D66 10%, rgba(138, 114, 76, 0) 40%), linear-gradient(to bottom, #976391 0%, #712F7966 100%), linear-gradient(135deg, #48639C 0%, #F7996E 100%);
|
||||||
|
background: -webkit-radial-gradient(0% 100%, ellipse cover, #4C4C9D66 10%, rgba(138, 114, 76, 0) 40%), linear-gradient(to bottom, #976391 0%, #712F7966 100%), linear-gradient(135deg, #48639C 0%, #F7996E 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#3E1D6D', endColorstr='#092756', GradientType=1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.login {
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
margin: -150px 0 0 -150px;
|
||||||
|
min-width: 300px;
|
||||||
|
width: 300px;
|
||||||
|
height: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login h1 { color: #fff; text-shadow: 0 0 10px rgba(0, 0, 0, 0.3); letter-spacing: 1px; text-align: center; }
|
||||||
|
|
||||||
|
input {
|
||||||
|
width: 100%;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
background: rgba(0, 0, 0, 0.3);
|
||||||
|
border: none;
|
||||||
|
outline: none;
|
||||||
|
padding: 10px;
|
||||||
|
font-size: 13px;
|
||||||
|
color: #fff;
|
||||||
|
text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.3);
|
||||||
|
border: 1px solid rgba(0, 0, 0, 0.3);
|
||||||
|
border-radius: 4px;
|
||||||
|
box-shadow: inset 0 -5px 45px rgba(100, 100, 100, 0.2), 0 1px 1px rgba(255, 255, 255, 0.2);
|
||||||
|
-webkit-transition: box-shadow .5s ease;
|
||||||
|
-moz-transition: box-shadow .5s ease;
|
||||||
|
-o-transition: box-shadow .5s ease;
|
||||||
|
-ms-transition: box-shadow .5s ease;
|
||||||
|
transition: box-shadow .5s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
input:focus { box-shadow: inset 0 -5px 45px rgba(100, 100, 100, 0.4), 0 1px 1px rgba(255, 255, 255, 0.2); }
|
||||||
|
|
||||||
|
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="login">
|
||||||
|
<h1>Login</h1>
|
||||||
|
<form action="auth" method="post">
|
||||||
|
<input type="text" name="u" placeholder="Username" required="required"/>
|
||||||
|
<input type="password" name="p" placeholder="Password" required="required"/>
|
||||||
|
<button type="submit" class="btn btn-primary btn-block btn-large">
|
||||||
|
Let me in.
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
17
rollup.config.js
Executable file
17
rollup.config.js
Executable file
@ -0,0 +1,17 @@
|
|||||||
|
export default {
|
||||||
|
input: 'lib/carpark.js',
|
||||||
|
output: [
|
||||||
|
{
|
||||||
|
file: 'dist/carpark.js',
|
||||||
|
format: 'umd',
|
||||||
|
name: 'carpark',
|
||||||
|
sourcemap: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
file: 'dist/carpark.mjs',
|
||||||
|
format: 'es',
|
||||||
|
sourcemap: true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
plugins: []
|
||||||
|
};
|
7
server/commonjs/server.d.ts
vendored
Normal file
7
server/commonjs/server.d.ts
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
import 'dotenv';
|
||||||
|
import express from 'express';
|
||||||
|
export declare class App {
|
||||||
|
protected app: express.Application;
|
||||||
|
constructor(NODE_ENV?: string, PORT?: number);
|
||||||
|
}
|
||||||
|
//# sourceMappingURL=server.d.ts.map
|
1
server/commonjs/server.d.ts.map
Normal file
1
server/commonjs/server.d.ts.map
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAC;AAEhB,OAAO,OAAO,MAAM,SAAS,CAAC;AAQ9B,qBAAa,GAAG;IACd,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,WAAW,CAAC;gBAEvB,QAAQ,GAAE,MAAsB,EAAE,IAAI,GAAE,MAAa;CAoBlE"}
|
19
server/commonjs/server.js
Normal file
19
server/commonjs/server.js
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
"use strict";
|
||||||
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||||
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||||
|
};
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.App = void 0;
|
||||||
|
require("dotenv");
|
||||||
|
const express_1 = __importDefault(require("express"));
|
||||||
|
class App {
|
||||||
|
constructor(NODE_ENV = 'development', PORT = 8080) {
|
||||||
|
const serverPort = process.env.PORT || 8120;
|
||||||
|
this.app = express_1.default();
|
||||||
|
this.app.listen(serverPort, function () {
|
||||||
|
console.log('The server is running in port localhost: ', serverPort);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.App = App;
|
||||||
|
//# sourceMappingURL=server.js.map
|
1
server/commonjs/server.js.map
Normal file
1
server/commonjs/server.js.map
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":";;;;;;AAAA,kBAAgB;AAEhB,sDAA8B;AAQ9B,MAAa,GAAG;IAGd,YAAY,WAAmB,aAAa,EAAE,OAAe,IAAI;QAC/D,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;QAE5C,IAAI,CAAC,GAAG,GAAG,iBAAO,EAAE,CAAC;QAIrB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE;YAC1B,OAAO,CAAC,GAAG,CAAC,2CAA2C,EAAE,UAAU,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;IACL,CAAC;CAUF;AAvBD,kBAuBC"}
|
1
server/db/connect.d.ts
vendored
Normal file
1
server/db/connect.d.ts
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
export declare const db: any;
|
7
server/db/connect.js
Normal file
7
server/db/connect.js
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.db = void 0;
|
||||||
|
const sqlite3 = require('sqlite3').verbose();
|
||||||
|
console.log(`${__dirname}/../../db/users.db`);
|
||||||
|
exports.db = new sqlite3.Database(`${__dirname}/../../db/users.db`);
|
||||||
|
//# sourceMappingURL=connect.js.map
|
1
server/db/connect.js.map
Normal file
1
server/db/connect.js.map
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/db/connect.ts"],"names":[],"mappings":";;;AAAA,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;AAC7C,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,oBAAoB,CAAC,CAAC;AACjC,QAAA,EAAE,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,SAAS,oBAAoB,CAAC,CAAC"}
|
1
server/db/loginmanager.d.ts
vendored
Normal file
1
server/db/loginmanager.d.ts
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
export declare const getOne: (username: string, password: string) => Promise<unknown>;
|
17
server/db/loginmanager.js
Normal file
17
server/db/loginmanager.js
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.getOne = void 0;
|
||||||
|
const connect_1 = require("./connect");
|
||||||
|
const getOne = (username, password) => {
|
||||||
|
const sql = 'SELECT * FROM accounts WHERE username = ? and password = ?';
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
connect_1.db.get(sql, [username, password], (err, row) => {
|
||||||
|
if (err)
|
||||||
|
reject(err);
|
||||||
|
if (!err)
|
||||||
|
resolve(row);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
exports.getOne = getOne;
|
||||||
|
//# sourceMappingURL=loginmanager.js.map
|
1
server/db/loginmanager.js.map
Normal file
1
server/db/loginmanager.js.map
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"loginmanager.js","sourceRoot":"","sources":["../../src/db/loginmanager.ts"],"names":[],"mappings":";;;AAAA,uCAA6B;AAEtB,MAAM,MAAM,GAAG,CAAC,QAAe,EAAE,QAAe,EAAE,EAAE;IACvD,MAAM,GAAG,GAAG,6DAA6D,CAAC;IAE1E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnC,YAAE,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAQ,EAAE,GAAY,EAAE,EAAE;YACzD,IAAI,GAAG;gBACH,MAAM,CAAC,GAAG,CAAC,CAAC;YAEhB,IAAI,CAAC,GAAG;gBAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAXW,QAAA,MAAM,UAWjB"}
|
1
server/development.d.ts
vendored
Normal file
1
server/development.d.ts
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
export {};
|
24
server/development.js
Normal file
24
server/development.js
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
"use strict";
|
||||||
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||||||
|
if (k2 === undefined) k2 = k;
|
||||||
|
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
||||||
|
}) : (function(o, m, k, k2) {
|
||||||
|
if (k2 === undefined) k2 = k;
|
||||||
|
o[k2] = m[k];
|
||||||
|
}));
|
||||||
|
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||||||
|
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||||||
|
}) : function(o, v) {
|
||||||
|
o["default"] = v;
|
||||||
|
});
|
||||||
|
var __importStar = (this && this.__importStar) || function (mod) {
|
||||||
|
if (mod && mod.__esModule) return mod;
|
||||||
|
var result = {};
|
||||||
|
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
||||||
|
__setModuleDefault(result, mod);
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
const server = __importStar(require("./server"));
|
||||||
|
new server.App;
|
||||||
|
//# sourceMappingURL=development.js.map
|
1
server/development.js.map
Normal file
1
server/development.js.map
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"development.js","sourceRoot":"","sources":["../src/development.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,iDAAmC;AACnC,IAAI,MAAM,CAAC,GAAG,CAAA"}
|
2
server/es/development.d.ts
vendored
Normal file
2
server/es/development.d.ts
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
export {};
|
||||||
|
//# sourceMappingURL=development.d.ts.map
|
1
server/es/development.d.ts.map
Normal file
1
server/es/development.d.ts.map
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"development.d.ts","sourceRoot":"","sources":["../../src/development.ts"],"names":[],"mappings":""}
|
3
server/es/development.js
Normal file
3
server/es/development.js
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
import * as server from "./server";
|
||||||
|
new server.App;
|
||||||
|
//# sourceMappingURL=development.js.map
|
1
server/es/development.js.map
Normal file
1
server/es/development.js.map
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"development.js","sourceRoot":"","sources":["../../src/development.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,IAAI,MAAM,CAAC,GAAG,CAAA"}
|
7
server/es/server.d.ts
vendored
Normal file
7
server/es/server.d.ts
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
import 'dotenv';
|
||||||
|
import express from 'express';
|
||||||
|
export declare class App {
|
||||||
|
protected app: express.Application;
|
||||||
|
constructor(NODE_ENV?: string, PORT?: number);
|
||||||
|
}
|
||||||
|
//# sourceMappingURL=server.d.ts.map
|
1
server/es/server.d.ts.map
Normal file
1
server/es/server.d.ts.map
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAC;AAEhB,OAAO,OAAO,MAAM,SAAS,CAAC;AAQ9B,qBAAa,GAAG;IACd,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,WAAW,CAAC;gBAEvB,QAAQ,GAAE,MAAsB,EAAE,IAAI,GAAE,MAAa;CAqBlE"}
|
14
server/es/server.js
Normal file
14
server/es/server.js
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
import 'dotenv';
|
||||||
|
import express from 'express';
|
||||||
|
import helmet from 'helmet';
|
||||||
|
export class App {
|
||||||
|
constructor(NODE_ENV = 'development', PORT = 8080) {
|
||||||
|
const serverPort = process.env.PORT || PORT;
|
||||||
|
this.app = express();
|
||||||
|
this.app.use(helmet());
|
||||||
|
this.app.listen(serverPort, function () {
|
||||||
|
console.log('The server is running in port localhost: ', serverPort);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//# sourceMappingURL=server.js.map
|
1
server/es/server.js.map
Normal file
1
server/es/server.js.map
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAC;AAEhB,OAAO,OAAO,MAAM,SAAS,CAAC;AAG9B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAK5B,MAAM,OAAO,GAAG;IAGd,YAAY,WAAmB,aAAa,EAAE,OAAe,IAAI;QAC/D,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;QAE5C,IAAI,CAAC,GAAG,GAAG,OAAO,EAAE,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QAIvB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE;YAC1B,OAAO,CAAC,GAAG,CAAC,2CAA2C,EAAE,UAAU,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;IACL,CAAC;CAUF"}
|
3
server/handlers/LoginHandler.d.ts
vendored
Normal file
3
server/handlers/LoginHandler.d.ts
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
import express from 'express';
|
||||||
|
export declare const ProcessLogin: (req: express.Request, res: express.Response) => express.Response<any, Record<string, any>> | Promise<express.Response<any, Record<string, any>> | undefined>;
|
||||||
|
export declare const authenticate: (req: express.Request, res: express.Response, next: express.NextFunction) => void;
|
79
server/handlers/LoginHandler.js
Normal file
79
server/handlers/LoginHandler.js
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
"use strict";
|
||||||
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||||||
|
if (k2 === undefined) k2 = k;
|
||||||
|
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
||||||
|
}) : (function(o, m, k, k2) {
|
||||||
|
if (k2 === undefined) k2 = k;
|
||||||
|
o[k2] = m[k];
|
||||||
|
}));
|
||||||
|
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||||||
|
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||||||
|
}) : function(o, v) {
|
||||||
|
o["default"] = v;
|
||||||
|
});
|
||||||
|
var __importStar = (this && this.__importStar) || function (mod) {
|
||||||
|
if (mod && mod.__esModule) return mod;
|
||||||
|
var result = {};
|
||||||
|
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
||||||
|
__setModuleDefault(result, mod);
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.authenticate = exports.ProcessLogin = void 0;
|
||||||
|
const loginManager = __importStar(require("../db/loginmanager"));
|
||||||
|
const authenticator_1 = require("../lib/authenticator");
|
||||||
|
const ProcessLogin = (req, res) => {
|
||||||
|
console.log('request.body', req.body);
|
||||||
|
const username = req.body.username;
|
||||||
|
const password = req.body.password;
|
||||||
|
console.log('username', username);
|
||||||
|
console.log('password', password);
|
||||||
|
if (username && password) {
|
||||||
|
console.log('>> can try to login');
|
||||||
|
return loginManager
|
||||||
|
.getOne(username, password)
|
||||||
|
.then((data) => {
|
||||||
|
if (!data) {
|
||||||
|
console.warn('No data!');
|
||||||
|
return res.sendStatus(401);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
console.log('>> WE have data!', data);
|
||||||
|
const token = authenticator_1.generateAccessToken(username);
|
||||||
|
console.log(token);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
console.error(err);
|
||||||
|
return res.status(500).send({
|
||||||
|
message: err.message || 'Some error occurred while querying the database.',
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
console.log('No shit');
|
||||||
|
return res.sendStatus(401);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
exports.ProcessLogin = ProcessLogin;
|
||||||
|
async function processLoginV2(username, password) {
|
||||||
|
console.log('>> LoginHandler::processLoginV2');
|
||||||
|
console.log('username', username);
|
||||||
|
console.log('password', password);
|
||||||
|
const user = await loginManager.getOne(username, password);
|
||||||
|
if (!user)
|
||||||
|
throw 'Username or password is incorrect';
|
||||||
|
const id = user.id;
|
||||||
|
const token = authenticator_1.generateAccessToken(username);
|
||||||
|
console.log('>> LoginHandler::processLoginV2 : return ', { id: id, token });
|
||||||
|
return { id: id, token };
|
||||||
|
}
|
||||||
|
const authenticate = (req, res, next) => {
|
||||||
|
console.log('>> LoginHandler::authenticate');
|
||||||
|
const { username, password } = req.body;
|
||||||
|
processLoginV2(username, password)
|
||||||
|
.then((user) => res.json(user))
|
||||||
|
.catch(next);
|
||||||
|
};
|
||||||
|
exports.authenticate = authenticate;
|
||||||
|
//# sourceMappingURL=LoginHandler.js.map
|
1
server/handlers/LoginHandler.js.map
Normal file
1
server/handlers/LoginHandler.js.map
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"LoginHandler.js","sourceRoot":"","sources":["../../src/handlers/LoginHandler.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAEA,iEAAmD;AAEnD,wDAA2D;AAEpD,MAAM,YAAY,GAAG,CAAC,GAAoB,EAAE,GAAqB,EAAE,EAAE;IAE1E,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IAEtC,MAAM,QAAQ,GAAW,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;IAC3C,MAAM,QAAQ,GAAW,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;IAE3C,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAClC,IAAI,QAAQ,IAAI,QAAQ,EAAE;QACxB,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,OAAO,YAAY;aAChB,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC;aAC1B,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YACb,IAAI,CAAC,IAAI,EAAE;gBAET,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACzB,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;aAC5B;iBAAM;gBACL,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;gBACtC,MAAM,KAAK,GAAG,mCAAmB,CAAC,QAAQ,CAAC,CAAC;gBAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;aAIpB;QACH,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACb,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,kDAAkD;aAC3E,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;KACN;SAAM;QACL,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAEvB,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;KAC5B;AAGH,CAAC,CAAC;AAxCW,QAAA,YAAY,gBAwCvB;AAEF,KAAK,UAAU,cAAc,CAAC,QAAgB,EAAE,QAAgB;IAC9D,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAG/C,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAElC,MAAM,IAAI,GAAQ,MAAM,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEhE,IAAI,CAAC,IAAI;QAAE,MAAM,mCAAmC,CAAC;IAErD,MAAM,EAAE,GAAG,IAAI,CAAC,EAAG,CAAC;IAGpB,MAAM,KAAK,GAAG,mCAAmB,CAAC,QAAQ,CAAC,CAAC;IAE5C,OAAO,CAAC,GAAG,CAAC,2CAA2C,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAE5E,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;AAC3B,CAAC;AAEM,MAAM,YAAY,GAAG,CAAC,GAAoB,EAAE,GAAqB,EAAE,IAA0B,EAAE,EAAE;IACtG,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC7C,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;IACxC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC;SAC/B,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC9B,KAAK,CAAC,IAAI,CAAC,CAAC;AACjB,CAAC,CAAC;AANW,QAAA,YAAY,gBAMvB"}
|
3
server/lib/ValidateRequest.d.ts
vendored
Normal file
3
server/lib/ValidateRequest.d.ts
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
import express from 'express';
|
||||||
|
import Joi from 'joi';
|
||||||
|
export declare function validateRequest(req: express.Request, next: express.NextFunction, schema: Joi.Schema): void;
|
20
server/lib/ValidateRequest.js
Normal file
20
server/lib/ValidateRequest.js
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.validateRequest = void 0;
|
||||||
|
function validateRequest(req, next, schema) {
|
||||||
|
const options = {
|
||||||
|
abortEarly: false,
|
||||||
|
allowUnknown: true,
|
||||||
|
stripUnknown: true
|
||||||
|
};
|
||||||
|
const { error, value } = schema.validate(req.body, options);
|
||||||
|
if (error) {
|
||||||
|
next(`Validation error: ${error.details.map(x => x.message).join(', ')}`);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
req.body = value;
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.validateRequest = validateRequest;
|
||||||
|
//# sourceMappingURL=ValidateRequest.js.map
|
1
server/lib/ValidateRequest.js.map
Normal file
1
server/lib/ValidateRequest.js.map
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"ValidateRequest.js","sourceRoot":"","sources":["../../src/lib/ValidateRequest.ts"],"names":[],"mappings":";;;AAGA,SAAgB,eAAe,CAAC,GAAmB,EAAE,IAAyB,EAAE,MAAiB;IAC7F,MAAM,OAAO,GAAG;QACZ,UAAU,EAAE,KAAK;QACjB,YAAY,EAAE,IAAI;QAClB,YAAY,EAAE,IAAI;KACrB,CAAC;IACF,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5D,IAAI,KAAK,EAAE;QACP,IAAI,CAAC,qBAAqB,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;KAC7E;SAAM;QACH,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC;QACjB,IAAI,EAAE,CAAC;KACV;AACL,CAAC;AAbD,0CAaC"}
|
3
server/lib/authenticator.d.ts
vendored
Normal file
3
server/lib/authenticator.d.ts
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
import express from "express";
|
||||||
|
export declare function authenticateToken(req: any, res: express.Response, next: express.NextFunction): express.Response<any, Record<string, any>> | undefined;
|
||||||
|
export declare function generateAccessToken(username: string): string;
|
47
server/lib/authenticator.js
Normal file
47
server/lib/authenticator.js
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
"use strict";
|
||||||
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||||||
|
if (k2 === undefined) k2 = k;
|
||||||
|
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
||||||
|
}) : (function(o, m, k, k2) {
|
||||||
|
if (k2 === undefined) k2 = k;
|
||||||
|
o[k2] = m[k];
|
||||||
|
}));
|
||||||
|
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||||||
|
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||||||
|
}) : function(o, v) {
|
||||||
|
o["default"] = v;
|
||||||
|
});
|
||||||
|
var __importStar = (this && this.__importStar) || function (mod) {
|
||||||
|
if (mod && mod.__esModule) return mod;
|
||||||
|
var result = {};
|
||||||
|
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
||||||
|
__setModuleDefault(result, mod);
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.generateAccessToken = exports.authenticateToken = void 0;
|
||||||
|
const jwt = __importStar(require("jsonwebtoken"));
|
||||||
|
function authenticateToken(req, res, next) {
|
||||||
|
const authHeader = req.headers['authorization'];
|
||||||
|
const token = authHeader && authHeader.split(' ')[1];
|
||||||
|
if (!token)
|
||||||
|
return res.sendStatus(401);
|
||||||
|
console.log("token", token);
|
||||||
|
jwt.verify(token, process.env.TOKEN_SECRET, (err, user) => {
|
||||||
|
console.error(err);
|
||||||
|
if (err)
|
||||||
|
return res.sendStatus(403);
|
||||||
|
req.user = user;
|
||||||
|
next();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
exports.authenticateToken = authenticateToken;
|
||||||
|
function generateAccessToken(username) {
|
||||||
|
const payload = {
|
||||||
|
username
|
||||||
|
};
|
||||||
|
const tokenSecret = process.env.TOKEN_SECRET;
|
||||||
|
return jwt.sign(payload, tokenSecret, { expiresIn: '3h' });
|
||||||
|
}
|
||||||
|
exports.generateAccessToken = generateAccessToken;
|
||||||
|
//# sourceMappingURL=authenticator.js.map
|
1
server/lib/authenticator.js.map
Normal file
1
server/lib/authenticator.js.map
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"authenticator.js","sourceRoot":"","sources":["../../src/lib/authenticator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AACA,kDAAoC;AAEpC,SAAgB,iBAAiB,CAAC,GAAQ,EAAG,GAAqB,EAAE,IAA0B;IAC1F,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAEhD,MAAM,KAAK,GACP,UAAU,IAAI,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3C,IAAI,CAAC,KAAK;QAAE,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAEvC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAE5B,GAAG,CAAC,MAAM,CACN,KAAe,EACf,OAAO,CAAC,GAAG,CAAC,YAAsB,EAClC,CAAC,GAAQ,EAAE,IAAS,EAAE,EAAE;QACpB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACpC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,EAAE,CAAC;IACX,CAAC,CACJ,CAAC;AAEN,CAAC;AArBD,8CAqBC;AAED,SAAgB,mBAAmB,CAAC,QAAe;IAE/C,MAAM,OAAO,GAAG;QACZ,QAAQ;KACX,CAAC;IACF,MAAM,WAAW,GAAW,OAAO,CAAC,GAAG,CAAC,YAAa,CAAC;IACtD,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/D,CAAC;AAPD,kDAOC"}
|
1
server/routes/login.d.ts
vendored
Normal file
1
server/routes/login.d.ts
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
export declare const Login: (app: any) => void;
|
21
server/routes/login.js
Normal file
21
server/routes/login.js
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
"use strict";
|
||||||
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||||
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||||
|
};
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.Login = void 0;
|
||||||
|
const LoginHandler_1 = require("../handlers/LoginHandler");
|
||||||
|
const joi_1 = __importDefault(require("joi"));
|
||||||
|
const ValidateRequest_1 = require("../lib/ValidateRequest");
|
||||||
|
function loginSchema(req, res, next) {
|
||||||
|
const schema = joi_1.default.object({
|
||||||
|
username: joi_1.default.string().required(),
|
||||||
|
password: joi_1.default.string().required(),
|
||||||
|
});
|
||||||
|
ValidateRequest_1.validateRequest(req, next, schema);
|
||||||
|
}
|
||||||
|
const Login = (app) => {
|
||||||
|
app.route('/login').post(loginSchema, LoginHandler_1.authenticate);
|
||||||
|
};
|
||||||
|
exports.Login = Login;
|
||||||
|
//# sourceMappingURL=login.js.map
|
1
server/routes/login.js.map
Normal file
1
server/routes/login.js.map
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/routes/login.ts"],"names":[],"mappings":";;;;;;AACA,2DAAsE;AAEtE,8CAAsB;AAEtB,4DAAyD;AAEzD,SAAS,WAAW,CAAC,GAAoB,EAAE,GAAqB,EAAE,IAA0B;IAC1F,MAAM,MAAM,GAAG,aAAG,CAAC,MAAM,CAAC;QACxB,QAAQ,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACjC,QAAQ,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAClC,CAAC,CAAC;IACH,iCAAe,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AACrC,CAAC;AAEM,MAAM,KAAK,GAAG,CAAC,GAAQ,EAAE,EAAE;IAChC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,2BAAY,CAAC,CAAC;AACtD,CAAC,CAAC;AAFW,QAAA,KAAK,SAEhB"}
|
5
server/server.d.ts
vendored
Normal file
5
server/server.d.ts
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
import express from 'express';
|
||||||
|
export declare class App {
|
||||||
|
protected app: express.Application;
|
||||||
|
constructor(NODE_ENV?: string, PORT?: number);
|
||||||
|
}
|
59
server/server.js
Normal file
59
server/server.js
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
"use strict";
|
||||||
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||||||
|
if (k2 === undefined) k2 = k;
|
||||||
|
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
||||||
|
}) : (function(o, m, k, k2) {
|
||||||
|
if (k2 === undefined) k2 = k;
|
||||||
|
o[k2] = m[k];
|
||||||
|
}));
|
||||||
|
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||||||
|
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||||||
|
}) : function(o, v) {
|
||||||
|
o["default"] = v;
|
||||||
|
});
|
||||||
|
var __importStar = (this && this.__importStar) || function (mod) {
|
||||||
|
if (mod && mod.__esModule) return mod;
|
||||||
|
var result = {};
|
||||||
|
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
||||||
|
__setModuleDefault(result, mod);
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||||
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||||
|
};
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.App = void 0;
|
||||||
|
const dotenv = __importStar(require("dotenv"));
|
||||||
|
const express_1 = __importDefault(require("express"));
|
||||||
|
const helmet_1 = __importDefault(require("helmet"));
|
||||||
|
const cors_1 = __importDefault(require("cors"));
|
||||||
|
const morgan_1 = __importDefault(require("morgan"));
|
||||||
|
const authenticator_1 = require("./lib/authenticator");
|
||||||
|
const path = __importStar(require("path"));
|
||||||
|
const login_1 = require("./routes/login");
|
||||||
|
dotenv.config();
|
||||||
|
class App {
|
||||||
|
constructor(NODE_ENV = 'development', PORT = 8080) {
|
||||||
|
const serverPort = process.env.PORT || PORT;
|
||||||
|
const sitePath = 'public';
|
||||||
|
this.app = express_1.default();
|
||||||
|
this.app.use(morgan_1.default('dev'));
|
||||||
|
this.app.use(express_1.default.json());
|
||||||
|
this.app.use(cors_1.default());
|
||||||
|
this.app.use(helmet_1.default());
|
||||||
|
this.app.set('trust proxy', 1);
|
||||||
|
this.app.post('/test', authenticator_1.authenticateToken, (req, res) => {
|
||||||
|
res.sendStatus(200);
|
||||||
|
});
|
||||||
|
const login = login_1.Login(this.app);
|
||||||
|
this.app.get('/', (req, res) => {
|
||||||
|
console.log('p', path.join(process.cwd(), sitePath));
|
||||||
|
res.sendFile('index.html', { root: path.join(process.cwd(), sitePath) });
|
||||||
|
});
|
||||||
|
this.app.listen(serverPort, function () {
|
||||||
|
console.log('The server is running in port localhost: ', serverPort);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.App = App;
|
||||||
|
//# sourceMappingURL=server.js.map
|
1
server/server.js.map
Normal file
1
server/server.js.map
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAiC;AAEjC,sDAA8B;AAC9B,oDAA4B;AAC5B,gDAAwB;AACxB,oDAA4B;AAI5B,uDAAwD;AACxD,2CAA6B;AAE7B,0CAAqC;AAErC,MAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,MAAa,GAAG;IAGd,YAAY,WAAmB,aAAa,EAAE,OAAe,IAAI;QAC/D,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;QAC5C,MAAM,QAAQ,GAAG,QAAQ,CAAC;QAE1B,IAAI,CAAC,GAAG,GAAG,iBAAO,EAAE,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,gBAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAE5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAE7B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,cAAI,EAAE,CAAC,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,gBAAM,EAAE,CAAC,CAAC;QAEvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;QAE/B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,iCAAiB,EAAE,CAAC,GAAoB,EAAE,GAAqB,EAAE,EAAE;YACxF,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC;QAGH,MAAM,KAAK,GAAG,aAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE9B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAoB,EAAE,GAAqB,EAAE,EAAE;YAChE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;YACrD,GAAG,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE;YAC1B,OAAO,CAAC,GAAG,CAAC,2CAA2C,EAAE,UAAU,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;IACL,CAAC;CA2BF;AA3DD,kBA2DC"}
|
3
src/db/connect.ts
Normal file
3
src/db/connect.ts
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
const sqlite3 = require('sqlite3').verbose();
|
||||||
|
console.log(`${__dirname}/../../db/users.db`);
|
||||||
|
export const db = new sqlite3.Database(`${__dirname}/../../db/users.db`);
|
14
src/db/loginmanager.ts
Normal file
14
src/db/loginmanager.ts
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
import {db} from './connect';
|
||||||
|
|
||||||
|
export const getOne = (username:string, password:string) => {
|
||||||
|
const sql = 'SELECT * FROM accounts WHERE username = ? and password = ?';
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
db.get(sql, [username, password], (err: any, row: unknown) => {
|
||||||
|
if (err)
|
||||||
|
reject(err);
|
||||||
|
|
||||||
|
if (!err) resolve(row);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
2
src/development.ts
Normal file
2
src/development.ts
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
import * as server from "./server";
|
||||||
|
new server.App
|
76
src/handlers/LoginHandler.ts
Normal file
76
src/handlers/LoginHandler.ts
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
import express from 'express';
|
||||||
|
|
||||||
|
import * as loginManager from '../db/loginmanager';
|
||||||
|
|
||||||
|
import { generateAccessToken } from '../lib/authenticator';
|
||||||
|
|
||||||
|
export const ProcessLogin = (req: express.Request, res: express.Response) => {
|
||||||
|
// console.log('processLogin', req);
|
||||||
|
console.log('request.body', req.body);
|
||||||
|
|
||||||
|
const username: string = req.body.username;
|
||||||
|
const password: string = req.body.password;
|
||||||
|
|
||||||
|
console.log('username', username);
|
||||||
|
console.log('password', password);
|
||||||
|
if (username && password) {
|
||||||
|
console.log('>> can try to login');
|
||||||
|
return loginManager
|
||||||
|
.getOne(username, password)
|
||||||
|
.then((data) => {
|
||||||
|
if (!data) {
|
||||||
|
// response.redirect('/');
|
||||||
|
console.warn('No data!');
|
||||||
|
return res.sendStatus(401);
|
||||||
|
} else {
|
||||||
|
console.log('>> WE have data!', data);
|
||||||
|
const token = generateAccessToken(username);
|
||||||
|
console.log(token);
|
||||||
|
/* request.session.username = username;
|
||||||
|
request.session.auth = 'jhgkjgkjhgkjhgjkhgjkhgfhghfjgfjhgf';
|
||||||
|
response.redirect('/menu');*/
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
console.error(err);
|
||||||
|
return res.status(500).send({
|
||||||
|
message: err.message || 'Some error occurred while querying the database.',
|
||||||
|
});
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
console.log('No shit');
|
||||||
|
// can't try to login
|
||||||
|
return res.sendStatus(401);
|
||||||
|
}
|
||||||
|
|
||||||
|
// return res.sendStatus(418);
|
||||||
|
};
|
||||||
|
|
||||||
|
async function processLoginV2(username: string, password: string) {
|
||||||
|
console.log('>> LoginHandler::processLoginV2');
|
||||||
|
// console.log('request.body', req.body);
|
||||||
|
|
||||||
|
console.log('username', username);
|
||||||
|
console.log('password', password);
|
||||||
|
|
||||||
|
const user: any = await loginManager.getOne(username, password);
|
||||||
|
|
||||||
|
if (!user) throw 'Username or password is incorrect';
|
||||||
|
|
||||||
|
const id = user.id!;
|
||||||
|
|
||||||
|
// authentication successful
|
||||||
|
const token = generateAccessToken(username);
|
||||||
|
|
||||||
|
console.log('>> LoginHandler::processLoginV2 : return ', { id: id, token });
|
||||||
|
|
||||||
|
return { id: id, token };
|
||||||
|
}
|
||||||
|
|
||||||
|
export const authenticate = (req: express.Request, res: express.Response, next: express.NextFunction) => {
|
||||||
|
console.log('>> LoginHandler::authenticate');
|
||||||
|
const { username, password } = req.body;
|
||||||
|
processLoginV2(username, password)
|
||||||
|
.then((user) => res.json(user))
|
||||||
|
.catch(next);
|
||||||
|
};
|
17
src/lib/ValidateRequest.ts
Normal file
17
src/lib/ValidateRequest.ts
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
import express from 'express';
|
||||||
|
import Joi from 'joi'
|
||||||
|
|
||||||
|
export function validateRequest(req:express.Request, next:express.NextFunction, schema:Joi.Schema):void {
|
||||||
|
const options = {
|
||||||
|
abortEarly: false, // include all errors
|
||||||
|
allowUnknown: true, // ignore unknown props
|
||||||
|
stripUnknown: true // remove unknown props
|
||||||
|
};
|
||||||
|
const { error, value } = schema.validate(req.body, options);
|
||||||
|
if (error) {
|
||||||
|
next(`Validation error: ${error.details.map(x => x.message).join(', ')}`);
|
||||||
|
} else {
|
||||||
|
req.body = value;
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
}
|
34
src/lib/authenticator.ts
Normal file
34
src/lib/authenticator.ts
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
import express from "express";
|
||||||
|
import * as jwt from "jsonwebtoken";
|
||||||
|
|
||||||
|
export function authenticateToken(req: any, res: express.Response, next: express.NextFunction,) {
|
||||||
|
const authHeader = req.headers['authorization'];
|
||||||
|
|
||||||
|
const token: '' | undefined | string =
|
||||||
|
authHeader && authHeader.split(' ')[1];
|
||||||
|
|
||||||
|
if (!token) return res.sendStatus(401);
|
||||||
|
|
||||||
|
console.log("token", token);
|
||||||
|
|
||||||
|
jwt.verify(
|
||||||
|
token as string,
|
||||||
|
process.env.TOKEN_SECRET as string,
|
||||||
|
(err: any, user: any) => {
|
||||||
|
console.error(err);
|
||||||
|
if (err) return res.sendStatus(403);
|
||||||
|
req.user = user;
|
||||||
|
next();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export function generateAccessToken(username:string) {
|
||||||
|
// expires after half and hour (1800 seconds = 30 minutes)
|
||||||
|
const payload = {
|
||||||
|
username
|
||||||
|
};
|
||||||
|
const tokenSecret: string = process.env.TOKEN_SECRET!;
|
||||||
|
return jwt.sign(payload, tokenSecret, { expiresIn: '3h' });
|
||||||
|
}
|
18
src/routes/login.ts
Normal file
18
src/routes/login.ts
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import express from 'express';
|
||||||
|
import { ProcessLogin, authenticate } from '../handlers/LoginHandler';
|
||||||
|
|
||||||
|
import Joi from 'joi';
|
||||||
|
|
||||||
|
import { validateRequest } from '../lib/ValidateRequest';
|
||||||
|
|
||||||
|
function loginSchema(req: express.Request, res: express.Response, next: express.NextFunction) {
|
||||||
|
const schema = Joi.object({
|
||||||
|
username: Joi.string().required(),
|
||||||
|
password: Joi.string().required(),
|
||||||
|
});
|
||||||
|
validateRequest(req, next, schema);
|
||||||
|
}
|
||||||
|
|
||||||
|
export const Login = (app: any) => {
|
||||||
|
app.route('/login').post(loginSchema, authenticate);
|
||||||
|
};
|
76
src/server.ts
Normal file
76
src/server.ts
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
import * as dotenv from 'dotenv';
|
||||||
|
|
||||||
|
import express from 'express';
|
||||||
|
import helmet from 'helmet';
|
||||||
|
import cors from 'cors';
|
||||||
|
import logger from 'morgan';
|
||||||
|
|
||||||
|
import * as jwt from 'jsonwebtoken';
|
||||||
|
|
||||||
|
import { authenticateToken } from './lib/authenticator';
|
||||||
|
import * as path from 'path';
|
||||||
|
|
||||||
|
import {Login} from "./routes/login";
|
||||||
|
|
||||||
|
dotenv.config();
|
||||||
|
|
||||||
|
export class App {
|
||||||
|
protected app: express.Application;
|
||||||
|
|
||||||
|
constructor(NODE_ENV: string = 'development', PORT: number = 8080) {
|
||||||
|
const serverPort = process.env.PORT || PORT;
|
||||||
|
const sitePath = 'public';
|
||||||
|
|
||||||
|
this.app = express();
|
||||||
|
this.app.use(logger('dev'));
|
||||||
|
|
||||||
|
this.app.use(express.json());
|
||||||
|
|
||||||
|
this.app.use(cors());
|
||||||
|
this.app.use(helmet());
|
||||||
|
|
||||||
|
this.app.set('trust proxy', 1);
|
||||||
|
|
||||||
|
this.app.post('/test', authenticateToken, (req: express.Request, res: express.Response) => {
|
||||||
|
res.sendStatus(200);
|
||||||
|
});
|
||||||
|
|
||||||
|
// ///
|
||||||
|
const login = Login(this.app);
|
||||||
|
|
||||||
|
this.app.get('/', (req: express.Request, res: express.Response) => {
|
||||||
|
console.log('p', path.join(process.cwd(), sitePath));
|
||||||
|
res.sendFile('index.html', { root: path.join(process.cwd(), sitePath) });
|
||||||
|
});
|
||||||
|
|
||||||
|
this.app.listen(serverPort, function () {
|
||||||
|
console.log('The server is running in port localhost: ', serverPort);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/* authenticateToken(
|
||||||
|
req: any,
|
||||||
|
res: express.Response,
|
||||||
|
next: express.NextFunction,
|
||||||
|
) {
|
||||||
|
const authHeader = req.headers['authorization'];
|
||||||
|
|
||||||
|
const token: '' | undefined | string =
|
||||||
|
authHeader && authHeader.split(' ')[1];
|
||||||
|
|
||||||
|
if (!token) return res.sendStatus(401);
|
||||||
|
|
||||||
|
console.log("token", token);
|
||||||
|
|
||||||
|
jwt.verify(
|
||||||
|
token as string,
|
||||||
|
process.env.TOKEN_SECRET as string,
|
||||||
|
(err: any, user: any) => {
|
||||||
|
console.error(err);
|
||||||
|
if (err) return res.sendStatus(403);
|
||||||
|
req.user = user;
|
||||||
|
next();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}*/
|
||||||
|
}
|
4
testing/postLogin.sh
Executable file
4
testing/postLogin.sh
Executable file
@ -0,0 +1,4 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
curl -X POST http://localhost:8080/login \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d "{\"username\":\"my_login\",\"password\":\"my_password\"}"
|
3
testing/postLoginFail.sh
Executable file
3
testing/postLoginFail.sh
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
curl -X POST http://localhost:8080/login \
|
||||||
|
-H "Content-Type: application/json"
|
18
tsconfig.json
Executable file
18
tsconfig.json
Executable file
@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"strict": true,
|
||||||
|
"declaration": true,
|
||||||
|
"target": "ES2018",
|
||||||
|
"module": "commonjs",
|
||||||
|
"noImplicitAny": true,
|
||||||
|
"removeComments": true,
|
||||||
|
"preserveConstEnums": true,
|
||||||
|
"emitDecoratorMetadata": true,
|
||||||
|
"experimentalDecorators": true,
|
||||||
|
"sourceMap": true,
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"outDir": "./server"
|
||||||
|
},
|
||||||
|
"include": ["src/**/*"],
|
||||||
|
"exclude": ["node_modules", "test/**/*.ts"]
|
||||||
|
}
|
149
tslint.json
Normal file
149
tslint.json
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
{
|
||||||
|
"extends": "tslint:recommended",
|
||||||
|
"rules": {
|
||||||
|
"align": {
|
||||||
|
"options": [
|
||||||
|
"parameters",
|
||||||
|
"statements"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"array-type": false,
|
||||||
|
"arrow-return-shorthand": true,
|
||||||
|
"curly": true,
|
||||||
|
"deprecation": {
|
||||||
|
"severity": "warning"
|
||||||
|
},
|
||||||
|
"component-class-suffix": [true, "Page", "Component"],
|
||||||
|
"contextual-lifecycle": true,
|
||||||
|
"directive-class-suffix": true,
|
||||||
|
"directive-selector": [
|
||||||
|
true,
|
||||||
|
"attribute",
|
||||||
|
"app",
|
||||||
|
"camelCase"
|
||||||
|
],
|
||||||
|
"component-selector": [
|
||||||
|
true,
|
||||||
|
"element",
|
||||||
|
"app",
|
||||||
|
"kebab-case"
|
||||||
|
],
|
||||||
|
"eofline": true,
|
||||||
|
"import-blacklist": [
|
||||||
|
true,
|
||||||
|
"rxjs/Rx"
|
||||||
|
],
|
||||||
|
"import-spacing": true,
|
||||||
|
"indent": {
|
||||||
|
"options": [
|
||||||
|
"spaces"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"max-classes-per-file": false,
|
||||||
|
"max-line-length": [
|
||||||
|
true,
|
||||||
|
140
|
||||||
|
],
|
||||||
|
"member-ordering": [
|
||||||
|
true,
|
||||||
|
{
|
||||||
|
"order": [
|
||||||
|
"static-field",
|
||||||
|
"instance-field",
|
||||||
|
"static-method",
|
||||||
|
"instance-method"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"no-console": [
|
||||||
|
true,
|
||||||
|
"debug",
|
||||||
|
"info",
|
||||||
|
"time",
|
||||||
|
"timeEnd",
|
||||||
|
"trace"
|
||||||
|
],
|
||||||
|
"no-empty": false,
|
||||||
|
"no-inferrable-types": [
|
||||||
|
true,
|
||||||
|
"ignore-params"
|
||||||
|
],
|
||||||
|
"no-non-null-assertion": true,
|
||||||
|
"no-redundant-jsdoc": true,
|
||||||
|
"no-switch-case-fall-through": true,
|
||||||
|
"no-var-requires": false,
|
||||||
|
"object-literal-key-quotes": [
|
||||||
|
true,
|
||||||
|
"as-needed"
|
||||||
|
],
|
||||||
|
"quotemark": [
|
||||||
|
true,
|
||||||
|
"single"
|
||||||
|
],
|
||||||
|
"semicolon": {
|
||||||
|
"options": [
|
||||||
|
"always"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"space-before-function-paren": {
|
||||||
|
"options": {
|
||||||
|
"anonymous": "never",
|
||||||
|
"asyncArrow": "always",
|
||||||
|
"constructor": "never",
|
||||||
|
"method": "never",
|
||||||
|
"named": "never"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"typedef-whitespace": {
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"call-signature": "nospace",
|
||||||
|
"index-signature": "nospace",
|
||||||
|
"parameter": "nospace",
|
||||||
|
"property-declaration": "nospace",
|
||||||
|
"variable-declaration": "nospace"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"call-signature": "onespace",
|
||||||
|
"index-signature": "onespace",
|
||||||
|
"parameter": "onespace",
|
||||||
|
"property-declaration": "onespace",
|
||||||
|
"variable-declaration": "onespace"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"variable-name": {
|
||||||
|
"options": [
|
||||||
|
"ban-keywords",
|
||||||
|
"check-format",
|
||||||
|
"allow-pascal-case"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"whitespace": {
|
||||||
|
"options": [
|
||||||
|
"check-branch",
|
||||||
|
"check-decl",
|
||||||
|
"check-operator",
|
||||||
|
"check-separator",
|
||||||
|
"check-type",
|
||||||
|
"check-typecast"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"no-conflicting-lifecycle": true,
|
||||||
|
"no-host-metadata-property": true,
|
||||||
|
"no-input-rename": true,
|
||||||
|
"no-inputs-metadata-property": true,
|
||||||
|
"no-output-native": true,
|
||||||
|
"no-output-on-prefix": true,
|
||||||
|
"no-output-rename": true,
|
||||||
|
"no-outputs-metadata-property": true,
|
||||||
|
"template-banana-in-box": true,
|
||||||
|
"template-no-negated-async": true,
|
||||||
|
"use-lifecycle-interface": true,
|
||||||
|
"use-pipe-transform-interface": true,
|
||||||
|
"object-literal-sort-keys": false
|
||||||
|
},
|
||||||
|
"rulesDirectory": [
|
||||||
|
"codelyzer"
|
||||||
|
]
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user