From c60a832b8a00334b3fa99c9c75f0f767a3f34860 Mon Sep 17 00:00:00 2001 From: RedrockJS Date: Mon, 9 Jun 2025 16:21:17 +0300 Subject: [PATCH] feat: add api --- package-lock.json | 21 +++++++++++++ package.json | 2 ++ src/app/api/heartbeat/route.ts | 9 ++++++ src/app/api/sendform/route.ts | 55 ++++++++++++++++++++++++++++++++++ 4 files changed, 87 insertions(+) create mode 100644 src/app/api/heartbeat/route.ts create mode 100644 src/app/api/sendform/route.ts diff --git a/package-lock.json b/package-lock.json index a98e970..4fcfb91 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "@hookform/resolvers": "^5.1.1", "next": "15.3.2", + "nodemailer": "^7.0.3", "react": "^19.0.0", "react-dom": "^19.0.0", "react-hook-form": "^7.57.0", @@ -20,6 +21,7 @@ "devDependencies": { "@eslint/eslintrc": "^3", "@types/node": "^20", + "@types/nodemailer": "^6.4.17", "@types/react": "^19", "@types/react-dom": "^19", "clsx": "^2.1.1", @@ -962,6 +964,16 @@ "undici-types": "~6.19.2" } }, + "node_modules/@types/nodemailer": { + "version": "6.4.17", + "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.17.tgz", + "integrity": "sha512-I9CCaIp6DTldEg7vyUTZi8+9Vo0hi1/T8gv3C89yk1rSAAzoKQ8H8ki/jBYJSFoH/BisgLP8tkZMlQ91CIquww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/react": { "version": "19.1.6", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.6.tgz", @@ -4372,6 +4384,15 @@ } } }, + "node_modules/nodemailer": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-7.0.3.tgz", + "integrity": "sha512-Ajq6Sz1x7cIK3pN6KesGTah+1gnwMnx5gKl3piQlQQE/PwyJ4Mbc8is2psWYxK3RJTVeqsDaCv8ZzXLCDHMTZw==", + "license": "MIT-0", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", diff --git a/package.json b/package.json index 895cbf8..1db006a 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "dependencies": { "@hookform/resolvers": "^5.1.1", "next": "15.3.2", + "nodemailer": "^7.0.3", "react": "^19.0.0", "react-dom": "^19.0.0", "react-hook-form": "^7.57.0", @@ -23,6 +24,7 @@ "devDependencies": { "@eslint/eslintrc": "^3", "@types/node": "^20", + "@types/nodemailer": "^6.4.17", "@types/react": "^19", "@types/react-dom": "^19", "clsx": "^2.1.1", diff --git a/src/app/api/heartbeat/route.ts b/src/app/api/heartbeat/route.ts new file mode 100644 index 0000000..bdf0b67 --- /dev/null +++ b/src/app/api/heartbeat/route.ts @@ -0,0 +1,9 @@ +export async function GET(request: Request) { + return new Response('Heartbeat!', { + status: 200, + headers: { + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS', + }, + }); +} diff --git a/src/app/api/sendform/route.ts b/src/app/api/sendform/route.ts new file mode 100644 index 0000000..0e64176 --- /dev/null +++ b/src/app/api/sendform/route.ts @@ -0,0 +1,55 @@ +import nodemailer from 'nodemailer'; + +type TFormData = { + name: string; + phone: string; + message: string; + form: string; +}; + +async function sendMail(data: TFormData) { + const { name, phone, message, form } = data; + + const formattedBody = ` + + +

${message}

+

---

+

${name}

+

${phone}

+

---

+

${form}

+ + + `; + + const transporter = nodemailer.createTransport({ + service: 'gmail', // С помощью этой настройки можно менять тип почты, например gmail + auth: { + user: process.env.MAIL_USER, + pass: process.env.MAIL_PASS, + }, + }); + + return await transporter.sendMail({ + from: process.env.MAIL_FROM, + to: process.env.MAIL_TO, + subject: 'Заявка с сайта', + html: formattedBody, + }); +} + +export async function POST(request: Request) { + try { + const payload = await request.json(); + console.log(payload); + } catch (error) { + return new Response(`Api error: ${error}`, { + status: 400, + }); + } + + return new Response('Success!', { + status: 200, + }); +}