From a5b7d0edfec70bb573ea561650eacf605c62caa3 Mon Sep 17 00:00:00 2001 From: szbk Date: Sun, 3 Mar 2024 23:12:38 +0300 Subject: [PATCH] first commit --- .dockerignore | 2 + .gitignore | 20 ++++++++++ Dockerfile | 14 +++++++ app.js | 47 ++++++++++++++++++++++ configs/index.js | 38 ++++++++++++++++++ controller/save.controller.js | 74 +++++++++++++++++++++++++++++++++++ docker-compose.yml | 55 ++++++++++++++++++++++++++ models/device.model.js | 34 ++++++++++++++++ package.json | 23 +++++++++++ route/device.info.route.js | 13 ++++++ route/save.route.js | 35 +++++++++++++++++ 11 files changed, 355 insertions(+) create mode 100644 .dockerignore create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 app.js create mode 100644 configs/index.js create mode 100644 controller/save.controller.js create mode 100644 docker-compose.yml create mode 100644 models/device.model.js create mode 100644 package.json create mode 100644 route/device.info.route.js create mode 100644 route/save.route.js diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..5171c54 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +node_modules +npm-debug.log \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9f0da23 --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +node_modules/ +public/src/thumbs +public/avatars/ +# OS generated files # +###################### +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db +package-lock.json +.env +.vscode/ +settings.json +Procfile +dump.rdb + error.log + output.log \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..7768afe --- /dev/null +++ b/Dockerfile @@ -0,0 +1,14 @@ +FROM node:21.5.0 + +RUN mkdir /smarthome +WORKDIR /smarthome +RUN npm install -g nodemon + +COPY package.json /smarthome +RUN npm install + +COPY . /smarthome + +EXPOSE 9095 + +CMD ["nodemon", "app"] \ No newline at end of file diff --git a/app.js b/app.js new file mode 100644 index 0000000..8890ec6 --- /dev/null +++ b/app.js @@ -0,0 +1,47 @@ +const express = require("express"); +const app = express(); +const server = require("http").createServer(app); +const mongoose = require("mongoose"); +const configs = require("./configs"); +const chalk = require("chalk"); +const helmet = require("helmet"); +const config = require('./configs'); +const morgan = require("morgan"); + +app.use(express.urlencoded({extended: true})); +app.use(express.json()); +app.use(helmet()); + +// Logs +app.use(morgan('dev')); + +// Connect Mongoose +mongoose.connect(configs.mongodburl, { + autoIndex: true +}).then(() => { + console.log(chalk.cyanBright.bold("Mongodb is live!")); +}).catch((error) => { + + console.log("Mongodb error: " + error.message); +}); + +// Save Route +app.use("/api/save", require("./route/save.route")); +// Update Route +app.use("/api/update", require("./route/update.route")); +// Wrong Endpoint +app.use("/api/*", (req, res) => { + res.status(400).json({error: true, message: "Invalid api end point!"}); +}); +// Root public route +app.use("*", (req, res) => { // res.sendFile("public/", { root: __dirname }); + res.sendStatus(400); +}); +// Server Listening +server.listen(configs.port, () => { + console.log(chalk.yellowBright.bold.red("Listening: " + configs.port)); +}); +// Error Handling +app.on("eror", (error) => { + console.log(error); +}); \ No newline at end of file diff --git a/configs/index.js b/configs/index.js new file mode 100644 index 0000000..38e1527 --- /dev/null +++ b/configs/index.js @@ -0,0 +1,38 @@ +// Settings environments +require("dotenv").config(); + +const config = { + // Site Url + baseURL: process.env.BASE_URL, + port: process.env.PORT || 3000, + // Veridy Token + verifyToken: process.env.VERIFY_TOKEN, + // If the Remember me option is not selected + cookieExpirationTimeRememberTrue: parseInt(process.env.COOKIE_EXP_TIME_REMEMBER_TRUE), // 1 mounth + // Remember me option is selected + cookieExpirationTimeRememberFalse: parseInt(process.env.COOKIE_EXP_TIME_REMEMBER_FALSE), // 30 minute + // Token Settings + tookenExpirationTime: parseInt(process.env.TOOKEN_EXP_TIME), // 1 mounth + secret: process.env.SECRET, + // Crypt Salt Secret + cryptoSalt: process.env.CRYPTO_SALT, + // Avatar upload settings + avatarNameLength: 15, + avatarSizeLimit: 250000, // 250 KB + avatarFileTypes: /jpeg|jpg|png/, + // Mongo Settings + //mongodburl: process.env.MONGODB_URI_PRO, + mongodburl: process.env.MONGODB_URI, + // mongodburl: 'mongodb://mongo:27017/jwt' //server + // The Movie DB api key + tmdbApiKey: process.env.TMDB_API_KEY, + // Flixinfo api default language + thmdbDefaultLanguage: "en-US", + // Redis Cache değerleri + redisCacheLength: parseInt(process.env.REDIS_CACHE_LENGTH) || 100, // server başladığında ilk chachelenecek kayıt miktarı + redisTTL: parseInt(process.env.REDIS_TTL) || 86400, // veriler ne kadar süre cachede tutulacak + //redisUrl: process.env.REDIS_URL_PRO, + redisUrl: process.env.REDIS_URL, +}; + +module.exports = config; \ No newline at end of file diff --git a/controller/save.controller.js b/controller/save.controller.js new file mode 100644 index 0000000..ca931e6 --- /dev/null +++ b/controller/save.controller.js @@ -0,0 +1,74 @@ +const configs = require("../configs"); +const DeviceModel = require("../models/device.model"); + +const save = async ( + token, + device_name, + device_type, + manifactor, + serial_number, + model, + firmware_version, + device_ip_address +) => { + if (token === configs.verifyToken) { + try { + // Önce kaydı bulalım + const existingDevice = await DeviceModel.findOne({ + device_name, + device_type, + manifactor, + serial_number, + model, + firmware_version + }); + if (!existingDevice) { + // İlk defa kaydet + const newDevice = new DeviceModel({ + device_name, + device_type, + manifactor, + serial_number, + model, + firmware_version, + device_ip_address + }); + const result = await newDevice.save(); + return "Cihaz kaydedildi."; + } else { + // Daha önce kaydedilmiş ise sadece ip adresini güncelle + const filter = { + device_name, + device_type, + manifactor, + serial_number, + model, + firmware_version + }; + + const update = { + $set: { + device_ip_address + } + }; + + const result = await DeviceModel.updateOne(filter, update); + + if (result.nModified === 0) { + throw new Error("Güncellenmek istenen kayıt bulunamadı"); + } + + return "IP Adresi güncellendi"; + } + } catch (error) { + // if (error.code === 11000) { + // throw new Error("Zaten kaydedilmiş"); + // } + throw new Error("Mongodb'ye kaydedilirken hata oluştu"); + } + } else { + throw new Error("Hatalı token"); + } +}; + +module.exports = { save }; diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..4121524 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,55 @@ +version: "3" +services: + web: + build: . + volumes: + - ./:/smarthome + - /smarthome/node_modules + ports: + - "9095:9095" + restart: always + links: + - redis + - mongo + tty: true + environment: + DEBUG_COLORS: "true" + TERM: xterm-256color + COLORTERM: truecolor + networks: + - smarthome + mongo: + container_name: mongo + image: mongo:4.2.5 + restart: always + environment: + - MONGO_INITDB_ROOT_USERNAME=admin + - MONGO_INITDB_ROOT_PASSWORD=anTis**664+..12895 + ports: ["27017:27017"] + networks: + - smarthome + redis: + container_name: redis + image: redis:5.0.8 + restart: always + command: ["redis-server", "--bind", "redis", "--port", "6379"] + ports: ["6379:6379"] + mongo-express: + container_name: mongo-express + image: mongo-express + restart: always + environment: + - ME_CONFIG_MONGODB_ADMINUSERNAME=admin + - ME_CONFIG_MONGODB_ADMINPASSWORD=anTis**664+..12895 + - ME_CONFIG_MONGODB_SERVER=mongo + - ME_CONFIG_MONGODB_AUTH_USERNAME=wisecolt + - ME_CONFIG_MONGODB_AUTH_PASSWORD=XQrvBF7y&Jnc&JoAPCVG6%!kM3UY*d*VweW + ports: + - "8081:8081" + depends_on: + - mongo + networks: + - smarthome + +networks: + smarthome: diff --git a/models/device.model.js b/models/device.model.js new file mode 100644 index 0000000..a034259 --- /dev/null +++ b/models/device.model.js @@ -0,0 +1,34 @@ +const mongoose = require("mongoose"); + +const Schema = mongoose.Schema; + +const deviceSchema = new Schema({ + device_name: { + type: String, + unique: true + }, + device_type: { + type: String + }, + manifactor: { + type: String + }, + serial_number: { + type: String, + unique: true + }, + model: { + type: String + }, + firmware_version: { + type: String + }, + device_ip_address: { + type: String, + unique: true + } +}); + +const Device = mongoose.model("Device", deviceSchema); + +module.exports = Device; diff --git a/package.json b/package.json new file mode 100644 index 0000000..f8545fc --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "dependencies": { + "create-react-app": "^5.0.1", + "dotenv": "^16.4.5", + "express": "^4.18.2", + "helmet": "^7.1.0", + "mongoose": "^8.2.0", + "morgan": "^1.10.0", + "nodemon": "^3.1.0", + "socket.io": "^4.7.4", + "chalk": "^4.0.0" + }, + "name": "wisecolt-mancmini", + "version": "1.0.0", + "main": "app.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "keywords": [], + "description": "" +} diff --git a/route/device.info.route.js b/route/device.info.route.js new file mode 100644 index 0000000..6d408b4 --- /dev/null +++ b/route/device.info.route.js @@ -0,0 +1,13 @@ +const express = require("express"); +const router = express.Router(); +// const MainController = require("../controller/main.controller"); + +router.use(express.urlencoded({extended: false})); +router.use(express.json()); + +// Save route +router.get("/", (req, res) => { + res.status(400).json({error: true, message: "Invalid api end point!"}); +}); + +module.exports = router; \ No newline at end of file diff --git a/route/save.route.js b/route/save.route.js new file mode 100644 index 0000000..7b163b4 --- /dev/null +++ b/route/save.route.js @@ -0,0 +1,35 @@ +const express = require("express"); +const router = express.Router(); +const SaveController = require("../controller/save.controller"); + +router.use(express.urlencoded({ extended: false })); +router.use(express.json()); + +// Save route +router.post("/", async (req, res) => { + try { + // Token Control Middleware + const result = await SaveController.save( + req.body.token, + req.body.device_name, + req.body.device_type, + req.body.manifactor, + req.body.serial_number, + req.body.model, + req.body.firmware_version, + req.body.device_ip_address + ); + + return res.status(200).json({ + error: false, + result + }); + } catch (error) { + res.status(400).json({ + error: true, + result: error.message + }); + } +}); + +module.exports = router;