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
|
||||||
logs
|
logs
|
||||||
*.log
|
*.log
|
||||||
npm-debug.log*
|
npm-debug.log*
|
||||||
yarn-debug.log*
|
yarn-debug.log*
|
||||||
yarn-error.log*
|
yarn-error.log*
|
||||||
|
pnpm-debug.log*
|
||||||
lerna-debug.log*
|
lerna-debug.log*
|
||||||
.pnpm-debug.log*
|
|
||||||
|
|
||||||
# Diagnostic reports (https://nodejs.org/api/report.html)
|
node_modules
|
||||||
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
.DS_Store
|
||||||
|
|
||||||
# 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
|
|
||||||
dist
|
dist
|
||||||
|
dist-ssr
|
||||||
|
coverage
|
||||||
|
*.local
|
||||||
|
|
||||||
# Gatsby files
|
/cypress/videos/
|
||||||
.cache/
|
/cypress/screenshots/
|
||||||
# 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
|
|
||||||
|
|
||||||
# vuepress build output
|
# Editor directories and files
|
||||||
.vuepress/dist
|
.vscode/*
|
||||||
|
!.vscode/extensions.json
|
||||||
# vuepress v2.x temp and cache directory
|
.idea
|
||||||
.temp
|
*.suo
|
||||||
.cache
|
*.ntvs*
|
||||||
|
*.njsproj
|
||||||
# Docusaurus cache and generated files
|
*.sln
|
||||||
.docusaurus
|
*.sw?
|
||||||
|
|
||||||
# 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
|
|
||||||
|
|
||||||
|
*.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