{"id":83259,"date":"2024-11-10T15:28:45","date_gmt":"2024-11-10T11:58:45","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/from-zero-to-storefront-my-journey-building-a-property-rental-platform-cm9\/"},"modified":"2024-11-10T15:28:45","modified_gmt":"2024-11-10T11:58:45","slug":"from-zero-to-storefront-my-journey-building-a-property-rental-platform-cm9","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/from-zero-to-storefront-my-journey-building-a-property-rental-platform-cm9\/","title":{"rendered":"\u0627\u0632 \u0635\u0641\u0631 \u062a\u0627 \u0648\u06cc\u062a\u0631\u06cc\u0646: \u0633\u0641\u0631 \u0645\u0646 \u062f\u0631 \u062d\u0627\u0644 \u0633\u0627\u062e\u062a \u067e\u0644\u062a \u0641\u0631\u0645 \u0627\u062c\u0627\u0631\u0647 \u0645\u0644\u06a9"},"content":{"rendered":"<p>Summarize this content to 400 words in Persian Lang <\/p>\n<p>  \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u0645\u0642\u062f\u0645\u0647<br \/>\n\u067e\u0634\u062a\u0647 \u0641\u0646\u0627\u0648\u0631\u06cc<br \/>\n\u0628\u0631\u0631\u0633\u06cc \u0627\u062c\u0645\u0627\u0644\u06cc \u0633\u0631\u06cc\u0639<br \/>\nAPI<br \/>\nFrontend<br \/>\n\u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0645\u0648\u0628\u0627\u06cc\u0644<br \/>\n\u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a<br \/>\n\u0646\u0642\u0627\u0637 \u0645\u0648\u0631\u062f \u0639\u0644\u0627\u0642\u0647<br \/>\n\u0645\u0646\u0627\u0628\u0639<\/p>\n<p>\u06a9\u062f \u0645\u0646\u0628\u0639: https:\/\/github.com\/aelassas\/movinin<\/p>\n<p>\u0646\u0633\u062e\u0647 \u06cc \u0646\u0645\u0627\u06cc\u0634\u06cc: https:\/\/movin.dynv6.net:3004<\/p>\n<p>  \u0645\u0642\u062f\u0645\u0647<\/p>\n<p>\u0627\u06cc\u0646 \u0627\u06cc\u062f\u0647 \u0627\u0632 \u062a\u0645\u0627\u06cc\u0644 \u0628\u0647 \u0633\u0627\u062e\u062a \u0648 \u0633\u0627\u0632 \u0628\u062f\u0648\u0646 \u0645\u0631\u0632 &#8211; \u06cc\u06a9 \u067e\u0644\u062a \u0641\u0631\u0645 \u0627\u062c\u0627\u0631\u0647 \u0645\u0644\u06a9 \u06a9\u0627\u0645\u0644\u0627\u064b \u0642\u0627\u0628\u0644 \u062a\u0646\u0638\u06cc\u0645 \u0648 \u0639\u0645\u0644\u06cc\u0627\u062a\u06cc \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u0647\u0645\u0647 \u062c\u0646\u0628\u0647 \u0647\u0627 \u062f\u0631 \u06a9\u0646\u062a\u0631\u0644 \u0634\u0645\u0627 \u0627\u0633\u062a \u067e\u062f\u06cc\u062f \u0622\u0645\u062f:<\/p>\n<p>\u0645\u0627\u0644\u06a9 UI\/UX \u0628\u0627\u0634\u06cc\u062f: \u0637\u0631\u0627\u062d\u06cc \u062a\u062c\u0631\u0628\u06cc\u0627\u062a \u0645\u0646\u062d\u0635\u0631 \u0628\u0647 \u0641\u0631\u062f \u0645\u0634\u062a\u0631\u06cc \u0628\u062f\u0648\u0646 \u0645\u0628\u0627\u0631\u0632\u0647 \u0628\u0627 \u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u0647\u0627\u06cc \u0642\u0627\u0644\u0628<\/p>\n<p>Backend \u0631\u0627 \u06a9\u0646\u062a\u0631\u0644 \u06a9\u0646\u06cc\u062f: \u0645\u0646\u0637\u0642 \u062a\u062c\u0627\u0631\u06cc \u0648 \u0633\u0627\u062e\u062a\u0627\u0631\u0647\u0627\u06cc \u062f\u0627\u062f\u0647 \u0633\u0641\u0627\u0631\u0634\u06cc \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u06a9\u0627\u0645\u0644\u0627\u064b \u0628\u0627 \u0627\u0644\u0632\u0627\u0645\u0627\u062a \u0645\u0637\u0627\u0628\u0642\u062a \u062f\u0627\u0631\u062f<\/p>\n<p>Master DevOps: \u0627\u0633\u062a\u0642\u0631\u0627\u0631\u060c \u0645\u0642\u06cc\u0627\u0633 \u0648 \u0646\u0638\u0627\u0631\u062a \u0628\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u0628\u0627 \u0627\u0628\u0632\u0627\u0631\u0647\u0627 \u0648 \u06af\u0631\u062f\u0634 \u06a9\u0627\u0631 \u062a\u0631\u062c\u06cc\u062d\u06cc<\/p>\n<p>\u0622\u0632\u0627\u062f\u0627\u0646\u0647 \u06af\u0633\u062a\u0631\u0634 \u062f\u0647\u06cc\u062f: \u0628\u062f\u0648\u0646 \u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u0647\u0627\u06cc \u067e\u0644\u062a \u0641\u0631\u0645 \u06cc\u0627 \u0647\u0632\u06cc\u0646\u0647 \u0647\u0627\u06cc \u0627\u0636\u0627\u0641\u06cc\u060c \u0648\u06cc\u0698\u06af\u06cc \u0647\u0627 \u0648 \u0627\u062f\u063a\u0627\u0645 \u0647\u0627\u06cc \u062c\u062f\u06cc\u062f \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f<\/p>\n<p>  \u067e\u0634\u062a\u0647 \u0641\u0646\u0627\u0648\u0631\u06cc<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u067e\u0634\u062a\u0647 \u0641\u0646\u0627\u0648\u0631\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0627\u06cc\u0646 \u0627\u0645\u06a9\u0627\u0646 \u0631\u0627 \u0641\u0631\u0627\u0647\u0645 \u06a9\u0631\u062f\u0647 \u0627\u0633\u062a:<\/p>\n<p>TypeScript<br \/>\nNode.js<br \/>\nMongoDB<br \/>\n\u0648\u0627\u06a9\u0646\u0634 \u0646\u0634\u0627\u0646 \u062f\u0647\u06cc\u062f<br \/>\nMUI<br \/>\n\u0646\u0645\u0627\u06cc\u0634\u06af\u0627\u0647<br \/>\n\u0631\u0627\u0647 \u0631\u0627\u0647<br \/>\n\u062f\u0627\u06a9\u0631<\/p>\n<p>\u06cc\u06a9 \u062a\u0635\u0645\u06cc\u0645 \u06a9\u0644\u06cc\u062f\u06cc \u0637\u0631\u0627\u062d\u06cc \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 TypeScript \u0628\u0647 \u062f\u0644\u06cc\u0644 \u0645\u0632\u0627\u06cc\u0627\u06cc \u0645\u062a\u0639\u062f\u062f \u0622\u0646 \u06af\u0631\u0641\u062a\u0647 \u0634\u062f. TypeScript \u062a\u0627\u06cc\u067e\u060c \u0627\u0628\u0632\u0627\u0631 \u0648 \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u0633\u0627\u0632\u06cc \u0642\u0648\u06cc \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f \u06a9\u0647 \u0645\u0646\u062c\u0631 \u0628\u0647 \u06a9\u062f\u0647\u0627\u06cc \u0628\u0627 \u06a9\u06cc\u0641\u06cc\u062a \u0628\u0627\u0644\u0627\u060c \u0645\u0642\u06cc\u0627\u0633 \u067e\u0630\u06cc\u0631\u060c \u062e\u0648\u0627\u0646\u0627\u062a\u0631 \u0648 \u0642\u0627\u0628\u0644 \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u0645\u06cc \u0634\u0648\u062f \u06a9\u0647 \u0628\u0647 \u0631\u0627\u062d\u062a\u06cc \u0627\u0634\u06a9\u0627\u0644 \u0632\u062f\u0627\u06cc\u06cc \u0648 \u0622\u0632\u0645\u0627\u06cc\u0634 \u0645\u06cc \u0634\u0648\u062f.<\/p>\n<p>\u0645\u0646 React \u0631\u0627 \u0628\u0631\u0627\u06cc \u0642\u0627\u0628\u0644\u06cc\u062a\u200c\u0647\u0627\u06cc \u0631\u0646\u062f\u0631 \u0642\u062f\u0631\u062a\u0645\u0646\u062f\u060c MongoDB \u0628\u0631\u0627\u06cc \u0645\u062f\u0644\u200c\u0633\u0627\u0632\u06cc \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc \u0627\u0646\u0639\u0637\u0627\u0641\u200c\u067e\u0630\u06cc\u0631 \u0648 Stripe \u0631\u0627 \u0628\u0631\u0627\u06cc \u067e\u0631\u062f\u0627\u0632\u0634 \u067e\u0631\u062f\u0627\u062e\u062a \u0627\u0645\u0646 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0631\u062f\u0645.<\/p>\n<p>\u0628\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u0627\u06cc\u0646 \u067e\u0634\u062a\u0647\u060c \u0634\u0645\u0627 \u0641\u0642\u0637 \u06cc\u06a9 \u0648\u0628\u200c\u0633\u0627\u06cc\u062a \u0648 \u0628\u0631\u0646\u0627\u0645\u0647 \u062a\u0644\u0641\u0646 \u0647\u0645\u0631\u0627\u0647 \u0646\u0645\u06cc\u200c\u0633\u0627\u0632\u06cc\u062f\u060c \u0628\u0644\u06a9\u0647 \u0631\u0648\u06cc \u0628\u0646\u06cc\u0627\u062f\u06cc \u0633\u0631\u0645\u0627\u06cc\u0647\u200c\u06af\u0630\u0627\u0631\u06cc \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u0628\u0627 \u0646\u06cc\u0627\u0632\u0647\u0627\u06cc \u0634\u0645\u0627 \u062a\u06a9\u0627\u0645\u0644 \u06cc\u0627\u0628\u062f\u060c \u0628\u0627 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0627\u0632 \u0641\u0646\u0627\u0648\u0631\u06cc\u200c\u0647\u0627\u06cc \u0645\u0646\u0628\u0639 \u0628\u0627\u0632 \u0642\u0648\u06cc \u0648 \u062c\u0627\u0645\u0639\u0647 \u062a\u0648\u0633\u0639\u0647\u200c\u062f\u0647\u0646\u062f\u06af\u0627\u0646 \u062f\u0631 \u062d\u0627\u0644 \u0631\u0634\u062f.<\/p>\n<p>  \u0628\u0631\u0631\u0633\u06cc \u0627\u062c\u0645\u0627\u0644\u06cc \u0633\u0631\u06cc\u0639<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0628\u062e\u0634\u060c \u0635\u0641\u062d\u0627\u062a \u0627\u0635\u0644\u06cc frontend\u060c \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a \u0648 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0645\u0648\u0628\u0627\u06cc\u0644 \u0631\u0627 \u0645\u0634\u0627\u0647\u062f\u0647 \u062e\u0648\u0627\u0647\u06cc\u062f \u06a9\u0631\u062f.<\/p>\n<p>  Frontend<\/p>\n<p>\u0627\u0632 \u0642\u0633\u0645\u062a \u062c\u0644\u0648\u060c \u0645\u0634\u062a\u0631\u06cc \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0627\u0645\u0644\u0627\u06a9 \u0645\u0648\u062c\u0648\u062f \u0631\u0627 \u062c\u0633\u062a\u062c\u0648 \u06a9\u0646\u062f\u060c \u0645\u0644\u06a9\u06cc \u0631\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0646\u062f \u0648 \u067e\u0631\u062f\u0627\u062e\u062a \u06a9\u0646\u062f.<\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u0635\u0644\u06cc \u0635\u0641\u062d\u0647 \u0627\u0635\u0644\u06cc \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u0645\u0634\u062a\u0631\u06cc \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0645\u06a9\u0627\u0646 \u0648 \u0632\u0645\u0627\u0646 \u0631\u0627 \u0645\u0634\u062e\u0635 \u06a9\u0646\u062f \u0648 \u0627\u0645\u0644\u0627\u06a9 \u0645\u0648\u062c\u0648\u062f \u0631\u0627 \u062c\u0633\u062a\u062c\u0648 \u06a9\u0646\u062f.<\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0646\u062a\u06cc\u062c\u0647 \u062c\u0633\u062a\u062c\u0648\u06cc \u0635\u0641\u062d\u0647 \u0627\u0635\u0644\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u0634\u062a\u0631\u06cc \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0645\u0644\u06a9\u06cc \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u062c\u0627\u0631\u0647 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0646\u062f.<\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u0634\u062a\u0631\u06cc \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u062c\u0632\u0626\u06cc\u0627\u062a \u0645\u0644\u06a9 \u0631\u0627 \u0645\u0634\u0627\u0647\u062f\u0647 \u06a9\u0646\u062f:<\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0646\u0645\u0627\u06cc\u06cc \u0627\u0632 \u062a\u0635\u0627\u0648\u06cc\u0631 \u0645\u0644\u06a9 \u0631\u0627 \u0645\u0634\u0627\u0647\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u062f:<\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u067e\u0631\u062f\u0627\u062e\u062a \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u0645\u0634\u062a\u0631\u06cc \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u06af\u0632\u06cc\u0646\u0647 \u0647\u0627\u06cc \u0627\u062c\u0627\u0631\u0647 \u0648 \u067e\u0631\u062f\u0627\u062e\u062a \u0631\u0627 \u062a\u0639\u06cc\u06cc\u0646 \u06a9\u0646\u062f. \u062f\u0631 \u0635\u0648\u0631\u062a\u06cc \u06a9\u0647 \u0645\u0634\u062a\u0631\u06cc \u062b\u0628\u062a \u0646\u0627\u0645 \u0646\u06a9\u0631\u062f\u0647 \u0628\u0627\u0634\u062f\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0647\u0645\u0632\u0645\u0627\u0646 \u062a\u0633\u0648\u06cc\u0647 \u062d\u0633\u0627\u0628 \u0648 \u062b\u0628\u062a \u0646\u0627\u0645 \u06a9\u0646\u062f. \u0627\u06af\u0631 \u0647\u0646\u0648\u0632 \u062b\u0628\u062a \u0646\u0627\u0645 \u0646\u06a9\u0631\u062f\u0647 \u0628\u0627\u0634\u062f\u060c \u06cc\u06a9 \u0627\u06cc\u0645\u06cc\u0644 \u062a\u0627\u06cc\u06cc\u062f \u0648 \u0641\u0639\u0627\u0644 \u0633\u0627\u0632\u06cc \u0628\u0631\u0627\u06cc \u062a\u0639\u06cc\u06cc\u0646 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0627\u0633\u062a. \u062f\u0631 \u0632\u0645\u0627\u0646 \u062a\u0648\u0644\u06cc\u062f\u060c \u06a9\u0648\u06a9\u06cc\u200c\u0647\u0627\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a httpOnly\u060c \u0627\u0645\u0636\u0627 \u0634\u062f\u0647\u060c \u0627\u0645\u0646 \u0648 \u0633\u062e\u062a\u200c\u06af\u06cc\u0631 \u062f\u0631 \u0647\u0645\u0627\u0646 \u0633\u0627\u06cc\u062a \u0647\u0633\u062a\u0646\u062f. \u0627\u06cc\u0646 \u06af\u0632\u06cc\u0646\u0647 \u0647\u0627 \u0627\u0632 \u062d\u0645\u0644\u0627\u062a XSS\u060c CSRF \u0648 MITM \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0645\u06cc \u06a9\u0646\u0646\u062f. \u06a9\u0648\u06a9\u06cc\u200c\u0647\u0627\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u0632 \u0637\u0631\u06cc\u0642 \u06cc\u06a9 \u0645\u06cc\u0627\u0646\u200c\u0627\u0641\u0632\u0627\u0631 \u0633\u0641\u0627\u0631\u0634\u06cc \u0646\u06cc\u0632 \u062f\u0631 \u0628\u0631\u0627\u0628\u0631 \u062d\u0645\u0644\u0627\u062a XST \u0645\u062d\u0627\u0641\u0638\u062a \u0645\u06cc\u200c\u0634\u0648\u0646\u062f.<\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u062b\u0628\u062a \u0646\u0627\u0645 \u0627\u0633\u062a.<\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u0634\u062a\u0631\u06cc \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0631\u0632\u0631\u0648\u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0628\u0628\u06cc\u0646\u062f \u0648 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u062f.<\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647\u200c\u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u0634\u062a\u0631\u06cc \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u0631\u0632\u0631\u0648 \u0631\u0627 \u0628\u0627 \u062c\u0632\u0626\u06cc\u0627\u062a \u0645\u0634\u0627\u0647\u062f\u0647 \u06a9\u0646\u062f.<\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u0634\u062a\u0631\u06cc \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0627\u0639\u0644\u0627\u0646 \u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0628\u0628\u06cc\u0646\u062f.<\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u0634\u062a\u0631\u06cc \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u062e\u0648\u062f \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u062f.<\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u06cc \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f \u06a9\u0647 \u0645\u0634\u062a\u0631\u06cc \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u062e\u0648\u062f \u0631\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u062f.<\/p>\n<p>\u0647\u0645\u06cc\u0646 \u0627\u0633\u062a. \u0627\u06cc\u0646 \u0635\u0641\u062d\u0627\u062a \u0627\u0635\u0644\u06cc \u0635\u0641\u062d\u0647 \u0627\u0635\u0644\u06cc \u0627\u0633\u062a.<\/p>\n<p>  \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a<\/p>\n<p>\u0633\u0647 \u0646\u0648\u0639 \u06a9\u0627\u0631\u0628\u0631:<\/p>\n<p>\u0627\u062f\u0645\u06cc\u0646 \u0647\u0627: \u0622\u0646\u0647\u0627 \u0628\u0647 \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a \u062f\u0633\u062a\u0631\u0633\u06cc \u06a9\u0627\u0645\u0644 \u062f\u0627\u0631\u0646\u062f. \u0622\u0646\u0647\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u0646\u062f \u0647\u0645\u0647 \u0686\u06cc\u0632 \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u0646\u062f.<br \/>\n\u0622\u0698\u0627\u0646\u0633 \u0647\u0627: \u062f\u0633\u062a\u0631\u0633\u06cc \u0645\u062d\u062f\u0648\u062f\u06cc \u0628\u0647 \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a \u062f\u0627\u0631\u0646\u062f. \u0622\u0646\u0647\u0627 \u0641\u0642\u0637 \u0645\u06cc \u062a\u0648\u0627\u0646\u0646\u062f \u0627\u0645\u0644\u0627\u06a9\u060c \u0631\u0632\u0631\u0648\u0647\u0627 \u0648 \u0645\u0634\u062a\u0631\u06cc\u0627\u0646 \u062e\u0648\u062f \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u0646\u062f.<br \/>\n\u0645\u0634\u062a\u0631\u06cc\u0627\u0646: \u0622\u0646\u0647\u0627 \u0641\u0642\u0637 \u0628\u0647 \u0642\u0633\u0645\u062a \u0638\u0627\u0647\u0631\u06cc \u0648 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0645\u0648\u0628\u0627\u06cc\u0644 \u062f\u0633\u062a\u0631\u0633\u06cc \u062f\u0627\u0631\u0646\u062f. \u0622\u0646\u0647\u0627 \u0646\u0645\u06cc \u062a\u0648\u0627\u0646\u0646\u062f \u0628\u0647 \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a \u062f\u0633\u062a\u0631\u0633\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0646\u062f.<\/p>\n<p>\u0627\u06cc\u0646 \u067e\u0644\u062a\u0641\u0631\u0645 \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631 \u0628\u0627 \u0686\u0646\u062f\u06cc\u0646 \u0622\u0698\u0627\u0646\u0633 \u0637\u0631\u0627\u062d\u06cc \u0634\u062f\u0647 \u0627\u0633\u062a. \u0647\u0631 \u0622\u0698\u0627\u0646\u0633 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u062f\u0627\u0631\u0627\u06cc\u06cc \u0647\u0627\u060c \u0645\u0634\u062a\u0631\u06cc\u0627\u0646 \u0648 \u0631\u0632\u0631\u0648\u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0627\u0632 \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u062f. \u0627\u06cc\u0646 \u067e\u0644\u062a\u0641\u0631\u0645 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u062a\u0646\u0647\u0627 \u0628\u0627 \u06cc\u06a9 \u0622\u0698\u0627\u0646\u0633 \u0646\u06cc\u0632 \u06a9\u0627\u0631 \u06a9\u0646\u062f.<\/p>\n<p>\u0627\u0632 \u0628\u0627\u0637\u0646\u060c \u0627\u062f\u0645\u06cc\u0646 \u0647\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u0646\u062f \u0622\u0698\u0627\u0646\u0633 \u0647\u0627\u060c \u0627\u0645\u0644\u0627\u06a9\u060c \u0645\u06a9\u0627\u0646 \u0647\u0627\u060c \u0645\u0634\u062a\u0631\u06cc\u0627\u0646 \u0648 \u0631\u0632\u0631\u0648\u0647\u0627 \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u0648 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u0646\u062f.<\/p>\n<p>\u0648\u0642\u062a\u06cc \u0622\u0698\u0627\u0646\u0633\u200c\u0647\u0627\u06cc \u062c\u062f\u06cc\u062f \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc\u200c\u0634\u0648\u0646\u062f\u060c \u0627\u06cc\u0645\u06cc\u0644\u06cc \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f \u06a9\u0647 \u0627\u0632 \u0622\u0646\u0647\u0627 \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u062f \u062d\u0633\u0627\u0628 \u062e\u0648\u062f \u0631\u0627 \u0628\u0631\u0627\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0647 \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u0646\u062f \u062a\u0627 \u0628\u062a\u0648\u0627\u0646\u0646\u062f \u062f\u0627\u0631\u0627\u06cc\u06cc\u200c\u0647\u0627\u060c \u0645\u0634\u062a\u0631\u06cc\u0627\u0646 \u0648 \u0631\u0632\u0631\u0648\u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u0646\u062f.<\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a \u0627\u0633\u062a.<\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u0645\u062f\u06cc\u0631\u0627\u0646 \u0648 \u0622\u0698\u0627\u0646\u0633\u200c\u0647\u0627 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u0646\u062f \u0631\u0632\u0631\u0648\u0647\u0627 \u0631\u0627 \u0628\u0628\u06cc\u0646\u0646\u062f \u0648 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u0646\u062f.<\/p>\n<p>\u0627\u06af\u0631 \u0648\u0636\u0639\u06cc\u062a \u0631\u0632\u0631\u0648 \u062a\u063a\u06cc\u06cc\u0631 \u06a9\u0646\u062f\u060c \u0645\u0634\u062a\u0631\u06cc \u0645\u0631\u062a\u0628\u0637 \u06cc\u06a9 \u0627\u0639\u0644\u0627\u0646 \u0648 \u06cc\u06a9 \u0627\u06cc\u0645\u06cc\u0644 \u062f\u0631\u06cc\u0627\u0641\u062a \u062e\u0648\u0627\u0647\u062f \u06a9\u0631\u062f.<\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u0648\u06cc\u0698\u06af\u06cc \u0647\u0627 \u0646\u0645\u0627\u06cc\u0634 \u062f\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u0646\u062f \u0648 \u0645\u06cc \u062a\u0648\u0627\u0646 \u0622\u0646\u0647\u0627 \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0631\u062f.<\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u0627\u062f\u0645\u06cc\u0646 \u0647\u0627 \u0648 \u0622\u0698\u0627\u0646\u0633 \u0647\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u0646\u062f \u0628\u0627 \u0627\u0631\u0627\u0626\u0647 \u062a\u0635\u0627\u0648\u06cc\u0631 \u0648 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062f\u0627\u0631\u0627\u06cc\u06cc\u060c \u0648\u06cc\u0698\u06af\u06cc \u0647\u0627\u06cc \u062c\u062f\u06cc\u062f \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u0646\u062f. \u0628\u0631\u0627\u06cc \u0644\u063a\u0648 \u0631\u0627\u06cc\u06af\u0627\u0646\u060c \u0622\u0646 \u0631\u0627 \u0631\u0648\u06cc 0 \u0642\u0631\u0627\u0631 \u062f\u0647\u06cc\u062f. \u062f\u0631 \u063a\u06cc\u0631 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a\u060c \u0642\u06cc\u0645\u062a \u06af\u0632\u06cc\u0646\u0647 \u0631\u0627 \u062a\u0639\u06cc\u06cc\u0646 \u06a9\u0646\u06cc\u062f \u06cc\u0627 \u0627\u06af\u0631 \u0646\u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u0622\u0646 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f\u060c \u0622\u0646 \u0631\u0627 \u062e\u0627\u0644\u06cc \u0628\u06af\u0630\u0627\u0631\u06cc\u062f.<\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647\u200c\u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u062f\u06cc\u0631\u0627\u0646 \u0648 \u0622\u0698\u0627\u0646\u0633\u200c\u0647\u0627 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u0646\u062f \u0648\u06cc\u0698\u06af\u06cc\u200c\u0647\u0627 \u0631\u0627 \u0648\u06cc\u0631\u0627\u06cc\u0634 \u06a9\u0646\u0646\u062f.<\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0627\u062f\u0645\u06cc\u0646 \u0647\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u0646\u062f \u0645\u0634\u062a\u0631\u06cc\u0627\u0646 \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u0646\u062f.<\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0627\u06af\u0631 \u0622\u0698\u0627\u0646\u0633 \u0628\u062e\u0648\u0627\u0647\u062f \u0627\u0632 \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a \u0631\u0632\u0631\u0648 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u062f\u060c \u0645\u06cc \u062a\u0648\u0627\u0646 \u0631\u0632\u0631\u0648 \u06a9\u0631\u062f. \u062f\u0631 \u063a\u06cc\u0631 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a\u060c \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u0641\u0631\u0622\u06cc\u0646\u062f \u062a\u0633\u0648\u06cc\u0647 \u062d\u0633\u0627\u0628 \u0627\u0632 \u0642\u0633\u0645\u062a \u0638\u0627\u0647\u0631\u06cc \u06cc\u0627 \u0628\u0631\u0646\u0627\u0645\u0647 \u062a\u0644\u0641\u0646 \u0647\u0645\u0631\u0627\u0647 \u062a\u06a9\u0645\u06cc\u0644 \u0634\u062f\u060c \u0631\u0632\u0631\u0648\u0647\u0627 \u0628\u0647 \u0637\u0648\u0631 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u0634\u0648\u0646\u062f.<\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u06cc \u0628\u0631\u0627\u06cc \u0648\u06cc\u0631\u0627\u06cc\u0634 \u0631\u0632\u0631\u0648 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f.<\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u0622\u0698\u0627\u0646\u0633 \u0647\u0627 \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u06cc \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u0622\u0698\u0627\u0646\u0633 \u0647\u0627\u06cc \u062c\u062f\u06cc\u062f \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f.<\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u0622\u0698\u0627\u0646\u0633 \u0647\u0627 \u0631\u0627 \u0648\u06cc\u0631\u0627\u06cc\u0634 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646 \u0627\u0645\u0644\u0627\u06a9 \u0622\u0698\u0627\u0646\u0633 \u0647\u0627 \u0631\u0627 \u0645\u0634\u0627\u0647\u062f\u0647 \u06a9\u0631\u062f.<\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0631\u0632\u0631\u0648\u0647\u0627\u06cc \u0645\u0634\u062a\u0631\u06cc \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f.<\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u06cc \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f \u06a9\u0647 \u0627\u062f\u0645\u06cc\u0646 \u0647\u0627 \u0648 \u0622\u0698\u0627\u0646\u0633 \u0647\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u0646\u062f \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u062e\u0648\u062f \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u0646\u062f.<\/p>\n<p>\u0635\u0641\u062d\u0627\u062a \u062f\u06cc\u06af\u0631\u06cc \u0646\u06cc\u0632 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f \u0627\u0645\u0627 \u0627\u06cc\u0646\u0647\u0627 \u0635\u0641\u062d\u0627\u062a \u0627\u0635\u0644\u06cc \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a \u0647\u0633\u062a\u0646\u062f.<\/p>\n<p>\u0647\u0645\u06cc\u0646 \u0627\u0633\u062a. \u0627\u06cc\u0646 \u0635\u0641\u062d\u0627\u062a \u0627\u0635\u0644\u06cc \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a \u0627\u0633\u062a.<\/p>\n<p>  API<\/p>\n<p>API \u062a\u0645\u0627\u0645 \u0639\u0645\u0644\u06a9\u0631\u062f\u0647\u0627\u06cc \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u0628\u0631\u0627\u06cc \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a\u060c \u0628\u062e\u0634 \u0638\u0627\u0647\u0631\u06cc \u0648 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0645\u0648\u0628\u0627\u06cc\u0644 \u0631\u0627 \u062f\u0631 \u0645\u0639\u0631\u0636 \u062f\u06cc\u062f \u0642\u0631\u0627\u0631 \u0645\u06cc \u062f\u0647\u062f. API \u0627\u0632 \u0627\u0644\u06af\u0648\u06cc \u0637\u0631\u0627\u062d\u06cc MVC \u067e\u06cc\u0631\u0648\u06cc \u0645\u06cc \u06a9\u0646\u062f. JWT \u0628\u0631\u0627\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f. \u0628\u0631\u062e\u06cc \u0627\u0632 \u062a\u0648\u0627\u0628\u0639 \u0645\u0627\u0646\u0646\u062f \u062a\u0648\u0627\u0628\u0639 \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u0645\u062f\u06cc\u0631\u06cc\u062a \u062f\u0627\u0631\u0627\u06cc\u06cc \u0647\u0627\u060c \u0631\u0632\u0631\u0648\u0647\u0627 \u0648 \u0645\u0634\u062a\u0631\u06cc\u0627\u0646 \u0646\u06cc\u0627\u0632 \u0628\u0647 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u062f\u0627\u0631\u0646\u062f \u0648 \u0628\u0631\u062e\u06cc \u062f\u06cc\u06af\u0631 \u0645\u0627\u0646\u0646\u062f \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0645\u06a9\u0627\u0646 \u0647\u0627 \u0648 \u0648\u06cc\u0698\u06af\u06cc \u0647\u0627\u06cc \u0645\u0648\u062c\u0648\u062f \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u063a\u06cc\u0631 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0646\u06cc\u0627\u0632\u06cc \u0628\u0647 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0646\u062f\u0627\u0631\u0646\u062f:<\/p>\n<p>\u067e\u0648\u0634\u0647 .\/api\/src\/models\/ \u062d\u0627\u0648\u06cc \u0645\u062f\u0644 \u0647\u0627\u06cc MongoDB \u0627\u0633\u062a.<br \/>\n\u067e\u0648\u0634\u0647 .\/api\/src\/routes\/ \u062d\u0627\u0648\u06cc \u0645\u0633\u06cc\u0631\u0647\u0627\u06cc \u0633\u0631\u06cc\u0639 \u0627\u0633\u062a.<br \/>\n\u067e\u0648\u0634\u0647 .\/api\/src\/controllers\/ \u062d\u0627\u0648\u06cc \u06a9\u0646\u062a\u0631\u0644\u0631\u0647\u0627\u06cc\u06cc \u0627\u0633\u062a.<br \/>\n\u067e\u0648\u0634\u0647 .\/api\/src\/middlewares\/ \u062d\u0627\u0648\u06cc \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631 \u0627\u0633\u062a.<br \/>\n.\/api\/src\/config\/env.config.ts \u0634\u0627\u0645\u0644 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0648 \u062a\u0639\u0627\u0631\u06cc\u0641 \u0646\u0648\u0639 TypeScript \u0627\u0633\u062a.<br \/>\n\u067e\u0648\u0634\u0647 .\/api\/src\/lang\/ \u062d\u0627\u0648\u06cc \u0645\u062d\u0644\u06cc \u0633\u0627\u0632\u06cc \u0627\u0633\u062a.<br \/>\n.\/api\/src\/app.ts \u0633\u0631\u0648\u0631 \u0627\u0635\u0644\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u0633\u06cc\u0631\u0647\u0627 \u062f\u0631 \u0622\u0646 \u0628\u0627\u0631\u06af\u06cc\u0631\u06cc \u0645\u06cc \u0634\u0648\u0646\u062f.<br \/>\n.\/api\/index.ts \u0646\u0642\u0637\u0647 \u0648\u0631\u0648\u062f \u0627\u0635\u0644\u06cc API \u0627\u0633\u062a.<\/p>\n<p>index.ts \u0646\u0642\u0637\u0647 \u0648\u0631\u0648\u062f \u0627\u0635\u0644\u06cc API \u0627\u0633\u062a:<\/p>\n<p>import &#8216;dotenv\/config&#8217;<br \/>\nimport process from &#8216;node:process&#8217;<br \/>\nimport fs from &#8216;node:fs\/promises&#8217;<br \/>\nimport http from &#8216;node:http&#8217;<br \/>\nimport https, { ServerOptions } from &#8216;node:https&#8217;<br \/>\nimport app from &#8216;.\/app&#8217;<br \/>\nimport * as databaseHelper from &#8216;.\/common\/databaseHelper&#8217;<br \/>\nimport * as env from &#8216;.\/config\/env.config&#8217;<br \/>\nimport * as logger from &#8216;.\/common\/logger&#8217;<\/p>\n<p>if (<br \/>\n  await databaseHelper.connect(env.DB_URI, env.DB_SSL, env.DB_DEBUG)<br \/>\n  &amp;&amp; await databaseHelper.initialize()<br \/>\n) {<br \/>\n  let server: http.Server | https.Server<\/p>\n<p>  if (env.HTTPS) {<br \/>\n    https.globalAgent.maxSockets = Number.POSITIVE_INFINITY<br \/>\n    const privateKey = await fs.readFile(env.PRIVATE_KEY, &#8216;utf8&#8217;)<br \/>\n    const certificate = await fs.readFile(env.CERTIFICATE, &#8216;utf8&#8217;)<br \/>\n    const credentials: ServerOptions = { key: privateKey, cert: certificate }<br \/>\n    server = https.createServer(credentials, app)<\/p>\n<p>    server.listen(env.PORT, () =&gt; {<br \/>\n      logger.info(&#8216;HTTPS server is running on Port&#8217;, env.PORT)<br \/>\n    })<br \/>\n  } else {<br \/>\n    server = app.listen(env.PORT, () =&gt; {<br \/>\n      logger.info(&#8216;HTTP server is running on Port&#8217;, env.PORT)<br \/>\n    })<br \/>\n  }<\/p>\n<p>  const close = () =&gt; {<br \/>\n    logger.info(&#8216;Gracefully stopping&#8230;&#8217;)<br \/>\n    server.close(async () =&gt; {<br \/>\n      logger.info(`HTTP${env.HTTPS ? &#8216;S&#8217; : &#8221;} server closed`)<br \/>\n      await databaseHelper.close(true)<br \/>\n      logger.info(&#8216;MongoDB connection closed&#8217;)<br \/>\n      process.exit(0)<br \/>\n    })<br \/>\n  }<\/p>\n<p>  [&#8216;SIGINT&#8217;, &#8216;SIGTERM&#8217;, &#8216;SIGQUIT&#8217;].forEach((signal) =&gt; process.on(signal, close))<br \/>\n}<\/p>\n<p>\u0627\u06cc\u0646 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 TypeScript \u0627\u0633\u062a \u06a9\u0647 \u0633\u0631\u0648\u0631 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Node.js \u0648 Express \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u0645\u06cc \u06a9\u0646\u062f. \u0686\u0646\u062f\u06cc\u0646 \u0645\u0627\u0698\u0648\u0644 \u0627\u0632 \u062c\u0645\u0644\u0647 dotenv\u060c process\u060c fs\u060c http\u060c https\u060c mongoose \u0648 app \u0631\u0627 \u0648\u0627\u0631\u062f \u0645\u06cc \u06a9\u0646\u062f. \u0633\u067e\u0633 \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0622\u06cc\u0627 \u0645\u062a\u063a\u06cc\u0631 \u0645\u062d\u06cc\u0637 HTTPS \u0631\u0648\u06cc true \u062a\u0646\u0638\u06cc\u0645 \u0634\u062f\u0647 \u0627\u0633\u062a \u06cc\u0627 \u062e\u06cc\u0631\u060c \u0648 \u062f\u0631 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a\u060c \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0645\u0627\u0698\u0648\u0644 https \u0648 \u06a9\u0644\u06cc\u062f \u062e\u0635\u0648\u0635\u06cc \u0648 \u06af\u0648\u0627\u0647\u06cc \u0627\u0631\u0627\u0626\u0647 \u0634\u062f\u0647\u060c \u06cc\u06a9 \u0633\u0631\u0648\u0631 HTTPS \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u062f. \u062f\u0631 \u063a\u06cc\u0631 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0645\u0627\u0698\u0648\u0644 http \u06cc\u06a9 \u0633\u0631\u0648\u0631 HTTP \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u062f. \u0633\u0631\u0648\u0631 \u0628\u0647 \u067e\u0648\u0631\u062a \u0645\u0634\u062e\u0635 \u0634\u062f\u0647 \u062f\u0631 \u0645\u062a\u063a\u06cc\u0631 \u0645\u062d\u06cc\u0637\u06cc PORT \u06af\u0648\u0634 \u0645\u06cc \u062f\u0647\u062f.<\/p>\n<p>\u0639\u0645\u0644\u06a9\u0631\u062f \u0628\u0633\u062a\u0647 \u0628\u0647 \u06af\u0648\u0646\u0647 \u0627\u06cc \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 \u0627\u0633\u062a \u06a9\u0647 \u0647\u0646\u06af\u0627\u0645 \u062f\u0631\u06cc\u0627\u0641\u062a \u0633\u06cc\u06af\u0646\u0627\u0644 \u062e\u0627\u062a\u0645\u0647\u060c \u0633\u0631\u0648\u0631 \u0631\u0627 \u0628\u0647 \u0637\u0631\u0632 \u062f\u0644\u067e\u0630\u06cc\u0631\u06cc \u0645\u062a\u0648\u0642\u0641 \u06a9\u0646\u062f. \u0633\u0631\u0648\u0631 \u0648 \u0627\u062a\u0635\u0627\u0644 MongoDB \u0631\u0627 \u0645\u06cc\u200c\u0628\u0646\u062f\u062f \u0648 \u0633\u067e\u0633 \u0628\u0627 \u06a9\u062f \u0648\u0636\u0639\u06cc\u062a 0 \u0627\u0632 \u0641\u0631\u0622\u06cc\u0646\u062f \u062e\u0627\u0631\u062c \u0645\u06cc\u200c\u0634\u0648\u062f. \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a\u060c \u062a\u0627\u0628\u0639 \u0628\u0633\u062a\u0646 \u0631\u0627 \u062b\u0628\u062a \u0645\u06cc\u200c\u06a9\u0646\u062f \u062a\u0627 \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u0641\u0631\u0622\u06cc\u0646\u062f \u0633\u06cc\u06af\u0646\u0627\u0644 SIGINT\u060c SIGTERM \u06cc\u0627 SIGQUIT \u0631\u0627 \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc\u200c\u06a9\u0646\u062f\u060c \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u0634\u0648\u062f.<\/p>\n<p>app.ts \u0646\u0642\u0637\u0647 \u0648\u0631\u0648\u062f \u0627\u0635\u0644\u06cc api \u0627\u0633\u062a:<\/p>\n<p>import express from &#8216;express&#8217;<br \/>\nimport compression from &#8216;compression&#8217;<br \/>\nimport helmet from &#8216;helmet&#8217;<br \/>\nimport nocache from &#8216;nocache&#8217;<br \/>\nimport cookieParser from &#8216;cookie-parser&#8217;<br \/>\nimport i18n from &#8216;.\/lang\/i18n&#8217;<br \/>\nimport * as env from &#8216;.\/config\/env.config&#8217;<br \/>\nimport cors from &#8216;.\/middlewares\/cors&#8217;<br \/>\nimport allowedMethods from &#8216;.\/middlewares\/allowedMethods&#8217;<br \/>\nimport agencyRoutes from &#8216;.\/routes\/agencyRoutes&#8217;<br \/>\nimport bookingRoutes from &#8216;.\/routes\/bookingRoutes&#8217;<br \/>\nimport locationRoutes from &#8216;.\/routes\/locationRoutes&#8217;<br \/>\nimport notificationRoutes from &#8216;.\/routes\/notificationRoutes&#8217;<br \/>\nimport propertyRoutes from &#8216;.\/routes\/propertyRoutes&#8217;<br \/>\nimport userRoutes from &#8216;.\/routes\/userRoutes&#8217;<br \/>\nimport stripeRoutes from &#8216;.\/routes\/stripeRoutes&#8217;<br \/>\nimport countryRoutes from &#8216;.\/routes\/countryRoutes&#8217;<br \/>\nimport * as helper from &#8216;.\/common\/helper&#8217;<\/p>\n<p>const app = express()<\/p>\n<p>app.use(helmet.contentSecurityPolicy())<br \/>\napp.use(helmet.dnsPrefetchControl())<br \/>\napp.use(helmet.crossOriginEmbedderPolicy())<br \/>\napp.use(helmet.frameguard())<br \/>\napp.use(helmet.hidePoweredBy())<br \/>\napp.use(helmet.hsts())<br \/>\napp.use(helmet.ieNoOpen())<br \/>\napp.use(helmet.noSniff())<br \/>\napp.use(helmet.permittedCrossDomainPolicies())<br \/>\napp.use(helmet.referrerPolicy())<br \/>\napp.use(helmet.xssFilter())<br \/>\napp.use(helmet.originAgentCluster())<br \/>\napp.use(helmet.crossOriginResourcePolicy({ policy: &#8216;cross-origin&#8217; }))<br \/>\napp.use(helmet.crossOriginOpenerPolicy())<\/p>\n<p>app.use(nocache())<br \/>\napp.use(compression({ threshold: 0 }))<br \/>\napp.use(express.urlencoded({ limit: &#8217;50mb&#8217;, extended: true }))<br \/>\napp.use(express.json({ limit: &#8217;50mb&#8217; }))<\/p>\n<p>app.use(cors())<br \/>\napp.options(&#8216;*&#8217;, cors())<br \/>\napp.use(cookieParser(env.COOKIE_SECRET))<br \/>\napp.use(allowedMethods)<\/p>\n<p>app.use(&#8216;\/&#8217;, agencyRoutes)<br \/>\napp.use(&#8216;\/&#8217;, bookingRoutes)<br \/>\napp.use(&#8216;\/&#8217;, locationRoutes)<br \/>\napp.use(&#8216;\/&#8217;, notificationRoutes)<br \/>\napp.use(&#8216;\/&#8217;, propertyRoutes)<br \/>\napp.use(&#8216;\/&#8217;, userRoutes)<br \/>\napp.use(&#8216;\/&#8217;, stripeRoutes)<br \/>\napp.use(&#8216;\/&#8217;, countryRoutes)<\/p>\n<p>i18n.locale = env.DEFAULT_LANGUAGE<\/p>\n<p>helper.mkdir(env.CDN_USERS)<br \/>\nhelper.mkdir(env.CDN_TEMP_USERS)<br \/>\nhelper.mkdir(env.CDN_PROPERTIES)<br \/>\nhelper.mkdir(env.CDN_TEMP_PROPERTIES)<br \/>\nhelper.mkdir(env.CDN_LOCATIONS)<br \/>\nhelper.mkdir(env.CDN_TEMP_LOCATIONS)<\/p>\n<p>export default app<\/p>\n<p>\u0627\u0648\u0644 \u0627\u0632 \u0647\u0645\u0647\u060c \u0631\u0634\u062a\u0647 \u0627\u062a\u0635\u0627\u0644 MongoDB \u0631\u0627 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0645\u06cc \u06a9\u0646\u06cc\u0645\u060c \u0633\u067e\u0633 \u0628\u0627 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 MongoDB \u0627\u0631\u062a\u0628\u0627\u0637 \u0628\u0631\u0642\u0631\u0627\u0631 \u0645\u06cc \u06a9\u0646\u06cc\u0645. \u0633\u067e\u0633 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 Express \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u0648 \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631\u0647\u0627\u06cc\u06cc \u0645\u0627\u0646\u0646\u062f cors\u060c compression\u060c helmet \u0648 nocache \u0631\u0627 \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u0645\u06cc \u06a9\u0646\u06cc\u0645. \u0645\u0627 \u0627\u0642\u062f\u0627\u0645\u0627\u062a \u0627\u0645\u0646\u06cc\u062a\u06cc \u0645\u062e\u062a\u0644\u0641\u06cc \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631 \u06a9\u0644\u0627\u0647 \u0627\u06cc\u0645\u0646\u06cc \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0631\u062f\u06cc\u0645. \u0645\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u0645\u0633\u06cc\u0631\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0628\u062e\u0634\u200c\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0627\u0646\u0646\u062f providerRoutes\u060c bookingRoutes\u060c locationRoutes\u060c notificationRoutes\u060c milkRoutes \u0648 userRoutes \u0648\u0627\u0631\u062f \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645. \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a\u060c \u0645\u0633\u06cc\u0631\u0647\u0627\u06cc \u0627\u06a9\u0633\u067e\u0631\u0633 \u0648 \u0628\u0631\u0646\u0627\u0645\u0647 \u0635\u0627\u062f\u0631\u0627\u062a \u0631\u0627 \u0628\u0627\u0631\u06af\u06cc\u0631\u06cc \u0645\u06cc \u06a9\u0646\u06cc\u0645.<\/p>\n<p>8 \u0645\u0633\u06cc\u0631 \u062f\u0631 API \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f. \u0647\u0631 \u0645\u0633\u06cc\u0631 \u062f\u0627\u0631\u0627\u06cc \u06a9\u0646\u062a\u0631\u0644\u0631 \u0645\u062e\u0635\u0648\u0635 \u0628\u0647 \u062e\u0648\u062f \u0627\u0633\u062a \u06a9\u0647 \u0627\u0632 \u0627\u0644\u06af\u0648\u06cc \u0637\u0631\u0627\u062d\u06cc MVC \u0648 \u0627\u0635\u0648\u0644 SOLID \u067e\u06cc\u0631\u0648\u06cc \u0645\u06cc \u06a9\u0646\u062f. \u062f\u0631 \u0632\u06cc\u0631 \u0645\u0633\u06cc\u0631\u0647\u0627\u06cc \u0627\u0635\u0644\u06cc \u0622\u0645\u062f\u0647 \u0627\u0633\u062a:<\/p>\n<p>userRoutes: \u062a\u0648\u0627\u0628\u0639 REST \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f<br \/>\nAgencyRoutes: \u062a\u0648\u0627\u0628\u0639 REST \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u0622\u0698\u0627\u0646\u0633 \u0647\u0627 \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f<br \/>\ncountryRoutes: \u062a\u0648\u0627\u0628\u0639 REST \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u06a9\u0634\u0648\u0631\u0647\u0627 \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f<br \/>\nlocationRoutes: \u062a\u0648\u0627\u0628\u0639 REST \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u0645\u06a9\u0627\u0646 \u0647\u0627 \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f<br \/>\nPropertyRoutes: \u062a\u0648\u0627\u0628\u0639 REST \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u062e\u0648\u0627\u0635 \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f<br \/>\nbookingRoutes: \u0639\u0645\u0644\u06a9\u0631\u062f\u0647\u0627\u06cc REST \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u0631\u0632\u0631\u0648 \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f<br \/>\nnotificationRoutes: \u062a\u0648\u0627\u0628\u0639 REST \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u0627\u0639\u0644\u0627\u0646 \u0647\u0627 \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f<br \/>\nstripeRoutes: \u062a\u0648\u0627\u0628\u0639 REST \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u062f\u0631\u06af\u0627\u0647 \u067e\u0631\u062f\u0627\u062e\u062a Stripe \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f<\/p>\n<p>\u0642\u0631\u0627\u0631 \u0646\u06cc\u0633\u062a \u0647\u0631 \u0645\u0633\u06cc\u0631 \u0631\u0627 \u06cc\u06a9\u06cc \u06cc\u06a9\u06cc \u062a\u0648\u0636\u06cc\u062d \u062f\u0647\u06cc\u0645. \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644 PropertyRoutes \u0631\u0627 \u0645\u06cc \u06af\u06cc\u0631\u06cc\u0645 \u0648 \u0645\u06cc \u0628\u06cc\u0646\u06cc\u0645 \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u0633\u0627\u062e\u062a\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a. \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u06a9\u062f \u0645\u0646\u0628\u0639 \u0631\u0627 \u0645\u0631\u0648\u0631 \u06a9\u0646\u06cc\u062f \u0648 \u0647\u0645\u0647 \u0645\u0633\u06cc\u0631\u0647\u0627 \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f.<\/p>\n<p>\u0627\u06cc\u0646\u062c\u0627 milkRoutes.ts \u0627\u0633\u062a:<\/p>\n<p>import express from &#8216;express&#8217;<br \/>\nimport multer from &#8216;multer&#8217;<br \/>\nimport routeNames from &#8216;..\/config\/propertyRoutes.config&#8217;<br \/>\nimport authJwt from &#8216;..\/middlewares\/authJwt&#8217;<br \/>\nimport * as propertyController from &#8216;..\/controllers\/propertyController&#8217;<\/p>\n<p>const routes = express.Router()<\/p>\n<p>routes.route(routeNames.create).post(authJwt.verifyToken, propertyController.create)<br \/>\nroutes.route(routeNames.update).put(authJwt.verifyToken, propertyController.update)<br \/>\nroutes.route(routeNames.checkProperty).get(authJwt.verifyToken, propertyController.checkProperty)<br \/>\nroutes.route(routeNames.delete).delete(authJwt.verifyToken, propertyController.deleteProperty)<br \/>\nroutes.route(routeNames.uploadImage).post([authJwt.verifyToken, multer({ storage: multer.memoryStorage() }).single(&#8216;image&#8217;)], propertyController.uploadImage)<br \/>\nroutes.route(routeNames.deleteImage).post(authJwt.verifyToken, propertyController.deleteImage)<br \/>\nroutes.route(routeNames.deleteTempImage).post(authJwt.verifyToken, propertyController.deleteTempImage)<br \/>\nroutes.route(routeNames.getProperty).get(propertyController.getProperty)<br \/>\nroutes.route(routeNames.getProperties).post(authJwt.verifyToken, propertyController.getProperties)<br \/>\nroutes.route(routeNames.getBookingProperties).post(authJwt.verifyToken, propertyController.getBookingProperties)<br \/>\nroutes.route(routeNames.getFrontendProperties).post(propertyController.getFrontendProperties)<\/p>\n<p>export default routes<\/p>\n<p>\u0627\u0648\u0644 \u0627\u0632 \u0647\u0645\u0647\u060c \u0645\u0627 \u06cc\u06a9 \u0631\u0648\u062a\u0631 Express \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u06cc\u0645. \u0633\u067e\u0633 \u0645\u0633\u06cc\u0631\u0647\u0627 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0646\u0627\u0645\u060c \u0645\u062a\u062f\u060c \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631\u0647\u0627 \u0648 \u06a9\u0646\u062a\u0631\u0644\u0631\u0647\u0627\u06cc \u0622\u0646\u0647\u0627 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u06cc\u0645.<\/p>\n<p>routeNames \u062d\u0627\u0648\u06cc \u0648\u06cc\u0698\u06af\u06cc Routes \u0646\u0627\u0645 \u0645\u0633\u06cc\u0631 \u0627\u0633\u062a:<\/p>\n<p>const routes = {<br \/>\n  create: &#8216;\/api\/create-property&#8217;,<br \/>\n  update: &#8216;\/api\/update-property&#8217;,<br \/>\n  delete: &#8216;\/api\/delete-property\/:id&#8217;,<br \/>\n  uploadImage: &#8216;\/api\/upload-property-image&#8217;,<br \/>\n  deleteTempImage: &#8216;\/api\/delete-temp-property-image\/:fileName&#8217;,<br \/>\n  deleteImage: &#8216;\/api\/delete-property-image\/:property\/:image&#8217;,<br \/>\n  getProperty: &#8216;\/api\/property\/:id\/:language&#8217;,<br \/>\n  getProperties: &#8216;\/api\/properties\/:page\/:size&#8217;,<br \/>\n  getBookingProperties: &#8216;\/api\/booking-properties\/:page\/:size&#8217;,<br \/>\n  getFrontendProperties: &#8216;\/api\/frontend-properties\/:page\/:size&#8217;,<br \/>\n  checkProperty: &#8216;\/api\/check-property\/:id&#8217;,<br \/>\n}<\/p>\n<p>export default routes<\/p>\n<p>PropertyController \u062d\u0627\u0648\u06cc \u0645\u0646\u0637\u0642 \u0627\u0635\u0644\u06cc \u06a9\u0633\u0628 \u0648 \u06a9\u0627\u0631 \u062f\u0631 \u0645\u0648\u0631\u062f \u0645\u06a9\u0627\u0646 \u0647\u0627 \u0627\u0633\u062a. \u0645\u0627 \u0642\u0635\u062f \u0646\u062f\u0627\u0631\u06cc\u0645 \u062a\u0645\u0627\u0645 \u06a9\u062f \u0645\u0646\u0628\u0639 \u06a9\u0646\u062a\u0631\u0644\u0631 \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u0645 \u0632\u06cc\u0631\u0627 \u0628\u0633\u06cc\u0627\u0631 \u0628\u0632\u0631\u06af \u0627\u0633\u062a\u060c \u0627\u0645\u0627 \u0628\u0631\u0627\u06cc \u0645\u062b\u0627\u0644 \u062a\u0627\u0628\u0639 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u062a\u0631\u0644\u0631 \u0631\u0627 \u062f\u0631 \u0646\u0638\u0631 \u0645\u06cc \u06af\u06cc\u0631\u06cc\u0645.<\/p>\n<p>\u0645\u062f\u0644 \u0645\u0644\u06a9 \u062f\u0631 \u0632\u06cc\u0631 \u0622\u0645\u062f\u0647 \u0627\u0633\u062a:<\/p>\n<p>import { Schema, model } from &#8216;mongoose&#8217;<br \/>\nimport * as movininTypes from &#8216;:movinin-types&#8217;<br \/>\nimport * as env from &#8216;..\/config\/env.config&#8217;<\/p>\n<p>const propertySchema = new Schema&lt;env.Property&gt;(<br \/>\n  {<br \/>\n    name: {<br \/>\n      type: String,<br \/>\n      required: [true, &#8220;can&#8217;t be blank&#8221;],<br \/>\n    },<br \/>\n    type: {<br \/>\n      type: String,<br \/>\n      enum: [<br \/>\n        movininTypes.PropertyType.House,<br \/>\n        movininTypes.PropertyType.Apartment,<br \/>\n        movininTypes.PropertyType.Townhouse,<br \/>\n        movininTypes.PropertyType.Plot,<br \/>\n        movininTypes.PropertyType.Farm,<br \/>\n        movininTypes.PropertyType.Commercial,<br \/>\n        movininTypes.PropertyType.Industrial,<br \/>\n      ],<br \/>\n      required: [true, &#8220;can&#8217;t be blank&#8221;],<br \/>\n    },<br \/>\n    agency: {<br \/>\n      type: Schema.Types.ObjectId,<br \/>\n      required: [true, &#8220;can&#8217;t be blank&#8221;],<br \/>\n      ref: &#8216;User&#8217;,<br \/>\n      index: true,<br \/>\n    },<br \/>\n    description: {<br \/>\n      type: String,<br \/>\n      required: [true, &#8220;can&#8217;t be blank&#8221;],<br \/>\n    },<br \/>\n    available: {<br \/>\n      type: Boolean,<br \/>\n      default: true,<br \/>\n    },<br \/>\n    image: {<br \/>\n      type: String,<br \/>\n    },<br \/>\n    images: {<br \/>\n      type: [String],<br \/>\n    },<br \/>\n    bedrooms: {<br \/>\n      type: Number,<br \/>\n      required: [true, &#8220;can&#8217;t be blank&#8221;],<br \/>\n      validate: {<br \/>\n        validator: Number.isInteger,<br \/>\n        message: &#8216;{VALUE} is not an integer value&#8217;,<br \/>\n      },<br \/>\n    },<br \/>\n    bathrooms: {<br \/>\n      type: Number,<br \/>\n      required: [true, &#8220;can&#8217;t be blank&#8221;],<br \/>\n      validate: {<br \/>\n        validator: Number.isInteger,<br \/>\n        message: &#8216;{VALUE} is not an integer value&#8217;,<br \/>\n      },<br \/>\n    },<br \/>\n    kitchens: {<br \/>\n      type: Number,<br \/>\n      default: 1,<br \/>\n      validate: {<br \/>\n        validator: Number.isInteger,<br \/>\n        message: &#8216;{VALUE} is not an integer value&#8217;,<br \/>\n      },<br \/>\n    },<br \/>\n    parkingSpaces: {<br \/>\n      type: Number,<br \/>\n      default: 0,<br \/>\n      validate: {<br \/>\n        validator: Number.isInteger,<br \/>\n        message: &#8216;{VALUE} is not an integer value&#8217;,<br \/>\n      },<br \/>\n    },<br \/>\n    size: {<br \/>\n      type: Number,<br \/>\n    },<br \/>\n    petsAllowed: {<br \/>\n      type: Boolean,<br \/>\n      required: [true, &#8220;can&#8217;t be blank&#8221;],<br \/>\n    },<br \/>\n    furnished: {<br \/>\n      type: Boolean,<br \/>\n      required: [true, &#8220;can&#8217;t be blank&#8221;],<br \/>\n    },<br \/>\n    minimumAge: {<br \/>\n      type: Number,<br \/>\n      required: [true, &#8220;can&#8217;t be blank&#8221;],<br \/>\n      min: env.MINIMUM_AGE,<br \/>\n      max: 99,<br \/>\n    },<br \/>\n    location: {<br \/>\n      type: Schema.Types.ObjectId,<br \/>\n      ref: &#8216;Location&#8217;,<br \/>\n      required: [true, &#8220;can&#8217;t be blank&#8221;],<br \/>\n    },<br \/>\n    address: {<br \/>\n      type: String,<br \/>\n    },<br \/>\n    price: {<br \/>\n      type: Number,<br \/>\n      required: [true, &#8220;can&#8217;t be blank&#8221;],<br \/>\n    },<br \/>\n    hidden: {<br \/>\n      type: Boolean,<br \/>\n      default: false,<br \/>\n    },<br \/>\n    cancellation: {<br \/>\n      type: Number,<br \/>\n      default: 0,<br \/>\n    },<br \/>\n    aircon: {<br \/>\n      type: Boolean,<br \/>\n      default: false,<br \/>\n    },<br \/>\n    rentalTerm: {<br \/>\n      type: String,<br \/>\n      enum: [<br \/>\n        movininTypes.RentalTerm.Monthly,<br \/>\n        movininTypes.RentalTerm.Weekly,<br \/>\n        movininTypes.RentalTerm.Daily,<br \/>\n        movininTypes.RentalTerm.Yearly,<br \/>\n      ],<br \/>\n      required: [true, &#8220;can&#8217;t be blank&#8221;],<br \/>\n    },<br \/>\n  },<br \/>\n  {<br \/>\n    timestamps: true,<br \/>\n    strict: true,<br \/>\n    collection: &#8216;Property&#8217;,<br \/>\n  },<br \/>\n)<\/p>\n<p>const Property = model&lt;env.Property&gt;(&#8216;Property&#8217;, propertySchema)<\/p>\n<p>export default Property<\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0646\u0648\u0639 \u0645\u0644\u06a9 \u0622\u0645\u062f\u0647 \u0627\u0633\u062a:<\/p>\n<p>export interface Property extends Document {<br \/>\n  name: string<br \/>\n  type: movininTypes.PropertyType<br \/>\n  agency: Types.ObjectId<br \/>\n  description: string<br \/>\n  image: string<br \/>\n  images?: string[]\n  bedrooms: number<br \/>\n  bathrooms: number<br \/>\n  kitchens?: number<br \/>\n  parkingSpaces?: number,<br \/>\n  size?: number<br \/>\n  petsAllowed: boolean<br \/>\n  furnished: boolean<br \/>\n  minimumAge: number<br \/>\n  location: Types.ObjectId<br \/>\n  address?: string<br \/>\n  price: number<br \/>\n  hidden?: boolean<br \/>\n  cancellation?: number<br \/>\n  aircon?: boolean<br \/>\n  available?: boolean<br \/>\n  rentalTerm: movininTypes.RentalTerm<br \/>\n}<\/p>\n<p>\u06cc\u06a9 \u0645\u0644\u06a9 \u0627\u0632 \u0645\u0648\u0627\u0631\u062f \u0632\u06cc\u0631 \u062a\u0634\u06a9\u06cc\u0644 \u0634\u062f\u0647 \u0627\u0633\u062a:<\/p>\n<p>\u06cc\u06a9 \u0646\u0627\u0645<br \/>\n\u06cc\u06a9 \u0646\u0648\u0639 (\u0622\u067e\u0627\u0631\u062a\u0645\u0627\u0646\u060c \u062a\u062c\u0627\u0631\u06cc\u060c \u0645\u0632\u0631\u0639\u0647\u060c \u062e\u0627\u0646\u0647\u060c \u0635\u0646\u0639\u062a\u06cc\u060c \u0632\u0645\u06cc\u0646\u060c \u062e\u0627\u0646\u0647 \u0634\u0647\u0631\u06cc)<br \/>\n\u0627\u0634\u0627\u0631\u0647 \u0628\u0647 \u0622\u0698\u0627\u0646\u0633\u06cc \u06a9\u0647 \u0622\u0646 \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u0647 \u0627\u0633\u062a<br \/>\n\u06cc\u06a9 \u062a\u0648\u0636\u06cc\u062d<br \/>\n\u06cc\u06a9 \u062a\u0635\u0648\u06cc\u0631 \u0627\u0635\u0644\u06cc<br \/>\n\u062a\u0635\u0627\u0648\u06cc\u0631 \u0627\u0636\u0627\u0641\u06cc<br \/>\n\u062a\u0639\u062f\u0627\u062f \u0627\u062a\u0627\u0642 \u062e\u0648\u0627\u0628<br \/>\n\u062a\u0639\u062f\u0627\u062f \u062d\u0645\u0627\u0645<br \/>\n\u062a\u0639\u062f\u0627\u062f \u0622\u0634\u067e\u0632\u062e\u0627\u0646\u0647<br \/>\n\u062a\u0639\u062f\u0627\u062f \u062c\u0627\u06cc \u067e\u0627\u0631\u06a9<br \/>\n\u06cc\u06a9 \u0627\u0646\u062f\u0627\u0632\u0647<br \/>\n\u062d\u062f\u0627\u0642\u0644 \u0633\u0646 \u0628\u0631\u0627\u06cc \u0627\u062c\u0627\u0631\u0647<br \/>\n\u06cc\u06a9 \u0645\u06a9\u0627\u0646<br \/>\n\u0622\u062f\u0631\u0633 (\u0627\u062e\u062a\u06cc\u0627\u0631\u06cc)<br \/>\n\u06cc\u06a9 \u0642\u06cc\u0645\u062a<br \/>\n\u0645\u062f\u062a \u0627\u062c\u0627\u0631\u0647 (\u0645\u0627\u0647\u0627\u0646\u0647\u060c \u0647\u0641\u062a\u06af\u06cc\u060c \u0631\u0648\u0632\u0627\u0646\u0647\u060c \u0633\u0627\u0644\u0627\u0646\u0647)<br \/>\n\u0642\u06cc\u0645\u062a \u0644\u063a\u0648 (\u0628\u0631\u0627\u06cc \u06af\u0646\u062c\u0627\u0646\u062f\u0646 \u0631\u0627\u06cc\u06af\u0627\u0646 \u0622\u0646 \u0631\u0627 \u0631\u0648\u06cc 0 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f\u060c \u0627\u06af\u0631 \u0646\u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u06cc\u062f \u0622\u0646 \u0631\u0627 \u0644\u062d\u0627\u0638 \u06a9\u0646\u06cc\u062f \u0622\u0646 \u0631\u0627 \u062e\u0627\u0644\u06cc \u0628\u06af\u0630\u0627\u0631\u06cc\u062f\u060c \u06cc\u0627 \u0642\u06cc\u0645\u062a \u0644\u063a\u0648 \u0631\u0627 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f)<br \/>\n\u067e\u0631\u0686\u0645\u06cc \u06a9\u0647 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u062d\u06cc\u0648\u0627\u0646\u0627\u062a \u062e\u0627\u0646\u06af\u06cc \u0645\u062c\u0627\u0632 \u0647\u0633\u062a\u0646\u062f \u06cc\u0627 \u0646\u0647<br \/>\n\u067e\u0631\u0686\u0645\u06cc \u06a9\u0647 \u0646\u0634\u0627\u0646 \u062f\u0647\u0646\u062f\u0647 \u0645\u0628\u0644\u0647 \u0628\u0648\u062f\u0646 \u06cc\u0627 \u0646\u0628\u0648\u062f\u0646 \u0645\u0644\u06a9 \u0627\u0633\u062a<br \/>\n\u067e\u0631\u0686\u0645\u06cc \u06a9\u0647 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u0645\u0644\u06a9 \u0645\u062e\u0641\u06cc \u0627\u0633\u062a \u06cc\u0627 \u062e\u06cc\u0631<br \/>\n\u067e\u0631\u0686\u0645\u06cc \u06a9\u0647 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u062a\u0647\u0648\u06cc\u0647 \u0645\u0637\u0628\u0648\u0639 \u0645\u0648\u062c\u0648\u062f \u0627\u0633\u062a \u06cc\u0627 \u0646\u0647<br \/>\n\u067e\u0631\u0686\u0645\u06cc \u06a9\u0647 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u0645\u0644\u06a9 \u0628\u0631\u0627\u06cc \u0627\u062c\u0627\u0631\u0647 \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0627\u0633\u062a \u06cc\u0627 \u062e\u06cc\u0631<\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u062a\u0627\u0628\u0639 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u062a\u0631\u0644\u0631 \u0627\u0633\u062a:<\/p>\n<p>export const create = async (req: Request, res: Response) =&gt; {<br \/>\n  const { body }: { body: movininTypes.CreatePropertyPayload } = req<\/p>\n<p>  try {<br \/>\n    const {<br \/>\n      name,<br \/>\n      type,<br \/>\n      agency,<br \/>\n      description,<br \/>\n      image: imageFile,<br \/>\n      images,<br \/>\n      bedrooms,<br \/>\n      bathrooms,<br \/>\n      kitchens,<br \/>\n      parkingSpaces,<br \/>\n      size,<br \/>\n      petsAllowed,<br \/>\n      furnished,<br \/>\n      minimumAge,<br \/>\n      location,<br \/>\n      address,<br \/>\n      price,<br \/>\n      hidden,<br \/>\n      cancellation,<br \/>\n      aircon,<br \/>\n      rentalTerm,<br \/>\n    } = body<\/p>\n<p>    const _property = {<br \/>\n      name,<br \/>\n      type,<br \/>\n      agency,<br \/>\n      description,<br \/>\n      bedrooms,<br \/>\n      bathrooms,<br \/>\n      kitchens,<br \/>\n      parkingSpaces,<br \/>\n      size,<br \/>\n      petsAllowed,<br \/>\n      furnished,<br \/>\n      minimumAge,<br \/>\n      location,<br \/>\n      address,<br \/>\n      price,<br \/>\n      hidden,<br \/>\n      cancellation,<br \/>\n      aircon,<br \/>\n      rentalTerm,<br \/>\n    }<\/p>\n<p>    const property = new Property(_property)<br \/>\n    await property.save()<\/p>\n<p>    \/\/ image<br \/>\n    const _image = path.join(env.CDN_TEMP_PROPERTIES, imageFile)<br \/>\n    if (await helper.exists(_image)) {<br \/>\n      const filename = `${property._id}_${Date.now()}${path.extname(imageFile)}`<br \/>\n      const newPath = path.join(env.CDN_PROPERTIES, filename)<\/p>\n<p>      await fs.rename(_image, newPath)<br \/>\n      property.image = filename<br \/>\n    } else {<br \/>\n      await Property.deleteOne({ _id: property._id })<br \/>\n      const err = &#8216;Image file not found&#8217;<br \/>\n      logger.error(i18n.t(&#8216;ERROR&#8217;), err)<br \/>\n      return res.status(400).send(i18n.t(&#8216;ERROR&#8217;) + err)<br \/>\n    }<\/p>\n<p>    \/\/ images<br \/>\n    property.images = []\n    if (images) {<br \/>\n      let i = 1<br \/>\n      for (const img of images) {<br \/>\n        const _img = path.join(env.CDN_TEMP_PROPERTIES, img)<\/p>\n<p>        if (await helper.exists(_img)) {<br \/>\n          const filename = `${property._id}_${uuid()}_${Date.now()}_${i}${path.extname(img)}`<br \/>\n          const newPath = path.join(env.CDN_PROPERTIES, filename)<\/p>\n<p>          await fs.rename(_img, newPath)<br \/>\n          property.images.push(filename)<br \/>\n        } else {<br \/>\n          await Property.deleteOne({ _id: property._id })<br \/>\n          const err = &#8216;Image file not found&#8217;<br \/>\n          logger.error(i18n.t(&#8216;ERROR&#8217;), err)<br \/>\n          return res.status(400).send(i18n.t(&#8216;ERROR&#8217;) + err)<br \/>\n        }<br \/>\n        i += 1<br \/>\n      }<br \/>\n    }<\/p>\n<p>    await property.save()<\/p>\n<p>    return res.json(property)<br \/>\n  } catch (err) {<br \/>\n    logger.error(`[property.create] ${i18n.t(&#8216;DB_ERROR&#8217;)} ${JSON.stringify(body)}`, err)<br \/>\n    return res.status(400).send(i18n.t(&#8216;ERROR&#8217;) + err)<br \/>\n  }<br \/>\n}<\/p>\n<p>  Frontend<\/p>\n<p>Frontend \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0628 \u0627\u0633\u062a \u06a9\u0647 \u0628\u0627 Node.js\u060c React\u060c MUI \u0648 TypeScript \u0633\u0627\u062e\u062a\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a. \u0627\u0632 \u0642\u0633\u0645\u062a \u062c\u0644\u0648\u06cc\u06cc\u060c \u0645\u0634\u062a\u0631\u06cc \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u0628\u0633\u062a\u0647 \u0628\u0647 \u0646\u0642\u0627\u0637 \u062a\u062d\u0648\u06cc\u0644 \u0648 \u062a\u062d\u0648\u06cc\u0644 \u0648 \u0632\u0645\u0627\u0646\u060c \u062e\u0648\u062f\u0631\u0648\u0647\u0627\u06cc \u0645\u0648\u062c\u0648\u062f \u0631\u0627 \u062c\u0633\u062a\u062c\u0648 \u06a9\u0646\u062f\u060c \u062e\u0648\u062f\u0631\u0648\u06cc\u06cc \u0631\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0631\u062f\u0647 \u0648 \u0628\u0647 \u062a\u0633\u0648\u06cc\u0647\u200c\u062d\u0633\u0627\u0628 \u0627\u062f\u0627\u0645\u0647 \u062f\u0647\u062f:<\/p>\n<p>\u067e\u0648\u0634\u0647 .\/frontend\/src\/assets\/ \u062d\u0627\u0648\u06cc CSS \u0648 \u062a\u0635\u0627\u0648\u06cc\u0631 \u0627\u0633\u062a.<br \/>\n\u067e\u0648\u0634\u0647 .\/frontend\/src\/pages\/ \u062d\u0627\u0648\u06cc \u0635\u0641\u062d\u0627\u062a React \u0627\u0633\u062a.<br \/>\n\u067e\u0648\u0634\u0647 .\/frontend\/src\/components\/ \u062d\u0627\u0648\u06cc \u0627\u062c\u0632\u0627\u06cc React \u0627\u0633\u062a.<br \/>\n.\/frontend\/src\/services\/ \u0634\u0627\u0645\u0644 \u062e\u062f\u0645\u0627\u062a \u06a9\u0644\u0627\u06cc\u0646\u062a api \u0627\u0633\u062a.<br \/>\n.\/frontend\/src\/App.tsx \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0635\u0644\u06cc React \u0627\u0633\u062a \u06a9\u0647 \u062d\u0627\u0648\u06cc \u0645\u0633\u06cc\u0631\u0647\u0627 \u0627\u0633\u062a.<br \/>\n.\/frontend\/src\/index.tsx \u0646\u0642\u0637\u0647 \u0648\u0631\u0648\u062f \u0627\u0635\u0644\u06cc frontend \u0627\u0633\u062a.<\/p>\n<p>\u062a\u0639\u0627\u0631\u06cc\u0641 \u0646\u0648\u0639 TypeScript \u062f\u0631 \u0628\u0633\u062a\u0647 .\/packages\/movinin-types \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<p>App.tsx \u0627\u0635\u0644\u06cc \u062a\u0631\u06cc\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0627\u06a9\u0646\u0634 \u0627\u0633\u062a:<\/p>\n<p>import React, { lazy, Suspense } from &#8216;react&#8217;<br \/>\nimport { BrowserRouter as Router, Route, Routes } from &#8216;react-router-dom&#8217;<br \/>\nimport env from &#8216;@\/config\/env.config&#8217;<br \/>\nimport { GlobalProvider } from &#8216;@\/context\/GlobalContext&#8217;<br \/>\nimport { init as initGA } from &#8216;@\/common\/ga4&#8217;<\/p>\n<p>if (env.GOOGLE_ANALYTICS_ENABLED) {<br \/>\n  initGA()<br \/>\n}<\/p>\n<p>const SignIn = lazy(() =&gt; import(&#8216;@\/pages\/SignIn&#8217;))<br \/>\nconst SignUp = lazy(() =&gt; import(&#8216;@\/pages\/SignUp&#8217;))<br \/>\nconst Activate = lazy(() =&gt; import(&#8216;@\/pages\/Activate&#8217;))<br \/>\nconst ForgotPassword = lazy(() =&gt; import(&#8216;@\/pages\/ForgotPassword&#8217;))<br \/>\nconst ResetPassword = lazy(() =&gt; import(&#8216;@\/pages\/ResetPassword&#8217;))<br \/>\nconst Home = lazy(() =&gt; import(&#8216;@\/pages\/Home&#8217;))<br \/>\nconst Search = lazy(() =&gt; import(&#8216;@\/pages\/Search&#8217;))<br \/>\nconst Property = lazy(() =&gt; import(&#8216;@\/pages\/Property&#8217;))<br \/>\nconst Checkout = lazy(() =&gt; import(&#8216;@\/pages\/Checkout&#8217;))<br \/>\nconst CheckoutSession = lazy(() =&gt; import(&#8216;@\/pages\/CheckoutSession&#8217;))<br \/>\nconst Bookings = lazy(() =&gt; import(&#8216;@\/pages\/Bookings&#8217;))<br \/>\nconst Booking = lazy(() =&gt; import(&#8216;@\/pages\/Booking&#8217;))<br \/>\nconst Settings = lazy(() =&gt; import(&#8216;@\/pages\/Settings&#8217;))<br \/>\nconst Notifications = lazy(() =&gt; import(&#8216;@\/pages\/Notifications&#8217;))<br \/>\nconst ToS = lazy(() =&gt; import(&#8216;@\/pages\/ToS&#8217;))<br \/>\nconst About = lazy(() =&gt; import(&#8216;@\/pages\/About&#8217;))<br \/>\nconst ChangePassword = lazy(() =&gt; import(&#8216;@\/pages\/ChangePassword&#8217;))<br \/>\nconst Contact = lazy(() =&gt; import(&#8216;@\/pages\/Contact&#8217;))<br \/>\nconst NoMatch = lazy(() =&gt; import(&#8216;@\/pages\/NoMatch&#8217;))<br \/>\nconst Agencies = lazy(() =&gt; import(&#8216;@\/pages\/Agencies&#8217;))<br \/>\nconst Locations = lazy(() =&gt; import(&#8216;@\/pages\/Locations&#8217;))<\/p>\n<p>const App = () =&gt; (<br \/>\n  &lt;GlobalProvider&gt;<br \/>\n    &lt;Router&gt;<br \/>\n      &lt;div className=&#8221;app&#8221;&gt;<br \/>\n        &lt;Suspense fallback={&lt;&gt;&lt;\/&gt;}&gt;<br \/>\n          &lt;Routes&gt;<br \/>\n            &lt;Route path=&#8221;\/sign-in&#8221; element={&lt;SignIn \/&gt;} \/&gt;<br \/>\n            &lt;Route path=&#8221;\/sign-up&#8221; element={&lt;SignUp \/&gt;} \/&gt;<br \/>\n            &lt;Route path=&#8221;\/activate&#8221; element={&lt;Activate \/&gt;} \/&gt;<br \/>\n            &lt;Route path=&#8221;\/forgot-password&#8221; element={&lt;ForgotPassword \/&gt;} \/&gt;<br \/>\n            &lt;Route path=&#8221;\/reset-password&#8221; element={&lt;ResetPassword \/&gt;} \/&gt;<br \/>\n            &lt;Route path=&#8221;\/&#8221; element={&lt;Home \/&gt;} \/&gt;<br \/>\n            &lt;Route path=&#8221;\/search&#8221; element={&lt;Search \/&gt;} \/&gt;<br \/>\n            &lt;Route path=&#8221;\/property&#8221; element={&lt;Property \/&gt;} \/&gt;<br \/>\n            &lt;Route path=&#8221;\/checkout&#8221; element={&lt;Checkout \/&gt;} \/&gt;<br \/>\n            &lt;Route path=&#8221;\/checkout-session\/:sessionId&#8221; element={&lt;CheckoutSession \/&gt;} \/&gt;<br \/>\n            &lt;Route path=&#8221;\/bookings&#8221; element={&lt;Bookings \/&gt;} \/&gt;<br \/>\n            &lt;Route path=&#8221;\/booking&#8221; element={&lt;Booking \/&gt;} \/&gt;<br \/>\n            &lt;Route path=&#8221;\/settings&#8221; element={&lt;Settings \/&gt;} \/&gt;<br \/>\n            &lt;Route path=&#8221;\/notifications&#8221; element={&lt;Notifications \/&gt;} \/&gt;<br \/>\n            &lt;Route path=&#8221;\/change-password&#8221; element={&lt;ChangePassword \/&gt;} \/&gt;<br \/>\n            &lt;Route path=&#8221;\/about&#8221; element={&lt;About \/&gt;} \/&gt;<br \/>\n            &lt;Route path=&#8221;\/tos&#8221; element={&lt;ToS \/&gt;} \/&gt;<br \/>\n            &lt;Route path=&#8221;\/contact&#8221; element={&lt;Contact \/&gt;} \/&gt;<br \/>\n            &lt;Route path=&#8221;\/agencies&#8221; element={&lt;Agencies \/&gt;} \/&gt;<br \/>\n            &lt;Route path=&#8221;\/destinations&#8221; element={&lt;Locations \/&gt;} \/&gt;<\/p>\n<p>            &lt;Route path=&#8221;*&#8221; element={&lt;NoMatch \/&gt;} \/&gt;<br \/>\n          &lt;\/Routes&gt;<br \/>\n        &lt;\/Suspense&gt;<br \/>\n      &lt;\/div&gt;<br \/>\n    &lt;\/Router&gt;<br \/>\n  &lt;\/GlobalProvider&gt;<br \/>\n)<\/p>\n<p>export default App<\/p>\n<p>\u0645\u0627 \u0627\u0632 React Lazy loading \u0628\u0631\u0627\u06cc \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u0647\u0631 \u0645\u0633\u06cc\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645.<\/p>\n<p>\u0645\u0627 \u0642\u0631\u0627\u0631 \u0646\u06cc\u0633\u062a \u0647\u0631 \u0635\u0641\u062d\u0647 \u0627\u0632 \u0635\u0641\u062d\u0647 \u0627\u0635\u0644\u06cc \u0631\u0627 \u067e\u0648\u0634\u0634 \u062f\u0647\u06cc\u0645\u060c \u0627\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u06a9\u062f \u0645\u0646\u0628\u0639 \u0631\u0627 \u0645\u0631\u0648\u0631 \u06a9\u0646\u06cc\u062f \u0648 \u0647\u0631 \u06a9\u062f\u0627\u0645 \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f.<\/p>\n<p>  \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0645\u0648\u0628\u0627\u06cc\u0644<\/p>\n<p>\u0627\u06cc\u0646 \u067e\u0644\u062a\u0641\u0631\u0645 \u06cc\u06a9 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0645\u0648\u0628\u0627\u06cc\u0644\u06cc \u0628\u0648\u0645\u06cc \u0628\u0631\u0627\u06cc \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0648 iOS \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u06a9\u0646\u062f. \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0645\u0648\u0628\u0627\u06cc\u0644 \u0628\u0627 React Native\u060c Expo \u0648 TypeScript \u0633\u0627\u062e\u062a\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a. \u0645\u0627\u0646\u0646\u062f \u0642\u0633\u0645\u062a \u062c\u0644\u0648\u06cc\u06cc\u060c \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0645\u0648\u0628\u0627\u06cc\u0644 \u0628\u0647 \u0645\u0634\u062a\u0631\u06cc \u0627\u06cc\u0646 \u0627\u0645\u06a9\u0627\u0646 \u0631\u0627 \u0645\u06cc\u200c\u062f\u0647\u062f \u06a9\u0647 \u062e\u0648\u062f\u0631\u0648\u0647\u0627\u06cc \u0645\u0648\u062c\u0648\u062f \u0631\u0627 \u0628\u0633\u062a\u0647 \u0628\u0647 \u0646\u0642\u0627\u0637 \u062a\u062d\u0648\u06cc\u0644 \u0648 \u062a\u062d\u0648\u06cc\u0644 \u0648 \u0632\u0645\u0627\u0646 \u062c\u0633\u062a\u062c\u0648 \u06a9\u0646\u062f\u060c \u062e\u0648\u062f\u0631\u0648\u06cc\u06cc \u0631\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0646\u062f \u0648 \u0628\u0647 \u062a\u0633\u0648\u06cc\u0647\u200c\u062d\u0633\u0627\u0628 \u0627\u062f\u0627\u0645\u0647 \u062f\u0647\u062f.<\/p>\n<p>\u0627\u06af\u0631 \u0631\u0632\u0631\u0648 \u0627\u0648 \u0627\u0632 \u0642\u0633\u0645\u062a \u0628\u0627\u0637\u0646 \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0634\u0648\u062f\u060c \u0645\u0634\u062a\u0631\u06cc \u0627\u0639\u0644\u0627\u0646\u200c\u0647\u0627\u06cc \u0641\u0634\u0627\u0631\u06cc \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc\u200c\u06a9\u0646\u062f. \u0627\u0639\u0644\u0627\u0646\u200c\u0647\u0627\u06cc \u0641\u0634\u0627\u0631\u06cc \u0628\u0627 Node.js\u060c Expo Server SDK \u0648 Firebase \u0633\u0627\u062e\u062a\u0647 \u0645\u06cc\u200c\u0634\u0648\u0646\u062f.<\/p>\n<p>\u067e\u0648\u0634\u0647 .\/mobile\/assets\/ \u062d\u0627\u0648\u06cc \u062a\u0635\u0627\u0648\u06cc\u0631 \u0627\u0633\u062a.<br \/>\n\u067e\u0648\u0634\u0647 .\/mobile\/screens\/ \u062d\u0627\u0648\u06cc \u0635\u0641\u062d\u0627\u062a \u0627\u0635\u0644\u06cc React Native \u0627\u0633\u062a.<br \/>\n\u067e\u0648\u0634\u0647 .\/mobile\/components\/ \u062d\u0627\u0648\u06cc \u0627\u062c\u0632\u0627\u06cc React Native \u0627\u0633\u062a.<br \/>\n.\/mobile\/services\/ \u0634\u0627\u0645\u0644 \u062e\u062f\u0645\u0627\u062a \u06a9\u0644\u0627\u06cc\u0646\u062a api \u0627\u0633\u062a.<br \/>\n.\/mobile\/App.tsx \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0635\u0644\u06cc React Native \u0627\u0633\u062a.<\/p>\n<p>\u062a\u0639\u0627\u0631\u06cc\u0641 \u0646\u0648\u0639 TypeScript \u062f\u0631 \u0645\u0648\u0627\u0631\u062f \u0632\u06cc\u0631 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u0634\u0648\u0646\u062f:<\/p>\n<p>.\/mobile\/types\/index.d.ts<br \/>\n.\/mobile\/types\/env.d.ts<br \/>\n.\/mobile\/miscellaneous\/movinTypes.ts<\/p>\n<p>.\/mobile\/types\/ \u0628\u0647 \u0635\u0648\u0631\u062a \u0632\u06cc\u0631 \u062f\u0631 .\/mobile\/tsconfig.json \u0628\u0627\u0631\u06af\u06cc\u0631\u06cc \u0645\u06cc \u0634\u0648\u062f:<\/p>\n<p>{<br \/>\n  &#8220;extends&#8221;: &#8220;expo\/tsconfig.base&#8221;,<br \/>\n  &#8220;compilerOptions&#8221;: {<br \/>\n    &#8220;strict&#8221;: true,<br \/>\n    &#8220;typeRoots&#8221;: [<br \/>\n      &#8220;.\/types&#8221;<br \/>\n    ]\n  }<br \/>\n}<\/p>\n<p>App.tsx \u0646\u0642\u0637\u0647 \u0648\u0631\u0648\u062f \u0627\u0635\u0644\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 React Native \u0627\u0633\u062a:<\/p>\n<p>import &#8216;react-native-gesture-handler&#8217;<br \/>\nimport React, { useCallback, useEffect, useRef, useState } from &#8216;react&#8217;<br \/>\nimport { RootSiblingParent } from &#8216;react-native-root-siblings&#8217;<br \/>\nimport { NavigationContainer, NavigationContainerRef } from &#8216;@react-navigation\/native&#8217;<br \/>\nimport { StatusBar as ExpoStatusBar } from &#8216;expo-status-bar&#8217;<br \/>\nimport { SafeAreaProvider } from &#8216;react-native-safe-area-context&#8217;<br \/>\nimport { Provider } from &#8216;react-native-paper&#8217;<br \/>\nimport * as SplashScreen from &#8216;expo-splash-screen&#8217;<br \/>\nimport * as Notifications from &#8216;expo-notifications&#8217;<br \/>\nimport { StripeProvider } from &#8216;@stripe\/stripe-react-native&#8217;<br \/>\nimport DrawerNavigator from &#8216;.\/components\/DrawerNavigator&#8217;<br \/>\nimport * as helper from &#8216;.\/common\/helper&#8217;<br \/>\nimport * as NotificationService from &#8216;.\/services\/NotificationService&#8217;<br \/>\nimport * as UserService from &#8216;.\/services\/UserService&#8217;<br \/>\nimport { GlobalProvider } from &#8216;.\/context\/GlobalContext&#8217;<br \/>\nimport * as env from &#8216;.\/config\/env.config&#8217;<\/p>\n<p>Notifications.setNotificationHandler({<br \/>\n  handleNotification: async () =&gt; ({<br \/>\n    shouldShowAlert: true,<br \/>\n    shouldPlaySound: true,<br \/>\n    shouldSetBadge: true,<br \/>\n  }),<br \/>\n})<\/p>\n<p>\/\/<br \/>\n\/\/ Prevent native splash screen from autohiding before App component declaration<br \/>\n\/\/<br \/>\nSplashScreen.preventAutoHideAsync()<br \/>\n  .then((result) =&gt; console.log(`SplashScreen.preventAutoHideAsync() succeeded: ${result}`))<br \/>\n  .catch(console.warn) \/\/ it&#8217;s good to explicitly catch and inspect any error<\/p>\n<p>const App = () =&gt; {<br \/>\n  const [appIsReady, setAppIsReady] = useState(false)<\/p>\n<p>  const responseListener = useRef&lt;Notifications.Subscription&gt;()<br \/>\n  const navigationRef = useRef&lt;NavigationContainerRef&lt;StackParams&gt;&gt;(null)<\/p>\n<p>  useEffect(() =&gt; {<br \/>\n    const register = async () =&gt; {<br \/>\n      const loggedIn = await UserService.loggedIn()<br \/>\n      if (loggedIn) {<br \/>\n        const currentUser = await UserService.getCurrentUser()<br \/>\n        if (currentUser?._id) {<br \/>\n          await helper.registerPushToken(currentUser._id)<br \/>\n        } else {<br \/>\n          helper.error()<br \/>\n        }<br \/>\n      }<br \/>\n    }<\/p>\n<p>    \/\/<br \/>\n    \/\/ Register push notifiations token<br \/>\n    \/\/<br \/>\n    register()<\/p>\n<p>    \/\/<br \/>\n    \/\/ This listener is fired whenever a user taps on or interacts with a notification (works when app is foregrounded, backgrounded, or killed)<br \/>\n    \/\/<br \/>\n    responseListener.current = Notifications.addNotificationResponseReceivedListener(async (response) =&gt; {<br \/>\n      try {<br \/>\n        if (navigationRef.current) {<br \/>\n          const { data } = response.notification.request.content<\/p>\n<p>          if (data.booking) {<br \/>\n            if (data.user &amp;&amp; data.notification) {<br \/>\n              await NotificationService.markAsRead(data.user, [data.notification])<br \/>\n            }<br \/>\n            navigationRef.current.navigate(&#8216;Booking&#8217;, { id: data.booking })<br \/>\n          } else {<br \/>\n            navigationRef.current.navigate(&#8216;Notifications&#8217;, {})<br \/>\n          }<br \/>\n        }<br \/>\n      } catch (err) {<br \/>\n        helper.error(err, false)<br \/>\n      }<br \/>\n    })<\/p>\n<p>    return () =&gt; {<br \/>\n      Notifications.removeNotificationSubscription(responseListener.current!)<br \/>\n    }<br \/>\n  }, [])<\/p>\n<p>  setTimeout(() =&gt; {<br \/>\n    setAppIsReady(true)<br \/>\n  }, 500)<\/p>\n<p>  const onReady = useCallback(async () =&gt; {<br \/>\n    if (appIsReady) {<br \/>\n      \/\/<br \/>\n      \/\/ This tells the splash screen to hide immediately! If we call this after<br \/>\n      \/\/ `setAppIsReady`, then we may see a blank screen while the app is<br \/>\n      \/\/ loading its initial state and rendering its first pixels. So instead,<br \/>\n      \/\/ we hide the splash screen once we know the root view has already<br \/>\n      \/\/ performed layout.<br \/>\n      \/\/<br \/>\n      await SplashScreen.hideAsync()<br \/>\n    }<br \/>\n  }, [appIsReady])<\/p>\n<p>  if (!appIsReady) {<br \/>\n    return null<br \/>\n  }<\/p>\n<p>  return (<br \/>\n    &lt;GlobalProvider&gt;<br \/>\n      &lt;SafeAreaProvider&gt;<br \/>\n        &lt;Provider&gt;<br \/>\n          &lt;StripeProvider publishableKey={env.STRIPE_PUBLISHABLE_KEY} merchantIdentifier={env.STRIPE_MERCHANT_IDENTIFIER}&gt;<br \/>\n            &lt;RootSiblingParent&gt;<br \/>\n              &lt;NavigationContainer ref={navigationRef} onReady={onReady}&gt;<br \/>\n                &lt;ExpoStatusBar style=&#8221;light&#8221; backgroundColor=&#8221;rgba(0, 0, 0, .9)&#8221; \/&gt;<br \/>\n                &lt;DrawerNavigator \/&gt;<br \/>\n              &lt;\/NavigationContainer&gt;<br \/>\n            &lt;\/RootSiblingParent&gt;<br \/>\n          &lt;\/StripeProvider&gt;<br \/>\n        &lt;\/Provider&gt;<br \/>\n      &lt;\/SafeAreaProvider&gt;<br \/>\n    &lt;\/GlobalProvider&gt;<br \/>\n  )<br \/>\n}<\/p>\n<p>export default App<\/p>\n<p>\u0645\u0627 \u0642\u0631\u0627\u0631 \u0646\u06cc\u0633\u062a \u0647\u0631 \u0635\u0641\u062d\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u062a\u0644\u0641\u0646 \u0647\u0645\u0631\u0627\u0647 \u0631\u0627 \u067e\u0648\u0634\u0634 \u062f\u0647\u06cc\u0645\u060c \u0627\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u06a9\u062f \u0645\u0646\u0628\u0639 \u0631\u0627 \u0645\u0631\u0648\u0631 \u06a9\u0646\u06cc\u062f \u0648 \u0647\u0631 \u06a9\u062f\u0627\u0645 \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f.<\/p>\n<p>  \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a<\/p>\n<p>\u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0628 \u0627\u0633\u062a \u06a9\u0647 \u0628\u0627 Node.js\u060c React\u060c MUI \u0648 TypeScript \u0633\u0627\u062e\u062a\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a. \u0627\u0632 \u0628\u0627\u0637\u0646\u060c \u0627\u062f\u0645\u06cc\u0646 \u0647\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u0646\u062f \u062a\u0627\u0645\u06cc\u0646 \u06a9\u0646\u0646\u062f\u06af\u0627\u0646\u060c \u0645\u0627\u0634\u06cc\u0646 \u0647\u0627\u060c \u0645\u06a9\u0627\u0646 \u0647\u0627\u060c \u0645\u0634\u062a\u0631\u06cc\u0627\u0646 \u0648 \u0631\u0632\u0631\u0648\u0647\u0627 \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u0648 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u0646\u062f. \u0647\u0646\u06af\u0627\u0645\u06cc \u06a9\u0647 \u062a\u0627\u0645\u06cc\u0646 \u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u062c\u062f\u06cc\u062f \u0627\u0632 \u0628\u0627\u0637\u0646 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u0634\u0648\u0646\u062f\u060c \u0627\u06cc\u0645\u06cc\u0644\u06cc \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc \u06a9\u0646\u0646\u062f \u06a9\u0647 \u0627\u0632 \u0622\u0646\u0647\u0627 \u0645\u06cc \u062e\u0648\u0627\u0647\u062f \u06cc\u06a9 \u062d\u0633\u0627\u0628 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u0646\u062f \u062a\u0627 \u0628\u0647 \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a \u062f\u0633\u062a\u0631\u0633\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0646\u062f \u0648 \u0646\u0627\u0648\u06af\u0627\u0646 \u062e\u0648\u062f\u0631\u0648 \u0648 \u0631\u0632\u0631\u0648\u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u0646\u062f.<\/p>\n<p>\u067e\u0648\u0634\u0647 .\/backend\/assets\/ \u062d\u0627\u0648\u06cc CSS \u0648 \u062a\u0635\u0627\u0648\u06cc\u0631 \u0627\u0633\u062a.<br \/>\n\u067e\u0648\u0634\u0647 .\/backend\/pages\/ \u062d\u0627\u0648\u06cc \u0635\u0641\u062d\u0627\u062a React \u0627\u0633\u062a.<br \/>\n\u067e\u0648\u0634\u0647 .\/backend\/components\/ \u062d\u0627\u0648\u06cc \u0627\u062c\u0632\u0627\u06cc React \u0627\u0633\u062a.<br \/>\n.\/backend\/services\/ \u0634\u0627\u0645\u0644 \u062e\u062f\u0645\u0627\u062a \u06a9\u0644\u0627\u06cc\u0646\u062a api \u0627\u0633\u062a.<br \/>\n.\/backend\/App.tsx \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0635\u0644\u06cc React \u0627\u0633\u062a \u06a9\u0647 \u062d\u0627\u0648\u06cc \u0645\u0633\u06cc\u0631\u0647\u0627 \u0627\u0633\u062a.<br \/>\n.\/backend\/index.tsx \u0646\u0642\u0637\u0647 \u0648\u0631\u0648\u062f \u0627\u0635\u0644\u06cc \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a \u0627\u0633\u062a.<\/p>\n<p>\u062a\u0639\u0627\u0631\u06cc\u0641 \u0646\u0648\u0639 TypeScript \u062f\u0631 \u0628\u0633\u062a\u0647 .\/packages\/movinin-types \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<p>App.tsx \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a \u0627\u0632 \u0645\u0646\u0637\u0642 \u0645\u0634\u0627\u0628\u0647\u06cc \u0645\u0627\u0646\u0646\u062f App.tsx \u0642\u0633\u0645\u062a \u062c\u0644\u0648 \u067e\u06cc\u0631\u0648\u06cc \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u0645\u0627 \u0642\u0631\u0627\u0631 \u0646\u06cc\u0633\u062a \u0647\u0631 \u0635\u0641\u062d\u0647 \u0627\u0632 \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a \u0631\u0627 \u067e\u0648\u0634\u0634 \u062f\u0647\u06cc\u0645\u060c \u0627\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u06a9\u062f \u0645\u0646\u0628\u0639 \u0631\u0627 \u0645\u0631\u0648\u0631 \u06a9\u0646\u06cc\u062f \u0648 \u0647\u0631 \u06a9\u062f\u0627\u0645 \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f.<\/p>\n<p>  \u0646\u0642\u0627\u0637 \u0645\u0648\u0631\u062f \u0639\u0644\u0627\u0642\u0647<\/p>\n<p>\u0633\u0627\u062e\u062a \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0645\u0648\u0628\u0627\u06cc\u0644 \u0628\u0627 React Native \u0648 Expo \u0628\u0633\u06cc\u0627\u0631 \u0622\u0633\u0627\u0646 \u0627\u0633\u062a. Expo \u062a\u0648\u0633\u0639\u0647 \u0645\u0648\u0628\u0627\u06cc\u0644 \u0628\u0627 React Native \u0631\u0627 \u0628\u0633\u06cc\u0627\u0631 \u0633\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0647\u0645\u0627\u0646 \u0632\u0628\u0627\u0646 (TypeScript) \u0628\u0631\u0627\u06cc \u062a\u0648\u0633\u0639\u0647 Backend\u060c Frontend \u0648 \u0645\u0648\u0628\u0627\u06cc\u0644 \u0628\u0633\u06cc\u0627\u0631 \u0631\u0627\u062d\u062a \u0627\u0633\u062a.<\/p>\n<p>TypeScript \u0632\u0628\u0627\u0646 \u0628\u0633\u06cc\u0627\u0631 \u062c\u0627\u0644\u0628\u06cc \u0627\u0633\u062a \u0648 \u0645\u0632\u0627\u06cc\u0627\u06cc \u0632\u06cc\u0627\u062f\u06cc \u062f\u0627\u0631\u062f. \u0628\u0627 \u0627\u0641\u0632\u0648\u062f\u0646 \u062a\u0627\u06cc\u067e \u0627\u0633\u062a\u0627\u062a\u06cc\u06a9 \u0628\u0647 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u0645 \u0627\u0632 \u0628\u0633\u06cc\u0627\u0631\u06cc \u0627\u0632 \u0628\u0627\u06af\u200c\u0647\u0627 \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u06a9\u0646\u06cc\u0645 \u0648 \u06a9\u062f\u06cc \u0628\u0627 \u06a9\u06cc\u0641\u06cc\u062a \u0628\u0627\u0644\u0627\u060c \u0645\u0642\u06cc\u0627\u0633\u200c\u067e\u0630\u06cc\u0631\u060c \u062e\u0648\u0627\u0646\u0627\u062a\u0631 \u0648 \u0642\u0627\u0628\u0644 \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u062a\u0648\u0644\u06cc\u062f \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0628\u0647 \u0631\u0627\u062d\u062a\u06cc \u0627\u0634\u06a9\u0627\u0644 \u0632\u062f\u0627\u06cc\u06cc \u0648 \u0622\u0632\u0645\u0627\u06cc\u0634 \u0634\u0648\u062f.<\/p>\n<p>\u0647\u0645\u06cc\u0646! \u0627\u0645\u06cc\u062f\u0648\u0627\u0631\u0645 \u0627\u0632 \u062e\u0648\u0627\u0646\u062f\u0646 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u0644\u0630\u062a \u0628\u0631\u062f\u0647 \u0628\u0627\u0634\u06cc\u062f.<\/p>\n<p>  \u0645\u0646\u0627\u0628\u0639<\/p>\n<p>\u0646\u0645\u0627\u06cc \u06a9\u0644\u06cc<br \/>\n\u0645\u0639\u0645\u0627\u0631\u06cc<br \/>\n\u062f\u0631 \u062d\u0627\u0644 \u0646\u0635\u0628 (\u062e\u0648\u062f \u0645\u06cc\u0632\u0628\u0627\u0646)<br \/>\n\u0646\u0635\u0628 (VPS)<\/p>\n<p>\u0646\u0635\u0628 (Docker)<\/p>\n<p>\u062a\u0635\u0648\u06cc\u0631 \u062f\u0627\u06a9\u0631<br \/>\nSSL<\/p>\n<p>Stripe \u0631\u0627 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f<\/p>\n<p>\u0633\u0627\u062e\u062a \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0645\u0648\u0628\u0627\u06cc\u0644<\/p>\n<p>\u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0646\u0633\u062e\u0647 \u06cc \u0646\u0645\u0627\u06cc\u0634\u06cc<\/p>\n<p>\u0648\u06cc\u0646\u062f\u0648\u0632\u060c \u0644\u06cc\u0646\u0648\u06a9\u0633 \u0648 macOS<br \/>\n\u062f\u0627\u06a9\u0631<\/p>\n<p>\u0627\u0632 \u0645\u0646\u0628\u0639 \u0627\u062c\u0631\u0627 \u0634\u0648\u062f<\/p>\n<p>\u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0648\u0628\u0627\u06cc\u0644 \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f<\/p>\n<p>\u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632\u0647\u0627<br \/>\n\u062f\u0633\u062a\u0648\u0631\u0627\u0644\u0639\u0645\u0644 \u0647\u0627<br \/>\nPush Notifications<\/p>\n<p>\u062a\u063a\u06cc\u06cc\u0631 \u0627\u0631\u0632<\/p>\n<p>\u0632\u0628\u0627\u0646 \u062c\u062f\u06cc\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f<\/p>\n<p>\u062a\u0633\u062a \u0647\u0627\u06cc \u0648\u0627\u062d\u062f \u0648 \u067e\u0648\u0634\u0634<\/p>\n<p>\u0633\u06cc\u0627\u0647\u0647\u0647\u0627<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"\u062a\u063a\u06cc\u06cc\u0631 \u0648\u0636\u0639\u06cc\u062a \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/from-zero-to-storefront-my-journey-building-a-property-rental-platform-cm9\/#%D9%85%D8%B7%D8%A7%D9%84%D8%A8\" >\u0645\u0637\u0627\u0644\u0628<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/from-zero-to-storefront-my-journey-building-a-property-rental-platform-cm9\/#%D9%85%D9%82%D8%AF%D9%85%D9%87\" >\u0645\u0642\u062f\u0645\u0647<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/from-zero-to-storefront-my-journey-building-a-property-rental-platform-cm9\/#%D9%BE%D8%B4%D8%AA%D9%87_%D9%81%D9%86%D8%A7%D9%88%D8%B1%DB%8C\" >\u067e\u0634\u062a\u0647 \u0641\u0646\u0627\u0648\u0631\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/from-zero-to-storefront-my-journey-building-a-property-rental-platform-cm9\/#%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%AC%D9%85%D8%A7%D9%84%DB%8C_%D8%B3%D8%B1%DB%8C%D8%B9\" >\u0628\u0631\u0631\u0633\u06cc \u0627\u062c\u0645\u0627\u0644\u06cc \u0633\u0631\u06cc\u0639<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/nabfollower.com\/blog\/from-zero-to-storefront-my-journey-building-a-property-rental-platform-cm9\/#Frontend\" >Frontend<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/nabfollower.com\/blog\/from-zero-to-storefront-my-journey-building-a-property-rental-platform-cm9\/#%D8%AF%D8%A7%D8%B4%D8%A8%D9%88%D8%B1%D8%AF_%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA\" >\u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/nabfollower.com\/blog\/from-zero-to-storefront-my-journey-building-a-property-rental-platform-cm9\/#API\" >API<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/nabfollower.com\/blog\/from-zero-to-storefront-my-journey-building-a-property-rental-platform-cm9\/#Frontend-2\" >Frontend<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/nabfollower.com\/blog\/from-zero-to-storefront-my-journey-building-a-property-rental-platform-cm9\/#%D8%A7%D9%BE%D9%84%DB%8C%DA%A9%DB%8C%D8%B4%D9%86_%D9%85%D9%88%D8%A8%D8%A7%DB%8C%D9%84\" >\u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0645\u0648\u0628\u0627\u06cc\u0644<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/nabfollower.com\/blog\/from-zero-to-storefront-my-journey-building-a-property-rental-platform-cm9\/#%D8%AF%D8%A7%D8%B4%D8%A8%D9%88%D8%B1%D8%AF_%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA-2\" >\u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/nabfollower.com\/blog\/from-zero-to-storefront-my-journey-building-a-property-rental-platform-cm9\/#%D9%86%D9%82%D8%A7%D8%B7_%D9%85%D9%88%D8%B1%D8%AF_%D8%B9%D9%84%D8%A7%D9%82%D9%87\" >\u0646\u0642\u0627\u0637 \u0645\u0648\u0631\u062f \u0639\u0644\u0627\u0642\u0647<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/nabfollower.com\/blog\/from-zero-to-storefront-my-journey-building-a-property-rental-platform-cm9\/#%D9%85%D9%86%D8%A7%D8%A8%D8%B9\" >\u0645\u0646\u0627\u0628\u0639<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D9%85%D8%B7%D8%A7%D9%84%D8%A8\"><\/span>\n<p>  \u0645\u0637\u0627\u0644\u0628<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ol>\n<li>\u0645\u0642\u062f\u0645\u0647<\/li>\n<li>\u067e\u0634\u062a\u0647 \u0641\u0646\u0627\u0648\u0631\u06cc<\/li>\n<li>\u0628\u0631\u0631\u0633\u06cc \u0627\u062c\u0645\u0627\u0644\u06cc \u0633\u0631\u06cc\u0639<\/li>\n<li>API<\/li>\n<li>Frontend<\/li>\n<li>\u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0645\u0648\u0628\u0627\u06cc\u0644<\/li>\n<li>\u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a<\/li>\n<li>\u0646\u0642\u0627\u0637 \u0645\u0648\u0631\u062f \u0639\u0644\u0627\u0642\u0647<\/li>\n<li>\u0645\u0646\u0627\u0628\u0639<\/li>\n<\/ol>\n<p>\u06a9\u062f \u0645\u0646\u0628\u0639: https:\/\/github.com\/aelassas\/movinin<\/p>\n<p>\u0646\u0633\u062e\u0647 \u06cc \u0646\u0645\u0627\u06cc\u0634\u06cc: https:\/\/movin.dynv6.net:3004<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D9%85%D9%82%D8%AF%D9%85%D9%87\"><\/span>\n<p>  \u0645\u0642\u062f\u0645\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u06cc\u0646 \u0627\u06cc\u062f\u0647 \u0627\u0632 \u062a\u0645\u0627\u06cc\u0644 \u0628\u0647 \u0633\u0627\u062e\u062a \u0648 \u0633\u0627\u0632 \u0628\u062f\u0648\u0646 \u0645\u0631\u0632 &#8211; \u06cc\u06a9 \u067e\u0644\u062a \u0641\u0631\u0645 \u0627\u062c\u0627\u0631\u0647 \u0645\u0644\u06a9 \u06a9\u0627\u0645\u0644\u0627\u064b \u0642\u0627\u0628\u0644 \u062a\u0646\u0638\u06cc\u0645 \u0648 \u0639\u0645\u0644\u06cc\u0627\u062a\u06cc \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u0647\u0645\u0647 \u062c\u0646\u0628\u0647 \u0647\u0627 \u062f\u0631 \u06a9\u0646\u062a\u0631\u0644 \u0634\u0645\u0627 \u0627\u0633\u062a \u067e\u062f\u06cc\u062f \u0622\u0645\u062f:<\/p>\n<ul>\n<li>\n<strong>\u0645\u0627\u0644\u06a9 UI\/UX \u0628\u0627\u0634\u06cc\u062f<\/strong>: \u0637\u0631\u0627\u062d\u06cc \u062a\u062c\u0631\u0628\u06cc\u0627\u062a \u0645\u0646\u062d\u0635\u0631 \u0628\u0647 \u0641\u0631\u062f \u0645\u0634\u062a\u0631\u06cc \u0628\u062f\u0648\u0646 \u0645\u0628\u0627\u0631\u0632\u0647 \u0628\u0627 \u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u0647\u0627\u06cc \u0642\u0627\u0644\u0628<\/li>\n<li>\n<strong>Backend \u0631\u0627 \u06a9\u0646\u062a\u0631\u0644 \u06a9\u0646\u06cc\u062f<\/strong>: \u0645\u0646\u0637\u0642 \u062a\u062c\u0627\u0631\u06cc \u0648 \u0633\u0627\u062e\u062a\u0627\u0631\u0647\u0627\u06cc \u062f\u0627\u062f\u0647 \u0633\u0641\u0627\u0631\u0634\u06cc \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u06a9\u0627\u0645\u0644\u0627\u064b \u0628\u0627 \u0627\u0644\u0632\u0627\u0645\u0627\u062a \u0645\u0637\u0627\u0628\u0642\u062a \u062f\u0627\u0631\u062f<\/li>\n<li>\n<strong>Master DevOps<\/strong>: \u0627\u0633\u062a\u0642\u0631\u0627\u0631\u060c \u0645\u0642\u06cc\u0627\u0633 \u0648 \u0646\u0638\u0627\u0631\u062a \u0628\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u0628\u0627 \u0627\u0628\u0632\u0627\u0631\u0647\u0627 \u0648 \u06af\u0631\u062f\u0634 \u06a9\u0627\u0631 \u062a\u0631\u062c\u06cc\u062d\u06cc<\/li>\n<li>\n<strong>\u0622\u0632\u0627\u062f\u0627\u0646\u0647 \u06af\u0633\u062a\u0631\u0634 \u062f\u0647\u06cc\u062f<\/strong>: \u0628\u062f\u0648\u0646 \u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u0647\u0627\u06cc \u067e\u0644\u062a \u0641\u0631\u0645 \u06cc\u0627 \u0647\u0632\u06cc\u0646\u0647 \u0647\u0627\u06cc \u0627\u0636\u0627\u0641\u06cc\u060c \u0648\u06cc\u0698\u06af\u06cc \u0647\u0627 \u0648 \u0627\u062f\u063a\u0627\u0645 \u0647\u0627\u06cc \u062c\u062f\u06cc\u062f \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"%D9%BE%D8%B4%D8%AA%D9%87_%D9%81%D9%86%D8%A7%D9%88%D8%B1%DB%8C\"><\/span>\n<p>  \u067e\u0634\u062a\u0647 \u0641\u0646\u0627\u0648\u0631\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u067e\u0634\u062a\u0647 \u0641\u0646\u0627\u0648\u0631\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0627\u06cc\u0646 \u0627\u0645\u06a9\u0627\u0646 \u0631\u0627 \u0641\u0631\u0627\u0647\u0645 \u06a9\u0631\u062f\u0647 \u0627\u0633\u062a:<\/p>\n<ul>\n<li>TypeScript<\/li>\n<li>Node.js<\/li>\n<li>MongoDB<\/li>\n<li>\u0648\u0627\u06a9\u0646\u0634 \u0646\u0634\u0627\u0646 \u062f\u0647\u06cc\u062f<\/li>\n<li>MUI<\/li>\n<li>\u0646\u0645\u0627\u06cc\u0634\u06af\u0627\u0647<\/li>\n<li>\u0631\u0627\u0647 \u0631\u0627\u0647<\/li>\n<li>\u062f\u0627\u06a9\u0631<\/li>\n<\/ul>\n<p>\u06cc\u06a9 \u062a\u0635\u0645\u06cc\u0645 \u06a9\u0644\u06cc\u062f\u06cc \u0637\u0631\u0627\u062d\u06cc \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 TypeScript \u0628\u0647 \u062f\u0644\u06cc\u0644 \u0645\u0632\u0627\u06cc\u0627\u06cc \u0645\u062a\u0639\u062f\u062f \u0622\u0646 \u06af\u0631\u0641\u062a\u0647 \u0634\u062f. TypeScript \u062a\u0627\u06cc\u067e\u060c \u0627\u0628\u0632\u0627\u0631 \u0648 \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u0633\u0627\u0632\u06cc \u0642\u0648\u06cc \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f \u06a9\u0647 \u0645\u0646\u062c\u0631 \u0628\u0647 \u06a9\u062f\u0647\u0627\u06cc \u0628\u0627 \u06a9\u06cc\u0641\u06cc\u062a \u0628\u0627\u0644\u0627\u060c \u0645\u0642\u06cc\u0627\u0633 \u067e\u0630\u06cc\u0631\u060c \u062e\u0648\u0627\u0646\u0627\u062a\u0631 \u0648 \u0642\u0627\u0628\u0644 \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u0645\u06cc \u0634\u0648\u062f \u06a9\u0647 \u0628\u0647 \u0631\u0627\u062d\u062a\u06cc \u0627\u0634\u06a9\u0627\u0644 \u0632\u062f\u0627\u06cc\u06cc \u0648 \u0622\u0632\u0645\u0627\u06cc\u0634 \u0645\u06cc \u0634\u0648\u062f.<\/p>\n<p>\u0645\u0646 React \u0631\u0627 \u0628\u0631\u0627\u06cc \u0642\u0627\u0628\u0644\u06cc\u062a\u200c\u0647\u0627\u06cc \u0631\u0646\u062f\u0631 \u0642\u062f\u0631\u062a\u0645\u0646\u062f\u060c MongoDB \u0628\u0631\u0627\u06cc \u0645\u062f\u0644\u200c\u0633\u0627\u0632\u06cc \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc \u0627\u0646\u0639\u0637\u0627\u0641\u200c\u067e\u0630\u06cc\u0631 \u0648 Stripe \u0631\u0627 \u0628\u0631\u0627\u06cc \u067e\u0631\u062f\u0627\u0632\u0634 \u067e\u0631\u062f\u0627\u062e\u062a \u0627\u0645\u0646 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0631\u062f\u0645.<\/p>\n<p>\u0628\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u0627\u06cc\u0646 \u067e\u0634\u062a\u0647\u060c \u0634\u0645\u0627 \u0641\u0642\u0637 \u06cc\u06a9 \u0648\u0628\u200c\u0633\u0627\u06cc\u062a \u0648 \u0628\u0631\u0646\u0627\u0645\u0647 \u062a\u0644\u0641\u0646 \u0647\u0645\u0631\u0627\u0647 \u0646\u0645\u06cc\u200c\u0633\u0627\u0632\u06cc\u062f\u060c \u0628\u0644\u06a9\u0647 \u0631\u0648\u06cc \u0628\u0646\u06cc\u0627\u062f\u06cc \u0633\u0631\u0645\u0627\u06cc\u0647\u200c\u06af\u0630\u0627\u0631\u06cc \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u0628\u0627 \u0646\u06cc\u0627\u0632\u0647\u0627\u06cc \u0634\u0645\u0627 \u062a\u06a9\u0627\u0645\u0644 \u06cc\u0627\u0628\u062f\u060c \u0628\u0627 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0627\u0632 \u0641\u0646\u0627\u0648\u0631\u06cc\u200c\u0647\u0627\u06cc \u0645\u0646\u0628\u0639 \u0628\u0627\u0632 \u0642\u0648\u06cc \u0648 \u062c\u0627\u0645\u0639\u0647 \u062a\u0648\u0633\u0639\u0647\u200c\u062f\u0647\u0646\u062f\u06af\u0627\u0646 \u062f\u0631 \u062d\u0627\u0644 \u0631\u0634\u062f.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%AC%D9%85%D8%A7%D9%84%DB%8C_%D8%B3%D8%B1%DB%8C%D8%B9\"><\/span>\n<p>  \u0628\u0631\u0631\u0633\u06cc \u0627\u062c\u0645\u0627\u0644\u06cc \u0633\u0631\u06cc\u0639<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0628\u062e\u0634\u060c \u0635\u0641\u062d\u0627\u062a \u0627\u0635\u0644\u06cc frontend\u060c \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a \u0648 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0645\u0648\u0628\u0627\u06cc\u0644 \u0631\u0627 \u0645\u0634\u0627\u0647\u062f\u0647 \u062e\u0648\u0627\u0647\u06cc\u062f \u06a9\u0631\u062f.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Frontend\"><\/span>\n<p>  Frontend<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u0632 \u0642\u0633\u0645\u062a \u062c\u0644\u0648\u060c \u0645\u0634\u062a\u0631\u06cc \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0627\u0645\u0644\u0627\u06a9 \u0645\u0648\u062c\u0648\u062f \u0631\u0627 \u062c\u0633\u062a\u062c\u0648 \u06a9\u0646\u062f\u060c \u0645\u0644\u06a9\u06cc \u0631\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0646\u062f \u0648 \u067e\u0631\u062f\u0627\u062e\u062a \u06a9\u0646\u062f.<\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u0635\u0644\u06cc \u0635\u0641\u062d\u0647 \u0627\u0635\u0644\u06cc \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u0645\u0634\u062a\u0631\u06cc \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0645\u06a9\u0627\u0646 \u0648 \u0632\u0645\u0627\u0646 \u0631\u0627 \u0645\u0634\u062e\u0635 \u06a9\u0646\u062f \u0648 \u0627\u0645\u0644\u0627\u06a9 \u0645\u0648\u062c\u0648\u062f \u0631\u0627 \u062c\u0633\u062a\u062c\u0648 \u06a9\u0646\u062f.<\/p>\n<p><\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0646\u062a\u06cc\u062c\u0647 \u062c\u0633\u062a\u062c\u0648\u06cc \u0635\u0641\u062d\u0647 \u0627\u0635\u0644\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u0634\u062a\u0631\u06cc \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0645\u0644\u06a9\u06cc \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u062c\u0627\u0631\u0647 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0646\u062f.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy1gnzhojzqfuibtb4kfu.png\" alt=\"Frontend\" width=\"800\" height=\"524\" title=\"\"><\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u0634\u062a\u0631\u06cc \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u062c\u0632\u0626\u06cc\u0627\u062a \u0645\u0644\u06a9 \u0631\u0627 \u0645\u0634\u0627\u0647\u062f\u0647 \u06a9\u0646\u062f:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz1acgsvmdqnjdqzubqg1.png\" alt=\"Frontend\" width=\"800\" height=\"524\" title=\"\"><\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0646\u0645\u0627\u06cc\u06cc \u0627\u0632 \u062a\u0635\u0627\u0648\u06cc\u0631 \u0645\u0644\u06a9 \u0631\u0627 \u0645\u0634\u0627\u0647\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u062f:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F35lgqiwjkiw4qwiy8urp.png\" alt=\"Frontend\" width=\"800\" height=\"524\" title=\"\"><\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u067e\u0631\u062f\u0627\u062e\u062a \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u0645\u0634\u062a\u0631\u06cc \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u06af\u0632\u06cc\u0646\u0647 \u0647\u0627\u06cc \u0627\u062c\u0627\u0631\u0647 \u0648 \u067e\u0631\u062f\u0627\u062e\u062a \u0631\u0627 \u062a\u0639\u06cc\u06cc\u0646 \u06a9\u0646\u062f. \u062f\u0631 \u0635\u0648\u0631\u062a\u06cc \u06a9\u0647 \u0645\u0634\u062a\u0631\u06cc \u062b\u0628\u062a \u0646\u0627\u0645 \u0646\u06a9\u0631\u062f\u0647 \u0628\u0627\u0634\u062f\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0647\u0645\u0632\u0645\u0627\u0646 \u062a\u0633\u0648\u06cc\u0647 \u062d\u0633\u0627\u0628 \u0648 \u062b\u0628\u062a \u0646\u0627\u0645 \u06a9\u0646\u062f. \u0627\u06af\u0631 \u0647\u0646\u0648\u0632 \u062b\u0628\u062a \u0646\u0627\u0645 \u0646\u06a9\u0631\u062f\u0647 \u0628\u0627\u0634\u062f\u060c \u06cc\u06a9 \u0627\u06cc\u0645\u06cc\u0644 \u062a\u0627\u06cc\u06cc\u062f \u0648 \u0641\u0639\u0627\u0644 \u0633\u0627\u0632\u06cc \u0628\u0631\u0627\u06cc \u062a\u0639\u06cc\u06cc\u0646 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkubp66hlnrtt4dq9q6ij.png\" alt=\"Frontend\" width=\"800\" height=\"1564\" title=\"\"><\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0627\u0633\u062a. \u062f\u0631 \u0632\u0645\u0627\u0646 \u062a\u0648\u0644\u06cc\u062f\u060c \u06a9\u0648\u06a9\u06cc\u200c\u0647\u0627\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a httpOnly\u060c \u0627\u0645\u0636\u0627 \u0634\u062f\u0647\u060c \u0627\u0645\u0646 \u0648 \u0633\u062e\u062a\u200c\u06af\u06cc\u0631 \u062f\u0631 \u0647\u0645\u0627\u0646 \u0633\u0627\u06cc\u062a \u0647\u0633\u062a\u0646\u062f. \u0627\u06cc\u0646 \u06af\u0632\u06cc\u0646\u0647 \u0647\u0627 \u0627\u0632 \u062d\u0645\u0644\u0627\u062a XSS\u060c CSRF \u0648 MITM \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0645\u06cc \u06a9\u0646\u0646\u062f. \u06a9\u0648\u06a9\u06cc\u200c\u0647\u0627\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u0632 \u0637\u0631\u06cc\u0642 \u06cc\u06a9 \u0645\u06cc\u0627\u0646\u200c\u0627\u0641\u0632\u0627\u0631 \u0633\u0641\u0627\u0631\u0634\u06cc \u0646\u06cc\u0632 \u062f\u0631 \u0628\u0631\u0627\u0628\u0631 \u062d\u0645\u0644\u0627\u062a XST \u0645\u062d\u0627\u0641\u0638\u062a \u0645\u06cc\u200c\u0634\u0648\u0646\u062f.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn07dbk5nqhvyp143p13g.png\" alt=\"Frontend\" width=\"800\" height=\"524\" title=\"\"><\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u062b\u0628\u062a \u0646\u0627\u0645 \u0627\u0633\u062a.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4scpa6pckjy51snvq10u.png\" alt=\"Frontend\" width=\"800\" height=\"601\" title=\"\"><\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u0634\u062a\u0631\u06cc \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0631\u0632\u0631\u0648\u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0628\u0628\u06cc\u0646\u062f \u0648 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u062f.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb0zppzk265or9hxovb7g.png\" alt=\"Frontend\" width=\"800\" height=\"524\" title=\"\"><\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647\u200c\u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u0634\u062a\u0631\u06cc \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u0631\u0632\u0631\u0648 \u0631\u0627 \u0628\u0627 \u062c\u0632\u0626\u06cc\u0627\u062a \u0645\u0634\u0627\u0647\u062f\u0647 \u06a9\u0646\u062f.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd1gji1nv2id31yc2arae.png\" alt=\"Frontend\" width=\"800\" height=\"524\" title=\"\"><\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u0634\u062a\u0631\u06cc \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0627\u0639\u0644\u0627\u0646 \u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0628\u0628\u06cc\u0646\u062f.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu7zcscjqmfdo9sc30f0d.png\" alt=\"Frontend\" width=\"800\" height=\"524\" title=\"\"><\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u0634\u062a\u0631\u06cc \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u062e\u0648\u062f \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u062f.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbubx39zg3yi7gkb8olj6.png\" alt=\"Frontend\" width=\"800\" height=\"664\" title=\"\"><\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u06cc \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f \u06a9\u0647 \u0645\u0634\u062a\u0631\u06cc \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u062e\u0648\u062f \u0631\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u062f.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhvp8jwu7ppx57thl35rc.png\" alt=\"Frontend\" width=\"800\" height=\"524\" title=\"\"><\/p>\n<p>\u0647\u0645\u06cc\u0646 \u0627\u0633\u062a. \u0627\u06cc\u0646 \u0635\u0641\u062d\u0627\u062a \u0627\u0635\u0644\u06cc \u0635\u0641\u062d\u0647 \u0627\u0635\u0644\u06cc \u0627\u0633\u062a.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D8%AF%D8%A7%D8%B4%D8%A8%D9%88%D8%B1%D8%AF_%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA\"><\/span>\n<p>  \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0633\u0647 \u0646\u0648\u0639 \u06a9\u0627\u0631\u0628\u0631:<\/p>\n<ul>\n<li>\u0627\u062f\u0645\u06cc\u0646 \u0647\u0627: \u0622\u0646\u0647\u0627 \u0628\u0647 \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a \u062f\u0633\u062a\u0631\u0633\u06cc \u06a9\u0627\u0645\u0644 \u062f\u0627\u0631\u0646\u062f. \u0622\u0646\u0647\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u0646\u062f \u0647\u0645\u0647 \u0686\u06cc\u0632 \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u0646\u062f.<\/li>\n<li>\u0622\u0698\u0627\u0646\u0633 \u0647\u0627: \u062f\u0633\u062a\u0631\u0633\u06cc \u0645\u062d\u062f\u0648\u062f\u06cc \u0628\u0647 \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a \u062f\u0627\u0631\u0646\u062f. \u0622\u0646\u0647\u0627 \u0641\u0642\u0637 \u0645\u06cc \u062a\u0648\u0627\u0646\u0646\u062f \u0627\u0645\u0644\u0627\u06a9\u060c \u0631\u0632\u0631\u0648\u0647\u0627 \u0648 \u0645\u0634\u062a\u0631\u06cc\u0627\u0646 \u062e\u0648\u062f \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u0646\u062f.<\/li>\n<li>\u0645\u0634\u062a\u0631\u06cc\u0627\u0646: \u0622\u0646\u0647\u0627 \u0641\u0642\u0637 \u0628\u0647 \u0642\u0633\u0645\u062a \u0638\u0627\u0647\u0631\u06cc \u0648 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0645\u0648\u0628\u0627\u06cc\u0644 \u062f\u0633\u062a\u0631\u0633\u06cc \u062f\u0627\u0631\u0646\u062f. \u0622\u0646\u0647\u0627 \u0646\u0645\u06cc \u062a\u0648\u0627\u0646\u0646\u062f \u0628\u0647 \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a \u062f\u0633\u062a\u0631\u0633\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0646\u062f.<\/li>\n<\/ul>\n<p>\u0627\u06cc\u0646 \u067e\u0644\u062a\u0641\u0631\u0645 \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631 \u0628\u0627 \u0686\u0646\u062f\u06cc\u0646 \u0622\u0698\u0627\u0646\u0633 \u0637\u0631\u0627\u062d\u06cc \u0634\u062f\u0647 \u0627\u0633\u062a. \u0647\u0631 \u0622\u0698\u0627\u0646\u0633 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u062f\u0627\u0631\u0627\u06cc\u06cc \u0647\u0627\u060c \u0645\u0634\u062a\u0631\u06cc\u0627\u0646 \u0648 \u0631\u0632\u0631\u0648\u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0627\u0632 \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u062f. \u0627\u06cc\u0646 \u067e\u0644\u062a\u0641\u0631\u0645 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u062a\u0646\u0647\u0627 \u0628\u0627 \u06cc\u06a9 \u0622\u0698\u0627\u0646\u0633 \u0646\u06cc\u0632 \u06a9\u0627\u0631 \u06a9\u0646\u062f.<\/p>\n<p>\u0627\u0632 \u0628\u0627\u0637\u0646\u060c \u0627\u062f\u0645\u06cc\u0646 \u0647\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u0646\u062f \u0622\u0698\u0627\u0646\u0633 \u0647\u0627\u060c \u0627\u0645\u0644\u0627\u06a9\u060c \u0645\u06a9\u0627\u0646 \u0647\u0627\u060c \u0645\u0634\u062a\u0631\u06cc\u0627\u0646 \u0648 \u0631\u0632\u0631\u0648\u0647\u0627 \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u0648 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u0646\u062f.<\/p>\n<p>\u0648\u0642\u062a\u06cc \u0622\u0698\u0627\u0646\u0633\u200c\u0647\u0627\u06cc \u062c\u062f\u06cc\u062f \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc\u200c\u0634\u0648\u0646\u062f\u060c \u0627\u06cc\u0645\u06cc\u0644\u06cc \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f \u06a9\u0647 \u0627\u0632 \u0622\u0646\u0647\u0627 \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u062f \u062d\u0633\u0627\u0628 \u062e\u0648\u062f \u0631\u0627 \u0628\u0631\u0627\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0647 \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u0646\u062f \u062a\u0627 \u0628\u062a\u0648\u0627\u0646\u0646\u062f \u062f\u0627\u0631\u0627\u06cc\u06cc\u200c\u0647\u0627\u060c \u0645\u0634\u062a\u0631\u06cc\u0627\u0646 \u0648 \u0631\u0632\u0631\u0648\u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u0646\u062f.<\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a \u0627\u0633\u062a.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F65tnrihyflhrzqk83de1.png\" alt=\"Backend\" width=\"800\" height=\"384\" title=\"\"><\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u0645\u062f\u06cc\u0631\u0627\u0646 \u0648 \u0622\u0698\u0627\u0646\u0633\u200c\u0647\u0627 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u0646\u062f \u0631\u0632\u0631\u0648\u0647\u0627 \u0631\u0627 \u0628\u0628\u06cc\u0646\u0646\u062f \u0648 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u0646\u062f.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2mm8ndccbtk5kfsgf21i.png\" alt=\"Backend\" width=\"800\" height=\"384\" title=\"\"><\/p>\n<p>\u0627\u06af\u0631 \u0648\u0636\u0639\u06cc\u062a \u0631\u0632\u0631\u0648 \u062a\u063a\u06cc\u06cc\u0631 \u06a9\u0646\u062f\u060c \u0645\u0634\u062a\u0631\u06cc \u0645\u0631\u062a\u0628\u0637 \u06cc\u06a9 \u0627\u0639\u0644\u0627\u0646 \u0648 \u06cc\u06a9 \u0627\u06cc\u0645\u06cc\u0644 \u062f\u0631\u06cc\u0627\u0641\u062a \u062e\u0648\u0627\u0647\u062f \u06a9\u0631\u062f.<\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u0648\u06cc\u0698\u06af\u06cc \u0647\u0627 \u0646\u0645\u0627\u06cc\u0634 \u062f\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u0646\u062f \u0648 \u0645\u06cc \u062a\u0648\u0627\u0646 \u0622\u0646\u0647\u0627 \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0631\u062f.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4g1msqr4acdxq2y61xhc.png\" alt=\"Backend\" width=\"800\" height=\"384\" title=\"\"><\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u0627\u062f\u0645\u06cc\u0646 \u0647\u0627 \u0648 \u0622\u0698\u0627\u0646\u0633 \u0647\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u0646\u062f \u0628\u0627 \u0627\u0631\u0627\u0626\u0647 \u062a\u0635\u0627\u0648\u06cc\u0631 \u0648 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062f\u0627\u0631\u0627\u06cc\u06cc\u060c \u0648\u06cc\u0698\u06af\u06cc \u0647\u0627\u06cc \u062c\u062f\u06cc\u062f \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u0646\u062f. \u0628\u0631\u0627\u06cc \u0644\u063a\u0648 \u0631\u0627\u06cc\u06af\u0627\u0646\u060c \u0622\u0646 \u0631\u0627 \u0631\u0648\u06cc 0 \u0642\u0631\u0627\u0631 \u062f\u0647\u06cc\u062f. \u062f\u0631 \u063a\u06cc\u0631 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a\u060c \u0642\u06cc\u0645\u062a \u06af\u0632\u06cc\u0646\u0647 \u0631\u0627 \u062a\u0639\u06cc\u06cc\u0646 \u06a9\u0646\u06cc\u062f \u06cc\u0627 \u0627\u06af\u0631 \u0646\u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u0622\u0646 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f\u060c \u0622\u0646 \u0631\u0627 \u062e\u0627\u0644\u06cc \u0628\u06af\u0630\u0627\u0631\u06cc\u062f.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6pqp2emo3oqb694nypkz.png\" alt=\"Backend\" width=\"800\" height=\"384\" title=\"\"><\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647\u200c\u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u062f\u06cc\u0631\u0627\u0646 \u0648 \u0622\u0698\u0627\u0646\u0633\u200c\u0647\u0627 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u0646\u062f \u0648\u06cc\u0698\u06af\u06cc\u200c\u0647\u0627 \u0631\u0627 \u0648\u06cc\u0631\u0627\u06cc\u0634 \u06a9\u0646\u0646\u062f.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs9eqfxhry0022wt7rcak.png\" alt=\"Backend\" width=\"800\" height=\"384\" title=\"\"><\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0627\u062f\u0645\u06cc\u0646 \u0647\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u0646\u062f \u0645\u0634\u062a\u0631\u06cc\u0627\u0646 \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u0646\u062f.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbz98mekdpbxyoerf83us.png\" alt=\"Backend\" width=\"800\" height=\"384\" title=\"\"><\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0627\u06af\u0631 \u0622\u0698\u0627\u0646\u0633 \u0628\u062e\u0648\u0627\u0647\u062f \u0627\u0632 \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a \u0631\u0632\u0631\u0648 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u062f\u060c \u0645\u06cc \u062a\u0648\u0627\u0646 \u0631\u0632\u0631\u0648 \u06a9\u0631\u062f. \u062f\u0631 \u063a\u06cc\u0631 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a\u060c \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u0641\u0631\u0622\u06cc\u0646\u062f \u062a\u0633\u0648\u06cc\u0647 \u062d\u0633\u0627\u0628 \u0627\u0632 \u0642\u0633\u0645\u062a \u0638\u0627\u0647\u0631\u06cc \u06cc\u0627 \u0628\u0631\u0646\u0627\u0645\u0647 \u062a\u0644\u0641\u0646 \u0647\u0645\u0631\u0627\u0647 \u062a\u06a9\u0645\u06cc\u0644 \u0634\u062f\u060c \u0631\u0632\u0631\u0648\u0647\u0627 \u0628\u0647 \u0637\u0648\u0631 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u0634\u0648\u0646\u062f.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy6g27go2vu1carqui2pm.png\" alt=\"Backend\" width=\"800\" height=\"384\" title=\"\"><\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u06cc \u0628\u0631\u0627\u06cc \u0648\u06cc\u0631\u0627\u06cc\u0634 \u0631\u0632\u0631\u0648 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fahqr9g172rk2u95y33le.png\" alt=\"Backend\" width=\"800\" height=\"384\" title=\"\"><\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u0622\u0698\u0627\u0646\u0633 \u0647\u0627 \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u06cc\u062f.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpink2tw326mvt77elvxa.png\" alt=\"Backend\" width=\"800\" height=\"384\" title=\"\"><\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u06cc \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u0622\u0698\u0627\u0646\u0633 \u0647\u0627\u06cc \u062c\u062f\u06cc\u062f \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhfqwx56zfff11xcir3w1.png\" alt=\"Backend\" width=\"800\" height=\"384\" title=\"\"><\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u0622\u0698\u0627\u0646\u0633 \u0647\u0627 \u0631\u0627 \u0648\u06cc\u0631\u0627\u06cc\u0634 \u06a9\u0646\u06cc\u062f.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fibabch76l1u28hu8nqe4.png\" alt=\"Backend\" width=\"800\" height=\"384\" title=\"\"><\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646 \u0627\u0645\u0644\u0627\u06a9 \u0622\u0698\u0627\u0646\u0633 \u0647\u0627 \u0631\u0627 \u0645\u0634\u0627\u0647\u062f\u0647 \u06a9\u0631\u062f.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvp3mihxu48l0tn216iqj.png\" alt=\"Backend\" width=\"800\" height=\"384\" title=\"\"><\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0631\u0632\u0631\u0648\u0647\u0627\u06cc \u0645\u0634\u062a\u0631\u06cc \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwxv5etqtzmtaix08oek7.png\" alt=\"Backend\" width=\"800\" height=\"384\" title=\"\"><\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0635\u0641\u062d\u0647 \u0627\u06cc \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f \u06a9\u0647 \u0627\u062f\u0645\u06cc\u0646 \u0647\u0627 \u0648 \u0622\u0698\u0627\u0646\u0633 \u0647\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u0646\u062f \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u062e\u0648\u062f \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u0646\u062f.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fucjcozf0i6nexajr6vxv.png\" alt=\"Backend\" width=\"800\" height=\"384\" title=\"\"><\/p>\n<p>\u0635\u0641\u062d\u0627\u062a \u062f\u06cc\u06af\u0631\u06cc \u0646\u06cc\u0632 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f \u0627\u0645\u0627 \u0627\u06cc\u0646\u0647\u0627 \u0635\u0641\u062d\u0627\u062a \u0627\u0635\u0644\u06cc \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a \u0647\u0633\u062a\u0646\u062f.<\/p>\n<p>\u0647\u0645\u06cc\u0646 \u0627\u0633\u062a. \u0627\u06cc\u0646 \u0635\u0641\u062d\u0627\u062a \u0627\u0635\u0644\u06cc \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a \u0627\u0633\u062a.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"API\"><\/span>\n<p>  API<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fophmghf451hnt947kk1j.png\" alt=\"API\" width=\"721\" height=\"961\" title=\"\"><\/p>\n<p>API \u062a\u0645\u0627\u0645 \u0639\u0645\u0644\u06a9\u0631\u062f\u0647\u0627\u06cc \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u0628\u0631\u0627\u06cc \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a\u060c \u0628\u062e\u0634 \u0638\u0627\u0647\u0631\u06cc \u0648 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0645\u0648\u0628\u0627\u06cc\u0644 \u0631\u0627 \u062f\u0631 \u0645\u0639\u0631\u0636 \u062f\u06cc\u062f \u0642\u0631\u0627\u0631 \u0645\u06cc \u062f\u0647\u062f. API \u0627\u0632 \u0627\u0644\u06af\u0648\u06cc \u0637\u0631\u0627\u062d\u06cc MVC \u067e\u06cc\u0631\u0648\u06cc \u0645\u06cc \u06a9\u0646\u062f. JWT \u0628\u0631\u0627\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f. \u0628\u0631\u062e\u06cc \u0627\u0632 \u062a\u0648\u0627\u0628\u0639 \u0645\u0627\u0646\u0646\u062f \u062a\u0648\u0627\u0628\u0639 \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u0645\u062f\u06cc\u0631\u06cc\u062a \u062f\u0627\u0631\u0627\u06cc\u06cc \u0647\u0627\u060c \u0631\u0632\u0631\u0648\u0647\u0627 \u0648 \u0645\u0634\u062a\u0631\u06cc\u0627\u0646 \u0646\u06cc\u0627\u0632 \u0628\u0647 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u062f\u0627\u0631\u0646\u062f \u0648 \u0628\u0631\u062e\u06cc \u062f\u06cc\u06af\u0631 \u0645\u0627\u0646\u0646\u062f \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0645\u06a9\u0627\u0646 \u0647\u0627 \u0648 \u0648\u06cc\u0698\u06af\u06cc \u0647\u0627\u06cc \u0645\u0648\u062c\u0648\u062f \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u063a\u06cc\u0631 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0646\u06cc\u0627\u0632\u06cc \u0628\u0647 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0646\u062f\u0627\u0631\u0646\u062f:<\/p>\n<ul>\n<li>\u067e\u0648\u0634\u0647 .\/api\/src\/models\/ \u062d\u0627\u0648\u06cc \u0645\u062f\u0644 \u0647\u0627\u06cc MongoDB \u0627\u0633\u062a.<\/li>\n<li>\u067e\u0648\u0634\u0647 .\/api\/src\/routes\/ \u062d\u0627\u0648\u06cc \u0645\u0633\u06cc\u0631\u0647\u0627\u06cc \u0633\u0631\u06cc\u0639 \u0627\u0633\u062a.<\/li>\n<li>\u067e\u0648\u0634\u0647 .\/api\/src\/controllers\/ \u062d\u0627\u0648\u06cc \u06a9\u0646\u062a\u0631\u0644\u0631\u0647\u0627\u06cc\u06cc \u0627\u0633\u062a.<\/li>\n<li>\u067e\u0648\u0634\u0647 .\/api\/src\/middlewares\/ \u062d\u0627\u0648\u06cc \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631 \u0627\u0633\u062a.<\/li>\n<li>.\/api\/src\/config\/env.config.ts \u0634\u0627\u0645\u0644 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0648 \u062a\u0639\u0627\u0631\u06cc\u0641 \u0646\u0648\u0639 TypeScript \u0627\u0633\u062a.<\/li>\n<li>\u067e\u0648\u0634\u0647 .\/api\/src\/lang\/ \u062d\u0627\u0648\u06cc \u0645\u062d\u0644\u06cc \u0633\u0627\u0632\u06cc \u0627\u0633\u062a.<\/li>\n<li>.\/api\/src\/app.ts \u0633\u0631\u0648\u0631 \u0627\u0635\u0644\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u0633\u06cc\u0631\u0647\u0627 \u062f\u0631 \u0622\u0646 \u0628\u0627\u0631\u06af\u06cc\u0631\u06cc \u0645\u06cc \u0634\u0648\u0646\u062f.<\/li>\n<li>.\/api\/index.ts \u0646\u0642\u0637\u0647 \u0648\u0631\u0648\u062f \u0627\u0635\u0644\u06cc API \u0627\u0633\u062a.<\/li>\n<\/ul>\n<p>index.ts \u0646\u0642\u0637\u0647 \u0648\u0631\u0648\u062f \u0627\u0635\u0644\u06cc API \u0627\u0633\u062a:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"k\">import<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">dotenv\/config<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">process<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">node:process<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">fs<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">node:fs\/promises<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">http<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">node:http<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">https<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">ServerOptions<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">node:https<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">app<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/app<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"o\">*<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">databaseHelper<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/common\/databaseHelper<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"o\">*<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">env<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/config\/env.config<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"o\">*<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">logger<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/common\/logger<\/span><span class=\"dl\">'<\/span>\n\n<span class=\"k\">if <\/span><span class=\"p\">(<\/span>\n  <span class=\"k\">await<\/span> <span class=\"nx\">databaseHelper<\/span><span class=\"p\">.<\/span><span class=\"nf\">connect<\/span><span class=\"p\">(<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">DB_URI<\/span><span class=\"p\">,<\/span> <span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">DB_SSL<\/span><span class=\"p\">,<\/span> <span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">DB_DEBUG<\/span><span class=\"p\">)<\/span> \n  <span class=\"o\">&amp;&amp;<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">databaseHelper<\/span><span class=\"p\">.<\/span><span class=\"nf\">initialize<\/span><span class=\"p\">()<\/span>\n<span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">let<\/span> <span class=\"nx\">server<\/span><span class=\"p\">:<\/span> <span class=\"nx\">http<\/span><span class=\"p\">.<\/span><span class=\"nx\">Server<\/span> <span class=\"o\">|<\/span> <span class=\"nx\">https<\/span><span class=\"p\">.<\/span><span class=\"nx\">Server<\/span>\n\n  <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">HTTPS<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nx\">https<\/span><span class=\"p\">.<\/span><span class=\"nx\">globalAgent<\/span><span class=\"p\">.<\/span><span class=\"nx\">maxSockets<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">Number<\/span><span class=\"p\">.<\/span><span class=\"nx\">POSITIVE_INFINITY<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">privateKey<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">fs<\/span><span class=\"p\">.<\/span><span class=\"nf\">readFile<\/span><span class=\"p\">(<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">PRIVATE_KEY<\/span><span class=\"p\">,<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">utf8<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">certificate<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">fs<\/span><span class=\"p\">.<\/span><span class=\"nf\">readFile<\/span><span class=\"p\">(<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">CERTIFICATE<\/span><span class=\"p\">,<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">utf8<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">credentials<\/span><span class=\"p\">:<\/span> <span class=\"nx\">ServerOptions<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span> <span class=\"na\">key<\/span><span class=\"p\">:<\/span> <span class=\"nx\">privateKey<\/span><span class=\"p\">,<\/span> <span class=\"na\">cert<\/span><span class=\"p\">:<\/span> <span class=\"nx\">certificate<\/span> <span class=\"p\">}<\/span>\n    <span class=\"nx\">server<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">https<\/span><span class=\"p\">.<\/span><span class=\"nf\">createServer<\/span><span class=\"p\">(<\/span><span class=\"nx\">credentials<\/span><span class=\"p\">,<\/span> <span class=\"nx\">app<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"nx\">server<\/span><span class=\"p\">.<\/span><span class=\"nf\">listen<\/span><span class=\"p\">(<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">PORT<\/span><span class=\"p\">,<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n      <span class=\"nx\">logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">info<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">HTTPS server is running on Port<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">PORT<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">})<\/span>\n  <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nx\">server<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">listen<\/span><span class=\"p\">(<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">PORT<\/span><span class=\"p\">,<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n      <span class=\"nx\">logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">info<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">HTTP server is running on Port<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">PORT<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">})<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"kd\">const<\/span> <span class=\"nx\">close<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nx\">logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">info<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">Gracefully stopping...<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span>\n    <span class=\"nx\">server<\/span><span class=\"p\">.<\/span><span class=\"nf\">close<\/span><span class=\"p\">(<\/span><span class=\"k\">async <\/span><span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n      <span class=\"nx\">logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">info<\/span><span class=\"p\">(<\/span><span class=\"s2\">`HTTP<\/span><span class=\"p\">${<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">HTTPS<\/span> <span class=\"p\">?<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">S<\/span><span class=\"dl\">'<\/span> <span class=\"p\">:<\/span> <span class=\"dl\">''<\/span><span class=\"p\">}<\/span><span class=\"s2\"> server closed`<\/span><span class=\"p\">)<\/span>\n      <span class=\"k\">await<\/span> <span class=\"nx\">databaseHelper<\/span><span class=\"p\">.<\/span><span class=\"nf\">close<\/span><span class=\"p\">(<\/span><span class=\"kc\">true<\/span><span class=\"p\">)<\/span>\n      <span class=\"nx\">logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">info<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">MongoDB connection closed<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span>\n      <span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nf\">exit<\/span><span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">})<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"p\">[<\/span><span class=\"dl\">'<\/span><span class=\"s1\">SIGINT<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">SIGTERM<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">SIGQUIT<\/span><span class=\"dl\">'<\/span><span class=\"p\">].<\/span><span class=\"nf\">forEach<\/span><span class=\"p\">((<\/span><span class=\"nx\">signal<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nf\">on<\/span><span class=\"p\">(<\/span><span class=\"nx\">signal<\/span><span class=\"p\">,<\/span> <span class=\"nx\">close<\/span><span class=\"p\">))<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0627\u06cc\u0646 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 TypeScript \u0627\u0633\u062a \u06a9\u0647 \u0633\u0631\u0648\u0631 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Node.js \u0648 Express \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u0645\u06cc \u06a9\u0646\u062f. \u0686\u0646\u062f\u06cc\u0646 \u0645\u0627\u0698\u0648\u0644 \u0627\u0632 \u062c\u0645\u0644\u0647 dotenv\u060c process\u060c fs\u060c http\u060c https\u060c mongoose \u0648 app \u0631\u0627 \u0648\u0627\u0631\u062f \u0645\u06cc \u06a9\u0646\u062f. \u0633\u067e\u0633 \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0622\u06cc\u0627 \u0645\u062a\u063a\u06cc\u0631 \u0645\u062d\u06cc\u0637 HTTPS \u0631\u0648\u06cc true \u062a\u0646\u0638\u06cc\u0645 \u0634\u062f\u0647 \u0627\u0633\u062a \u06cc\u0627 \u062e\u06cc\u0631\u060c \u0648 \u062f\u0631 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a\u060c \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0645\u0627\u0698\u0648\u0644 https \u0648 \u06a9\u0644\u06cc\u062f \u062e\u0635\u0648\u0635\u06cc \u0648 \u06af\u0648\u0627\u0647\u06cc \u0627\u0631\u0627\u0626\u0647 \u0634\u062f\u0647\u060c \u06cc\u06a9 \u0633\u0631\u0648\u0631 HTTPS \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u062f. \u062f\u0631 \u063a\u06cc\u0631 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0645\u0627\u0698\u0648\u0644 http \u06cc\u06a9 \u0633\u0631\u0648\u0631 HTTP \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u062f. \u0633\u0631\u0648\u0631 \u0628\u0647 \u067e\u0648\u0631\u062a \u0645\u0634\u062e\u0635 \u0634\u062f\u0647 \u062f\u0631 \u0645\u062a\u063a\u06cc\u0631 \u0645\u062d\u06cc\u0637\u06cc PORT \u06af\u0648\u0634 \u0645\u06cc \u062f\u0647\u062f.<\/p>\n<p>\u0639\u0645\u0644\u06a9\u0631\u062f \u0628\u0633\u062a\u0647 \u0628\u0647 \u06af\u0648\u0646\u0647 \u0627\u06cc \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 \u0627\u0633\u062a \u06a9\u0647 \u0647\u0646\u06af\u0627\u0645 \u062f\u0631\u06cc\u0627\u0641\u062a \u0633\u06cc\u06af\u0646\u0627\u0644 \u062e\u0627\u062a\u0645\u0647\u060c \u0633\u0631\u0648\u0631 \u0631\u0627 \u0628\u0647 \u0637\u0631\u0632 \u062f\u0644\u067e\u0630\u06cc\u0631\u06cc \u0645\u062a\u0648\u0642\u0641 \u06a9\u0646\u062f. \u0633\u0631\u0648\u0631 \u0648 \u0627\u062a\u0635\u0627\u0644 MongoDB \u0631\u0627 \u0645\u06cc\u200c\u0628\u0646\u062f\u062f \u0648 \u0633\u067e\u0633 \u0628\u0627 \u06a9\u062f \u0648\u0636\u0639\u06cc\u062a 0 \u0627\u0632 \u0641\u0631\u0622\u06cc\u0646\u062f \u062e\u0627\u0631\u062c \u0645\u06cc\u200c\u0634\u0648\u062f. \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a\u060c \u062a\u0627\u0628\u0639 \u0628\u0633\u062a\u0646 \u0631\u0627 \u062b\u0628\u062a \u0645\u06cc\u200c\u06a9\u0646\u062f \u062a\u0627 \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u0641\u0631\u0622\u06cc\u0646\u062f \u0633\u06cc\u06af\u0646\u0627\u0644 SIGINT\u060c SIGTERM \u06cc\u0627 SIGQUIT \u0631\u0627 \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc\u200c\u06a9\u0646\u062f\u060c \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u0634\u0648\u062f.<\/p>\n<p>app.ts \u0646\u0642\u0637\u0647 \u0648\u0631\u0648\u062f \u0627\u0635\u0644\u06cc api \u0627\u0633\u062a:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"k\">import<\/span> <span class=\"nx\">express<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">express<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">compression<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">compression<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">helmet<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">helmet<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">nocache<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">nocache<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">cookieParser<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">cookie-parser<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">i18n<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/lang\/i18n<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"o\">*<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">env<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/config\/env.config<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">cors<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/middlewares\/cors<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">allowedMethods<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/middlewares\/allowedMethods<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">agencyRoutes<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/routes\/agencyRoutes<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">bookingRoutes<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/routes\/bookingRoutes<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">locationRoutes<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/routes\/locationRoutes<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">notificationRoutes<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/routes\/notificationRoutes<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">propertyRoutes<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/routes\/propertyRoutes<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">userRoutes<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/routes\/userRoutes<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">stripeRoutes<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/routes\/stripeRoutes<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">countryRoutes<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/routes\/countryRoutes<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"o\">*<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">helper<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/common\/helper<\/span><span class=\"dl\">'<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">app<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">express<\/span><span class=\"p\">()<\/span>\n\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">use<\/span><span class=\"p\">(<\/span><span class=\"nx\">helmet<\/span><span class=\"p\">.<\/span><span class=\"nf\">contentSecurityPolicy<\/span><span class=\"p\">())<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">use<\/span><span class=\"p\">(<\/span><span class=\"nx\">helmet<\/span><span class=\"p\">.<\/span><span class=\"nf\">dnsPrefetchControl<\/span><span class=\"p\">())<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">use<\/span><span class=\"p\">(<\/span><span class=\"nx\">helmet<\/span><span class=\"p\">.<\/span><span class=\"nf\">crossOriginEmbedderPolicy<\/span><span class=\"p\">())<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">use<\/span><span class=\"p\">(<\/span><span class=\"nx\">helmet<\/span><span class=\"p\">.<\/span><span class=\"nf\">frameguard<\/span><span class=\"p\">())<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">use<\/span><span class=\"p\">(<\/span><span class=\"nx\">helmet<\/span><span class=\"p\">.<\/span><span class=\"nf\">hidePoweredBy<\/span><span class=\"p\">())<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">use<\/span><span class=\"p\">(<\/span><span class=\"nx\">helmet<\/span><span class=\"p\">.<\/span><span class=\"nf\">hsts<\/span><span class=\"p\">())<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">use<\/span><span class=\"p\">(<\/span><span class=\"nx\">helmet<\/span><span class=\"p\">.<\/span><span class=\"nf\">ieNoOpen<\/span><span class=\"p\">())<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">use<\/span><span class=\"p\">(<\/span><span class=\"nx\">helmet<\/span><span class=\"p\">.<\/span><span class=\"nf\">noSniff<\/span><span class=\"p\">())<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">use<\/span><span class=\"p\">(<\/span><span class=\"nx\">helmet<\/span><span class=\"p\">.<\/span><span class=\"nf\">permittedCrossDomainPolicies<\/span><span class=\"p\">())<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">use<\/span><span class=\"p\">(<\/span><span class=\"nx\">helmet<\/span><span class=\"p\">.<\/span><span class=\"nf\">referrerPolicy<\/span><span class=\"p\">())<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">use<\/span><span class=\"p\">(<\/span><span class=\"nx\">helmet<\/span><span class=\"p\">.<\/span><span class=\"nf\">xssFilter<\/span><span class=\"p\">())<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">use<\/span><span class=\"p\">(<\/span><span class=\"nx\">helmet<\/span><span class=\"p\">.<\/span><span class=\"nf\">originAgentCluster<\/span><span class=\"p\">())<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">use<\/span><span class=\"p\">(<\/span><span class=\"nx\">helmet<\/span><span class=\"p\">.<\/span><span class=\"nf\">crossOriginResourcePolicy<\/span><span class=\"p\">({<\/span> <span class=\"na\">policy<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">cross-origin<\/span><span class=\"dl\">'<\/span> <span class=\"p\">}))<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">use<\/span><span class=\"p\">(<\/span><span class=\"nx\">helmet<\/span><span class=\"p\">.<\/span><span class=\"nf\">crossOriginOpenerPolicy<\/span><span class=\"p\">())<\/span>\n\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">use<\/span><span class=\"p\">(<\/span><span class=\"nf\">nocache<\/span><span class=\"p\">())<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">use<\/span><span class=\"p\">(<\/span><span class=\"nf\">compression<\/span><span class=\"p\">({<\/span> <span class=\"na\">threshold<\/span><span class=\"p\">:<\/span> <span class=\"mi\">0<\/span> <span class=\"p\">}))<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">use<\/span><span class=\"p\">(<\/span><span class=\"nx\">express<\/span><span class=\"p\">.<\/span><span class=\"nf\">urlencoded<\/span><span class=\"p\">({<\/span> <span class=\"na\">limit<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">50mb<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">extended<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span> <span class=\"p\">}))<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">use<\/span><span class=\"p\">(<\/span><span class=\"nx\">express<\/span><span class=\"p\">.<\/span><span class=\"nf\">json<\/span><span class=\"p\">({<\/span> <span class=\"na\">limit<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">50mb<\/span><span class=\"dl\">'<\/span> <span class=\"p\">}))<\/span>\n\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">use<\/span><span class=\"p\">(<\/span><span class=\"nf\">cors<\/span><span class=\"p\">())<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">options<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">*<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nf\">cors<\/span><span class=\"p\">())<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">use<\/span><span class=\"p\">(<\/span><span class=\"nf\">cookieParser<\/span><span class=\"p\">(<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">COOKIE_SECRET<\/span><span class=\"p\">))<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">use<\/span><span class=\"p\">(<\/span><span class=\"nx\">allowedMethods<\/span><span class=\"p\">)<\/span>\n\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">use<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">\/<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">agencyRoutes<\/span><span class=\"p\">)<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">use<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">\/<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">bookingRoutes<\/span><span class=\"p\">)<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">use<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">\/<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">locationRoutes<\/span><span class=\"p\">)<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">use<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">\/<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">notificationRoutes<\/span><span class=\"p\">)<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">use<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">\/<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">propertyRoutes<\/span><span class=\"p\">)<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">use<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">\/<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">userRoutes<\/span><span class=\"p\">)<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">use<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">\/<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">stripeRoutes<\/span><span class=\"p\">)<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">use<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">\/<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">countryRoutes<\/span><span class=\"p\">)<\/span>\n\n<span class=\"nx\">i18n<\/span><span class=\"p\">.<\/span><span class=\"nx\">locale<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">DEFAULT_LANGUAGE<\/span>\n\n<span class=\"nx\">helper<\/span><span class=\"p\">.<\/span><span class=\"nf\">mkdir<\/span><span class=\"p\">(<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">CDN_USERS<\/span><span class=\"p\">)<\/span>\n<span class=\"nx\">helper<\/span><span class=\"p\">.<\/span><span class=\"nf\">mkdir<\/span><span class=\"p\">(<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">CDN_TEMP_USERS<\/span><span class=\"p\">)<\/span>\n<span class=\"nx\">helper<\/span><span class=\"p\">.<\/span><span class=\"nf\">mkdir<\/span><span class=\"p\">(<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">CDN_PROPERTIES<\/span><span class=\"p\">)<\/span>\n<span class=\"nx\">helper<\/span><span class=\"p\">.<\/span><span class=\"nf\">mkdir<\/span><span class=\"p\">(<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">CDN_TEMP_PROPERTIES<\/span><span class=\"p\">)<\/span>\n<span class=\"nx\">helper<\/span><span class=\"p\">.<\/span><span class=\"nf\">mkdir<\/span><span class=\"p\">(<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">CDN_LOCATIONS<\/span><span class=\"p\">)<\/span>\n<span class=\"nx\">helper<\/span><span class=\"p\">.<\/span><span class=\"nf\">mkdir<\/span><span class=\"p\">(<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">CDN_TEMP_LOCATIONS<\/span><span class=\"p\">)<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nx\">app<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0627\u0648\u0644 \u0627\u0632 \u0647\u0645\u0647\u060c \u0631\u0634\u062a\u0647 \u0627\u062a\u0635\u0627\u0644 MongoDB \u0631\u0627 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0645\u06cc \u06a9\u0646\u06cc\u0645\u060c \u0633\u067e\u0633 \u0628\u0627 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 MongoDB \u0627\u0631\u062a\u0628\u0627\u0637 \u0628\u0631\u0642\u0631\u0627\u0631 \u0645\u06cc \u06a9\u0646\u06cc\u0645. \u0633\u067e\u0633 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 Express \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u0648 \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631\u0647\u0627\u06cc\u06cc \u0645\u0627\u0646\u0646\u062f cors\u060c compression\u060c helmet \u0648 nocache \u0631\u0627 \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u0645\u06cc \u06a9\u0646\u06cc\u0645. \u0645\u0627 \u0627\u0642\u062f\u0627\u0645\u0627\u062a \u0627\u0645\u0646\u06cc\u062a\u06cc \u0645\u062e\u062a\u0644\u0641\u06cc \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631 \u06a9\u0644\u0627\u0647 \u0627\u06cc\u0645\u0646\u06cc \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0631\u062f\u06cc\u0645. \u0645\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u0645\u0633\u06cc\u0631\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0628\u062e\u0634\u200c\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0627\u0646\u0646\u062f providerRoutes\u060c bookingRoutes\u060c locationRoutes\u060c notificationRoutes\u060c milkRoutes \u0648 userRoutes \u0648\u0627\u0631\u062f \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645. \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a\u060c \u0645\u0633\u06cc\u0631\u0647\u0627\u06cc \u0627\u06a9\u0633\u067e\u0631\u0633 \u0648 \u0628\u0631\u0646\u0627\u0645\u0647 \u0635\u0627\u062f\u0631\u0627\u062a \u0631\u0627 \u0628\u0627\u0631\u06af\u06cc\u0631\u06cc \u0645\u06cc \u06a9\u0646\u06cc\u0645.<\/p>\n<p>8 \u0645\u0633\u06cc\u0631 \u062f\u0631 API \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f. \u0647\u0631 \u0645\u0633\u06cc\u0631 \u062f\u0627\u0631\u0627\u06cc \u06a9\u0646\u062a\u0631\u0644\u0631 \u0645\u062e\u0635\u0648\u0635 \u0628\u0647 \u062e\u0648\u062f \u0627\u0633\u062a \u06a9\u0647 \u0627\u0632 \u0627\u0644\u06af\u0648\u06cc \u0637\u0631\u0627\u062d\u06cc MVC \u0648 \u0627\u0635\u0648\u0644 SOLID \u067e\u06cc\u0631\u0648\u06cc \u0645\u06cc \u06a9\u0646\u062f. \u062f\u0631 \u0632\u06cc\u0631 \u0645\u0633\u06cc\u0631\u0647\u0627\u06cc \u0627\u0635\u0644\u06cc \u0622\u0645\u062f\u0647 \u0627\u0633\u062a:<\/p>\n<ul>\n<li>userRoutes: \u062a\u0648\u0627\u0628\u0639 REST \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f<\/li>\n<li>AgencyRoutes: \u062a\u0648\u0627\u0628\u0639 REST \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u0622\u0698\u0627\u0646\u0633 \u0647\u0627 \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f<\/li>\n<li>countryRoutes: \u062a\u0648\u0627\u0628\u0639 REST \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u06a9\u0634\u0648\u0631\u0647\u0627 \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f<\/li>\n<li>locationRoutes: \u062a\u0648\u0627\u0628\u0639 REST \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u0645\u06a9\u0627\u0646 \u0647\u0627 \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f<\/li>\n<li>PropertyRoutes: \u062a\u0648\u0627\u0628\u0639 REST \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u062e\u0648\u0627\u0635 \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f<\/li>\n<li>bookingRoutes: \u0639\u0645\u0644\u06a9\u0631\u062f\u0647\u0627\u06cc REST \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u0631\u0632\u0631\u0648 \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f<\/li>\n<li>notificationRoutes: \u062a\u0648\u0627\u0628\u0639 REST \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u0627\u0639\u0644\u0627\u0646 \u0647\u0627 \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f<\/li>\n<li>stripeRoutes: \u062a\u0648\u0627\u0628\u0639 REST \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u062f\u0631\u06af\u0627\u0647 \u067e\u0631\u062f\u0627\u062e\u062a Stripe \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f<\/li>\n<\/ul>\n<p>\u0642\u0631\u0627\u0631 \u0646\u06cc\u0633\u062a \u0647\u0631 \u0645\u0633\u06cc\u0631 \u0631\u0627 \u06cc\u06a9\u06cc \u06cc\u06a9\u06cc \u062a\u0648\u0636\u06cc\u062d \u062f\u0647\u06cc\u0645. \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644 PropertyRoutes \u0631\u0627 \u0645\u06cc \u06af\u06cc\u0631\u06cc\u0645 \u0648 \u0645\u06cc \u0628\u06cc\u0646\u06cc\u0645 \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u0633\u0627\u062e\u062a\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a. \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u06a9\u062f \u0645\u0646\u0628\u0639 \u0631\u0627 \u0645\u0631\u0648\u0631 \u06a9\u0646\u06cc\u062f \u0648 \u0647\u0645\u0647 \u0645\u0633\u06cc\u0631\u0647\u0627 \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f.<\/p>\n<p>\u0627\u06cc\u0646\u062c\u0627 milkRoutes.ts \u0627\u0633\u062a:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"k\">import<\/span> <span class=\"nx\">express<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">express<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">multer<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">multer<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">routeNames<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/config\/propertyRoutes.config<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">authJwt<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/middlewares\/authJwt<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"o\">*<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">propertyController<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/controllers\/propertyController<\/span><span class=\"dl\">'<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">routes<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">express<\/span><span class=\"p\">.<\/span><span class=\"nc\">Router<\/span><span class=\"p\">()<\/span>\n\n<span class=\"nx\">routes<\/span><span class=\"p\">.<\/span><span class=\"nf\">route<\/span><span class=\"p\">(<\/span><span class=\"nx\">routeNames<\/span><span class=\"p\">.<\/span><span class=\"nx\">create<\/span><span class=\"p\">).<\/span><span class=\"nf\">post<\/span><span class=\"p\">(<\/span><span class=\"nx\">authJwt<\/span><span class=\"p\">.<\/span><span class=\"nx\">verifyToken<\/span><span class=\"p\">,<\/span> <span class=\"nx\">propertyController<\/span><span class=\"p\">.<\/span><span class=\"nx\">create<\/span><span class=\"p\">)<\/span>\n<span class=\"nx\">routes<\/span><span class=\"p\">.<\/span><span class=\"nf\">route<\/span><span class=\"p\">(<\/span><span class=\"nx\">routeNames<\/span><span class=\"p\">.<\/span><span class=\"nx\">update<\/span><span class=\"p\">).<\/span><span class=\"nf\">put<\/span><span class=\"p\">(<\/span><span class=\"nx\">authJwt<\/span><span class=\"p\">.<\/span><span class=\"nx\">verifyToken<\/span><span class=\"p\">,<\/span> <span class=\"nx\">propertyController<\/span><span class=\"p\">.<\/span><span class=\"nx\">update<\/span><span class=\"p\">)<\/span>\n<span class=\"nx\">routes<\/span><span class=\"p\">.<\/span><span class=\"nf\">route<\/span><span class=\"p\">(<\/span><span class=\"nx\">routeNames<\/span><span class=\"p\">.<\/span><span class=\"nx\">checkProperty<\/span><span class=\"p\">).<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"nx\">authJwt<\/span><span class=\"p\">.<\/span><span class=\"nx\">verifyToken<\/span><span class=\"p\">,<\/span> <span class=\"nx\">propertyController<\/span><span class=\"p\">.<\/span><span class=\"nx\">checkProperty<\/span><span class=\"p\">)<\/span>\n<span class=\"nx\">routes<\/span><span class=\"p\">.<\/span><span class=\"nf\">route<\/span><span class=\"p\">(<\/span><span class=\"nx\">routeNames<\/span><span class=\"p\">.<\/span><span class=\"k\">delete<\/span><span class=\"p\">).<\/span><span class=\"k\">delete<\/span><span class=\"p\">(<\/span><span class=\"nx\">authJwt<\/span><span class=\"p\">.<\/span><span class=\"nx\">verifyToken<\/span><span class=\"p\">,<\/span> <span class=\"nx\">propertyController<\/span><span class=\"p\">.<\/span><span class=\"nx\">deleteProperty<\/span><span class=\"p\">)<\/span>\n<span class=\"nx\">routes<\/span><span class=\"p\">.<\/span><span class=\"nf\">route<\/span><span class=\"p\">(<\/span><span class=\"nx\">routeNames<\/span><span class=\"p\">.<\/span><span class=\"nx\">uploadImage<\/span><span class=\"p\">).<\/span><span class=\"nf\">post<\/span><span class=\"p\">([<\/span><span class=\"nx\">authJwt<\/span><span class=\"p\">.<\/span><span class=\"nx\">verifyToken<\/span><span class=\"p\">,<\/span> <span class=\"nf\">multer<\/span><span class=\"p\">({<\/span> <span class=\"na\">storage<\/span><span class=\"p\">:<\/span> <span class=\"nx\">multer<\/span><span class=\"p\">.<\/span><span class=\"nf\">memoryStorage<\/span><span class=\"p\">()<\/span> <span class=\"p\">}).<\/span><span class=\"nf\">single<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">image<\/span><span class=\"dl\">'<\/span><span class=\"p\">)],<\/span> <span class=\"nx\">propertyController<\/span><span class=\"p\">.<\/span><span class=\"nx\">uploadImage<\/span><span class=\"p\">)<\/span>\n<span class=\"nx\">routes<\/span><span class=\"p\">.<\/span><span class=\"nf\">route<\/span><span class=\"p\">(<\/span><span class=\"nx\">routeNames<\/span><span class=\"p\">.<\/span><span class=\"nx\">deleteImage<\/span><span class=\"p\">).<\/span><span class=\"nf\">post<\/span><span class=\"p\">(<\/span><span class=\"nx\">authJwt<\/span><span class=\"p\">.<\/span><span class=\"nx\">verifyToken<\/span><span class=\"p\">,<\/span> <span class=\"nx\">propertyController<\/span><span class=\"p\">.<\/span><span class=\"nx\">deleteImage<\/span><span class=\"p\">)<\/span>\n<span class=\"nx\">routes<\/span><span class=\"p\">.<\/span><span class=\"nf\">route<\/span><span class=\"p\">(<\/span><span class=\"nx\">routeNames<\/span><span class=\"p\">.<\/span><span class=\"nx\">deleteTempImage<\/span><span class=\"p\">).<\/span><span class=\"nf\">post<\/span><span class=\"p\">(<\/span><span class=\"nx\">authJwt<\/span><span class=\"p\">.<\/span><span class=\"nx\">verifyToken<\/span><span class=\"p\">,<\/span> <span class=\"nx\">propertyController<\/span><span class=\"p\">.<\/span><span class=\"nx\">deleteTempImage<\/span><span class=\"p\">)<\/span>\n<span class=\"nx\">routes<\/span><span class=\"p\">.<\/span><span class=\"nf\">route<\/span><span class=\"p\">(<\/span><span class=\"nx\">routeNames<\/span><span class=\"p\">.<\/span><span class=\"nx\">getProperty<\/span><span class=\"p\">).<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"nx\">propertyController<\/span><span class=\"p\">.<\/span><span class=\"nx\">getProperty<\/span><span class=\"p\">)<\/span>\n<span class=\"nx\">routes<\/span><span class=\"p\">.<\/span><span class=\"nf\">route<\/span><span class=\"p\">(<\/span><span class=\"nx\">routeNames<\/span><span class=\"p\">.<\/span><span class=\"nx\">getProperties<\/span><span class=\"p\">).<\/span><span class=\"nf\">post<\/span><span class=\"p\">(<\/span><span class=\"nx\">authJwt<\/span><span class=\"p\">.<\/span><span class=\"nx\">verifyToken<\/span><span class=\"p\">,<\/span> <span class=\"nx\">propertyController<\/span><span class=\"p\">.<\/span><span class=\"nx\">getProperties<\/span><span class=\"p\">)<\/span>\n<span class=\"nx\">routes<\/span><span class=\"p\">.<\/span><span class=\"nf\">route<\/span><span class=\"p\">(<\/span><span class=\"nx\">routeNames<\/span><span class=\"p\">.<\/span><span class=\"nx\">getBookingProperties<\/span><span class=\"p\">).<\/span><span class=\"nf\">post<\/span><span class=\"p\">(<\/span><span class=\"nx\">authJwt<\/span><span class=\"p\">.<\/span><span class=\"nx\">verifyToken<\/span><span class=\"p\">,<\/span> <span class=\"nx\">propertyController<\/span><span class=\"p\">.<\/span><span class=\"nx\">getBookingProperties<\/span><span class=\"p\">)<\/span>\n<span class=\"nx\">routes<\/span><span class=\"p\">.<\/span><span class=\"nf\">route<\/span><span class=\"p\">(<\/span><span class=\"nx\">routeNames<\/span><span class=\"p\">.<\/span><span class=\"nx\">getFrontendProperties<\/span><span class=\"p\">).<\/span><span class=\"nf\">post<\/span><span class=\"p\">(<\/span><span class=\"nx\">propertyController<\/span><span class=\"p\">.<\/span><span class=\"nx\">getFrontendProperties<\/span><span class=\"p\">)<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nx\">routes<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0627\u0648\u0644 \u0627\u0632 \u0647\u0645\u0647\u060c \u0645\u0627 \u06cc\u06a9 \u0631\u0648\u062a\u0631 Express \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u06cc\u0645. \u0633\u067e\u0633 \u0645\u0633\u06cc\u0631\u0647\u0627 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0646\u0627\u0645\u060c \u0645\u062a\u062f\u060c \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631\u0647\u0627 \u0648 \u06a9\u0646\u062a\u0631\u0644\u0631\u0647\u0627\u06cc \u0622\u0646\u0647\u0627 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u06cc\u0645.<\/p>\n<p>routeNames \u062d\u0627\u0648\u06cc \u0648\u06cc\u0698\u06af\u06cc Routes \u0646\u0627\u0645 \u0645\u0633\u06cc\u0631 \u0627\u0633\u062a:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"kd\">const<\/span> <span class=\"nx\">routes<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n  <span class=\"na\">create<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">\/api\/create-property<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">update<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">\/api\/update-property<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">delete<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">\/api\/delete-property\/:id<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">uploadImage<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">\/api\/upload-property-image<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">deleteTempImage<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">\/api\/delete-temp-property-image\/:fileName<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">deleteImage<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">\/api\/delete-property-image\/:property\/:image<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">getProperty<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">\/api\/property\/:id\/:language<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">getProperties<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">\/api\/properties\/:page\/:size<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">getBookingProperties<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">\/api\/booking-properties\/:page\/:size<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">getFrontendProperties<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">\/api\/frontend-properties\/:page\/:size<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">checkProperty<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">\/api\/check-property\/:id<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nx\">routes<\/span>\n<\/code><\/pre>\n<\/div>\n<p>PropertyController \u062d\u0627\u0648\u06cc \u0645\u0646\u0637\u0642 \u0627\u0635\u0644\u06cc \u06a9\u0633\u0628 \u0648 \u06a9\u0627\u0631 \u062f\u0631 \u0645\u0648\u0631\u062f \u0645\u06a9\u0627\u0646 \u0647\u0627 \u0627\u0633\u062a. \u0645\u0627 \u0642\u0635\u062f \u0646\u062f\u0627\u0631\u06cc\u0645 \u062a\u0645\u0627\u0645 \u06a9\u062f \u0645\u0646\u0628\u0639 \u06a9\u0646\u062a\u0631\u0644\u0631 \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u0645 \u0632\u06cc\u0631\u0627 \u0628\u0633\u06cc\u0627\u0631 \u0628\u0632\u0631\u06af \u0627\u0633\u062a\u060c \u0627\u0645\u0627 \u0628\u0631\u0627\u06cc \u0645\u062b\u0627\u0644 \u062a\u0627\u0628\u0639 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u062a\u0631\u0644\u0631 \u0631\u0627 \u062f\u0631 \u0646\u0638\u0631 \u0645\u06cc \u06af\u06cc\u0631\u06cc\u0645.<\/p>\n<p>\u0645\u062f\u0644 \u0645\u0644\u06a9 \u062f\u0631 \u0632\u06cc\u0631 \u0622\u0645\u062f\u0647 \u0627\u0633\u062a:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Schema<\/span><span class=\"p\">,<\/span> <span class=\"nx\">model<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">mongoose<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"o\">*<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">movininTypes<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">:movinin-types<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"o\">*<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">env<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/config\/env.config<\/span><span class=\"dl\">'<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">propertySchema<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">Schema<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">Property<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span>\n  <span class=\"p\">{<\/span>\n    <span class=\"na\">name<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"nb\">String<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">required<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"kc\">true<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">can't be blank<\/span><span class=\"dl\">\"<\/span><span class=\"p\">],<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"nb\">String<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">enum<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\n        <span class=\"nx\">movininTypes<\/span><span class=\"p\">.<\/span><span class=\"nx\">PropertyType<\/span><span class=\"p\">.<\/span><span class=\"nx\">House<\/span><span class=\"p\">,<\/span>\n        <span class=\"nx\">movininTypes<\/span><span class=\"p\">.<\/span><span class=\"nx\">PropertyType<\/span><span class=\"p\">.<\/span><span class=\"nx\">Apartment<\/span><span class=\"p\">,<\/span>\n        <span class=\"nx\">movininTypes<\/span><span class=\"p\">.<\/span><span class=\"nx\">PropertyType<\/span><span class=\"p\">.<\/span><span class=\"nx\">Townhouse<\/span><span class=\"p\">,<\/span>\n        <span class=\"nx\">movininTypes<\/span><span class=\"p\">.<\/span><span class=\"nx\">PropertyType<\/span><span class=\"p\">.<\/span><span class=\"nx\">Plot<\/span><span class=\"p\">,<\/span>\n        <span class=\"nx\">movininTypes<\/span><span class=\"p\">.<\/span><span class=\"nx\">PropertyType<\/span><span class=\"p\">.<\/span><span class=\"nx\">Farm<\/span><span class=\"p\">,<\/span>\n        <span class=\"nx\">movininTypes<\/span><span class=\"p\">.<\/span><span class=\"nx\">PropertyType<\/span><span class=\"p\">.<\/span><span class=\"nx\">Commercial<\/span><span class=\"p\">,<\/span>\n        <span class=\"nx\">movininTypes<\/span><span class=\"p\">.<\/span><span class=\"nx\">PropertyType<\/span><span class=\"p\">.<\/span><span class=\"nx\">Industrial<\/span><span class=\"p\">,<\/span>\n      <span class=\"p\">],<\/span>\n      <span class=\"na\">required<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"kc\">true<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">can't be blank<\/span><span class=\"dl\">\"<\/span><span class=\"p\">],<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"na\">agency<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Schema<\/span><span class=\"p\">.<\/span><span class=\"nx\">Types<\/span><span class=\"p\">.<\/span><span class=\"nx\">ObjectId<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">required<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"kc\">true<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">can't be blank<\/span><span class=\"dl\">\"<\/span><span class=\"p\">],<\/span>\n      <span class=\"na\">ref<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">User<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">index<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"na\">description<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"nb\">String<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">required<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"kc\">true<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">can't be blank<\/span><span class=\"dl\">\"<\/span><span class=\"p\">],<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"na\">available<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Boolean<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">default<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"na\">image<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"nb\">String<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"na\">images<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"nb\">String<\/span><span class=\"p\">],<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"na\">bedrooms<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Number<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">required<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"kc\">true<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">can't be blank<\/span><span class=\"dl\">\"<\/span><span class=\"p\">],<\/span>\n      <span class=\"na\">validate<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">validator<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Number<\/span><span class=\"p\">.<\/span><span class=\"nx\">isInteger<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">message<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">{VALUE} is not an integer value<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n      <span class=\"p\">},<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"na\">bathrooms<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Number<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">required<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"kc\">true<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">can't be blank<\/span><span class=\"dl\">\"<\/span><span class=\"p\">],<\/span>\n      <span class=\"na\">validate<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">validator<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Number<\/span><span class=\"p\">.<\/span><span class=\"nx\">isInteger<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">message<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">{VALUE} is not an integer value<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n      <span class=\"p\">},<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"na\">kitchens<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Number<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">default<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">validate<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">validator<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Number<\/span><span class=\"p\">.<\/span><span class=\"nx\">isInteger<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">message<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">{VALUE} is not an integer value<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n      <span class=\"p\">},<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"na\">parkingSpaces<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Number<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">default<\/span><span class=\"p\">:<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">validate<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">validator<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Number<\/span><span class=\"p\">.<\/span><span class=\"nx\">isInteger<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">message<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">{VALUE} is not an integer value<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n      <span class=\"p\">},<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"na\">size<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Number<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"na\">petsAllowed<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Boolean<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">required<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"kc\">true<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">can't be blank<\/span><span class=\"dl\">\"<\/span><span class=\"p\">],<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"na\">furnished<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Boolean<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">required<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"kc\">true<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">can't be blank<\/span><span class=\"dl\">\"<\/span><span class=\"p\">],<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"na\">minimumAge<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Number<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">required<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"kc\">true<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">can't be blank<\/span><span class=\"dl\">\"<\/span><span class=\"p\">],<\/span>\n      <span class=\"na\">min<\/span><span class=\"p\">:<\/span> <span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">MINIMUM_AGE<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">max<\/span><span class=\"p\">:<\/span> <span class=\"mi\">99<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"na\">location<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Schema<\/span><span class=\"p\">.<\/span><span class=\"nx\">Types<\/span><span class=\"p\">.<\/span><span class=\"nx\">ObjectId<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">ref<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">Location<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">required<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"kc\">true<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">can't be blank<\/span><span class=\"dl\">\"<\/span><span class=\"p\">],<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"na\">address<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"nb\">String<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"na\">price<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Number<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">required<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"kc\">true<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">can't be blank<\/span><span class=\"dl\">\"<\/span><span class=\"p\">],<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"na\">hidden<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Boolean<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">default<\/span><span class=\"p\">:<\/span> <span class=\"kc\">false<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"na\">cancellation<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Number<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">default<\/span><span class=\"p\">:<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"na\">aircon<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Boolean<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">default<\/span><span class=\"p\">:<\/span> <span class=\"kc\">false<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"na\">rentalTerm<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"nb\">String<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">enum<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\n        <span class=\"nx\">movininTypes<\/span><span class=\"p\">.<\/span><span class=\"nx\">RentalTerm<\/span><span class=\"p\">.<\/span><span class=\"nx\">Monthly<\/span><span class=\"p\">,<\/span>\n        <span class=\"nx\">movininTypes<\/span><span class=\"p\">.<\/span><span class=\"nx\">RentalTerm<\/span><span class=\"p\">.<\/span><span class=\"nx\">Weekly<\/span><span class=\"p\">,<\/span>\n        <span class=\"nx\">movininTypes<\/span><span class=\"p\">.<\/span><span class=\"nx\">RentalTerm<\/span><span class=\"p\">.<\/span><span class=\"nx\">Daily<\/span><span class=\"p\">,<\/span>\n        <span class=\"nx\">movininTypes<\/span><span class=\"p\">.<\/span><span class=\"nx\">RentalTerm<\/span><span class=\"p\">.<\/span><span class=\"nx\">Yearly<\/span><span class=\"p\">,<\/span>\n      <span class=\"p\">],<\/span>\n      <span class=\"na\">required<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"kc\">true<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">can't be blank<\/span><span class=\"dl\">\"<\/span><span class=\"p\">],<\/span>\n    <span class=\"p\">},<\/span>\n  <span class=\"p\">},<\/span>\n  <span class=\"p\">{<\/span>\n    <span class=\"na\">timestamps<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">strict<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">collection<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">Property<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n  <span class=\"p\">},<\/span>\n<span class=\"p\">)<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">Property<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">model<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">Property<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">Property<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">propertySchema<\/span><span class=\"p\">)<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nx\">Property<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u0646\u0648\u0639 \u0645\u0644\u06a9 \u0622\u0645\u062f\u0647 \u0627\u0633\u062a:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"k\">export<\/span> <span class=\"kr\">interface<\/span> <span class=\"nx\">Property<\/span> <span class=\"kd\">extends<\/span> <span class=\"nx\">Document<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nl\">name<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span>\n  <span class=\"kd\">type<\/span><span class=\"p\">:<\/span> <span class=\"nx\">movininTypes<\/span><span class=\"p\">.<\/span><span class=\"nx\">PropertyType<\/span>\n  <span class=\"nx\">agency<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Types<\/span><span class=\"p\">.<\/span><span class=\"nx\">ObjectId<\/span>\n  <span class=\"nx\">description<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span>\n  <span class=\"nx\">image<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span>\n  <span class=\"nx\">images<\/span><span class=\"p\">?:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">[]<\/span>\n  <span class=\"nx\">bedrooms<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span>\n  <span class=\"nx\">bathrooms<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span>\n  <span class=\"nx\">kitchens<\/span><span class=\"p\">?:<\/span> <span class=\"kr\">number<\/span>\n  <span class=\"nx\">parkingSpaces<\/span><span class=\"p\">?:<\/span> <span class=\"kr\">number<\/span><span class=\"p\">,<\/span>\n  <span class=\"nx\">size<\/span><span class=\"p\">?:<\/span> <span class=\"kr\">number<\/span>\n  <span class=\"nx\">petsAllowed<\/span><span class=\"p\">:<\/span> <span class=\"nx\">boolean<\/span>\n  <span class=\"nx\">furnished<\/span><span class=\"p\">:<\/span> <span class=\"nx\">boolean<\/span>\n  <span class=\"nx\">minimumAge<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span>\n  <span class=\"nx\">location<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Types<\/span><span class=\"p\">.<\/span><span class=\"nx\">ObjectId<\/span>\n  <span class=\"nx\">address<\/span><span class=\"p\">?:<\/span> <span class=\"kr\">string<\/span>\n  <span class=\"nx\">price<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span>\n  <span class=\"nx\">hidden<\/span><span class=\"p\">?:<\/span> <span class=\"nx\">boolean<\/span>\n  <span class=\"nx\">cancellation<\/span><span class=\"p\">?:<\/span> <span class=\"kr\">number<\/span>\n  <span class=\"nx\">aircon<\/span><span class=\"p\">?:<\/span> <span class=\"nx\">boolean<\/span>\n  <span class=\"nx\">available<\/span><span class=\"p\">?:<\/span> <span class=\"nx\">boolean<\/span>\n  <span class=\"nx\">rentalTerm<\/span><span class=\"p\">:<\/span> <span class=\"nx\">movininTypes<\/span><span class=\"p\">.<\/span><span class=\"nx\">RentalTerm<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u06cc\u06a9 \u0645\u0644\u06a9 \u0627\u0632 \u0645\u0648\u0627\u0631\u062f \u0632\u06cc\u0631 \u062a\u0634\u06a9\u06cc\u0644 \u0634\u062f\u0647 \u0627\u0633\u062a:<\/p>\n<ul>\n<li>\u06cc\u06a9 \u0646\u0627\u0645<\/li>\n<li>\u06cc\u06a9 \u0646\u0648\u0639 (\u0622\u067e\u0627\u0631\u062a\u0645\u0627\u0646\u060c \u062a\u062c\u0627\u0631\u06cc\u060c \u0645\u0632\u0631\u0639\u0647\u060c \u062e\u0627\u0646\u0647\u060c \u0635\u0646\u0639\u062a\u06cc\u060c \u0632\u0645\u06cc\u0646\u060c \u062e\u0627\u0646\u0647 \u0634\u0647\u0631\u06cc)<\/li>\n<li>\u0627\u0634\u0627\u0631\u0647 \u0628\u0647 \u0622\u0698\u0627\u0646\u0633\u06cc \u06a9\u0647 \u0622\u0646 \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u0647 \u0627\u0633\u062a<\/li>\n<li>\u06cc\u06a9 \u062a\u0648\u0636\u06cc\u062d<\/li>\n<li>\u06cc\u06a9 \u062a\u0635\u0648\u06cc\u0631 \u0627\u0635\u0644\u06cc<\/li>\n<li>\u062a\u0635\u0627\u0648\u06cc\u0631 \u0627\u0636\u0627\u0641\u06cc<\/li>\n<li>\u062a\u0639\u062f\u0627\u062f \u0627\u062a\u0627\u0642 \u062e\u0648\u0627\u0628<\/li>\n<li>\u062a\u0639\u062f\u0627\u062f \u062d\u0645\u0627\u0645<\/li>\n<li>\u062a\u0639\u062f\u0627\u062f \u0622\u0634\u067e\u0632\u062e\u0627\u0646\u0647<\/li>\n<li>\u062a\u0639\u062f\u0627\u062f \u062c\u0627\u06cc \u067e\u0627\u0631\u06a9<\/li>\n<li>\u06cc\u06a9 \u0627\u0646\u062f\u0627\u0632\u0647<\/li>\n<li>\u062d\u062f\u0627\u0642\u0644 \u0633\u0646 \u0628\u0631\u0627\u06cc \u0627\u062c\u0627\u0631\u0647<\/li>\n<li>\u06cc\u06a9 \u0645\u06a9\u0627\u0646<\/li>\n<li>\u0622\u062f\u0631\u0633 (\u0627\u062e\u062a\u06cc\u0627\u0631\u06cc)<\/li>\n<li>\u06cc\u06a9 \u0642\u06cc\u0645\u062a<\/li>\n<li>\u0645\u062f\u062a \u0627\u062c\u0627\u0631\u0647 (\u0645\u0627\u0647\u0627\u0646\u0647\u060c \u0647\u0641\u062a\u06af\u06cc\u060c \u0631\u0648\u0632\u0627\u0646\u0647\u060c \u0633\u0627\u0644\u0627\u0646\u0647)<\/li>\n<li>\u0642\u06cc\u0645\u062a \u0644\u063a\u0648 (\u0628\u0631\u0627\u06cc \u06af\u0646\u062c\u0627\u0646\u062f\u0646 \u0631\u0627\u06cc\u06af\u0627\u0646 \u0622\u0646 \u0631\u0627 \u0631\u0648\u06cc 0 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f\u060c \u0627\u06af\u0631 \u0646\u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u06cc\u062f \u0622\u0646 \u0631\u0627 \u0644\u062d\u0627\u0638 \u06a9\u0646\u06cc\u062f \u0622\u0646 \u0631\u0627 \u062e\u0627\u0644\u06cc \u0628\u06af\u0630\u0627\u0631\u06cc\u062f\u060c \u06cc\u0627 \u0642\u06cc\u0645\u062a \u0644\u063a\u0648 \u0631\u0627 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f)<\/li>\n<li>\u067e\u0631\u0686\u0645\u06cc \u06a9\u0647 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u062d\u06cc\u0648\u0627\u0646\u0627\u062a \u062e\u0627\u0646\u06af\u06cc \u0645\u062c\u0627\u0632 \u0647\u0633\u062a\u0646\u062f \u06cc\u0627 \u0646\u0647<\/li>\n<li>\u067e\u0631\u0686\u0645\u06cc \u06a9\u0647 \u0646\u0634\u0627\u0646 \u062f\u0647\u0646\u062f\u0647 \u0645\u0628\u0644\u0647 \u0628\u0648\u062f\u0646 \u06cc\u0627 \u0646\u0628\u0648\u062f\u0646 \u0645\u0644\u06a9 \u0627\u0633\u062a<\/li>\n<li>\u067e\u0631\u0686\u0645\u06cc \u06a9\u0647 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u0645\u0644\u06a9 \u0645\u062e\u0641\u06cc \u0627\u0633\u062a \u06cc\u0627 \u062e\u06cc\u0631<\/li>\n<li>\u067e\u0631\u0686\u0645\u06cc \u06a9\u0647 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u062a\u0647\u0648\u06cc\u0647 \u0645\u0637\u0628\u0648\u0639 \u0645\u0648\u062c\u0648\u062f \u0627\u0633\u062a \u06cc\u0627 \u0646\u0647<\/li>\n<li>\u067e\u0631\u0686\u0645\u06cc \u06a9\u0647 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u0645\u0644\u06a9 \u0628\u0631\u0627\u06cc \u0627\u062c\u0627\u0631\u0647 \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0627\u0633\u062a \u06cc\u0627 \u062e\u06cc\u0631<\/li>\n<\/ul>\n<p>\u062f\u0631 \u0632\u06cc\u0631 \u062a\u0627\u0628\u0639 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u062a\u0631\u0644\u0631 \u0627\u0633\u062a:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">create<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async <\/span><span class=\"p\">(<\/span><span class=\"nx\">req<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Request<\/span><span class=\"p\">,<\/span> <span class=\"nx\">res<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Response<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">body<\/span> <span class=\"p\">}:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">body<\/span><span class=\"p\">:<\/span> <span class=\"nx\">movininTypes<\/span><span class=\"p\">.<\/span><span class=\"nx\">CreatePropertyPayload<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">req<\/span>\n\n  <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span>\n      <span class=\"nx\">name<\/span><span class=\"p\">,<\/span>\n      <span class=\"kd\">type<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">agency<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">description<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">image<\/span><span class=\"p\">:<\/span> <span class=\"nx\">imageFile<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">images<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">bedrooms<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">bathrooms<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">kitchens<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">parkingSpaces<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">size<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">petsAllowed<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">furnished<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">minimumAge<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">location<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">address<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">price<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">hidden<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">cancellation<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">aircon<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">rentalTerm<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">body<\/span>\n\n    <span class=\"kd\">const<\/span> <span class=\"nx\">_property<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n      <span class=\"nx\">name<\/span><span class=\"p\">,<\/span>\n      <span class=\"kd\">type<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">agency<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">description<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">bedrooms<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">bathrooms<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">kitchens<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">parkingSpaces<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">size<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">petsAllowed<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">furnished<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">minimumAge<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">location<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">address<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">price<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">hidden<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">cancellation<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">aircon<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">rentalTerm<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"kd\">const<\/span> <span class=\"nx\">property<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Property<\/span><span class=\"p\">(<\/span><span class=\"nx\">_property<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">await<\/span> <span class=\"nx\">property<\/span><span class=\"p\">.<\/span><span class=\"nf\">save<\/span><span class=\"p\">()<\/span>\n\n    <span class=\"c1\">\/\/ image<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">_image<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">path<\/span><span class=\"p\">.<\/span><span class=\"nf\">join<\/span><span class=\"p\">(<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">CDN_TEMP_PROPERTIES<\/span><span class=\"p\">,<\/span> <span class=\"nx\">imageFile<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"k\">await<\/span> <span class=\"nx\">helper<\/span><span class=\"p\">.<\/span><span class=\"nf\">exists<\/span><span class=\"p\">(<\/span><span class=\"nx\">_image<\/span><span class=\"p\">))<\/span> <span class=\"p\">{<\/span>\n      <span class=\"kd\">const<\/span> <span class=\"nx\">filename<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">`<\/span><span class=\"p\">${<\/span><span class=\"nx\">property<\/span><span class=\"p\">.<\/span><span class=\"nx\">_id<\/span><span class=\"p\">}<\/span><span class=\"s2\">_<\/span><span class=\"p\">${<\/span><span class=\"nb\">Date<\/span><span class=\"p\">.<\/span><span class=\"nf\">now<\/span><span class=\"p\">()}${<\/span><span class=\"nx\">path<\/span><span class=\"p\">.<\/span><span class=\"nf\">extname<\/span><span class=\"p\">(<\/span><span class=\"nx\">imageFile<\/span><span class=\"p\">)}<\/span><span class=\"s2\">`<\/span>\n      <span class=\"kd\">const<\/span> <span class=\"nx\">newPath<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">path<\/span><span class=\"p\">.<\/span><span class=\"nf\">join<\/span><span class=\"p\">(<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">CDN_PROPERTIES<\/span><span class=\"p\">,<\/span> <span class=\"nx\">filename<\/span><span class=\"p\">)<\/span>\n\n      <span class=\"k\">await<\/span> <span class=\"nx\">fs<\/span><span class=\"p\">.<\/span><span class=\"nf\">rename<\/span><span class=\"p\">(<\/span><span class=\"nx\">_image<\/span><span class=\"p\">,<\/span> <span class=\"nx\">newPath<\/span><span class=\"p\">)<\/span>\n      <span class=\"nx\">property<\/span><span class=\"p\">.<\/span><span class=\"nx\">image<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">filename<\/span>\n    <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\n      <span class=\"k\">await<\/span> <span class=\"nx\">Property<\/span><span class=\"p\">.<\/span><span class=\"nf\">deleteOne<\/span><span class=\"p\">({<\/span> <span class=\"na\">_id<\/span><span class=\"p\">:<\/span> <span class=\"nx\">property<\/span><span class=\"p\">.<\/span><span class=\"nx\">_id<\/span> <span class=\"p\">})<\/span>\n      <span class=\"kd\">const<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">Image file not found<\/span><span class=\"dl\">'<\/span>\n      <span class=\"nx\">logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">error<\/span><span class=\"p\">(<\/span><span class=\"nx\">i18n<\/span><span class=\"p\">.<\/span><span class=\"nf\">t<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">ERROR<\/span><span class=\"dl\">'<\/span><span class=\"p\">),<\/span> <span class=\"nx\">err<\/span><span class=\"p\">)<\/span>\n      <span class=\"k\">return<\/span> <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nf\">status<\/span><span class=\"p\">(<\/span><span class=\"mi\">400<\/span><span class=\"p\">).<\/span><span class=\"nf\">send<\/span><span class=\"p\">(<\/span><span class=\"nx\">i18n<\/span><span class=\"p\">.<\/span><span class=\"nf\">t<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">ERROR<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">err<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"c1\">\/\/ images<\/span>\n    <span class=\"nx\">property<\/span><span class=\"p\">.<\/span><span class=\"nx\">images<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[]<\/span>\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">images<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n      <span class=\"kd\">let<\/span> <span class=\"nx\">i<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span>\n      <span class=\"k\">for <\/span><span class=\"p\">(<\/span><span class=\"kd\">const<\/span> <span class=\"nx\">img<\/span> <span class=\"k\">of<\/span> <span class=\"nx\">images<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"kd\">const<\/span> <span class=\"nx\">_img<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">path<\/span><span class=\"p\">.<\/span><span class=\"nf\">join<\/span><span class=\"p\">(<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">CDN_TEMP_PROPERTIES<\/span><span class=\"p\">,<\/span> <span class=\"nx\">img<\/span><span class=\"p\">)<\/span>\n\n        <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"k\">await<\/span> <span class=\"nx\">helper<\/span><span class=\"p\">.<\/span><span class=\"nf\">exists<\/span><span class=\"p\">(<\/span><span class=\"nx\">_img<\/span><span class=\"p\">))<\/span> <span class=\"p\">{<\/span>\n          <span class=\"kd\">const<\/span> <span class=\"nx\">filename<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">`<\/span><span class=\"p\">${<\/span><span class=\"nx\">property<\/span><span class=\"p\">.<\/span><span class=\"nx\">_id<\/span><span class=\"p\">}<\/span><span class=\"s2\">_<\/span><span class=\"p\">${<\/span><span class=\"nf\">uuid<\/span><span class=\"p\">()}<\/span><span class=\"s2\">_<\/span><span class=\"p\">${<\/span><span class=\"nb\">Date<\/span><span class=\"p\">.<\/span><span class=\"nf\">now<\/span><span class=\"p\">()}<\/span><span class=\"s2\">_<\/span><span class=\"p\">${<\/span><span class=\"nx\">i<\/span><span class=\"p\">}${<\/span><span class=\"nx\">path<\/span><span class=\"p\">.<\/span><span class=\"nf\">extname<\/span><span class=\"p\">(<\/span><span class=\"nx\">img<\/span><span class=\"p\">)}<\/span><span class=\"s2\">`<\/span>\n          <span class=\"kd\">const<\/span> <span class=\"nx\">newPath<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">path<\/span><span class=\"p\">.<\/span><span class=\"nf\">join<\/span><span class=\"p\">(<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">CDN_PROPERTIES<\/span><span class=\"p\">,<\/span> <span class=\"nx\">filename<\/span><span class=\"p\">)<\/span>\n\n          <span class=\"k\">await<\/span> <span class=\"nx\">fs<\/span><span class=\"p\">.<\/span><span class=\"nf\">rename<\/span><span class=\"p\">(<\/span><span class=\"nx\">_img<\/span><span class=\"p\">,<\/span> <span class=\"nx\">newPath<\/span><span class=\"p\">)<\/span>\n          <span class=\"nx\">property<\/span><span class=\"p\">.<\/span><span class=\"nx\">images<\/span><span class=\"p\">.<\/span><span class=\"nf\">push<\/span><span class=\"p\">(<\/span><span class=\"nx\">filename<\/span><span class=\"p\">)<\/span>\n        <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\n          <span class=\"k\">await<\/span> <span class=\"nx\">Property<\/span><span class=\"p\">.<\/span><span class=\"nf\">deleteOne<\/span><span class=\"p\">({<\/span> <span class=\"na\">_id<\/span><span class=\"p\">:<\/span> <span class=\"nx\">property<\/span><span class=\"p\">.<\/span><span class=\"nx\">_id<\/span> <span class=\"p\">})<\/span>\n          <span class=\"kd\">const<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">Image file not found<\/span><span class=\"dl\">'<\/span>\n          <span class=\"nx\">logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">error<\/span><span class=\"p\">(<\/span><span class=\"nx\">i18n<\/span><span class=\"p\">.<\/span><span class=\"nf\">t<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">ERROR<\/span><span class=\"dl\">'<\/span><span class=\"p\">),<\/span> <span class=\"nx\">err<\/span><span class=\"p\">)<\/span>\n          <span class=\"k\">return<\/span> <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nf\">status<\/span><span class=\"p\">(<\/span><span class=\"mi\">400<\/span><span class=\"p\">).<\/span><span class=\"nf\">send<\/span><span class=\"p\">(<\/span><span class=\"nx\">i18n<\/span><span class=\"p\">.<\/span><span class=\"nf\">t<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">ERROR<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">err<\/span><span class=\"p\">)<\/span>\n        <span class=\"p\">}<\/span>\n        <span class=\"nx\">i<\/span> <span class=\"o\">+=<\/span> <span class=\"mi\">1<\/span>\n      <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"k\">await<\/span> <span class=\"nx\">property<\/span><span class=\"p\">.<\/span><span class=\"nf\">save<\/span><span class=\"p\">()<\/span>\n\n    <span class=\"k\">return<\/span> <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nf\">json<\/span><span class=\"p\">(<\/span><span class=\"nx\">property<\/span><span class=\"p\">)<\/span>\n  <span class=\"p\">}<\/span> <span class=\"k\">catch <\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nx\">logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">error<\/span><span class=\"p\">(<\/span><span class=\"s2\">`[property.create] <\/span><span class=\"p\">${<\/span><span class=\"nx\">i18n<\/span><span class=\"p\">.<\/span><span class=\"nf\">t<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">DB_ERROR<\/span><span class=\"dl\">'<\/span><span class=\"p\">)}<\/span><span class=\"s2\"> <\/span><span class=\"p\">${<\/span><span class=\"nx\">JSON<\/span><span class=\"p\">.<\/span><span class=\"nf\">stringify<\/span><span class=\"p\">(<\/span><span class=\"nx\">body<\/span><span class=\"p\">)}<\/span><span class=\"s2\">`<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">return<\/span> <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nf\">status<\/span><span class=\"p\">(<\/span><span class=\"mi\">400<\/span><span class=\"p\">).<\/span><span class=\"nf\">send<\/span><span class=\"p\">(<\/span><span class=\"nx\">i18n<\/span><span class=\"p\">.<\/span><span class=\"nf\">t<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">ERROR<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">err<\/span><span class=\"p\">)<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"Frontend-2\"><\/span>\n<p>  Frontend<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Frontend \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0628 \u0627\u0633\u062a \u06a9\u0647 \u0628\u0627 Node.js\u060c React\u060c MUI \u0648 TypeScript \u0633\u0627\u062e\u062a\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a. \u0627\u0632 \u0642\u0633\u0645\u062a \u062c\u0644\u0648\u06cc\u06cc\u060c \u0645\u0634\u062a\u0631\u06cc \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u0628\u0633\u062a\u0647 \u0628\u0647 \u0646\u0642\u0627\u0637 \u062a\u062d\u0648\u06cc\u0644 \u0648 \u062a\u062d\u0648\u06cc\u0644 \u0648 \u0632\u0645\u0627\u0646\u060c \u062e\u0648\u062f\u0631\u0648\u0647\u0627\u06cc \u0645\u0648\u062c\u0648\u062f \u0631\u0627 \u062c\u0633\u062a\u062c\u0648 \u06a9\u0646\u062f\u060c \u062e\u0648\u062f\u0631\u0648\u06cc\u06cc \u0631\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0631\u062f\u0647 \u0648 \u0628\u0647 \u062a\u0633\u0648\u06cc\u0647\u200c\u062d\u0633\u0627\u0628 \u0627\u062f\u0627\u0645\u0647 \u062f\u0647\u062f:<\/p>\n<ul>\n<li>\u067e\u0648\u0634\u0647 .\/frontend\/src\/assets\/ \u062d\u0627\u0648\u06cc CSS \u0648 \u062a\u0635\u0627\u0648\u06cc\u0631 \u0627\u0633\u062a.<\/li>\n<li>\u067e\u0648\u0634\u0647 .\/frontend\/src\/pages\/ \u062d\u0627\u0648\u06cc \u0635\u0641\u062d\u0627\u062a React \u0627\u0633\u062a.<\/li>\n<li>\u067e\u0648\u0634\u0647 .\/frontend\/src\/components\/ \u062d\u0627\u0648\u06cc \u0627\u062c\u0632\u0627\u06cc React \u0627\u0633\u062a.<\/li>\n<li>.\/frontend\/src\/services\/ \u0634\u0627\u0645\u0644 \u062e\u062f\u0645\u0627\u062a \u06a9\u0644\u0627\u06cc\u0646\u062a api \u0627\u0633\u062a.<\/li>\n<li>.\/frontend\/src\/App.tsx \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0635\u0644\u06cc React \u0627\u0633\u062a \u06a9\u0647 \u062d\u0627\u0648\u06cc \u0645\u0633\u06cc\u0631\u0647\u0627 \u0627\u0633\u062a.<\/li>\n<li>.\/frontend\/src\/index.tsx \u0646\u0642\u0637\u0647 \u0648\u0631\u0648\u062f \u0627\u0635\u0644\u06cc frontend \u0627\u0633\u062a.<\/li>\n<\/ul>\n<p>\u062a\u0639\u0627\u0631\u06cc\u0641 \u0646\u0648\u0639 TypeScript \u062f\u0631 \u0628\u0633\u062a\u0647 .\/packages\/movinin-types \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<p>App.tsx \u0627\u0635\u0644\u06cc \u062a\u0631\u06cc\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0627\u06a9\u0646\u0634 \u0627\u0633\u062a:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"k\">import<\/span> <span class=\"nx\">React<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">lazy<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Suspense<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">BrowserRouter<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">Router<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Route<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Routes<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react-router-dom<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">env<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@\/config\/env.config<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">GlobalProvider<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@\/context\/GlobalContext<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">init<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">initGA<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@\/common\/ga4<\/span><span class=\"dl\">'<\/span>\n\n<span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">GOOGLE_ANALYTICS_ENABLED<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nf\">initGA<\/span><span class=\"p\">()<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">SignIn<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">lazy<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"k\">import<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">@\/pages\/SignIn<\/span><span class=\"dl\">'<\/span><span class=\"p\">))<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">SignUp<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">lazy<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"k\">import<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">@\/pages\/SignUp<\/span><span class=\"dl\">'<\/span><span class=\"p\">))<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">Activate<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">lazy<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"k\">import<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">@\/pages\/Activate<\/span><span class=\"dl\">'<\/span><span class=\"p\">))<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">ForgotPassword<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">lazy<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"k\">import<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">@\/pages\/ForgotPassword<\/span><span class=\"dl\">'<\/span><span class=\"p\">))<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">ResetPassword<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">lazy<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"k\">import<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">@\/pages\/ResetPassword<\/span><span class=\"dl\">'<\/span><span class=\"p\">))<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">Home<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">lazy<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"k\">import<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">@\/pages\/Home<\/span><span class=\"dl\">'<\/span><span class=\"p\">))<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">Search<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">lazy<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"k\">import<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">@\/pages\/Search<\/span><span class=\"dl\">'<\/span><span class=\"p\">))<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">Property<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">lazy<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"k\">import<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">@\/pages\/Property<\/span><span class=\"dl\">'<\/span><span class=\"p\">))<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">Checkout<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">lazy<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"k\">import<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">@\/pages\/Checkout<\/span><span class=\"dl\">'<\/span><span class=\"p\">))<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">CheckoutSession<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">lazy<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"k\">import<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">@\/pages\/CheckoutSession<\/span><span class=\"dl\">'<\/span><span class=\"p\">))<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">Bookings<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">lazy<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"k\">import<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">@\/pages\/Bookings<\/span><span class=\"dl\">'<\/span><span class=\"p\">))<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">Booking<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">lazy<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"k\">import<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">@\/pages\/Booking<\/span><span class=\"dl\">'<\/span><span class=\"p\">))<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">Settings<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">lazy<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"k\">import<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">@\/pages\/Settings<\/span><span class=\"dl\">'<\/span><span class=\"p\">))<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">Notifications<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">lazy<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"k\">import<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">@\/pages\/Notifications<\/span><span class=\"dl\">'<\/span><span class=\"p\">))<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">ToS<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">lazy<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"k\">import<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">@\/pages\/ToS<\/span><span class=\"dl\">'<\/span><span class=\"p\">))<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">About<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">lazy<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"k\">import<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">@\/pages\/About<\/span><span class=\"dl\">'<\/span><span class=\"p\">))<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">ChangePassword<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">lazy<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"k\">import<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">@\/pages\/ChangePassword<\/span><span class=\"dl\">'<\/span><span class=\"p\">))<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">Contact<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">lazy<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"k\">import<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">@\/pages\/Contact<\/span><span class=\"dl\">'<\/span><span class=\"p\">))<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">NoMatch<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">lazy<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"k\">import<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">@\/pages\/NoMatch<\/span><span class=\"dl\">'<\/span><span class=\"p\">))<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">Agencies<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">lazy<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"k\">import<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">@\/pages\/Agencies<\/span><span class=\"dl\">'<\/span><span class=\"p\">))<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">Locations<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">lazy<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"k\">import<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">@\/pages\/Locations<\/span><span class=\"dl\">'<\/span><span class=\"p\">))<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">App<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">(<\/span>\n  <span class=\"o\">&lt;<\/span><span class=\"nx\">GlobalProvider<\/span><span class=\"o\">&gt;<\/span>\n    <span class=\"o\">&lt;<\/span><span class=\"nx\">Router<\/span><span class=\"o\">&gt;<\/span>\n      <span class=\"o\">&lt;<\/span><span class=\"nx\">div<\/span> <span class=\"nx\">className<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">app<\/span><span class=\"dl\">\"<\/span><span class=\"o\">&gt;<\/span>\n        <span class=\"o\">&lt;<\/span><span class=\"nx\">Suspense<\/span> <span class=\"nx\">fallback<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"o\">&lt;&gt;&lt;<\/span><span class=\"sr\">\/&gt;}<\/span><span class=\"err\">&gt;\n<\/span>          <span class=\"o\">&lt;<\/span><span class=\"nx\">Routes<\/span><span class=\"o\">&gt;<\/span>\n            <span class=\"o\">&lt;<\/span><span class=\"nx\">Route<\/span> <span class=\"nx\">path<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/sign-in<\/span><span class=\"dl\">\"<\/span> <span class=\"nx\">element<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">SignIn<\/span> <span class=\"o\">\/&gt;<\/span><span class=\"p\">}<\/span> <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"nx\">Route<\/span> <span class=\"nx\">path<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/sign-up<\/span><span class=\"dl\">\"<\/span> <span class=\"nx\">element<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">SignUp<\/span> <span class=\"o\">\/&gt;<\/span><span class=\"p\">}<\/span> <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"nx\">Route<\/span> <span class=\"nx\">path<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/activate<\/span><span class=\"dl\">\"<\/span> <span class=\"nx\">element<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">Activate<\/span> <span class=\"o\">\/&gt;<\/span><span class=\"p\">}<\/span> <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"nx\">Route<\/span> <span class=\"nx\">path<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/forgot-password<\/span><span class=\"dl\">\"<\/span> <span class=\"nx\">element<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">ForgotPassword<\/span> <span class=\"o\">\/&gt;<\/span><span class=\"p\">}<\/span> <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"nx\">Route<\/span> <span class=\"nx\">path<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/reset-password<\/span><span class=\"dl\">\"<\/span> <span class=\"nx\">element<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">ResetPassword<\/span> <span class=\"o\">\/&gt;<\/span><span class=\"p\">}<\/span> <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"nx\">Route<\/span> <span class=\"nx\">path<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/<\/span><span class=\"dl\">\"<\/span> <span class=\"nx\">element<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">Home<\/span> <span class=\"o\">\/&gt;<\/span><span class=\"p\">}<\/span> <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"nx\">Route<\/span> <span class=\"nx\">path<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/search<\/span><span class=\"dl\">\"<\/span> <span class=\"nx\">element<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">Search<\/span> <span class=\"o\">\/&gt;<\/span><span class=\"p\">}<\/span> <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"nx\">Route<\/span> <span class=\"nx\">path<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/property<\/span><span class=\"dl\">\"<\/span> <span class=\"nx\">element<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">Property<\/span> <span class=\"o\">\/&gt;<\/span><span class=\"p\">}<\/span> <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"nx\">Route<\/span> <span class=\"nx\">path<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/checkout<\/span><span class=\"dl\">\"<\/span> <span class=\"nx\">element<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">Checkout<\/span> <span class=\"o\">\/&gt;<\/span><span class=\"p\">}<\/span> <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"nx\">Route<\/span> <span class=\"nx\">path<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/checkout-session\/:sessionId<\/span><span class=\"dl\">\"<\/span> <span class=\"nx\">element<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">CheckoutSession<\/span> <span class=\"o\">\/&gt;<\/span><span class=\"p\">}<\/span> <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"nx\">Route<\/span> <span class=\"nx\">path<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/bookings<\/span><span class=\"dl\">\"<\/span> <span class=\"nx\">element<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">Bookings<\/span> <span class=\"o\">\/&gt;<\/span><span class=\"p\">}<\/span> <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"nx\">Route<\/span> <span class=\"nx\">path<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/booking<\/span><span class=\"dl\">\"<\/span> <span class=\"nx\">element<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">Booking<\/span> <span class=\"o\">\/&gt;<\/span><span class=\"p\">}<\/span> <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"nx\">Route<\/span> <span class=\"nx\">path<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/settings<\/span><span class=\"dl\">\"<\/span> <span class=\"nx\">element<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">Settings<\/span> <span class=\"o\">\/&gt;<\/span><span class=\"p\">}<\/span> <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"nx\">Route<\/span> <span class=\"nx\">path<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/notifications<\/span><span class=\"dl\">\"<\/span> <span class=\"nx\">element<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">Notifications<\/span> <span class=\"o\">\/&gt;<\/span><span class=\"p\">}<\/span> <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"nx\">Route<\/span> <span class=\"nx\">path<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/change-password<\/span><span class=\"dl\">\"<\/span> <span class=\"nx\">element<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">ChangePassword<\/span> <span class=\"o\">\/&gt;<\/span><span class=\"p\">}<\/span> <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"nx\">Route<\/span> <span class=\"nx\">path<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/about<\/span><span class=\"dl\">\"<\/span> <span class=\"nx\">element<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">About<\/span> <span class=\"o\">\/&gt;<\/span><span class=\"p\">}<\/span> <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"nx\">Route<\/span> <span class=\"nx\">path<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/tos<\/span><span class=\"dl\">\"<\/span> <span class=\"nx\">element<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">ToS<\/span> <span class=\"o\">\/&gt;<\/span><span class=\"p\">}<\/span> <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"nx\">Route<\/span> <span class=\"nx\">path<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/contact<\/span><span class=\"dl\">\"<\/span> <span class=\"nx\">element<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">Contact<\/span> <span class=\"o\">\/&gt;<\/span><span class=\"p\">}<\/span> <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"nx\">Route<\/span> <span class=\"nx\">path<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/agencies<\/span><span class=\"dl\">\"<\/span> <span class=\"nx\">element<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">Agencies<\/span> <span class=\"o\">\/&gt;<\/span><span class=\"p\">}<\/span> <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"nx\">Route<\/span> <span class=\"nx\">path<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/destinations<\/span><span class=\"dl\">\"<\/span> <span class=\"nx\">element<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">Locations<\/span> <span class=\"o\">\/&gt;<\/span><span class=\"p\">}<\/span> <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span>\n            <span class=\"o\">&lt;<\/span><span class=\"nx\">Route<\/span> <span class=\"nx\">path<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">*<\/span><span class=\"dl\">\"<\/span> <span class=\"nx\">element<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">NoMatch<\/span> <span class=\"o\">\/&gt;<\/span><span class=\"p\">}<\/span> <span class=\"sr\">\/<\/span><span class=\"err\">&gt;\n<\/span>          <span class=\"o\">&lt;<\/span><span class=\"sr\">\/Routes<\/span><span class=\"err\">&gt;\n<\/span>        <span class=\"o\">&lt;<\/span><span class=\"sr\">\/Suspense<\/span><span class=\"err\">&gt;\n<\/span>      <span class=\"o\">&lt;<\/span><span class=\"sr\">\/div<\/span><span class=\"err\">&gt;\n<\/span>    <span class=\"o\">&lt;<\/span><span class=\"sr\">\/Router<\/span><span class=\"err\">&gt;\n<\/span>  <span class=\"o\">&lt;<\/span><span class=\"sr\">\/GlobalProvider<\/span><span class=\"err\">&gt;\n<\/span><span class=\"p\">)<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nx\">App<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0645\u0627 \u0627\u0632 React Lazy loading \u0628\u0631\u0627\u06cc \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u0647\u0631 \u0645\u0633\u06cc\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645.<\/p>\n<p>\u0645\u0627 \u0642\u0631\u0627\u0631 \u0646\u06cc\u0633\u062a \u0647\u0631 \u0635\u0641\u062d\u0647 \u0627\u0632 \u0635\u0641\u062d\u0647 \u0627\u0635\u0644\u06cc \u0631\u0627 \u067e\u0648\u0634\u0634 \u062f\u0647\u06cc\u0645\u060c \u0627\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u06a9\u062f \u0645\u0646\u0628\u0639 \u0631\u0627 \u0645\u0631\u0648\u0631 \u06a9\u0646\u06cc\u062f \u0648 \u0647\u0631 \u06a9\u062f\u0627\u0645 \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A7%D9%BE%D9%84%DB%8C%DA%A9%DB%8C%D8%B4%D9%86_%D9%85%D9%88%D8%A8%D8%A7%DB%8C%D9%84\"><\/span>\n<p>  \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0645\u0648\u0628\u0627\u06cc\u0644<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u06cc\u0646 \u067e\u0644\u062a\u0641\u0631\u0645 \u06cc\u06a9 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0645\u0648\u0628\u0627\u06cc\u0644\u06cc \u0628\u0648\u0645\u06cc \u0628\u0631\u0627\u06cc \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0648 iOS \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u06a9\u0646\u062f. \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0645\u0648\u0628\u0627\u06cc\u0644 \u0628\u0627 React Native\u060c Expo \u0648 TypeScript \u0633\u0627\u062e\u062a\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a. \u0645\u0627\u0646\u0646\u062f \u0642\u0633\u0645\u062a \u062c\u0644\u0648\u06cc\u06cc\u060c \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0645\u0648\u0628\u0627\u06cc\u0644 \u0628\u0647 \u0645\u0634\u062a\u0631\u06cc \u0627\u06cc\u0646 \u0627\u0645\u06a9\u0627\u0646 \u0631\u0627 \u0645\u06cc\u200c\u062f\u0647\u062f \u06a9\u0647 \u062e\u0648\u062f\u0631\u0648\u0647\u0627\u06cc \u0645\u0648\u062c\u0648\u062f \u0631\u0627 \u0628\u0633\u062a\u0647 \u0628\u0647 \u0646\u0642\u0627\u0637 \u062a\u062d\u0648\u06cc\u0644 \u0648 \u062a\u062d\u0648\u06cc\u0644 \u0648 \u0632\u0645\u0627\u0646 \u062c\u0633\u062a\u062c\u0648 \u06a9\u0646\u062f\u060c \u062e\u0648\u062f\u0631\u0648\u06cc\u06cc \u0631\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0646\u062f \u0648 \u0628\u0647 \u062a\u0633\u0648\u06cc\u0647\u200c\u062d\u0633\u0627\u0628 \u0627\u062f\u0627\u0645\u0647 \u062f\u0647\u062f.<\/p>\n<p>\u0627\u06af\u0631 \u0631\u0632\u0631\u0648 \u0627\u0648 \u0627\u0632 \u0642\u0633\u0645\u062a \u0628\u0627\u0637\u0646 \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0634\u0648\u062f\u060c \u0645\u0634\u062a\u0631\u06cc \u0627\u0639\u0644\u0627\u0646\u200c\u0647\u0627\u06cc \u0641\u0634\u0627\u0631\u06cc \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc\u200c\u06a9\u0646\u062f. \u0627\u0639\u0644\u0627\u0646\u200c\u0647\u0627\u06cc \u0641\u0634\u0627\u0631\u06cc \u0628\u0627 Node.js\u060c Expo Server SDK \u0648 Firebase \u0633\u0627\u062e\u062a\u0647 \u0645\u06cc\u200c\u0634\u0648\u0646\u062f.<\/p>\n<ul>\n<li>\u067e\u0648\u0634\u0647 .\/mobile\/assets\/ \u062d\u0627\u0648\u06cc \u062a\u0635\u0627\u0648\u06cc\u0631 \u0627\u0633\u062a.<\/li>\n<li>\u067e\u0648\u0634\u0647 .\/mobile\/screens\/ \u062d\u0627\u0648\u06cc \u0635\u0641\u062d\u0627\u062a \u0627\u0635\u0644\u06cc React Native \u0627\u0633\u062a.<\/li>\n<li>\u067e\u0648\u0634\u0647 .\/mobile\/components\/ \u062d\u0627\u0648\u06cc \u0627\u062c\u0632\u0627\u06cc React Native \u0627\u0633\u062a.<\/li>\n<li>.\/mobile\/services\/ \u0634\u0627\u0645\u0644 \u062e\u062f\u0645\u0627\u062a \u06a9\u0644\u0627\u06cc\u0646\u062a api \u0627\u0633\u062a.<\/li>\n<li>.\/mobile\/App.tsx \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0635\u0644\u06cc React Native \u0627\u0633\u062a.<\/li>\n<\/ul>\n<p>\u062a\u0639\u0627\u0631\u06cc\u0641 \u0646\u0648\u0639 TypeScript \u062f\u0631 \u0645\u0648\u0627\u0631\u062f \u0632\u06cc\u0631 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u0634\u0648\u0646\u062f:<\/p>\n<ul>\n<li>.\/mobile\/types\/index.d.ts<\/li>\n<li>.\/mobile\/types\/env.d.ts<\/li>\n<li>.\/mobile\/miscellaneous\/movinTypes.ts<\/li>\n<\/ul>\n<p>.\/mobile\/types\/ \u0628\u0647 \u0635\u0648\u0631\u062a \u0632\u06cc\u0631 \u062f\u0631 .\/mobile\/tsconfig.json \u0628\u0627\u0631\u06af\u06cc\u0631\u06cc \u0645\u06cc \u0634\u0648\u062f:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"p\">{<\/span>\n  <span class=\"dl\">\"<\/span><span class=\"s2\">extends<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">expo\/tsconfig.base<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n  <span class=\"dl\">\"<\/span><span class=\"s2\">compilerOptions<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n    <span class=\"dl\">\"<\/span><span class=\"s2\">strict<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span>\n    <span class=\"dl\">\"<\/span><span class=\"s2\">typeRoots<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\n      <span class=\"dl\">\"<\/span><span class=\"s2\">.\/types<\/span><span class=\"dl\">\"<\/span>\n    <span class=\"p\">]<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p>App.tsx \u0646\u0642\u0637\u0647 \u0648\u0631\u0648\u062f \u0627\u0635\u0644\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 React Native \u0627\u0633\u062a:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"k\">import<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react-native-gesture-handler<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">React<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">useCallback<\/span><span class=\"p\">,<\/span> <span class=\"nx\">useEffect<\/span><span class=\"p\">,<\/span> <span class=\"nx\">useRef<\/span><span class=\"p\">,<\/span> <span class=\"nx\">useState<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">RootSiblingParent<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react-native-root-siblings<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">NavigationContainer<\/span><span class=\"p\">,<\/span> <span class=\"nx\">NavigationContainerRef<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@react-navigation\/native<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">StatusBar<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">ExpoStatusBar<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">expo-status-bar<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">SafeAreaProvider<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react-native-safe-area-context<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Provider<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react-native-paper<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"o\">*<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">SplashScreen<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">expo-splash-screen<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"o\">*<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">Notifications<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">expo-notifications<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">StripeProvider<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@stripe\/stripe-react-native<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">DrawerNavigator<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/components\/DrawerNavigator<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"o\">*<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">helper<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/common\/helper<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"o\">*<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">NotificationService<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/services\/NotificationService<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"o\">*<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">UserService<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/services\/UserService<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">GlobalProvider<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/context\/GlobalContext<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"o\">*<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">env<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/config\/env.config<\/span><span class=\"dl\">'<\/span>\n\n<span class=\"nx\">Notifications<\/span><span class=\"p\">.<\/span><span class=\"nf\">setNotificationHandler<\/span><span class=\"p\">({<\/span>\n  <span class=\"na\">handleNotification<\/span><span class=\"p\">:<\/span> <span class=\"k\">async <\/span><span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">({<\/span>\n    <span class=\"na\">shouldShowAlert<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">shouldPlaySound<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">shouldSetBadge<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span>\n  <span class=\"p\">}),<\/span>\n<span class=\"p\">})<\/span>\n\n<span class=\"c1\">\/\/<\/span>\n<span class=\"c1\">\/\/ Prevent native splash screen from autohiding before App component declaration<\/span>\n<span class=\"c1\">\/\/<\/span>\n<span class=\"nx\">SplashScreen<\/span><span class=\"p\">.<\/span><span class=\"nf\">preventAutoHideAsync<\/span><span class=\"p\">()<\/span>\n  <span class=\"p\">.<\/span><span class=\"nf\">then<\/span><span class=\"p\">((<\/span><span class=\"nx\">result<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"s2\">`SplashScreen.preventAutoHideAsync() succeeded: <\/span><span class=\"p\">${<\/span><span class=\"nx\">result<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"p\">))<\/span>\n  <span class=\"p\">.<\/span><span class=\"k\">catch<\/span><span class=\"p\">(<\/span><span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nx\">warn<\/span><span class=\"p\">)<\/span> <span class=\"c1\">\/\/ it's good to explicitly catch and inspect any error<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">App<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"p\">[<\/span><span class=\"nx\">appIsReady<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setAppIsReady<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">useState<\/span><span class=\"p\">(<\/span><span class=\"kc\">false<\/span><span class=\"p\">)<\/span>\n\n  <span class=\"kd\">const<\/span> <span class=\"nx\">responseListener<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useRef<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">Notifications<\/span><span class=\"p\">.<\/span><span class=\"nx\">Subscription<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">()<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">navigationRef<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useRef<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">NavigationContainerRef<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">StackParams<\/span><span class=\"o\">&gt;&gt;<\/span><span class=\"p\">(<\/span><span class=\"kc\">null<\/span><span class=\"p\">)<\/span>\n\n  <span class=\"nf\">useEffect<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">register<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async <\/span><span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n      <span class=\"kd\">const<\/span> <span class=\"nx\">loggedIn<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">UserService<\/span><span class=\"p\">.<\/span><span class=\"nf\">loggedIn<\/span><span class=\"p\">()<\/span>\n      <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">loggedIn<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"kd\">const<\/span> <span class=\"nx\">currentUser<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">UserService<\/span><span class=\"p\">.<\/span><span class=\"nf\">getCurrentUser<\/span><span class=\"p\">()<\/span>\n        <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">currentUser<\/span><span class=\"p\">?.<\/span><span class=\"nx\">_id<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n          <span class=\"k\">await<\/span> <span class=\"nx\">helper<\/span><span class=\"p\">.<\/span><span class=\"nf\">registerPushToken<\/span><span class=\"p\">(<\/span><span class=\"nx\">currentUser<\/span><span class=\"p\">.<\/span><span class=\"nx\">_id<\/span><span class=\"p\">)<\/span>\n        <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\n          <span class=\"nx\">helper<\/span><span class=\"p\">.<\/span><span class=\"nf\">error<\/span><span class=\"p\">()<\/span>\n        <span class=\"p\">}<\/span>\n      <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"c1\">\/\/<\/span>\n    <span class=\"c1\">\/\/ Register push notifiations token<\/span>\n    <span class=\"c1\">\/\/<\/span>\n    <span class=\"nf\">register<\/span><span class=\"p\">()<\/span>\n\n    <span class=\"c1\">\/\/<\/span>\n    <span class=\"c1\">\/\/ This listener is fired whenever a user taps on or interacts with a notification (works when app is foregrounded, backgrounded, or killed)<\/span>\n    <span class=\"c1\">\/\/<\/span>\n    <span class=\"nx\">responseListener<\/span><span class=\"p\">.<\/span><span class=\"nx\">current<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">Notifications<\/span><span class=\"p\">.<\/span><span class=\"nf\">addNotificationResponseReceivedListener<\/span><span class=\"p\">(<\/span><span class=\"k\">async <\/span><span class=\"p\">(<\/span><span class=\"nx\">response<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n      <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">navigationRef<\/span><span class=\"p\">.<\/span><span class=\"nx\">current<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n          <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">data<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">response<\/span><span class=\"p\">.<\/span><span class=\"nx\">notification<\/span><span class=\"p\">.<\/span><span class=\"nx\">request<\/span><span class=\"p\">.<\/span><span class=\"nx\">content<\/span>\n\n          <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">booking<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n            <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">user<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">notification<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n              <span class=\"k\">await<\/span> <span class=\"nx\">NotificationService<\/span><span class=\"p\">.<\/span><span class=\"nf\">markAsRead<\/span><span class=\"p\">(<\/span><span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">user<\/span><span class=\"p\">,<\/span> <span class=\"p\">[<\/span><span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">notification<\/span><span class=\"p\">])<\/span>\n            <span class=\"p\">}<\/span>\n            <span class=\"nx\">navigationRef<\/span><span class=\"p\">.<\/span><span class=\"nx\">current<\/span><span class=\"p\">.<\/span><span class=\"nf\">navigate<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">Booking<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">booking<\/span> <span class=\"p\">})<\/span>\n          <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nx\">navigationRef<\/span><span class=\"p\">.<\/span><span class=\"nx\">current<\/span><span class=\"p\">.<\/span><span class=\"nf\">navigate<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">Notifications<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"p\">{})<\/span>\n          <span class=\"p\">}<\/span>\n        <span class=\"p\">}<\/span>\n      <span class=\"p\">}<\/span> <span class=\"k\">catch <\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"nx\">helper<\/span><span class=\"p\">.<\/span><span class=\"nf\">error<\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">,<\/span> <span class=\"kc\">false<\/span><span class=\"p\">)<\/span>\n      <span class=\"p\">}<\/span>\n    <span class=\"p\">})<\/span>\n\n    <span class=\"k\">return <\/span><span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n      <span class=\"nx\">Notifications<\/span><span class=\"p\">.<\/span><span class=\"nf\">removeNotificationSubscription<\/span><span class=\"p\">(<\/span><span class=\"nx\">responseListener<\/span><span class=\"p\">.<\/span><span class=\"nx\">current<\/span><span class=\"o\">!<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">},<\/span> <span class=\"p\">[])<\/span>\n\n  <span class=\"nf\">setTimeout<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nf\">setAppIsReady<\/span><span class=\"p\">(<\/span><span class=\"kc\">true<\/span><span class=\"p\">)<\/span>\n  <span class=\"p\">},<\/span> <span class=\"mi\">500<\/span><span class=\"p\">)<\/span>\n\n  <span class=\"kd\">const<\/span> <span class=\"nx\">onReady<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">useCallback<\/span><span class=\"p\">(<\/span><span class=\"k\">async <\/span><span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">appIsReady<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n      <span class=\"c1\">\/\/<\/span>\n      <span class=\"c1\">\/\/ This tells the splash screen to hide immediately! If we call this after<\/span>\n      <span class=\"c1\">\/\/ `setAppIsReady`, then we may see a blank screen while the app is<\/span>\n      <span class=\"c1\">\/\/ loading its initial state and rendering its first pixels. So instead,<\/span>\n      <span class=\"c1\">\/\/ we hide the splash screen once we know the root view has already<\/span>\n      <span class=\"c1\">\/\/ performed layout.<\/span>\n      <span class=\"c1\">\/\/<\/span>\n      <span class=\"k\">await<\/span> <span class=\"nx\">SplashScreen<\/span><span class=\"p\">.<\/span><span class=\"nf\">hideAsync<\/span><span class=\"p\">()<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">},<\/span> <span class=\"p\">[<\/span><span class=\"nx\">appIsReady<\/span><span class=\"p\">])<\/span>\n\n  <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"nx\">appIsReady<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"kc\">null<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"k\">return <\/span><span class=\"p\">(<\/span>\n    <span class=\"o\">&lt;<\/span><span class=\"nx\">GlobalProvider<\/span><span class=\"o\">&gt;<\/span>\n      <span class=\"o\">&lt;<\/span><span class=\"nx\">SafeAreaProvider<\/span><span class=\"o\">&gt;<\/span>\n        <span class=\"o\">&lt;<\/span><span class=\"nx\">Provider<\/span><span class=\"o\">&gt;<\/span>\n          <span class=\"o\">&lt;<\/span><span class=\"nx\">StripeProvider<\/span> <span class=\"nx\">publishableKey<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">STRIPE_PUBLISHABLE_KEY<\/span><span class=\"p\">}<\/span> <span class=\"nx\">merchantIdentifier<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">STRIPE_MERCHANT_IDENTIFIER<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\n            <span class=\"o\">&lt;<\/span><span class=\"nx\">RootSiblingParent<\/span><span class=\"o\">&gt;<\/span>\n              <span class=\"o\">&lt;<\/span><span class=\"nx\">NavigationContainer<\/span> <span class=\"nx\">ref<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">navigationRef<\/span><span class=\"p\">}<\/span> <span class=\"nx\">onReady<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">onReady<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\n                <span class=\"o\">&lt;<\/span><span class=\"nx\">ExpoStatusBar<\/span> <span class=\"nx\">style<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">light<\/span><span class=\"dl\">\"<\/span> <span class=\"nx\">backgroundColor<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">rgba(0, 0, 0, .9)<\/span><span class=\"dl\">\"<\/span> <span class=\"o\">\/&gt;<\/span>\n                <span class=\"o\">&lt;<\/span><span class=\"nx\">DrawerNavigator<\/span> <span class=\"o\">\/&gt;<\/span>\n              <span class=\"o\">&lt;<\/span><span class=\"sr\">\/NavigationContainer<\/span><span class=\"err\">&gt;\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"sr\">\/RootSiblingParent<\/span><span class=\"err\">&gt;\n<\/span>          <span class=\"o\">&lt;<\/span><span class=\"sr\">\/StripeProvider<\/span><span class=\"err\">&gt;\n<\/span>        <span class=\"o\">&lt;<\/span><span class=\"sr\">\/Provider<\/span><span class=\"err\">&gt;\n<\/span>      <span class=\"o\">&lt;<\/span><span class=\"sr\">\/SafeAreaProvider<\/span><span class=\"err\">&gt;\n<\/span>    <span class=\"o\">&lt;<\/span><span class=\"sr\">\/GlobalProvider<\/span><span class=\"err\">&gt;\n<\/span>  <span class=\"p\">)<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nx\">App<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0645\u0627 \u0642\u0631\u0627\u0631 \u0646\u06cc\u0633\u062a \u0647\u0631 \u0635\u0641\u062d\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u062a\u0644\u0641\u0646 \u0647\u0645\u0631\u0627\u0647 \u0631\u0627 \u067e\u0648\u0634\u0634 \u062f\u0647\u06cc\u0645\u060c \u0627\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u06a9\u062f \u0645\u0646\u0628\u0639 \u0631\u0627 \u0645\u0631\u0648\u0631 \u06a9\u0646\u06cc\u062f \u0648 \u0647\u0631 \u06a9\u062f\u0627\u0645 \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%AF%D8%A7%D8%B4%D8%A8%D9%88%D8%B1%D8%AF_%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA-2\"><\/span>\n<p>  \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0628 \u0627\u0633\u062a \u06a9\u0647 \u0628\u0627 Node.js\u060c React\u060c MUI \u0648 TypeScript \u0633\u0627\u062e\u062a\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a. \u0627\u0632 \u0628\u0627\u0637\u0646\u060c \u0627\u062f\u0645\u06cc\u0646 \u0647\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u0646\u062f \u062a\u0627\u0645\u06cc\u0646 \u06a9\u0646\u0646\u062f\u06af\u0627\u0646\u060c \u0645\u0627\u0634\u06cc\u0646 \u0647\u0627\u060c \u0645\u06a9\u0627\u0646 \u0647\u0627\u060c \u0645\u0634\u062a\u0631\u06cc\u0627\u0646 \u0648 \u0631\u0632\u0631\u0648\u0647\u0627 \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u0648 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u0646\u062f. \u0647\u0646\u06af\u0627\u0645\u06cc \u06a9\u0647 \u062a\u0627\u0645\u06cc\u0646 \u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u062c\u062f\u06cc\u062f \u0627\u0632 \u0628\u0627\u0637\u0646 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u0634\u0648\u0646\u062f\u060c \u0627\u06cc\u0645\u06cc\u0644\u06cc \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc \u06a9\u0646\u0646\u062f \u06a9\u0647 \u0627\u0632 \u0622\u0646\u0647\u0627 \u0645\u06cc \u062e\u0648\u0627\u0647\u062f \u06cc\u06a9 \u062d\u0633\u0627\u0628 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u0646\u062f \u062a\u0627 \u0628\u0647 \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a \u062f\u0633\u062a\u0631\u0633\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0646\u062f \u0648 \u0646\u0627\u0648\u06af\u0627\u0646 \u062e\u0648\u062f\u0631\u0648 \u0648 \u0631\u0632\u0631\u0648\u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u0646\u062f.<\/p>\n<ul>\n<li>\u067e\u0648\u0634\u0647 .\/backend\/assets\/ \u062d\u0627\u0648\u06cc CSS \u0648 \u062a\u0635\u0627\u0648\u06cc\u0631 \u0627\u0633\u062a.<\/li>\n<li>\u067e\u0648\u0634\u0647 .\/backend\/pages\/ \u062d\u0627\u0648\u06cc \u0635\u0641\u062d\u0627\u062a React \u0627\u0633\u062a.<\/li>\n<li>\u067e\u0648\u0634\u0647 .\/backend\/components\/ \u062d\u0627\u0648\u06cc \u0627\u062c\u0632\u0627\u06cc React \u0627\u0633\u062a.<\/li>\n<li>.\/backend\/services\/ \u0634\u0627\u0645\u0644 \u062e\u062f\u0645\u0627\u062a \u06a9\u0644\u0627\u06cc\u0646\u062a api \u0627\u0633\u062a.<\/li>\n<li>.\/backend\/App.tsx \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0635\u0644\u06cc React \u0627\u0633\u062a \u06a9\u0647 \u062d\u0627\u0648\u06cc \u0645\u0633\u06cc\u0631\u0647\u0627 \u0627\u0633\u062a.<\/li>\n<li>.\/backend\/index.tsx \u0646\u0642\u0637\u0647 \u0648\u0631\u0648\u062f \u0627\u0635\u0644\u06cc \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a \u0627\u0633\u062a.<\/li>\n<\/ul>\n<p>\u062a\u0639\u0627\u0631\u06cc\u0641 \u0646\u0648\u0639 TypeScript \u062f\u0631 \u0628\u0633\u062a\u0647 .\/packages\/movinin-types \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<p>App.tsx \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a \u0627\u0632 \u0645\u0646\u0637\u0642 \u0645\u0634\u0627\u0628\u0647\u06cc \u0645\u0627\u0646\u0646\u062f App.tsx \u0642\u0633\u0645\u062a \u062c\u0644\u0648 \u067e\u06cc\u0631\u0648\u06cc \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u0645\u0627 \u0642\u0631\u0627\u0631 \u0646\u06cc\u0633\u062a \u0647\u0631 \u0635\u0641\u062d\u0647 \u0627\u0632 \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a \u0631\u0627 \u067e\u0648\u0634\u0634 \u062f\u0647\u06cc\u0645\u060c \u0627\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u06a9\u062f \u0645\u0646\u0628\u0639 \u0631\u0627 \u0645\u0631\u0648\u0631 \u06a9\u0646\u06cc\u062f \u0648 \u0647\u0631 \u06a9\u062f\u0627\u0645 \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D9%86%D9%82%D8%A7%D8%B7_%D9%85%D9%88%D8%B1%D8%AF_%D8%B9%D9%84%D8%A7%D9%82%D9%87\"><\/span>\n<p>  \u0646\u0642\u0627\u0637 \u0645\u0648\u0631\u062f \u0639\u0644\u0627\u0642\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0633\u0627\u062e\u062a \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0645\u0648\u0628\u0627\u06cc\u0644 \u0628\u0627 React Native \u0648 Expo \u0628\u0633\u06cc\u0627\u0631 \u0622\u0633\u0627\u0646 \u0627\u0633\u062a. Expo \u062a\u0648\u0633\u0639\u0647 \u0645\u0648\u0628\u0627\u06cc\u0644 \u0628\u0627 React Native \u0631\u0627 \u0628\u0633\u06cc\u0627\u0631 \u0633\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0647\u0645\u0627\u0646 \u0632\u0628\u0627\u0646 (TypeScript) \u0628\u0631\u0627\u06cc \u062a\u0648\u0633\u0639\u0647 Backend\u060c Frontend \u0648 \u0645\u0648\u0628\u0627\u06cc\u0644 \u0628\u0633\u06cc\u0627\u0631 \u0631\u0627\u062d\u062a \u0627\u0633\u062a.<\/p>\n<p>TypeScript \u0632\u0628\u0627\u0646 \u0628\u0633\u06cc\u0627\u0631 \u062c\u0627\u0644\u0628\u06cc \u0627\u0633\u062a \u0648 \u0645\u0632\u0627\u06cc\u0627\u06cc \u0632\u06cc\u0627\u062f\u06cc \u062f\u0627\u0631\u062f. \u0628\u0627 \u0627\u0641\u0632\u0648\u062f\u0646 \u062a\u0627\u06cc\u067e \u0627\u0633\u062a\u0627\u062a\u06cc\u06a9 \u0628\u0647 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u0645 \u0627\u0632 \u0628\u0633\u06cc\u0627\u0631\u06cc \u0627\u0632 \u0628\u0627\u06af\u200c\u0647\u0627 \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u06a9\u0646\u06cc\u0645 \u0648 \u06a9\u062f\u06cc \u0628\u0627 \u06a9\u06cc\u0641\u06cc\u062a \u0628\u0627\u0644\u0627\u060c \u0645\u0642\u06cc\u0627\u0633\u200c\u067e\u0630\u06cc\u0631\u060c \u062e\u0648\u0627\u0646\u0627\u062a\u0631 \u0648 \u0642\u0627\u0628\u0644 \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u062a\u0648\u0644\u06cc\u062f \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0628\u0647 \u0631\u0627\u062d\u062a\u06cc \u0627\u0634\u06a9\u0627\u0644 \u0632\u062f\u0627\u06cc\u06cc \u0648 \u0622\u0632\u0645\u0627\u06cc\u0634 \u0634\u0648\u062f.<\/p>\n<p>\u0647\u0645\u06cc\u0646! \u0627\u0645\u06cc\u062f\u0648\u0627\u0631\u0645 \u0627\u0632 \u062e\u0648\u0627\u0646\u062f\u0646 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u0644\u0630\u062a \u0628\u0631\u062f\u0647 \u0628\u0627\u0634\u06cc\u062f.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D9%85%D9%86%D8%A7%D8%A8%D8%B9\"><\/span>\n<p>  \u0645\u0646\u0627\u0628\u0639<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ol>\n<li>\u0646\u0645\u0627\u06cc \u06a9\u0644\u06cc<\/li>\n<li>\u0645\u0639\u0645\u0627\u0631\u06cc<\/li>\n<li>\u062f\u0631 \u062d\u0627\u0644 \u0646\u0635\u0628 (\u062e\u0648\u062f \u0645\u06cc\u0632\u0628\u0627\u0646)<\/li>\n<li>\u0646\u0635\u0628 (VPS)<\/li>\n<li>\n<p>\u0646\u0635\u0628 (Docker)<\/p>\n<ol>\n<li>\u062a\u0635\u0648\u06cc\u0631 \u062f\u0627\u06a9\u0631<\/li>\n<li>SSL<\/li>\n<\/ol>\n<\/li>\n<li>Stripe \u0631\u0627 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f<\/li>\n<li>\u0633\u0627\u062e\u062a \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0645\u0648\u0628\u0627\u06cc\u0644<\/li>\n<li>\n<p>\u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0646\u0633\u062e\u0647 \u06cc \u0646\u0645\u0627\u06cc\u0634\u06cc<\/p>\n<ol>\n<li>\u0648\u06cc\u0646\u062f\u0648\u0632\u060c \u0644\u06cc\u0646\u0648\u06a9\u0633 \u0648 macOS<\/li>\n<li>\u062f\u0627\u06a9\u0631<\/li>\n<\/ol>\n<\/li>\n<li>\u0627\u0632 \u0645\u0646\u0628\u0639 \u0627\u062c\u0631\u0627 \u0634\u0648\u062f<\/li>\n<li>\n<p>\u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0648\u0628\u0627\u06cc\u0644 \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f<\/p>\n<ol>\n<li>\u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632\u0647\u0627<\/li>\n<li>\u062f\u0633\u062a\u0648\u0631\u0627\u0644\u0639\u0645\u0644 \u0647\u0627<\/li>\n<li>Push Notifications<\/li>\n<\/ol>\n<\/li>\n<li>\u062a\u063a\u06cc\u06cc\u0631 \u0627\u0631\u0632<\/li>\n<li>\u0632\u0628\u0627\u0646 \u062c\u062f\u06cc\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f<\/li>\n<li>\u062a\u0633\u062a \u0647\u0627\u06cc \u0648\u0627\u062d\u062f \u0648 \u067e\u0648\u0634\u0634<\/li>\n<li>\u0633\u06cc\u0627\u0647\u0647\u0647\u0627<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Summarize this content to 400 words in Persian Lang \u0645\u0637\u0627\u0644\u0628 \u0645\u0642\u062f\u0645\u0647 \u067e\u0634\u062a\u0647 \u0641\u0646\u0627\u0648\u0631\u06cc \u0628\u0631\u0631\u0633\u06cc \u0627\u062c\u0645\u0627\u0644\u06cc \u0633\u0631\u06cc\u0639 API Frontend \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0645\u0648\u0628\u0627\u06cc\u0644 \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a \u0646\u0642\u0627\u0637 \u0645\u0648\u0631\u062f \u0639\u0644\u0627\u0642\u0647 \u0645\u0646\u0627\u0628\u0639 \u06a9\u062f \u0645\u0646\u0628\u0639: https:\/\/github.com\/aelassas\/movinin \u0646\u0633\u062e\u0647 \u06cc \u0646\u0645\u0627\u06cc\u0634\u06cc: https:\/\/movin.dynv6.net:3004 \u0645\u0642\u062f\u0645\u0647 \u0627\u06cc\u0646 \u0627\u06cc\u062f\u0647 \u0627\u0632 \u062a\u0645\u0627\u06cc\u0644 \u0628\u0647 \u0633\u0627\u062e\u062a \u0648 \u0633\u0627\u0632 \u0628\u062f\u0648\u0646 \u0645\u0631\u0632 &#8211; \u06cc\u06a9 \u067e\u0644\u062a \u0641\u0631\u0645 \u0627\u062c\u0627\u0631\u0647 \u0645\u0644\u06a9 \u06a9\u0627\u0645\u0644\u0627\u064b \u0642\u0627\u0628\u0644 \u062a\u0646\u0638\u06cc\u0645 \u0648 \u0639\u0645\u0644\u06cc\u0627\u062a\u06cc &hellip;<\/p>\n","protected":false},"author":2,"featured_media":83260,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-83259","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/83259","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=83259"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/83259\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/83260"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=83259"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=83259"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=83259"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}