{"id":28304,"date":"2026-08-26T06:12:51","date_gmt":"2026-08-26T06:12:51","guid":{"rendered":"https:\/\/umang.pk\/2026\/08\/26\/%db%81%d9%88%d9%86%d9%88-%d8%a7%d9%88%d8%b1-%d8%b2%d9%88%da%88-%da%a9%d8%a7-%d8%a7%d8%b3%d8%aa%d8%b9%d9%85%d8%a7%d9%84-%da%a9%d8%b1%d8%aa%db%92-%db%81%d9%88%d8%a6%db%92-%d9%b9%d8%a7%d8%a6%d9%be-%d8%b3\/"},"modified":"2026-08-26T06:12:52","modified_gmt":"2026-08-26T06:12:52","slug":"%db%81%d9%88%d9%86%d9%88-%d8%a7%d9%88%d8%b1-%d8%b2%d9%88%da%88-%da%a9%d8%a7-%d8%a7%d8%b3%d8%aa%d8%b9%d9%85%d8%a7%d9%84-%da%a9%d8%b1%d8%aa%db%92-%db%81%d9%88%d8%a6%db%92-%d9%b9%d8%a7%d8%a6%d9%be-%d8%b3","status":"publish","type":"post","link":"https:\/\/umang.pk\/ur\/2026\/08\/26\/%db%81%d9%88%d9%86%d9%88-%d8%a7%d9%88%d8%b1-%d8%b2%d9%88%da%88-%da%a9%d8%a7-%d8%a7%d8%b3%d8%aa%d8%b9%d9%85%d8%a7%d9%84-%da%a9%d8%b1%d8%aa%db%92-%db%81%d9%88%d8%a6%db%92-%d9%b9%d8%a7%d8%a6%d9%be-%d8%b3\/","title":{"rendered":"\u06c1\u0648\u0646\u0648 \u0627\u0648\u0631 \u0632\u0648\u0688 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0679\u0627\u0626\u067e \u0633\u06cc\u0641 APIs \u06a9\u06cc\u0633\u06d2 \u0628\u0646\u0627\u0626\u06cc\u06ba"},"content":{"rendered":"\n<div id=\"\">\n<p>\u0627\u06af\u0631 \u0622\u067e \u0646\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u0628\u06be\u06cc Node.js API \u062c\u0627\u0631\u06cc \u06a9\u06cc\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0634\u0627\u06cc\u062f \u0622\u067e \u0627\u0646 \u0686\u06cc\u0644\u0646\u062c\u0648\u06ba \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06c1\u06cc \u0648\u0627\u0642\u0641 \u06c1\u0648\u06ba \u06af\u06d2\u06d4 TypeScript \u06a9\u06cc \u0642\u0633\u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0628\u0627\u062a \u06a9\u06c1\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u0631\u0646 \u0679\u0627\u0626\u0645 \u06a9\u06cc \u062a\u0648\u062b\u06cc\u0642 \u0627\u06cc\u06a9 \u0627\u0648\u0631 \u06a9\u06c1\u062a\u06cc \u06c1\u06d2\u060c \u0627\u0648\u0631 OpenAPI \u062f\u0633\u062a\u0627\u0648\u06cc\u0632\u0627\u062a \u062e\u0627\u0645\u0648\u0634\u06cc \u0633\u06d2 \u062f\u0648\u0646\u0648\u06ba \u0633\u06d2 \u0645\u062a\u0641\u0642 \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06a9\u0633\u06cc \u0646\u06d2 \u0627\u0646\u0679\u0631\u0641\u06cc\u0633 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0641\u06cc\u0644\u0688 \u0634\u0627\u0645\u0644 \u06a9\u06cc\u0627 \u0627\u0648\u0631 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u0627\u067e \u0688\u06cc\u0679 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u0627\u06d4 \u062f\u0633\u062a\u0627\u0648\u06cc\u0632 \u0627\u0633 \u0648\u0642\u062a \u062a\u06a9 \u067e\u0631\u0627\u0646\u06cc \u0631\u06c1\u06d2 \u06af\u06cc \u062c\u0628 \u062a\u06a9 \u06a9\u06c1 \u06a9\u0648\u0626\u06cc \u06a9\u0644\u0627\u0626\u0646\u0679 \u0628\u06af \u06a9\u06cc \u0627\u0637\u0644\u0627\u0639 \u0646\u06c1\u06cc\u06ba \u062f\u06cc\u062a\u0627\u06d4 \u06a9\u0648\u0626\u06cc \u06a9\u0645\u067e\u0627\u0626\u0644\u0631 \u063a\u0644\u0637\u06cc\u0627\u06ba \u06cc\u0627 \u0646\u0627\u06a9\u0627\u0645 \u0679\u06cc\u0633\u0679 \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4 \u0633\u0686\u0627\u0626\u06cc \u06a9\u06d2 \u062a\u06cc\u0646 \u0645\u0627\u062e\u0630 \u0627\u06cc\u06a9 \u062f\u0648\u0633\u0631\u06d2 \u0633\u06d2 \u0627\u0644\u06af \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u0633 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644 \u0645\u06cc\u06ba\u060c \u0622\u067e \u0633\u06cc\u06a9\u06be\u06cc\u06ba \u06af\u06d2 \u06a9\u06c1 \u06c1\u0648\u0646\u0648 \u0627\u0648\u0631 \u0632\u0648\u0688 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u062a\u06cc\u0646 \u0645\u0633\u0627\u0626\u0644 \u06a9\u0648 \u0627\u06cc\u06a9 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc\u06ba \u06a9\u06cc\u0633\u06d2 \u06a9\u0645 \u06a9\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4 \u0622\u067e \u0648\u06c1\u06cc \u067e\u06cc\u0679\u0631\u0646 \u0628\u0646\u0627\u0626\u06cc\u06ba \u06af\u06d2 \u062c\u0648 \u0645\u06cc\u06ba \u067e\u0631\u0648\u0688\u06a9\u0634\u0646 \u0645\u06cc\u06ba \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u0648\u06ba\u060c \u0628\u0634\u0645\u0648\u0644 ClipForge\u060c \u0627\u06cc\u06a9 \u0627\u0648\u067e\u0646 \u0633\u0648\u0631\u0633 \u0648\u06cc\u0688\u06cc\u0648 \u067e\u0631\u0648\u0633\u06cc\u0633\u0646\u06af \u0679\u0648\u0644 \u06a9\u0679 \u062c\u0633\u06d2 \u0645\u06cc\u06ba \u0646\u06d2 \u0628\u0646\u0627\u06cc\u0627 \u0627\u0648\u0631 \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06a9\u06be\u0627\u06d4 \u0627\u0633 \u0633\u06d2 \u062a\u0648\u062b\u06cc\u0642\u060c \u0627\u0642\u0633\u0627\u0645 \u0627\u0648\u0631 \u062f\u0633\u062a\u0627\u0648\u06cc\u0632\u0627\u062a \u06a9\u0648 \u0688\u06cc\u0632\u0627\u0626\u0646 \u06a9\u06d2 \u0644\u062d\u0627\u0638 \u0633\u06d2 \u0645\u0637\u0627\u0628\u0642\u062a \u067e\u0630\u06cc\u0631 \u0631\u06a9\u06be\u0646\u06d2 \u0645\u06cc\u06ba \u0645\u062f\u062f \u0645\u0644\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633 \u0645\u0636\u0645\u0648\u0646 \u06a9\u06d2 \u0627\u062e\u062a\u062a\u0627\u0645 \u062a\u06a9\u060c \u0622\u067e \u06a9\u0648 \u0645\u0639\u0644\u0648\u0645 \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2 \u06a9\u06c1 \u06a9\u06cc\u0633\u06d2:<\/p>\n<ul>\n<li>\n<p>\u0627\u06cc\u06a9 Zod \u0627\u0633\u06a9\u06cc\u0645\u0627 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u06cc\u06ba \u062c\u0648 \u0631\u0646 \u0679\u0627\u0626\u0645 \u06a9\u06cc \u062a\u0648\u062b\u06cc\u0642\u060c TypeScript \u06a9\u06cc \u0627\u0642\u0633\u0627\u0645\u060c \u0627\u0648\u0631 OpenAPI \u062f\u0633\u062a\u0627\u0648\u06cc\u0632\u0627\u062a \u06a9\u0648 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2<\/p>\n<\/li>\n<li>\n<p>\u0627\u067e\u0646\u06d2 \u0631\u0627\u0633\u062a\u0648\u06ba \u06a9\u06cc \u0633\u0627\u062e\u062a \u0628\u0646\u0627\u0626\u06cc\u06ba \u062a\u0627\u06a9\u06c1 \u0645\u0639\u0627\u06c1\u062f\u06d2 \u0627\u0648\u0631 \u06c1\u06cc\u0646\u0688\u0644\u0631\u0632 \u0627\u0644\u06af \u0631\u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u0627\u0648\u0631 HTTP \u0627\u0633\u06a9\u06cc\u0645\u0627 \u06a9\u0648 \u062f\u0648 \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u067e\u0631\u062a\u0648\u06ba \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0631\u06a9\u06be\u0646\u0627<\/p>\n<\/li>\n<li>\n<p>\u062a\u0645\u0627\u0645 \u0646\u0627\u06a9\u0627\u0645\u06cc \u06a9\u06d2 \u0631\u0627\u0633\u062a\u06d2 \u0627\u06cc\u06a9 \u0645\u0633\u062a\u0642\u0644 \u063a\u0644\u0637\u06cc \u06a9\u06cc \u0634\u06a9\u0644 \u0648\u0627\u067e\u0633 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0627\u0633\u06cc \u067e\u06cc\u0679\u0631\u0646 \u06a9\u0648 \u0686\u06be\u0648\u0679\u06d2 \u0679\u0627\u0633\u06a9\u0633 API \u0633\u06d2 \u062d\u0642\u06cc\u0642\u06cc \u0645\u0644\u0679\u06cc \u0633\u0631\u0648\u0633 \u0633\u0633\u0679\u0645 \u0645\u06cc\u06ba \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u0646\u0627<\/p>\n<\/li>\n<\/ul>\n<h2 id=\"heading-prerequisites\">\u0634\u0631\u0627\u0626\u0637<\/h2>\n<p>\u0627\u0633 \u0645\u0636\u0645\u0648\u0646 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0641\u0627\u0626\u062f\u06c1 \u0627\u0679\u06be\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u0622\u067e \u06a9\u0648 \u06cc\u06c1 \u062c\u0627\u0646\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2:<\/p>\n<ul>\n<li>\n<p>\u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u067e\u0679 \u0627\u0648\u0631 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0679\u0627\u0626\u067e \u0627\u0633\u06a9\u0631\u067e\u0679<\/p>\n<\/li>\n<li>\n<p>REST API \u06a9\u06cc\u0633\u06d2 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 (\u0631\u0627\u0633\u062a\u06c1\u060c \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0627 \u0628\u0627\u0688\u06cc\u060c \u0627\u0633\u0679\u06cc\u0679\u0633 \u06a9\u0648\u0688)<\/p>\n<\/li>\n<li>\n<p>\u062a\u06be\u0648\u0691\u0627 \u0633\u0627 Node.js (\u067e\u06cc\u06a9\u062c\u0632 \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u060c \u0627\u0633\u06a9\u0631\u067e\u0679 \u0686\u0644\u0627\u0626\u06cc\u06ba)<\/p>\n<\/li>\n<\/ul>\n<p>\u06c1\u0648\u0646\u0648\u060c \u0632\u0648\u0688\u060c \u06cc\u0627 \u0628\u0648\u0646\u062f\u0627 \u0628\u0627\u0646\u062f\u06cc \u06a9\u06d2 \u0633\u0627\u062a\u06be \u06a9\u0633\u06cc \u067e\u06cc\u0634\u06af\u06cc \u062a\u062c\u0631\u0628\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-table-of-contents\">\u0627\u0646\u0688\u06cc\u06a9\u0633<\/h2>\n<h2 id=\"heading-1-the-drift-problem\">1. \u0628\u06c1\u0627\u0624 \u06a9\u0627 \u0645\u0633\u0626\u0644\u06c1<\/h2>\n<p>\u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 TypeScript APIs \u0627\u06cc\u06a9 \u06c1\u06cc \u0688\u06cc\u0679\u0627 \u06a9\u06cc \u062a\u06cc\u0646 \u0627\u0644\u06af \u0627\u0644\u06af \u0648\u0636\u0627\u062d\u062a\u06cc\u06ba \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<ol>\n<li>\n<p><strong>\u0631\u0646 \u0679\u0627\u0626\u0645 \u062a\u0648\u062b\u06cc\u0642<\/strong> \u0686\u06cc\u06a9 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0622\u0646\u06d2 \u067e\u0631 \u0686\u0644\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u0679\u0627\u0626\u067e \u0627\u0633\u06a9\u0631\u067e\u0679 \u06a9\u06cc \u0627\u0642\u0633\u0627\u0645<\/strong> <strong>\u0634\u06a9\u0644<\/strong> \u0645\u0631\u062a\u0628 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u0627 \u0627\u0633\u06d2 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u06d2 \u0648\u0642\u062a \u0633\u0645\u062c\u06be\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>API \u062f\u0633\u062a\u0627\u0648\u06cc\u0632\u0627\u062a<\/strong>\u06a9\u0646\u0679\u0631\u06cc\u06a9\u0679 \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u0648 \u062f\u06a9\u06be\u0627\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ol>\n<p>\u06c1\u0631 \u0627\u06cc\u06a9 \u0645\u062e\u062a\u0644\u0641 \u0641\u0627\u0626\u0644 \u0645\u06cc\u06ba \u0645\u0648\u062c\u0648\u062f \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0645\u062e\u062a\u0644\u0641 \u0634\u06cc\u0688\u0648\u0644 \u067e\u0631 \u0627\u067e \u0688\u06cc\u0679 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0648\u0631 \u0627\u0646 \u0645\u06cc\u06ba \u0633\u06d2 \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u062f\u0648\u0633\u0631\u06d2 \u06a9\u0648 \u0646\u06c1\u06cc\u06ba \u062f\u06cc\u06a9\u06be \u0633\u06a9\u062a\u0627\u06d4<\/p>\n<p><em>\u0634\u06a9\u0644 1: \u0627\u06cc\u06a9 \u06c1\u06cc \u0688\u06cc\u0679\u0627 \u06a9\u06cc \u062a\u06cc\u0646 \u0648\u0636\u0627\u062d\u062a\u06cc\u06ba \u0627\u0644\u06af \u0627\u0644\u06af \u0627\u0648\u0631 \u0627\u06a9\u062b\u0631 \u0645\u0637\u0627\u0628\u0642\u062a \u067e\u0630\u06cc\u0631 \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4<\/em><\/p>\n<p>\u06c1\u0627\u062a\u06be \u0633\u06d2 \u0644\u06a9\u06be\u06d2 \u06c1\u0648\u0626\u06d2 \u0627\u0646\u0679\u0631\u0641\u06cc\u0633 \u0631\u0646 \u0679\u0627\u0626\u0645 \u06a9\u06d2 \u0648\u0642\u062a \u063a\u0627\u0626\u0628 \u06c1\u0648 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 Joi \u06cc\u0627 Yup \u0627\u0633\u06a9\u06cc\u0645\u0627\u0633 \u0688\u06cc\u0679\u0627 \u06a9\u06cc \u062a\u0648\u062b\u06cc\u0642 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u0627\u0642\u0633\u0627\u0645 \u0645\u0641\u062a \u0641\u0631\u0627\u06c1\u0645 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 OpenAPI \u0641\u0627\u0626\u0644\u06cc\u06ba \u0639\u0627\u0645 \u0637\u0648\u0631 \u067e\u0631 \u062f\u0633\u062a\u06cc \u0637\u0648\u0631 \u067e\u0631 \u062a\u0631\u0645\u06cc\u0645 \u06a9\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u0627\u06af\u0631 \u0628\u0627\u0644\u06a9\u0644 \u0628\u06be\u06cc\u06d4<\/p>\n<p>\u062d\u0644 &quot;\u0632\u06cc\u0627\u062f\u06c1 \u0645\u062d\u062a\u0627\u0637 \u0631\u06c1\u0646\u0627&#8221; \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u062a\u0631\u0645\u06cc\u0645 \u0627\u06cc\u06a9 \u062a\u0639\u0631\u06cc\u0641 \u06c1\u06d2 \u062c\u0648 \u062a\u06cc\u0646\u0648\u06ba \u0622\u0624\u0679 \u067e\u0679 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/08\/1787724770_233_\u06c1\u0648\u0646\u0648-\u0627\u0648\u0631-\u0632\u0648\u0688-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2-\u0679\u0627\u0626\u067e-\u0633\u06cc\u0641-APIs.png\" alt=\"\u0627\u06cc\u06a9 Zod \u0627\u0633\u06a9\u06cc\u0645\u0627 \u062c\u0648 \u0631\u0646 \u0679\u0627\u0626\u0645 \u06a9\u06cc \u062a\u0648\u062b\u06cc\u0642\u060c TypeScript \u06a9\u06cc \u0627\u0642\u0633\u0627\u0645\u060c \u0627\u0648\u0631 OpenAPI \u062f\u0633\u062a\u0627\u0648\u06cc\u0632\u0627\u062a \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4\" style=\"display:block;margin:0 auto\" width=\"600\" height=\"400\" loading=\"lazy\" title=\"\"><\/p>\n<p><em>\u0634\u06a9\u0644 2: \u0627\u06cc\u06a9 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u06a9\u06cc \u062a\u0639\u0631\u06cc\u0641 \u062a\u06cc\u0646 \u0622\u0624\u0679 \u067e\u0679 \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/em><\/p>\n<p>\u06cc\u06c1 \u0648\u06c1\u06cc \u06c1\u06d2 \u062c\u0648 Hono \u0627\u0648\u0631 Zod \u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u067e\u0631 \u067e\u06cc\u0634 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>@hono\/zod-openapi<\/code>.<\/p>\n<h2 id=\"heading-2-what-is-hono\">2. \u06c1\u0648\u0646\u0648 \u06a9\u06cc\u0627 \u06c1\u06d2\u061f<\/h2>\n<p>Hono \u0627\u06cc\u06a9 \u0686\u06be\u0648\u0679\u0627 \u0627\u0648\u0631 \u062a\u06cc\u0632 \u0648\u06cc\u0628 \u0641\u0631\u06cc\u0645 \u0648\u0631\u06a9 \u06c1\u06d2 \u062c\u0648 Web Standard API \u067e\u0631 \u0628\u0646\u0627\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 <code>Request<\/code> \u0627\u0648\u0631 <code>Response<\/code> \u0645\u0642\u0627\u0645\u06cc \u0639\u0646\u0627\u0635\u0631 \u062c\u0648 Node.js\u060c Deno\u060c Bun\u060c \u0627\u0648\u0631 Cloudflare \u0648\u0631\u06a9\u0631\u0632 \u067e\u0631 \u0686\u0644\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u06cc\u06a9\u0633\u067e\u0631\u06cc\u0633 \u06a9\u06d2 \u0645\u0642\u0627\u0628\u0644\u06d2 \u0645\u06cc\u06ba\u060c \u0641\u0631\u0642 \u0627\u06c1\u0645 \u06c1\u06d2\u06d4<\/p>\n<table>\n<thead>\n<tr>\n<th>\u0627\u0638\u06c1\u0627\u0631<\/th>\n<th>\u062c\u0691\u06cc\u06ba<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u0646\u0648\u0688 \u06a9\u06cc \u0637\u0631\u0641 \u0633\u06d2 <code>req<\/code> \/ <code>res<\/code><\/td>\n<td>\u0648\u06cc\u0628 \u0645\u0639\u06cc\u0627\u0631\u06cc API<\/td>\n<\/tr>\n<tr>\n<td>\u067e\u06cc\u0631\u0627\u0645\u06cc\u0679\u0631 \u0627\u06cc\u06a9 \u063a\u06cc\u0631 \u0679\u0627\u0626\u067e \u0634\u062f\u06c1 \u062a\u0627\u0631 \u06c1\u06d2\u06d4<\/td>\n<td>\u067e\u06cc\u0631\u0627\u0645\u06cc\u0679\u0631\u0632 \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u06cc \u06af\u0626\u06cc \u0627\u0648\u0631 Zod \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u062f\u0631\u062c \u06a9\u06cc\u0627 \u06af\u06cc\u0627\u06d4<\/td>\n<\/tr>\n<tr>\n<td>\u062a\u0648\u062b\u06cc\u0642 \u0627\u06cc\u06a9 \u0645\u0633\u0626\u0644\u06c1 \u06c1\u06d2\u06d4<\/td>\n<td>\u0631\u0627\u0633\u062a\u06d2 \u06a9\u06cc \u062a\u0639\u0631\u06cc\u0641 \u0627\u06cc\u06a9 OpenAPI \u0627\u0646\u062f\u0631\u0627\u062c \u06c1\u06d2\u06d4<\/td>\n<\/tr>\n<tr>\n<td>\u0635\u0631\u0641 \u0646\u0648\u0688\u0633 \u067e\u0631 \u0686\u0644\u0627\u0626\u06cc\u06ba\u06d4<\/td>\n<td>\u0646\u0648\u0688\u060c \u0628\u0646\u060c \u0688\u06cc\u0646\u0648 \u0627\u0648\u0631 \u0627\u06cc\u062c \u067e\u0631 \u0686\u0644\u062a\u0627 \u06c1\u06d2\u06d4<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u06c1\u0648\u0646\u0648 \u06a9\u0627 \u06a9\u0648\u0631 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b 14kb \u06c1\u06d2\u06d4 \u0646\u0648\u0688 \u067e\u0631\u060c \u06cc\u06c1 \u0627\u0633\u06cc \u06a9\u0627\u0645 \u06a9\u06d2 \u0628\u0648\u062c\u06be \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9\u0633\u067e\u0631\u06cc\u0633 \u0633\u06d2 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b 5 \u0633\u06d2 7 \u06af\u0646\u0627 \u062a\u06cc\u0632 \u06c1\u06d2\u06d4 Bun \u06cc\u0627 Cloudflare \u0648\u0631\u06a9\u0631\u0632 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u06cc\u06c1 \u062e\u0644\u0627 \u0627\u0648\u0631 \u0628\u06be\u06cc \u0648\u0633\u06cc\u0639 \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0627\u0646 \u06a9\u06d2 \u0631\u0646 \u0679\u0627\u0626\u0645\u0632 \u0648\u06cc\u0628 \u0645\u0639\u06cc\u0627\u0631\u0627\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0648\u0632\u0648\u06ba \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 CRUD APIs \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0627\u0628 \u0628\u06be\u06cc \u0631\u06a9\u0627\u0648\u0679 \u06c1\u06d2\u06d4 \u062a\u0627\u06c1\u0645\u060c \u0627\u06cc\u062c \u0631\u0646 \u0679\u0627\u0626\u0645\u0632 \u0645\u06cc\u06ba \u062c\u06c1\u0627\u06ba \u06c1\u0645 \u0622\u06c1\u0646\u06af\u06cc \u0632\u06cc\u0627\u062f\u06c1 \u06c1\u0648\u062a\u06cc \u06c1\u06d2 \u06cc\u0627 \u06a9\u0648\u0644\u0688 \u0633\u0679\u0627\u0631\u0679\u0633 \u0627\u06c1\u0645 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0641\u0631\u06cc\u0645 \u0648\u0631\u06a9 \u06a9\u0627 \u0641\u0631\u0642 \u062d\u0642\u06cc\u0642\u06cc \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0627\u06c1\u0645 \u0628\u0627\u062a \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u06c1\u0648\u0646\u0648 \u06a9\u0627 OpenAPI \u0627\u0646\u0636\u0645\u0627\u0645 \u0631\u0627\u0633\u062a\u06d2 \u06a9\u06cc \u062a\u0639\u0631\u06cc\u0641 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 <em>\u0628\u06cc \u0627\u06cc<\/em> \u062f\u0633\u062a\u0627\u0648\u06cc\u0632<\/p>\n<h2 id=\"heading-3-what-is-zod\">3. \u0632\u0648\u062f \u06a9\u06cc\u0627 \u06c1\u06d2\u061f<\/h2>\n<p>Zod \u0627\u06cc\u06a9 TypeScript \u06a9\u06cc \u067e\u06c1\u0644\u06cc \u0627\u0633\u06a9\u06cc\u0645\u0627 \u06a9\u06cc \u062a\u0648\u062b\u06cc\u0642 \u06a9\u06cc \u0644\u0627\u0626\u0628\u0631\u06cc\u0631\u06cc \u06c1\u06d2\u06d4 \u0628\u06cc\u0627\u0646 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u0688\u06cc\u0679\u0627 \u06a9\u06cc\u0633\u0627 \u0644\u06af\u062a\u0627 \u06c1\u06d2\u06d4 \u067e\u06be\u0631 \u0632\u0648\u062f:<\/p>\n<ol>\n<li>\n<p>\u0631\u0646 \u0679\u0627\u0626\u0645 \u067e\u0631 \u0627\u0633 \u0634\u06a9\u0644 \u06a9\u06cc \u062a\u0648\u062b\u06cc\u0642 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>TypeScript \u0642\u0633\u0645 \u06a9\u0627 \u0627\u0646\u062f\u0627\u0632\u06c1\u06d4 <code>z.infer<\/code><\/p>\n<\/li>\n<li>\n<p>\u0645\u0646\u0633\u0644\u06a9 \u06c1\u0648\u0646\u06d2 \u067e\u0631 OpenAPI \u062f\u0633\u062a\u0627\u0648\u06cc\u0632\u0627\u062a \u06a9\u0648 \u0641\u06cc\u0688 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>.openapi()<\/code> \u0645\u06cc\u0679\u0627 \u0688\u06cc\u0679\u0627<\/p>\n<\/li>\n<\/ol>\n<p>Joi \u06cc\u0627 Yup \u06a9\u06d2 \u0633\u0627\u062a\u06be\u060c \u0622\u067e \u0639\u0627\u0645 \u0637\u0648\u0631 \u067e\u0631 \u0631\u0646 \u200b\u200b\u0679\u0627\u0626\u0645 \u067e\u0631 \u062a\u0648\u062b\u06cc\u0642 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u067e\u06be\u0631 \u0645\u0645\u0627\u062b\u0644 \u0627\u0646\u0679\u0631\u0641\u06cc\u0633 \u062e\u0648\u062f \u0644\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u067e\u06be\u0631 \u062f\u0648 \u062a\u0639\u0631\u06cc\u0641\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4 \u0632\u0648\u062f \u062f\u0648\u0633\u0631\u06d2 \u06a9\u0648 \u062e\u062a\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-typescript\">import { z } from 'zod';\n\nconst createTaskSchema = z.object({\n  title: z.string().min(1).max(120),\n  status: z.enum(['todo', 'in_progress', 'done']).default('todo'),\n});\n\ntype CreateTaskInput = z.infer<typeof createtaskschema=\"\">;\n\/\/ { title: string; status?: \"todo\" | \"in_progress\" | \"done\" }\n<\/typeof><\/code><\/pre>\n<p>\u0627\u0633\u06a9\u06cc\u0645\u0627 \u0627\u0648\u0631 \u0627\u0633 \u067e\u0631 \u0645\u0646\u062d\u0635\u0631 \u062a\u0645\u0627\u0645 \u06a9\u0627\u0644 \u0633\u0627\u0626\u0679\u0633 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 <code>CreateTaskInput<\/code> \u0627\u0633 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u067e \u0688\u06cc\u0679 \u06a9\u0631\u06cc\u06ba\u06d4 TypeScript \u0622\u067e \u06a9\u0648 \u0628\u062a\u0627\u0626\u06d2 \u06af\u0627 \u06a9\u06c1 \u0645\u0633\u0626\u0644\u06c1 \u06a9\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-4-one-schema-three-jobs\">4. \u0627\u06cc\u06a9 \u0627\u0633\u06a9\u06cc\u0645\u0627\u060c \u062a\u06cc\u0646 \u0622\u067e\u0631\u06cc\u0634\u0646<\/h2>\n<p>\u0628\u0627\u0642\u06cc \u0645\u0636\u0645\u0648\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u06cc\u0631\u0627 \u0630\u06c1\u0646\u06cc \u0646\u0645\u0648\u0646\u06c1 \u06cc\u06c1 \u06c1\u06d2:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/08\/1787724770_390_\u06c1\u0648\u0646\u0648-\u0627\u0648\u0631-\u0632\u0648\u0688-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2-\u0679\u0627\u0626\u067e-\u0633\u06cc\u0641-APIs.png\" alt=\"\u0679\u0627\u0633\u06a9 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u0631\u0646 \u0679\u0627\u0626\u0645 \u062a\u0648\u062b\u06cc\u0642\u060c \u0679\u0627\u0626\u067e \u0627\u0633\u06a9\u0631\u067e\u0679 \u06a9\u06cc \u0627\u0642\u0633\u0627\u0645 \u0627\u0648\u0631 \u0627\u0648\u067e\u0646 \u0627\u06d2 \u067e\u06cc \u0622\u0626\u06cc \u062f\u0633\u062a\u0627\u0648\u06cc\u0632\u0627\u062a \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4\" style=\"display:block;margin:0 auto\" width=\"600\" height=\"400\" loading=\"lazy\" title=\"\"><\/p>\n<p><em>\u062a\u0635\u0648\u06cc\u0631 3:<\/em> <code>taskSchema<\/code> <em>\u062a\u0648\u062b\u06cc\u0642\u060c \u0627\u0642\u0633\u0627\u0645 \u0627\u0648\u0631 \u062f\u0633\u062a\u0627\u0648\u06cc\u0632\u0627\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u0633\u0686\u0627\u0626\u06cc \u06a9\u0627 \u0648\u0627\u062d\u062f \u0630\u0631\u06cc\u0639\u06c1\u06d4<\/em><\/p>\n<ol>\n<li>\n<p><strong>\u0631\u0646 \u0679\u0627\u0626\u0645 \u062a\u0648\u062b\u06cc\u0642:<\/strong> \u063a\u0644\u0637 \u0688\u06cc\u0679\u0627 \u06a9\u0648 \u06c1\u06cc\u0646\u0688\u0644\u0631 \u062a\u06a9 \u067e\u06c1\u0646\u0686\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u0633\u0679\u06cc\u06a9 \u0679\u0631\u06cc\u0633 \u06a9\u06cc \u0628\u062c\u0627\u0626\u06d2 \u0633\u0679\u0631\u06a9\u0686\u0631\u0688 \u0641\u06cc\u0644\u0688 \u06a9\u06cc \u062e\u0631\u0627\u0628\u06cc \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0645\u0633\u062a\u0631\u062f \u06a9\u0631 \u062f\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u0679\u0627\u0626\u067e \u0627\u0633\u06a9\u0631\u067e\u0679 \u06a9\u06cc \u0627\u0642\u0633\u0627\u0645:<\/strong> <code>z.infer<typeof schema=\"\"\/><\/code>    \u06cc\u06c1 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u0633\u06d2 \u0645\u0627\u062e\u0648\u0630 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0627\u0644\u06af \u0646\u06c1\u06cc\u06ba \u0631\u06a9\u06be\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>OpenAPI \u062f\u0633\u062a\u0627\u0648\u06cc\u0632\u0627\u062a:<\/strong> <code>.openapi('Name')<\/code>    \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062f\u06c1 \u062a\u0641\u0635\u06cc\u0644\u0627\u062a \u0645\u06cc\u06ba \u0631\u062c\u0633\u0679\u0631\u0688 \u06c1\u06d2\u060c <code>\/reference<\/code> \u0627\u067e \u0679\u0648 \u0688\u06cc\u0679 \u0631\u06c1\u06cc\u06ba<\/p>\n<\/li>\n<\/ol>\n<p>\u062a\u06cc\u0646 \u0622\u0624\u0679 \u067e\u0679 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u06a9 \u062a\u0639\u0631\u06cc\u0641\u06d4 \u062f\u0633\u062a\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0645\u0637\u0627\u0628\u0642\u062a \u067e\u0630\u06cc\u0631\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-5-how-to-set-up-the-project\">5. \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u06cc\u0633\u06d2 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4<\/h2>\n<p>\u0622\u0626\u06cc\u06d2 api-conf-demo \u0645\u06cc\u06ba \u0633\u0627\u062a\u06be\u06cc \u0688\u06cc\u0645\u0648 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0686\u06be\u0648\u0679\u0627 \u0679\u0627\u0633\u06a9\u0633 API \u06c1\u06d2 \u062c\u0648 \u0635\u0641\u0627\u0626\u06cc \u0633\u06d2 \u0646\u0645\u0648\u0646\u0648\u06ba \u06a9\u0648 \u0638\u0627\u06c1\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0628\u0639\u062f \u0645\u06cc\u06ba\u060c \u06c1\u0645 \u062f\u06cc\u06a9\u06be\u06cc\u06ba \u06af\u06d2 \u06a9\u06c1 \u06a9\u0633 \u0637\u0631\u062d \u0627\u06cc\u06a9 \u06c1\u06cc \u062e\u06cc\u0627\u0644 \u0628\u0691\u06d2 \u067e\u06cc\u0645\u0627\u0646\u06d2 \u067e\u0631 ClipForge \u0645\u06cc\u06ba \u0638\u0627\u06c1\u0631 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0630\u062e\u06cc\u0631\u06c1 \u06a9\u0644\u0648\u0646 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0646\u062d\u0635\u0627\u0631 \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">git clone https:\/\/github.com\/otutukingsley\/api-conf-demo.git\ncd api-conf-demo\nnpm install\n<\/code><\/pre>\n<p>\u0633\u0631\u0648\u0631 \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba:<\/p>\n<pre><code class=\"language-bash\">npm run dev\n<\/code><\/pre>\n<p>\u0622\u067e \u06a9\u0648 \u0627\u067e\u0646\u0627 API \u062f\u06cc\u06a9\u06be\u0646\u0627 \u0686\u0627\u06c1\u0626\u06d2\u06d4 <code>http:\/\/localhost:8080<\/code>\u0627\u0646\u0679\u0631\u0627\u06cc\u06a9\u0679\u0648 \u062f\u0633\u062a\u0627\u0648\u06cc\u0632\u0627\u062a \u0645\u06cc\u06ba \u0634\u0627\u0645\u0644 \u06c1\u06cc\u06ba: <code>\/reference<\/code>.<\/p>\n<p>\u0627\u06c1\u0645 \u0641\u0648\u0644\u0688\u0631\u0632 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-text\">src\/\n\u251c\u2500\u2500 db\/schema\/          # Persistence layer (Drizzle tables)\n\u251c\u2500\u2500 lib\/schemas\/        # HTTP contract layer (Zod + OpenAPI)\n\u251c\u2500\u2500 lib\/errors\/         # One error envelope for every failure\n\u251c\u2500\u2500 routes\/tasks\/       # Route contracts + handlers\n\u251c\u2500\u2500 services\/           # Business logic and DB access\n\u251c\u2500\u2500 app.ts              # Middleware, routers, OpenAPI wiring\n\u2514\u2500\u2500 env.ts              # Zod-validated environment config\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0627\u0628 \u0628\u06be\u06cc MVC \u06c1\u06d2\u06d4 \u0627\u0648\u0632\u0627\u0631 \u0628\u06c1\u062a\u0631 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/08\/1787724770_98_\u06c1\u0648\u0646\u0648-\u0627\u0648\u0631-\u0632\u0648\u0688-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2-\u0679\u0627\u0626\u067e-\u0633\u06cc\u0641-APIs.png\" alt=\"MVC \u0637\u0631\u0632 \u06a9\u06cc \u062a\u06c1\u06c1 \u062c\u0633 \u0645\u06cc\u06ba HTTP \u06a9\u0644\u0627\u0626\u0646\u0679\u060c \u06a9\u0646\u0679\u0631\u0648\u0644\u0631\u060c \u0645\u0639\u0627\u06c1\u062f\u06c1 \u0627\u0633\u06a9\u06cc\u0645\u0627\u060c \u0633\u0631\u0648\u0633 \u0645\u0627\u0688\u0644 \u0627\u0648\u0631 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0634\u0627\u0645\u0644 \u06c1\u06d2\u06d4\" style=\"display:block;margin:0 auto\" width=\"600\" height=\"400\" loading=\"lazy\" title=\"\"><\/p>\n<p><em>\u0634\u06a9\u0644 4: \u06cc\u06c1 \u0627\u0628 \u0628\u06be\u06cc MVC \u06c1\u06d2\u06d4 \u0631\u0648\u0679\u0633 \u0627\u0648\u0631 \u06c1\u06cc\u0646\u0688\u0644\u0631\u0632 \u0628\u0637\u0648\u0631 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631\u060c \u0633\u06a9\u06cc\u0645\u0627 \u0628\u0637\u0648\u0631 \u06a9\u0646\u0679\u0631\u06cc\u06a9\u0679\u060c \u062e\u062f\u0645\u0627\u062a \u0628\u0637\u0648\u0631 \u0645\u0627\u0688\u0644\u06d4<\/em><\/p>\n<ul>\n<li>\n<p><strong>\u0645\u0627\u0688\u0644<\/strong> \u0627\u067e\u0646\u06cc \u06a9\u0627\u0631\u0648\u0628\u0627\u0631\u06cc \u0645\u0646\u0637\u0642 \u0627\u0648\u0631 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u062a\u06a9 \u0631\u0633\u0627\u0626\u06cc \u06a9\u06cc \u062e\u062f\u0645\u0627\u062a \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u0627\u0646\u06a9\u0648\u0627\u0626\u0631\u06cc\/\u0645\u0639\u0627\u06c1\u062f\u06c1<\/strong> \u0627\u0633\u06a9\u06cc\u0645\u0627\u0633 \u0627\u0633 \u0628\u0627\u062a \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u0688\u06cc\u0679\u0627 \u0688\u06cc \u0628\u06cc \u0627\u0648\u0631 \u0627\u06cc\u0686 \u0679\u06cc \u0679\u06cc \u067e\u06cc \u06a9\u06cc \u062d\u062f\u0648\u062f \u0645\u06cc\u06ba \u06a9\u06cc\u0633\u06d2 \u0646\u0638\u0631 \u0622\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u06a9\u0646\u0679\u0631\u0648\u0644\u0631<\/strong> \u0631\u0627\u0633\u062a\u06c1 \u0645\u0639\u0627\u06c1\u062f\u06c1 \u06a9\u0627 \u0627\u0639\u0644\u0627\u0646 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u06c1\u06cc\u0646\u0688\u0644\u0631 \u0627\u0633\u06d2 \u067e\u0648\u0631\u0627 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ul>\n<p>\u0688\u06cc\u0645\u0648 API \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0627\u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u0633 \u0637\u0631\u062d \u0646\u0638\u0631 \u0622\u0626\u06d2 \u06af\u06cc:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/08\/1787724770_398_\u06c1\u0648\u0646\u0648-\u0627\u0648\u0631-\u0632\u0648\u0688-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2-\u0679\u0627\u0626\u067e-\u0633\u06cc\u0641-APIs.png\" alt=\"\u0645\u0688\u0644 \u0648\u06cc\u0626\u0631\u060c \u0631\u0648\u0679 \u06a9\u0646\u0679\u0631\u06cc\u06a9\u0679\u0633\u060c \u06c1\u06cc\u0646\u0688\u0644\u0631\u0632\u060c \u0633\u0631\u0648\u0633\u0632 \u0627\u0648\u0631 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u067e\u0648\u0633\u0679\/\u0679\u0627\u0633\u06a9 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06cc \u062a\u0631\u062a\u06cc\u0628 \u06a9\u0627 \u062e\u0627\u06a9\u06c1\u06d4\" style=\"display:block;margin:0 auto\" width=\"600\" height=\"400\" loading=\"lazy\" title=\"\"><\/p>\n<p><em>\u0634\u06a9\u0644 5: \u0688\u06cc\u0645\u0648 API \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0628\u06c1\u0627\u0624 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u06cc\u06ba\u060c \u0628\u0634\u0645\u0648\u0644 \u062a\u0648\u062b\u06cc\u0642 \u06a9\u06cc \u0646\u0627\u06a9\u0627\u0645\u06cc \u06a9\u0627 \u0631\u0627\u0633\u062a\u06c1\u06d4<\/em><\/p>\n<p>\u0627\u0633 \u062e\u0627\u06a9\u06d2 \u0645\u06cc\u06ba\u060c \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba \u06a9\u0644\u0627\u0626\u0646\u0679\u060c \u0645\u0688\u0644 \u0648\u06cc\u0626\u0631\u060c \u0631\u0648\u0679 \u06a9\u0646\u0679\u0631\u06cc\u06a9\u0679\u060c \u06c1\u06cc\u0646\u0688\u0644\u0631\u060c \u0633\u0631\u0648\u0633 \u0627\u0648\u0631 \u0688\u06cc \u0628\u06cc \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0628\u06c1\u06c1 \u062c\u0627\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 \u0645\u0688\u0644 \u0648\u06cc\u0626\u0631 \u0644\u0627\u06af\u0646\u06af \u0627\u0648\u0631 CORS \u06a9\u0648 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0631\u0627\u0633\u062a\u06d2 \u06a9\u0627 \u0645\u0639\u0627\u06c1\u062f\u06c1 Zod \u06a9\u0648 \u0627\u067e\u0646\u06d2 \u062c\u0633\u0645 \u06a9\u06cc \u062a\u0648\u062b\u06cc\u0642 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06af\u0631 \u062a\u0648\u062b\u06cc\u0642 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648\u062c\u0627\u062a\u06cc \u06c1\u06d2\u060c \u06a9\u0644\u0627\u0626\u0646\u0679 <code>422 ApiError<\/code> \u06c1\u06cc\u0646\u0688\u0644\u0631 \u06a9\u0648 \u06a9\u0628\u06be\u06cc \u067e\u06be\u0627\u0646\u0633\u06cc \u0646\u06c1\u06cc\u06ba \u062f\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4 \u067e\u0627\u0633 \u06c1\u0648\u0646\u06d2 \u067e\u0631\u060c \u06c1\u06cc\u0646\u0688\u0644\u0631 \u06a9\u0648 \u062f\u0627\u062e\u0644 \u06a9\u0631\u062f\u06c1 \u067e\u06cc\u063a\u0627\u0645 \u0645\u0648\u0635\u0648\u0644 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 <code>CreateTaskInput<\/code>\u0641\u0648\u0646 \u06a9\u0627\u0644 <code>TaskService.create()<\/code>\u0633\u0631\u0648\u0633 \u0642\u0637\u0627\u0631 \u0627\u0648\u0631 \u06a9\u0644\u0627\u0626\u0646\u0679 \u06a9\u0648 \u062f\u0627\u062e\u0644 \u0627\u0648\u0631 \u062a\u062c\u0632\u06cc\u06c1 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 <code>201<\/code> \u06a9\u0627\u0645 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u0627 JSON \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-6-how-to-define-your-api-schemas\">6. API \u0627\u0633\u06a9\u06cc\u0645\u0627 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u06cc\u0633\u06d2 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>HTTP \u0645\u0639\u0627\u06c1\u062f\u0648\u06ba \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba\u06d4 <code>src\/lib\/schemas\/task.ts<\/code>:<\/p>\n<pre><code class=\"language-typescript\">import { z } from '@hono\/zod-openapi';\n\nexport const taskStatusSchema = z\n  .enum(['todo', 'in_progress', 'done'])\n  .openapi('TaskStatus');\n\nexport const taskSchema = z\n  .object({\n    id: z.string().uuid().openapi({\n      example: '8e2c9f0a-2222-4a5a-9c3e-1a2b3c4d5e6f',\n    }),\n    title: z.string().min(1).max(120).openapi({\n      example: 'Write the talk abstract',\n    }),\n    description: z.string().max(2000).nullable().openapi({\n      example: 'Cover Hono + Zod patterns',\n    }),\n    status: taskStatusSchema.default('todo'),\n    dueDate: z.string().date().nullable().openapi({\n      example: '2026-07-15',\n    }),\n    createdAt: z.string().openapi({ example: '2026-06-28 10:15:00' }),\n    updatedAt: z.string().openapi({ example: '2026-06-28 10:15:00' }),\n  })\n  .openapi('Task');\n\nexport type Task = z.infer<typeof taskschema=\"\">;\n<\/typeof><\/code><\/pre>\n<p>\u0648\u06c1 \u0627\u06cc\u06a9 \u0622\u0628\u062c\u06cc\u06a9\u0679 \u0627\u0628 \u0631\u0646 \u0679\u0627\u0626\u0645 \u062a\u0648\u062b\u06cc\u0642 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u0627\u060c \u0679\u0627\u0626\u067e \u0627\u0633\u06a9\u0631\u067e\u0679 \u06a9\u06cc \u0642\u0633\u0645\u060c \u0627\u0648\u0631 \u0627\u06cc\u06a9 OpenAPI \u062c\u0632\u0648 \u06c1\u06d2\u06d4 <code>Task<\/code>.<\/p>\n<p>\u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u0633\u06a9\u06cc\u0645\u0648\u06ba \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0627\u0639\u0644\u0627\u0646 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0627\u0633\u06cc \u0628\u0646\u06cc\u0627\u062f \u0633\u06d2 \u0627\u062e\u0630 \u06a9\u06cc\u0627 \u062c\u0627\u0646\u0627 \u0686\u0627\u06c1\u0626\u06d2\u06d4<\/p>\n<pre><code class=\"language-typescript\">export const createTaskSchema = taskSchema\n  .pick({ title: true, description: true, status: true, dueDate: true })\n  .partial({ description: true, status: true, dueDate: true })\n  .openapi('CreateTask');\n\nexport const updateTaskSchema = createTaskSchema\n  .partial()\n  .openapi('UpdateTask');\n\nexport type CreateTaskInput = z.infer<typeof createtaskschema=\"\">;\nexport type UpdateTaskInput = z.infer<typeof updatetaskschema=\"\">;\n<\/typeof><\/typeof><\/code><\/pre>\n<p><code>CreateTask<\/code>    \u06a9\u0628\u06be\u06cc \u0634\u0627\u0645\u0644 \u0646\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4 <code>id<\/code>\u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u06a9\u0644\u0627\u0626\u0646\u0679 \u067e\u06cc\u063a\u0627\u0645 \u0646\u06c1\u06cc\u06ba \u0628\u06be\u06cc\u062c \u0631\u06c1\u0627 \u06c1\u06d2\u06d4 <code>UpdateTask<\/code> \u062a\u0645\u0627\u0645 \u0641\u06cc\u0644\u0688\u0632 \u06a9\u0648 \u0627\u062e\u062a\u06cc\u0627\u0631\u06cc \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4 <code>PATCH<\/code> \u0622\u067e \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0630\u06cc\u0644\u06cc \u0633\u06cc\u0679 \u06a9\u0648 \u0686\u06be\u0648 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/08\/1787724770_2_\u06c1\u0648\u0646\u0648-\u0627\u0648\u0631-\u0632\u0648\u0688-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2-\u0679\u0627\u0626\u067e-\u0633\u06cc\u0641-APIs.png\" alt=\"createTaskSchema \u0627\u0648\u0631 UpdateTaskSchema \u062d\u0627\u0635\u0644 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u0627 taskSchema\" style=\"display:block;margin:0 auto\" width=\"600\" height=\"400\" loading=\"lazy\" title=\"\"><\/p>\n<p><em>\u0634\u06a9\u0644 6: \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0627 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u0627\u0633\u06cc \u0628\u0646\u06cc\u0627\u062f\u06cc \u0648\u0633\u0627\u0626\u0644 \u06a9\u06d2 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u0633\u06d2 \u0627\u062e\u0630 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4<\/em><\/p>\n<p>\u06c1\u0645\u0627\u0631\u06d2 \u067e\u0627\u0633 \u0627\u06cc\u06a9 \u0630\u0631\u06cc\u0639\u06c1 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062a\u06cc\u0646 \u0645\u0639\u0627\u06c1\u062f\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-7-how-to-separate-database-schemas-from-api-schemas\">7. \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u06a9\u0648 API \u0627\u0633\u06a9\u06cc\u0645\u0627 \u0633\u06d2 \u0627\u0644\u06af \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0637\u0631\u06cc\u0642\u06c1<\/h2>\n<p>\u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u06cc \u0642\u0637\u0627\u0631\u0648\u06ba \u0627\u0648\u0631 API \u06a9\u06d2 \u062c\u0648\u0627\u0628\u0627\u062a \u06a9\u0648 \u0627\u06cc\u06a9 \u06c1\u06cc \u0686\u06cc\u0632 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0645\u0627\u0646\u0646\u0627 \u067e\u0631\u06a9\u0634\u0634 \u06c1\u06d2\u06d4 \u0686\u06be\u0648\u0679\u06d2 \u0688\u06cc\u0645\u0648 \u0645\u06cc\u06ba \u0648\u06c1 \u0627\u06a9\u062b\u0631 \u0627\u06cc\u06a9 \u062c\u06cc\u0633\u06d2 \u0646\u0638\u0631 \u0622\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u067e\u06cc\u062f\u0627\u0648\u0627\u0631 \u0645\u06cc\u06ba\u060c \u0648\u06c1 \u0645\u062e\u062a\u0644\u0641 \u06c1\u06cc\u06ba.<\/p>\n<p>\u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u0627\u0646\u06c1\u06cc\u06ba \u0627\u0644\u06af \u0641\u0627\u0626\u0644\u0648\u06ba \u0645\u06cc\u06ba \u0631\u06a9\u06be\u06cc\u06ba\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/08\/1787724771_310_\u06c1\u0648\u0646\u0648-\u0627\u0648\u0631-\u0632\u0648\u0688-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2-\u0679\u0627\u0626\u067e-\u0633\u06cc\u0641-APIs.png\" alt=\"\u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u067e\u0631\u0633\u0679\u06cc\u0646\u0633 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u06a9\u0648 \u0633\u0631\u0648\u0633 \u0644\u06cc\u0626\u0631 \u0645\u06cc\u06ba HTTP \u06a9\u0646\u0679\u0631\u06cc\u06a9\u0679 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u0645\u06cc\u06ba \u0645\u06cc\u067e \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4\" style=\"display:block;margin:0 auto\" width=\"600\" height=\"400\" loading=\"lazy\" title=\"\"><\/p>\n<p><em>\u0634\u06a9\u0644 7: \u06c1\u0645 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u0627\u0648\u0631 HTTP \u0627\u0633\u06a9\u06cc\u0645\u0627 \u06a9\u0648 \u062f\u0648 \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u067e\u0631\u062a\u0648\u06ba \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0631\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/em><\/p>\n<p>\u062a\u0635\u0648\u06cc\u0631 7 \u0633\u0631\u0648\u0633 \u0645\u06cc\u06ba &quot;\u0646\u0642\u0634\u06c1&#8221; \u06a9\u06d2 \u0644\u06cc\u0628\u0644 \u0648\u0627\u0644\u06d2 \u062a\u06cc\u0631 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u062c\u0691\u06d2 \u06c1\u0648\u0626\u06d2 \u062f\u0648 \u067e\u06cc\u0646\u0644 \u062f\u06a9\u06be\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0628\u0627\u0626\u06cc\u06ba \u067e\u06cc\u0646 <code>src\/db\/schema\/<\/code> (\u0627\u0633\u062a\u0642\u0627\u0645\u062a):<\/p>\n<ul>\n<li>\n<p>\u0628\u0648\u0646\u062f\u0627 \u0628\u0627\u0646\u062f\u06cc \u0679\u06cc\u0628\u0644 \u06a9\u06cc \u062a\u0639\u0631\u06cc\u0641 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0648\u06c1 \u0645\u06cc\u0632\u06cc\u06ba \u0627\u06cc\u0633 \u06a9\u06cc\u0648 \u0627\u06cc\u0644 \u06a9\u06cc \u0645\u0646\u062a\u0642\u0644\u06cc \u06a9\u0648 \u0686\u0644\u0627\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u06cc\u06c1 \u0642\u0637\u0627\u0631\u0648\u06ba \u06a9\u0648 \u067e\u0627\u0631\u0633 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u0648\u0646\u062f\u0627 \u0628\u0627\u0646\u062f\u06cc-\u0632\u0648\u0688 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u0628\u06be\u06cc \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0627\u0648\u0631 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0628\u0627\u0624\u0646\u0688\u0631\u06cc \u0645\u06cc\u06ba \u0679\u0627\u0626\u067e \u0627\u0633\u06a9\u0631\u067e\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0642\u0637\u0627\u0631 \u0627\u0646\u062f\u0631\u0627\u062c\/\u0633\u0644\u06cc\u06a9\u0634\u0646 \u06a9\u06cc \u0642\u0633\u0645<\/p>\n<\/li>\n<\/ul>\n<p>\u062f\u0627\u0626\u06cc\u06ba \u067e\u06cc\u0646\u0644 <code>src\/lib\/schemas\/<\/code> (HTTP \u0645\u0639\u0627\u06c1\u062f\u06c1):<\/p>\n<ul>\n<li>\n<p>\u0645\u06cc\u06ba Zod+ \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u0648\u06ba\u06d4 <code>.openapi()<\/code> \u0639\u0648\u0627\u0645\u06cc \u0645\u0639\u0627\u06c1\u062f\u06d2 \u06a9\u06d2 \u0633\u0627\u062a\u06be<\/p>\n<\/li>\n<li>\n<p>\u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06d2 \u0628\u0627\u0688\u06cc\/\u067e\u06cc\u0631\u0627\u0645\u06cc\u0679\u0631 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u06a9\u0644\u0627\u0626\u0646\u0679 \u0628\u06be\u06cc\u062c \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u062c\u0648\u0627\u0628\u06cc \u062c\u0633\u0645 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u06a9\u0644\u0627\u0626\u0646\u0679 \u06a9\u0648 \u0645\u0648\u0635\u0648\u0644 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>OpenAPI \u0627\u062c\u0632\u0627\u0621 \u06a9\u0648 \u0631\u062c\u0633\u0679\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>\/doc<\/code> \u0627\u0648\u0631 <code>\/reference<\/code><\/p>\n<\/li>\n<\/ul>\n<p>\u062f\u0631\u0645\u06cc\u0627\u0646\u06cc \u062a\u06cc\u0631 \u0627\u06c1\u0645 \u06c1\u06d2\u06d4 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0641\u0627\u0631\u0645 \u062e\u0648\u062f \u0628\u062e\u0648\u062f API \u0641\u0627\u0631\u0645 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u06a9\u06c1 <strong>\u0633\u0631\u0648\u0633<\/strong> \u0627\u0646 \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0646\u0642\u0634\u06c1\u06d4 \u06cc\u06c1\u06cc \u0648\u062c\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u06a9\u0627\u0644\u0645 \u0628\u0627\u0626\u06cc\u06ba \u062c\u0627\u0646\u0628 \u062f\u0627\u0626\u06cc\u06ba \u06c1\u0627\u062a\u06be \u06a9\u06d2 HTTP \u0645\u0639\u0627\u06c1\u062f\u06d2 \u06a9\u0627 \u062d\u0635\u06c1 \u0628\u0646\u06d2 \u0628\u063a\u06cc\u0631 \u0645\u0648\u062c\u0648\u062f \u06c1\u0648\u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0633\u06cc\u062f\u06be\u06d2 \u0627\u0644\u0641\u0627\u0638 \u0645\u06cc\u06ba:<\/p>\n<p>\u0688\u06cc\u0645\u0648 \u0633\u06d2 \u0628\u0648\u0646\u062f\u0627 \u0628\u0627\u0646\u062f\u06cc \u06a9\u06cc \u0645\u06cc\u0632 \u06cc\u06c1 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-typescript\">import { sql } from 'drizzle-orm';\nimport { sqliteTable, text } from 'drizzle-orm\/sqlite-core';\nimport { createInsertSchema, createSelectSchema } from 'drizzle-zod';\nimport { z } from 'zod';\n\nexport const taskStatusValues = ['todo', 'in_progress', 'done'] as const;\n\nexport const tasks = sqliteTable('tasks', {\n  id: text('id').primaryKey(),\n  title: text('title').notNull(),\n  description: text('description'),\n  status: text('status', { enum: taskStatusValues }).notNull().default('todo'),\n  dueDate: text('due_date'),\n  createdAt: text('created_at')\n    .notNull()\n    .default(sql`(current_timestamp)`),\n  updatedAt: text('updated_at')\n    .notNull()\n    .default(sql`(current_timestamp)`),\n});\n\nexport const selectTaskSchema = createSelectSchema(tasks, {\n  status: z.enum(taskStatusValues),\n});\n\nexport const insertTaskSchema = createInsertSchema(tasks, {\n  id: () => z.string().uuid().optional(),\n  title: () => z.string().min(1).max(120),\n  description: () => z.string().max(2000).nullable().optional(),\n  status: z.enum(taskStatusValues).optional(),\n  dueDate: () => z.string().date().nullable().optional(),\n});\n<\/code><\/pre>\n<p>\u0627\u06cc\u06a9 \u062c\u062f\u0648\u0644 \u06a9\u06cc \u062a\u0639\u0631\u06cc\u0641 \u062a\u06cc\u0646 \u0646\u062a\u0627\u0626\u062c \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u06cc \u06c1\u06d2:<\/p>\n<ol>\n<li>\n<p><strong>\u0679\u0627\u0626\u067e \u0627\u0633\u06a9\u0631\u067e\u0679 \u06a9\u06cc \u0627\u0642\u0633\u0627\u0645<\/strong> \u06a9\u0627\u0644\u0645 \u0633\u06d2 \u0627\u0646\u062f\u0627\u0632\u06c1 \u0644\u06af\u0627\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u0627\u06cc\u0633 \u06a9\u06cc\u0648 \u0627\u06cc\u0644 \u0645\u0627\u0626\u06cc\u06af\u0631\u06cc\u0634\u0646<\/strong> \u06a9\u06cc \u0637\u0631\u0641 \u0633\u06d2 \u067e\u06cc\u062f\u0627 \u06a9\u06cc\u0627 <code>drizzle-kit<\/code><\/p>\n<\/li>\n<li>\n<p><strong>\u0632\u0648\u0688 \u0627\u0633\u06a9\u06cc\u0645\u0627<\/strong> \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 <code>drizzle-zod<\/code><\/p>\n<\/li>\n<\/ol>\n<p>\u06cc\u06c1 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u06cc \u062d\u062f\u0648\u062f \u0645\u06cc\u06ba \u0645\u0641\u06cc\u062f \u06c1\u06d2\u06d4 \u06cc\u06c1 HTTP \u0627\u0633\u06a9\u06cc\u0645\u0627 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u062c\u0633 \u0644\u0645\u062d\u06d2 \u0622\u067e \u062f\u0627\u062e\u0644\u06c1 \u0634\u0627\u0645\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>archivedAt<\/code> API \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0648\u0627\u067e\u0633 \u06a9\u06cc\u06d2 \u06af\u0626\u06d2 \u06a9\u0627\u0644\u0645\u0648\u06ba \u06cc\u0627 \u06a9\u06cc\u0644\u06a9\u0648\u0644\u06cc\u0679\u0688 \u0641\u06cc\u0644\u0688\u0632 (\u0627\u06af\u0631 \u06a9\u0627\u0644\u0645 \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba) \u06a9\u06d2 \u0627\u062e\u0631\u0627\u062c\u0627\u062a \u0642\u0633\u0637\u0648\u06ba \u0645\u06cc\u06ba \u0627\u062f\u0627 \u06a9\u06cc\u06d2 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0646\u062d\u0631\u0627\u0641 \u0627\u06cc\u06a9 \u062a\u06a9\u0644\u06cc\u0641 \u062f\u06c1 \u0631\u06cc \u0641\u06cc\u06a9\u0679\u0631\u0646\u06af \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0627\u06cc\u06a9 \u0639\u0627\u0645 \u062a\u0628\u062f\u06cc\u0644\u06cc \u0628\u0646 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/08\/1787724771_114_\u06c1\u0648\u0646\u0648-\u0627\u0648\u0631-\u0632\u0648\u0688-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2-\u0679\u0627\u0626\u067e-\u0633\u06cc\u0641-APIs.png\" alt=\"\u0627\u06cc\u06a9 \u0627\u06cc\u0633\u06cc \u062e\u062f\u0645\u062a \u062c\u0648 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u06cc \u0642\u0637\u0627\u0631\u0648\u06ba \u06a9\u0648 \u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u0641\u06cc\u0644\u0688\u0632 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0639\u0648\u0627\u0645\u06cc API \u06a9\u06d2 \u062c\u0648\u0627\u0628\u0627\u062a \u0645\u06cc\u06ba \u0646\u0642\u0634 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4\" style=\"display:block;margin:0 auto\" width=\"600\" height=\"400\" loading=\"lazy\" title=\"\"><\/p>\n<p><em>\u0634\u06a9\u0644 8: \u062e\u062f\u0645\u0627\u062a \u0627\u0633 \u0628\u0627\u062a \u06a9\u0627 \u062a\u0639\u06cc\u0646 \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba \u06a9\u06c1 \u06a9\u0644\u0627\u0626\u0646\u0679 \u06a9\u06cc\u0627 \u062f\u06cc\u06a9\u06be \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/em><\/p>\n<h2 id=\"heading-8-how-to-define-routes-as-contracts\">8. \u0627\u06cc\u06a9 \u0645\u0639\u0627\u06c1\u062f\u06d2 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0627\u06cc\u06a9 \u0631\u0627\u0633\u062a\u06d2 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u06cc\u0633\u06d2 \u06a9\u0631\u06cc\u06ba<\/h2>\n<p>\u0627\u0633 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u0645\u06cc\u06ba\u060c \u0631\u0627\u0633\u062a\u06d2 &quot;\u0635\u0631\u0641 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0648\u06ba \u06a9\u0648 \u06c1\u06cc\u0646\u0688\u0644&#8221; \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06cc\u06a9 \u0631\u0627\u0633\u062a\u06c1 \u0627\u06cc\u06a9 \u0645\u0639\u0627\u06c1\u062f\u06d2 \u06a9\u0627 \u0627\u0639\u0644\u0627\u0646 \u06a9\u0631\u062a\u0627 \u06c1\u06d2: \u0637\u0631\u06cc\u0642\u06c1\u060c \u0631\u0627\u0633\u062a\u06c1\u060c \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0633\u06a9\u06cc\u0645\u0627\u060c \u0627\u0648\u0631 \u062c\u0648\u0627\u0628\u06cc \u0627\u0633\u06a9\u06cc\u0645\u0627\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/08\/1787724771_972_\u06c1\u0648\u0646\u0648-\u0627\u0648\u0631-\u0632\u0648\u0688-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2-\u0679\u0627\u0626\u067e-\u0633\u06cc\u0641-APIs.png\" alt=\"\u0627\u06cc\u0633\u06d2 \u0631\u0627\u0633\u062a\u06d2 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u06cc\u06ba \u062c\u0648 \u06c1\u06cc\u0646\u0688\u0644\u0631 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u067e\u0648\u0631\u0627 \u06a9\u06cc\u06d2 \u06af\u0626\u06d2 API \u0645\u0639\u0627\u06c1\u062f\u06d2 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u06a9\u0627\u0645 \u06a9\u0631\u06d2\u06d4\" style=\"display:block;margin:0 auto\" width=\"600\" height=\"400\" loading=\"lazy\" title=\"\"><\/p>\n<p><em>\u0634\u06a9\u0644 9: \u0631\u0627\u0633\u062a\u06c1 \u0627\u06cc\u06a9 \u0645\u0639\u0627\u06c1\u062f\u06d2 \u06a9\u0627 \u0627\u0639\u0644\u0627\u0646 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06c1\u06cc\u0646\u0688\u0644\u0631 \u0627\u0633 \u06a9\u0648 \u067e\u0648\u0631\u0627 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/em><\/p>\n<pre><code class=\"language-typescript\">import { createRoute, z } from '@hono\/zod-openapi';\nimport * as HttpStatusCodes from '@\/lib\/http-status-codes';\nimport { jsonContent } from '@\/lib\/openapi\/json-content';\nimport { jsonApiErrorContent } from '@\/lib\/openapi\/error-schema';\nimport {\n  createTaskSchema,\n  taskParamsSchema,\n  taskSchema,\n} from '@\/lib\/schemas\/task';\n\nexport const createTask = createRoute({\n  tags: ['Tasks'],\n  method: 'post',\n  path: '\/tasks',\n  summary: 'Create a task',\n  request: {\n    body: jsonContent(createTaskSchema, 'The task to create'),\n  },\n  responses: {\n    [HttpStatusCodes.CREATED]: jsonContent(taskSchema, 'The created task'),\n    [HttpStatusCodes.UNPROCESSABLE_ENTITY]:\n      jsonApiErrorContent('Validation error'),\n    [HttpStatusCodes.INTERNAL_SERVER_ERROR]: jsonApiErrorContent(\n      'Internal server error',\n    ),\n  },\n});\n\nexport const getTask = createRoute({\n  tags: ['Tasks'],\n  method: 'get',\n  path: '\/tasks\/{id}',\n  summary: 'Get a task by ID',\n  request: {\n    params: taskParamsSchema,\n  },\n  responses: {\n    [HttpStatusCodes.OK]: jsonContent(taskSchema, 'The requested task'),\n    [HttpStatusCodes.NOT_FOUND]: jsonApiErrorContent('Task not found'),\n    [HttpStatusCodes.UNPROCESSABLE_ENTITY]:\n      jsonApiErrorContent('Validation error'),\n    [HttpStatusCodes.INTERNAL_SERVER_ERROR]: jsonApiErrorContent(\n      'Internal server error',\n    ),\n  },\n});\n<\/code><\/pre>\n<p>\u0627\u06cc\u06a9 \u0686\u06be\u0648\u0679\u0627 \u0645\u062f\u062f\u06af\u0627\u0631 \u062c\u0648\u0627\u0628\u06cc \u0628\u0648\u0627\u0626\u0644\u0631 \u067e\u0644\u06cc\u0679 \u06a9\u0648 \u067e\u0691\u06be\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-typescript\">export function jsonContent<t extends=\"\" z.zodtypeany=\"\">(\n  schema: T,\n  description: string,\n) {\n  return {\n    content: {\n      'application\/json': { schema },\n    },\n    description,\n  };\n}\n<\/t><\/code><\/pre>\n<p>\u0646\u0627\u0645\u0632\u062f \u0631\u06cc\u0627\u0633\u062a\u06cc \u0645\u0633\u062a\u0642\u0644 \u062c\u0627\u062f\u0648\u0626\u06cc \u0627\u0639\u062f\u0627\u062f \u06a9\u06cc \u062c\u06af\u06c1 \u0644\u06d2 \u0644\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0631\u0627\u0633\u062a\u06d2 \u0645\u06cc\u06ba \u0622\u0628\u062c\u06cc\u06a9\u0679 \u06a9\u0644\u06cc\u062f \u0627\u0648\u0631 \u06c1\u06cc\u0646\u0688\u0644\u0631 \u0645\u06cc\u06ba \u0633\u0648\u0626\u0686 \u06a9\u06cc\u0633 \u06a9\u06cc \u0637\u0631\u062d \u0627\u06cc\u06a9 \u06c1\u06cc \u0645\u0633\u062a\u0642\u0644 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 \u06cc\u06c1 \u0627\u0633\u0679\u06cc\u0679\u0633 \u06a9\u0648\u0688\u0632 \u06a9\u0648 \u0642\u0627\u0628\u0644 \u062a\u0644\u0627\u0634 \u0627\u0648\u0631 \u0645\u0633\u062a\u0642\u0644 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-9-how-to-keep-handlers-thin\">9. \u0627\u067e\u0646\u06d2 \u06c1\u06cc\u0646\u0688\u0644\u0631\u0632 \u06a9\u0648 \u067e\u062a\u0644\u0627 \u06a9\u06cc\u0633\u06d2 \u0631\u06a9\u06be\u06cc\u06ba<\/h2>\n<p>\u0627\u06cc\u06a9 \u0628\u0627\u0631 \u062c\u0628 \u0631\u0648\u0679 \u0627\u06cc\u06a9 \u0645\u0639\u0627\u06c1\u062f\u06d2 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u06c1\u06cc\u0646\u0688\u0644\u0631 \u06a9\u0648 \u0635\u0631\u0641 \u0645\u0639\u0627\u06c1\u062f\u06d2 \u06a9\u0648 \u067e\u0648\u0631\u0627 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-typescript\">export const getTask: AppRouteHandler<gettaskroute> = (c) => {\n  try {\n    const { id } = c.req.valid('param');\n    return c.json(TaskService.get(id), HttpStatusCodes.OK);\n  } catch (error) {\n    const apiError = ApiError.parse(error);\n    switch (apiError.statusCode) {\n      case HttpStatusCodes.NOT_FOUND:\n      case HttpStatusCodes.UNPROCESSABLE_ENTITY:\n        return c.json(apiError.toResponseBody(), apiError.statusCode);\n      default:\n        return c.json(\n          apiError.toResponseBody(),\n          HttpStatusCodes.INTERNAL_SERVER_ERROR,\n        );\n    }\n  }\n};\n\nexport const createTask: AppRouteHandler<createtaskroute> = (c) => {\n  try {\n    const body = c.req.valid('json');\n    return c.json(TaskService.create(body), HttpStatusCodes.CREATED);\n  } catch (error) {\n    const apiError = ApiError.parse(error);\n    switch (apiError.statusCode) {\n      case HttpStatusCodes.UNPROCESSABLE_ENTITY:\n        return c.json(apiError.toResponseBody(), apiError.statusCode);\n      default:\n        return c.json(\n          apiError.toResponseBody(),\n          HttpStatusCodes.INTERNAL_SERVER_ERROR,\n        );\n    }\n  }\n};\n<\/createtaskroute><\/gettaskroute><\/code><\/pre>\n<p>\u06a9\u06cc\u0627 \u0646\u0648\u0679\u0633 <em>~ \u0646\u06c1\u06cc\u06ba<\/em> \u06c1\u06cc\u0646\u0688\u0644\u0631 \u0645\u06cc\u06ba:<\/p>\n<p><code>c.req.valid('param')<\/code>    \u0627\u0648\u0631 <code>c.req.valid('json')<\/code> \u06cc\u06c1 \u067e\u06c1\u0644\u06d2 \u06c1\u06cc \u062a\u0635\u062f\u06cc\u0642 \u0634\u062f\u06c1 \u0627\u0648\u0631 \u062f\u0631\u062c \u06c1\u0648 \u0686\u06a9\u0627 \u06c1\u06d2\u06d4 \u0633\u0631\u0648\u0633\u0632 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u06cc \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc\u0648\u06ba \u06a9\u06d2 \u0645\u0627\u0644\u06a9 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-typescript\">get(id: string): Task {\n  try {\n    const row = db.select().from(tasks).where(eq(tasks.id, id)).get();\n    if (!row) throw new NotFoundError(`Task ${id} not found`);\n    return selectTaskSchema.parse(row);\n  } catch (error) {\n    throw ApiError.parse(error);\n  }\n},\n<\/code><\/pre>\n<p>\u062e\u062f\u0645\u0627\u062a \u062c\u0633\u0645 \u06a9\u0648 \u062c\u0648\u0691\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 <code>try\/catch<\/code> \u06c1\u0645 \u062a\u0645\u0627\u0645 \u0646\u0627\u06a9\u0627\u0645\u06cc\u0648\u06ba \u06a9\u0648 \u0645\u0639\u0645\u0648\u0644 \u06a9\u06d2 \u0645\u0637\u0627\u0628\u0642 \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba: <code>ApiError.parse()<\/code>. Zod \u06a9\u06cc \u063a\u0644\u0637\u06cc\u0627\u06ba\u060c \u0627\u067e\u0646\u06cc \u0645\u0631\u0636\u06cc \u06a9\u06d2 \u0645\u0637\u0627\u0628\u0642 \u0688\u0648\u0645\u06cc\u0646 \u06a9\u06cc \u063a\u0644\u0637\u06cc\u0627\u06ba \u0627\u0648\u0631 \u0688\u0631\u0627\u0626\u06cc\u0648\u0631 \u06a9\u06cc \u063a\u06cc\u0631 \u0645\u062a\u0648\u0642\u0639 \u063a\u0644\u0637\u06cc\u0627\u06ba \u0633\u0628 \u0627\u06cc\u06a9 \u06c1\u06cc \u0634\u06a9\u0644 \u0645\u06cc\u06ba \u0622\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-10-how-to-return-one-error-shape-everywhere\">10. \u06c1\u0631 \u062c\u06af\u06c1 \u0627\u06cc\u06a9 \u063a\u0644\u0637\u06cc \u06a9\u06cc \u0634\u06a9\u0644 \u06a9\u06cc\u0633\u06d2 \u0648\u0627\u067e\u0633 \u06a9\u06cc \u062c\u0627\u0626\u06d2\u06d4<\/h2>\n<p>\u06a9\u0644\u0627\u0626\u0646\u0679\u0633 \u06a9\u0648 \u06cc\u06c1 \u0646\u06c1\u06cc\u06ba \u0633\u0645\u062c\u06be\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2 \u06a9\u06c1 \u063a\u0644\u0637\u06cc \u06cc\u06c1 \u06c1\u06d2: <code>{ message }<\/code>, <code>{ error }<\/code>\u06cc\u0627 \u062e\u0627\u0645 \u0627\u0633\u0679\u06cc\u06a9 \u0679\u0631\u06cc\u0633.<\/p>\n<p>\u0688\u06cc\u0645\u0648 \u0645\u06cc\u06ba\u060c \u06c1\u0631 \u0646\u0627\u06a9\u0627\u0645\u06cc \u0627\u06cc\u06a9 \u0644\u0641\u0627\u0641\u06c1 \u0628\u0646 \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/08\/1787724771_148_\u06c1\u0648\u0646\u0648-\u0627\u0648\u0631-\u0632\u0648\u0688-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2-\u0679\u0627\u0626\u067e-\u0633\u06cc\u0641-APIs.png\" alt=\"ApiError.parse \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0627\u06cc\u06a9 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u062e\u0631\u0627\u0628\u06cc \u06a9\u06d2 \u0630\u0631\u0627\u0626\u0639 \u06a9\u0648 \u0627\u06cc\u06a9 JSON \u0644\u0641\u0627\u0641\u06d2 \u0645\u06cc\u06ba \u0645\u0639\u0645\u0648\u0644 \u0628\u0646\u0627\u06cc\u0627 \u06af\u06cc\u0627\u06d4\" style=\"display:block;margin:0 auto\" width=\"600\" height=\"400\" loading=\"lazy\" title=\"\"><\/p>\n<p><em>\u0634\u06a9\u0644 10: \u0646\u0627\u06a9\u0627\u0645\u06cc \u06a9\u06d2 \u062a\u0645\u0627\u0645 \u0631\u0627\u0633\u062a\u06d2 \u0646\u0627\u06a9\u0627\u0645\u06cc \u06a9\u06cc \u0627\u06cc\u06a9 \u067e\u06cc\u0634\u06cc\u0646 \u06af\u0648\u0626\u06cc \u06a9\u06cc \u0634\u06a9\u0644 \u0645\u06cc\u06ba \u0646\u062a\u06cc\u062c\u06c1 \u0627\u062e\u0630 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/em><\/p>\n<p>\u0648\u06c1 \u0641\u06cc\u06a9\u0679\u0631\u06cc\u0627\u06ba \u062c\u0648 \u0631\u0627\u0624\u0679\u0631\u0632 \u0628\u0646\u0627\u062a\u06cc \u06c1\u06cc\u06ba \u0627\u067e\u0646\u06d2 \u0637\u0631\u0632 \u0639\u0645\u0644 \u06a9\u0648 \u0627\u0633 \u0645\u06cc\u06ba \u0628\u0646\u0627\u062a\u06cc \u06c1\u06cc\u06ba: <code>defaultHook<\/code>:<\/p>\n<pre><code class=\"language-typescript\">export function createRouter() {\n  return new OpenAPIHono({\n    defaultHook: (result, c) => {\n      if (!result.success) {\n        const apiError = ApiError.parse(result.error);\n        return c.json(apiError.toResponseBody(), apiError.statusCode);\n      }\n    },\n  });\n}\n<\/code><\/pre>\n<p>\u062a\u0645\u0627\u0645 \u0631\u0627\u0624\u0679\u0631\u0632 \u0627\u0633 \u0641\u06cc\u06a9\u0679\u0631\u06cc \u0633\u06d2 \u06af\u0632\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u067e\u0627\u062a\u06be \u067e\u06cc\u0631\u0627\u0645\u06cc\u0679\u0631 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u063a\u0644\u0637 UUID\u060c POST \u0628\u0627\u0688\u06cc \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u06af\u0645 \u0634\u062f\u06c1 \u0641\u06cc\u0644\u0688\u060c \u06cc\u0627 \u0627\u0633\u062a\u0641\u0633\u0627\u0631 \u06a9\u06d2 \u0627\u0633\u0679\u0631\u0646\u06af \u0645\u06cc\u06ba \u063a\u0644\u0637 \u06af\u0646\u062a\u06cc \u06a9\u06d2 \u0646\u062a\u06cc\u062c\u06d2 \u0645\u06cc\u06ba \u06c1\u06cc\u0646\u0688\u0644\u0631 \u06a9\u06d2 \u0639\u0645\u0644 \u062f\u0631\u0622\u0645\u062f \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u06cc\u06a9 \u06c1\u06cc \u062c\u0648\u0627\u0628\u06cc \u0634\u06a9\u0644 \u0622\u0626\u06d2 \u06af\u06cc\u06d4<\/p>\n<p><code>ApiError.parse()<\/code>    \u06cc\u06c1 \u067e\u06cc\u0679\u0631\u0646 \u06a9\u0627 \u062f\u0648\u0633\u0631\u0627 \u0646\u0635\u0641 \u06c1\u06d2.<\/p>\n<pre><code class=\"language-typescript\">public static parse(error: unknown): ApiError {\n  if (error instanceof ApiError) return error;\n\n  if (error instanceof ZodError) {\n    return new ApiError('Validation error', {\n      statusCode: 422,\n      errors: error.flatten().fieldErrors,\n    });\n  }\n\n  return new ApiError('Internal server error', { statusCode: 500 });\n}\n<\/code><\/pre>\n<p>\u06c1\u06cc\u0646\u0688\u0644\u0631 \u0627\u0628 \u0628\u06be\u06cc \u0648\u0627\u0636\u062d \u06c1\u06d2\u06d4 <code>switch<\/code> \u0627\u0633\u0679\u06cc\u0679\u0633 \u06a9\u0648\u0688 \u0645\u06cc\u06ba\u06d4 \u06cc\u06c1 \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u06c1\u06d2\u06d4 \u06c1\u0631 \u0631\u0627\u0633\u062a\u06c1 \u062f\u0633\u062a\u0627\u0648\u06cc\u0632 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0648\u06c1 \u06a9\u0633 \u062d\u0627\u0644\u062a \u0645\u06cc\u06ba \u0648\u0627\u067e\u0633 \u0622\u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06cc\u0633\u06d2 \u06c1\u06cc\u0646\u0688\u0644\u0631\u0632 \u062c\u0646\u06c1\u06cc\u06ba \u06a9\u0628\u06be\u06cc \u0631\u06c1\u0627 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u0627 \u062c\u0627\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4 <code>403<\/code> \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 <code>403<\/code> \u06cc\u06c1 \u0645\u0634\u062a\u0631\u06a9\u06c1 \u0645\u062f\u062f\u06af\u0627\u0631 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0688\u06cc\u0641\u0627\u0644\u0679 \u067e\u0631 \u0628\u06cc\u0679\u06be\u0627 \u06c1\u0648\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u062a\u06a9\u0631\u0627\u0631 \u0646\u0642\u0637\u06c1 \u06c1\u06d2\u06d4 \u0648\u0627\u0636\u062d \u0628\u0679 \u06cc\u06c1\u0627\u06ba \u06c1\u0648\u0634\u06cc\u0627\u0631 \u06c1\u06d2.<\/p>\n<h2 id=\"heading-11-how-to-generate-docs-that-cant-drift\">11. \u0627\u06cc\u06a9 \u0646\u0627\u0642\u0627\u0628\u0644 \u0641\u0631\u0627\u0645\u0648\u0634 \u062f\u0633\u062a\u0627\u0648\u06cc\u0632 \u06a9\u06cc\u0633\u06d2 \u0628\u0646\u0627\u0626\u06cc\u06ba<\/h2>\n<p>\u0686\u0648\u0646\u06a9\u06c1 \u0627\u0633\u06a9\u06cc\u0645\u0648\u06ba \u06a9\u0648 \u0631\u0648\u0679 \u06a9\u06cc \u062a\u0639\u0631\u06cc\u0641\u0648\u06ba \u0633\u06d2 \u062c\u0648\u0691\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0633 \u0644\u06cc\u06d2 OpenAPI \u0627\u06cc\u06a9 \u0627\u0644\u06af \u0622\u067e\u0631\u06cc\u0634\u0646 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0622\u067e \u06a9\u06d2 \u06a9\u0648\u0688 \u06a9\u0627 \u0628\u0627\u0626\u06cc \u067e\u0631\u0648\u0688\u06a9\u0679 \u0628\u0646 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/08\/1787724771_482_\u06c1\u0648\u0646\u0648-\u0627\u0648\u0631-\u0632\u0648\u0688-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2-\u0679\u0627\u0626\u067e-\u0633\u06cc\u0641-APIs.png\" alt=\"Zod \u0627\u0633\u06a9\u06cc\u0645\u0627 \u0631\u0648\u0679 \u06a9\u06cc \u062a\u0639\u0631\u06cc\u0641\u0648\u06ba\u060c OpenAPI JSON\u060c \u0627\u0648\u0631 \u0627\u0633\u06a9\u06cc\u0644\u0631 \u062d\u0648\u0627\u0644\u06c1 UI \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0628\u06c1\u06c1 \u0631\u06c1\u06cc \u06c1\u06d2\u06d4\" style=\"display:block;margin:0 auto\" width=\"600\" height=\"400\" loading=\"lazy\" title=\"\"><\/p>\n<p><em>\u0634\u06a9\u0644 11: \u062f\u0633\u062a\u0627\u0648\u06cc\u0632\u0627\u062a \u0627\u0633\u06cc \u0631\u0627\u0633\u062a\u06d2 \u06a9\u06cc \u062a\u0639\u0631\u06cc\u0641 \u0633\u06d2 \u062a\u06cc\u0627\u0631 \u06a9\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06cc\u06ba \u062c\u06cc\u0633\u06d2 \u0631\u0646 \u0679\u0627\u0626\u0645 \u06a9\u0648\u0688\u06d4<\/em><\/p>\n<pre><code class=\"language-typescript\">export function configureOpenAPI(app: OpenAPIHono) {\n  app.doc('\/doc', {\n    openapi: '3.0.0',\n    info: {\n      title: 'Bulletproof Tasks API',\n      version: '1.0.0',\n    },\n  });\n\n  app.get(\n    '\/reference',\n    apiReference({\n      spec: { url: '\/doc' },\n      theme: 'kepler',\n      layout: 'modern',\n      pageTitle: 'Bulletproof Tasks API',\n    }),\n  );\n}\n<\/code><\/pre>\n<p>\u0627\u06af\u0631 \u0622\u067e \u0631\u0648\u0679\u0633 \u0641\u0627\u0626\u0644 \u0645\u06cc\u06ba \u0627\u0633\u06a9\u06cc\u0645\u0627 \u06cc\u0627 \u0631\u0633\u067e\u0627\u0646\u0633 \u06a9\u0648\u0688\u0632 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0627\u0633 \u06a9\u06d2 \u0645\u0637\u0627\u0628\u0642 \u062f\u0633\u062a\u0627\u0648\u06cc\u0632 \u06a9\u0648 \u0627\u067e \u0688\u06cc\u0679 \u06a9\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4 \u0628\u06be\u0648\u0644\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0648\u0626\u06cc \u062f\u0648\u0633\u0631\u0627 \u062f\u0633\u062a\u0627\u0648\u06cc\u0632\u06cc \u0645\u0631\u062d\u0644\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-12-how-to-make-the-app-production-ready\">12. \u0627\u067e\u0646\u06cc \u0627\u06cc\u067e \u06a9\u0648 \u067e\u0631\u0648\u0688\u06a9\u0634\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u06cc\u0633\u06d2 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u0635\u0631\u0641 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06cc \u062d\u062f\u0648\u062f \u06a9\u06cc \u0642\u0633\u0645 \u06a9\u06cc \u062d\u0641\u0627\u0638\u062a \u06a9\u0627\u0641\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u062a\u0631\u062a\u06cc\u0628 \u0627\u0648\u0631 \u0639\u0645\u0644 \u0644\u0627\u0626\u0641 \u0633\u0627\u0626\u06cc\u06a9\u0644 \u0627\u06cc\u06a9 \u06c1\u06cc \u0627\u0635\u0648\u0644\u0648\u06ba \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-validate-environment-variables-at-boot\">\u0628\u0648\u0679 \u06a9\u06d2 \u0648\u0642\u062a \u0645\u0627\u062d\u0648\u0644\u06cc\u0627\u062a\u06cc \u0645\u062a\u063a\u06cc\u0631\u0627\u062a \u06a9\u06cc \u062a\u0648\u062b\u06cc\u0642 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<pre><code class=\"language-typescript\">import { z } from 'zod';\n\nconst envSchema = z.object({\n  NODE_ENV: z\n    .enum(['development', 'test', 'production'])\n    .default('development'),\n  LOG_LEVEL: z\n    .enum(['silent', 'debug', 'info', 'warn', 'error', 'fatal'])\n    .default('info'),\n  PORT: z.coerce.number().default(8080),\n  DATABASE_URL: z.string().default('tasks.db'),\n});\n\nexport const env = envSchema.parse(process.env);\n<\/code><\/pre>\n<p>\u0627\u06af\u0631 \u0645\u0637\u0644\u0648\u0628\u06c1 \u0627\u0642\u062f\u0627\u0631 \u063a\u0627\u0626\u0628 \u06cc\u0627 \u062e\u0631\u0627\u0628 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u06cc\u06c1 \u0639\u0645\u0644 \u0641\u0648\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0627\u06cc\u06a9 \u0648\u0627\u0636\u062d Zod \u063a\u0644\u0637\u06cc \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062e\u062a\u0645 \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4 \u06cc\u06c1 \u0645\u0639\u0644\u0648\u0645 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u0628\u06c1\u062a \u0628\u06c1\u062a\u0631 \u06c1\u06d2\u06d4 <code>undefined<\/code> \u062a\u06cc\u0646 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba \u062a\u06cc\u0627\u0631 \u06a9\u06cc \u06af\u0626\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-prefer-structured-logging\">\u0633\u0627\u062e\u062a\u06cc \u0644\u0627\u06af\u0646\u06af \u06a9\u0648 \u062a\u0631\u062c\u06cc\u062d \u062f\u06cc\u06ba\u06d4<\/h3>\n<p>\u0688\u06cc\u0645\u0648 Pino \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>hono-pino<\/code> \u0627\u06cc\u06a9 \u0644\u0627\u0626\u0646 \u06a9\u0646\u0633\u0648\u0644 \u0644\u0627\u06af\u0631 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2\u06d4 \u067e\u06cc\u062f\u0627\u0648\u0627\u0631 \u0645\u06cc\u06ba \u0622\u067e \u06a9\u0648 JSON \u0644\u0627\u06af\u0632 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4 \u062a\u0631\u0642\u06cc \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646\u060c \u0622\u067e \u06a9\u0686\u06be \u067e\u0691\u06be\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u0686\u0627\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06cc\u06a9 \u0645\u0688\u0644 \u0648\u06cc\u0626\u0631 \u062f\u0648\u0646\u0648\u06ba \u06a9\u0627\u0645 \u06a9\u0631\u0633\u06a9\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u06c1\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a UUID \u067e\u0627\u0633 \u06a9\u0631\u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-shut-down-cleanly\">\u0635\u0627\u0641 \u0627\u062e\u062a\u062a\u0627\u0645<\/h3>\n<p>\u0688\u0627\u06a9\u0631 \u0627\u0648\u0631 \u067e\u0631\u0648\u0633\u06cc\u0633 \u0645\u06cc\u0646\u06cc\u062c\u0631 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06c1 \u0628\u06be\u06cc\u062c\u0627 \u06af\u06cc\u0627\u06d4 <code>SIGTERM<\/code> \u0639\u0645\u0644 \u06a9\u0648 \u062e\u062a\u0645 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2. \u0627\u0633 \u06a9\u0627 \u062e\u06cc\u0627\u0644 \u0631\u06a9\u06be\u0646\u0627\u06d4 HTTP \u0633\u0631\u0648\u0631 \u06a9\u0648 \u0628\u0646\u062f \u06a9\u0631\u06cc\u06ba\u060c \u067e\u06be\u0631 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0648 \u0628\u0646\u062f \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0628\u0627\u06c1\u0631 \u0646\u06a9\u0644\u06cc\u06ba\u06d4 \u0628\u0635\u0648\u0631\u062a \u062f\u06cc\u06af\u0631\u060c \u0622\u067e \u06a9\u06cc SQLite \u0641\u0627\u0626\u0644\u06cc\u06ba (\u06cc\u0627 Postgres \u06a9\u0646\u06a9\u0634\u0646 \u067e\u0648\u0644) \u06af\u0646\u062f\u06cc \u062d\u0627\u0644\u062a \u0645\u06cc\u06ba \u0631\u06c1 \u0633\u06a9\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-keep-the-app-runtime-portable\">\u0627\u067e\u0646\u06d2 \u0627\u06cc\u067e \u06a9\u06d2 \u0631\u0646 \u0679\u0627\u0626\u0645 \u06a9\u0648 \u067e\u0648\u0631\u0679\u06cc\u0628\u0644 \u0631\u06a9\u06be\u06cc\u06ba<\/h3>\n<p>Hono \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u0627\u067e\u0646\u06d2 \u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u0648\u06cc\u0628 \u0633\u0679\u06cc\u0646\u0688\u0631\u0688 API \u067e\u0631 \u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>app<\/code>. \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u0646\u0648\u0688 \u067e\u0631 \u0648\u06c1\u06cc \u0627\u06cc\u067e\u0644\u06cc \u06a9\u06cc\u0634\u0646 \u0622\u0628\u062c\u06cc\u06a9\u0679 \u0686\u0644 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-typescript\">import { serve } from '@hono\/node-server';\nimport { app } from '@\/app';\n\nserve({ fetch: app.fetch, port: env.PORT });\n<\/code><\/pre>\n<p>\u06cc\u0627 \u0627\u06cc\u06a9 \u06a9\u0646\u0627\u0631\u06d2 \u0631\u0646 \u0679\u0627\u0626\u0645 \u0645\u06cc\u06ba \u062a\u0642\u0631\u06cc\u0628\u0627 \u06a9\u0686\u06be \u0628\u06be\u06cc \u0646\u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-typescript\">import { app } from '@\/app';\n\nexport default app;\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u06a9\u0648\u0626\u06cc \u0622\u0633\u0627\u0646 \u0645\u062b\u0627\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0645\u06a9\u0645\u0644 \u0627\u0688\u0627\u067e\u0679\u0631 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-13-how-these-patterns-scale-in-a-production-app\">13. \u067e\u0631\u0648\u0688\u06a9\u0634\u0646 \u0627\u06cc\u067e\u0633 \u0645\u06cc\u06ba \u06cc\u06c1 \u067e\u06cc\u0679\u0631\u0646 \u06a9\u06cc\u0633\u06d2 \u067e\u06be\u06cc\u0644\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/h2>\n<p>Tasks API \u0627\u06cc\u06a9 \u0628\u06c1\u062a\u0631\u06cc\u0646 \u062a\u0639\u0644\u06cc\u0645\u06cc \u062c\u06af\u06c1 \u06c1\u06d2\u06d4 \u067e\u06cc\u062f\u0627\u0648\u0627\u0631\u06cc \u0646\u0638\u0627\u0645 \u0632\u06cc\u0627\u062f\u06c1 \u067e\u06cc\u0686\u06cc\u062f\u06c1 \u06c1\u06d2\u06d4 \u0627\u067e \u0644\u0648\u0688\u0632\u060c \u0628\u06cc\u06a9 \u06af\u0631\u0627\u0624\u0646\u0688 \u0679\u0627\u0633\u06a9\u060c \u0627\u06cc\u06a9 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u067e\u06cc\u06a9\u062c\u0632\u060c \u0627\u0648\u0631 \u062f\u06cc\u0631\u067e\u0627 \u0648\u0631\u06a9 \u0641\u0644\u0648\u0632 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>ClipForge \u0627\u06cc\u06a9 \u067e\u0631\u0648\u0688\u06a9\u0634\u0646 \u0627\u06cc\u067e \u06a9\u06cc \u0627\u06cc\u06a9 \u0645\u0641\u06cc\u062f \u0645\u062b\u0627\u0644 \u06c1\u06d2 \u062c\u06c1\u0627\u06ba \u0627\u06cc\u06a9 \u06c1\u06cc \u062e\u06cc\u0627\u0644 \u067e\u06cc\u0645\u0627\u0646\u06d2 \u067e\u0631 \u0638\u0627\u06c1\u0631 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 Node.js\u060c Hono\u060c Zod\u060c Drizzle\u060c BullMQ\u060c \u0627\u0648\u0631 Nuxt \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u06a9 \u062e\u0648\u062f \u0645\u06cc\u0632\u0628\u0627\u0646 \u0648\u06cc\u0688\u06cc\u0648 \u067e\u0631\u0648\u0633\u06cc\u0633\u0646\u06af \u0679\u0648\u0644 \u06a9\u0679\u06d4 \u0627\u067e\u0646\u0627 \u0648\u06cc\u0688\u06cc\u0648 \u0627\u067e \u0644\u0648\u0688 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0622\u067e \u06a9\u0648 \u0627\u06cc\u06a9 \u0679\u0631\u0627\u0646\u0633\u06a9\u0631\u067e\u0679\u060c \u0633\u0628 \u0679\u0627\u0626\u0679\u0644\u0632\u060c \u062e\u0644\u0627\u0635\u06c1\u060c \u0628\u0627\u0628 \u0645\u0627\u0631\u06a9\u0631\u060c \u0627\u0648\u0631 \u062a\u06be\u0645\u0628 \u0646\u06cc\u0644\u0632 \u0645\u0644\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<p>\u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u0645\u0646\u062f\u0631\u062c\u06c1 \u0630\u06cc\u0644 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-text\">apps\/\n\u251c\u2500\u2500 api\/        # Hono REST API\n\u251c\u2500\u2500 worker\/     # BullMQ video processor\n\u2514\u2500\u2500 web\/        # Nuxt frontend\npackages\/\n\u251c\u2500\u2500 shared\/     # Zod schemas, constants, shared types\n\u2514\u2500\u2500 providers\/  # OpenAI, Anthropic, Deepgram integrations\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/08\/1787724771_166_\u06c1\u0648\u0646\u0648-\u0627\u0648\u0631-\u0632\u0648\u0688-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2-\u0679\u0627\u0626\u067e-\u0633\u06cc\u0641-APIs.png\" alt=\"\u0648\u06cc\u0628\u060c API\u060c \u06a9\u0627\u0631\u06a9\u0646\u0648\u06ba\u060c \u0645\u0634\u062a\u0631\u06a9\u06c1 \u0627\u0633\u06a9\u06cc\u0645\u0627\u060c \u067e\u0648\u0633\u0679\u06af\u0631\u06cc\u0633\u060c \u0631\u06cc\u0688\u06cc\u0633\u060c \u0627\u0648\u0631 AI \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u06a9\u0644\u067e\u0641\u0648\u0631\u062c \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631\" style=\"display:block;margin:0 auto\" width=\"600\" height=\"400\" loading=\"lazy\" title=\"\"><\/p>\n<p><em>\u0634\u06a9\u0644 12: ClipForge \u0648\u06cc\u0628\u060c API\u060c \u0627\u0648\u0631 \u0648\u0631\u06a9\u0631 \u067e\u06cc\u06a9\u062c\u0648\u06ba \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u06c1\u06cc \u0645\u0639\u0627\u06c1\u062f\u06c1 \u0641\u0631\u0633\u0679 \u06a9\u0648\u0631 \u06a9\u0648 \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4<\/em><\/p>\n<p>\u0648\u06cc\u0688\u06cc\u0648 \u0622\u067e\u0631\u06cc\u0634\u0646 \u0646\u0626\u06d2 \u0631\u0633\u067e\u0627\u0646\u0633 \u0641\u0627\u0631\u0645 \u0627\u06cc\u062c\u0627\u062f \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u0622\u0688\u06cc\u0648 \u0627\u067e \u0644\u0648\u0688\u060c \u062a\u0648\u062b\u06cc\u0642\u060c \u0646\u06a9\u0627\u0644\u0646\u06d2\u060c \u0648\u063a\u06cc\u0631\u06c1 \u062c\u06cc\u0633\u06d2 \u0645\u0631\u0627\u062d\u0644 \u0633\u06d2 \u06af\u0632\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/08\/1787724771_309_\u06c1\u0648\u0646\u0648-\u0627\u0648\u0631-\u0632\u0648\u0688-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2-\u0679\u0627\u0626\u067e-\u0633\u06cc\u0641-APIs.png\" alt=\"ClipForge \u0648\u06cc\u0688\u06cc\u0648 \u06a9\u0627\u0645 \u06a9\u06d2 \u0645\u0631\u0627\u062d\u0644\u060c \u0627\u067e \u0644\u0648\u0688 \u0633\u06d2 \u062a\u06a9\u0645\u06cc\u0644 \u062a\u06a9\u060c \u0631\u0627\u0633\u062a\u06c1 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u06af\u06cc\u0627\u06d4\" style=\"display:block;margin:0 auto\" width=\"600\" height=\"400\" loading=\"lazy\" title=\"\"><\/p>\n<p><em>\u0634\u06a9\u0644 13: \u0648\u06cc\u0688\u06cc\u0648 \u0679\u0627\u0633\u06a9 \u0627\u0646 \u067e\u0679 \u06a9\u06d2 \u0645\u0631\u0627\u062d\u0644 \u0633\u06d2 \u06af\u0632\u0631\u062a\u0627 \u06c1\u06d2 \u0628\u063a\u06cc\u0631 \u06a9\u0648\u0626\u06cc \u0646\u06cc\u0627 \u0631\u0633\u067e\u0627\u0646\u0633 \u0641\u0627\u0631\u0645 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0626\u06d2\u06d4<\/em><\/p>\n<p>\u0627\u06c1\u0645 \u062d\u0635\u06c1 \u0648\u06cc\u0688\u06cc\u0648 \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0627\u06c1\u0645 \u062d\u0635\u06c1 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 API \u0627\u0628 \u0628\u06be\u06cc \u0627\u0633\u06cc \u0645\u0639\u0627\u06c1\u062f\u06d2 \u06a9\u06cc \u062a\u0631\u062c\u06cc\u062d\u06cc \u0627\u0635\u0648\u0644\u0648\u06ba \u067e\u0631 \u0639\u0645\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-shared-zod-schemas-across-packages\">\u067e\u06cc\u06a9\u062c\u0648\u06ba \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0645\u0634\u062a\u0631\u06a9\u06c1 Zod \u0627\u0633\u06a9\u06cc\u0645\u0627<\/h3>\n<p>ClipForge HTTP \u0645\u0639\u0627\u06c1\u062f\u0648\u06ba \u06a9\u0648 \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4 <code>packages\/shared<\/code>\u0644\u06c1\u0630\u0627\u060c APIs\u060c \u06a9\u0627\u0631\u06a9\u0646\u0627\u0646\u060c \u0627\u0648\u0631 \u0648\u06cc\u0628 \u0627\u06cc\u067e\u0633 \u0627\u06cc\u06a9 \u0627\u0644\u0641\u0627\u0638 \u06a9\u0627 \u0627\u0634\u062a\u0631\u0627\u06a9 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-typescript\">export const processingFeatureSchema = z.enum([\n  'transcription',\n  'subtitles',\n  'summary',\n  'chapters',\n  'thumbnails',\n]);\n\nexport const videoUploadSchema = z.object({\n  title: z.string().min(3).max(200),\n  description: z.string().max(2000).optional(),\n  features: z\n    .array(processingFeatureSchema)\n    .default([\n      'transcription',\n      'subtitles',\n      'summary',\n      'chapters',\n      'thumbnails',\n    ]),\n  priority: z.enum(['low', 'normal', 'high']).default('normal'),\n});\n\nexport const jobStatusSchema = z.object({\n  jobId: z.string(),\n  title: z.string().optional(),\n  state: jobStateSchema,\n  stage: jobStageSchema,\n  progress: z.number().min(0).max(100),\n  result: jobResultSchema.optional(),\n  failedReason: z.string().optional(),\n  createdAt: z.string(),\n  updatedAt: z.string(),\n});\n<\/code><\/pre>\n<p>\u062c\u0628 \u06a9\u0627\u0631\u06a9\u0646 \u0627\u06cc\u06a9 \u0642\u062f\u0645 \u0645\u06a9\u0645\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0648\u06c1 \u06a9\u0648\u0626\u06cc \u0646\u06cc\u0627 \u062c\u0648\u0627\u0628\u06cc \u0641\u0627\u0631\u0645 \u0646\u06c1\u06cc\u06ba \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u067e \u0688\u06cc\u0679\u0633 \u0627\u0633\u06cc \u0627\u0633\u06a9\u06cc\u0645\u0627 \u06a9\u06d2 \u062e\u0644\u0627\u0641 \u0628\u06cc\u0627\u0646 \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba \u062c\u0648 API \u06a9\u0644\u0627\u0626\u0646\u0679 \u06a9\u0648 \u0648\u0627\u067e\u0633 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-routes-still-define-the-contract\">\u0631\u0627\u0633\u062a\u06c1 \u0627\u0628 \u0628\u06be\u06cc \u0645\u0639\u0627\u06c1\u062f\u06d2 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/h3>\n<p>ClipForge \u06a9\u0627 \u0627\u067e \u0644\u0648\u0688 \u067e\u0627\u062a\u06be \u0648\u0631\u06a9\u0646\u06af \u0688\u06cc\u0645\u0648 \u062c\u06cc\u0633\u0627 \u06c1\u06cc \u06c1\u06d2\u060c \u062c\u0633 \u0645\u06cc\u06ba \u0645\u0644\u0679\u06cc \u067e\u0627\u0631\u0679 \u0641\u0627\u0631\u0645 \u0688\u06cc\u0679\u0627 \u0627\u0648\u0631 \u0631\u06cc\u0679 \u06a9\u06cc \u062d\u062f\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-typescript\">export const uploadVideo = createRoute({\n  tags: ['videos'],\n  method: 'post',\n  path: '\/videos\/upload',\n  middleware: [\n    sessionMiddleware,\n    apiKeysMiddleware,\n    rateLimitMiddleware({\n      windowMs: 60_000,\n      max: 10,\n      keyPrefix: 'ratelimit:upload',\n    }),\n  ] as const,\n  request: {\n    body: {\n      content: {\n        'multipart\/form-data': {\n          schema: z.object({\n            file: z.instanceof(File),\n            title: z.string().min(3).max(200),\n            description: z.string().max(2000).optional(),\n            features: z.string().optional(),\n            priority: z.enum(['low', 'normal', 'high']).optional(),\n          }),\n        },\n      },\n    },\n  },\n  responses: {\n    [HTTP_STATUS.ACCEPTED]: jsonContent(\n      jobStatusSchema,\n      'Video accepted for processing',\n    ),\n    [HTTP_STATUS.BAD_REQUEST]: jsonApiErrorContent('Invalid request'),\n    [HTTP_STATUS.UNPROCESSABLE]: jsonApiErrorContent('Validation error'),\n    [HTTP_STATUS.TOO_MANY_REQUESTS]: jsonApiErrorContent('Rate limit exceeded'),\n  },\n});\n<\/code><\/pre>\n<p>\u06c1\u06cc\u0646\u0688\u0644\u0631 \u0627\u0646 \u067e\u0679 \u06a9\u06cc \u062a\u0648\u062b\u06cc\u0642 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u06cc\u06a9 \u0679\u0627\u0633\u06a9 \u0642\u0637\u0627\u0631 \u0644\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u060c \u0642\u0637\u0627\u0631 \u0645\u06cc\u06ba BullMQ \u0679\u0627\u0633\u06a9 \u0634\u0627\u0645\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0648\u0627\u067e\u0633 \u0622\u062a\u0627 \u06c1\u06d2\u06d4 <code>202 Accepted<\/code> \u0645\u0644\u0627\u0632\u0645\u062a \u06a9\u06cc \u062d\u06cc\u062b\u06cc\u062a \u062f\u0631\u062c \u06c1\u06d2\u06d4 \u0628\u06be\u0627\u0631\u06cc \u0627\u0634\u06cc\u0627\u0621 \u0627\u0679\u06be\u0627\u0646\u0627 \u06a9\u0627\u0631\u06a9\u0646\u0648\u06ba \u06a9\u06d2 \u0633\u0627\u062a\u06be \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 API \u0627\u06cc\u06a9 \u0645\u0639\u0627\u06c1\u062f\u06c1 \u06a9\u06cc \u067e\u0631\u062a \u0628\u0646\u06cc \u06c1\u0648\u0626\u06cc \u06c1\u06d2\u06d4<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/umang.pk\/wp-content\/uploads\/2026\/08\/1787724771_640_\u06c1\u0648\u0646\u0648-\u0627\u0648\u0631-\u0632\u0648\u0688-\u06a9\u0627-\u0627\u0633\u062a\u0639\u0645\u0627\u0644-\u06a9\u0631\u062a\u06d2-\u06c1\u0648\u0626\u06d2-\u0679\u0627\u0626\u067e-\u0633\u06cc\u0641-APIs.png\" alt=\"ClipForge \u0648\u06cc\u0688\u06cc\u0648 \u0627\u067e \u0644\u0648\u0688 \u06a9\u0631\u0646\u06d2\u060c \u0642\u0637\u0627\u0631 \u0644\u06af\u0627\u0646\u06d2\u060c \u0627\u0648\u0631 \u062c\u0627\u0628 \u0627\u0633\u0679\u06cc\u0679\u0633 \u067e\u0648\u0644\u0646\u06af \u06a9\u0627 \u062a\u0633\u0644\u0633\u0644 \u06a9\u0627 \u062e\u0627\u06a9\u06c1\u06d4\" style=\"display:block;margin:0 auto\" width=\"600\" height=\"400\" loading=\"lazy\" title=\"\"><\/p>\n<p><em>\u0634\u06a9\u0644 14: \u062c\u0628 \u06a9\u0627\u0631\u06a9\u0646 \u06c1\u06cc\u0648\u06cc \u0644\u0641\u0679\u0646\u06af \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c API \u0627\u067e \u0644\u0648\u0688 \u06a9\u0648 \u0642\u0628\u0648\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0646 \u067e\u0679 \u0679\u0627\u0633\u06a9 \u06a9\u06cc \u062d\u06cc\u062b\u06cc\u062a \u0648\u0627\u067e\u0633 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/em><\/p>\n<p>\u0634\u06a9\u0644 14 \u067e\u0627\u0646\u0686 \u0634\u0631\u06a9\u0627\u0621 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u06a9 \u062a\u0631\u062a\u06cc\u0628 \u06a9\u0627 \u062e\u0627\u06a9\u06c1 \u06c1\u06d2: Web UI\u060c Hono API\u060c BullMQ\u060c Worker\u060c \u0627\u0648\u0631 Postgres\u06d4 &#8216;\u0627\u067e \u0644\u0648\u0688 \u0642\u0628\u0648\u0644 \u06a9\u0631\u06cc\u06ba&#8217; \u0627\u0648\u0631 &#8216;\u0645\u06a9\u0645\u0644 \u067e\u0631\u0648\u0633\u06cc\u0633\u0646\u06af&#8217; \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0627\u06cc\u06a9 \u0645\u062a\u0636\u0627\u062f \u062d\u062f \u062f\u06a9\u06be\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u062e\u0627\u06a9\u06c1 \u0645\u06cc\u06ba \u062a\u0645\u0627\u0645 \u0645\u0631\u0627\u062d\u0644 \u062f\u0631\u062c \u0630\u06cc\u0644 \u06c1\u06cc\u06ba:<\/p>\n<ol>\n<li>\n<p>\u0648\u06cc\u0628 UI \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>POST \/videos\/upload<\/code> Hono API \u06a9\u0648\u06d4<\/p>\n<\/li>\n<li>\n<p>Hono API \u0686\u0644\u062a\u0627 \u06c1\u06d2\u06d4 <code>Zod + middleware<\/code> (\u0627\u0646 \u067e\u0679\u060c \u0633\u06cc\u0634\u0646\u060c \u0634\u0631\u062d \u0645\u062d\u062f\u0648\u062f \u06a9\u0631\u0646\u06d2\u060c \u0627\u0648\u0631 \u0645\u062a\u0639\u0644\u0642\u06c1 \u0686\u06cc\u06a9 \u06a9\u06cc \u062a\u0648\u062b\u06cc\u0642 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4)<\/p>\n<\/li>\n<li>\n<p>Hono API \u0645\u0646\u062f\u0631\u062c\u06c1 \u0630\u06cc\u0644 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2: <code>insert job row<\/code> \u067e\u0648\u0633\u0679\u06af\u0631\u06cc\u0633 \u0645\u06cc\u06ba\u060c \u0627\u06cc\u06a9 \u06a9\u0627\u0645 \u0634\u0631\u0648\u0639 \u06c1\u0648\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0645\u0648\u062c\u0648\u062f \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>Hono API \u0628\u06be\u06cc\u062c\u062a\u0627 \u06c1\u06d2: <code>enqueue process-video<\/code> BullMQ \u067e\u0631\u06d4<\/p>\n<\/li>\n<li>\n<p>Hono API \u0641\u0648\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0648\u0627\u067e\u0633 \u0622\u062a\u0627 \u06c1\u06d2\u06d4 <code>202 + jobStatusSchema<\/code> \u0648\u06cc\u0628 UI \u067e\u0631\u06d4 \u0627\u0633 \u0645\u0642\u0627\u0645 \u067e\u0631\u060c \u06a9\u0644\u0627\u0626\u0646\u0679 \u0646\u06d2 \u06a9\u0627\u0645 \u06a9\u06cc \u062d\u06cc\u062b\u06cc\u062a \u0645\u06cc\u06ba \u062f\u0627\u062e\u0644 \u06a9\u06cc\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0646\u0642\u0644 \u0627\u0628\u06be\u06cc \u0645\u06a9\u0645\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u0626\u06cc \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>BullMQ \u0628\u0639\u062f \u0645\u06cc\u06ba \u0622\u062a\u0627 \u06c1\u06d2\u06d4 <code>process job<\/code> \u06a9\u0627\u0631\u06a9\u0646\u0648\u06ba \u06a9\u0648\u06d4<\/p>\n<\/li>\n<li>\n<p>\u06a9\u0627\u0631\u06a9\u0646 \u062f\u0648\u0691\u062a\u0627 \u06c1\u06d2\u06d4 <code>transcribe \/ analyze \/ thumbnails<\/code> \u067e\u0633 \u0645\u0646\u0638\u0631 \u06a9\u06d2 \u06a9\u0627\u0645 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631\u06d4<\/p>\n<\/li>\n<li>\n<p>\u06a9\u0627\u0631\u06a9\u0646 \u0644\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba <code>update stage + result<\/code> \u0642\u062f\u0645 \u0645\u06a9\u0645\u0644 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u067e\u0648\u0633\u0679\u06af\u0631\u06cc\u0633 \u067e\u0631 \u0648\u0627\u067e\u0633 \u062c\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0648\u06cc\u0628 UI \u067e\u0648\u0644\u0632 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2: <code>GET \/videos\/jobs\/{id}<\/code> \u0645\u06cc\u06ba Hono API \u06a9\u06d2 \u062e\u0644\u0627\u0641 \u06c1\u0648\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>Hono API \u067e\u0648\u0633\u0679\u06af\u0631\u06cc\u0633 \u0633\u06d2 \u062a\u0627\u0632\u06c1 \u062a\u0631\u06cc\u0646 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc\u0648\u06ba \u06a9\u0648 \u067e\u0691\u06be\u062a\u0627 \u0627\u0648\u0631 \u0648\u0627\u067e\u0633 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>jobStatusSchema<\/code> \u062f\u0648\u0628\u0627\u0631\u06c1\u060c \u0648\u06c1\u06cc \u062c\u0648\u0627\u0628\u06cc \u0641\u0627\u0631\u0645 \u062c\u0648 \u0645\u0631\u062d\u0644\u06c1 5 \u0645\u06cc\u06ba \u062a\u06be\u0627 \u0627\u067e \u0688\u06cc\u0679 \u06a9\u0631 \u062f\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 <code>stage<\/code>, <code>progress<\/code>\u0627\u0648\u0631 \u0622\u062e\u0631 \u0645\u06cc\u06ba <code>result<\/code>.<\/p>\n<\/li>\n<\/ol>\n<p>\u0644\u06c1\u0630\u0627\u060c API \u0627\u06cc\u06a9 \u062a\u06cc\u0632 \u0645\u0639\u0627\u06c1\u062f\u06d2 \u06a9\u06cc \u067e\u0631\u062a \u06a9\u0648 \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2: \u0642\u0628\u0648\u0644 \u06a9\u0631\u06cc\u06ba\u060c \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06c1\u06cc\u06ba\u060c \u0642\u0637\u0627\u0631 \u0645\u06cc\u06ba \u0631\u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u062c\u0648\u0627\u0628 \u062f\u06cc\u06ba\u06d4 \u0645\u0632\u062f\u0648\u0631 \u0633\u0633\u062a \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646 \u06a9\u06d2 \u0645\u0627\u0644\u06a9 \u06c1\u06cc\u06ba\u06d4 UI \u0627\u06cc\u06a9 \u0645\u0634\u062a\u0631\u06a9\u06c1 \u0631\u06cc\u0627\u0633\u062a\u06cc \u0627\u0633\u06a9\u06cc\u0645\u06d2 \u06a9\u06cc \u067e\u0648\u0644\u0646\u06af \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u067e\u06cc\u0634\u0631\u0641\u062a \u06a9\u0648 \u0679\u0631\u06cc\u06a9 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-database-schemas-still-stay-separate\">\u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u0627\u0628 \u0628\u06be\u06cc \u0627\u0644\u06af \u06c1\u06d2\u06d4<\/h3>\n<p>ClipForge \u067e\u0648\u0633\u0679\u06af\u0631\u06cc\u0633 \u0645\u06cc\u06ba \u0627\u067e\u0646\u06d2 \u06a9\u0627\u0645 \u06a9\u0648 \u0630\u062e\u06cc\u0631\u06c1 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u0648\u0646\u062f\u0627 \u0628\u0627\u0646\u062f\u06cc \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-typescript\">export const jobs = pgTable('jobs', {\n  id: varchar('id', { length: 36 }).primaryKey(),\n  sessionId: varchar('session_id', { length: 36 }).notNull(),\n  state: jobStateEnum('state').notNull().default('waiting'),\n  stage: jobStageEnum('stage').notNull().default('uploading'),\n  progress: integer('progress').notNull().default(0),\n  title: varchar('title', { length: 200 }).notNull(),\n  features: jsonb('features').$type<string>().notNull(),\n  provider: varchar('provider', { length: 50 }).notNull().default('openai'),\n  result: jsonb('result').$type<jobresult>(),\n  failedReason: text('failed_reason'),\n  createdAt: timestamp('created_at', { withTimezone: true })\n    .notNull()\n    .defaultNow(),\n  updatedAt: timestamp('updated_at', { withTimezone: true })\n    .notNull()\n    .defaultNow(),\n});\n<\/jobresult><\/string><\/code><\/pre>\n<p>\u062c\u062f\u0648\u0644\u0648\u06ba \u0645\u06cc\u06ba \u062f\u0631\u062c \u0630\u06cc\u0644 \u0645\u0633\u062a\u0642\u0644 \u0645\u0633\u0627\u0626\u0644 \u06c1\u06cc\u06ba: <code>filePath<\/code> \u0627\u0648\u0631 <code>sessionId<\/code>. \u0639\u0648\u0627\u0645 <code>jobStatusSchema<\/code> \u0622\u067e \u06a9\u0648 \u06c1\u0631 \u0686\u06cc\u0632 \u06a9\u0648 \u0628\u06d2 \u0646\u0642\u0627\u0628 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0648\u06c1\u06cc \u0688\u06cc \u0628\u06cc \u0628\u0645\u0642\u0627\u0628\u0644\u06c1 API \u062a\u0642\u0633\u06cc\u0645 \u06c1\u06d2 \u062c\u0648 \u0648\u0631\u06a9\u0646\u06af \u0688\u06cc\u0645\u0648 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u062d\u0642\u06cc\u0642\u06cc \u0648\u0631\u06a9 \u0641\u0644\u0648 \u067e\u0631 \u0644\u0627\u06af\u0648 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-the-same-production-habits-still-apply\">\u0648\u06c1\u06cc \u067e\u06cc\u062f\u0627\u0648\u0627\u0631\u06cc \u0639\u0627\u062f\u0627\u062a \u0627\u0628 \u0628\u06be\u06cc \u0644\u0627\u06af\u0648 \u06c1\u0648\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/h3>\n<p>ClipForge \u0628\u0648\u0679 \u06a9\u06d2 \u0648\u0642\u062a Zod \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0645\u0627\u062d\u0648\u0644\u06cc\u0627\u062a\u06cc \u0645\u062a\u063a\u06cc\u0631\u0627\u062a \u06a9\u06cc \u062a\u0648\u062b\u06cc\u0642 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 OpenAPI \u0627\u0648\u0631 Scalar \u06a9\u0648 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 <code>\/doc<\/code> \u0627\u0648\u0631 <code>\/reference<\/code>\u063a\u0644\u0637\u06cc \u06a9\u0648 \u0645\u0639\u0645\u0648\u0644 \u06a9\u06d2 \u0645\u0637\u0627\u0628\u0642 \u0628\u0646\u0627\u0626\u06cc\u06ba: <code>ApiError<\/code>\u0642\u0637\u0627\u0631\u0648\u06ba \u0627\u0648\u0631 \u0631\u06cc\u0688\u06cc\u0633 \u06a9\u0648 \u0628\u0646\u062f \u06a9\u0631\u06cc\u06ba\u06d4 <code>SIGTERM<\/code>.<\/p>\n<p>\u0633\u0628\u0642 \u0622\u0633\u0627\u0646 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u0622\u067e \u06a9\u06cc \u0686\u06be\u0648\u0679\u06cc \u0627\u06cc\u067e \u06a9\u0648 \u0635\u062d\u06cc\u062d \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u062a\u0634\u06a9\u06cc\u0644 \u062f\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2 \u062a\u0648\u060c \u0622\u067e \u06a9\u06cc \u0628\u0691\u06cc \u0627\u06cc\u067e \u06a9\u0648 \u06a9\u0633\u06cc \u0645\u062e\u062a\u0644\u0641 \u0641\u0644\u0633\u0641\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u06c1\u06cc \u06a9\u0646\u0679\u0631\u06cc\u06a9\u0679 \u0641\u0631\u0633\u0679 \u06a9\u0648\u0631 \u06a9\u06d2 \u0627\u0648\u067e\u0631 \u0645\u0632\u06cc\u062f \u067e\u06cc\u06a9\u062c\u0632\u060c \u0632\u06cc\u0627\u062f\u06c1 \u0645\u0688\u0644 \u0648\u06cc\u0626\u0631\u060c \u0627\u0648\u0631 \u0637\u0648\u06cc\u0644 \u0639\u0631\u0635\u06d2 \u0633\u06d2 \u0686\u0644\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u06a9\u0627\u0645\u0648\u06ba \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-conclusion\">\u0646\u062a\u06cc\u062c\u06c1<\/h2>\n<p>\u0627\u06cc\u06a9 \u0642\u0633\u0645 \u0633\u06d2 \u0645\u062d\u0641\u0648\u0638 API \u0645\u0632\u06cc\u062f TypeScript \u0634\u0627\u0645\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u062e\u06cc\u0627\u0644 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u06a9\u06d2 \u0628\u06d2 \u06a9\u0627\u0631 \u0630\u0631\u0627\u0626\u0639 \u06a9\u0648 \u062e\u062a\u0645 \u06a9\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4<\/p>\n<p>Hono \u0627\u0648\u0631 Zod \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0622\u067e \u06cc\u06c1 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<ul>\n<li>\n<p>\u0631\u0646 \u0679\u0627\u0626\u0645 \u067e\u0631 \u062a\u0648\u062b\u06cc\u0642 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u062e\u0648\u062f\u06a9\u0627\u0631 \u0637\u0648\u0631 \u067e\u0631 \u0627\u0646\u062f\u0627\u0632\u06c1 \u0679\u0627\u0626\u067e \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0627\u0633\u06cc \u0631\u0627\u0633\u062a\u06d2 \u06a9\u06cc \u062a\u0639\u0631\u06cc\u0641 \u0633\u06d2 OpenAPI \u062f\u0633\u062a\u0627\u0648\u06cc\u0632 \u0628\u0646\u0627\u0626\u06cc\u06ba<\/p>\n<\/li>\n<li>\n<p>\u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u0627\u0648\u0631 HTTP \u0627\u0633\u06a9\u06cc\u0645\u0627 \u06a9\u0648 \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u0627\u0644\u06af \u0631\u06a9\u06be\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u06c1\u0631 \u0646\u0627\u06a9\u0627\u0645\u06cc \u06a9\u0627 \u0631\u0627\u0633\u062a\u06c1 \u0627\u06cc\u06a9 \u0645\u062a\u0648\u0642\u0639 \u063a\u0644\u0637\u06cc \u06a9\u06cc \u0634\u06a9\u0644 \u0644\u0648\u0679\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ul>\n<p>\u0627\u06af\u0631 \u0622\u067e \u0627\u0646 \u0646\u0645\u0648\u0646\u0648\u06ba \u06a9\u0627 \u0633\u0628 \u0633\u06d2 \u0686\u06be\u0648\u0679\u0627 \u067e\u0691\u06be\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u0648\u0631\u0698\u0646 \u0686\u0627\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648\u060c api-conf-demo \u0633\u06d2 \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba\u06d4 \u067e\u06be\u0631 ClipForge \u067e\u0631 \u0627\u06cc\u06a9 \u0646\u0638\u0631 \u0688\u0627\u0644\u06cc\u06ba \u0627\u0648\u0631 \u062f\u06cc\u06a9\u06be\u06cc\u06ba \u06a9\u06c1 \u062c\u0628 API \u0627\u067e \u0644\u0648\u0688\u0632\u060c \u0642\u0637\u0627\u0631\u0648\u06ba\u060c \u0627\u0648\u0631 \u0645\u0644\u0679\u06cc \u0633\u0679\u06cc\u067e \u067e\u0631\u0648\u0633\u06cc\u0633\u0646\u06af \u06a9\u06d2 \u0633\u0627\u0645\u0646\u06d2 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u062a\u0648 \u0648\u06c1\u06cc \u062e\u06cc\u0627\u0644 \u06a9\u06cc\u0633\u06d2 \u062f\u0631\u0633\u062a \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u0628\u0627\u0631 \u062c\u0628 \u0631\u0648\u0679 \u0688\u06cc\u0641\u06cc\u0646\u06cc\u0634\u0646 \u0645\u0639\u0627\u06c1\u062f\u06c1 \u0628\u0646 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u062f\u0633\u062a\u0627\u0648\u06cc\u0632\u0627\u062a \u0628\u06c1\u0646\u0627 \u0628\u0646\u062f \u06c1\u0648 \u062c\u0627\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u06c1\u06cc\u0646\u0688\u0644\u0631\u0632 \u067e\u062a\u0644\u06d2 \u06c1\u0648 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u06a9\u0644\u0627\u0626\u0646\u0679\u0633 \u06a9\u0648 \u0627\u06cc\u06a9 \u0642\u0627\u0628\u0644 \u0627\u0639\u062a\u0645\u0627\u062f API \u0645\u0644 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u0627\u06af\u0631 \u0622\u067e \u0646\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u0628\u06be\u06cc Node.js API \u062c\u0627\u0631\u06cc \u06a9\u06cc\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0634\u0627\u06cc\u062f \u0622\u067e \u0627\u0646 \u0686\u06cc\u0644\u0646\u062c\u0648\u06ba \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06c1\u06cc \u0648\u0627\u0642\u0641 \u06c1\u0648\u06ba \u06af\u06d2\u06d4 TypeScript \u06a9\u06cc \u0642\u0633\u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0628\u0627\u062a \u06a9\u06c1\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u0631\u0646 \u0679\u0627\u0626\u0645 \u06a9\u06cc \u062a\u0648\u062b\u06cc\u0642 \u0627\u06cc\u06a9 \u0627\u0648\u0631 \u06a9\u06c1\u062a\u06cc \u06c1\u06d2\u060c \u0627\u0648\u0631 OpenAPI \u062f\u0633\u062a\u0627\u0648\u06cc\u0632\u0627\u062a \u062e\u0627\u0645\u0648\u0634\u06cc \u0633\u06d2 \u062f\u0648\u0646\u0648\u06ba \u0633\u06d2 \u0645\u062a\u0641\u0642 \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4 \u06a9\u0633\u06cc \u0646\u06d2 \u0627\u0646\u0679\u0631\u0641\u06cc\u0633 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0641\u06cc\u0644\u0688 \u0634\u0627\u0645\u0644 \u06a9\u06cc\u0627 \u0627\u0648\u0631 [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":28305,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1],"tags":[],"class_list":["post-28304","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/posts\/28304","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/comments?post=28304"}],"version-history":[{"count":1,"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/posts\/28304\/revisions"}],"predecessor-version":[{"id":28306,"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/posts\/28304\/revisions\/28306"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/media\/28305"}],"wp:attachment":[{"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/media?parent=28304"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/categories?post=28304"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/tags?post=28304"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}