{"id":73785,"date":"2024-08-17T18:06:48","date_gmt":"2024-08-17T14:36:48","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/"},"modified":"2024-08-17T18:06:48","modified_gmt":"2024-08-17T14:36:48","slug":"modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/","title":{"rendered":"\u062a\u0648\u0633\u0639\u0647 API \u0645\u062f\u0631\u0646 \u0628\u0627 Node.js\u060c Express \u0648 TypeScript \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Clean Architecture"},"content":{"rendered":"<p>Summarize this content to 400 words in Persian Lang<br \/>\n            API \u0647\u0627 \u0633\u062a\u0648\u0646 \u0641\u0642\u0631\u0627\u062a \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u0648\u0628 \u0645\u062f\u0631\u0646 \u0647\u0633\u062a\u0646\u062f. \u0628\u0627 \u0627\u0641\u0632\u0627\u06cc\u0634 \u067e\u06cc\u0686\u06cc\u062f\u06af\u06cc \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u060c \u0627\u062a\u062e\u0627\u0630 \u0645\u0639\u0645\u0627\u0631\u06cc \u06a9\u0647 \u0645\u0642\u06cc\u0627\u0633\u200c\u067e\u0630\u06cc\u0631\u06cc\u060c \u0642\u0627\u0628\u0644\u06cc\u062a \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u0648 \u0622\u0632\u0645\u0627\u06cc\u0634\u200c\u067e\u0630\u06cc\u0631\u06cc \u0631\u0627 \u0627\u0631\u062a\u0642\u0627 \u0645\u06cc\u200c\u062f\u0647\u062f\u060c \u0628\u0633\u06cc\u0627\u0631 \u0645\u0647\u0645 \u0627\u0633\u062a. \u062f\u0631 \u0627\u06cc\u0646 \u0648\u0628\u0644\u0627\u06af\u060c \u0646\u062d\u0648\u0647 \u0633\u0627\u062e\u062a \u06cc\u06a9 API \u0645\u062f\u0631\u0646 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Node.js\u060c Express\u060c \u0648 TypeScript \u0631\u0627 \u0628\u0627 \u0631\u0639\u0627\u06cc\u062a \u0627\u0635\u0648\u0644 Clean Architecture \u0628\u0631\u0631\u0633\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f.<\/p>\n<p>\u0644\u0637\u0641\u0627 \u0628\u0631\u0627\u06cc \u062d\u0645\u0627\u06cc\u062a \u0627\u0632 \u06a9\u0627\u0646\u0627\u0644 \u0645\u0646 \u0648 \u062f\u0631\u06cc\u0627\u0641\u062a \u0622\u0645\u0648\u0632\u0634 \u0647\u0627\u06cc \u0628\u06cc\u0634\u062a\u0631 \u062a\u0648\u0633\u0639\u0647 \u0648\u0628\u060c \u062f\u0631 \u06a9\u0627\u0646\u0627\u0644 \u06cc\u0648\u062a\u06cc\u0648\u0628 \u0645\u0646 \u0645\u0634\u062a\u0631\u06a9 \u0634\u0648\u06cc\u062f.<\/p>\n<p>  \ud83d\udcd1 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>  1. \ud83e\udde9 \u0645\u0642\u062f\u0645\u0647 \u0627\u06cc \u0628\u0631 \u0645\u0639\u0645\u0627\u0631\u06cc \u067e\u0627\u06a9<\/p>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u0645\u0639\u0645\u0627\u0631\u06cc \u067e\u0627\u06a9\u060c \u0645\u0639\u0631\u0641\u06cc \u0634\u062f\u0647 \u062a\u0648\u0633\u0637 \u0631\u0627\u0628\u0631\u062a \u0633\u06cc \u0645\u0627\u0631\u062a\u06cc\u0646 (\u0639\u0645\u0648 \u0628\u0627\u0628)\u060c \u0628\u0631 \u062c\u062f\u0627\u0633\u0627\u0632\u06cc \u0646\u06af\u0631\u0627\u0646\u06cc \u0647\u0627 \u062f\u0631 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u062a\u0627\u06a9\u06cc\u062f \u062f\u0627\u0631\u062f. \u0627\u06cc\u0646 \u0627\u06cc\u062f\u0647 \u0631\u0627 \u062a\u0631\u0648\u06cc\u062c \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0645\u0646\u0637\u0642 \u062a\u062c\u0627\u0631\u06cc \u0628\u0627\u06cc\u062f \u0645\u0633\u062a\u0642\u0644 \u0627\u0632 \u0647\u0631 \u0686\u0627\u0631\u0686\u0648\u0628\u060c \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u06cc\u0627 \u0633\u06cc\u0633\u062a\u0645 \u062e\u0627\u0631\u062c\u06cc \u0628\u0627\u0634\u062f. \u0627\u06cc\u0646 \u0628\u0627\u0639\u062b \u0645\u06cc\u200c\u0634\u0648\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0627\u0698\u0648\u0644\u0627\u0631\u062a\u0631\u060c \u0622\u0632\u0645\u0627\u06cc\u0634 \u0622\u0633\u0627\u0646\u200c\u062a\u0631 \u0648 \u0633\u0627\u0632\u06af\u0627\u0631 \u0628\u0627 \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u0628\u0627\u0634\u062f.<\/p>\n<p>  \u0627\u0635\u0648\u0644 \u06a9\u0644\u06cc\u062f\u06cc \u0645\u0639\u0645\u0627\u0631\u06cc \u067e\u0627\u06a9:<\/p>\n<p>\u0627\u0633\u062a\u0642\u0644\u0627\u0644: \u0645\u0646\u0637\u0642 \u0627\u0635\u0644\u06cc \u06a9\u0633\u0628 \u0648 \u06a9\u0627\u0631 \u0646\u0628\u0627\u06cc\u062f \u0628\u0647 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0647\u0627\u06cc \u062e\u0627\u0631\u062c\u06cc\u060c UI\u060c \u067e\u0627\u06cc\u06af\u0627\u0647 \u0647\u0627\u06cc \u062f\u0627\u062f\u0647 \u06cc\u0627 \u0686\u0627\u0631\u0686\u0648\u0628 \u0647\u0627 \u0628\u0633\u062a\u06af\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f.<\/p>\n<p>\u0622\u0632\u0645\u0627\u06cc\u0634 \u067e\u0630\u06cc\u0631\u06cc: \u0622\u0632\u0645\u0627\u06cc\u0634 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0627\u06cc\u062f \u0628\u062f\u0648\u0646 \u0627\u062a\u06a9\u0627 \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0647\u0627\u06cc \u062e\u0627\u0631\u062c\u06cc \u0622\u0633\u0627\u0646 \u0628\u0627\u0634\u062f.<\/p>\n<p>\u0627\u0646\u0639\u0637\u0627\u0641 \u067e\u0630\u06cc\u0631\u06cc: \u062a\u063a\u06cc\u06cc\u0631 \u06cc\u0627 \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646\u06cc \u0628\u062e\u0634 \u0647\u0627\u06cc\u06cc \u0627\u0632 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0627\u06cc\u062f \u0622\u0633\u0627\u0646 \u0628\u0627\u0634\u062f \u0628\u062f\u0648\u0646 \u0627\u06cc\u0646\u06a9\u0647 \u0631\u0648\u06cc \u062f\u06cc\u06af\u0631\u0627\u0646 \u062a\u0623\u062b\u06cc\u0631 \u0628\u06af\u0630\u0627\u0631\u062f.<\/p>\n<p>  2. \ud83d\udca1 \u0686\u0631\u0627 Node.js\u060c Express \u0648 TypeScript\u061f<\/p>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>  Node.js<\/p>\n<p>Node.js \u06cc\u06a9 \u0632\u0645\u0627\u0646 \u0627\u062c\u0631\u0627 \u0642\u062f\u0631\u062a\u0645\u0646\u062f \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0627\u0633\u062a \u06a9\u0647 \u0628\u0647 \u0634\u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u0634\u0628\u06a9\u0647 \u0645\u0642\u06cc\u0627\u0633 \u067e\u0630\u06cc\u0631 \u0628\u0633\u0627\u0632\u06cc\u062f. \u063a\u06cc\u0631 \u0645\u0633\u062f\u0648\u062f \u06a9\u0646\u0646\u062f\u0647 \u0648 \u0631\u0648\u06cc\u062f\u0627\u062f \u0645\u062d\u0648\u0631 \u0627\u0633\u062a \u0648 \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a API\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u062a\u0639\u062f\u0627\u062f \u0632\u06cc\u0627\u062f\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u06cc \u06a9\u0646\u0646\u062f \u0627\u06cc\u062f\u0647 \u0622\u0644 \u0627\u0633\u062a.<\/p>\n<p>  \u0627\u06a9\u0633\u067e\u0631\u0633<\/p>\n<p>Express \u06cc\u06a9 \u0686\u0627\u0631\u0686\u0648\u0628 \u0648\u0628 \u0645\u06cc\u0646\u06cc\u0645\u0627\u0644\u06cc\u0633\u062a\u06cc \u0628\u0631\u0627\u06cc Node.js \u0627\u0633\u062a. \u0645\u062c\u0645\u0648\u0639\u0647 \u0627\u06cc \u0642\u0648\u06cc \u0627\u0632 \u0648\u06cc\u0698\u06af\u06cc \u0647\u0627 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u0648\u0628 \u0648 \u0645\u0648\u0628\u0627\u06cc\u0644 \u0648 API \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f. \u0633\u0627\u062f\u06af\u06cc \u0622\u0646 \u0634\u0631\u0648\u0639 \u0631\u0627 \u0622\u0633\u0627\u0646 \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0628\u0633\u06cc\u0627\u0631 \u062a\u0648\u0633\u0639\u0647 \u067e\u0630\u06cc\u0631 \u0627\u0633\u062a.<\/p>\n<p>  TypeScript<\/p>\n<p>TypeScript \u0627\u0628\u0631 \u0645\u062c\u0645\u0648\u0639\u0647 \u0627\u06cc \u0627\u0632 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0627\u0633\u062a \u06a9\u0647 \u0627\u0646\u0648\u0627\u0639 \u0627\u0633\u062a\u0627\u062a\u06cc\u06a9 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc \u06a9\u0646\u062f. \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 TypeScript \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 Node.js \u0628\u0647 \u0634\u0646\u0627\u0633\u0627\u06cc\u06cc \u062e\u0637\u0627\u0647\u0627 \u062f\u0631 \u0645\u0631\u0627\u062d\u0644 \u0627\u0648\u0644\u06cc\u0647 \u062a\u0648\u0633\u0639\u0647\u060c \u0628\u0647\u0628\u0648\u062f \u062e\u0648\u0627\u0646\u0627\u06cc\u06cc \u06a9\u062f \u0648 \u0627\u0641\u0632\u0627\u06cc\u0634 \u062a\u062c\u0631\u0628\u0647 \u06a9\u0644\u06cc \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u0647 \u06a9\u0645\u06a9 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>  3. \ud83d\udea7 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u067e\u0631\u0648\u0698\u0647<\/p>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u0627\u0628\u062a\u062f\u0627 \u0628\u06cc\u0627\u06cc\u06cc\u062f \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 Node.js \u062c\u062f\u06cc\u062f \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u0645 \u0648 TypeScript \u0631\u0627 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u0645.<\/p>\n<p>mkdir clean-architecture-api<br \/>\ncd clean-architecture-api<br \/>\nnpm init -y<br \/>\nnpm install express<br \/>\nnpm install typescript @types\/node @types\/express ts-node-dev &#8211;save-dev<br \/>\nnpx tsc &#8211;init<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0628\u0639\u062f\u060c \u062e\u0648\u062f \u0631\u0627 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0646\u06cc\u062f tsconfig.json:<\/p>\n<p>{<br \/>\n  &#8220;compilerOptions&#8221;: {<br \/>\n    &#8220;target&#8221;: &#8220;ES2020&#8221;,<br \/>\n    &#8220;module&#8221;: &#8220;commonjs&#8221;,<br \/>\n    &#8220;strict&#8221;: true,<br \/>\n    &#8220;esModuleInterop&#8221;: true,<br \/>\n    &#8220;skipLibCheck&#8221;: true,<br \/>\n    &#8220;forceConsistentCasingInFileNames&#8221;: true,<br \/>\n    &#8220;outDir&#8221;: &#8220;.\/dist&#8221;<br \/>\n  },<br \/>\n  &#8220;include&#8221;: [&#8220;src\/**\/*.ts&#8221;],<br \/>\n  &#8220;exclude&#8221;: [&#8220;node_modules&#8221;]\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  4. \ud83c\udfd7\ufe0f \u0633\u0627\u062e\u062a\u0627\u0631 \u067e\u0631\u0648\u0698\u0647 \u0628\u0627 \u0645\u0639\u0645\u0627\u0631\u06cc \u067e\u0627\u06a9<\/p>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 \u0645\u0639\u0645\u0648\u0644\u06cc Clean Architecture \u0628\u0647 \u0644\u0627\u06cc\u0647 \u0647\u0627\u06cc \u0632\u06cc\u0631 \u062a\u0642\u0633\u06cc\u0645 \u0645\u06cc \u0634\u0648\u062f:<\/p>\n<p>\u0644\u0627\u06cc\u0647 \u062f\u0627\u0645\u0646\u0647: \u0634\u0627\u0645\u0644 \u0645\u0646\u0637\u0642 \u062a\u062c\u0627\u0631\u06cc\u060c \u0645\u0648\u062c\u0648\u062f\u06cc\u062a \u0647\u0627 \u0648 \u0631\u0627\u0628\u0637 \u0647\u0627 \u0645\u06cc \u0628\u0627\u0634\u062f. \u0627\u06cc\u0646 \u0644\u0627\u06cc\u0647 \u0645\u0633\u062a\u0642\u0644 \u0627\u0632 \u0647\u0631 \u0644\u0627\u06cc\u0647 \u062f\u06cc\u06af\u0631 \u0627\u0633\u062a.<\/p>\n<p>\u0627\u0632 \u0644\u0627\u06cc\u0647 Cases \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f: \u0634\u0627\u0645\u0644 \u0645\u0648\u0627\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06cc\u0627 \u0642\u0648\u0627\u0646\u06cc\u0646 \u062a\u062c\u0627\u0631\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0633\u062a.<\/p>\n<p>\u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a: \u0634\u0627\u0645\u0644 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0631\u0627\u0628\u0637 \u0647\u0627\u06cc \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 \u062f\u0631 \u0644\u0627\u06cc\u0647 \u062f\u0627\u0645\u0646\u0647\u060c \u0645\u0627\u0646\u0646\u062f \u0627\u062a\u0635\u0627\u0644\u0627\u062a \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<p>\u0644\u0627\u06cc\u0647 \u0631\u0627\u0628\u0637: \u0634\u0627\u0645\u0644 \u06a9\u0646\u062a\u0631\u0644\u0631\u0647\u0627\u060c \u0645\u0633\u06cc\u0631\u0647\u0627 \u0648 \u0647\u0631 \u06a9\u062f \u062f\u06cc\u06af\u0631\u06cc \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u0686\u0627\u0631\u0686\u0648\u0628 \u0648\u0628 \u0627\u0633\u062a.<\/p>\n<p>\u0633\u0627\u062e\u062a\u0627\u0631 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0628\u0647 \u0634\u06a9\u0644 \u0632\u06cc\u0631 \u0628\u0627\u0634\u062f:<\/p>\n<p>src\/<br \/>\n\u251c\u2500\u2500 domain\/<br \/>\n\u2502   \u251c\u2500\u2500 entities\/<br \/>\n\u2502   \u2514\u2500\u2500 interfaces\/<br \/>\n\u251c\u2500\u2500 use-cases\/<br \/>\n\u251c\u2500\u2500 infrastructure\/<br \/>\n\u2502   \u251c\u2500\u2500 database\/<br \/>\n\u2502   \u2514\u2500\u2500 repositories\/<br \/>\n\u2514\u2500\u2500 interface\/<br \/>\n    \u251c\u2500\u2500 controllers\/<br \/>\n    \u2514\u2500\u2500 routes\/<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  5. \ud83d\udcc2 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0644\u0627\u06cc\u0647 \u062f\u0627\u0645\u0646\u0647<\/p>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u062f\u0631 \u0644\u0627\u06cc\u0647 \u062f\u0627\u0645\u0646\u0647\u060c \u0646\u0647\u0627\u062f\u0647\u0627 \u0648 \u0631\u0627\u0628\u0637 \u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u062f. \u0641\u0631\u0636 \u06a9\u0646\u06cc\u062f \u062f\u0631 \u062d\u0627\u0644 \u0633\u0627\u062e\u062a \u06cc\u06a9 API \u0633\u0627\u062f\u0647 \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u062a\u0627\u0628 \u0647\u0633\u062a\u06cc\u0645.<\/p>\n<p>\u0646\u0647\u0627\u062f (\u06a9\u062a\u0627\u0628):<\/p>\n<p>\/\/ src\/domain\/entities\/Book.ts<br \/>\nexport class Book {<br \/>\n  constructor(<br \/>\n    public readonly id: string,<br \/>\n    public title: string,<br \/>\n    public author: string,<br \/>\n    public publishedDate: Date<br \/>\n  ) {}<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0631\u0627\u0628\u0637 \u0645\u062e\u0632\u0646:<\/p>\n<p>\/\/ src\/domain\/interfaces\/BookRepository.ts<br \/>\nimport { Book } from &#8220;..\/entities\/Book&#8221;;<\/p>\n<p>export interface BookRepository {<br \/>\n  findAll(): PromiseBook[]&gt;;<br \/>\n  findById(id: string): PromiseBook | null&gt;;<br \/>\n  create(book: Book): PromiseBook&gt;;<br \/>\n  update(book: Book): Promisevoid&gt;;<br \/>\n  delete(id: string): Promisevoid&gt;;<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  6. \ud83d\udd27 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0645\u0648\u0627\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647<\/p>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u0645\u0648\u0627\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0642\u062f\u0627\u0645\u0627\u062a\u06cc \u0631\u0627 \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646 \u062f\u0631 \u0633\u06cc\u0633\u062a\u0645 \u0627\u0646\u062c\u0627\u0645 \u062f\u0627\u062f \u0631\u0627 \u0645\u0634\u062e\u0635 \u0645\u06cc \u06a9\u0646\u062f. \u0622\u0646\u0647\u0627 \u0628\u0627 \u0644\u0627\u06cc\u0647 \u062f\u0627\u0645\u0646\u0647 \u062a\u0639\u0627\u0645\u0644 \u062f\u0627\u0631\u0646\u062f \u0648 \u0646\u0633\u0628\u062a \u0628\u0647 \u0686\u0627\u0631\u0686\u0648\u0628 \u06cc\u0627 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u0648\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0622\u06af\u0646\u0648\u0633\u062a\u06cc\u06a9 \u0647\u0633\u062a\u0646\u062f.<\/p>\n<p>Use Case (GetAllBooks):<\/p>\n<p>\/\/ src\/use-cases\/GetAllBooks.ts<br \/>\nimport { BookRepository } from &#8220;..\/domain\/interfaces\/BookRepository&#8221;;<\/p>\n<p>export class GetAllBooks {<br \/>\n  constructor(private bookRepository: BookRepository) {}<\/p>\n<p>  async execute() {<br \/>\n    return await this.bookRepository.findAll();<br \/>\n  }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  7. \ud83d\uddc2\ufe0f \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a<\/p>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u062f\u0631 \u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a\u060c \u0631\u0627\u0628\u0637 \u0647\u0627\u06cc \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 \u062f\u0631 \u0644\u0627\u06cc\u0647 \u062f\u0627\u0645\u0646\u0647 \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f. \u0627\u06cc\u0646\u062c\u0627 \u062c\u0627\u06cc\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0634\u0645\u0627 \u0628\u0627 \u067e\u0627\u06cc\u06af\u0627\u0647 \u0647\u0627\u06cc \u062f\u0627\u062f\u0647 \u06cc\u0627 \u0633\u0631\u0648\u06cc\u0633 \u0647\u0627\u06cc \u062e\u0627\u0631\u062c\u06cc \u062a\u0639\u0627\u0645\u0644 \u062f\u0627\u0631\u06cc\u062f.<\/p>\n<p>\u0645\u062e\u0632\u0646 \u062f\u0631\u0648\u0646 \u062d\u0627\u0641\u0638\u0647 (\u0628\u0631\u0627\u06cc \u0633\u0627\u062f\u06af\u06cc):<\/p>\n<p>\/\/ src\/infrastructure\/repositories\/InMemoryBookRepository.ts<br \/>\nimport { Book } from &#8220;..\/..\/domain\/entities\/Book&#8221;;<br \/>\nimport { BookRepository } from &#8220;..\/..\/domain\/interfaces\/BookRepository&#8221;;<\/p>\n<p>export class InMemoryBookRepository implements BookRepository {<br \/>\n  private books: Book[] = [];<\/p>\n<p>  async findAll(): PromiseBook[]&gt; {<br \/>\n    return this.books;<br \/>\n  }<\/p>\n<p>  async findById(id: string): PromiseBook | null&gt; {<br \/>\n    return this.books.find(book =&gt; book.id === id) || null;<br \/>\n  }<\/p>\n<p>  async create(book: Book): PromiseBook&gt; {<br \/>\n    this.books.push(book);<br \/>\n    return book;<br \/>\n  }<\/p>\n<p>  async update(book: Book): Promisevoid&gt; {<br \/>\n    const index = this.books.findIndex(b =&gt; b.id === book.id);<br \/>\n    if (index !== -1) {<br \/>\n      this.books[index] = book;<br \/>\n    }<br \/>\n  }<\/p>\n<p>  async delete(id: string): Promisevoid&gt; {<br \/>\n    this.books = this.books.filter(book =&gt; book.id !== id);<br \/>\n  }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  8. \ud83c\udf10 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0644\u0627\u06cc\u0647 \u0631\u0627\u0628\u0637<\/p>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u0644\u0627\u06cc\u0647 \u0631\u0627\u0628\u0637 \u0634\u0627\u0645\u0644 \u06a9\u0646\u062a\u0631\u0644\u200c\u06a9\u0646\u0646\u062f\u0647\u200c\u0647\u0627 \u0648 \u0645\u0633\u06cc\u0631\u0647\u0627\u06cc\u06cc \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc HTTP \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f \u0648 \u0622\u0646\u0647\u0627 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0645\u0648\u0627\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0646\u0642\u0634\u0647\u200c\u0628\u0631\u062f\u0627\u0631\u06cc \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f.<\/p>\n<p>\u06a9\u0646\u062a\u0631\u0644 \u06a9\u0646\u0646\u062f\u0647 \u06a9\u062a\u0627\u0628:<\/p>\n<p>\/\/ src\/interface\/controllers\/BookController.ts<br \/>\nimport { Request, Response } from &#8220;express&#8221;;<br \/>\nimport { GetAllBooks } from &#8220;..\/..\/use-cases\/GetAllBooks&#8221;;<\/p>\n<p>export class BookController {<br \/>\n  constructor(private getAllBooks: GetAllBooks) {}<\/p>\n<p>  async getAll(req: Request, res: Response) {<br \/>\n    const books = await this.getAllBooks.execute();<br \/>\n    res.json(books);<br \/>\n  }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0645\u0633\u06cc\u0631\u0647\u0627:<\/p>\n<p>\/\/ src\/interface\/routes\/bookRoutes.ts<br \/>\nimport { Router } from &#8220;express&#8221;;<br \/>\nimport { InMemoryBookRepository } from &#8220;..\/..\/infrastructure\/repositories\/InMemoryBookRepository&#8221;;<br \/>\nimport { GetAllBooks }<\/p>\n<p> from &#8220;..\/..\/use-cases\/GetAllBooks&#8221;;<br \/>\nimport { BookController } from &#8220;..\/controllers\/BookController&#8221;;<\/p>\n<p>const router = Router();<\/p>\n<p>const bookRepository = new InMemoryBookRepository();<br \/>\nconst getAllBooks = new GetAllBooks(bookRepository);<br \/>\nconst bookController = new BookController(getAllBooks);<\/p>\n<p>router.get(&#8220;\/books&#8221;, (req, res) =&gt; bookController.getAll(req, res));<\/p>\n<p>export { router as bookRoutes };<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0635\u0644\u06cc:<\/p>\n<p>\/\/ src\/index.ts<br \/>\nimport express from &#8220;express&#8221;;<br \/>\nimport { bookRoutes } from &#8220;.\/interface\/routes\/bookRoutes&#8221;;<\/p>\n<p>const app = express();<\/p>\n<p>app.use(express.json());<br \/>\napp.use(&#8220;\/api&#8221;, bookRoutes);<\/p>\n<p>const PORT = 3000;<br \/>\napp.listen(PORT, () =&gt; {<br \/>\n  console.log(`Server is running on port ${PORT}`);<br \/>\n});<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  9. \ud83d\udd0c \u062a\u0632\u0631\u06cc\u0642 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc<\/p>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u062a\u0632\u0631\u06cc\u0642 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc (DI) \u062a\u06a9\u0646\u06cc\u06a9\u06cc \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc\u200c\u0647\u0627\u06cc \u06cc\u06a9 \u0634\u06cc \u0628\u0647 \u062c\u0627\u06cc \u06a9\u062f\u06af\u0630\u0627\u0631\u06cc \u0633\u062e\u062a \u062f\u0631 \u062f\u0627\u062e\u0644 \u0634\u06cc \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc\u200c\u0634\u0648\u0646\u062f. \u0627\u06cc\u0646 \u0627\u0645\u0631 \u0627\u062a\u0635\u0627\u0644 \u0634\u0644 \u0631\u0627 \u062a\u0631\u0648\u06cc\u062c \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0622\u0632\u0645\u0627\u06cc\u0634 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0631\u0627 \u0622\u0633\u0627\u0646 \u062a\u0631 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>  \u0645\u062b\u0627\u0644:<\/p>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u06cc\u06a9 \u0645\u06a9\u0627\u0646\u06cc\u0633\u0645 DI \u0633\u0627\u062f\u0647 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 TypeScript \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u0645.<\/p>\n<p>\/\/ src\/infrastructure\/DIContainer.ts<br \/>\nimport { InMemoryBookRepository } from &#8220;.\/repositories\/InMemoryBookRepository&#8221;;<br \/>\nimport { GetAllBooks } from &#8220;..\/use-cases\/GetAllBooks&#8221;;<\/p>\n<p>class DIContainer {<br \/>\n  private static _bookRepository = new InMemoryBookRepository();<\/p>\n<p>  static getBookRepository() {<br \/>\n    return this._bookRepository;<br \/>\n  }<\/p>\n<p>  static getGetAllBooksUseCase() {<br \/>\n    return new GetAllBooks(this.getBookRepository());<br \/>\n  }<br \/>\n}<\/p>\n<p>export { DIContainer };<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u0632 DIContainer \u062f\u0631 \u06a9\u0646\u062a\u0631\u0644\u0631\u0647\u0627\u06cc \u062e\u0648\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<p>\/\/ src\/interface\/controllers\/BookController.ts<br \/>\nimport { Request, Response } from &#8220;express&#8221;;<br \/>\nimport { DIContainer } from &#8220;..\/..\/infrastructure\/DIContainer&#8221;;<\/p>\n<p>export class BookController {<br \/>\n  private getAllBooks = DIContainer.getGetAllBooksUseCase();<\/p>\n<p>  async getAll(req: Request, res: Response) {<br \/>\n    const books = await this.getAllBooks.execute();<br \/>\n    res.json(books);<br \/>\n  }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  10. \ud83d\udea8 \u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u062e\u0637\u0627<\/p>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u0645\u062f\u06cc\u0631\u06cc\u062a \u0635\u062d\u06cc\u062d \u062e\u0637\u0627 \u062a\u0636\u0645\u06cc\u0646 \u0645\u06cc\u200c\u06a9\u0646\u062f \u06a9\u0647 API \u0634\u0645\u0627 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u0645\u0648\u0642\u0639\u06cc\u062a\u200c\u0647\u0627\u06cc \u063a\u06cc\u0631\u0645\u0646\u062a\u0638\u0631\u0647 \u0631\u0627 \u0628\u0647 \u062e\u0648\u0628\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u062f \u0648 \u067e\u06cc\u0627\u0645\u200c\u0647\u0627\u06cc \u062e\u0637\u0627\u06cc \u0645\u0639\u0646\u06cc\u200c\u062f\u0627\u0631\u06cc \u0631\u0627 \u0628\u0647 \u0645\u0634\u062a\u0631\u06cc\u0627\u0646 \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u062f.<\/p>\n<p>  \u0645\u062b\u0627\u0644:<\/p>\n<p>\u06cc\u06a9 \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631 \u0645\u062a\u0645\u0631\u06a9\u0632 \u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u062e\u0637\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f:<\/p>\n<p>\/\/ src\/interface\/middleware\/errorHandler.ts<br \/>\nimport { Request, Response, NextFunction } from &#8220;express&#8221;;<\/p>\n<p>export function errorHandler(err: any, req: Request, res: Response, next: NextFunction) {<br \/>\n  console.error(err.stack);<br \/>\n  res.status(500).json({ message: &#8220;Internal Server Error&#8221; });<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u0632 \u0627\u06cc\u0646 \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0635\u0644\u06cc \u062e\u0648\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<p>\/\/ src\/index.ts<br \/>\nimport express from &#8220;express&#8221;;<br \/>\nimport { bookRoutes } from &#8220;.\/interface\/routes\/bookRoutes&#8221;;<br \/>\nimport { errorHandler } from &#8220;.\/interface\/middleware\/errorHandler&#8221;;<\/p>\n<p>const app = express();<\/p>\n<p>app.use(express.json());<br \/>\napp.use(&#8220;\/api&#8221;, bookRoutes);<br \/>\napp.use(errorHandler);<\/p>\n<p>const PORT = 3000;<br \/>\napp.listen(PORT, () =&gt; {<br \/>\n  console.log(`Server is running on port ${PORT}`);<br \/>\n});<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  11. \u2714\ufe0f \u0627\u0639\u062a\u0628\u0627\u0631 \u0633\u0646\u062c\u06cc<\/p>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc \u0628\u0631\u0627\u06cc \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 \u0635\u062d\u062a \u0648 \u0627\u06cc\u0645\u0646 \u0628\u0648\u062f\u0646 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0648\u0627\u0631\u062f \u0634\u062f\u0647 \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0628\u0633\u06cc\u0627\u0631 \u0645\u0647\u0645 \u0627\u0633\u062a.<\/p>\n<p>  \u0645\u062b\u0627\u0644:<\/p>\n<p>\u0627\u062f\u063a\u0627\u0645 \u06a9\u0646\u06cc\u062f class-validator \u0628\u0631\u0627\u06cc \u062a\u0627\u06cc\u06cc\u062f \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0647\u0627\u06cc \u062f\u0631\u06cc\u0627\u0641\u062a\u06cc:<\/p>\n<p>npm install class-validator class-transformer<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u06cc\u06a9 DTO (Data Transfer Object) \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u06a9\u062a\u0627\u0628 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f:<\/p>\n<p>\/\/ src\/interface\/dto\/CreateBookDto.ts<br \/>\nimport { IsString, IsDate } from &#8220;class-validator&#8221;;<\/p>\n<p>export class CreateBookDto {<br \/>\n  @IsString()<br \/>\n  title!: string;<\/p>\n<p>  @IsString()<br \/>\n  author!: string;<\/p>\n<p>  @IsDate()<br \/>\n  publishedDate!: Date;<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>DTO \u0631\u0627 \u062f\u0631 \u06a9\u0646\u062a\u0631\u0644\u0631 \u062e\u0648\u062f \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u06cc\u062f:<\/p>\n<p>\/\/ src\/interface\/controllers\/BookController.ts<br \/>\nimport { Request, Response } from &#8220;express&#8221;;<br \/>\nimport { validate } from &#8220;class-validator&#8221;;<br \/>\nimport { CreateBookDto } from &#8220;..\/dto\/CreateBookDto&#8221;;<br \/>\nimport { DIContainer } from &#8220;..\/..\/infrastructure\/DIContainer&#8221;;<\/p>\n<p>export class BookController {<br \/>\n  private getAllBooks = DIContainer.getGetAllBooksUseCase();<\/p>\n<p>  async create(req: Request, res: Response) {<br \/>\n    const dto = Object.assign(new CreateBookDto(), req.body);<br \/>\n    const errors = await validate(dto);<\/p>\n<p>    if (errors.length &gt; 0) {<br \/>\n      return res.status(400).json({ errors });<br \/>\n    }<\/p>\n<p>    \/\/ Proceed with the creation logic&#8230;<br \/>\n  }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  12. \ud83d\udcbe \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u0633\u0627\u0632\u06cc \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0648\u0627\u0642\u0639\u06cc<\/p>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u062c\u0627\u0628\u062c\u0627\u06cc\u06cc \u0627\u0632 \u06cc\u06a9 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u062f\u0631 \u062d\u0627\u0641\u0638\u0647 \u0628\u0647 \u06cc\u06a9 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0648\u0627\u0642\u0639\u06cc \u0645\u0627\u0646\u0646\u062f MongoDB \u06cc\u0627 PostgreSQL \u0628\u0627\u0639\u062b \u0645\u06cc \u0634\u0648\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0622\u0645\u0627\u062f\u0647 \u062a\u0648\u0644\u06cc\u062f \u0628\u0627\u0634\u062f.<\/p>\n<p>  \u0645\u062b\u0627\u0644:<\/p>\n<p>\u0627\u062f\u063a\u0627\u0645 MongoDB:<\/p>\n<p>npm install mongoose @types\/mongoose<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u06cc\u06a9 \u0645\u062f\u0644 Mongoose \u0628\u0631\u0627\u06cc Book:<\/p>\n<p>\/\/ src\/infrastructure\/models\/BookModel.ts<br \/>\nimport mongoose, { Schema, Document } from &#8220;mongoose&#8221;;<\/p>\n<p>interface IBook extends Document {<br \/>\n  title: string;<br \/>\n  author: string;<br \/>\n  publishedDate: Date;<br \/>\n}<\/p>\n<p>const BookSchema: Schema = new Schema({<br \/>\n  title: { type: String, required: true },<br \/>\n  author: { type: String, required: true },<br \/>\n  publishedDate: { type: Date, required: true },<br \/>\n});<\/p>\n<p>const BookModel = mongoose.modelIBook&gt;(&#8220;Book&#8221;, BookSchema);<br \/>\nexport { BookModel, IBook };<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u062c\u0631\u0627\u06cc \u0645\u062e\u0632\u0646:<\/p>\n<p>\/\/ src\/infrastructure\/repositories\/MongoBookRepository.ts<br \/>\nimport { Book } from &#8220;..\/..\/domain\/entities\/Book&#8221;;<br \/>\nimport { BookRepository } from &#8220;..\/..\/domain\/interfaces\/BookRepository&#8221;;<br \/>\nimport { BookModel } from &#8220;..\/models\/BookModel&#8221;;<\/p>\n<p>export class MongoBookRepository implements BookRepository {<br \/>\n  async findAll(): PromiseBook[]&gt; {<br \/>\n    return await BookModel.find();<br \/>\n  }<\/p>\n<p>  async findById(id: string): PromiseBook | null&gt; {<br \/>\n    return await BookModel.findById(id);<br \/>\n  }<\/p>\n<p>  async create(book: Book): PromiseBook&gt; {<br \/>\n    const newBook = new BookModel(book);<br \/>\n    await newBook.save();<br \/>\n    return newBook;<br \/>\n  }<\/p>\n<p>  async update(book: Book): Promisevoid&gt; {<br \/>\n    await BookModel.findByIdAndUpdate(book.id, book);<br \/>\n  }<\/p>\n<p>  async delete(id: string): Promisevoid&gt; {<br \/>\n    await BookModel.findByIdAndDelete(id);<br \/>\n  }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>DIContainer \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 MongoBookRepository \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u062f:<\/p>\n<p>\/\/ src\/infrastructure\/DIContainer.ts<br \/>\nimport { MongoBookRepository } from &#8220;.\/repositories\/MongoBookRepository&#8221;;<br \/>\nimport { GetAllBooks } from &#8220;..\/use-cases\/GetAllBooks&#8221;;<\/p>\n<p>class DIContainer {<br \/>\n  private static _bookRepository = new MongoBookRepository();<\/p>\n<p>  static getBookRepository() {<br \/>\n    return this._bookRepository;<br \/>\n  }<\/p>\n<p>  static getGetAllBooksUseCase() {<br \/>\n    return new GetAllBooks(this.getBookRepository());<br \/>\n  }<br \/>\n}<\/p>\n<p>export { DIContainer };<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  13. \ud83d\udd12 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0648 \u0645\u062c\u0648\u0632<\/p>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u0627\u06cc\u0645\u0646 \u0633\u0627\u0632\u06cc API \u0636\u0631\u0648\u0631\u06cc \u0627\u0633\u062a. JWT (JSON Web Tokens) \u06cc\u06a9 \u0631\u0648\u06cc\u06a9\u0631\u062f \u0631\u0627\u06cc\u062c \u0628\u0631\u0627\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0628\u062f\u0648\u0646 \u062d\u0627\u0644\u062a \u0627\u0633\u062a.<\/p>\n<p>  \u0645\u062b\u0627\u0644:<\/p>\n<p>JWT \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u062f\u063a\u0627\u0645 \u06a9\u0646\u06cc\u062f:<\/p>\n<p>npm install jsonwebtoken @types\/jsonwebtoken<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a:<\/p>\n<p>\/\/ src\/interface\/middleware\/auth.ts<br \/>\nimport jwt from &#8220;jsonwebtoken&#8221;;<br \/>\nimport { Request, Response, NextFunction } from &#8220;express&#8221;;<\/p>\n<p>export function authenticateToken(req: Request, res: Response, next: NextFunction) {<br \/>\n  const token = req.header(&#8220;Authorization&#8221;)?.split(&#8221; &#8220;)[1];<br \/>\n  if (!token) return res.sendStatus(401);<\/p>\n<p>  jwt.verify(token, process.env.JWT_SECRET as string, (err, user) =&gt; {<br \/>\n    if (err) return res.sendStatus(403);<br \/>\n    req.user = user;<br \/>\n    next();<br \/>\n  });<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u0632 \u0627\u06cc\u0646 \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631 \u0628\u0631\u0627\u06cc \u0645\u062d\u0627\u0641\u0638\u062a \u0627\u0632 \u0645\u0633\u06cc\u0631\u0647\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<p>\/\/ src\/interface\/routes\/bookRoutes.ts<br \/>\nimport { Router } from &#8220;express&#8221;;<br \/>\nimport { BookController } from &#8220;..\/controllers\/BookController&#8221;;<br \/>\nimport { authenticateToken } from &#8220;..\/middleware\/auth&#8221;;<\/p>\n<p>const router = Router();<\/p>\n<p>router.get(&#8220;\/books&#8221;, authenticateToken, (req, res) =&gt; bookController.getAll(req, res));<\/p>\n<p>export { router as bookRoutes };<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  14. \ud83d\udcdd \u062b\u0628\u062a \u0648 \u0646\u0638\u0627\u0631\u062a<\/p>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0628\u0631\u0627\u06cc \u0627\u0634\u06a9\u0627\u0644 \u0632\u062f\u0627\u06cc\u06cc \u0648 \u0646\u0638\u0627\u0631\u062a \u0628\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u062f\u0631 \u062a\u0648\u0644\u06cc\u062f \u0628\u0633\u06cc\u0627\u0631 \u0645\u0647\u0645 \u0627\u0633\u062a.<\/p>\n<p>  \u0645\u062b\u0627\u0644:<\/p>\n<p>\u0627\u062f\u063a\u0627\u0645 \u06a9\u0646\u06cc\u062f winston \u0628\u0631\u0627\u06cc \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645:<\/p>\n<p>npm install winston<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0644\u0627\u06af\u0631:<\/p>\n<p>\/\/ src\/infrastructure\/logger.ts<br \/>\nimport { createLogger, transports, format } from &#8220;winston&#8221;;<\/p>\n<p>const logger = createLogger({<br \/>\n  level: &#8220;info&#8221;,<br \/>\n  format: format.combine(format.timestamp(), format.json()),<br \/>\n  transports: [new transports.Console()],<br \/>\n});<\/p>\n<p>export { logger };<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u0632 \u0644\u0627\u06af\u0631 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<p>\/\/ src\/index.ts<br \/>\nimport express from &#8220;express&#8221;;<br \/>\nimport { bookRoutes } from &#8220;.\/interface\/routes\/bookRoutes&#8221;;<br \/>\nimport { errorHandler } from &#8220;.\/interface\/middleware\/errorHandler&#8221;;<br \/>\nimport { logger } from &#8220;.\/infrastructure\/logger&#8221;;<\/p>\n<p>const app = express();<\/p>\n<p>app.use(express.json());<br \/>\napp.use(&#8220;\/api&#8221;, bookRoutes);<br \/>\napp.use(errorHandler);<\/p>\n<p>const PORT = process.env.PORT || 3000;<br \/>\napp.listen(PORT, () =&gt; {<br \/>\n  logger.info(`Server is running on port ${PORT}`);<br \/>\n});<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  15. \u2699\ufe0f \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0645\u062d\u06cc\u0637<\/p>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u062d\u06cc\u0637 \u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u0628\u0631\u0627\u06cc \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 \u0627\u062c\u0631\u0627\u06cc \u0635\u062d\u06cc\u062d \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u062f\u0631 \u062a\u0648\u0633\u0639\u0647\u060c \u0622\u0632\u0645\u0627\u06cc\u0634 \u0648 \u062a\u0648\u0644\u06cc\u062f \u0628\u0633\u06cc\u0627\u0631 \u0645\u0647\u0645 \u0627\u0633\u062a.<\/p>\n<p>  \u0645\u062b\u0627\u0644:<\/p>\n<p>\u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 `<\/p>\n<p>dotenv` \u0628\u0631\u0627\u06cc \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0645\u062d\u06cc\u0637:<\/p>\n<p>npm install dotenv<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 .env \u0641\u0627\u06cc\u0644:<\/p>\n<p>PORT=3000<br \/>\nJWT_SECRET=your_jwt_secret<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637\u06cc \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627:<\/p>\n<p>\/\/ src\/index.ts<br \/>\nimport express from &#8220;express&#8221;;<br \/>\nimport dotenv from &#8220;dotenv&#8221;;<br \/>\ndotenv.config();<\/p>\n<p>import { bookRoutes } from &#8220;.\/interface\/routes\/bookRoutes&#8221;;<br \/>\nimport { errorHandler } from &#8220;.\/interface\/middleware\/errorHandler&#8221;;<br \/>\nimport { logger } from &#8220;.\/infrastructure\/logger&#8221;;<\/p>\n<p>const app = express();<\/p>\n<p>app.use(express.json());<br \/>\napp.use(&#8220;\/api&#8221;, bookRoutes);<br \/>\napp.use(errorHandler);<\/p>\n<p>const PORT = process.env.PORT || 3000;<br \/>\napp.listen(PORT, () =&gt; {<br \/>\n  logger.info(`Server is running on port ${PORT}`);<br \/>\n});<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  16. \ud83d\ude80 CI\/CD \u0648 \u0627\u0633\u062a\u0642\u0631\u0627\u0631<\/p>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u062e\u0648\u062f\u06a9\u0627\u0631\u0633\u0627\u0632\u06cc \u0622\u0632\u0645\u0627\u06cc\u0634\u060c \u0633\u0627\u062e\u062a \u0648 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 API \u0634\u0645\u0627 \u062b\u0628\u0627\u062a \u0648 \u0642\u0627\u0628\u0644\u06cc\u062a \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0631\u0627 \u062a\u0636\u0645\u06cc\u0646 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>  \u0645\u062b\u0627\u0644:<\/p>\n<p>\u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc GitHub Actions \u0628\u0631\u0627\u06cc CI\/CD:<\/p>\n<p>\u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 .github\/workflows\/ci.yml \u0641\u0627\u06cc\u0644:<\/p>\n<p>name: Node.js CI<\/p>\n<p>on:<br \/>\n  push:<br \/>\n    branches: [main]\n  pull_request:<br \/>\n    branches: [main]\n<p>jobs:<br \/>\n  build:<\/p>\n<p>    runs-on: ubuntu-latest<\/p>\n<p>    strategy:<br \/>\n      matrix:<br \/>\n        node-version: [14.x, 16.x]\n<p>    steps:<br \/>\n    &#8211; uses: actions\/checkout@v2<br \/>\n    &#8211; name: Use Node.js ${{ matrix.node-version }}<br \/>\n      uses: actions\/setup-node@v2<br \/>\n      with:<br \/>\n        node-version: ${{ matrix.node-version }}<br \/>\n    &#8211; run: npm install<br \/>\n    &#8211; run: npm test<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  17. \ud83e\uddf9 \u06a9\u06cc\u0641\u06cc\u062a \u0648 \u0644\u06cc\u0646\u062a\u06cc\u0646\u06af \u06a9\u062f<\/p>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u062d\u0641\u0638 \u06a9\u06cc\u0641\u06cc\u062a \u06a9\u062f \u06cc\u06a9\u0646\u0648\u0627\u062e\u062a \u062f\u0631 \u0645\u062d\u06cc\u0637 \u0647\u0627\u06cc \u0645\u0634\u0627\u0631\u06a9\u062a\u06cc \u0628\u0633\u06cc\u0627\u0631 \u0645\u0647\u0645 \u0627\u0633\u062a.<\/p>\n<p>  \u0645\u062b\u0627\u0644:<\/p>\n<p>ESLint \u0648 Prettier \u0631\u0627 \u0627\u062f\u063a\u0627\u0645 \u06a9\u0646\u06cc\u062f:<\/p>\n<p>npm install eslint prettier eslint-config-prettier eslint-plugin-prettier &#8211;save-dev<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u06cc\u06a9 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc ESLint \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f:<\/p>\n<p>\/\/ .eslintrc.json<br \/>\n{<br \/>\n  &#8220;env&#8221;: {<br \/>\n    &#8220;node&#8221;: true,<br \/>\n    &#8220;es6&#8221;: true<br \/>\n  },<br \/>\n  &#8220;extends&#8221;: [&#8220;eslint:recommended&#8221;, &#8220;plugin:@typescript-eslint\/recommended&#8221;, &#8220;prettier&#8221;],<br \/>\n  &#8220;plugins&#8221;: [&#8220;@typescript-eslint&#8221;, &#8220;prettier&#8221;],<br \/>\n  &#8220;parser&#8221;: &#8220;@typescript-eslint\/parser&#8221;,<br \/>\n  &#8220;rules&#8221;: {<br \/>\n    &#8220;prettier\/prettier&#8221;: &#8220;error&#8221;<br \/>\n  }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u0641\u0632\u0648\u062f\u0646 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0632\u06cc\u0628\u0627\u062a\u0631:<\/p>\n<p>\/\/ .prettierrc<br \/>\n{<br \/>\n  &#8220;singleQuote&#8221;: true,<br \/>\n  &#8220;trailingComma&#8221;: &#8220;all&#8221;,<br \/>\n  &#8220;printWidth&#8221;: 80<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  18. \ud83d\udee0\ufe0f \u0645\u0633\u062a\u0646\u062f\u0627\u062a \u067e\u0631\u0648\u0698\u0647<\/p>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u0645\u0633\u062a\u0646\u062f\u0633\u0627\u0632\u06cc API \u0634\u0645\u0627 \u0647\u0645 \u0628\u0631\u0627\u06cc \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u06af\u0627\u0646 \u0648 \u0647\u0645 \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0646\u0647\u0627\u06cc\u06cc \u0628\u0633\u06cc\u0627\u0631 \u0645\u0647\u0645 \u0627\u0633\u062a.<\/p>\n<p>  \u0645\u062b\u0627\u0644:<\/p>\n<p>\u0645\u0633\u062a\u0646\u062f\u0627\u062a API \u0631\u0627 \u0628\u0627 Swagger \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f:<\/p>\n<p>npm install swagger-jsdoc swagger-ui-express<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u06cc\u062c\u0627\u062f \u0645\u0633\u062a\u0646\u062f\u0627\u062a Swagger:<\/p>\n<p>\/\/ src\/interface\/swagger.ts<br \/>\nimport swaggerJSDoc from &#8220;swagger-jsdoc&#8221;;<br \/>\nimport swaggerUi from &#8220;swagger-ui-express&#8221;;<br \/>\nimport { Express } from &#8220;express&#8221;;<\/p>\n<p>const options = {<br \/>\n  definition: {<br \/>\n    openapi: &#8220;3.0.0&#8221;,<br \/>\n    info: {<br \/>\n      title: &#8220;Clean Architecture API&#8221;,<br \/>\n      version: &#8220;1.0.0&#8221;,<br \/>\n    },<br \/>\n  },<br \/>\n  apis: [&#8220;.\/src\/interface\/routes\/*.ts&#8221;],<br \/>\n};<\/p>\n<p>const swaggerSpec = swaggerJSDoc(options);<\/p>\n<p>function setupSwagger(app: Express) {<br \/>\n  app.use(&#8220;\/api-docs&#8221;, swaggerUi.serve, swaggerUi.setup(swaggerSpec));<br \/>\n}<\/p>\n<p>export { setupSwagger };<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>Swagger \u0631\u0627 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0635\u0644\u06cc \u062e\u0648\u062f \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f:<\/p>\n<p>\/\/ src\/index.ts<br \/>\nimport express from &#8220;express&#8221;;<br \/>\nimport dotenv from &#8220;dotenv&#8221;;<br \/>\ndotenv.config();<\/p>\n<p>import { bookRoutes } from &#8220;.\/interface\/routes\/bookRoutes&#8221;;<br \/>\nimport { errorHandler } from &#8220;.\/interface\/middleware\/errorHandler&#8221;;<br \/>\nimport { logger } from &#8220;.\/infrastructure\/logger&#8221;;<br \/>\nimport { setupSwagger } from &#8220;.\/interface\/swagger&#8221;;<\/p>\n<p>const app = express();<\/p>\n<p>app.use(express.json());<br \/>\napp.use(&#8220;\/api&#8221;, bookRoutes);<br \/>\napp.use(errorHandler);<br \/>\nsetupSwagger(app);<\/p>\n<p>const PORT = process.env.PORT || 3000;<br \/>\napp.listen(PORT, () =&gt; {<br \/>\n  logger.info(`Server is running on port ${PORT}`);<br \/>\n});<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  19. \ud83c\udfc1 \u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc<\/p>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0648\u0628\u0644\u0627\u06af\u060c \u0646\u062d\u0648\u0647 \u0633\u0627\u062e\u062a \u06cc\u06a9 API \u0645\u062f\u0631\u0646 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Node.js\u060c Express \u0648 TypeScript \u0631\u0627 \u0628\u0627 \u0631\u0639\u0627\u06cc\u062a \u0627\u0635\u0648\u0644 Clean Architecture \u0628\u0631\u0631\u0633\u06cc \u06a9\u0631\u062f\u06cc\u0645. \u0645\u0627 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0627\u0648\u0644\u06cc\u0647 \u0631\u0627 \u0628\u0627 \u0627\u0641\u0632\u0648\u062f\u0646 \u0648\u06cc\u0698\u06af\u06cc\u200c\u0647\u0627\u06cc \u06a9\u0644\u06cc\u062f\u06cc \u0645\u0627\u0646\u0646\u062f \u062a\u0632\u0631\u06cc\u0642 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc\u060c \u0645\u062f\u06cc\u0631\u06cc\u062a \u062e\u0637\u0627\u060c \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc\u060c \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647\u200c\u0633\u0627\u0632\u06cc \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0648\u0627\u0642\u0639\u06cc\u060c \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0648 \u0645\u062c\u0648\u0632\u060c \u062b\u0628\u062a \u0648 \u0646\u0638\u0627\u0631\u062a\u060c \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0645\u062d\u06cc\u0637\u060c CI\/CD\u060c \u06a9\u06cc\u0641\u06cc\u062a \u06a9\u062f \u0648 \u067e\u0631 \u06a9\u0631\u062f\u0646 \u0648 \u0645\u0633\u062a\u0646\u062f\u0627\u062a \u067e\u0631\u0648\u0698\u0647 \u06af\u0633\u062a\u0631\u0634 \u062f\u0627\u062f\u06cc\u0645.<\/p>\n<p>\u0628\u0627 \u067e\u06cc\u0631\u0648\u06cc \u0627\u0632 \u0627\u06cc\u0646 \u0634\u06cc\u0648\u0647\u200c\u0647\u0627\u060c \u0645\u0637\u0645\u0626\u0646 \u062e\u0648\u0627\u0647\u06cc\u062f \u0634\u062f \u06a9\u0647 API \u0634\u0645\u0627 \u0646\u0647 \u062a\u0646\u0647\u0627 \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u0627\u0633\u062a\u060c \u0628\u0644\u06a9\u0647 \u0642\u0627\u0628\u0644 \u0646\u06af\u0647\u062f\u0627\u0631\u06cc\u060c \u0645\u0642\u06cc\u0627\u0633\u200c\u067e\u0630\u06cc\u0631 \u0648 \u0622\u0645\u0627\u062f\u0647 \u0628\u0631\u0627\u06cc \u062a\u0648\u0644\u06cc\u062f \u0627\u0633\u062a. \u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u0628\u0647 \u062a\u0648\u0633\u0639\u0647 \u0627\u062f\u0627\u0645\u0647 \u0645\u06cc \u062f\u0647\u06cc\u062f\u060c \u0628\u0627 \u062e\u06cc\u0627\u0644 \u0631\u0627\u062d\u062a \u0627\u0644\u06af\u0648\u0647\u0627 \u0648 \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc \u0627\u0636\u0627\u0641\u06cc \u0631\u0627 \u0628\u0631\u0627\u06cc \u0628\u0647\u0628\u0648\u062f \u0628\u06cc\u0634\u062a\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u06a9\u0634\u0641 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>  \u0633\u0641\u0631 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u062e\u0648\u062f \u0631\u0627 \u0634\u0631\u0648\u0639 \u06a9\u0646\u06cc\u062f<\/p>\n<p>\u0627\u06af\u0631 \u0628\u0627 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u062a\u0627\u0632\u0647 \u06a9\u0627\u0631 \u0647\u0633\u062a\u06cc\u062f \u06cc\u0627 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u06cc\u06a9 \u062a\u0627\u0632\u0647 \u06a9\u0646\u0646\u062f\u0647 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f\u060c \u0627\u0632 \u0648\u0628\u0644\u0627\u06af \u0645\u0646 \u062f\u0631 BuyMeACoffee \u062f\u06cc\u062f\u0646 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0628\u0627 \u0627\u0635\u0648\u0644 \u0627\u0648\u0644\u06cc\u0647 \u0634\u0631\u0648\u0639 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\ud83d\udc49 \u0645\u0642\u062f\u0645\u0647 \u0627\u06cc \u0628\u0631 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a: \u0627\u0648\u0644\u06cc\u0646 \u0642\u062f\u0645 \u0647\u0627\u06cc \u0634\u0645\u0627 \u062f\u0631 \u06a9\u062f\u0646\u0648\u06cc\u0633\u06cc<\/p>\n<p>  \u0641\u0647\u0631\u0633\u062a \u0633\u0631\u06cc<\/p>\n<p>\u0642\u0633\u0645\u062a<br \/>\n\u0639\u0646\u0648\u0627\u0646<br \/>\n\u067e\u06cc\u0648\u0646\u062f<\/p>\n<p>1<br \/>\n\u06af\u0630\u0631\u0648\u0627\u0698\u0647\u200c\u0647\u0627 \u0631\u0627 \u062d\u0630\u0641 \u06a9\u0646\u06cc\u062f: \u0628\u0627 FACEIO \u0642\u0627\u0628\u0644\u06cc\u062a \u062a\u0634\u062e\u06cc\u0635 \u0686\u0647\u0631\u0647 \u0631\u0627 \u0628\u0647 \u0648\u0628\u200c\u0633\u0627\u06cc\u062a \u062e\u0648\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f<br \/>\n\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/p>\n<p>2<br \/>\n\u0686\u06cc\u062a \u0686\u06cc\u062a \u0646\u0647\u0627\u06cc\u06cc Git Command<br \/>\n\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/p>\n<p>3<br \/>\n12 \u0645\u0646\u0628\u0639 \u0628\u0631\u062a\u0631 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0628\u0631\u0627\u06cc \u06cc\u0627\u062f\u06af\u06cc\u0631\u06cc \u0648 \u062a\u0633\u0644\u0637<br \/>\n\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/p>\n<p>4<br \/>\nAngular vs. React: \u0645\u0642\u0627\u06cc\u0633\u0647 \u0627\u06cc \u062c\u0627\u0645\u0639<br \/>\n\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/p>\n<p>5<br \/>\n10 \u0631\u0648\u0634 \u0628\u0631\u062a\u0631 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0628\u0631\u0627\u06cc \u0646\u0648\u0634\u062a\u0646 \u06a9\u062f \u067e\u0627\u06a9<br \/>\n\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/p>\n<p>6<br \/>\n20 \u062a\u0631\u0641\u0646\u062f \u0648 \u0646\u06a9\u062a\u0647 \u0628\u0631\u062a\u0631 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0628\u0631\u0627\u06cc \u0647\u0631 \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u0647 \ud83d\ude80<br \/>\n\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/p>\n<p>7<br \/>\n8 \u0645\u0641\u0647\u0648\u0645 \u062c\u062f\u06cc\u062f \u0648 \u0647\u06cc\u062c\u0627\u0646 \u0627\u0646\u06af\u06cc\u0632 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u06a9\u0647 \u0628\u0627\u06cc\u062f \u0628\u062f\u0627\u0646\u06cc\u062f<br \/>\n\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/p>\n<p>8<br \/>\n7 \u0646\u06a9\u062a\u0647 \u0628\u0631\u062a\u0631 \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u0648\u0636\u0639\u06cc\u062a \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a<br \/>\n\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/p>\n<p>9<br \/>\n\ud83d\udd12 \u0628\u0647\u062a\u0631\u06cc\u0646 \u0631\u0648\u0634 \u0647\u0627\u06cc \u0627\u0645\u0646\u06cc\u062a\u06cc Essential Node.js<br \/>\n\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/p>\n<p>10<br \/>\n10 \u0628\u0647\u062a\u0631\u06cc\u0646 \u0631\u0648\u0634 \u0628\u0631\u0627\u06cc \u0628\u0647\u06cc\u0646\u0647 \u0633\u0627\u0632\u06cc \u0639\u0645\u0644\u06a9\u0631\u062f \u0632\u0627\u0648\u06cc\u0647 \u0627\u06cc<br \/>\n\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/p>\n<p>11<br \/>\n10 \u062a\u06a9\u0646\u06cc\u06a9 \u0628\u0631\u062a\u0631 \u0628\u0647\u06cc\u0646\u0647 \u0633\u0627\u0632\u06cc \u0639\u0645\u0644\u06a9\u0631\u062f React<br \/>\n\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/p>\n<p>12<br \/>\n15 \u067e\u0631\u0648\u0698\u0647 \u0628\u0631\u062a\u0631 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0628\u0631\u0627\u06cc \u062a\u0642\u0648\u06cc\u062a \u0646\u0645\u0648\u0646\u0647 \u06a9\u0627\u0631\u0647\u0627<br \/>\n\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/p>\n<p>13<br \/>\n6 \u0645\u062e\u0632\u0646 \u0628\u0631\u0627\u06cc Master Node.js<br \/>\n\u0628\u062e\u0648\u0627\u0646\u06cc\u062f<\/p>\n<p>14<br \/>\n\u0628\u0647\u062a\u0631\u06cc\u0646 6 \u0645\u062e\u0632\u0646 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0627\u062f Next.js<br \/>\n\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/p>\n<p>15<br \/>\n5 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0628\u0631\u062a\u0631 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc \u062a\u0639\u0627\u0645\u0644\u06cc<br \/>\n\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/p>\n<p>16<br \/>\n3 \u0645\u0641\u0647\u0648\u0645 \u0628\u0631\u062a\u0631 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u06a9\u0647 \u0647\u0631 \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u0647 \u0627\u06cc \u0628\u0627\u06cc\u062f \u0628\u062f\u0627\u0646\u062f<br \/>\n\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/p>\n<p>17<br \/>\n20 \u0631\u0648\u0634 \u0628\u0631\u0627\u06cc \u0628\u0647\u0628\u0648\u062f \u0639\u0645\u0644\u06a9\u0631\u062f Node.js \u062f\u0631 \u0645\u0642\u06cc\u0627\u0633<br \/>\n\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/p>\n<p>18<br \/>\n\u0639\u0645\u0644\u06a9\u0631\u062f \u0628\u0631\u0646\u0627\u0645\u0647 Node.js \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 \u0641\u0634\u0631\u062f\u0647 \u0633\u0627\u0632\u06cc \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631 \u0627\u0641\u0632\u0627\u06cc\u0634 \u062f\u0647\u06cc\u062f<br \/>\n\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/p>\n<p>19<br \/>\n\u062f\u0631\u06a9 \u0627\u0644\u06af\u0648\u0631\u06cc\u062a\u0645 \u062f\u0627\u06cc\u06a9\u0633\u062a\u0631\u0627: \u0631\u0627\u0647\u0646\u0645\u0627\u06cc \u06af\u0627\u0645 \u0628\u0647 \u06af\u0627\u0645<br \/>\n\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/p>\n<p>20<br \/>\n\u0622\u0634\u0646\u0627\u06cc\u06cc \u0628\u0627 NPM \u0648 NVM: \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc \u0636\u0631\u0648\u0631\u06cc \u0628\u0631\u0627\u06cc \u062a\u0648\u0633\u0639\u0647 Node.js<br \/>\n\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/p>\n<p>  \u0641\u0627\u0644\u0648 \u06a9\u0646\u06cc\u062f \u0648 \u0645\u0634\u062a\u0631\u06a9 \u0634\u0648\u06cc\u062f:<\/p>\n<div data-article-id=\"1962840\" id=\"article-body\">\n<p>API \u0647\u0627 \u0633\u062a\u0648\u0646 \u0641\u0642\u0631\u0627\u062a \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u0648\u0628 \u0645\u062f\u0631\u0646 \u0647\u0633\u062a\u0646\u062f. \u0628\u0627 \u0627\u0641\u0632\u0627\u06cc\u0634 \u067e\u06cc\u0686\u06cc\u062f\u06af\u06cc \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u060c \u0627\u062a\u062e\u0627\u0630 \u0645\u0639\u0645\u0627\u0631\u06cc \u06a9\u0647 \u0645\u0642\u06cc\u0627\u0633\u200c\u067e\u0630\u06cc\u0631\u06cc\u060c \u0642\u0627\u0628\u0644\u06cc\u062a \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u0648 \u0622\u0632\u0645\u0627\u06cc\u0634\u200c\u067e\u0630\u06cc\u0631\u06cc \u0631\u0627 \u0627\u0631\u062a\u0642\u0627 \u0645\u06cc\u200c\u062f\u0647\u062f\u060c \u0628\u0633\u06cc\u0627\u0631 \u0645\u0647\u0645 \u0627\u0633\u062a. \u062f\u0631 \u0627\u06cc\u0646 \u0648\u0628\u0644\u0627\u06af\u060c \u0646\u062d\u0648\u0647 \u0633\u0627\u062e\u062a \u06cc\u06a9 API \u0645\u062f\u0631\u0646 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Node.js\u060c Express\u060c \u0648 TypeScript \u0631\u0627 \u0628\u0627 \u0631\u0639\u0627\u06cc\u062a \u0627\u0635\u0648\u0644 Clean Architecture \u0628\u0631\u0631\u0633\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f.<\/p>\n<p>\u0644\u0637\u0641\u0627 \u0628\u0631\u0627\u06cc \u062d\u0645\u0627\u06cc\u062a \u0627\u0632 \u06a9\u0627\u0646\u0627\u0644 \u0645\u0646 \u0648 \u062f\u0631\u06cc\u0627\u0641\u062a \u0622\u0645\u0648\u0632\u0634 \u0647\u0627\u06cc \u0628\u06cc\u0634\u062a\u0631 \u062a\u0648\u0633\u0639\u0647 \u0648\u0628\u060c \u062f\u0631 \u06a9\u0627\u0646\u0627\u0644 \u06cc\u0648\u062a\u06cc\u0648\u0628 \u0645\u0646 \u0645\u0634\u062a\u0631\u06a9 \u0634\u0648\u06cc\u062f.<\/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=\"Toggle Table of Content\"><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\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#%F0%9F%93%91_%D9%81%D9%87%D8%B1%D8%B3%D8%AA_%D9%85%D8%B7%D8%A7%D9%84%D8%A8\" >\ud83d\udcd1 \u0641\u0647\u0631\u0633\u062a \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\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#1_%F0%9F%A7%A9_%D9%85%D9%82%D8%AF%D9%85%D9%87_%D8%A7%DB%8C_%D8%A8%D8%B1_%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C_%D9%BE%D8%A7%DA%A9\" >1. \ud83e\udde9 \u0645\u0642\u062f\u0645\u0647 \u0627\u06cc \u0628\u0631 \u0645\u0639\u0645\u0627\u0631\u06cc \u067e\u0627\u06a9<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#%D8%A7%D8%B5%D9%88%D9%84_%DA%A9%D9%84%DB%8C%D8%AF%DB%8C_%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C_%D9%BE%D8%A7%DA%A9\" >\u0627\u0635\u0648\u0644 \u06a9\u0644\u06cc\u062f\u06cc \u0645\u0639\u0645\u0627\u0631\u06cc \u067e\u0627\u06a9:<\/a><\/li><\/ul><\/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\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#2_%F0%9F%92%A1_%DA%86%D8%B1%D8%A7_Nodejs%D8%8C_Express_%D9%88_TypeScript%D8%9F\" >2. \ud83d\udca1 \u0686\u0631\u0627 Node.js\u060c Express \u0648 TypeScript\u061f<\/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\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#Nodejs\" >Node.js<\/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\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#%D8%A7%DA%A9%D8%B3%D9%BE%D8%B1%D8%B3\" >\u0627\u06a9\u0633\u067e\u0631\u0633<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/nabfollower.com\/blog\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#TypeScript\" >TypeScript<\/a><\/li><\/ul><\/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\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#3_%F0%9F%9A%A7_%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_%D9%BE%D8%B1%D9%88%DA%98%D9%87\" >3. \ud83d\udea7 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u067e\u0631\u0648\u0698\u0647<\/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\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#4_%F0%9F%8F%97%EF%B8%8F_%D8%B3%D8%A7%D8%AE%D8%AA%D8%A7%D8%B1_%D9%BE%D8%B1%D9%88%DA%98%D9%87_%D8%A8%D8%A7_%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C_%D9%BE%D8%A7%DA%A9\" >4. \ud83c\udfd7\ufe0f \u0633\u0627\u062e\u062a\u0627\u0631 \u067e\u0631\u0648\u0698\u0647 \u0628\u0627 \u0645\u0639\u0645\u0627\u0631\u06cc \u067e\u0627\u06a9<\/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\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#5_%F0%9F%93%82_%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%D9%84%D8%A7%DB%8C%D9%87_%D8%AF%D8%A7%D9%85%D9%86%D9%87\" >5. \ud83d\udcc2 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0644\u0627\u06cc\u0647 \u062f\u0627\u0645\u0646\u0647<\/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\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#6_%F0%9F%94%A7_%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%D9%85%D9%88%D8%A7%D8%B1%D8%AF_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87\" >6. \ud83d\udd27 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0645\u0648\u0627\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\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\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#7_%F0%9F%97%82%EF%B8%8F_%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%D9%84%D8%A7%DB%8C%D9%87_%D8%B2%DB%8C%D8%B1%D8%B3%D8%A7%D8%AE%D8%AA\" >7. \ud83d\uddc2\ufe0f \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/nabfollower.com\/blog\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#8_%F0%9F%8C%90_%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%D9%84%D8%A7%DB%8C%D9%87_%D8%B1%D8%A7%D8%A8%D8%B7\" >8. \ud83c\udf10 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0644\u0627\u06cc\u0647 \u0631\u0627\u0628\u0637<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/nabfollower.com\/blog\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#9_%F0%9F%94%8C_%D8%AA%D8%B2%D8%B1%DB%8C%D9%82_%D9%88%D8%A7%D8%A8%D8%B3%D8%AA%DA%AF%DB%8C\" >9. \ud83d\udd0c \u062a\u0632\u0631\u06cc\u0642 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/nabfollower.com\/blog\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#%D9%85%D8%AB%D8%A7%D9%84\" >\u0645\u062b\u0627\u0644:<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/nabfollower.com\/blog\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#10_%F0%9F%9A%A8_%D8%B1%D8%B3%DB%8C%D8%AF%DA%AF%DB%8C_%D8%A8%D9%87_%D8%AE%D8%B7%D8%A7\" >10. \ud83d\udea8 \u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u062e\u0637\u0627<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/nabfollower.com\/blog\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#%D9%85%D8%AB%D8%A7%D9%84-2\" >\u0645\u062b\u0627\u0644:<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/nabfollower.com\/blog\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#11_%E2%9C%94%EF%B8%8F_%D8%A7%D8%B9%D8%AA%D8%A8%D8%A7%D8%B1_%D8%B3%D9%86%D8%AC%DB%8C\" >11. \u2714\ufe0f \u0627\u0639\u062a\u0628\u0627\u0631 \u0633\u0646\u062c\u06cc<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/nabfollower.com\/blog\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#%D9%85%D8%AB%D8%A7%D9%84-3\" >\u0645\u062b\u0627\u0644:<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/nabfollower.com\/blog\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#12_%F0%9F%92%BE_%DB%8C%DA%A9%D9%BE%D8%A7%D8%B1%DA%86%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87_%D8%AF%D8%A7%D8%AF%D9%87_%D9%88%D8%A7%D9%82%D8%B9%DB%8C\" >12. \ud83d\udcbe \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u0633\u0627\u0632\u06cc \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0648\u0627\u0642\u0639\u06cc<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-21\" href=\"https:\/\/nabfollower.com\/blog\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#%D9%85%D8%AB%D8%A7%D9%84-4\" >\u0645\u062b\u0627\u0644:<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-22\" href=\"https:\/\/nabfollower.com\/blog\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#13_%F0%9F%94%92_%D8%A7%D8%AD%D8%B1%D8%A7%D8%B2_%D9%87%D9%88%DB%8C%D8%AA_%D9%88_%D9%85%D8%AC%D9%88%D8%B2\" >13. \ud83d\udd12 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0648 \u0645\u062c\u0648\u0632<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-23\" href=\"https:\/\/nabfollower.com\/blog\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#%D9%85%D8%AB%D8%A7%D9%84-5\" >\u0645\u062b\u0627\u0644:<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-24\" href=\"https:\/\/nabfollower.com\/blog\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#14_%F0%9F%93%9D_%D8%AB%D8%A8%D8%AA_%D9%88_%D9%86%D8%B8%D8%A7%D8%B1%D8%AA\" >14. \ud83d\udcdd \u062b\u0628\u062a \u0648 \u0646\u0638\u0627\u0631\u062a<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-25\" href=\"https:\/\/nabfollower.com\/blog\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#%D9%85%D8%AB%D8%A7%D9%84-6\" >\u0645\u062b\u0627\u0644:<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-26\" href=\"https:\/\/nabfollower.com\/blog\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#15_%E2%9A%99%EF%B8%8F_%D9%BE%DB%8C%DA%A9%D8%B1%D8%A8%D9%86%D8%AF%DB%8C_%D9%85%D8%AD%DB%8C%D8%B7\" >15. \u2699\ufe0f \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0645\u062d\u06cc\u0637<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-27\" href=\"https:\/\/nabfollower.com\/blog\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#%D9%85%D8%AB%D8%A7%D9%84-7\" >\u0645\u062b\u0627\u0644:<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-28\" href=\"https:\/\/nabfollower.com\/blog\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#16_%F0%9F%9A%80_CICD_%D9%88_%D8%A7%D8%B3%D8%AA%D9%82%D8%B1%D8%A7%D8%B1\" >16. \ud83d\ude80 CI\/CD \u0648 \u0627\u0633\u062a\u0642\u0631\u0627\u0631<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-29\" href=\"https:\/\/nabfollower.com\/blog\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#%D9%85%D8%AB%D8%A7%D9%84-8\" >\u0645\u062b\u0627\u0644:<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-30\" href=\"https:\/\/nabfollower.com\/blog\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#17_%F0%9F%A7%B9_%DA%A9%DB%8C%D9%81%DB%8C%D8%AA_%D9%88_%D9%84%DB%8C%D9%86%D8%AA%DB%8C%D9%86%DA%AF_%DA%A9%D8%AF\" >17. \ud83e\uddf9 \u06a9\u06cc\u0641\u06cc\u062a \u0648 \u0644\u06cc\u0646\u062a\u06cc\u0646\u06af \u06a9\u062f<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-31\" href=\"https:\/\/nabfollower.com\/blog\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#%D9%85%D8%AB%D8%A7%D9%84-9\" >\u0645\u062b\u0627\u0644:<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-32\" href=\"https:\/\/nabfollower.com\/blog\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#18_%F0%9F%9B%A0%EF%B8%8F_%D9%85%D8%B3%D8%AA%D9%86%D8%AF%D8%A7%D8%AA_%D9%BE%D8%B1%D9%88%DA%98%D9%87\" >18. \ud83d\udee0\ufe0f \u0645\u0633\u062a\u0646\u062f\u0627\u062a \u067e\u0631\u0648\u0698\u0647<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-33\" href=\"https:\/\/nabfollower.com\/blog\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#%D9%85%D8%AB%D8%A7%D9%84-10\" >\u0645\u062b\u0627\u0644:<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-34\" href=\"https:\/\/nabfollower.com\/blog\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#19_%F0%9F%8F%81_%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%DA%AF%DB%8C%D8%B1%DB%8C\" >19. \ud83c\udfc1 \u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-35\" href=\"https:\/\/nabfollower.com\/blog\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#%D8%B3%D9%81%D8%B1_%D8%AC%D8%A7%D9%88%D8%A7_%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA_%D8%AE%D9%88%D8%AF_%D8%B1%D8%A7_%D8%B4%D8%B1%D9%88%D8%B9_%DA%A9%D9%86%DB%8C%D8%AF\" >\u0633\u0641\u0631 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u062e\u0648\u062f \u0631\u0627 \u0634\u0631\u0648\u0639 \u06a9\u0646\u06cc\u062f<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-36\" href=\"https:\/\/nabfollower.com\/blog\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#%D9%81%D9%87%D8%B1%D8%B3%D8%AA_%D8%B3%D8%B1%DB%8C\" >\u0641\u0647\u0631\u0633\u062a \u0633\u0631\u06cc<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-37\" href=\"https:\/\/nabfollower.com\/blog\/modern-api-development-with-nodejs-express-and-typescript-using-clean-architecture-1m77\/#%D9%81%D8%A7%D9%84%D9%88_%DA%A9%D9%86%DB%8C%D8%AF_%D9%88_%D9%85%D8%B4%D8%AA%D8%B1%DA%A9_%D8%B4%D9%88%DB%8C%D8%AF\" >\u0641\u0627\u0644\u0648 \u06a9\u0646\u06cc\u062f \u0648 \u0645\u0634\u062a\u0631\u06a9 \u0634\u0648\u06cc\u062f:<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"%F0%9F%93%91_%D9%81%D9%87%D8%B1%D8%B3%D8%AA_%D9%85%D8%B7%D8%A7%D9%84%D8%A8\"><\/span>\n<p>  \ud83d\udcd1 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<hr\/>\n<h2><span class=\"ez-toc-section\" id=\"1_%F0%9F%A7%A9_%D9%85%D9%82%D8%AF%D9%85%D9%87_%D8%A7%DB%8C_%D8%A8%D8%B1_%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C_%D9%BE%D8%A7%DA%A9\"><\/span>\n<p>  1. \ud83e\udde9 \u0645\u0642\u062f\u0645\u0647 \u0627\u06cc \u0628\u0631 \u0645\u0639\u0645\u0627\u0631\u06cc \u067e\u0627\u06a9<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u0645\u0639\u0645\u0627\u0631\u06cc \u067e\u0627\u06a9\u060c \u0645\u0639\u0631\u0641\u06cc \u0634\u062f\u0647 \u062a\u0648\u0633\u0637 \u0631\u0627\u0628\u0631\u062a \u0633\u06cc \u0645\u0627\u0631\u062a\u06cc\u0646 (\u0639\u0645\u0648 \u0628\u0627\u0628)\u060c \u0628\u0631 \u062c\u062f\u0627\u0633\u0627\u0632\u06cc \u0646\u06af\u0631\u0627\u0646\u06cc \u0647\u0627 \u062f\u0631 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u062a\u0627\u06a9\u06cc\u062f \u062f\u0627\u0631\u062f. \u0627\u06cc\u0646 \u0627\u06cc\u062f\u0647 \u0631\u0627 \u062a\u0631\u0648\u06cc\u062c \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0645\u0646\u0637\u0642 \u062a\u062c\u0627\u0631\u06cc \u0628\u0627\u06cc\u062f \u0645\u0633\u062a\u0642\u0644 \u0627\u0632 \u0647\u0631 \u0686\u0627\u0631\u0686\u0648\u0628\u060c \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u06cc\u0627 \u0633\u06cc\u0633\u062a\u0645 \u062e\u0627\u0631\u062c\u06cc \u0628\u0627\u0634\u062f. \u0627\u06cc\u0646 \u0628\u0627\u0639\u062b \u0645\u06cc\u200c\u0634\u0648\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0627\u0698\u0648\u0644\u0627\u0631\u062a\u0631\u060c \u0622\u0632\u0645\u0627\u06cc\u0634 \u0622\u0633\u0627\u0646\u200c\u062a\u0631 \u0648 \u0633\u0627\u0632\u06af\u0627\u0631 \u0628\u0627 \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u0628\u0627\u0634\u062f.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D8%A7%D8%B5%D9%88%D9%84_%DA%A9%D9%84%DB%8C%D8%AF%DB%8C_%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C_%D9%BE%D8%A7%DA%A9\"><\/span>\n<p>  \u0627\u0635\u0648\u0644 \u06a9\u0644\u06cc\u062f\u06cc \u0645\u0639\u0645\u0627\u0631\u06cc \u067e\u0627\u06a9:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>\n<strong>\u0627\u0633\u062a\u0642\u0644\u0627\u0644:<\/strong> \u0645\u0646\u0637\u0642 \u0627\u0635\u0644\u06cc \u06a9\u0633\u0628 \u0648 \u06a9\u0627\u0631 \u0646\u0628\u0627\u06cc\u062f \u0628\u0647 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0647\u0627\u06cc \u062e\u0627\u0631\u062c\u06cc\u060c UI\u060c \u067e\u0627\u06cc\u06af\u0627\u0647 \u0647\u0627\u06cc \u062f\u0627\u062f\u0647 \u06cc\u0627 \u0686\u0627\u0631\u0686\u0648\u0628 \u0647\u0627 \u0628\u0633\u062a\u06af\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f.<\/li>\n<li>\n<strong>\u0622\u0632\u0645\u0627\u06cc\u0634 \u067e\u0630\u06cc\u0631\u06cc:<\/strong> \u0622\u0632\u0645\u0627\u06cc\u0634 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0627\u06cc\u062f \u0628\u062f\u0648\u0646 \u0627\u062a\u06a9\u0627 \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0647\u0627\u06cc \u062e\u0627\u0631\u062c\u06cc \u0622\u0633\u0627\u0646 \u0628\u0627\u0634\u062f.<\/li>\n<li>\n<strong>\u0627\u0646\u0639\u0637\u0627\u0641 \u067e\u0630\u06cc\u0631\u06cc:<\/strong> \u062a\u063a\u06cc\u06cc\u0631 \u06cc\u0627 \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646\u06cc \u0628\u062e\u0634 \u0647\u0627\u06cc\u06cc \u0627\u0632 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0627\u06cc\u062f \u0622\u0633\u0627\u0646 \u0628\u0627\u0634\u062f \u0628\u062f\u0648\u0646 \u0627\u06cc\u0646\u06a9\u0647 \u0631\u0648\u06cc \u062f\u06cc\u06af\u0631\u0627\u0646 \u062a\u0623\u062b\u06cc\u0631 \u0628\u06af\u0630\u0627\u0631\u062f.<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"2_%F0%9F%92%A1_%DA%86%D8%B1%D8%A7_Nodejs%D8%8C_Express_%D9%88_TypeScript%D8%9F\"><\/span>\n<p>  2. \ud83d\udca1 \u0686\u0631\u0627 Node.js\u060c Express \u0648 TypeScript\u061f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Nodejs\"><\/span>\n<p>  <strong>Node.js<\/strong><br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Node.js \u06cc\u06a9 \u0632\u0645\u0627\u0646 \u0627\u062c\u0631\u0627 \u0642\u062f\u0631\u062a\u0645\u0646\u062f \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0627\u0633\u062a \u06a9\u0647 \u0628\u0647 \u0634\u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u0634\u0628\u06a9\u0647 \u0645\u0642\u06cc\u0627\u0633 \u067e\u0630\u06cc\u0631 \u0628\u0633\u0627\u0632\u06cc\u062f. \u063a\u06cc\u0631 \u0645\u0633\u062f\u0648\u062f \u06a9\u0646\u0646\u062f\u0647 \u0648 \u0631\u0648\u06cc\u062f\u0627\u062f \u0645\u062d\u0648\u0631 \u0627\u0633\u062a \u0648 \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a API\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u062a\u0639\u062f\u0627\u062f \u0632\u06cc\u0627\u062f\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u06cc \u06a9\u0646\u0646\u062f \u0627\u06cc\u062f\u0647 \u0622\u0644 \u0627\u0633\u062a.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D8%A7%DA%A9%D8%B3%D9%BE%D8%B1%D8%B3\"><\/span>\n<p>  <strong>\u0627\u06a9\u0633\u067e\u0631\u0633<\/strong><br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Express \u06cc\u06a9 \u0686\u0627\u0631\u0686\u0648\u0628 \u0648\u0628 \u0645\u06cc\u0646\u06cc\u0645\u0627\u0644\u06cc\u0633\u062a\u06cc \u0628\u0631\u0627\u06cc Node.js \u0627\u0633\u062a. \u0645\u062c\u0645\u0648\u0639\u0647 \u0627\u06cc \u0642\u0648\u06cc \u0627\u0632 \u0648\u06cc\u0698\u06af\u06cc \u0647\u0627 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u0648\u0628 \u0648 \u0645\u0648\u0628\u0627\u06cc\u0644 \u0648 API \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f. \u0633\u0627\u062f\u06af\u06cc \u0622\u0646 \u0634\u0631\u0648\u0639 \u0631\u0627 \u0622\u0633\u0627\u0646 \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0628\u0633\u06cc\u0627\u0631 \u062a\u0648\u0633\u0639\u0647 \u067e\u0630\u06cc\u0631 \u0627\u0633\u062a.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"TypeScript\"><\/span>\n<p>  <strong>TypeScript<\/strong><br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>TypeScript \u0627\u0628\u0631 \u0645\u062c\u0645\u0648\u0639\u0647 \u0627\u06cc \u0627\u0632 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0627\u0633\u062a \u06a9\u0647 \u0627\u0646\u0648\u0627\u0639 \u0627\u0633\u062a\u0627\u062a\u06cc\u06a9 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc \u06a9\u0646\u062f. \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 TypeScript \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 Node.js \u0628\u0647 \u0634\u0646\u0627\u0633\u0627\u06cc\u06cc \u062e\u0637\u0627\u0647\u0627 \u062f\u0631 \u0645\u0631\u0627\u062d\u0644 \u0627\u0648\u0644\u06cc\u0647 \u062a\u0648\u0633\u0639\u0647\u060c \u0628\u0647\u0628\u0648\u062f \u062e\u0648\u0627\u0646\u0627\u06cc\u06cc \u06a9\u062f \u0648 \u0627\u0641\u0632\u0627\u06cc\u0634 \u062a\u062c\u0631\u0628\u0647 \u06a9\u0644\u06cc \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u0647 \u06a9\u0645\u06a9 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"3_%F0%9F%9A%A7_%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_%D9%BE%D8%B1%D9%88%DA%98%D9%87\"><\/span>\n<p>  3. \ud83d\udea7 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u067e\u0631\u0648\u0698\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u0627\u0628\u062a\u062f\u0627 \u0628\u06cc\u0627\u06cc\u06cc\u062f \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 Node.js \u062c\u062f\u06cc\u062f \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u0645 \u0648 TypeScript \u0631\u0627 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u0645.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"nb\">mkdir <\/span>clean-architecture-api\n<span class=\"nb\">cd <\/span>clean-architecture-api\nnpm init <span class=\"nt\">-y<\/span>\nnpm <span class=\"nb\">install <\/span>express\nnpm <span class=\"nb\">install <\/span>typescript @types\/node @types\/express ts-node-dev <span class=\"nt\">--save-dev<\/span>\nnpx tsc <span class=\"nt\">--init<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0628\u0639\u062f\u060c \u062e\u0648\u062f \u0631\u0627 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0646\u06cc\u062f <code>tsconfig.json<\/code>:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight json\"><code><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"compilerOptions\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n    <\/span><span class=\"nl\">\"target\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"ES2020\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"nl\">\"module\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"commonjs\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"nl\">\"strict\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"kc\">true<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"nl\">\"esModuleInterop\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"kc\">true<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"nl\">\"skipLibCheck\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"kc\">true<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"nl\">\"forceConsistentCasingInFileNames\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"kc\">true<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"nl\">\"outDir\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\".\/dist\"<\/span><span class=\"w\">\n  <\/span><span class=\"p\">},<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"include\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">[<\/span><span class=\"s2\">\"src\/**\/*.ts\"<\/span><span class=\"p\">],<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"exclude\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">[<\/span><span class=\"s2\">\"node_modules\"<\/span><span class=\"p\">]<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"4_%F0%9F%8F%97%EF%B8%8F_%D8%B3%D8%A7%D8%AE%D8%AA%D8%A7%D8%B1_%D9%BE%D8%B1%D9%88%DA%98%D9%87_%D8%A8%D8%A7_%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C_%D9%BE%D8%A7%DA%A9\"><\/span>\n<p>  4. \ud83c\udfd7\ufe0f \u0633\u0627\u062e\u062a\u0627\u0631 \u067e\u0631\u0648\u0698\u0647 \u0628\u0627 \u0645\u0639\u0645\u0627\u0631\u06cc \u067e\u0627\u06a9<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 \u0645\u0639\u0645\u0648\u0644\u06cc Clean Architecture \u0628\u0647 \u0644\u0627\u06cc\u0647 \u0647\u0627\u06cc \u0632\u06cc\u0631 \u062a\u0642\u0633\u06cc\u0645 \u0645\u06cc \u0634\u0648\u062f:<\/p>\n<ol>\n<li>\n<strong>\u0644\u0627\u06cc\u0647 \u062f\u0627\u0645\u0646\u0647<\/strong>: \u0634\u0627\u0645\u0644 \u0645\u0646\u0637\u0642 \u062a\u062c\u0627\u0631\u06cc\u060c \u0645\u0648\u062c\u0648\u062f\u06cc\u062a \u0647\u0627 \u0648 \u0631\u0627\u0628\u0637 \u0647\u0627 \u0645\u06cc \u0628\u0627\u0634\u062f. \u0627\u06cc\u0646 \u0644\u0627\u06cc\u0647 \u0645\u0633\u062a\u0642\u0644 \u0627\u0632 \u0647\u0631 \u0644\u0627\u06cc\u0647 \u062f\u06cc\u06af\u0631 \u0627\u0633\u062a.<\/li>\n<li>\n<strong>\u0627\u0632 \u0644\u0627\u06cc\u0647 Cases \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f<\/strong>: \u0634\u0627\u0645\u0644 \u0645\u0648\u0627\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06cc\u0627 \u0642\u0648\u0627\u0646\u06cc\u0646 \u062a\u062c\u0627\u0631\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0633\u062a.<\/li>\n<li>\n<strong>\u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a<\/strong>: \u0634\u0627\u0645\u0644 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0631\u0627\u0628\u0637 \u0647\u0627\u06cc \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 \u062f\u0631 \u0644\u0627\u06cc\u0647 \u062f\u0627\u0645\u0646\u0647\u060c \u0645\u0627\u0646\u0646\u062f \u0627\u062a\u0635\u0627\u0644\u0627\u062a \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0627\u0633\u062a.<\/li>\n<li>\n<strong>\u0644\u0627\u06cc\u0647 \u0631\u0627\u0628\u0637<\/strong>: \u0634\u0627\u0645\u0644 \u06a9\u0646\u062a\u0631\u0644\u0631\u0647\u0627\u060c \u0645\u0633\u06cc\u0631\u0647\u0627 \u0648 \u0647\u0631 \u06a9\u062f \u062f\u06cc\u06af\u0631\u06cc \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u0686\u0627\u0631\u0686\u0648\u0628 \u0648\u0628 \u0627\u0633\u062a.<\/li>\n<\/ol>\n<p>\u0633\u0627\u062e\u062a\u0627\u0631 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0628\u0647 \u0634\u06a9\u0644 \u0632\u06cc\u0631 \u0628\u0627\u0634\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>src\/\n\u251c\u2500\u2500 domain\/\n\u2502   \u251c\u2500\u2500 entities\/\n\u2502   \u2514\u2500\u2500 interfaces\/\n\u251c\u2500\u2500 use-cases\/\n\u251c\u2500\u2500 infrastructure\/\n\u2502   \u251c\u2500\u2500 database\/\n\u2502   \u2514\u2500\u2500 repositories\/\n\u2514\u2500\u2500 interface\/\n    \u251c\u2500\u2500 controllers\/\n    \u2514\u2500\u2500 routes\/\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"5_%F0%9F%93%82_%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%D9%84%D8%A7%DB%8C%D9%87_%D8%AF%D8%A7%D9%85%D9%86%D9%87\"><\/span>\n<p>  5. \ud83d\udcc2 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0644\u0627\u06cc\u0647 \u062f\u0627\u0645\u0646\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u062f\u0631 \u0644\u0627\u06cc\u0647 \u062f\u0627\u0645\u0646\u0647\u060c \u0646\u0647\u0627\u062f\u0647\u0627 \u0648 \u0631\u0627\u0628\u0637 \u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u062f. \u0641\u0631\u0636 \u06a9\u0646\u06cc\u062f \u062f\u0631 \u062d\u0627\u0644 \u0633\u0627\u062e\u062a \u06cc\u06a9 API \u0633\u0627\u062f\u0647 \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u062a\u0627\u0628 \u0647\u0633\u062a\u06cc\u0645.<\/p>\n<p><strong>\u0646\u0647\u0627\u062f (\u06a9\u062a\u0627\u0628):<\/strong><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ src\/domain\/entities\/Book.ts<\/span>\n<span class=\"k\">export<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Book<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nf\">constructor<\/span><span class=\"p\">(<\/span>\n    <span class=\"k\">public<\/span> <span class=\"k\">readonly<\/span> <span class=\"nx\">id<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">,<\/span>\n    <span class=\"k\">public<\/span> <span class=\"nx\">title<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">,<\/span>\n    <span class=\"k\">public<\/span> <span class=\"nx\">author<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">,<\/span>\n    <span class=\"k\">public<\/span> <span class=\"nx\">publishedDate<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Date<\/span>\n  <span class=\"p\">)<\/span> <span class=\"p\">{}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><strong>\u0631\u0627\u0628\u0637 \u0645\u062e\u0632\u0646:<\/strong><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ src\/domain\/interfaces\/BookRepository.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Book<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/entities\/Book<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kr\">interface<\/span> <span class=\"nx\">BookRepository<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nf\">findAll<\/span><span class=\"p\">():<\/span> <span class=\"nb\">Promise<\/span><span class=\"o\"><span class=\"nx\">Book<\/span><span class=\"p\">[]<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">;<\/span>\n  <span class=\"nf\">findById<\/span><span class=\"p\">(<\/span><span class=\"nx\">id<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">):<\/span> <span class=\"nb\">Promise<\/span><span class=\"o\"><span class=\"nx\">Book<\/span> <span class=\"o\">|<\/span> <span class=\"kc\">null<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">;<\/span>\n  <span class=\"nf\">create<\/span><span class=\"p\">(<\/span><span class=\"nx\">book<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Book<\/span><span class=\"p\">):<\/span> <span class=\"nb\">Promise<\/span><span class=\"o\"><span class=\"nx\">Book<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">;<\/span>\n  <span class=\"nf\">update<\/span><span class=\"p\">(<\/span><span class=\"nx\">book<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Book<\/span><span class=\"p\">):<\/span> <span class=\"nb\">Promise<\/span><span class=\"o\"><span class=\"k\">void<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">;<\/span>\n  <span class=\"k\">delete<\/span><span class=\"p\">(<\/span><span class=\"nx\">id<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">):<\/span> <span class=\"nb\">Promise<\/span><span class=\"o\"><span class=\"k\">void<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n<\/span><\/span><\/span><\/span><\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"6_%F0%9F%94%A7_%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%D9%85%D9%88%D8%A7%D8%B1%D8%AF_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87\"><\/span>\n<p>  6. \ud83d\udd27 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0645\u0648\u0627\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u0645\u0648\u0627\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0642\u062f\u0627\u0645\u0627\u062a\u06cc \u0631\u0627 \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646 \u062f\u0631 \u0633\u06cc\u0633\u062a\u0645 \u0627\u0646\u062c\u0627\u0645 \u062f\u0627\u062f \u0631\u0627 \u0645\u0634\u062e\u0635 \u0645\u06cc \u06a9\u0646\u062f. \u0622\u0646\u0647\u0627 \u0628\u0627 \u0644\u0627\u06cc\u0647 \u062f\u0627\u0645\u0646\u0647 \u062a\u0639\u0627\u0645\u0644 \u062f\u0627\u0631\u0646\u062f \u0648 \u0646\u0633\u0628\u062a \u0628\u0647 \u0686\u0627\u0631\u0686\u0648\u0628 \u06cc\u0627 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u0648\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0622\u06af\u0646\u0648\u0633\u062a\u06cc\u06a9 \u0647\u0633\u062a\u0646\u062f.<\/p>\n<p><strong>Use Case (GetAllBooks):<\/strong><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ src\/use-cases\/GetAllBooks.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">BookRepository<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/domain\/interfaces\/BookRepository<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">GetAllBooks<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nf\">constructor<\/span><span class=\"p\">(<\/span><span class=\"k\">private<\/span> <span class=\"nx\">bookRepository<\/span><span class=\"p\">:<\/span> <span class=\"nx\">BookRepository<\/span><span class=\"p\">)<\/span> <span class=\"p\">{}<\/span>\n\n  <span class=\"k\">async<\/span> <span class=\"nf\">execute<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"k\">await<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">bookRepository<\/span><span class=\"p\">.<\/span><span class=\"nf\">findAll<\/span><span class=\"p\">();<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"7_%F0%9F%97%82%EF%B8%8F_%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%D9%84%D8%A7%DB%8C%D9%87_%D8%B2%DB%8C%D8%B1%D8%B3%D8%A7%D8%AE%D8%AA\"><\/span>\n<p>  7. \ud83d\uddc2\ufe0f \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u062f\u0631 \u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a\u060c \u0631\u0627\u0628\u0637 \u0647\u0627\u06cc \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 \u062f\u0631 \u0644\u0627\u06cc\u0647 \u062f\u0627\u0645\u0646\u0647 \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f. \u0627\u06cc\u0646\u062c\u0627 \u062c\u0627\u06cc\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0634\u0645\u0627 \u0628\u0627 \u067e\u0627\u06cc\u06af\u0627\u0647 \u0647\u0627\u06cc \u062f\u0627\u062f\u0647 \u06cc\u0627 \u0633\u0631\u0648\u06cc\u0633 \u0647\u0627\u06cc \u062e\u0627\u0631\u062c\u06cc \u062a\u0639\u0627\u0645\u0644 \u062f\u0627\u0631\u06cc\u062f.<\/p>\n<p><strong>\u0645\u062e\u0632\u0646 \u062f\u0631\u0648\u0646 \u062d\u0627\u0641\u0638\u0647 (\u0628\u0631\u0627\u06cc \u0633\u0627\u062f\u06af\u06cc):<\/strong><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ src\/infrastructure\/repositories\/InMemoryBookRepository.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Book<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/..\/domain\/entities\/Book<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">BookRepository<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/..\/domain\/interfaces\/BookRepository<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">InMemoryBookRepository<\/span> <span class=\"k\">implements<\/span> <span class=\"nx\">BookRepository<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">private<\/span> <span class=\"nx\">books<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Book<\/span><span class=\"p\">[]<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[];<\/span>\n\n  <span class=\"k\">async<\/span> <span class=\"nf\">findAll<\/span><span class=\"p\">():<\/span> <span class=\"nb\">Promise<\/span><span class=\"o\"><span class=\"nx\">Book<\/span><span class=\"p\">[]<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">books<\/span><span class=\"p\">;<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"k\">async<\/span> <span class=\"nf\">findById<\/span><span class=\"p\">(<\/span><span class=\"nx\">id<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">):<\/span> <span class=\"nb\">Promise<\/span><span class=\"o\"><span class=\"nx\">Book<\/span> <span class=\"o\">|<\/span> <span class=\"kc\">null<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">books<\/span><span class=\"p\">.<\/span><span class=\"nf\">find<\/span><span class=\"p\">(<\/span><span class=\"nx\">book<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">book<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span> <span class=\"o\">===<\/span> <span class=\"nx\">id<\/span><span class=\"p\">)<\/span> <span class=\"o\">||<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"k\">async<\/span> <span class=\"nf\">create<\/span><span class=\"p\">(<\/span><span class=\"nx\">book<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Book<\/span><span class=\"p\">):<\/span> <span class=\"nb\">Promise<\/span><span class=\"o\"><span class=\"nx\">Book<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">books<\/span><span class=\"p\">.<\/span><span class=\"nf\">push<\/span><span class=\"p\">(<\/span><span class=\"nx\">book<\/span><span class=\"p\">);<\/span>\n    <span class=\"k\">return<\/span> <span class=\"nx\">book<\/span><span class=\"p\">;<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"k\">async<\/span> <span class=\"nf\">update<\/span><span class=\"p\">(<\/span><span class=\"nx\">book<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Book<\/span><span class=\"p\">):<\/span> <span class=\"nb\">Promise<\/span><span class=\"o\"><span class=\"k\">void<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">index<\/span> <span class=\"o\">=<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">books<\/span><span class=\"p\">.<\/span><span class=\"nf\">findIndex<\/span><span class=\"p\">(<\/span><span class=\"nx\">b<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">b<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span> <span class=\"o\">===<\/span> <span class=\"nx\">book<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">);<\/span>\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">index<\/span> <span class=\"o\">!==<\/span> <span class=\"o\">-<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n      <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">books<\/span><span class=\"p\">[<\/span><span class=\"nx\">index<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">book<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"k\">async<\/span> <span class=\"k\">delete<\/span><span class=\"p\">(<\/span><span class=\"nx\">id<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">):<\/span> <span class=\"nb\">Promise<\/span><span class=\"o\"><span class=\"k\">void<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">books<\/span> <span class=\"o\">=<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">books<\/span><span class=\"p\">.<\/span><span class=\"nf\">filter<\/span><span class=\"p\">(<\/span><span class=\"nx\">book<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">book<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span> <span class=\"o\">!==<\/span> <span class=\"nx\">id<\/span><span class=\"p\">);<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/span><\/span><\/span><\/span><\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"8_%F0%9F%8C%90_%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%D9%84%D8%A7%DB%8C%D9%87_%D8%B1%D8%A7%D8%A8%D8%B7\"><\/span>\n<p>  8. \ud83c\udf10 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0644\u0627\u06cc\u0647 \u0631\u0627\u0628\u0637<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u0644\u0627\u06cc\u0647 \u0631\u0627\u0628\u0637 \u0634\u0627\u0645\u0644 \u06a9\u0646\u062a\u0631\u0644\u200c\u06a9\u0646\u0646\u062f\u0647\u200c\u0647\u0627 \u0648 \u0645\u0633\u06cc\u0631\u0647\u0627\u06cc\u06cc \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc HTTP \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f \u0648 \u0622\u0646\u0647\u0627 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0645\u0648\u0627\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0646\u0642\u0634\u0647\u200c\u0628\u0631\u062f\u0627\u0631\u06cc \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f.<\/p>\n<p><strong>\u06a9\u0646\u062a\u0631\u0644 \u06a9\u0646\u0646\u062f\u0647 \u06a9\u062a\u0627\u0628:<\/strong><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ src\/interface\/controllers\/BookController.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Request<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Response<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">express<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">GetAllBooks<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/..\/use-cases\/GetAllBooks<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">BookController<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nf\">constructor<\/span><span class=\"p\">(<\/span><span class=\"k\">private<\/span> <span class=\"nx\">getAllBooks<\/span><span class=\"p\">:<\/span> <span class=\"nx\">GetAllBooks<\/span><span class=\"p\">)<\/span> <span class=\"p\">{}<\/span>\n\n  <span class=\"k\">async<\/span> <span class=\"nf\">getAll<\/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=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">books<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">getAllBooks<\/span><span class=\"p\">.<\/span><span class=\"nf\">execute<\/span><span class=\"p\">();<\/span>\n    <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nf\">json<\/span><span class=\"p\">(<\/span><span class=\"nx\">books<\/span><span class=\"p\">);<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><strong>\u0645\u0633\u06cc\u0631\u0647\u0627:<\/strong><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ src\/interface\/routes\/bookRoutes.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Router<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">express<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">InMemoryBookRepository<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/..\/infrastructure\/repositories\/InMemoryBookRepository<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">GetAllBooks<\/span> <span class=\"p\">}<\/span>\n\n <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/..\/use-cases\/GetAllBooks<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">BookController<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/controllers\/BookController<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">router<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">Router<\/span><span class=\"p\">();<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">bookRepository<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">InMemoryBookRepository<\/span><span class=\"p\">();<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">getAllBooks<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">GetAllBooks<\/span><span class=\"p\">(<\/span><span class=\"nx\">bookRepository<\/span><span class=\"p\">);<\/span>\n<span class=\"kd\">const<\/span> <span class=\"nx\">bookController<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">BookController<\/span><span class=\"p\">(<\/span><span class=\"nx\">getAllBooks<\/span><span class=\"p\">);<\/span>\n\n<span class=\"nx\">router<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/books<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">req<\/span><span class=\"p\">,<\/span> <span class=\"nx\">res<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">bookController<\/span><span class=\"p\">.<\/span><span class=\"nf\">getAll<\/span><span class=\"p\">(<\/span><span class=\"nx\">req<\/span><span class=\"p\">,<\/span> <span class=\"nx\">res<\/span><span class=\"p\">));<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">router<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">bookRoutes<\/span> <span class=\"p\">};<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><strong>\u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0635\u0644\u06cc:<\/strong><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ src\/index.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">express<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">express<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">bookRoutes<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/interface\/routes\/bookRoutes<\/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=\"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\">express<\/span><span class=\"p\">.<\/span><span class=\"nf\">json<\/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=\"s2\">\/api<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"nx\">bookRoutes<\/span><span class=\"p\">);<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">PORT<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">3000<\/span><span class=\"p\">;<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">listen<\/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\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"s2\">`Server is running on port <\/span><span class=\"p\">${<\/span><span class=\"nx\">PORT<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"p\">);<\/span>\n<span class=\"p\">});<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"9_%F0%9F%94%8C_%D8%AA%D8%B2%D8%B1%DB%8C%D9%82_%D9%88%D8%A7%D8%A8%D8%B3%D8%AA%DA%AF%DB%8C\"><\/span>\n<p>  9. \ud83d\udd0c \u062a\u0632\u0631\u06cc\u0642 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u062a\u0632\u0631\u06cc\u0642 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc (DI) \u062a\u06a9\u0646\u06cc\u06a9\u06cc \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc\u200c\u0647\u0627\u06cc \u06cc\u06a9 \u0634\u06cc \u0628\u0647 \u062c\u0627\u06cc \u06a9\u062f\u06af\u0630\u0627\u0631\u06cc \u0633\u062e\u062a \u062f\u0631 \u062f\u0627\u062e\u0644 \u0634\u06cc \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc\u200c\u0634\u0648\u0646\u062f. \u0627\u06cc\u0646 \u0627\u0645\u0631 \u0627\u062a\u0635\u0627\u0644 \u0634\u0644 \u0631\u0627 \u062a\u0631\u0648\u06cc\u062c \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0622\u0632\u0645\u0627\u06cc\u0634 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0631\u0627 \u0622\u0633\u0627\u0646 \u062a\u0631 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%AB%D8%A7%D9%84\"><\/span>\n<p>  \u0645\u062b\u0627\u0644:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u06cc\u06a9 \u0645\u06a9\u0627\u0646\u06cc\u0633\u0645 DI \u0633\u0627\u062f\u0647 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 TypeScript \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u0645.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ src\/infrastructure\/DIContainer.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">InMemoryBookRepository<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/repositories\/InMemoryBookRepository<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">GetAllBooks<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/use-cases\/GetAllBooks<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">class<\/span> <span class=\"nc\">DIContainer<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">private<\/span> <span class=\"k\">static<\/span> <span class=\"nx\">_bookRepository<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">InMemoryBookRepository<\/span><span class=\"p\">();<\/span>\n\n  <span class=\"k\">static<\/span> <span class=\"nf\">getBookRepository<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">_bookRepository<\/span><span class=\"p\">;<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"k\">static<\/span> <span class=\"nf\">getGetAllBooksUseCase<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">GetAllBooks<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nf\">getBookRepository<\/span><span class=\"p\">());<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">DIContainer<\/span> <span class=\"p\">};<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u0632 DIContainer \u062f\u0631 \u06a9\u0646\u062a\u0631\u0644\u0631\u0647\u0627\u06cc \u062e\u0648\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ src\/interface\/controllers\/BookController.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Request<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Response<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">express<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">DIContainer<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/..\/infrastructure\/DIContainer<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">BookController<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">private<\/span> <span class=\"nx\">getAllBooks<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">DIContainer<\/span><span class=\"p\">.<\/span><span class=\"nf\">getGetAllBooksUseCase<\/span><span class=\"p\">();<\/span>\n\n  <span class=\"k\">async<\/span> <span class=\"nf\">getAll<\/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=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">books<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">getAllBooks<\/span><span class=\"p\">.<\/span><span class=\"nf\">execute<\/span><span class=\"p\">();<\/span>\n    <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nf\">json<\/span><span class=\"p\">(<\/span><span class=\"nx\">books<\/span><span class=\"p\">);<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"10_%F0%9F%9A%A8_%D8%B1%D8%B3%DB%8C%D8%AF%DA%AF%DB%8C_%D8%A8%D9%87_%D8%AE%D8%B7%D8%A7\"><\/span>\n<p>  10. \ud83d\udea8 \u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u062e\u0637\u0627<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u0645\u062f\u06cc\u0631\u06cc\u062a \u0635\u062d\u06cc\u062d \u062e\u0637\u0627 \u062a\u0636\u0645\u06cc\u0646 \u0645\u06cc\u200c\u06a9\u0646\u062f \u06a9\u0647 API \u0634\u0645\u0627 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u0645\u0648\u0642\u0639\u06cc\u062a\u200c\u0647\u0627\u06cc \u063a\u06cc\u0631\u0645\u0646\u062a\u0638\u0631\u0647 \u0631\u0627 \u0628\u0647 \u062e\u0648\u0628\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u062f \u0648 \u067e\u06cc\u0627\u0645\u200c\u0647\u0627\u06cc \u062e\u0637\u0627\u06cc \u0645\u0639\u0646\u06cc\u200c\u062f\u0627\u0631\u06cc \u0631\u0627 \u0628\u0647 \u0645\u0634\u062a\u0631\u06cc\u0627\u0646 \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u062f.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%AB%D8%A7%D9%84-2\"><\/span>\n<p>  \u0645\u062b\u0627\u0644:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u06cc\u06a9 \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631 \u0645\u062a\u0645\u0631\u06a9\u0632 \u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u062e\u0637\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ src\/interface\/middleware\/errorHandler.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Request<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Response<\/span><span class=\"p\">,<\/span> <span class=\"nx\">NextFunction<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">express<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">function<\/span> <span class=\"nf\">errorHandler<\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">:<\/span> <span class=\"kr\">any<\/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=\"nx\">next<\/span><span class=\"p\">:<\/span> <span class=\"nx\">NextFunction<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nx\">console<\/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=\"nx\">stack<\/span><span class=\"p\">);<\/span>\n  <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nf\">status<\/span><span class=\"p\">(<\/span><span class=\"mi\">500<\/span><span class=\"p\">).<\/span><span class=\"nf\">json<\/span><span class=\"p\">({<\/span> <span class=\"na\">message<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Internal Server Error<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">});<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u0632 \u0627\u06cc\u0646 \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0635\u0644\u06cc \u062e\u0648\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ src\/index.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">express<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">express<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">bookRoutes<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/interface\/routes\/bookRoutes<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">errorHandler<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/interface\/middleware\/errorHandler<\/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=\"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\">express<\/span><span class=\"p\">.<\/span><span class=\"nf\">json<\/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=\"s2\">\/api<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"nx\">bookRoutes<\/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\">errorHandler<\/span><span class=\"p\">);<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">PORT<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">3000<\/span><span class=\"p\">;<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">listen<\/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\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"s2\">`Server is running on port <\/span><span class=\"p\">${<\/span><span class=\"nx\">PORT<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"p\">);<\/span>\n<span class=\"p\">});<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"11_%E2%9C%94%EF%B8%8F_%D8%A7%D8%B9%D8%AA%D8%A8%D8%A7%D8%B1_%D8%B3%D9%86%D8%AC%DB%8C\"><\/span>\n<p>  11. \u2714\ufe0f \u0627\u0639\u062a\u0628\u0627\u0631 \u0633\u0646\u062c\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc \u0628\u0631\u0627\u06cc \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 \u0635\u062d\u062a \u0648 \u0627\u06cc\u0645\u0646 \u0628\u0648\u062f\u0646 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0648\u0627\u0631\u062f \u0634\u062f\u0647 \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0628\u0633\u06cc\u0627\u0631 \u0645\u0647\u0645 \u0627\u0633\u062a.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%AB%D8%A7%D9%84-3\"><\/span>\n<p>  \u0645\u062b\u0627\u0644:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u062f\u063a\u0627\u0645 \u06a9\u0646\u06cc\u062f <code>class-validator<\/code> \u0628\u0631\u0627\u06cc \u062a\u0627\u06cc\u06cc\u062f \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0647\u0627\u06cc \u062f\u0631\u06cc\u0627\u0641\u062a\u06cc:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>npm <span class=\"nb\">install <\/span>class-validator class-transformer\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u06cc\u06a9 DTO (Data Transfer Object) \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u06a9\u062a\u0627\u0628 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ src\/interface\/dto\/CreateBookDto.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">IsString<\/span><span class=\"p\">,<\/span> <span class=\"nx\">IsDate<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">class-validator<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">CreateBookDto<\/span> <span class=\"p\">{<\/span>\n  <span class=\"p\">@<\/span><span class=\"nd\">IsString<\/span><span class=\"p\">()<\/span>\n  <span class=\"nx\">title<\/span><span class=\"o\">!<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\n\n  <span class=\"p\">@<\/span><span class=\"nd\">IsString<\/span><span class=\"p\">()<\/span>\n  <span class=\"nx\">author<\/span><span class=\"o\">!<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\n\n  <span class=\"p\">@<\/span><span class=\"nd\">IsDate<\/span><span class=\"p\">()<\/span>\n  <span class=\"nx\">publishedDate<\/span><span class=\"o\">!<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Date<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>DTO \u0631\u0627 \u062f\u0631 \u06a9\u0646\u062a\u0631\u0644\u0631 \u062e\u0648\u062f \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ src\/interface\/controllers\/BookController.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Request<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Response<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">express<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">validate<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">class-validator<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">CreateBookDto<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/dto\/CreateBookDto<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">DIContainer<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/..\/infrastructure\/DIContainer<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">BookController<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">private<\/span> <span class=\"nx\">getAllBooks<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">DIContainer<\/span><span class=\"p\">.<\/span><span class=\"nf\">getGetAllBooksUseCase<\/span><span class=\"p\">();<\/span>\n\n  <span class=\"k\">async<\/span> <span class=\"nf\">create<\/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=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">dto<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">Object<\/span><span class=\"p\">.<\/span><span class=\"nf\">assign<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">CreateBookDto<\/span><span class=\"p\">(),<\/span> <span class=\"nx\">req<\/span><span class=\"p\">.<\/span><span class=\"nx\">body<\/span><span class=\"p\">);<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">errors<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nf\">validate<\/span><span class=\"p\">(<\/span><span class=\"nx\">dto<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">errors<\/span><span class=\"p\">.<\/span><span class=\"nx\">length<\/span> <span class=\"o\">&gt;<\/span> <span class=\"mi\">0<\/span><span class=\"p\">)<\/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\">json<\/span><span class=\"p\">({<\/span> <span class=\"nx\">errors<\/span> <span class=\"p\">});<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"c1\">\/\/ Proceed with the creation logic...<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"12_%F0%9F%92%BE_%DB%8C%DA%A9%D9%BE%D8%A7%D8%B1%DA%86%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87_%D8%AF%D8%A7%D8%AF%D9%87_%D9%88%D8%A7%D9%82%D8%B9%DB%8C\"><\/span>\n<p>  12. \ud83d\udcbe \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u0633\u0627\u0632\u06cc \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0648\u0627\u0642\u0639\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u062c\u0627\u0628\u062c\u0627\u06cc\u06cc \u0627\u0632 \u06cc\u06a9 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u062f\u0631 \u062d\u0627\u0641\u0638\u0647 \u0628\u0647 \u06cc\u06a9 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0648\u0627\u0642\u0639\u06cc \u0645\u0627\u0646\u0646\u062f MongoDB \u06cc\u0627 PostgreSQL \u0628\u0627\u0639\u062b \u0645\u06cc \u0634\u0648\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0622\u0645\u0627\u062f\u0647 \u062a\u0648\u0644\u06cc\u062f \u0628\u0627\u0634\u062f.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%AB%D8%A7%D9%84-4\"><\/span>\n<p>  \u0645\u062b\u0627\u0644:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u062f\u063a\u0627\u0645 MongoDB:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>npm <span class=\"nb\">install <\/span>mongoose @types\/mongoose\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u06cc\u06a9 \u0645\u062f\u0644 Mongoose \u0628\u0631\u0627\u06cc <code>Book<\/code>:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ src\/infrastructure\/models\/BookModel.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">mongoose<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Schema<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Document<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">mongoose<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kr\">interface<\/span> <span class=\"nx\">IBook<\/span> <span class=\"kd\">extends<\/span> <span class=\"nx\">Document<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nl\">title<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">author<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">publishedDate<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Date<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">BookSchema<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Schema<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Schema<\/span><span class=\"p\">({<\/span>\n  <span class=\"na\">title<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"nb\">String<\/span><span class=\"p\">,<\/span> <span class=\"na\">required<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span> <span class=\"p\">},<\/span>\n  <span class=\"na\">author<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"nb\">String<\/span><span class=\"p\">,<\/span> <span class=\"na\">required<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span> <span class=\"p\">},<\/span>\n  <span class=\"na\">publishedDate<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Date<\/span><span class=\"p\">,<\/span> <span class=\"na\">required<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span> <span class=\"p\">},<\/span>\n<span class=\"p\">});<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">BookModel<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">mongoose<\/span><span class=\"p\">.<\/span><span class=\"nx\">model<\/span><span class=\"o\"><span class=\"nx\">IBook<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">Book<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"nx\">BookSchema<\/span><span class=\"p\">);<\/span>\n<span class=\"k\">export<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">BookModel<\/span><span class=\"p\">,<\/span> <span class=\"nx\">IBook<\/span> <span class=\"p\">};<\/span>\n<\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u062c\u0631\u0627\u06cc \u0645\u062e\u0632\u0646:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ src\/infrastructure\/repositories\/MongoBookRepository.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Book<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/..\/domain\/entities\/Book<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">BookRepository<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/..\/domain\/interfaces\/BookRepository<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">BookModel<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/models\/BookModel<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">MongoBookRepository<\/span> <span class=\"k\">implements<\/span> <span class=\"nx\">BookRepository<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">async<\/span> <span class=\"nf\">findAll<\/span><span class=\"p\">():<\/span> <span class=\"nb\">Promise<\/span><span class=\"o\"><span class=\"nx\">Book<\/span><span class=\"p\">[]<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">BookModel<\/span><span class=\"p\">.<\/span><span class=\"nf\">find<\/span><span class=\"p\">();<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"k\">async<\/span> <span class=\"nf\">findById<\/span><span class=\"p\">(<\/span><span class=\"nx\">id<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">):<\/span> <span class=\"nb\">Promise<\/span><span class=\"o\"><span class=\"nx\">Book<\/span> <span class=\"o\">|<\/span> <span class=\"kc\">null<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">BookModel<\/span><span class=\"p\">.<\/span><span class=\"nf\">findById<\/span><span class=\"p\">(<\/span><span class=\"nx\">id<\/span><span class=\"p\">);<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"k\">async<\/span> <span class=\"nf\">create<\/span><span class=\"p\">(<\/span><span class=\"nx\">book<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Book<\/span><span class=\"p\">):<\/span> <span class=\"nb\">Promise<\/span><span class=\"o\"><span class=\"nx\">Book<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">newBook<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">BookModel<\/span><span class=\"p\">(<\/span><span class=\"nx\">book<\/span><span class=\"p\">);<\/span>\n    <span class=\"k\">await<\/span> <span class=\"nx\">newBook<\/span><span class=\"p\">.<\/span><span class=\"nf\">save<\/span><span class=\"p\">();<\/span>\n    <span class=\"k\">return<\/span> <span class=\"nx\">newBook<\/span><span class=\"p\">;<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"k\">async<\/span> <span class=\"nf\">update<\/span><span class=\"p\">(<\/span><span class=\"nx\">book<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Book<\/span><span class=\"p\">):<\/span> <span class=\"nb\">Promise<\/span><span class=\"o\"><span class=\"k\">void<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">await<\/span> <span class=\"nx\">BookModel<\/span><span class=\"p\">.<\/span><span class=\"nf\">findByIdAndUpdate<\/span><span class=\"p\">(<\/span><span class=\"nx\">book<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">,<\/span> <span class=\"nx\">book<\/span><span class=\"p\">);<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"k\">async<\/span> <span class=\"k\">delete<\/span><span class=\"p\">(<\/span><span class=\"nx\">id<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">):<\/span> <span class=\"nb\">Promise<\/span><span class=\"o\"><span class=\"k\">void<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">await<\/span> <span class=\"nx\">BookModel<\/span><span class=\"p\">.<\/span><span class=\"nf\">findByIdAndDelete<\/span><span class=\"p\">(<\/span><span class=\"nx\">id<\/span><span class=\"p\">);<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/span><\/span><\/span><\/span><\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>DIContainer \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 MongoBookRepository \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ src\/infrastructure\/DIContainer.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">MongoBookRepository<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/repositories\/MongoBookRepository<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">GetAllBooks<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/use-cases\/GetAllBooks<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">class<\/span> <span class=\"nc\">DIContainer<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">private<\/span> <span class=\"k\">static<\/span> <span class=\"nx\">_bookRepository<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">MongoBookRepository<\/span><span class=\"p\">();<\/span>\n\n  <span class=\"k\">static<\/span> <span class=\"nf\">getBookRepository<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">_bookRepository<\/span><span class=\"p\">;<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"k\">static<\/span> <span class=\"nf\">getGetAllBooksUseCase<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">GetAllBooks<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nf\">getBookRepository<\/span><span class=\"p\">());<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">DIContainer<\/span> <span class=\"p\">};<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"13_%F0%9F%94%92_%D8%A7%D8%AD%D8%B1%D8%A7%D8%B2_%D9%87%D9%88%DB%8C%D8%AA_%D9%88_%D9%85%D8%AC%D9%88%D8%B2\"><\/span>\n<p>  13. \ud83d\udd12 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0648 \u0645\u062c\u0648\u0632<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u0627\u06cc\u0645\u0646 \u0633\u0627\u0632\u06cc API \u0636\u0631\u0648\u0631\u06cc \u0627\u0633\u062a. JWT (JSON Web Tokens) \u06cc\u06a9 \u0631\u0648\u06cc\u06a9\u0631\u062f \u0631\u0627\u06cc\u062c \u0628\u0631\u0627\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0628\u062f\u0648\u0646 \u062d\u0627\u0644\u062a \u0627\u0633\u062a.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%AB%D8%A7%D9%84-5\"><\/span>\n<p>  \u0645\u062b\u0627\u0644:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>JWT \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u062f\u063a\u0627\u0645 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>npm <span class=\"nb\">install <\/span>jsonwebtoken @types\/jsonwebtoken\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ src\/interface\/middleware\/auth.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">jwt<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">jsonwebtoken<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Request<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Response<\/span><span class=\"p\">,<\/span> <span class=\"nx\">NextFunction<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">express<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">function<\/span> <span class=\"nf\">authenticateToken<\/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=\"nx\">next<\/span><span class=\"p\">:<\/span> <span class=\"nx\">NextFunction<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">token<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">req<\/span><span class=\"p\">.<\/span><span class=\"nf\">header<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">Authorization<\/span><span class=\"dl\">\"<\/span><span class=\"p\">)?.<\/span><span class=\"nf\">split<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\"> <\/span><span class=\"dl\">\"<\/span><span class=\"p\">)[<\/span><span class=\"mi\">1<\/span><span class=\"p\">];<\/span>\n  <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"nx\">token<\/span><span class=\"p\">)<\/span> <span class=\"k\">return<\/span> <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nf\">sendStatus<\/span><span class=\"p\">(<\/span><span class=\"mi\">401<\/span><span class=\"p\">);<\/span>\n\n  <span class=\"nx\">jwt<\/span><span class=\"p\">.<\/span><span class=\"nf\">verify<\/span><span class=\"p\">(<\/span><span class=\"nx\">token<\/span><span class=\"p\">,<\/span> <span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">JWT_SECRET<\/span> <span class=\"k\">as<\/span> <span class=\"kr\">string<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">,<\/span> <span class=\"nx\">user<\/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\">err<\/span><span class=\"p\">)<\/span> <span class=\"k\">return<\/span> <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nf\">sendStatus<\/span><span class=\"p\">(<\/span><span class=\"mi\">403<\/span><span class=\"p\">);<\/span>\n    <span class=\"nx\">req<\/span><span class=\"p\">.<\/span><span class=\"nx\">user<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">user<\/span><span class=\"p\">;<\/span>\n    <span class=\"nf\">next<\/span><span class=\"p\">();<\/span>\n  <span class=\"p\">});<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u0632 \u0627\u06cc\u0646 \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631 \u0628\u0631\u0627\u06cc \u0645\u062d\u0627\u0641\u0638\u062a \u0627\u0632 \u0645\u0633\u06cc\u0631\u0647\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ src\/interface\/routes\/bookRoutes.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Router<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">express<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">BookController<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/controllers\/BookController<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">authenticateToken<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/middleware\/auth<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">router<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">Router<\/span><span class=\"p\">();<\/span>\n\n<span class=\"nx\">router<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/books<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"nx\">authenticateToken<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">req<\/span><span class=\"p\">,<\/span> <span class=\"nx\">res<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">bookController<\/span><span class=\"p\">.<\/span><span class=\"nf\">getAll<\/span><span class=\"p\">(<\/span><span class=\"nx\">req<\/span><span class=\"p\">,<\/span> <span class=\"nx\">res<\/span><span class=\"p\">));<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">router<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">bookRoutes<\/span> <span class=\"p\">};<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"14_%F0%9F%93%9D_%D8%AB%D8%A8%D8%AA_%D9%88_%D9%86%D8%B8%D8%A7%D8%B1%D8%AA\"><\/span>\n<p>  14. \ud83d\udcdd \u062b\u0628\u062a \u0648 \u0646\u0638\u0627\u0631\u062a<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0628\u0631\u0627\u06cc \u0627\u0634\u06a9\u0627\u0644 \u0632\u062f\u0627\u06cc\u06cc \u0648 \u0646\u0638\u0627\u0631\u062a \u0628\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u062f\u0631 \u062a\u0648\u0644\u06cc\u062f \u0628\u0633\u06cc\u0627\u0631 \u0645\u0647\u0645 \u0627\u0633\u062a.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%AB%D8%A7%D9%84-6\"><\/span>\n<p>  \u0645\u062b\u0627\u0644:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u062f\u063a\u0627\u0645 \u06a9\u0646\u06cc\u062f <code>winston<\/code> \u0628\u0631\u0627\u06cc \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>npm <span class=\"nb\">install <\/span>winston\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0644\u0627\u06af\u0631:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ src\/infrastructure\/logger.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">createLogger<\/span><span class=\"p\">,<\/span> <span class=\"nx\">transports<\/span><span class=\"p\">,<\/span> <span class=\"nx\">format<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">winston<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">logger<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">createLogger<\/span><span class=\"p\">({<\/span>\n  <span class=\"na\">level<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">info<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">format<\/span><span class=\"p\">:<\/span> <span class=\"nx\">format<\/span><span class=\"p\">.<\/span><span class=\"nf\">combine<\/span><span class=\"p\">(<\/span><span class=\"nx\">format<\/span><span class=\"p\">.<\/span><span class=\"nf\">timestamp<\/span><span class=\"p\">(),<\/span> <span class=\"nx\">format<\/span><span class=\"p\">.<\/span><span class=\"nf\">json<\/span><span class=\"p\">()),<\/span>\n  <span class=\"na\">transports<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"k\">new<\/span> <span class=\"nx\">transports<\/span><span class=\"p\">.<\/span><span class=\"nc\">Console<\/span><span class=\"p\">()],<\/span>\n<span class=\"p\">});<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">logger<\/span> <span class=\"p\">};<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u0632 \u0644\u0627\u06af\u0631 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ src\/index.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">express<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">express<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">bookRoutes<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/interface\/routes\/bookRoutes<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">errorHandler<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/interface\/middleware\/errorHandler<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">logger<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/infrastructure\/logger<\/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=\"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\">express<\/span><span class=\"p\">.<\/span><span class=\"nf\">json<\/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=\"s2\">\/api<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"nx\">bookRoutes<\/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\">errorHandler<\/span><span class=\"p\">);<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">PORT<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">PORT<\/span> <span class=\"o\">||<\/span> <span class=\"mi\">3000<\/span><span class=\"p\">;<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">listen<\/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=\"s2\">`Server is running on port <\/span><span class=\"p\">${<\/span><span class=\"nx\">PORT<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"p\">);<\/span>\n<span class=\"p\">});<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"15_%E2%9A%99%EF%B8%8F_%D9%BE%DB%8C%DA%A9%D8%B1%D8%A8%D9%86%D8%AF%DB%8C_%D9%85%D8%AD%DB%8C%D8%B7\"><\/span>\n<p>  15. \u2699\ufe0f \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0645\u062d\u06cc\u0637<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u062d\u06cc\u0637 \u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u0628\u0631\u0627\u06cc \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 \u0627\u062c\u0631\u0627\u06cc \u0635\u062d\u06cc\u062d \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u062f\u0631 \u062a\u0648\u0633\u0639\u0647\u060c \u0622\u0632\u0645\u0627\u06cc\u0634 \u0648 \u062a\u0648\u0644\u06cc\u062f \u0628\u0633\u06cc\u0627\u0631 \u0645\u0647\u0645 \u0627\u0633\u062a.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%AB%D8%A7%D9%84-7\"><\/span>\n<p>  \u0645\u062b\u0627\u0644:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 `<\/p>\n<p>dotenv` \u0628\u0631\u0627\u06cc \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0645\u062d\u06cc\u0637:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>npm <span class=\"nb\">install <\/span>dotenv\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 <code>.env<\/code> \u0641\u0627\u06cc\u0644:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>PORT=3000\nJWT_SECRET=your_jwt_secret\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637\u06cc \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ src\/index.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">express<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">express<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">dotenv<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">dotenv<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"nx\">dotenv<\/span><span class=\"p\">.<\/span><span class=\"nf\">config<\/span><span class=\"p\">();<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">bookRoutes<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/interface\/routes\/bookRoutes<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">errorHandler<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/interface\/middleware\/errorHandler<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">logger<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/infrastructure\/logger<\/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=\"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\">express<\/span><span class=\"p\">.<\/span><span class=\"nf\">json<\/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=\"s2\">\/api<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"nx\">bookRoutes<\/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\">errorHandler<\/span><span class=\"p\">);<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">PORT<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">PORT<\/span> <span class=\"o\">||<\/span> <span class=\"mi\">3000<\/span><span class=\"p\">;<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">listen<\/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=\"s2\">`Server is running on port <\/span><span class=\"p\">${<\/span><span class=\"nx\">PORT<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"p\">);<\/span>\n<span class=\"p\">});<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"16_%F0%9F%9A%80_CICD_%D9%88_%D8%A7%D8%B3%D8%AA%D9%82%D8%B1%D8%A7%D8%B1\"><\/span>\n<p>  16. \ud83d\ude80 CI\/CD \u0648 \u0627\u0633\u062a\u0642\u0631\u0627\u0631<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u062e\u0648\u062f\u06a9\u0627\u0631\u0633\u0627\u0632\u06cc \u0622\u0632\u0645\u0627\u06cc\u0634\u060c \u0633\u0627\u062e\u062a \u0648 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 API \u0634\u0645\u0627 \u062b\u0628\u0627\u062a \u0648 \u0642\u0627\u0628\u0644\u06cc\u062a \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0631\u0627 \u062a\u0636\u0645\u06cc\u0646 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%AB%D8%A7%D9%84-8\"><\/span>\n<p>  \u0645\u062b\u0627\u0644:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc GitHub Actions \u0628\u0631\u0627\u06cc CI\/CD:<\/p>\n<p>\u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 <code>.github\/workflows\/ci.yml<\/code> \u0641\u0627\u06cc\u0644:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight yaml\"><code><span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Node.js CI<\/span>\n\n<span class=\"na\">on<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">push<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">branches<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">[<\/span><span class=\"nv\">main<\/span><span class=\"pi\">]<\/span>\n  <span class=\"na\">pull_request<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">branches<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">[<\/span><span class=\"nv\">main<\/span><span class=\"pi\">]<\/span>\n\n<span class=\"na\">jobs<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">build<\/span><span class=\"pi\">:<\/span>\n\n    <span class=\"na\">runs-on<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ubuntu-latest<\/span>\n\n    <span class=\"na\">strategy<\/span><span class=\"pi\">:<\/span>\n      <span class=\"na\">matrix<\/span><span class=\"pi\">:<\/span>\n        <span class=\"na\">node-version<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">[<\/span><span class=\"nv\">14.x<\/span><span class=\"pi\">,<\/span> <span class=\"nv\">16.x<\/span><span class=\"pi\">]<\/span>\n\n    <span class=\"na\">steps<\/span><span class=\"pi\">:<\/span>\n    <span class=\"pi\">-<\/span> <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">actions\/checkout@v2<\/span>\n    <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Use Node.js ${{ matrix.node-version }}<\/span>\n      <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">actions\/setup-node@v2<\/span>\n      <span class=\"na\">with<\/span><span class=\"pi\">:<\/span>\n        <span class=\"na\">node-version<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ matrix.node-version }}<\/span>\n    <span class=\"pi\">-<\/span> <span class=\"na\">run<\/span><span class=\"pi\">:<\/span> <span class=\"s\">npm install<\/span>\n    <span class=\"pi\">-<\/span> <span class=\"na\">run<\/span><span class=\"pi\">:<\/span> <span class=\"s\">npm test<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"17_%F0%9F%A7%B9_%DA%A9%DB%8C%D9%81%DB%8C%D8%AA_%D9%88_%D9%84%DB%8C%D9%86%D8%AA%DB%8C%D9%86%DA%AF_%DA%A9%D8%AF\"><\/span>\n<p>  17. \ud83e\uddf9 \u06a9\u06cc\u0641\u06cc\u062a \u0648 \u0644\u06cc\u0646\u062a\u06cc\u0646\u06af \u06a9\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u062d\u0641\u0638 \u06a9\u06cc\u0641\u06cc\u062a \u06a9\u062f \u06cc\u06a9\u0646\u0648\u0627\u062e\u062a \u062f\u0631 \u0645\u062d\u06cc\u0637 \u0647\u0627\u06cc \u0645\u0634\u0627\u0631\u06a9\u062a\u06cc \u0628\u0633\u06cc\u0627\u0631 \u0645\u0647\u0645 \u0627\u0633\u062a.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%AB%D8%A7%D9%84-9\"><\/span>\n<p>  \u0645\u062b\u0627\u0644:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>ESLint \u0648 Prettier \u0631\u0627 \u0627\u062f\u063a\u0627\u0645 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>npm <span class=\"nb\">install <\/span>eslint prettier eslint-config-prettier eslint-plugin-prettier <span class=\"nt\">--save-dev<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u06cc\u06a9 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc ESLint \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight json\"><code><span class=\"err\">\/\/<\/span><span class=\"w\"> <\/span><span class=\"err\">.eslintrc.json<\/span><span class=\"w\">\n<\/span><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"env\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n    <\/span><span class=\"nl\">\"node\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"kc\">true<\/span><span class=\"p\">,<\/span><span class=\"w\">\n    <\/span><span class=\"nl\">\"es6\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"kc\">true<\/span><span class=\"w\">\n  <\/span><span class=\"p\">},<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"extends\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">[<\/span><span class=\"s2\">\"eslint:recommended\"<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"plugin:@typescript-eslint\/recommended\"<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"prettier\"<\/span><span class=\"p\">],<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"plugins\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">[<\/span><span class=\"s2\">\"@typescript-eslint\"<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"prettier\"<\/span><span class=\"p\">],<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"parser\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"@typescript-eslint\/parser\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"rules\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n    <\/span><span class=\"nl\">\"prettier\/prettier\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"error\"<\/span><span class=\"w\">\n  <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u0641\u0632\u0648\u062f\u0646 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0632\u06cc\u0628\u0627\u062a\u0631:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight json\"><code><span class=\"err\">\/\/<\/span><span class=\"w\"> <\/span><span class=\"err\">.prettierrc<\/span><span class=\"w\">\n<\/span><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"singleQuote\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"kc\">true<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"trailingComma\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"all\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"printWidth\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"mi\">80<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"18_%F0%9F%9B%A0%EF%B8%8F_%D9%85%D8%B3%D8%AA%D9%86%D8%AF%D8%A7%D8%AA_%D9%BE%D8%B1%D9%88%DA%98%D9%87\"><\/span>\n<p>  18. \ud83d\udee0\ufe0f \u0645\u0633\u062a\u0646\u062f\u0627\u062a \u067e\u0631\u0648\u0698\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u0645\u0633\u062a\u0646\u062f\u0633\u0627\u0632\u06cc API \u0634\u0645\u0627 \u0647\u0645 \u0628\u0631\u0627\u06cc \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u06af\u0627\u0646 \u0648 \u0647\u0645 \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0646\u0647\u0627\u06cc\u06cc \u0628\u0633\u06cc\u0627\u0631 \u0645\u0647\u0645 \u0627\u0633\u062a.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%AB%D8%A7%D9%84-10\"><\/span>\n<p>  \u0645\u062b\u0627\u0644:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0645\u0633\u062a\u0646\u062f\u0627\u062a API \u0631\u0627 \u0628\u0627 Swagger \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>npm <span class=\"nb\">install <\/span>swagger-jsdoc swagger-ui-express\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06cc\u062c\u0627\u062f \u0645\u0633\u062a\u0646\u062f\u0627\u062a Swagger:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ src\/interface\/swagger.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">swaggerJSDoc<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">swagger-jsdoc<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">swaggerUi<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">swagger-ui-express<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Express<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">express<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">options<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n  <span class=\"na\">definition<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n    <span class=\"na\">openapi<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">3.0.0<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">info<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">title<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Clean Architecture API<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">version<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">1.0.0<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">},<\/span>\n  <span class=\"p\">},<\/span>\n  <span class=\"na\">apis<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">.\/src\/interface\/routes\/*.ts<\/span><span class=\"dl\">\"<\/span><span class=\"p\">],<\/span>\n<span class=\"p\">};<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">swaggerSpec<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">swaggerJSDoc<\/span><span class=\"p\">(<\/span><span class=\"nx\">options<\/span><span class=\"p\">);<\/span>\n\n<span class=\"kd\">function<\/span> <span class=\"nf\">setupSwagger<\/span><span class=\"p\">(<\/span><span class=\"nx\">app<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Express<\/span><span class=\"p\">)<\/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=\"s2\">\/api-docs<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"nx\">swaggerUi<\/span><span class=\"p\">.<\/span><span class=\"nx\">serve<\/span><span class=\"p\">,<\/span> <span class=\"nx\">swaggerUi<\/span><span class=\"p\">.<\/span><span class=\"nf\">setup<\/span><span class=\"p\">(<\/span><span class=\"nx\">swaggerSpec<\/span><span class=\"p\">));<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">setupSwagger<\/span> <span class=\"p\">};<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>Swagger \u0631\u0627 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0635\u0644\u06cc \u062e\u0648\u062f \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"c1\">\/\/ src\/index.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">express<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">express<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">dotenv<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">dotenv<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"nx\">dotenv<\/span><span class=\"p\">.<\/span><span class=\"nf\">config<\/span><span class=\"p\">();<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">bookRoutes<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/interface\/routes\/bookRoutes<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">errorHandler<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/interface\/middleware\/errorHandler<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">logger<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/infrastructure\/logger<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">setupSwagger<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/interface\/swagger<\/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=\"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\">express<\/span><span class=\"p\">.<\/span><span class=\"nf\">json<\/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=\"s2\">\/api<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"nx\">bookRoutes<\/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\">errorHandler<\/span><span class=\"p\">);<\/span>\n<span class=\"nf\">setupSwagger<\/span><span class=\"p\">(<\/span><span class=\"nx\">app<\/span><span class=\"p\">);<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">PORT<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">PORT<\/span> <span class=\"o\">||<\/span> <span class=\"mi\">3000<\/span><span class=\"p\">;<\/span>\n<span class=\"nx\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">listen<\/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=\"s2\">`Server is running on port <\/span><span class=\"p\">${<\/span><span class=\"nx\">PORT<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"p\">);<\/span>\n<span class=\"p\">});<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"19_%F0%9F%8F%81_%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%DA%AF%DB%8C%D8%B1%DB%8C\"><\/span>\n<p>  19. \ud83c\udfc1 \u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0627\u0632\u06af\u0634\u062a \u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0648\u0628\u0644\u0627\u06af\u060c \u0646\u062d\u0648\u0647 \u0633\u0627\u062e\u062a \u06cc\u06a9 API \u0645\u062f\u0631\u0646 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Node.js\u060c Express \u0648 TypeScript \u0631\u0627 \u0628\u0627 \u0631\u0639\u0627\u06cc\u062a \u0627\u0635\u0648\u0644 Clean Architecture \u0628\u0631\u0631\u0633\u06cc \u06a9\u0631\u062f\u06cc\u0645. \u0645\u0627 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0627\u0648\u0644\u06cc\u0647 \u0631\u0627 \u0628\u0627 \u0627\u0641\u0632\u0648\u062f\u0646 \u0648\u06cc\u0698\u06af\u06cc\u200c\u0647\u0627\u06cc \u06a9\u0644\u06cc\u062f\u06cc \u0645\u0627\u0646\u0646\u062f \u062a\u0632\u0631\u06cc\u0642 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc\u060c \u0645\u062f\u06cc\u0631\u06cc\u062a \u062e\u0637\u0627\u060c \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc\u060c \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647\u200c\u0633\u0627\u0632\u06cc \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0648\u0627\u0642\u0639\u06cc\u060c \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0648 \u0645\u062c\u0648\u0632\u060c \u062b\u0628\u062a \u0648 \u0646\u0638\u0627\u0631\u062a\u060c \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0645\u062d\u06cc\u0637\u060c CI\/CD\u060c \u06a9\u06cc\u0641\u06cc\u062a \u06a9\u062f \u0648 \u067e\u0631 \u06a9\u0631\u062f\u0646 \u0648 \u0645\u0633\u062a\u0646\u062f\u0627\u062a \u067e\u0631\u0648\u0698\u0647 \u06af\u0633\u062a\u0631\u0634 \u062f\u0627\u062f\u06cc\u0645.<\/p>\n<p>\u0628\u0627 \u067e\u06cc\u0631\u0648\u06cc \u0627\u0632 \u0627\u06cc\u0646 \u0634\u06cc\u0648\u0647\u200c\u0647\u0627\u060c \u0645\u0637\u0645\u0626\u0646 \u062e\u0648\u0627\u0647\u06cc\u062f \u0634\u062f \u06a9\u0647 API \u0634\u0645\u0627 \u0646\u0647 \u062a\u0646\u0647\u0627 \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u0627\u0633\u062a\u060c \u0628\u0644\u06a9\u0647 \u0642\u0627\u0628\u0644 \u0646\u06af\u0647\u062f\u0627\u0631\u06cc\u060c \u0645\u0642\u06cc\u0627\u0633\u200c\u067e\u0630\u06cc\u0631 \u0648 \u0622\u0645\u0627\u062f\u0647 \u0628\u0631\u0627\u06cc \u062a\u0648\u0644\u06cc\u062f \u0627\u0633\u062a. \u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u0628\u0647 \u062a\u0648\u0633\u0639\u0647 \u0627\u062f\u0627\u0645\u0647 \u0645\u06cc \u062f\u0647\u06cc\u062f\u060c \u0628\u0627 \u062e\u06cc\u0627\u0644 \u0631\u0627\u062d\u062a \u0627\u0644\u06af\u0648\u0647\u0627 \u0648 \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc \u0627\u0636\u0627\u0641\u06cc \u0631\u0627 \u0628\u0631\u0627\u06cc \u0628\u0647\u0628\u0648\u062f \u0628\u06cc\u0634\u062a\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u06a9\u0634\u0641 \u06a9\u0646\u06cc\u062f.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D8%B3%D9%81%D8%B1_%D8%AC%D8%A7%D9%88%D8%A7_%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA_%D8%AE%D9%88%D8%AF_%D8%B1%D8%A7_%D8%B4%D8%B1%D9%88%D8%B9_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \u0633\u0641\u0631 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u062e\u0648\u062f \u0631\u0627 \u0634\u0631\u0648\u0639 \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u06af\u0631 \u0628\u0627 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u062a\u0627\u0632\u0647 \u06a9\u0627\u0631 \u0647\u0633\u062a\u06cc\u062f \u06cc\u0627 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u06cc\u06a9 \u062a\u0627\u0632\u0647 \u06a9\u0646\u0646\u062f\u0647 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f\u060c \u0627\u0632 \u0648\u0628\u0644\u0627\u06af \u0645\u0646 \u062f\u0631 BuyMeACoffee \u062f\u06cc\u062f\u0646 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0628\u0627 \u0627\u0635\u0648\u0644 \u0627\u0648\u0644\u06cc\u0647 \u0634\u0631\u0648\u0639 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\ud83d\udc49 \u0645\u0642\u062f\u0645\u0647 \u0627\u06cc \u0628\u0631 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a: \u0627\u0648\u0644\u06cc\u0646 \u0642\u062f\u0645 \u0647\u0627\u06cc \u0634\u0645\u0627 \u062f\u0631 \u06a9\u062f\u0646\u0648\u06cc\u0633\u06cc<\/p>\n<p> <\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D9%81%D9%87%D8%B1%D8%B3%D8%AA_%D8%B3%D8%B1%DB%8C\"><\/span>\n<p>  \u0641\u0647\u0631\u0633\u062a \u0633\u0631\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<div class=\"table-wrapper-paragraph\">\n<table>\n<thead>\n<tr>\n<th>\u0642\u0633\u0645\u062a<\/th>\n<th>\u0639\u0646\u0648\u0627\u0646<\/th>\n<th>\u067e\u06cc\u0648\u0646\u062f<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>1<\/td>\n<td>\u06af\u0630\u0631\u0648\u0627\u0698\u0647\u200c\u0647\u0627 \u0631\u0627 \u062d\u0630\u0641 \u06a9\u0646\u06cc\u062f: \u0628\u0627 FACEIO \u0642\u0627\u0628\u0644\u06cc\u062a \u062a\u0634\u062e\u06cc\u0635 \u0686\u0647\u0631\u0647 \u0631\u0627 \u0628\u0647 \u0648\u0628\u200c\u0633\u0627\u06cc\u062a \u062e\u0648\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f<\/td>\n<td>\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>\u0686\u06cc\u062a \u0686\u06cc\u062a \u0646\u0647\u0627\u06cc\u06cc Git Command<\/td>\n<td>\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/td>\n<\/tr>\n<tr>\n<td>3<\/td>\n<td>12 \u0645\u0646\u0628\u0639 \u0628\u0631\u062a\u0631 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0628\u0631\u0627\u06cc \u06cc\u0627\u062f\u06af\u06cc\u0631\u06cc \u0648 \u062a\u0633\u0644\u0637<\/td>\n<td>\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/td>\n<\/tr>\n<tr>\n<td>4<\/td>\n<td>Angular vs. React: \u0645\u0642\u0627\u06cc\u0633\u0647 \u0627\u06cc \u062c\u0627\u0645\u0639<\/td>\n<td>\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/td>\n<\/tr>\n<tr>\n<td>5<\/td>\n<td>10 \u0631\u0648\u0634 \u0628\u0631\u062a\u0631 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0628\u0631\u0627\u06cc \u0646\u0648\u0634\u062a\u0646 \u06a9\u062f \u067e\u0627\u06a9<\/td>\n<td>\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/td>\n<\/tr>\n<tr>\n<td>6<\/td>\n<td>20 \u062a\u0631\u0641\u0646\u062f \u0648 \u0646\u06a9\u062a\u0647 \u0628\u0631\u062a\u0631 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0628\u0631\u0627\u06cc \u0647\u0631 \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u0647 \ud83d\ude80<\/td>\n<td>\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/td>\n<\/tr>\n<tr>\n<td>7<\/td>\n<td>8 \u0645\u0641\u0647\u0648\u0645 \u062c\u062f\u06cc\u062f \u0648 \u0647\u06cc\u062c\u0627\u0646 \u0627\u0646\u06af\u06cc\u0632 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u06a9\u0647 \u0628\u0627\u06cc\u062f \u0628\u062f\u0627\u0646\u06cc\u062f<\/td>\n<td>\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/td>\n<\/tr>\n<tr>\n<td>8<\/td>\n<td>7 \u0646\u06a9\u062a\u0647 \u0628\u0631\u062a\u0631 \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u0648\u0636\u0639\u06cc\u062a \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a<\/td>\n<td>\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/td>\n<\/tr>\n<tr>\n<td>9<\/td>\n<td>\ud83d\udd12 \u0628\u0647\u062a\u0631\u06cc\u0646 \u0631\u0648\u0634 \u0647\u0627\u06cc \u0627\u0645\u0646\u06cc\u062a\u06cc Essential Node.js<\/td>\n<td>\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/td>\n<\/tr>\n<tr>\n<td>10<\/td>\n<td>10 \u0628\u0647\u062a\u0631\u06cc\u0646 \u0631\u0648\u0634 \u0628\u0631\u0627\u06cc \u0628\u0647\u06cc\u0646\u0647 \u0633\u0627\u0632\u06cc \u0639\u0645\u0644\u06a9\u0631\u062f \u0632\u0627\u0648\u06cc\u0647 \u0627\u06cc<\/td>\n<td>\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/td>\n<\/tr>\n<tr>\n<td>11<\/td>\n<td>10 \u062a\u06a9\u0646\u06cc\u06a9 \u0628\u0631\u062a\u0631 \u0628\u0647\u06cc\u0646\u0647 \u0633\u0627\u0632\u06cc \u0639\u0645\u0644\u06a9\u0631\u062f React<\/td>\n<td>\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/td>\n<\/tr>\n<tr>\n<td>12<\/td>\n<td>15 \u067e\u0631\u0648\u0698\u0647 \u0628\u0631\u062a\u0631 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0628\u0631\u0627\u06cc \u062a\u0642\u0648\u06cc\u062a \u0646\u0645\u0648\u0646\u0647 \u06a9\u0627\u0631\u0647\u0627<\/td>\n<td>\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/td>\n<\/tr>\n<tr>\n<td>13<\/td>\n<td>6 \u0645\u062e\u0632\u0646 \u0628\u0631\u0627\u06cc Master Node.js<\/td>\n<td>\u0628\u062e\u0648\u0627\u0646\u06cc\u062f<\/td>\n<\/tr>\n<tr>\n<td>14<\/td>\n<td>\u0628\u0647\u062a\u0631\u06cc\u0646 6 \u0645\u062e\u0632\u0646 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0627\u062f Next.js<\/td>\n<td>\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/td>\n<\/tr>\n<tr>\n<td>15<\/td>\n<td>5 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0628\u0631\u062a\u0631 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc \u062a\u0639\u0627\u0645\u0644\u06cc<\/td>\n<td>\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/td>\n<\/tr>\n<tr>\n<td>16<\/td>\n<td>3 \u0645\u0641\u0647\u0648\u0645 \u0628\u0631\u062a\u0631 \u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u06a9\u0647 \u0647\u0631 \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u0647 \u0627\u06cc \u0628\u0627\u06cc\u062f \u0628\u062f\u0627\u0646\u062f<\/td>\n<td>\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/td>\n<\/tr>\n<tr>\n<td>17<\/td>\n<td>20 \u0631\u0648\u0634 \u0628\u0631\u0627\u06cc \u0628\u0647\u0628\u0648\u062f \u0639\u0645\u0644\u06a9\u0631\u062f Node.js \u062f\u0631 \u0645\u0642\u06cc\u0627\u0633<\/td>\n<td>\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/td>\n<\/tr>\n<tr>\n<td>18<\/td>\n<td>\u0639\u0645\u0644\u06a9\u0631\u062f \u0628\u0631\u0646\u0627\u0645\u0647 Node.js \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 \u0641\u0634\u0631\u062f\u0647 \u0633\u0627\u0632\u06cc \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631 \u0627\u0641\u0632\u0627\u06cc\u0634 \u062f\u0647\u06cc\u062f<\/td>\n<td>\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/td>\n<\/tr>\n<tr>\n<td>19<\/td>\n<td>\u062f\u0631\u06a9 \u0627\u0644\u06af\u0648\u0631\u06cc\u062a\u0645 \u062f\u0627\u06cc\u06a9\u0633\u062a\u0631\u0627: \u0631\u0627\u0647\u0646\u0645\u0627\u06cc \u06af\u0627\u0645 \u0628\u0647 \u06af\u0627\u0645<\/td>\n<td>\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/td>\n<\/tr>\n<tr>\n<td>20<\/td>\n<td>\u0622\u0634\u0646\u0627\u06cc\u06cc \u0628\u0627 NPM \u0648 NVM: \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc \u0636\u0631\u0648\u0631\u06cc \u0628\u0631\u0627\u06cc \u062a\u0648\u0633\u0639\u0647 Node.js<\/td>\n<td>\u0628\u062e\u0648\u0627\u0646\u06cc\u062f <\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D9%81%D8%A7%D9%84%D9%88_%DA%A9%D9%86%DB%8C%D8%AF_%D9%88_%D9%85%D8%B4%D8%AA%D8%B1%DA%A9_%D8%B4%D9%88%DB%8C%D8%AF\"><\/span>\n<p>  \u0641\u0627\u0644\u0648 \u06a9\u0646\u06cc\u062f \u0648 \u0645\u0634\u062a\u0631\u06a9 \u0634\u0648\u06cc\u062f:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Summarize this content to 400 words in Persian Lang API \u0647\u0627 \u0633\u062a\u0648\u0646 \u0641\u0642\u0631\u0627\u062a \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u0648\u0628 \u0645\u062f\u0631\u0646 \u0647\u0633\u062a\u0646\u062f. \u0628\u0627 \u0627\u0641\u0632\u0627\u06cc\u0634 \u067e\u06cc\u0686\u06cc\u062f\u06af\u06cc \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u060c \u0627\u062a\u062e\u0627\u0630 \u0645\u0639\u0645\u0627\u0631\u06cc \u06a9\u0647 \u0645\u0642\u06cc\u0627\u0633\u200c\u067e\u0630\u06cc\u0631\u06cc\u060c \u0642\u0627\u0628\u0644\u06cc\u062a \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u0648 \u0622\u0632\u0645\u0627\u06cc\u0634\u200c\u067e\u0630\u06cc\u0631\u06cc \u0631\u0627 \u0627\u0631\u062a\u0642\u0627 \u0645\u06cc\u200c\u062f\u0647\u062f\u060c \u0628\u0633\u06cc\u0627\u0631 \u0645\u0647\u0645 \u0627\u0633\u062a. \u062f\u0631 \u0627\u06cc\u0646 \u0648\u0628\u0644\u0627\u06af\u060c \u0646\u062d\u0648\u0647 \u0633\u0627\u062e\u062a \u06cc\u06a9 API \u0645\u062f\u0631\u0646 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Node.js\u060c Express\u060c \u0648 TypeScript \u0631\u0627 \u0628\u0627 \u0631\u0639\u0627\u06cc\u062a &hellip;<\/p>\n","protected":false},"author":2,"featured_media":73786,"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-73785","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\/73785","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=73785"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/73785\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/73786"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=73785"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=73785"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=73785"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}