From 8fe151d593fe1602790b13025c54d93f772ba9cd Mon Sep 17 00:00:00 2001 From: WovenCoast Date: Sun, 11 Feb 2024 11:50:23 +0500 Subject: [PATCH] [feat] Added telegram functionality --- .env.sample | 21 ++- package-lock.json | 23 +-- package.json | 1 + server.js | 38 ++++- src/public/styles.css | 373 +++++++++++++++++++++++------------------- src/telegram.js | 30 ++++ src/views/index.ejs | 129 +++++++++++++-- test.js | 27 +++ 8 files changed, 426 insertions(+), 216 deletions(-) create mode 100644 src/telegram.js create mode 100644 test.js diff --git a/.env.sample b/.env.sample index 3563f05..f484e30 100644 --- a/.env.sample +++ b/.env.sample @@ -1,6 +1,19 @@ -REGISTRATION_OPEN=true -BRANDING_TITLE= -BRANDING_LOGO= +REGISTRATION_OPEN=true # Set to anything except "true" to disable registration + +# Telegram +TG_BOTAPI=https://api.telegram.org/bot +TELEGRAM_BOT_TOKEN= # Your Telegram Bot Token +TELEGRAM_CHAT_ID= # Your Telegram Chat ID + +# Webpage Settings +BRANDING_TITLE= # Website Title +BRANDING_LOGO= # Website Logo + +# Payment Details BANK_NAME= ACCOUNT_NAME= -ACCOUNT_NUMBER= \ No newline at end of file +ACCOUNT_NUMBER= + +PRICE= +ROAMING_PRICE= +PRICE_CURRENCY= \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 3b59938..ae4c985 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,10 +13,10 @@ "dotenv": "^16.4.1", "ejs": "^3.1.9", "express": "^4.18.2", + "form-data": "^4.0.0", "multer": "^1.4.5-lts.1" }, "devDependencies": { - "@tailwindcss/forms": "^0.5.7", "daisyui": "^4.6.2", "tailwindcss": "^3.4.1" } @@ -143,18 +143,6 @@ "node": ">=14" } }, - "node_modules/@tailwindcss/forms": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.7.tgz", - "integrity": "sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==", - "dev": true, - "dependencies": { - "mini-svg-data-uri": "^1.2.3" - }, - "peerDependencies": { - "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1" - } - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -1312,15 +1300,6 @@ "node": ">= 0.6" } }, - "node_modules/mini-svg-data-uri": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", - "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", - "dev": true, - "bin": { - "mini-svg-data-uri": "cli.js" - } - }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", diff --git a/package.json b/package.json index 355d5b4..c9f8027 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "dotenv": "^16.4.1", "ejs": "^3.1.9", "express": "^4.18.2", + "form-data": "^4.0.0", "multer": "^1.4.5-lts.1" }, "devDependencies": { diff --git a/server.js b/server.js index 4e9947a..8608df8 100644 --- a/server.js +++ b/server.js @@ -2,6 +2,8 @@ require("dotenv").config() let registrationOpen, branding; +const { sendInfo } = require("./src/telegram") + function loadEnv() { registrationOpen = process.env.REGISTRATION_OPEN === "true" branding = { @@ -12,6 +14,11 @@ function loadEnv() { accountNumber: process.env.ACCOUNT_NUMBER || "1234567890", accountName: process.env.ACCOUNT_NAME || "Account Name", }, + price: { + normal: process.env.PRICE || "100", + roaming: process.env.ROAMING_PRICE || "200", + currency: process.env.PRICE_CURRENCY || "MVR", + } } } loadEnv() @@ -37,31 +44,46 @@ app.use(express.urlencoded({ extended: true })) // add multer const multer = require("multer") +fs.mkdirSync("uploads", { recursive: true }) const upload = multer({ storage: multer.diskStorage({ destination: (req, file, cb) => { cb(null, "./uploads") }, filename: (req, file, cb) => { - cb(null, `${Date.now()}-${file.originalname}`) - } + cb(null, `${Date.now()}- ${req.body["device_name"]} - ${file.originalname}`) + }, }) }) // app.use(upload.single("receipt")) // routes app.get("/", (req, res) => { - res.render(registrationOpen ? "index" : "closed", { branding }) + res.render(registrationOpen ? "index" : "closed", { branding, message: "" }) }); -app.post("/register", upload.single("receipt"), (req, res) => { +app.post("/register", upload.single("transfer_receipt"), (req, res) => { if (!registrationOpen) { res.render("closed") - return + return; } - console.log(req.body) - console.log(req.file) - res.render("success", { branding }) + + const { customer_name, mac_address, device_name, is_roaming } = req.body + const receipt = req.file; + + if (!customer_name || !mac_address || !device_name || !receipt || !is_roaming) { + res.render("index", { branding, message: "Please fill all fields" }) + return; + } + + sendInfo(receipt.path, customer_name, mac_address, device_name, is_roaming) + .then(() => { + res.render("success", { branding }) + }) + .catch((error) => { + console.error(error) + res.render("index", { branding, message: "An internal error occurred" }) + }) }) const port = process.env.PORT || 4818; diff --git a/src/public/styles.css b/src/public/styles.css index 5d56d1e..0a842c5 100644 --- a/src/public/styles.css +++ b/src/public/styles.css @@ -897,13 +897,6 @@ html { flex-grow: 1; } -.card-actions { - display: flex; - flex-wrap: wrap; - align-items: flex-start; - gap: 0.5rem; -} - .card figure { display: flex; align-items: center; @@ -1078,6 +1071,15 @@ html { } } + .btn-outline:hover { + --tw-border-opacity: 1; + border-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity))); + --tw-bg-opacity: 1; + background-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity))); + --tw-text-opacity: 1; + color: var(--fallback-b1,oklch(var(--b1)/var(--tw-text-opacity))); + } + .btn-outline.btn-primary:hover { --tw-text-opacity: 1; color: var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity))); @@ -1090,6 +1092,42 @@ html { } } + .btn-outline.btn-secondary:hover { + --tw-text-opacity: 1; + color: var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity))); + } + + @supports (color: color-mix(in oklab, black, black)) { + .btn-outline.btn-secondary:hover { + background-color: color-mix(in oklab, var(--fallback-s,oklch(var(--s)/1)) 90%, black); + border-color: color-mix(in oklab, var(--fallback-s,oklch(var(--s)/1)) 90%, black); + } + } + + .btn-outline.btn-accent:hover { + --tw-text-opacity: 1; + color: var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity))); + } + + @supports (color: color-mix(in oklab, black, black)) { + .btn-outline.btn-accent:hover { + background-color: color-mix(in oklab, var(--fallback-a,oklch(var(--a)/1)) 90%, black); + border-color: color-mix(in oklab, var(--fallback-a,oklch(var(--a)/1)) 90%, black); + } + } + + .btn-outline.btn-success:hover { + --tw-text-opacity: 1; + color: var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity))); + } + + @supports (color: color-mix(in oklab, black, black)) { + .btn-outline.btn-success:hover { + background-color: color-mix(in oklab, var(--fallback-su,oklch(var(--su)/1)) 90%, black); + border-color: color-mix(in oklab, var(--fallback-su,oklch(var(--su)/1)) 90%, black); + } + } + .btn-outline.btn-info:hover { --tw-text-opacity: 1; color: var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity))); @@ -1102,6 +1140,30 @@ html { } } + .btn-outline.btn-warning:hover { + --tw-text-opacity: 1; + color: var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity))); + } + + @supports (color: color-mix(in oklab, black, black)) { + .btn-outline.btn-warning:hover { + background-color: color-mix(in oklab, var(--fallback-wa,oklch(var(--wa)/1)) 90%, black); + border-color: color-mix(in oklab, var(--fallback-wa,oklch(var(--wa)/1)) 90%, black); + } + } + + .btn-outline.btn-error:hover { + --tw-text-opacity: 1; + color: var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity))); + } + + @supports (color: color-mix(in oklab, black, black)) { + .btn-outline.btn-error:hover { + background-color: color-mix(in oklab, var(--fallback-er,oklch(var(--er)/1)) 90%, black); + border-color: color-mix(in oklab, var(--fallback-er,oklch(var(--er)/1)) 90%, black); + } + } + .btn-disabled:hover, .btn[disabled]:hover, .btn:disabled:hover { @@ -1271,55 +1333,6 @@ html { align-items: center; } -.radio { - flex-shrink: 0; - --chkbg: var(--bc); - height: 1.5rem; - width: 1.5rem; - cursor: pointer; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - border-radius: 9999px; - border-width: 1px; - border-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity))); - --tw-border-opacity: 0.2; -} - -.select { - display: inline-flex; - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - user-select: none; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - height: 3rem; - min-height: 3rem; - padding-left: 1rem; - padding-right: 2.5rem; - font-size: 0.875rem; - line-height: 1.25rem; - line-height: 2; - border-radius: var(--rounded-btn, 0.5rem); - border-width: 1px; - border-color: transparent; - --tw-bg-opacity: 1; - background-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity))); - background-image: linear-gradient(45deg, transparent 50%, currentColor 50%), - linear-gradient(135deg, currentColor 50%, transparent 50%); - background-position: calc(100% - 20px) calc(1px + 50%), - calc(100% - 16.1px) calc(1px + 50%); - background-size: 4px 4px, - 4px 4px; - background-repeat: no-repeat; -} - -.select[multiple] { - height: auto; -} - .steps { display: inline-grid; grid-auto-flow: column; @@ -1340,6 +1353,14 @@ html { min-width: 4rem; } +.alert-error { + border-color: var(--fallback-er,oklch(var(--er)/0.2)); + --tw-text-opacity: 1; + color: var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity))); + --alert-bg: var(--fallback-er,oklch(var(--er)/1)); + --alert-bg-mix: var(--fallback-b1,oklch(var(--b1)/1)); +} + .btm-nav > *.disabled, .btm-nav > *[disabled] { pointer-events: none; @@ -1397,13 +1418,13 @@ html { border-color: var(--btn-color, var(--fallback-b2)); } - .btn-primary { - --btn-color: var(--fallback-p); - } - .btn-info { --btn-color: var(--fallback-in); } + + .btn-error { + --btn-color: var(--fallback-er); + } } @supports (color: color-mix(in oklab, black, black)) { @@ -1412,10 +1433,35 @@ html { border-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black); } + .btn-outline.btn-secondary.btn-active { + background-color: color-mix(in oklab, var(--fallback-s,oklch(var(--s)/1)) 90%, black); + border-color: color-mix(in oklab, var(--fallback-s,oklch(var(--s)/1)) 90%, black); + } + + .btn-outline.btn-accent.btn-active { + background-color: color-mix(in oklab, var(--fallback-a,oklch(var(--a)/1)) 90%, black); + border-color: color-mix(in oklab, var(--fallback-a,oklch(var(--a)/1)) 90%, black); + } + + .btn-outline.btn-success.btn-active { + background-color: color-mix(in oklab, var(--fallback-su,oklch(var(--su)/1)) 90%, black); + border-color: color-mix(in oklab, var(--fallback-su,oklch(var(--su)/1)) 90%, black); + } + .btn-outline.btn-info.btn-active { background-color: color-mix(in oklab, var(--fallback-in,oklch(var(--in)/1)) 90%, black); border-color: color-mix(in oklab, var(--fallback-in,oklch(var(--in)/1)) 90%, black); } + + .btn-outline.btn-warning.btn-active { + background-color: color-mix(in oklab, var(--fallback-wa,oklch(var(--wa)/1)) 90%, black); + border-color: color-mix(in oklab, var(--fallback-wa,oklch(var(--wa)/1)) 90%, black); + } + + .btn-outline.btn-error.btn-active { + background-color: color-mix(in oklab, var(--fallback-er,oklch(var(--er)/1)) 90%, black); + border-color: color-mix(in oklab, var(--fallback-er,oklch(var(--er)/1)) 90%, black); + } } .btn:focus-visible { @@ -1424,20 +1470,14 @@ html { outline-offset: 2px; } -.btn-primary { - --tw-text-opacity: 1; - color: var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity))); - outline-color: var(--fallback-p,oklch(var(--p)/1)); -} - @supports (color: oklch(0 0 0)) { - .btn-primary { - --btn-color: var(--p); - } - .btn-info { --btn-color: var(--in); } + + .btn-error { + --btn-color: var(--er); + } } .btn-info { @@ -1446,6 +1486,12 @@ html { outline-color: var(--fallback-in,oklch(var(--in)/1)); } +.btn-error { + --tw-text-opacity: 1; + color: var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity))); + outline-color: var(--fallback-er,oklch(var(--er)/1)); +} + .btn.glass { --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; @@ -1474,6 +1520,25 @@ html { background-color: var(--fallback-bc,oklch(var(--bc)/0.2)); } +.btn-outline { + border-color: currentColor; + background-color: transparent; + --tw-text-opacity: 1; + color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.btn-outline.btn-active { + --tw-border-opacity: 1; + border-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity))); + --tw-bg-opacity: 1; + background-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity))); + --tw-text-opacity: 1; + color: var(--fallback-b1,oklch(var(--b1)/var(--tw-text-opacity))); +} + .btn-outline.btn-primary { --tw-text-opacity: 1; color: var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity))); @@ -1484,6 +1549,36 @@ html { color: var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity))); } +.btn-outline.btn-secondary { + --tw-text-opacity: 1; + color: var(--fallback-s,oklch(var(--s)/var(--tw-text-opacity))); +} + +.btn-outline.btn-secondary.btn-active { + --tw-text-opacity: 1; + color: var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity))); +} + +.btn-outline.btn-accent { + --tw-text-opacity: 1; + color: var(--fallback-a,oklch(var(--a)/var(--tw-text-opacity))); +} + +.btn-outline.btn-accent.btn-active { + --tw-text-opacity: 1; + color: var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity))); +} + +.btn-outline.btn-success { + --tw-text-opacity: 1; + color: var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity))); +} + +.btn-outline.btn-success.btn-active { + --tw-text-opacity: 1; + color: var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity))); +} + .btn-outline.btn-info { --tw-text-opacity: 1; color: var(--fallback-in,oklch(var(--in)/var(--tw-text-opacity))); @@ -1494,6 +1589,26 @@ html { color: var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity))); } +.btn-outline.btn-warning { + --tw-text-opacity: 1; + color: var(--fallback-wa,oklch(var(--wa)/var(--tw-text-opacity))); +} + +.btn-outline.btn-warning.btn-active { + --tw-text-opacity: 1; + color: var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity))); +} + +.btn-outline.btn-error { + --tw-text-opacity: 1; + color: var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity))); +} + +.btn-outline.btn-error.btn-active { + --tw-text-opacity: 1; + color: var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity))); +} + .btn.btn-disabled, .btn[disabled], .btn:disabled { @@ -1896,6 +2011,12 @@ details.collapse summary::-webkit-details-marker { outline-offset: 2px; } +.mockup-phone .display { + overflow: hidden; + border-radius: 40px; + margin-top: -25px; +} + .mockup-browser .mockup-browser-toolbar .input { position: relative; margin-left: auto; @@ -1954,32 +2075,6 @@ details.collapse summary::-webkit-details-marker { } } -.radio:focus { - box-shadow: none; -} - -.radio:focus-visible { - outline-style: solid; - outline-width: 2px; - outline-offset: 2px; - outline-color: var(--fallback-bc,oklch(var(--bc)/1)); -} - -.radio:checked, - .radio[aria-checked="true"] { - --tw-bg-opacity: 1; - background-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity))); - background-image: none; - animation: radiomark var(--animation-input, 0.2s) ease-out; - box-shadow: 0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset, - 0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset; -} - -.radio:disabled { - cursor: not-allowed; - opacity: 0.2; -} - @keyframes radiomark { 0% { box-shadow: 0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset, @@ -2011,51 +2106,6 @@ details.collapse summary::-webkit-details-marker { } } -.select:focus { - box-shadow: none; - border-color: var(--fallback-bc,oklch(var(--bc)/0.2)); - outline-style: solid; - outline-width: 2px; - outline-offset: 2px; - outline-color: var(--fallback-bc,oklch(var(--bc)/0.2)); -} - -.select-disabled, - .select:disabled, - .select[disabled] { - cursor: not-allowed; - --tw-border-opacity: 1; - border-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity))); - --tw-bg-opacity: 1; - background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity))); - color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); - --tw-text-opacity: 0.2; -} - -.select-disabled::-moz-placeholder, .select:disabled::-moz-placeholder, .select[disabled]::-moz-placeholder { - color: var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity))); - --tw-placeholder-opacity: 0.2; -} - -.select-disabled::placeholder, - .select:disabled::placeholder, - .select[disabled]::placeholder { - color: var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity))); - --tw-placeholder-opacity: 0.2; -} - -.select-multiple, - .select[multiple], - .select[size].select:not([size="1"]) { - background-image: none; - padding-right: 1rem; -} - -[dir="rtl"] .select { - background-position: calc(0% + 12px) calc(1px + 50%), - calc(0% + 16px) calc(1px + 50%); -} - @keyframes skeleton { from { background-position: 150%; @@ -2284,22 +2334,23 @@ details.collapse summary::-webkit-details-marker { visibility: collapse; } -.mt-4 { - margin-top: 1rem; +.mx-auto { + margin-left: auto; + margin-right: auto; } .mt-8 { margin-top: 2rem; } -.block { - display: block; -} - .flex { display: flex; } +.h-6 { + height: 1.5rem; +} + .h-\[100vh\] { height: 100vh; } @@ -2308,6 +2359,10 @@ details.collapse summary::-webkit-details-marker { width: 2.5rem; } +.w-6 { + width: 1.5rem; +} + .w-96 { width: 24rem; } @@ -2320,34 +2375,18 @@ details.collapse summary::-webkit-details-marker { width: 80vw; } -.w-full { - width: 100%; -} - -.max-w-xs { - max-width: 20rem; -} - -.flex-1 { - flex: 1 1 0%; +.shrink-0 { + flex-shrink: 0; } .items-center { align-items: center; } -.justify-end { - justify-content: flex-end; -} - .justify-center { justify-content: center; } -.overflow-visible { - overflow: visible; -} - .overflow-x-auto { overflow-x: auto; } @@ -2376,8 +2415,8 @@ details.collapse summary::-webkit-details-marker { background-color: var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity))); } -.text-center { - text-align: center; +.stroke-current { + stroke: currentColor; } .text-3xl { diff --git a/src/telegram.js b/src/telegram.js new file mode 100644 index 0000000..f422561 --- /dev/null +++ b/src/telegram.js @@ -0,0 +1,30 @@ +const fs = require("fs") +const FormData = require('form-data'); +const axios = require('axios').default; + +async function sendInfo(filepath, customer_name, mac_address, device_name, roaming) { + const caption = `Customer Name: \`${customer_name}\`\nMAC Address: \`${mac_address}\`\nDevice Name: \`${device_name}\`\nRoaming: **${roaming ? "Yes" : "No"}**` + + var formData = new FormData(); + formData.append("photo", fs.createReadStream(filepath)); + + const query = new URLSearchParams(); + query.append("chat_id", process.env.TELEGRAM_CHAT_ID); + query.append("caption", caption); + query.append("parse_mode", "MarkdownV2"); + + // upload file to telegram using axios + const response = await axios.post(`${process.env.TG_BOTAPI}${process.env.TELEGRAM_BOT_TOKEN}/sendPhoto?${query.toString()}`, formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }) + + if (response.status !== 200) { + console.log(response.data) + } +} + +module.exports = { + sendInfo +} \ No newline at end of file diff --git a/src/views/index.ejs b/src/views/index.ejs index db6fe08..64752ea 100644 --- a/src/views/index.ejs +++ b/src/views/index.ejs @@ -9,6 +9,48 @@ diff --git a/test.js b/test.js new file mode 100644 index 0000000..96fa1e8 --- /dev/null +++ b/test.js @@ -0,0 +1,27 @@ +require("dotenv").config() +const FormData = require('form-data'); +const axios = require('axios').default; +const fs = require("fs") + +const file = "./src/public/sarlink.jpg"; + +var formData = new FormData(); +formData.append("photo", fs.createReadStream(file)); +formData.append("message", "Sarlink test image"); + +const query = new URLSearchParams(); +query.append("chat_id", process.env.TELEGRAM_CHAT_ID); +query.append("caption", "Sarlink test image"); + +// upload file to telegram using axios +axios.post(`${process.env.TG_BOTAPI}${process.env.TELEGRAM_BOT_TOKEN}/sendPhoto?${query.toString()}`, formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } +}) + .then(response => { + console.log(response.data) + }) + .catch(error => { + console.error(error) + }) \ No newline at end of file