diff --git a/client/src/utils/api.ts b/client/src/utils/api.ts
index 74ccfa8..676012b 100644
--- a/client/src/utils/api.ts
+++ b/client/src/utils/api.ts
@@ -1,7 +1,7 @@
import ky from "ky";
const api = ky.extend({
- prefixUrl: import.meta.env.VITE_API_URL,
+ prefixUrl: `${import.meta.env.VITE_API_URL}/api`,
});
export default api;
diff --git a/client/src/utils/randomNumber.ts b/client/src/utils/randomNumber.ts
new file mode 100644
index 0000000..2569ed0
--- /dev/null
+++ b/client/src/utils/randomNumber.ts
@@ -0,0 +1,3 @@
+export default function randomNumber(min: number, max: number) {
+ return Math.floor(Math.random() * (max - min) + min);
+}
diff --git a/client/vite.config.ts b/client/vite.config.ts
index d366e8c..326ec3a 100644
--- a/client/vite.config.ts
+++ b/client/vite.config.ts
@@ -1,7 +1,32 @@
-import { defineConfig } from "vite";
+import { defineConfig, loadEnv } from "vite";
import react from "@vitejs/plugin-react-swc";
// https://vitejs.dev/config/
-export default defineConfig({
- plugins: [react()],
+export default defineConfig(({ mode }) => {
+ process.env = { ...process.env, ...loadEnv(mode, process.cwd()) };
+ // const env = loadEnv(mode, process.cwd());
+
+ return {
+ plugins: [react()],
+ server: {
+ port: 3002,
+ proxy: {
+ "/api": {
+ target: process.env.VITE_API_URL,
+ changeOrigin: true,
+ rewrite: (path) => path.replace(/^\/api/, ""),
+ },
+ },
+ },
+ preview: {
+ port: 3002,
+ proxy: {
+ "/api": {
+ target: process.env.VITE_API_URL,
+ changeOrigin: true,
+ rewrite: (path) => path.replace(/^\/api/, ""),
+ },
+ },
+ },
+ };
});
diff --git a/client/yarn.lock b/client/yarn.lock
index c100d0e..4bb54fb 100644
--- a/client/yarn.lock
+++ b/client/yarn.lock
@@ -334,6 +334,13 @@
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841"
integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
+"@types/node@^20.10.5":
+ version "20.10.5"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.5.tgz#47ad460b514096b7ed63a1dae26fad0914ed3ab2"
+ integrity sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==
+ dependencies:
+ undici-types "~5.26.4"
+
"@types/prop-types@*":
version "15.7.10"
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.10.tgz#892afc9332c4d62a5ea7e897fe48ed2085bbb08a"
@@ -1484,6 +1491,11 @@ react-swipeable@^7.0.1:
resolved "https://registry.yarnpkg.com/react-swipeable/-/react-swipeable-7.0.1.tgz#cd299f5986c5e4a7ee979839658c228f660e1e0c"
integrity sha512-RKB17JdQzvECfnVj9yDZsiYn3vH0eyva/ZbrCZXZR0qp66PBRhtg4F9yJcJTWYT5Adadi+x4NoG53BxKHwIYLQ==
+react-yandex-metrika@^2.6.0:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/react-yandex-metrika/-/react-yandex-metrika-2.6.0.tgz#9c935c8c7ea5505e34391b9b3e86deb6d50053c9"
+ integrity sha512-8K4wExsNZtY3DTxh1G8a+zWH9Pg8fw23MJcoJ4I/562qrHRnh7L5nteq3lnNL58dnNQbuuHIRoGgMjIo+r1GjA==
+
react@^18.2.0:
version "18.2.0"
resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5"
@@ -1719,6 +1731,11 @@ ua-parser-js@^1.0.33:
resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.37.tgz#b5dc7b163a5c1f0c510b08446aed4da92c46373f"
integrity sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==
+undici-types@~5.26.4:
+ version "5.26.5"
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
+ integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
+
update-browserslist-db@^1.0.13:
version "1.0.13"
resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4"
diff --git a/server/.env b/server/.env
index b2b3968..020f99e 100644
--- a/server/.env
+++ b/server/.env
@@ -1,3 +1,3 @@
-PORT=3000
+PORT=3003
MONGO_URI=mongodb://root:p62Z!ZatgY25@194.26.138.94:27017/
JWT_SECRET=yDcdWJgvlj2bJAuovYfQHTvtc3U9xQPw
\ No newline at end of file
diff --git a/server/ecosystem.config.js b/server/ecosystem.config.js
new file mode 100644
index 0000000..646f9dd
--- /dev/null
+++ b/server/ecosystem.config.js
@@ -0,0 +1,10 @@
+module.exports = {
+ apps: [
+ {
+ name: "graff.estate-server:3003",
+ exec_mode: "cluster",
+ script: "yarn",
+ args: "start",
+ },
+ ],
+};
diff --git a/server/package.json b/server/package.json
index 2373119..1e6ccca 100644
--- a/server/package.json
+++ b/server/package.json
@@ -2,9 +2,8 @@
"name": "server",
"private": true,
"version": "0.0.0",
- "type": "module",
"scripts": {
- "dev": "nodemon --exec node --no-warnings=ExperimentalWarning --loader=ts-node/esm src/index.ts",
+ "dev": "nodemon src/index.ts",
"build": "npx tsc",
"start": "node dist/index.js"
},
@@ -12,16 +11,20 @@
"cors": "^2.8.5",
"dotenv": "^16.3.1",
"express": "^4.18.2",
+ "express-sslify": "^1.2.0",
"mongoose": "^8.0.1",
"multer": "^1.4.5-lts.1",
+ "nodemailer": "^6.9.7",
"sharp": "^0.32.6",
"uuid": "^9.0.1"
},
"devDependencies": {
"@types/cors": "^2.8.15",
"@types/express": "^4.17.20",
+ "@types/express-sslify": "^1.2.5",
"@types/multer": "^1.4.11",
"@types/node": "^20.8.10",
+ "@types/nodemailer": "^6.4.14",
"@types/uuid": "^9.0.7",
"nodemon": "^3.0.1",
"ts-node": "^10.9.1",
diff --git a/server/src/index.ts b/server/src/index.ts
index 97bb8e2..81cf5e2 100644
--- a/server/src/index.ts
+++ b/server/src/index.ts
@@ -2,19 +2,19 @@ import "dotenv/config";
import connectDB from "./config/db";
import express, { json } from "express";
import cors from "cors";
-import uploadRouter from "./routes/upload";
-import projectsRouter from "./routes/projects";
+import mailRoute from "./routes/mail";
+import projectRoute from "./routes/projects";
-await connectDB();
+connectDB();
const app = express();
-const port = process.env.PORT || 3000;
+const port = process.env.PORT || 3003;
app.use(json());
-app.use(cors());
+app.use(cors({ origin: "*" }));
-app.use("/upload", uploadRouter);
-app.use("/projects", projectsRouter);
+app.use("/mail", mailRoute);
+app.use("/projects", projectRoute);
app.listen(port, () => {
console.log(`Server is listening on port ${port}`);
diff --git a/server/src/models/Mail.ts b/server/src/models/Mail.ts
new file mode 100644
index 0000000..3ca9eea
--- /dev/null
+++ b/server/src/models/Mail.ts
@@ -0,0 +1,32 @@
+import { Schema, model } from "mongoose";
+
+const mailSchema = new Schema(
+ {
+ fullname: {
+ type: String,
+ required: true,
+ },
+ email: {
+ type: String,
+ required: true,
+ },
+ phone: {
+ type: String,
+ },
+ request: {
+ type: String,
+ },
+ referer: {
+ type: String,
+ },
+ },
+ {
+ timestamps: true,
+ toJSON: { virtuals: true },
+ toObject: { virtuals: true },
+ }
+);
+
+const Mail = model("Mail", mailSchema);
+
+export default Mail;
diff --git a/server/src/routes/mail.ts b/server/src/routes/mail.ts
new file mode 100644
index 0000000..a22f829
--- /dev/null
+++ b/server/src/routes/mail.ts
@@ -0,0 +1,57 @@
+import { Router } from "express";
+import Mail from "../models/Mail";
+import nodemailer from "nodemailer";
+
+const router = Router();
+
+router.post("/", async (req, res) => {
+ try {
+ const referer = req.headers.referer;
+ const { fullname, email, phone, request } = req.body;
+
+ await Mail.create({ fullname, email, phone, request, referer });
+
+ // create reusable transporter object using the default SMTP transport
+ let transporter = nodemailer.createTransport({
+ host: "mail.netangels.ru",
+ port: 587,
+ secure: false, // true for 465, false for other ports
+ auth: {
+ user: "test@graff.tech", // generated ethereal user
+ pass: "ZmL0pKiDFWUyCDMq", // generated ethereal password
+ },
+ });
+
+ // send mail with defined transport object
+ let info = await transporter.sendMail({
+ from: email, // sender address
+ to: "info@graff.tech", // list of receivers
+ subject: "Заявка с сайта graff.estate", // Subject line
+ text: `
+ Имя Фамилия: ${fullname}
+ Email: ${email}
+ Телефон: ${phone}
+ Текст запроса: ${request}
+ `, // plain text body
+ html: `
+
Имя: ${fullname}
+
Email: ${email}
+
Телефон: ${phone}
+
Текст запроса: ${request}
+
`, // html body
+ });
+
+ console.log(info);
+
+ console.log(req.body);
+
+ res.json({ ok: 1 });
+ } catch (error) {
+ console.log(error);
+ res.json({ error: 1 });
+ }
+});
+
+const mailRoute = router;
+
+export default mailRoute;
diff --git a/server/src/routes/projects.ts b/server/src/routes/projects.ts
index 3aed427..1b675be 100644
--- a/server/src/routes/projects.ts
+++ b/server/src/routes/projects.ts
@@ -5,7 +5,7 @@ const router = Router();
router.get("/", async (_req, res) => {
try {
- const projects = await Project.find().sort({ createdAt: -1 });
+ const projects = await Project.find().sort({ releaseDate: -1 });
return res.json(projects);
} catch (error) {
@@ -66,5 +66,5 @@ router.delete("/:id", async (req, res) => {
}
});
-const projectsRouter = router;
-export default projectsRouter;
+const projectRoute = router;
+export default projectRoute;
diff --git a/server/src/routes/upload.ts b/server/src/routes/upload.ts
index 6757ca1..94c636c 100644
--- a/server/src/routes/upload.ts
+++ b/server/src/routes/upload.ts
@@ -1,61 +1,77 @@
import { Router } from "express";
-import multer, { memoryStorage } from "multer";
-import sharp from "sharp";
-import fs from "fs";
-import { v4 as uuidv4 } from "uuid";
+// import multer, { memoryStorage } from "multer";
+// import sharp from "sharp";
+// import fs from "fs";
+import path from "path";
+// import { v4 as uuidv4 } from "uuid";
const router = Router();
-const upload = multer({
- dest: "uploads/",
- storage: memoryStorage(),
- fileFilter: (_req, file, cb) => {
- if (file.mimetype.split("/")[0] === "image") {
- cb(null, true);
- } else {
- cb(new Error("Only images are allowed!"));
- }
- },
+// const upload = multer({
+// dest: "uploads/",
+// storage: memoryStorage(),
+// fileFilter: (_req, file, cb) => {
+// if (file.mimetype.split("/")[0] === "image") {
+// cb(null, true);
+// } else {
+// cb(new Error("Only images are allowed!"));
+// }
+// },
+// });
+
+router.get("/", (_req, res) => {
+ res.json({ ok: 1 });
});
-router.get("/:file", (req, res) => {
- const fileName = req.params.file;
+// router.get("/:filename", (req, res) => {
+// res.sendFile(`${path.resolve("uploads")}/${req.params.filename}`);
+// });
- try {
- const readStream = fs.createReadStream(`uploads/${fileName}`);
- readStream.pipe(res);
- } catch (error) {
- if (error instanceof Error) {
- return res.json({ error: error.message });
- }
- }
-});
+// router.get("/:file", (req, res) => {
+// const fileName = req.params.file;
-router.post("/", upload.single("file"), async (req, res) => {
- if (!req.file) {
- return res.json({ error: "req.file" });
- }
+// console.log(fileName);
- try {
- const filename = `${uuidv4()}.jpg`;
+// try {
+// const readStream = fs.createReadStream(
+// `${path.join(__dirname, "uploads")}/${fileName}`
+// );
- await sharp(req.file.buffer)
- .resize({
- width: 728,
- height: 728,
- fit: "inside",
- withoutEnlargement: true,
- })
- .jpeg({ quality: 90 })
- .toFile(`uploads/${filename}`);
+// console.log(readStream);
- return res.json({ file: `http://192.168.1.171:3000/upload/${filename}` });
- } catch (error) {
- if (error instanceof Error) {
- return res.json({ error: error.message });
- }
- }
-});
+// readStream.pipe(res);
+// } catch (error) {
+// if (error instanceof Error) {
+// return res.json({ error: error.message });
+// }
+// }
+// });
-const uploadRouter = router;
-export default uploadRouter;
+// router.post("/", upload.single("file"), async (req, res) => {
+// if (!req.file) {
+// return res.json({ error: "req.file" });
+// }
+
+// try {
+// const filename = `${uuidv4()}.jpg`;
+
+// await sharp(req.file.buffer)
+// .resize({
+// width: 728,
+// height: 728,
+// fit: "inside",
+// withoutEnlargement: true,
+// })
+// .jpeg({ quality: 90 })
+// .toFile(`uploads/${filename}`);
+
+// return res.json({ file: `/upload/${filename}` });
+// } catch (error) {
+// if (error instanceof Error) {
+// return res.json({ error: error.message });
+// }
+// }
+// });
+
+const uploadRoute = router;
+export default uploadRoute;
diff --git a/server/tsconfig.json b/server/tsconfig.json
index 9fb5481..e7913fc 100644
--- a/server/tsconfig.json
+++ b/server/tsconfig.json
@@ -1,114 +1,18 @@
{
"compilerOptions": {
- /* Visit https://aka.ms/tsconfig to read more about this file */
-
- /* Projects */
- // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */
- // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */
- // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */
- // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */
- // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
- // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */
-
- /* Language and Environment */
- "target": "ES2020" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */,
- // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
- // "jsx": "preserve", /* Specify what JSX code is generated. */
- // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */
- // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
- // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */
- // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
- // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */
- // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */
- // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
- // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
- // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */
-
- /* Modules */
- "module": "ESNext" /* Specify what module code is generated. */,
- // "rootDir": "./", /* Specify the root folder within your source files. */
- "moduleResolution": "Node" /* Specify how TypeScript looks up a file from a given module specifier. */,
- // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
- // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */
- // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */
- // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */
- // "types": [], /* Specify type package names to be included without being referenced in a source file. */
- // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
- // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */
- // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */
- // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */
- // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */
- // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */
- // "resolveJsonModule": true, /* Enable importing .json files. */
- // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */
- // "noResolve": true, /* Disallow 'import's, 'require's or '
's from expanding the number of files TypeScript should add to a project. */
-
- /* JavaScript Support */
- // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */
- // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */
- // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */
-
- /* Emit */
- // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
- // "declarationMap": true, /* Create sourcemaps for d.ts files. */
- // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
- // "sourceMap": true, /* Create source map files for emitted JavaScript files. */
- // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */
- // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */
- "outDir": "./dist" /* Specify an output folder for all emitted files. */,
- // "removeComments": true, /* Disable emitting comments. */
- // "noEmit": true, /* Disable emitting files from a compilation. */
- // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
- // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */
- // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
- // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */
- // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
- // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */
- // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
- // "newLine": "crlf", /* Set the newline character for emitting files. */
- // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */
- // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */
- // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */
- // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */
- // "declarationDir": "./", /* Specify the output directory for generated declaration files. */
- // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */
-
- /* Interop Constraints */
- // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
- // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */
- // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */
- "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */,
- // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
- "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */,
-
- /* Type Checking */
- "strict": true /* Enable all strict type-checking options. */,
- // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */
- // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */
- // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
- // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */
- // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */
- // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */
- // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */
- // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
- "noUnusedLocals": true /* Enable error reporting when local variables aren't read. */,
- "noUnusedParameters": true /* Raise an error when a function parameter isn't read. */,
- // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
- // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
- "noFallthroughCasesInSwitch": true /* Enable error reporting for fallthrough cases in switch statements. */,
- // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */
- // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */
- // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */
- // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */
- // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */
-
- /* Completeness */
- // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
- "skipLibCheck": true /* Skip type checking all .d.ts files. */
+ "target": "ESNext",
+ "module": "CommonJS",
+ "moduleResolution": "Node",
+ "outDir": "./dist",
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": true,
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true,
+ "skipLibCheck": true
},
"ts-node": {
- "esm": true,
- "experimentalSpecifierResolution": "node",
"transpileOnly": true
}
}
diff --git a/server/uploads/02e37966-d5c0-4197-9a07-bd0899977581.jpg b/server/uploads/02e37966-d5c0-4197-9a07-bd0899977581.jpg
new file mode 100644
index 0000000..6892cb5
Binary files /dev/null and b/server/uploads/02e37966-d5c0-4197-9a07-bd0899977581.jpg differ
diff --git a/server/uploads/1072c768-1284-4a2e-ac79-8ee02cc00bd7.jpg b/server/uploads/1072c768-1284-4a2e-ac79-8ee02cc00bd7.jpg
new file mode 100644
index 0000000..ba905c1
Binary files /dev/null and b/server/uploads/1072c768-1284-4a2e-ac79-8ee02cc00bd7.jpg differ
diff --git a/server/uploads/10ebf169-8aaa-4226-8c83-47e7e73ed7a1.jpg b/server/uploads/10ebf169-8aaa-4226-8c83-47e7e73ed7a1.jpg
new file mode 100644
index 0000000..30b72ae
Binary files /dev/null and b/server/uploads/10ebf169-8aaa-4226-8c83-47e7e73ed7a1.jpg differ
diff --git a/server/uploads/1fd4e736-65ec-4ddd-a95c-c95fdbf4505d.jpg b/server/uploads/1fd4e736-65ec-4ddd-a95c-c95fdbf4505d.jpg
new file mode 100644
index 0000000..edc4cdb
Binary files /dev/null and b/server/uploads/1fd4e736-65ec-4ddd-a95c-c95fdbf4505d.jpg differ
diff --git a/server/uploads/21f326b4-4827-4726-81d6-05b42976ca5a.jpg b/server/uploads/21f326b4-4827-4726-81d6-05b42976ca5a.jpg
new file mode 100644
index 0000000..5a99e48
Binary files /dev/null and b/server/uploads/21f326b4-4827-4726-81d6-05b42976ca5a.jpg differ
diff --git a/server/uploads/22633312-9762-4e27-a846-0f5fbdd2f168.jpg b/server/uploads/22633312-9762-4e27-a846-0f5fbdd2f168.jpg
new file mode 100644
index 0000000..0bb610a
Binary files /dev/null and b/server/uploads/22633312-9762-4e27-a846-0f5fbdd2f168.jpg differ
diff --git a/server/uploads/26097c7a-b6ff-49e3-9045-deb284db3ca6.jpg b/server/uploads/26097c7a-b6ff-49e3-9045-deb284db3ca6.jpg
new file mode 100644
index 0000000..b7cca85
Binary files /dev/null and b/server/uploads/26097c7a-b6ff-49e3-9045-deb284db3ca6.jpg differ
diff --git a/server/uploads/30092de7-1476-4f37-8d49-faf689384f36.jpg b/server/uploads/30092de7-1476-4f37-8d49-faf689384f36.jpg
new file mode 100644
index 0000000..6a8d4e5
Binary files /dev/null and b/server/uploads/30092de7-1476-4f37-8d49-faf689384f36.jpg differ
diff --git a/server/uploads/3b51a99a-f8a8-411b-a4de-c4b57604e136.jpg b/server/uploads/3b51a99a-f8a8-411b-a4de-c4b57604e136.jpg
new file mode 100644
index 0000000..793e3bc
Binary files /dev/null and b/server/uploads/3b51a99a-f8a8-411b-a4de-c4b57604e136.jpg differ
diff --git a/server/uploads/3e51ec53-c6c0-452a-9493-1463dea63f53.jpg b/server/uploads/3e51ec53-c6c0-452a-9493-1463dea63f53.jpg
new file mode 100644
index 0000000..58cea8d
Binary files /dev/null and b/server/uploads/3e51ec53-c6c0-452a-9493-1463dea63f53.jpg differ
diff --git a/server/uploads/441b3c15-2885-4fd2-82bb-395aecd05ca5.jpg b/server/uploads/441b3c15-2885-4fd2-82bb-395aecd05ca5.jpg
new file mode 100644
index 0000000..471e6cd
Binary files /dev/null and b/server/uploads/441b3c15-2885-4fd2-82bb-395aecd05ca5.jpg differ
diff --git a/server/uploads/48b37509-d993-447d-ba9b-bc1d4a6b678c.jpg b/server/uploads/48b37509-d993-447d-ba9b-bc1d4a6b678c.jpg
new file mode 100644
index 0000000..4f386d7
Binary files /dev/null and b/server/uploads/48b37509-d993-447d-ba9b-bc1d4a6b678c.jpg differ
diff --git a/server/uploads/57cec318-7f36-4190-9db4-03e5eacd0af1.jpg b/server/uploads/57cec318-7f36-4190-9db4-03e5eacd0af1.jpg
new file mode 100644
index 0000000..2faeaf3
Binary files /dev/null and b/server/uploads/57cec318-7f36-4190-9db4-03e5eacd0af1.jpg differ
diff --git a/server/uploads/598e1932-2475-46ff-b620-6822c7feee3c.jpg b/server/uploads/598e1932-2475-46ff-b620-6822c7feee3c.jpg
new file mode 100644
index 0000000..7281d18
Binary files /dev/null and b/server/uploads/598e1932-2475-46ff-b620-6822c7feee3c.jpg differ
diff --git a/server/uploads/63bba9b5-da3a-4e0d-ad2a-f642246f8a1f.jpg b/server/uploads/63bba9b5-da3a-4e0d-ad2a-f642246f8a1f.jpg
new file mode 100644
index 0000000..574993d
Binary files /dev/null and b/server/uploads/63bba9b5-da3a-4e0d-ad2a-f642246f8a1f.jpg differ
diff --git a/server/uploads/6464a678-05a2-484c-b716-eec441dc7f6d.jpg b/server/uploads/6464a678-05a2-484c-b716-eec441dc7f6d.jpg
new file mode 100644
index 0000000..56a3b54
Binary files /dev/null and b/server/uploads/6464a678-05a2-484c-b716-eec441dc7f6d.jpg differ
diff --git a/server/uploads/6513f9e5-ae6d-4915-a5d7-1e0d1ec42178.jpg b/server/uploads/6513f9e5-ae6d-4915-a5d7-1e0d1ec42178.jpg
new file mode 100644
index 0000000..e470928
Binary files /dev/null and b/server/uploads/6513f9e5-ae6d-4915-a5d7-1e0d1ec42178.jpg differ
diff --git a/server/uploads/768a430e-a858-40f0-be26-ba01f91cf950.jpg b/server/uploads/768a430e-a858-40f0-be26-ba01f91cf950.jpg
new file mode 100644
index 0000000..69c4e14
Binary files /dev/null and b/server/uploads/768a430e-a858-40f0-be26-ba01f91cf950.jpg differ
diff --git a/server/uploads/6390e7ea-9b80-4f77-b923-19565a799aaf.jpg b/server/uploads/7e28445b-f530-4a4a-9148-be947264e4d4.jpg
similarity index 100%
rename from server/uploads/6390e7ea-9b80-4f77-b923-19565a799aaf.jpg
rename to server/uploads/7e28445b-f530-4a4a-9148-be947264e4d4.jpg
diff --git a/server/uploads/811c3281-8375-4cba-9ad2-1d06bf0811e9.jpg b/server/uploads/811c3281-8375-4cba-9ad2-1d06bf0811e9.jpg
new file mode 100644
index 0000000..c7e5174
Binary files /dev/null and b/server/uploads/811c3281-8375-4cba-9ad2-1d06bf0811e9.jpg differ
diff --git a/server/uploads/92413a8f-e523-4591-b7f8-ed0079dd0b65.jpg b/server/uploads/92413a8f-e523-4591-b7f8-ed0079dd0b65.jpg
new file mode 100644
index 0000000..a3a97a3
Binary files /dev/null and b/server/uploads/92413a8f-e523-4591-b7f8-ed0079dd0b65.jpg differ
diff --git a/server/uploads/b2c89001-0929-4fb0-8450-9abcd2ed4e39.jpg b/server/uploads/a2a15f04-707f-47a7-ab84-da55520b9b7c.jpg
similarity index 100%
rename from server/uploads/b2c89001-0929-4fb0-8450-9abcd2ed4e39.jpg
rename to server/uploads/a2a15f04-707f-47a7-ab84-da55520b9b7c.jpg
diff --git a/server/uploads/adb3dafa-ba9a-4000-8e1b-8985eb10772f.jpg b/server/uploads/adb3dafa-ba9a-4000-8e1b-8985eb10772f.jpg
new file mode 100644
index 0000000..91b8560
Binary files /dev/null and b/server/uploads/adb3dafa-ba9a-4000-8e1b-8985eb10772f.jpg differ
diff --git a/server/uploads/b0272f18-996d-4211-9eb7-4020073a14db.jpg b/server/uploads/b0272f18-996d-4211-9eb7-4020073a14db.jpg
new file mode 100644
index 0000000..bbc8879
Binary files /dev/null and b/server/uploads/b0272f18-996d-4211-9eb7-4020073a14db.jpg differ
diff --git a/server/uploads/be094ff5-e782-4c4f-8c8c-f509c4cc3faf.jpg b/server/uploads/be094ff5-e782-4c4f-8c8c-f509c4cc3faf.jpg
new file mode 100644
index 0000000..bc9a13d
Binary files /dev/null and b/server/uploads/be094ff5-e782-4c4f-8c8c-f509c4cc3faf.jpg differ
diff --git a/server/uploads/bed3c81a-b812-452f-b3e4-3844121930d0.jpg b/server/uploads/bed3c81a-b812-452f-b3e4-3844121930d0.jpg
new file mode 100644
index 0000000..57a406e
Binary files /dev/null and b/server/uploads/bed3c81a-b812-452f-b3e4-3844121930d0.jpg differ
diff --git a/server/uploads/c46e7516-256b-4c0e-9d5b-b9ef887f14dd.jpg b/server/uploads/c46e7516-256b-4c0e-9d5b-b9ef887f14dd.jpg
new file mode 100644
index 0000000..fe8c0bb
Binary files /dev/null and b/server/uploads/c46e7516-256b-4c0e-9d5b-b9ef887f14dd.jpg differ
diff --git a/server/uploads/c8739341-c581-49d2-8c04-5075dc5a48de.jpg b/server/uploads/c8739341-c581-49d2-8c04-5075dc5a48de.jpg
new file mode 100644
index 0000000..06a63d0
Binary files /dev/null and b/server/uploads/c8739341-c581-49d2-8c04-5075dc5a48de.jpg differ
diff --git a/server/uploads/ca03e2a6-daeb-40b5-9ed7-c163663eb034.jpg b/server/uploads/ca03e2a6-daeb-40b5-9ed7-c163663eb034.jpg
new file mode 100644
index 0000000..697b45a
Binary files /dev/null and b/server/uploads/ca03e2a6-daeb-40b5-9ed7-c163663eb034.jpg differ
diff --git a/server/uploads/cb92d1d9-f606-4618-a55b-4cda66a445e9.jpg b/server/uploads/cb92d1d9-f606-4618-a55b-4cda66a445e9.jpg
new file mode 100644
index 0000000..c2b8548
Binary files /dev/null and b/server/uploads/cb92d1d9-f606-4618-a55b-4cda66a445e9.jpg differ
diff --git a/server/uploads/ceeda8b7-0c83-4a65-a879-50145b4b9f27.jpg b/server/uploads/ceeda8b7-0c83-4a65-a879-50145b4b9f27.jpg
new file mode 100644
index 0000000..e88b2a2
Binary files /dev/null and b/server/uploads/ceeda8b7-0c83-4a65-a879-50145b4b9f27.jpg differ
diff --git a/server/uploads/d11013f1-66ab-40c2-83b0-198368cb34f5.jpg b/server/uploads/d11013f1-66ab-40c2-83b0-198368cb34f5.jpg
new file mode 100644
index 0000000..6a8d4e5
Binary files /dev/null and b/server/uploads/d11013f1-66ab-40c2-83b0-198368cb34f5.jpg differ
diff --git a/server/uploads/eeba427d-dea5-4336-81d1-8a7fadcbbe6a.jpg b/server/uploads/eeba427d-dea5-4336-81d1-8a7fadcbbe6a.jpg
new file mode 100644
index 0000000..edc4cdb
Binary files /dev/null and b/server/uploads/eeba427d-dea5-4336-81d1-8a7fadcbbe6a.jpg differ
diff --git a/server/uploads/ff2722b1-30c9-4947-84f4-03fd7576e638.jpg b/server/uploads/ff2722b1-30c9-4947-84f4-03fd7576e638.jpg
new file mode 100644
index 0000000..618adce
Binary files /dev/null and b/server/uploads/ff2722b1-30c9-4947-84f4-03fd7576e638.jpg differ
diff --git a/server/yarn.lock b/server/yarn.lock
index 9dc7739..6bac2af 100644
--- a/server/yarn.lock
+++ b/server/yarn.lock
@@ -86,6 +86,13 @@
"@types/range-parser" "*"
"@types/send" "*"
+"@types/express-sslify@^1.2.5":
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/@types/express-sslify/-/express-sslify-1.2.5.tgz#1ee100084d8563ff46feabf0af54c072170f99c4"
+ integrity sha512-SxezXJqojxyTkkemmPQ9bUZQ3xLpzasA/I7bSTqt7tF6L4KNvfOlmcwjZ38tSolkf3oeQu20UVXh74ZBb8IUZA==
+ dependencies:
+ "@types/express" "*"
+
"@types/express@*", "@types/express@^4.17.20":
version "4.17.21"
resolved "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz"
@@ -125,6 +132,13 @@
dependencies:
undici-types "~5.26.4"
+"@types/nodemailer@^6.4.14":
+ version "6.4.14"
+ resolved "https://registry.yarnpkg.com/@types/nodemailer/-/nodemailer-6.4.14.tgz#5c81a5e856db7f8ede80013e6dbad7c5fb2283e2"
+ integrity sha512-fUWthHO9k9DSdPCSPRqcu6TWhYyxTBg382vlNIttSe9M7XfsT06y0f24KHXtbnijPGGRIcVvdKHTNikOI6qiHA==
+ dependencies:
+ "@types/node" "*"
+
"@types/qs@*":
version "6.9.10"
resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz"
@@ -519,6 +533,11 @@ expand-template@^2.0.3:
resolved "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz"
integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==
+express-sslify@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/express-sslify/-/express-sslify-1.2.0.tgz#30e84bceed1557eb187672bbe1430a0a2a100d9c"
+ integrity sha512-OOf2B3MxAVjEXPPWl4Z19wA2oMH+RCULJVhejPwuhiDDClr9QczZz5ycABLSnnN+oY8JcLs32ghs9cxOj0vi+w==
+
express@^4.18.2:
version "4.18.2"
resolved "https://registry.npmjs.org/express/-/express-4.18.2.tgz"
@@ -921,6 +940,11 @@ node-addon-api@^6.1.0:
resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz"
integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==
+nodemailer@^6.9.7:
+ version "6.9.7"
+ resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.9.7.tgz#ec2f488f62ba1558e7b19239b62778df4a5c4397"
+ integrity sha512-rUtR77ksqex/eZRLmQ21LKVH5nAAsVicAtAYudK7JgwenEDZ0UIQ1adUGqErz7sMkWYxWTTU1aeP2Jga6WQyJw==
+
nodemon@^3.0.1:
version "3.0.1"
resolved "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz"