From 6212048aecae4fa4fea372ccacc55ad96be739b1 Mon Sep 17 00:00:00 2001 From: bragaz_rexita Date: Wed, 17 Sep 2025 13:29:29 +0700 Subject: [PATCH] Add skeleton --- .env.example | 43 ++++++++++++++++++++++++++++++ .eslintrc.js | 20 ++++++++++++++ .gitignore | 8 +++--- .prettierrc | 8 ++++++ Procfile | 1 + app.js | 30 +++++++++++++++++++++ ecosystem.config.js | 14 ++++++++++ index.js | 10 +++++++ package.json | 64 +++++++++++++++++++++++++++++++++++++++++++++ utils/logger.js | 9 +++++++ 10 files changed, 203 insertions(+), 4 deletions(-) create mode 100644 .env.example create mode 100644 .eslintrc.js create mode 100644 .prettierrc create mode 100644 Procfile create mode 100644 app.js create mode 100644 ecosystem.config.js create mode 100644 index.js create mode 100644 package.json create mode 100644 utils/logger.js diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..3be6766 --- /dev/null +++ b/.env.example @@ -0,0 +1,43 @@ +# # SQL DB Connection Colo +# SQL_HOST=117.102.231.130 +# SQL_DATABASE=piu +# SQL_USERNAME=sa +# SQL_PASSWORD=@R3M4niA. +# SQL_PORT=1433 + +SQL_HOST=203.153.114.226 +SQL_PORT=1112 +SQL_DATABASE=piu +SQL_USERNAME=sa +SQL_PASSWORD=piu123 + +# Application Port - express server listens on this port (default 9000). +PORT=9528 +ENDPOINT_WA=http://203.153.114.226:9529/send +# ENDPOINT_WA=http://localhost:9529/send +ENDPOINT_FE=http://203.153.114.226:9527 + +# JWT access secret +SECRET=secret + +# JWT refresh secret +REFRESH_SECRET=refreshsecret + +# mail server settings +# SMTP_FROM=youremail +# SMTP_USER=youremail + +# Stripe secret key - https://stripe.com/docs/keys +# STRIPE_SECRET_KEY=sk_test_4eC39HqLyjWDarjtT1zdp7dc + +# Google OAuth2.0 settings for sign in with Google - https://console.developers.google.com/ +# OAUTH_CLIENT_ID=287280guajkxxxxxxx.apps.googleusercontent.com +# OAUTH_CLIENT_SECRET=xxxxxxxxxxxxxxxxxxxx +# OAUTH_REFRESH_TOKEN=1//XXXXXXXXXX + +# Google OAuth2.0 settings for sending emails - https://console.developers.google.com/ +# CLIENT_ID=938729280guajk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com +# CLIENT_SECRET=xxxxxxxxxxxxxxxxxxxxxxxx +# REFRESH_TOKEN=1//XXXXXXXX + +VITE_KEY_SESSION=PetekRombonganPetekMorekMorakMarek diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..1a9399c --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,20 @@ +module.exports = { + env: { + commonjs: true, + es2021: true, + node: true, + jest: true, + }, + extends: ["eslint:recommended"], + parserOptions: { + ecmaVersion: 12, + }, + parser: "babel-eslint", + plugins: ["babel", "prettier"], + rules: { + "no-console": "warn", + eqeqeq: "error", + // "object-curly-spacing": ["error", "always"], + // "arrow-spacing": ["error", { before: true, after: true }], + }, +}; diff --git a/.gitignore b/.gitignore index 1ae140b..ee0f965 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ +.env node_modules -log -tmp -/public/** -!public/.gitkeep \ No newline at end of file +.vscode +request.http +*.rest diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..f2d1f8e --- /dev/null +++ b/.prettierrc @@ -0,0 +1,8 @@ +{ + "semi": true, + "tabWidth": 2, + "printWidth": 80, + "singleQuote": false, + "trailingComma": "es5", + "endOfLine": "lf" +} diff --git a/Procfile b/Procfile new file mode 100644 index 0000000..1da0cd6 --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +web: node index.js diff --git a/app.js b/app.js new file mode 100644 index 0000000..8674820 --- /dev/null +++ b/app.js @@ -0,0 +1,30 @@ +const express = require("express"); +require("express-async-errors"); +const cors = require("cors"); +const morgan = require("morgan"); +const cookieParser = require("cookie-parser"); +const routes = require("./routes"); +const helmet = require("helmet"); +const compression = require("compression"); +const unknownEndpoint = require("./middleware/unKnownEndpoint"); +const { handleError } = require("./helpers/error"); + +const app = express(); + +app.set("trust proxy", 1); +app.use(cors({ credentials: true, origin: true })); +app.use(express.json()); +app.use(morgan("dev")); +app.use(compression()); +app.use(helmet()); +app.use(cookieParser()); + +app.use("/api", routes); + +app.get("/", (req, res) => + res.send("

HAHALO

") +); +app.use(unknownEndpoint); +app.use(handleError); + +module.exports = app; diff --git a/ecosystem.config.js b/ecosystem.config.js new file mode 100644 index 0000000..83bdbbf --- /dev/null +++ b/ecosystem.config.js @@ -0,0 +1,14 @@ +module.exports = { + apps: [ + { + name: "bengkel-api", + script: "./index.js", // Path to your entry file + env: { + NODE_ENV: "development", + }, + env_production: { + NODE_ENV: "production", + }, + }, + ], +}; \ No newline at end of file diff --git a/index.js b/index.js new file mode 100644 index 0000000..552b3a5 --- /dev/null +++ b/index.js @@ -0,0 +1,10 @@ +require("dotenv").config({ path: __dirname + "/.env" }); +const http = require("http"); +const app = require("./app"); +const { logger } = require("./utils/logger"); + +const server = http.createServer(app); + +const PORT = process.env.PORT || 9524; + +server.listen(PORT, () => logger.info(`Magic happening on port: ${PORT}`)); diff --git a/package.json b/package.json new file mode 100644 index 0000000..0645c2a --- /dev/null +++ b/package.json @@ -0,0 +1,64 @@ +{ + "name": "server", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "start": "cross-env NODE_ENV=production node index", + "dev": "cross-env NODE_ENV=development && nodemon --legacy-watch", + "test": "cross-env NODE_ENV=test jest --verbose --runInBand", + "test:watch": "cross-env NODE_ENV=test jest --verbose --runInBand --watch", + "lint": "eslint .", + "lint:fix": "eslint . --fix", + "format": "prettier --write ." + }, + "jest": { + "testEnvironment": "node", + "coveragePathIgnorePatterns": [ + "/node_modules/" + ] + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "axios": "^1.9.0", + "bcrypt": "^5.1.1", + "compression": "^1.7.4", + "cookie-parser": "^1.4.6", + "cors": "^2.8.5", + "crypto": "^1.0.1", + "crypto-js": "^4.2.0", + "dotenv": "^8.2.0", + "express": "^4.18.2", + "express-async-errors": "^3.1.1", + "google-auth-library": "^8.7.0", + "googleapis": "^112.0.0", + "helmet": "^4.4.1", + "joi": "^17.13.3", + "jsonwebtoken": "^8.5.1", + "moment": "^2.29.4", + "morgan": "^1.10.0", + "mqtt": "^5.14.0", + "mssql": "^11.0.1", + "multer": "^1.4.5-lts.2", + "nodemailer": "^6.8.0", + "pg": "^8.8.0", + "pino": "^6.11.3", + "stripe": "^8.138.0", + "svg-captcha": "^1.4.0", + "swagger-ui-express": "^4.6.0", + "uuid": "^11.1.0" + }, + "devDependencies": { + "babel-eslint": "^10.1.0", + "cross-env": "^7.0.3", + "eslint": "^7.32.0", + "eslint-plugin-babel": "^5.3.1", + "eslint-plugin-prettier": "^4.2.1", + "nodemon": "^2.0.20", + "pino-pretty": "^4.8.0", + "prettier": "^2.8.1", + "supertest": "^6.3.3" + } +} diff --git a/utils/logger.js b/utils/logger.js new file mode 100644 index 0000000..b8591e1 --- /dev/null +++ b/utils/logger.js @@ -0,0 +1,9 @@ +const pino = require("pino"); + +// Create a logging instance +const logger = pino({ + level: process.env.NODE_ENV === "production" ? "info" : "debug", + prettyPrint: process.env.NODE_ENV !== "production", +}); + +module.exports.logger = logger;