code upload
This commit is contained in:
parent
4b65ecc54c
commit
6dc1907ef0
|
@ -0,0 +1,11 @@
|
|||
/* eslint-env node */
|
||||
module.exports = {
|
||||
root: true,
|
||||
'extends': [
|
||||
'plugin:vue/vue3-essential',
|
||||
'eslint:recommended'
|
||||
],
|
||||
parserOptions: {
|
||||
ecmaVersion: 'latest'
|
||||
}
|
||||
}
|
|
@ -1,281 +1,30 @@
|
|||
# ---> Linux
|
||||
*~
|
||||
|
||||
# temporary files which can be created if a process still has a handle open of a deleted file
|
||||
.fuse_hidden*
|
||||
|
||||
# KDE directory preferences
|
||||
.directory
|
||||
|
||||
# Linux trash folder which might appear on any partition or disk
|
||||
.Trash-*
|
||||
|
||||
# .nfs files are created when an open file is removed but is still being accessed
|
||||
.nfs*
|
||||
|
||||
# ---> Windows
|
||||
# Windows thumbnail cache files
|
||||
Thumbs.db
|
||||
Thumbs.db:encryptable
|
||||
ehthumbs.db
|
||||
ehthumbs_vista.db
|
||||
|
||||
# Dump file
|
||||
*.stackdump
|
||||
|
||||
# Folder config file
|
||||
[Dd]esktop.ini
|
||||
|
||||
# Recycle Bin used on file shares
|
||||
$RECYCLE.BIN/
|
||||
|
||||
# Windows Installer files
|
||||
*.cab
|
||||
*.msi
|
||||
*.msix
|
||||
*.msm
|
||||
*.msp
|
||||
|
||||
# Windows shortcuts
|
||||
*.lnk
|
||||
|
||||
# ---> macOS
|
||||
# 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
|
||||
|
||||
# ---> VisualStudioCode
|
||||
.vscode/*
|
||||
!.vscode/settings.json
|
||||
!.vscode/tasks.json
|
||||
!.vscode/launch.json
|
||||
!.vscode/extensions.json
|
||||
!.vscode/*.code-snippets
|
||||
|
||||
# Local History for Visual Studio Code
|
||||
.history/
|
||||
|
||||
# Built Visual Studio Code Extensions
|
||||
*.vsix
|
||||
|
||||
# ---> Emacs
|
||||
# -*- mode: gitignore; -*-
|
||||
*~
|
||||
\#*\#
|
||||
/.emacs.desktop
|
||||
/.emacs.desktop.lock
|
||||
*.elc
|
||||
auto-save-list
|
||||
tramp
|
||||
.\#*
|
||||
|
||||
# Org-mode
|
||||
.org-id-locations
|
||||
*_archive
|
||||
|
||||
# flymake-mode
|
||||
*_flymake.*
|
||||
|
||||
# eshell files
|
||||
/eshell/history
|
||||
/eshell/lastdir
|
||||
|
||||
# elpa packages
|
||||
/elpa/
|
||||
|
||||
# reftex files
|
||||
*.rel
|
||||
|
||||
# AUCTeX auto folder
|
||||
/auto/
|
||||
|
||||
# cask packages
|
||||
.cask/
|
||||
dist/
|
||||
|
||||
# Flycheck
|
||||
flycheck_*.el
|
||||
|
||||
# server auth directory
|
||||
/server/
|
||||
|
||||
# projectiles files
|
||||
.projectile
|
||||
|
||||
# directory configuration
|
||||
.dir-locals.el
|
||||
|
||||
# network security
|
||||
/network-security.data
|
||||
|
||||
|
||||
# ---> Node
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
lerna-debug.log*
|
||||
.pnpm-debug.log*
|
||||
|
||||
# Diagnostic reports (https://nodejs.org/api/report.html)
|
||||
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
||||
|
||||
# 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
|
||||
*.lcov
|
||||
|
||||
# nyc test coverage
|
||||
.nyc_output
|
||||
|
||||
# Grunt intermediate storage (https://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/
|
||||
|
||||
# Snowpack dependency directory (https://snowpack.dev/)
|
||||
web_modules/
|
||||
|
||||
# TypeScript cache
|
||||
*.tsbuildinfo
|
||||
|
||||
# Optional npm cache directory
|
||||
.npm
|
||||
|
||||
# Optional eslint cache
|
||||
.eslintcache
|
||||
|
||||
# Optional stylelint cache
|
||||
.stylelintcache
|
||||
|
||||
# Microbundle cache
|
||||
.rpt2_cache/
|
||||
.rts2_cache_cjs/
|
||||
.rts2_cache_es/
|
||||
.rts2_cache_umd/
|
||||
|
||||
# Optional REPL history
|
||||
.node_repl_history
|
||||
|
||||
# Output of 'npm pack'
|
||||
*.tgz
|
||||
|
||||
# Yarn Integrity file
|
||||
.yarn-integrity
|
||||
|
||||
# dotenv environment variable files
|
||||
.env
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
.env.local
|
||||
|
||||
# parcel-bundler cache (https://parceljs.org/)
|
||||
.cache
|
||||
.parcel-cache
|
||||
|
||||
# Next.js build output
|
||||
.next
|
||||
out
|
||||
|
||||
# Nuxt.js build / generate output
|
||||
.nuxt
|
||||
node_modules
|
||||
.DS_Store
|
||||
dist
|
||||
dist-ssr
|
||||
coverage
|
||||
*.local
|
||||
|
||||
# Gatsby files
|
||||
.cache/
|
||||
# Comment in the public line in if your project uses Gatsby and not Next.js
|
||||
# https://nextjs.org/blog/next-9-1#public-directory-support
|
||||
# public
|
||||
/cypress/videos/
|
||||
/cypress/screenshots/
|
||||
|
||||
# vuepress build output
|
||||
.vuepress/dist
|
||||
|
||||
# vuepress v2.x temp and cache directory
|
||||
.temp
|
||||
.cache
|
||||
|
||||
# Docusaurus cache and generated files
|
||||
.docusaurus
|
||||
|
||||
# Serverless directories
|
||||
.serverless/
|
||||
|
||||
# FuseBox cache
|
||||
.fusebox/
|
||||
|
||||
# DynamoDB Local files
|
||||
.dynamodb/
|
||||
|
||||
# TernJS port file
|
||||
.tern-port
|
||||
|
||||
# Stores VSCode versions used for testing VSCode extensions
|
||||
.vscode-test
|
||||
|
||||
# yarn v2
|
||||
.yarn/cache
|
||||
.yarn/unplugged
|
||||
.yarn/build-state.yml
|
||||
.yarn/install-state.gz
|
||||
.pnp.*
|
||||
|
||||
# ---> Hugo
|
||||
# Generated files by hugo
|
||||
/public/
|
||||
/resources/_gen/
|
||||
/assets/jsconfig.json
|
||||
hugo_stats.json
|
||||
|
||||
# Executable may be added to repository
|
||||
hugo.exe
|
||||
hugo.darwin
|
||||
hugo.linux
|
||||
|
||||
# Temporary lock file while building
|
||||
/.hugo_build.lock
|
||||
# Editor directories and files
|
||||
.vscode/*
|
||||
!.vscode/extensions.json
|
||||
.idea
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
|
||||
*.tsbuildinfo
|
||||
|
|
|
@ -1,47 +0,0 @@
|
|||
pipeline {
|
||||
agent {label 'html'}
|
||||
stages {
|
||||
stage('Check host') {
|
||||
steps {
|
||||
withCredentials(bindings: [sshUserPrivateKey(credentialsId: '301d16da-51e4-438d-abf7-51b88a05bcec', \
|
||||
keyFileVariable: 'SSH_KEY_PEREC', usernameVariable: 'SSH_USERNAME')]) {
|
||||
sh '''
|
||||
ssh -i $SSH_KEY_PEREC -o StrictHostKeyChecking=no $SSH_USERNAME@172.16.0.22 "freebsd-version"
|
||||
'''
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage('Deploy site rsync') {
|
||||
steps {
|
||||
withCredentials(bindings: [sshUserPrivateKey(credentialsId: '301d16da-51e4-438d-abf7-51b88a05bcec', \
|
||||
keyFileVariable: 'SSH_KEY_PEREC', usernameVariable: 'SSH_USERNAME')]) {
|
||||
sh '''
|
||||
rsync -avz --delete -e "ssh -i $SSH_KEY_PEREC -o StrictHostKeyChecking=no" src/ $SSH_USERNAME@172.16.0.22:/home/$SSH_USERNAME/site/web_example_static/
|
||||
'''
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// stage ('Deploy site ssh){
|
||||
// steps {
|
||||
// withCredentials(bindings: [sshUserPrivateKey(credentialsId: '301d16da-51e4-438d-abf7-51b88a05bcec', \
|
||||
// keyFileVariable: 'SSH_KEY_PEREC', usernameVariable: 'SSH_USERNAME')]) {
|
||||
// sh '''
|
||||
// scp -rp -i $SSH_KEY_PEREC -o StrictHostKeyChecking=no src/* $SSH_USERNAME@172.16.0.22:/home/$SSH_USERNAME/site/web_example_static/
|
||||
// '''
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
// post{
|
||||
// success {
|
||||
// echo "success"
|
||||
// }
|
||||
// failure {
|
||||
// echo "failure"
|
||||
// }
|
||||
// }
|
||||
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
# example_static
|
||||
# API service
|
||||
|
||||
[![Build Status](https://jenkins.myhome.ru.net/buildStatus/icon?job=GiteaMyHome%2Fexample_static%2Fmain)](https://jenkins.myhome.ru.net/job/GiteaMyHome/job/example_static/job/main/)
|
||||
[![Build Status](https://jenkins.myhome.ru.net/buildStatus/icon?job=GiteaMyHome%2Fecokam-auth%2Fmain)](https://jenkins.myhome.ru.net/job/GiteaMyHome/job/ecokam-auth/job/main/)
|
||||
|
||||
API service
|
||||
|
||||
Example HTML static website
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
module.exports = {
|
||||
secret: "ab3ec09b9b12a8cd3f445eac903ea06504c087bc"
|
||||
};
|
|
@ -0,0 +1,3 @@
|
|||
module.exports = {
|
||||
secret: "ab3ec09b9b12a8cd3f445eac903ea06504c087bc"
|
||||
};
|
|
@ -0,0 +1,13 @@
|
|||
module.exports = {
|
||||
HOST: "127.0.0.1",
|
||||
USER: "usr_beartrack",
|
||||
PASSWORD: "pwd_beartrack",
|
||||
DB: "beartrack_db",
|
||||
dialect: "postgres",
|
||||
pool: {
|
||||
max: 5,
|
||||
min: 0,
|
||||
acquire: 30000,
|
||||
idle: 10000
|
||||
}
|
||||
};
|
|
@ -0,0 +1,13 @@
|
|||
module.exports = {
|
||||
HOST: "127.0.0.1",
|
||||
USER: "usr_beartrack",
|
||||
PASSWORD: "pwd_beartrack",
|
||||
DB: "beartrack_db",
|
||||
dialect: "postgres",
|
||||
pool: {
|
||||
max: 5,
|
||||
min: 0,
|
||||
acquire: 30000,
|
||||
idle: 10000
|
||||
}
|
||||
};
|
|
@ -0,0 +1,92 @@
|
|||
const db = require("../models");
|
||||
const config = require("../config/auth.config");
|
||||
const User = db.user;
|
||||
const Role = db.role;
|
||||
|
||||
const Op = db.Sequelize.Op;
|
||||
|
||||
var jwt = require("jsonwebtoken");
|
||||
var bcrypt = require("bcryptjs");
|
||||
|
||||
exports.signup = (req, res) => {
|
||||
// Save User to Database
|
||||
|
||||
User.create({
|
||||
username: req.body.username,
|
||||
email: req.body.email,
|
||||
password: bcrypt.hashSync(req.body.password, 8)
|
||||
})
|
||||
.then(user => {
|
||||
if (req.body.roles) {
|
||||
Role.findAll({
|
||||
where: {
|
||||
name: {
|
||||
[Op.or]: req.body.roles
|
||||
}
|
||||
}
|
||||
}).then(roles => {
|
||||
user.setRoles(roles).then(() => {
|
||||
res.send({ message: "User was registered successfully!" });
|
||||
});
|
||||
});
|
||||
} else {
|
||||
// user role = 1
|
||||
user.setRoles([1]).then(() => {
|
||||
res.send({ message: "User was registered successfully!" });
|
||||
});
|
||||
}
|
||||
})
|
||||
.catch(err => {
|
||||
res.status(500).send({ message: err.message });
|
||||
});
|
||||
};
|
||||
|
||||
exports.signin = (req, res) => {
|
||||
User.findOne({
|
||||
where: {
|
||||
username: req.body.username
|
||||
}
|
||||
})
|
||||
.then(user => {
|
||||
if (!user) {
|
||||
return res.status(404).send({ message: "User Not found." });
|
||||
}
|
||||
|
||||
var passwordIsValid = bcrypt.compareSync(
|
||||
req.body.password,
|
||||
user.password
|
||||
);
|
||||
|
||||
if (!passwordIsValid) {
|
||||
return res.status(401).send({
|
||||
accessToken: null,
|
||||
message: "Invalid Password!"
|
||||
});
|
||||
}
|
||||
|
||||
const token = jwt.sign({ id: user.id },
|
||||
config.secret,
|
||||
{
|
||||
algorithm: 'HS256',
|
||||
allowInsecureKeySizes: true,
|
||||
expiresIn: 86400, // 24 hours
|
||||
});
|
||||
|
||||
var authorities = [];
|
||||
user.getRoles().then(roles => {
|
||||
for (let i = 0; i < roles.length; i++) {
|
||||
authorities.push("ROLE_" + roles[i].name.toUpperCase());
|
||||
}
|
||||
res.status(200).send({
|
||||
id: user.id,
|
||||
username: user.username,
|
||||
email: user.email,
|
||||
roles: authorities,
|
||||
accessToken: token
|
||||
});
|
||||
});
|
||||
})
|
||||
.catch(err => {
|
||||
res.status(500).send({ message: err.message });
|
||||
});
|
||||
};
|
|
@ -0,0 +1,171 @@
|
|||
const db = require("../models");
|
||||
const uploadFile = require("../middleware/filesLoad");
|
||||
const FileEvent = db.fileevent;
|
||||
|
||||
const fs = require("fs");
|
||||
|
||||
//const baseUrl = "https://eco.beartrack.ru/files/";
|
||||
|
||||
const upload = async (req, res) => {
|
||||
try {
|
||||
await uploadFile(req, res);
|
||||
|
||||
if (req.file == undefined) {
|
||||
return res.status(400).send({ message: "Please upload a file!" });
|
||||
}
|
||||
await FileEvent.create({
|
||||
uuid: req.body.id,
|
||||
filename: req.file.originalname,
|
||||
eventdate: req.body.eventdate,
|
||||
message: req.body.message,
|
||||
latitude: req.body.latitude,
|
||||
longitude: req.body.longitude,
|
||||
status: 0,
|
||||
});
|
||||
|
||||
res.status(200).send({
|
||||
uuid: req.body.id,
|
||||
message: "Uploaded the file successfully: " + req.file.originalname,
|
||||
});
|
||||
} catch (err) {
|
||||
res.status(500).send({
|
||||
message: `Could not upload the file: ${req.file.originalname}. ${err}`,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// const upload = async (req, res) => {
|
||||
// try {
|
||||
// await uploadFile(req, res);
|
||||
// ...
|
||||
// } catch (err) {
|
||||
// if (err.code == "LIMIT_FILE_SIZE") {
|
||||
// return res.status(500).send({
|
||||
// message: "File size cannot be larger than 2MB!",
|
||||
// });
|
||||
// }
|
||||
|
||||
// res.status(500).send({
|
||||
// message: `Could not upload the file: ${req.file.originalname}. ${err}`,
|
||||
// });
|
||||
// }
|
||||
// };
|
||||
|
||||
|
||||
const getListFiles = async (req, res) => {
|
||||
const directoryPath = __basedir + "/resources/static/assets/uploads/";
|
||||
const baseUrl = "https://cdn.beartrack.ru/files/";
|
||||
|
||||
const fileEvents = await FileEvent.findAll({
|
||||
attributes: [
|
||||
'uuid',
|
||||
'eventdate',
|
||||
'latitude',
|
||||
'longitude',
|
||||
'message',
|
||||
'status',
|
||||
[db.sequelize.fn('CONCAT', baseUrl, db.sequelize.col('uuid')), 'url']
|
||||
],
|
||||
});
|
||||
|
||||
//console.log(fileEvents.every(fileevents => fileevents instanceof FileEvent)); // true
|
||||
//console.log('All event:', JSON.stringify(fileEvents, null, 2));
|
||||
|
||||
fs.readdir(directoryPath, function (err, files) {
|
||||
if (err) {
|
||||
res.status(500).send({
|
||||
message: "Unable to scan files!",
|
||||
});
|
||||
}
|
||||
|
||||
let fileInfos = [];
|
||||
|
||||
files.forEach((file) => {
|
||||
fileInfos.push({
|
||||
name: file,
|
||||
url: baseUrl + file,
|
||||
});
|
||||
});
|
||||
|
||||
res.status(200).send(JSON.stringify(fileEvents, null, 2));
|
||||
});
|
||||
};
|
||||
|
||||
const verifyFile = (req, res) => {
|
||||
const fileuuid = req.params.id;
|
||||
const directoryPath = __basedir + "/resources/static/assets/uploads/";
|
||||
|
||||
fs.stat(directoryPath+fileuuid, (err, stats) => {
|
||||
if (err) {
|
||||
res.status(404).send({
|
||||
message: "File not found",
|
||||
status: false,
|
||||
});
|
||||
}
|
||||
if (stats.isFile()) {
|
||||
res.status(200).send({
|
||||
message: "File found: " + fileuuid,
|
||||
status: stats.isFile(),
|
||||
})
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
const updateFile = async (req, res) => {
|
||||
const fileuuid = req.params.id;
|
||||
const newstatus = req.body.status;
|
||||
const directoryPath = __basedir + "/resources/static/assets/uploads/";
|
||||
|
||||
try {
|
||||
|
||||
const currentEvent = await FileEvent.findOne({
|
||||
where:{
|
||||
uuid: fileuuid
|
||||
}
|
||||
});
|
||||
//modifying the related field
|
||||
currentEvent.status = newstatus;
|
||||
//saving the changes
|
||||
currentEvent.save({fields: ['status']});
|
||||
|
||||
|
||||
// await FileEvent.update(
|
||||
// { 'status': req.body.status },
|
||||
// {
|
||||
// where: {
|
||||
// 'uuid': req.params.id,
|
||||
// },
|
||||
// },
|
||||
// );
|
||||
|
||||
res.status(200).send({
|
||||
uuid: fileuuid,
|
||||
message: "Update the file successfully: " + fileuuid,
|
||||
});
|
||||
} catch (err) {
|
||||
res.status(500).send({
|
||||
message: `Could not update: ${fileuuid}. ${err}`,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
const download = (req, res) => {
|
||||
const fileName = req.params.id;
|
||||
const directoryPath = __basedir + "/resources/static/assets/uploads/";
|
||||
|
||||
res.download(directoryPath + fileName, fileName, (err) => {
|
||||
if (err) {
|
||||
res.status(500).send({
|
||||
message: "Could not download the file. " + err,
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
upload,
|
||||
getListFiles,
|
||||
verifyFile,
|
||||
updateFile,
|
||||
download,
|
||||
};
|
|
@ -0,0 +1,41 @@
|
|||
exports.allAccess = (req, res) => {
|
||||
res.status(200).send("Общий контент.");
|
||||
};
|
||||
|
||||
exports.userBoard = (req, res) => {
|
||||
res.status(200).send("Пользовательский контент.");
|
||||
};
|
||||
|
||||
exports.adminBoard = (req, res) => {
|
||||
res.status(200).send("Административный.");
|
||||
};
|
||||
|
||||
exports.moderatorBoard = (req, res) => {
|
||||
res.status(200).send("Модерируемый контент.");
|
||||
};
|
||||
|
||||
const mapevents = [
|
||||
{
|
||||
coordinates: [166.623, 60.752],
|
||||
iconSrc:
|
||||
'https://yastatic.net/s3/front-maps-static/maps-front-jsapi-3/examples/images/marker-custom-icon/yellow-capybara.png',
|
||||
message: 'Вырубка',
|
||||
},
|
||||
{
|
||||
coordinates: [166.125, 60.622],
|
||||
iconSrc:
|
||||
'https://yastatic.net/s3/front-maps-static/maps-front-jsapi-3/examples/images/marker-custom-icon/purple-capybara.png',
|
||||
message: 'Лесной пожар',
|
||||
},
|
||||
{
|
||||
coordinates: [166.295, 61.415],
|
||||
iconSrc:
|
||||
'https://yastatic.net/s3/front-maps-static/maps-front-jsapi-3/examples/images/marker-custom-icon/green-capybara.png',
|
||||
message: 'Браконьерство',
|
||||
},
|
||||
];
|
||||
|
||||
exports.eventBoard = (req, res) => {
|
||||
res.status(200).send(JSON.stringify(mapevents));
|
||||
};
|
||||
|
|
@ -0,0 +1,91 @@
|
|||
const jwt = require("jsonwebtoken");
|
||||
const config = require("../config/auth.config.js");
|
||||
const db = require("../models");
|
||||
const User = db.user;
|
||||
|
||||
verifyToken = (req, res, next) => {
|
||||
let token = req.headers["x-access-token"];
|
||||
|
||||
if (!token) {
|
||||
return res.status(403).send({
|
||||
message: "No token provided!"
|
||||
});
|
||||
}
|
||||
|
||||
jwt.verify(token,
|
||||
config.secret,
|
||||
(err, decoded) => {
|
||||
if (err) {
|
||||
return res.status(401).send({
|
||||
message: "Unauthorized!",
|
||||
});
|
||||
}
|
||||
req.userId = decoded.id;
|
||||
next();
|
||||
});
|
||||
};
|
||||
|
||||
isAdmin = (req, res, next) => {
|
||||
User.findByPk(req.userId).then(user => {
|
||||
user.getRoles().then(roles => {
|
||||
for (let i = 0; i < roles.length; i++) {
|
||||
if (roles[i].name === "admin") {
|
||||
next();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
res.status(403).send({
|
||||
message: "Require Admin Role!"
|
||||
});
|
||||
return;
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
isModerator = (req, res, next) => {
|
||||
User.findByPk(req.userId).then(user => {
|
||||
user.getRoles().then(roles => {
|
||||
for (let i = 0; i < roles.length; i++) {
|
||||
if (roles[i].name === "moderator") {
|
||||
next();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
res.status(403).send({
|
||||
message: "Require Moderator Role!"
|
||||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
isModeratorOrAdmin = (req, res, next) => {
|
||||
User.findByPk(req.userId).then(user => {
|
||||
user.getRoles().then(roles => {
|
||||
for (let i = 0; i < roles.length; i++) {
|
||||
if (roles[i].name === "moderator") {
|
||||
next();
|
||||
return;
|
||||
}
|
||||
|
||||
if (roles[i].name === "admin") {
|
||||
next();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
res.status(403).send({
|
||||
message: "Require Moderator or Admin Role!"
|
||||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
const authJwt = {
|
||||
verifyToken: verifyToken,
|
||||
isAdmin: isAdmin,
|
||||
isModerator: isModerator,
|
||||
isModeratorOrAdmin: isModeratorOrAdmin
|
||||
};
|
||||
module.exports = authJwt;
|
|
@ -0,0 +1,22 @@
|
|||
const util = require("util");
|
||||
const multer = require("multer");
|
||||
const maxSize = 10 * 1024 * 1024;
|
||||
|
||||
let storage = multer.diskStorage({
|
||||
destination: (req, file, cb) => {
|
||||
cb(null, __basedir + "/resources/static/assets/uploads/");
|
||||
},
|
||||
filename: (req, file, cb) => {
|
||||
console.log(file.originalname);
|
||||
cb(null, req.body.id);
|
||||
},
|
||||
});
|
||||
|
||||
let uploadFile = multer({
|
||||
storage: storage,
|
||||
limits: { fileSize: maxSize },
|
||||
}).single("file");
|
||||
|
||||
let uploadFileMiddleware = util.promisify(uploadFile);
|
||||
|
||||
module.exports = uploadFileMiddleware;
|
|
@ -0,0 +1,7 @@
|
|||
const authJwt = require("./authJwt");
|
||||
const verifySignUp = require("./verifySignUp");
|
||||
|
||||
module.exports = {
|
||||
authJwt,
|
||||
verifySignUp
|
||||
};
|
|
@ -0,0 +1,57 @@
|
|||
const db = require("../models");
|
||||
const ROLES = db.ROLES;
|
||||
const User = db.user;
|
||||
|
||||
checkDuplicateUsernameOrEmail = (req, res, next) => {
|
||||
// Username
|
||||
User.findOne({
|
||||
where: {
|
||||
username: req.body.username
|
||||
}
|
||||
}).then(user => {
|
||||
if (user) {
|
||||
res.status(400).send({
|
||||
message: "Failed! Username is already in use!"
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// Email
|
||||
User.findOne({
|
||||
where: {
|
||||
email: req.body.email
|
||||
}
|
||||
}).then(user => {
|
||||
if (user) {
|
||||
res.status(400).send({
|
||||
message: "Failed! Email is already in use!"
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
next();
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
checkRolesExisted = (req, res, next) => {
|
||||
if (req.body.roles) {
|
||||
for (let i = 0; i < req.body.roles.length; i++) {
|
||||
if (!ROLES.includes(req.body.roles[i])) {
|
||||
res.status(400).send({
|
||||
message: "Failed! Role does not exist = " + req.body.roles[i]
|
||||
});
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
next();
|
||||
};
|
||||
|
||||
const verifySignUp = {
|
||||
checkDuplicateUsernameOrEmail: checkDuplicateUsernameOrEmail,
|
||||
checkRolesExisted: checkRolesExisted
|
||||
};
|
||||
|
||||
module.exports = verifySignUp;
|
|
@ -0,0 +1,29 @@
|
|||
module.exports = (sequelize, Sequelize) => {
|
||||
const FileEvent = sequelize.define("fileevent", {
|
||||
uuid: {
|
||||
type: Sequelize.UUID,
|
||||
primaryKey: true,
|
||||
},
|
||||
filename: {
|
||||
type: Sequelize.STRING
|
||||
},
|
||||
eventdate: {
|
||||
type: Sequelize.STRING
|
||||
},
|
||||
message: {
|
||||
type: Sequelize.STRING
|
||||
},
|
||||
latitude: {
|
||||
type: Sequelize.STRING
|
||||
},
|
||||
longitude: {
|
||||
type: Sequelize.STRING
|
||||
},
|
||||
status: {
|
||||
type: Sequelize.INTEGER
|
||||
}
|
||||
});
|
||||
|
||||
return FileEvent;
|
||||
};
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
const config = require("../config/db.config.js");
|
||||
|
||||
const Sequelize = require("sequelize");
|
||||
const sequelize = new Sequelize(
|
||||
config.DB,
|
||||
config.USER,
|
||||
config.PASSWORD,
|
||||
{
|
||||
host: config.HOST,
|
||||
dialect: config.dialect,
|
||||
pool: {
|
||||
max: config.pool.max,
|
||||
min: config.pool.min,
|
||||
acquire: config.pool.acquire,
|
||||
idle: config.pool.idle
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
const db = {};
|
||||
|
||||
db.Sequelize = Sequelize;
|
||||
db.sequelize = sequelize;
|
||||
|
||||
db.user = require("../models/user.model.js")(sequelize, Sequelize);
|
||||
db.role = require("../models/role.model.js")(sequelize, Sequelize);
|
||||
db.fileevent = require("./fileevent.model.js")(sequelize, Sequelize);
|
||||
|
||||
db.role.belongsToMany(db.user, {
|
||||
through: "user_roles"
|
||||
});
|
||||
db.user.belongsToMany(db.role, {
|
||||
through: "user_roles"
|
||||
});
|
||||
|
||||
db.ROLES = ["user", "admin", "moderator"];
|
||||
|
||||
module.exports = db;
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
module.exports = (sequelize, Sequelize) => {
|
||||
const Role = sequelize.define("roles", {
|
||||
id: {
|
||||
type: Sequelize.INTEGER,
|
||||
primaryKey: true
|
||||
},
|
||||
name: {
|
||||
type: Sequelize.STRING
|
||||
}
|
||||
});
|
||||
|
||||
return Role;
|
||||
};
|
|
@ -0,0 +1,16 @@
|
|||
module.exports = (sequelize, Sequelize) => {
|
||||
const User = sequelize.define("users", {
|
||||
username: {
|
||||
type: Sequelize.STRING
|
||||
},
|
||||
email: {
|
||||
type: Sequelize.STRING
|
||||
},
|
||||
password: {
|
||||
type: Sequelize.STRING
|
||||
}
|
||||
});
|
||||
|
||||
return User;
|
||||
};
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
const { verifySignUp } = require("../middleware");
|
||||
const controller = require("../controllers/auth.controller");
|
||||
|
||||
module.exports = function(app) {
|
||||
app.use(function(req, res, next) {
|
||||
res.header(
|
||||
"Access-Control-Allow-Headers",
|
||||
"x-access-token, Origin, Content-Type, Accept"
|
||||
);
|
||||
next();
|
||||
});
|
||||
|
||||
app.post(
|
||||
"/v1/auth/signup",
|
||||
[
|
||||
verifySignUp.checkDuplicateUsernameOrEmail,
|
||||
verifySignUp.checkRolesExisted
|
||||
],
|
||||
controller.signup
|
||||
);
|
||||
app.post("/v1/auth/signin", controller.signin);
|
||||
};
|
|
@ -0,0 +1,49 @@
|
|||
|
||||
const { authJwt } = require("../middleware");
|
||||
const controller = require("../controllers/file.controller");
|
||||
|
||||
module.exports = function(app) {
|
||||
app.use(function(req, res, next) {
|
||||
res.header(
|
||||
"Access-Control-Allow-Headers",
|
||||
"x-access-token, Origin, Content-Type, Accept"
|
||||
);
|
||||
next();
|
||||
});
|
||||
|
||||
app.post(
|
||||
"/v1/upload",
|
||||
[authJwt.verifyToken],
|
||||
controller.upload);
|
||||
|
||||
app.put(
|
||||
"/v1/event/:id",
|
||||
[authJwt.verifyToken],
|
||||
controller.updateFile);
|
||||
|
||||
app.get(
|
||||
"/v1/files",
|
||||
// [authJwt.verifyToken],
|
||||
controller.getListFiles);
|
||||
|
||||
app.get(
|
||||
"/v1/files/:id",
|
||||
[authJwt.verifyToken],
|
||||
controller.verifyFile);
|
||||
|
||||
// app.get(
|
||||
// "/v1/files/:name",
|
||||
// [authJwt.verifyToken],
|
||||
// controller.download);
|
||||
};
|
||||
|
||||
|
||||
// let routes = (app) => {
|
||||
// router.post("/upload", controller.upload);
|
||||
// router.get("/files", controller.getListFiles);
|
||||
// router.get("/files/:name", controller.download);
|
||||
|
||||
// app.use(router);
|
||||
// };
|
||||
|
||||
// module.exports = routes;
|
|
@ -0,0 +1,39 @@
|
|||
const { authJwt } = require("../middleware");
|
||||
const controller = require("../controllers/user.controller");
|
||||
|
||||
module.exports = function(app) {
|
||||
app.use(function(req, res, next) {
|
||||
res.header(
|
||||
"Access-Control-Allow-Headers",
|
||||
"x-access-token, Origin, Content-Type, Accept"
|
||||
);
|
||||
next();
|
||||
});
|
||||
|
||||
app.get("/v1/test/all", controller.allAccess);
|
||||
|
||||
app.get(
|
||||
"/v1/test/user",
|
||||
[authJwt.verifyToken],
|
||||
controller.userBoard
|
||||
);
|
||||
|
||||
app.get(
|
||||
"/v1/test/mod",
|
||||
[authJwt.verifyToken, authJwt.isModerator],
|
||||
controller.moderatorBoard
|
||||
);
|
||||
|
||||
app.get(
|
||||
"/v1/test/admin",
|
||||
[authJwt.verifyToken, authJwt.isAdmin],
|
||||
controller.adminBoard
|
||||
);
|
||||
|
||||
app.get(
|
||||
"/v1/test/event",
|
||||
[authJwt.verifyToken, authJwt.isAdmin],
|
||||
controller.eventBoard
|
||||
);
|
||||
};
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Example HTML5 site final</title>
|
||||
<link rel="stylesheet" href="/css/style.css">
|
||||
<!--[if lt IE 9]>
|
||||
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"name": "ekocam-auth-service",
|
||||
"version": "1.0.0",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"description": "",
|
||||
"dependencies": {
|
||||
"bcryptjs": "^2.4.3",
|
||||
"cors": "^2.8.5",
|
||||
"express": "^4.19.2",
|
||||
"jsonwebtoken": "^9.0.2",
|
||||
"multer": "^1.4.5-lts.1",
|
||||
"pg": "^8.12.0",
|
||||
"pg-hstore": "^2.3.4",
|
||||
"sequelize": "^6.37.3",
|
||||
"uuid": "^10.0.0"
|
||||
}
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
Uploads directory
|
|
@ -0,0 +1,71 @@
|
|||
const express = require("express");
|
||||
const cors = require("cors");
|
||||
|
||||
const app = express();
|
||||
|
||||
global.__basedir = __dirname;
|
||||
|
||||
var corsOptions = {
|
||||
origin: "*"
|
||||
};
|
||||
|
||||
var bcrypt = require("bcryptjs");
|
||||
|
||||
app.use(cors(corsOptions));
|
||||
|
||||
// parse requests of content-type - application/json
|
||||
app.use(express.json());
|
||||
|
||||
// parse requests of content-type - application/x-www-form-urlencoded
|
||||
app.use(express.urlencoded({ extended: true }));
|
||||
|
||||
// simple route
|
||||
app.get("/", (req, res) => {
|
||||
res.json({ message: "Welcome to Auth application." });
|
||||
});
|
||||
|
||||
const db = require("./app/models");
|
||||
const Role = db.role;
|
||||
const User = db.user;
|
||||
const FileEvent = db.fileevent;
|
||||
|
||||
db.sequelize.sync({force: true}).then(() => {
|
||||
console.log('Drop and Resync Db');
|
||||
initial();
|
||||
});
|
||||
|
||||
// routes
|
||||
require('./app/routes/auth.routes')(app);
|
||||
require('./app/routes/user.routes')(app);
|
||||
require('./app/routes/file.routes')(app);
|
||||
|
||||
// set port, listen for requests
|
||||
const PORT = process.env.PORT || 3201;
|
||||
app.listen(PORT, () => {
|
||||
console.log(`Server is running on port ${PORT}.`);
|
||||
});
|
||||
|
||||
function initial() {
|
||||
Role.create({
|
||||
id: 1,
|
||||
name: "user"
|
||||
});
|
||||
|
||||
Role.create({
|
||||
id: 2,
|
||||
name: "moderator"
|
||||
});
|
||||
|
||||
Role.create({
|
||||
id: 3,
|
||||
name: "admin"
|
||||
});
|
||||
|
||||
User.create({
|
||||
username: "admin",
|
||||
email: "admin@example.net",
|
||||
password: bcrypt.hashSync("admin", 8)
|
||||
}).then(user => {
|
||||
user.setRoles([3]).then();
|
||||
});
|
||||
};
|
Loading…
Reference in New Issue