{"id":297014,"date":"2020-01-12T15:00:11","date_gmt":"2020-01-12T15:00:11","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=297014"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=297014","title":{"rendered":"\u041a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437 OpenAPI v3 (aka Swagger 3) \u0432 TypeScript \u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e"},"content":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/483628\/\">\n<p>\u0414\u0432\u0430 \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434 \u044f \u043d\u0430\u0447\u0430\u043b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 <del>\u0435\u0449\u0435 \u043e\u0434\u043d\u043e\u0433\u043e<\/del> \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0438\u0437 <a href=\"https:\/\/swagger.io\/docs\/specification\/about\/\">OpenAPI Specification<\/a> v3 \u0432 TypeScript (\u043e\u043d <a href=\"https:\/\/github.com\/koshevy\/codegena#codegeneration-from-oas3\">\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 Github<\/a>). \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e, \u044f \u0437\u0430\u0434\u0430\u043b\u0441\u044f \u0446\u0435\u043b\u044c\u044e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0443\u044e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0445 \u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 TypeScript, \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 <a href=\"https:\/\/json-schema.org\/\">JSON Schema<\/a>, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a <a href=\"https:\/\/json-schema.org\/understanding-json-schema\/reference\/combining.html\">oneOf\/anyOf\/allOf<\/a> \u0438 \u0442.\u043f. (\u0443 <a href=\"https:\/\/github.com\/swagger-api\/swagger-codegen\">\u0440\u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/a> \u043e\u0442 Swagger \u0441 \u044d\u0442\u0438\u043c \u0431\u044b\u043b\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b). \u0414\u0440\u0443\u0433\u0430\u044f \u0438\u0434\u0435\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u043b\u0430\u0441\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0445\u0435\u043c\u044b \u0438\u0437 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0439 \u0434\u043b\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u043d\u0430 \u0444\u0440\u043e\u043d\u0442\u0435, \u0431\u044d\u043a\u0435 \u0438 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0447\u0430\u0441\u0442\u044f\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/hz\/cd\/u4\/hzcdu47rcjbutgqbe6pdb2k46x8.png\"\/><\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0433\u043e\u0442\u043e\u0432 \u2014 \u043e\u043d \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u0441\u0442\u0430\u0434\u0438\u0438 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9C%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE_%D0%B6%D0%B8%D0%B7%D0%BD%D0%B5%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82\">MVP<\/a>. \u0412 \u043d\u0435\u043c \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u0435 \u0438\u0437 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0432 \u043f\u043b\u0430\u043d\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u0442\u0430\u043a\u0436\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 (\u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u0434\u043b\u044f Angular). \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043c\u043e\u0447\u044c, \u0435\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 TypeScript \u0438 OpenAPI v3. \u041f\u043e\u043f\u0443\u0442\u043d\u043e, \u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0438\u0434\u0435\u044f\u043c\u0438 \u0438 \u0441\u043e\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438, \u0432\u043e\u0437\u043d\u0438\u043a\u0448\u0438\u043c\u0438 \u0443 \u043c\u0435\u043d\u044f \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u044b. \u041d\u0443 \u0438 \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0438 \u043f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f \u0441\u043a\u0440\u044b\u043b \u0432 \u0441\u043f\u043e\u0439\u043b\u0435\u0440, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043e\u0441\u043b\u043e\u0436\u043d\u044f\u0442\u044c \u0447\u0442\u0435\u043d\u0438\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0447\u0430\u0441\u0442\u0438.<\/p>\n<p>  <\/p>\n<h2 id=\"soderzhanie\">\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/h2>\n<p>  <\/p>\n<ol>\n<li><a href=\"#Foreword\">\u041f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u044f<\/a><\/li>\n<li><a href=\"#Description\">\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/a><\/li>\n<li><a href=\"#SetupAndUsing\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435<\/a><\/li>\n<li><a href=\"#CodegenerationUsingPractice\">\u041f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430<\/a><\/li>\n<li><a href=\"#UsingGeneratedDataTypes\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445<\/a><\/li>\n<li><a href=\"#DecompositionInOAS\">\u0414\u0435\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0441\u0445\u0435\u043c \u0432\u043d\u0443\u0442\u0440\u0438 OAS-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438<\/a><\/li>\n<li><a href=\"#NestedDecomposition\">\u0412\u043b\u043e\u0436\u0435\u043d\u043d\u0430\u044f \u0434\u0435\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f<\/a><\/li>\n<li><a href=\"#ServiceGeneration\">\u0410\u0432\u0442\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 REST API<\/a><br \/> \n<ol>\n<li><a href=\"#WhyItNeccessary\">\u0417\u0430\u0447\u0435\u043c \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e?<\/a><\/li>\n<li><a href=\"#HowToGenerateServices\">\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432<\/a><\/li>\n<li><a href=\"#UsingOfGeneratedServices\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432<\/a><\/li>\n<\/ol>\n<\/li>\n<li><a href=\"#AfterWord\">\u0412\u043c\u0435\u0441\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0441\u043b\u043e\u0432\u0438\u044f<\/a><\/li>\n<\/ol>\n<p>  <a name=\"Foreword\"><\/a>  <\/p>\n<h2 id=\"predystoriya\">\u041f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u044f<\/h2>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0438\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c (\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c)<\/b><\/p>\n<div class=\"spoiler_text\">\n<p>\u0412\u0441\u0435 \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0434\u0432\u0430 \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434 \u2014 \u0442\u043e\u0433\u0434\u0430 \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0435\u0439 Data Mining \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u043b \u0437\u0430 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434 (\u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c, TypeScript + Angular). \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0431\u044b\u043b\u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 (30 \u0438 \u0431\u043e\u043b\u0435\u0435) \u0438 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0435 \u0431\u0438\u0437\u043d\u0435\u0441-\u0441\u0432\u044f\u0437\u0438 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438. \u041a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u0440\u043e\u0441\u043b\u0430, \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u0430\u044f \u043a\u043e\u043d\u044a\u044e\u043d\u043a\u0442\u0443\u0440\u0430 \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u043b\u0430 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0447\u0430\u0441\u0442\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u0424\u0440\u043e\u043d\u0442\u0435\u043d\u0434 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u0431\u044b\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u043e \u043e\u0441\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d \u0432 \u043d\u044e\u0430\u043d\u0441\u0430\u0445, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0441\u0447\u0435\u0442\u044b \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043d\u0430 \u0444\u0440\u043e\u043d\u0442\u0435 \u0438 \u043d\u0430 \u0431\u044d\u043a\u0435\u043d\u0434\u0435. \u0422\u043e \u0435\u0441\u0442\u044c, \u044d\u0442\u043e \u0431\u044b\u043b \u0442\u043e\u0442 \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 OpenAPI \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0443\u043c\u0435\u0441\u0442\u043d\u043e. \u042f \u0437\u0430\u0441\u0442\u0430\u043b \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u043f\u0435\u0440\u0438\u043e\u0434, \u043a\u043e\u0433\u0434\u0430 \u0437\u0430 \u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0435 \u043c\u0435\u0441\u044f\u0446\u044b \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0431\u0440\u0435\u043b\u0430 \u0435\u0434\u0438\u043d\u0443\u044e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e, \u0441\u0442\u0430\u0432\u0448\u0443\u044e \u043e\u0431\u0449\u0435\u0439 \u0431\u0430\u0437\u043e\u0439 \u0437\u043d\u0430\u043d\u0438\u0439 \u0434\u043b\u044f \u0431\u044d\u043a\u0430, \u0444\u0440\u043e\u043d\u0442\u0430 \u0438 \u0434\u0430\u0436\u0435 Core-\u043e\u0442\u0434\u0435\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043a\u0440\u044b\u0432\u0430\u043b\u0441\u044f \u0437\u0430 \u0448\u0438\u0440\u043e\u043a\u043e\u0439 \u0441\u043f\u0438\u043d\u043e\u0439 \u0432\u0435\u0431-\u0431\u044d\u043a\u0435\u043d\u0434\u0430. \u0412\u0435\u0440\u0441\u0438\u044f OpenAPI \u0431\u044b\u043b\u0430 \u0432\u044b\u0431\u0440\u0430\u043d\u0430 \u201c\u043d\u0430 \u0432\u044b\u0440\u043e\u0441\u0442\u201d \u2014 \u0442\u043e\u0433\u0434\u0430 \u0435\u0449\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043c\u043e\u043b\u043e\u0434\u0430\u044f v3.0<\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u0431\u044b\u043b\u0430 \u0443\u0436\u0435 \u043d\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u0445 YML\/JSON-\u0444\u0430\u0439\u043b\u0430\u0445, \u0438 \u043d\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b <a href=\"https:\/\/github.com\/zircote\/swagger-php\">\u0430\u043d\u043d\u043e\u0442\u0430\u0442\u043e\u0440\u043e\u0432<\/a>, \u0430 \u0446\u0435\u043b\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432, \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 DDD-\u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0435\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0431\u044b\u043b\u0430 \u0440\u0430\u0437\u0431\u0438\u0442\u0430 \u043f\u043e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f\u043c \u0438 \u0444\u0430\u0439\u043b\u0430\u043c, \u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u0432\u044b\u0434\u0430\u0432\u0430\u043b OAS-\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438. \u042d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0443\u0442\u0435\u043c \u0431\u044b\u043b \u0432\u044b\u0441\u0442\u0440\u043e\u0435\u043d work flow, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a Design-First.<\/p>\n<p>  <\/p>\n<blockquote><p>\u0412 \u0431\u043b\u043e\u0433\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u042f\u043d\u0434\u0435\u043a\u0441.\u0414\u0435\u043d\u044c\u0433\u0438 \u0435\u0441\u0442\u044c <a href=\"https:\/\/habr.com\/ru\/company\/yamoney\/blog\/347390\/\">\u043d\u0435\u043f\u043b\u043e\u0445\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u043f\u0440\u043e Design First<\/p><\/blockquote>\n<p>Design First \u0438 \u043e\u0431\u0449\u0430\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u043e\u043c\u043e\u0433\u043b\u0438 \u0434\u0435\u0441\u0430\u043a\u0440\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u043d\u0438\u044f, \u043d\u043e \u0441\u0442\u0430\u043b\u0430 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430 \u043d\u043e\u0432\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u2014 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u0434\u0430. \u0412 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0431\u044b\u043b\u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 (\u0430 \u043f\u043e\u0437\u0436\u0435 \u2014 \u0441\u043e\u0442\u043d\u0438) \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439. \u041d\u043e \u043a\u043e\u0434 \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u044f\u043b\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e: \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 REST \u0438 \u0442.\u0434. \u041e\u0434\u0438\u043d-\u0434\u0432\u0430 \u0441\u043f\u0440\u0438\u043d\u0442\u0430 \u0441 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0438\u0441\u0442\u043e\u0440\u0438\u044f\u043c\u0438 \u0441\u0438\u043b\u044c\u043d\u043e \u043c\u0435\u043d\u044f\u043b\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u0443; \u0434\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438 \u043c\u0435\u0440\u0436\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0438\u0441\u0442\u043e\u0440\u0438\u0439 \u0438 \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u0438\u0439 \u0444\u0430\u043a\u0442\u043e\u0440. \u0420\u0443\u0442\u0438\u043d\u0430 \u0433\u0440\u043e\u0437\u0438\u043b\u0430 \u0431\u044b\u0442\u044c \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439, \u0438 \u0432\u044b\u0445\u043e\u0434 \u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u043c \u2014 \u043d\u0443\u0436\u043d\u0430 \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f. \u0412\u0435\u0434\u044c \u0432 OAS-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0445 \u0443\u0436\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043b\u043e\u0441\u044c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u043f\u0435\u0447\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u041d\u043e \u0432\u0441\u0435 \u0431\u044b\u043b\u043e \u043d\u0435 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e.<\/p>\n<p>  <\/p>\n<p>\u0424\u0440\u043e\u043d\u0442\u0435\u043d\u0434 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u0430\u043c\u043e\u043c \u043a\u043e\u043d\u0446\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0449\u0443\u0449\u0430\u043b \u0431\u043e\u043b\u0435\u0437\u043d\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043a\u043e\u043b\u043b\u0435\u0433\u0438 \u0438\u0437 \u0434\u0440\u0443\u0433\u0438\u0445 \u043e\u0442\u0434\u0435\u043b\u043e\u0432. \u041f\u0440\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 REST API \u0440\u0435\u0448\u0430\u043b\u0430 \u043a\u043e\u043d\u044a\u044e\u043d\u043a\u0442\u0443\u0440\u0430 \u0431\u044d\u043a\u0435\u043d\u0434\u0430, \u0438 \u0434\u0430\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u201cDesign First\u201d \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0430\u0441\u044c \u0438\u043d\u0435\u0440\u0446\u0438\u044f; \u0434\u043b\u044f \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0430 \u0432\u0441\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u043e \u043c\u0435\u043d\u0435\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u043c. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043b \u044d\u0442\u043e \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430, \u0438 \u043d\u0430\u0447\u0430\u043b \u043f\u0440\u043e\u0449\u0443\u043f\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u0447\u0432\u0443 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u2014 \u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u044b \u043e \u201c\u0432\u0441\u0435\u043e\u0431\u0449\u0435\u0439\u201d \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u0438\u0441\u044c. \u0420\u0435\u0447\u0438 \u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u043d\u0435 \u0448\u043b\u043e; \u044f \u0445\u043e\u0442\u0435\u043b \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0439\u0442\u0438 \u0447\u0442\u043e-\u0442\u043e \u0433\u043e\u0442\u043e\u0432\u043e\u0435.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u043d\u044f \u0436\u0434\u0430\u043b\u043e \u0440\u0430\u0437\u043e\u0447\u0430\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u0411\u044b\u043b\u043e \u0434\u0432\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b: OAS \u0432\u0435\u0440\u0441\u0438\u0438 3.0, \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u043a\u043e\u0442\u043e\u0440\u043e\u0439, \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u043d\u0438\u043a\u0442\u043e \u043e\u0441\u043e\u0431\u043e \u043d\u0435 \u0441\u043f\u0435\u0448\u0438\u043b, \u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0430\u043c\u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u2014 \u043d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 (\u043d\u0430\u043f\u043e\u043c\u043d\u044e, \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0434\u0432\u0430 \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434), \u043c\u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438 \u0434\u0432\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u044f: <a href=\"https:\/\/github.com\/swagger-api\/swagger-codegen\">\u043e\u0442 Swagger<\/a> \u0438 \u043e\u0442 Microsoft (\u043a\u0430\u0436\u0435\u0442\u0441\u044f, <a href=\"https:\/\/github.com\/Azure\/autorest\">\u044d\u0442\u043e<\/a>). \u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 OAS 3.0 \u0431\u044b\u043b\u0430 \u0432 \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0439 \u0431\u0435\u0442\u0435. \u0412\u0442\u043e\u0440\u043e\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 2.x, \u0430 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u044b\u0445 \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u043e\u0432 \u043d\u0435 \u0431\u044b\u043b\u043e. \u041a \u0441\u043b\u043e\u0432\u0443, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043e\u0442 Microsoft \u043c\u043d\u0435 \u0442\u0430\u043a \u0438 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0434\u0430\u0436\u0435 \u043d\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u043c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 Swagger 2.0. \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0442 Swagger \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e, \u043d\u043e \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0441 $ref-\u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u043b\u0430\u0441\u044c \u0432 \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0435 \u201cERROR!\u201d, \u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u043b\u0438 \u0435\u0433\u043e \u0432 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b. \u0411\u044b\u043b\u0438 \u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/master\/libs\/todo-app-scheme\/specs\/todo-app-spec.json#L1014\">\u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438<\/a>. \u0412\u0434\u043e\u0431\u0430\u0432\u043e\u043a, \u044f \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u043e\u043d\u0438\u043c\u0430\u043b, \u043a\u0430\u043a \u043c\u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0430\u0432\u0442\u043e-\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 \u2014 \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u043e\u043d\u0438 \u0441\u0434\u0435\u043b\u0430\u043d\u044b \u0434\u043b\u044f \u0433\u0430\u043b\u043e\u0447\u043a\u0438, \u0430 \u0438\u0445 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c, \u0447\u0435\u043c \u0440\u0435\u0448\u0430\u043b\u043e (\u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434). \u041d\u0443 \u0438 \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f JAR-\u0444\u0430\u0439\u043b\u0430 \u0432 NPM-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 CI\/CD \u0431\u044b\u043b\u0430 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e\u0439: \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0440\u0443\u043a\u0430\u043c\u0438 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0442\u044c <a href=\"https:\/\/oss.sonatype.org\/content\/repositories\/snapshots\/io\/swagger\/codegen\/v3\/swagger-codegen-cli\/3.0.15-SNAPSHOT\/\">\u043d\u0443\u0436\u043d\u044b\u0439 \u0441\u043d\u0430\u043f\u0448\u043e\u0442<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0435\u0441\u0438\u043b, \u043a\u0430\u0436\u0435\u0442\u0441\u044f, 13 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442, \u0438 \u0447\u0442\u043e-\u0442\u043e \u0441 \u043d\u0438\u043c \u0434\u0435\u043b\u0430\u0442\u044c. \u0412 \u043e\u0431\u0449\u0435\u043c, \u044f \u0432\u0437\u044f\u043b \u043f\u0430\u0443\u0437\u0443 \u0438 \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043f\u044f\u0442\u044c \u043c\u0435\u0441\u044f\u0446\u0435\u0432 \u0432\u043e\u043f\u0440\u043e\u0441 \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u043e\u0437\u043d\u0438\u043a \u0441\u043d\u043e\u0432\u0430. \u041f\u0440\u0435\u0434\u0441\u0442\u043e\u044f\u043b\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0447\u0430\u0441\u0442\u044c \u0412\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0438 \u044f \u0445\u043e\u0442\u0435\u043b \u0437\u0430\u043e\u0434\u043d\u043e \u043e\u0442\u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0442\u044c \u0441\u0442\u0430\u0440\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 REST API \u0438 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u043e \u043e\u0446\u0435\u043d\u043a\u0430 \u0442\u0440\u0443\u0434\u043e\u0435\u043c\u043a\u043e\u0441\u0442\u0438 \u043d\u0435 \u0431\u044b\u043b\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0441\u0442\u0438\u0447\u043d\u043e\u0439: \u043e\u0442 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e-\u043d\u0435\u0434\u0435\u043b\u0438 \u0434\u043e \u0434\u0432\u0443\u0445 \u2014 \u0438 \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 REST-\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432. \u041d\u0435 \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u044d\u0442\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u043c\u0435\u043d\u044f \u0443\u0433\u043d\u0435\u0442\u0430\u043b\u043e, \u043d\u043e \u0432\u0441\u0435 \u0436\u0435. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u044f \u0442\u0430\u043a \u0438 \u043d\u0435 \u043d\u0430\u0448\u0435\u043b \u0438 \u043d\u0435 \u0434\u043e\u0436\u0434\u0430\u043b\u0441\u044f, \u0430 \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0435\u0434\u0432\u0430 \u0437\u0430\u043d\u044f\u043b\u0430 \u0431\u044b \u043c\u0435\u043d\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0422\u043e \u0435\u0441\u0442\u044c, \u043e\u0431 \u044d\u0442\u043e\u043c \u043d\u0435 \u043c\u043e\u0433\u043b\u043e \u0438\u0434\u0442\u0438 \u0440\u0435\u0447\u0438: \u043f\u043e\u043b\u044c\u0437\u0430 \u0441\u043e\u043c\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430, \u0440\u0438\u0441\u043a\u0438 \u0432\u0435\u043b\u0438\u043a\u0438. \u041d\u0438\u043a\u0442\u043e \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043b \u0431\u044b \u044d\u0442\u0443 \u0438\u0434\u0435\u044e, \u0434\u0430 \u044f \u0438 \u043d\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u043b. \u0422\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c, \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0430\u043b\u0438\u0441\u044c \u043c\u0430\u0439\u0441\u043a\u0438\u0435 \u043f\u0440\u0430\u0437\u0434\u043d\u0438\u043a\u0438, \u0430 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u201c\u0437\u0430\u0434\u043e\u043b\u0436\u0430\u043b\u0430\u201d \u043c\u043d\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043d\u0435\u0439 \u0437\u0430 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435. \u041d\u0430 \u0434\u0432\u0435 \u043d\u0435\u0434\u0435\u043b\u0438 \u044f \u0441\u0431\u0435\u0436\u0430\u043b \u043e\u0442 \u0432\u0441\u0435\u0445 \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0439 \u0432 \u0413\u0440\u0443\u0437\u0438\u044e, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043a\u043e\u0433\u0434\u0430-\u0442\u043e \u043f\u0440\u043e\u0436\u0438\u043b \u043f\u043e\u0447\u0442\u0438 \u0433\u043e\u0434.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043f\u0435\u0440\u0435\u0440\u044b\u0432\u0430\u0445 \u043c\u0435\u0436\u0434\u0443 \u0442\u0443\u0441\u043e\u0432\u043a\u0430\u043c\u0438 \u0438 \u0437\u0430\u0441\u0442\u043e\u043b\u044c\u044f\u043c\u0438 \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0447\u0435\u043c-\u0442\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f, \u0438 \u044f \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u0420\u0430\u0431\u043e\u0442\u0430 \u0432 \u043b\u0435\u0442\u043d\u0438\u0445 \u043a\u0430\u0444\u0435\u0448\u043a\u0430\u0445 \u0432\u043e\u0437\u043b\u0435 \u043f\u0430\u0440\u043a\u0430 \u0412\u0430\u043a\u0435 \u0431\u044b\u043b\u0430 \u043d\u0430 \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u0430, \u0438 \u0432 \u041f\u0438\u0442\u0435\u0440 \u044f \u0432\u0435\u0440\u043d\u0443\u043b\u0441\u044f \u0441 \u0433\u043e\u0442\u043e\u0432\u044b\u043c \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445. \u0417\u0430\u0442\u0435\u043c \u0435\u0449\u0435 \u043c\u0435\u0441\u044f\u0446 \u044f \u201c\u0434\u043e\u043f\u0438\u043b\u0438\u0432\u0430\u043b\u201d \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043f\u043e \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u043c, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043e\u043d \u0431\u044b\u043b \u0433\u043e\u0442\u043e\u0432 \u043a \u0440\u0430\u0431\u043e\u0442\u0435.<\/p>\n<p>  <\/p>\n<p>\u0421 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430, \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c, \u0440\u0430\u0431\u043e\u0442\u0430\u044f \u043d\u0430\u0434 \u043d\u0438\u043c \u0432 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f. \u0425\u043e\u0442\u044f, \u043f\u043e-\u0441\u0443\u0442\u0438, \u043f\u0438\u0441\u0430\u043b \u043f\u043e\u0434 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442. \u042f \u043d\u0435 \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0430\/\u043e\u0431\u043a\u0430\u0442\u043a\u0430 \u043f\u0440\u043e\u0448\u043b\u0438 \u0441\u043e\u0432\u0441\u0435\u043c \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c; \u0438 \u043d\u0435 \u0441\u043a\u0430\u0436\u0443 \u0447\u0442\u043e \u043e\u043d\u0438 \u0431\u044b\u043b\u0438 \u0437\u043d\u0430\u0447\u0438\u043c\u044b\u043c\u0438. \u041d\u043e \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u044f \u043e\u0431\u0440\u0430\u0442\u0438\u043b \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f Redoc\/Swagger \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439: \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f \u043f\u043e \u043a\u043e\u0434\u0443 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u0443\u0434\u043e\u0431\u043d\u0435\u0435, \u043f\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0438, \u0447\u0442\u043e \u043a\u043e\u0434 \u0432\u0441\u0435\u0433\u0434\u0430 \u0430\u043a\u0442\u0443\u0430\u043b\u0435\u043d \u0438 \u043f\u0440\u043e\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d. \u0412\u0441\u043a\u043e\u0440\u0435 \u044f \u201c\u0437\u0430\u0431\u0438\u043b\u201d \u043d\u0430 \u0441\u0432\u043e\u0438 \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u044f \u0438\u0445, \u043f\u043e\u043a\u0430 \u043a\u043e\u043b\u043b\u0435\u0433\u0430 (\u0442\u0435\u043f\u0435\u0440\u044c \u0443\u0436\u0435 \u0431\u044b\u0432\u0448\u0438\u0439 \u2014 \u043f\u043e\u043b\u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434 \u044f \u0443\u0448\u0435\u043b \u0432 \u0434\u0440\u0443\u0433\u0443\u044e \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044e) \u043d\u0435 \u043f\u043e\u0441\u043e\u0432\u0435\u0442\u043e\u0432\u0430\u043b \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0438\u043c\u0438 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u0435\u0439 (\u043e\u043d \u0436\u0435 \u0438 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435).<\/p>\n<p>  <\/p>\n<blockquote><p>\u0421\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u043b\u043e, \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0441\u044f\u0446\u0435\u0432 \u0443 \u043c\u0435\u043d\u044f \u0443\u0448\u043b\u043e \u043d\u0430 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432 \u0444\u043e\u043d\u043e\u0432\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435: <a href=\"https:\/\/stackblitz.com\/edit\/codegena-playground\">playground<\/a>, \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0440\u0435\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u0433\u043e\u0442\u043e\u0432 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0432\u044f\u0437\u044c.<\/p><\/blockquote>\n<\/div>\n<\/div>\n<p>  <a name=\"Description\"><\/a>  <\/p>\n<h2 id=\"opisanie\">\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/h2>\n<p>  <\/p>\n<p>\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u0442\u0440\u0438 NPM-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0435 \u0432 \u0441\u043a\u043e\u043f\u0435 <code>@codegena<\/code> \u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0435\u0441\u044f \u0432 \u043e\u0431\u0449\u0435\u043c <a href=\"https:\/\/github.com\/koshevy\/codegena\">\u043c\u043e\u043d\u043e-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a>:<\/p>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430<\/th>\n<th>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>@codegena\/oapi3ts<\/td>\n<td>\u0411\u0430\u0437\u043e\u0432\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u2014 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u043e\u0440 \u0438\u0437 OAS3 \u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e TypeScript)<\/td>\n<\/tr>\n<tr>\n<td>@codegena\/ng-api-service<\/td>\n<td>\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0434\u043b\u044f Angular-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432<\/td>\n<\/tr>\n<tr>\n<td>@codegena\/oapi3ts-cli<\/td>\n<td>\u041e\u0431\u043e\u043b\u043e\u0447\u043a\u0430 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 CLI-\u0441\u043a\u0440\u0438\u043f\u0442\u0430\u0445<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <a name=\"SetupAndUsing\"><\/a>  <\/p>\n<h3 id=\"ustanovka-i-ispolzovanie\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435<\/h3>\n<p>  <\/p>\n<p>\u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 NodeJS-\u0441\u043a\u0440\u0438\u043f\u0442\u0430\u0445, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u044b\u0445 \u0438\u0437 CLI. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">npm i @codegena\/oapi3ts, @codegena\/ng-api-service, @codegena\/oapi3ts-cli<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0430\u0442\u0435\u043c, \u0441\u043e\u0437\u0434\u0430\u0442\u044c js-\u0444\u0430\u0439\u043b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>update-typings.js<\/code>) \u0441 \u043a\u043e\u0434\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">&quot;use strict&quot;;  var cliLib = require('@codegena\/oapi3ts-cli'); var cliApp = new cliLib.CliApplication;  cliApp.createTypings(); \/\/ cliApp.createServices('angular'); \/\/ optional<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e, \u043f\u0435\u0440\u0435\u0434\u0430\u0432 \u0442\u0440\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">node .\/update-typings.js --srcPath .\/specs\/todo-app-spec.json --destPath .\/src\/lib --separatedFiles true<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 <code>destPath<\/code> \u0431\u0443\u0434\u0443\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0438, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 <a href=\"https:\/\/github.com\/koshevy\/codegena\/tree\/master\/libs\/todo-app-scheme\/src\/lib\">\u0432\u043e\u0442 \u044d\u0442\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438<\/a> \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u043e \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c. <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/master\/libs\/todo-app-scheme\/scripts\/update-typings.js\">\u0412\u043e\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0441\u043a\u0440\u0438\u043f\u0442<\/a>, \u0438 <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/master\/libs\/todo-app-scheme\/package.json#L13\">\u0432\u043e\u0442 \u0442\u0430\u043a<\/a> \u043e\u043d \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0432 NPM-\u0441\u043a\u0440\u0438\u043f\u0442\u0430\u0445. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u043f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0434\u0430\u0436\u0435 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435, \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0432 <a href=\"https:\/\/codegena-playground.stackblitz.io\/\">Playground<\/a>.<\/p>\n<p>  <a name=\"CodegenerationUsingPractice\"><\/a>  <\/p>\n<h2 id=\"praktika-ispolzovanie-kodogeneratora\">\u041f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430<\/h2>\n<p>  <\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435: \u0432 \u0447\u0435\u043c \u0438\u0434\u0435\u044f, \u043a\u0430\u043a \u044d\u0442\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u043c. \u041d\u0430\u0433\u043b\u044f\u0434\u043d\u044b\u043c \u043f\u043e\u0441\u043e\u0431\u0438\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u0434 \u0434\u0435\u043c\u043e-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041e\u043d\u043e \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0447\u0430\u0441\u0442\u0435\u0439: \u0431\u044d\u043a\u0435\u043d\u0434 (\u043d\u0430 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435 <a href=\"https:\/\/nestjs.com\/\">NestJS<\/a>) \u0438 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434 (\u043d\u0430 <a href=\"https:\/\/angular.io\/\">Angular<\/a>). \u041f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438, \u0432\u044b \u0434\u0430\u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 <a href=\"https:\/\/github.com\/koshevy\/codegena\/tree\/5367749623826d270fb652e32fa394c023751877#work-with-this-project\">\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e<\/a>.<\/p>\n<p>  <\/p>\n<blockquote><p>\u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b \u0441 Angular \u0438\/\u0438\u043b\u0438 NestJS, \u044d\u0442\u043e \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c: \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b, \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u044b \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0443 TypeScript-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432.<\/p><\/blockquote>\n<p>\u0425\u043e\u0442\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043e (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0431\u044d\u043a\u0435\u043d\u0434 \u0445\u0440\u0430\u043d\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0441\u0435\u0441\u0441\u0438\u0438, \u0430 \u043d\u0435 \u0432 \u0411\u0414), \u044f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u0432\u043e\u0441\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0432 \u043d\u0435\u043c data flow \u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u0441\u0443\u0449\u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041e\u043d\u043e \u0433\u043e\u0442\u043e\u0432\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043d\u0430 80-85%, \u043d\u043e \u201c\u0434\u043e\u043f\u0438\u043b\u0438\u0432\u0430\u043d\u0438\u0435\u201d \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0442\u044f\u043d\u0443\u0442\u044c\u0441\u044f, \u0430 \u043f\u043e\u043a\u0430 \u0432\u0430\u0436\u043d\u0435\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0443\u0436\u0435 \u0435\u0441\u0442\u044c.<\/p>\n<p>  <a name=\"UsingGeneratedDataTypes\"><\/a>  <\/p>\n<h2 id=\"ispolzovanie-generiruemyh-tipov-dannyh-v-prilozheniyah\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445<\/h2>\n<p>  <\/p>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c OpenAPI-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/master\/libs\/todo-app-scheme\/specs\/todo-app-spec.json\">\u0432\u043e\u0442 \u044d\u0442\u0430<\/a>), \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u041d\u0435\u0432\u0430\u0436\u043d\u043e, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043c\u044b \u0447\u0442\u043e-\u043b\u0438\u0431\u043e \u0441 \u043d\u0443\u043b\u044f, \u043b\u0438\u0431\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u043c\u0441\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439, \u0435\u0441\u0442\u044c \u0432\u0430\u0436\u043d\u0430\u044f \u0432\u0435\u0449\u044c, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0430\u0447\u043d\u0435\u043c \u2014 \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044f. \u041c\u044b \u043b\u0438\u0431\u043e \u043d\u0430\u0447\u043d\u0435\u043c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043b\u0438\u0431\u043e \u0432\u043d\u043e\u0441\u0438\u0442\u044c \u0432 \u043d\u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432 \u0434\u0435\u043b\u0430\u044e\u0442 \u044d\u0442\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0443\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443. \u0422\u0430\u043a \u043d\u0435 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u043d\u0438\u0439 \u0440\u0430\u0437 \u0437\u0430\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u0442\u044c \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e, \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432 \u0433\u043e\u043b\u043e\u0432\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432; \u0438 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u043c\u0438, \u0447\u0442\u043e IDE \u0438\/\u0438\u043b\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0437\u0430\u043c\u0435\u0442\u044f\u0442 \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0443.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043d\u0430\u0448\u0435\u0439 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u043b\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u0434\u0435\u043b <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/master\/libs\/todo-app-scheme\/specs\/todo-app-spec.json#L505\">components.schem\u0430s<\/a>. \u041d\u043e \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0432 \u043d\u0435\u0439 \u0431\u0443\u0434\u0443\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430\u0431\u043e\u0440\u044b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u043e\u0442\u0432\u0435\u0442\u044b \u2014 \u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">@Controller('group') export class AppController {      \/\/ ...      @Put(':groupId')     rewriteGroup(         @Param(ParseQueryPipe) { groupId }: RewriteGroupParameters,         @Body() body: RewriteGroupRequest,         @Session() session     ): RewriteGroupResponse&lt;HttpStatus.OK&gt; {         return this.appService             .setSession(session)             .rewriteGroup(groupId, body);     }      \/\/ ... }<\/code><\/pre>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/master\/apps\/todo-app-backend\/src\/app\/app.controller.ts\">\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430<\/a> \u0434\u043b\u044f \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 NestJS, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b (<code>RewriteGroupParameters<\/code>), \u0442\u0435\u043b\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 (<code>RewriteGroupRequest<\/code>) \u0438 \u0442\u0435\u043b\u043e \u043e\u0442\u0432\u0435\u0442\u0430 (<code>RewriteGroupResponse&lt;T&gt;<\/code>). \u0423\u0436\u0435 \u0432 \u044d\u0442\u043e\u043c \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0435 \u043a\u043e\u0434\u0430 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u0443 \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0415\u0441\u043b\u0438 \u043c\u044b \u043f\u0435\u0440\u0435\u043f\u0443\u0442\u0430\u0435\u043c \u0438\u043c\u044f \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <code>groupId<\/code>, \u0443\u043a\u0430\u0437\u0430\u0432 \u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0435\u0433\u043e <code>groupUid<\/code>, \u0442\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435.<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/1z\/2q\/0c\/1z2q0cstw2lv3vncwmgi8gkxfa0.png\"\/><\/li>\n<li>\u0415\u0441\u043b\u0438 \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/5367749623826d270fb652e32fa394c023751877\/apps\/todo-app-backend\/src\/app\/todo-storage.service.ts#L136\">this.appService.rewriteGroup(groupId, body)<\/a> \u0438\u043c\u0435\u0435\u0442 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <code>body<\/code>. \u0418 \u0435\u0441\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0443 \u043c\u0435\u0442\u043e\u0434\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0438\u043b\u0438 \u0443 \u043c\u0435\u0442\u043e\u0434\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u043c\u044b \u0441\u0440\u0430\u0437\u0443 \u0443\u0437\u043d\u0430\u0435\u043c \u043e\u0431 \u044d\u0442\u043e\u043c. \u0417\u0430\u0431\u0435\u0433\u0430\u044f \u0432\u043f\u0435\u0440\u0435\u0434, \u043e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u0443 \u043c\u0435\u0442\u043e\u0434\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0438\u043c\u0435\u0435\u0442 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u043e\u0442 <code>RewriteGroupRequest<\/code>, \u043d\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0443. \u041e\u0434\u043d\u0430\u043a\u043e, \u0435\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u043c\u0435\u0442\u043e\u0434 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0431\u0443\u0434\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d, \u0438 \u043d\u0430\u0447\u043d\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c <code>ToDoGroup<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>ToDoGroupBlank<\/code>, IDE \u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u043a\u0430\u0436\u0443\u0442 \u043c\u0435\u0441\u0442\u0430 \u0440\u0430\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0439:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/wo\/cq\/rr\/wocqrrks2gtcthaq_wghrhlbbta.png\"\/><\/li>\n<li>\u0422\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u0436\u0435, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430. \u0415\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u043e\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0442\u0443\u0441 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430, \u0438 \u0441\u0442\u0430\u043d\u0435\u0442 <code>202<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>200<\/code>, \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u0443\u0437\u043d\u0430\u0435\u043c \u043e\u0431 \u044d\u0442\u043e\u043c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e <code>RewriteGroupResponse<\/code> \u2014 <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/master\/libs\/todo-app-scheme\/src\/lib\/typings\/rewrite-group-response.ts#L8\">\u044d\u0442\u043e \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a \u0441 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u044b\u043c \u0442\u0438\u043f\u043e\u043c<\/a>:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/pt\/io\/ss\/ptiossjjfhihchrlwdlydrrkft4.png\"\/><\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/5367749623826d270fb652e32fa394c023751877\/apps\/todo-app\/src\/app\/todo-tasks\/todo-tasks.store.ts#L145\">\u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/a>, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0441 <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/master\/apps\/todo-app-backend\/src\/app\/app.controller.ts#L58\">\u0434\u0440\u0443\u0433\u0438\u043c API-\u043c\u0435\u0442\u043e\u0434\u043e\u043c<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">protected initSelectedGroupData(truth: ComponentTruth): Observable&lt;ComponentTruth&gt; {     return this.getGroupsService.request(null, {         isComplete: null,         withItems: false     }).pipe(         pickResponseBody&lt;GetGroupsResponse&lt;200&gt;&gt;(200, null, true),         switchMap&lt;ToDoGroup[], Observable&lt;ComponentTruth&gt;&gt;(             groups =&gt; this.loadItemsOfSelectedGroups({                 ...truth,                 groups             })         )     ); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0435 \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u0431\u0435\u0433\u0430\u0442\u044c \u0432\u043f\u0435\u0440\u0435\u0434 \u0438 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 RxJS-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code>pickResponseBody<\/code>, \u0430 \u0437\u0430\u043e\u0441\u0442\u0440\u0438\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0443\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 <code>GetGroupsResponse<\/code>. \u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0435\u0433\u043e \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0435 RxJS-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432, \u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0437\u0430 \u043d\u0438\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0438\u043c\u0435\u0435\u0442 \u0432\u0445\u043e\u0434\u043d\u043e\u0435 \u0443\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u0435 <code>ToDoGroup[]<\/code>. \u0415\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0437\u043d\u0430\u0447\u0438\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0443. \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0442\u0438\u043f\u043e\u0432, \u0438 \u0435\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u043f\u043e\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0444\u043e\u0440\u043c\u0430\u0442 \u043e\u0442\u0432\u0435\u0442\u0430 \u0432 \u043d\u0430\u0448\u0435\u043c API \u2014 \u044d\u0442\u043e \u043d\u0435 \u0443\u0441\u043a\u043e\u043b\u044c\u0437\u043d\u0435\u0442 \u043e\u0442 \u043d\u0430\u0448\u0435\u0433\u043e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ci\/hr\/7c\/cihr7csbo5kqn9fqkreoij7kuxk.png\"\/><\/p>\n<p>  <\/p>\n<p>\u041d\u0443 \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432\u044b\u0437\u043e\u0432\u0430 <code>this.getGroupsService.request<\/code> \u0442\u043e\u0436\u0435 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u044b. \u041d\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u0442\u0435\u043c\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.<\/p>\n<p>  <\/p>\n<blockquote><p>\u0412 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0445 \u0432\u044b\u0448\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0447\u0430\u0441\u0442\u044f\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u2014 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434, \u0431\u044d\u043a\u0435\u043d\u0434 \u0438 \u0442.\u0434. \u0415\u0441\u043b\u0438 \u0431\u044d\u043a\u0435\u043d\u0434 \u0438 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u043e\u043d\u043e-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0438 \u0438\u043c\u0435\u044e\u0442 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u0443\u044e \u044d\u043a\u043e-\u0441\u0440\u0435\u0434\u0443, \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443 <a href=\"https:\/\/github.com\/koshevy\/codegena\/tree\/5367749623826d270fb652e32fa394c023751877\/libs\/todo-app-scheme#todoapp-typings-and-api-services\">\u043e\u0431\u0449\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443<\/a> \u0441\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c. \u041d\u043e \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0431\u044d\u043a\u0435\u043d\u0434 \u0438 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438, \u0438 \u043d\u0435 \u0438\u043c\u0435\u044e\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043e\u0431\u0449\u0435\u0433\u043e, \u043a\u0440\u043e\u043c\u0435 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0439 OAS-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u0438\u043c \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043b\u0435\u0433\u0447\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043a\u043e\u0434.<\/p><\/blockquote>\n<p>  <a name=\"DecompositionInOAS\"><\/a>  <\/p>\n<h2 id=\"dekompoziciya-shem-vnutri-oas-specifikacii\">\u0414\u0435\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0441\u0445\u0435\u043c \u0432\u043d\u0443\u0442\u0440\u0438 OAS-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438<\/h2>\n<p>  <\/p>\n<p>\u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0432\u044b \u043e\u0431\u0440\u0430\u0442\u0438\u043b\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b <code>ToDoGroupBlank<\/code>, <code>ToDoGroup<\/code>, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0441\u043e\u043e\u0442\u043d\u043e\u0441\u0438\u043b\u0438\u0441\u044c <code>RewriteGroupResponse<\/code> \u0438 <code>GetGroupsResponse<\/code>. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, <code>RewriteGroupResponse<\/code> \u2014 \u044d\u0442\u043e \u0432\u0441\u0435\u0433\u043e-\u043b\u0438\u0448\u044c \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a-\u0430\u043b\u0438\u0430\u0441 \u0434\u043b\u044f <code>ToDoGroup<\/code>, <code>HttpErrorBadRequest<\/code> \u0438 \u0442.\u0434. \u041d\u0435\u0442\u0440\u0443\u0434\u043d\u043e \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0438 <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/master\/libs\/todo-app-scheme\/specs\/todo-app-spec.json#L888\">ToDoGroup<\/a>, \u0438 <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/master\/libs\/todo-app-scheme\/specs\/todo-app-spec.json#L732\">HttpErrorBadRequest<\/a> \u2014 \u044d\u0442\u043e \u0441\u0445\u0435\u043c\u044b \u0438\u0437 \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/master\/libs\/todo-app-scheme\/specs\/todo-app-spec.json#L505\">components.schem\u0430s<\/a>, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/master\/libs\/todo-app-scheme\/specs\/todo-app-spec.json#L119\">\u044d\u043d\u0434\u043f\u043e\u0439\u043d\u0442 \u201crewriteGroup\u201d<\/a> (\u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/master\/libs\/todo-app-scheme\/specs\/todo-app-spec.json#L556\">\u043f\u043e\u0441\u0440\u0435\u0434\u043d\u0438\u043a\u043e\u0432<\/a>):<\/p>\n<p>  <\/p>\n<pre><code class=\"json\">&quot;responses&quot;: {   &quot;200&quot;: {     &quot;description&quot;: &quot;Todo group saved&quot;,     &quot;content&quot;: {       &quot;application\/json&quot;: {         &quot;schema&quot;: {           &quot;$ref&quot;: &quot;#\/components\/schemas\/ToDoGroup&quot;         }       }     }   },   &quot;400&quot;: {     &quot;$ref&quot;: &quot;#\/components\/responses\/errorBadRequest&quot;   },   &quot;404&quot;: {     &quot;$ref&quot;: &quot;#\/components\/responses\/errorGroupNotFound&quot;   },   &quot;409&quot;: {     &quot;$ref&quot;: &quot;#\/components\/responses\/errorConflict&quot;   },   &quot;500&quot;: {     &quot;$ref&quot;: &quot;#\/components\/responses\/errorServer&quot;   } } <\/code><\/pre>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u0430\u044f \u0434\u0435\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u0435\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0442\u043e\u0442 \u0436\u0435, \u0447\u0442\u043e \u0438 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0434\u0435\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u044b: \u0441\u0441\u044b\u043b\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e), \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 JSON Schema. \u041d\u043e \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u043e\u043d\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0435\u043d\u044b \u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445. \u042f \u0445\u043e\u0447\u0443 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0435\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432 OpenAPI, \u0438 \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434.<\/p>\n<p>  <\/p>\n<blockquote><p>\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432 \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 OAS-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0442\u044c\u0441\u044f \u0441 DDD-\u043c\u043e\u0434\u0435\u043b\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445 \u0435\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u041d\u043e \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043d\u0435\u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0430, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u043f\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043d\u0435\u0435, \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u044b\u0445. \u042d\u0442\u043e \u0434\u0430\u0441\u0442 \u0432\u0430\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0432\u0430\u0448\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0442\u0438\u043f\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c.<\/p><\/blockquote>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u2014 \u044d\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u0434\u0430\u0447, \u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u2014 \u044d\u0442\u043e \u0417\u0430\u0434\u0430\u0447\u0430. \u041b\u043e\u0433\u0438\u0447\u043d\u043e \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0435\u0435 \u0432 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0442.\u043a. \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0438 \u044d\u043d\u0434\u043f\u043e\u0439\u043d\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0442\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0441 \u043d\u0435\u0439. \u041d\u043e \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0434\u0432\u0435 \u0432\u0435\u0449\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041c\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044e, \u043d\u043e \u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438, \u0438 \u0447\u0435\u043c \u043e\u043d\u0438 \u0442\u043e\u0447\u043d\u0435\u0435 \u0438 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u0435\u0435 \u2014 \u0442\u0435\u043c \u043b\u0443\u0447\u0448\u0435.<\/li>\n<li>\u041a\u0430\u043a \u043b\u044e\u0431\u0430\u044f \u0445\u0440\u0430\u043d\u0438\u043c\u0430\u044f \u0432 \u0411\u0414 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c, \u0417\u0430\u0434\u0430\u0447\u0430 \u0438\u043c\u0435\u0435\u0442 \u0434\u0432\u0430 \u0442\u0438\u043f\u0430 \u0441\u0432\u043e\u0439\u0441\u0442\u0432: \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0435 \u0438 \u0432\u0432\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f, \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0434\u0432\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445: \u0417\u0430\u0434\u0430\u0447\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c, \u0438 \u0417\u0430\u0434\u0430\u0447\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u0436\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0431\u0430\u0437\u0435. \u0412\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043e\u043d\u0430 \u0438\u043c\u0435\u0435\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 UID, \u0434\u0430\u0442\u0443 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438 \u0442.\u0434., \u0438 \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0431\u044d\u043a\u0435\u043d\u0434\u0435. \u042f \u043e\u043f\u0438\u0441\u0430\u043b \u0434\u0432\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 (<code>ToDoTaskBlank<\/code> \u0438 <code>ToDoTask<\/code>) \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u0430\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0432\u0442\u043e\u0440\u043e\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"json\">&quot;components&quot;: {   &quot;ToDoTaskBlank&quot;: {     &quot;title&quot;: &quot;Base part of data of item in todo's group&quot;,     &quot;description&quot;: &quot;Data about group item needed for creation of it&quot;,     &quot;properties&quot;: {       &quot;groupUid&quot;: {         &quot;description&quot;: &quot;An unique id of group that item belongs to&quot;,         &quot;$ref&quot;: &quot;#\/components\/schemas\/Uid&quot;       },       &quot;title&quot;: {         &quot;description&quot;: &quot;Short brief of task to be done&quot;,         &quot;type&quot;: &quot;string&quot;,         &quot;minLength&quot;: 3,         &quot;maxLength&quot;: 64       },       &quot;description&quot;: {         &quot;description&quot;: &quot;Detailed description and context of the task. Allowed using of Common Markdown.&quot;,         &quot;type&quot;: [&quot;string&quot;, &quot;null&quot;],         &quot;minLength&quot;: 10,         &quot;maxLength&quot;: 1024       },       &quot;isDone&quot;: {         &quot;description&quot;: &quot;Status of task: is done or not&quot;,         &quot;type&quot;: &quot;boolean&quot;,         &quot;default&quot;: &quot;false&quot;,         &quot;example&quot;: false       },       &quot;position&quot;: {         &quot;description&quot;: &quot;Position of a task in group. Allows to track changing of state of a concrete item, including changing od position.&quot;,         &quot;type&quot;: &quot;number&quot;,         &quot;min&quot;: 0,         &quot;max&quot;: 4096,         &quot;example&quot;: 0       },       &quot;attachments&quot;: {         &quot;type&quot;: &quot;array&quot;,         &quot;description&quot;: &quot;Any material attached to the task: may be screenshots, photos, pdf- or doc- documents on something else&quot;,         &quot;items&quot;: {           &quot;$ref&quot;: &quot;#\/components\/schemas\/AttachmentMeta&quot;         },         &quot;maxItems&quot;: 16,         &quot;example&quot;: []       }     },     &quot;required&quot;: [       &quot;isDone&quot;,       &quot;title&quot;     ],     &quot;example&quot;: {       &quot;isDone&quot;: false,       &quot;title&quot;: &quot;Book soccer field&quot;,       &quot;description&quot;: &quot;The complainant agreed and recruited more members to play soccer.&quot;     }   },   &quot;ToDoTask&quot;: {     &quot;title&quot;: &quot;Item in todo's group&quot;,     &quot;description&quot;: &quot;Describe data structure of an item in group of tasks&quot;,     &quot;allOf&quot;: [       {         &quot;$ref&quot;: &quot;#\/components\/schemas\/ToDoTaskBlank&quot;       },       {         &quot;type&quot;: &quot;object&quot;,         &quot;properties&quot;: {           &quot;uid&quot;: {             &quot;description&quot;: &quot;An unique id of task&quot;,             &quot;$ref&quot;: &quot;#\/components\/schemas\/Uid&quot;,             &quot;readOnly&quot;: true           },           &quot;dateCreated&quot;: {             &quot;description&quot;: &quot;Date\/time (ISO) when task was created&quot;,             &quot;type&quot;: &quot;string&quot;,             &quot;format&quot;: &quot;date-time&quot;,             &quot;readOnly&quot;: true,             &quot;example&quot;: &quot;2019-11-17T11:20:51.555Z&quot;           },           &quot;dateChanged&quot;: {             &quot;description&quot;: &quot;Date\/time (ISO) when task was changed last time&quot;,             &quot;type&quot;: &quot;string&quot;,             &quot;format&quot;: &quot;date-time&quot;,             &quot;readOnly&quot;: true,             &quot;example&quot;: &quot;2019-11-17T11:20:51.555Z&quot;           }         },         &quot;required&quot;: [           &quot;dateChanged&quot;,           &quot;dateCreated&quot;,           &quot;position&quot;,           &quot;uid&quot;         ]       }     ]   } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0434\u0432\u0430 TypeScript-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u0438 <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/master\/libs\/todo-app-scheme\/src\/lib\/typings\/to-do-task-blank.ts\">\u043f\u0435\u0440\u0432\u044b\u0439<\/a> \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c\u0441\u044f <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/master\/libs\/todo-app-scheme\/src\/lib\/typings\/to-do-task.ts\">\u0432\u0442\u043e\u0440\u044b\u043c<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">\/**  * ## Base part of data of item in todo's group  * Data about group item needed for creation of it  *\/ export interface ToDoTaskBlank {   \/\/ ... imagine there are ToDoTaskBlank properties }  \/**  * ## Item in todo's group  * Describe data structure of an item in group of tasks  *\/ export interface ToDoTask extends ToDoTaskBlank {   \/**    * ## UID of element    * An unique id of task    *\/   readonly uid: string;   \/**    * Date\/time (ISO) when task was created    *\/   readonly dateCreated: string;   \/**    * Date\/time (ISO) when task was changed last time    *\/   readonly dateChanged: string;    \/\/ ... imagine there are ToDoTaskBlank properties }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0417\u0430\u0434\u0430\u0447\u0430, \u0438 \u043c\u044b \u0441\u0441\u044b\u043b\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043d\u0438\u0445 <strong>\u0432 \u043a\u043e\u0434\u0435 \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/strong> \u0442\u0430\u043a, \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0432 <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/master\/apps\/todo-app\/src\/app\/todo-tasks\/lib\/context.ts#L1\">\u0434\u0435\u043c\u043e-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">import {     ToDoTask,     ToDoTaskBlank, } from '@our-npm-scope\/our-generated-lib';  export interface ToDoTaskTeaser extends ToDoTask {     isInvalid?: boolean;      \/**      * Means this task just created, has temporary uid      * and not saved yet.      *\/     isJustCreated?: boolean;      \/**      * Means this task is saving now.      *\/     isPending?: boolean;      \/**      * Previous uid of task temporary assigned until      * it gets saved and gets new UID from backend.      *\/     prevTempUid?: string; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u043e\u043f\u0438\u0441\u0430\u043b\u0438 \u043d\u043e\u0432\u0443\u044e \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u043a <code>ToDoTask<\/code> \u0442\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0430\u043c \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0422\u043e \u0435\u0441\u0442\u044c, \u043f\u043e-\u0441\u0443\u0442\u0438, \u043c\u044b \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0438. \u0412\u043e\u043a\u0440\u0443\u0433 \u044d\u0442\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0432\u044b\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/master\/apps\/todo-app\/src\/app\/todo-tasks\/lib\/helpers.ts\">\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432<\/a> \u0438 \u0447\u0442\u043e-\u0442\u043e \u0442\u0438\u043f\u0430 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u043e\u0433\u043e DTO:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">export function downgradeTeaserToTask(     taskTeaser: ToDoTaskTeaser ): ToDoTask {     const task = { ...taskTeaser };      if (!task.description || !task.description.trim()) {         delete task.description;     } else {         task.description = task.description.trim();     }      delete task.isJustCreated;     delete task.isPending;     delete task.prevTempUid;      return task; }  export function downgradeTeaserToTaskBlank(     taskTeaser: ToDoTaskTeaser ): ToDoTaskBlank {     const task = downgradeTeaserToTask(taskTeaser) as any;      delete task.dateChanged;     delete task.dateCreated;     delete task.uid;      return task; }<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u0442\u043e-\u0442\u043e \u0436\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u043e\u043b\u0435\u0435 \u0446\u0435\u043b\u044c\u043d\u043e\u0439 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u044b<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">export class ToDoTaskTeaser implements ToDoTask {      \/\/ \u2026 imagine, definitions from ToDoTask are here      constructor(         task: ToDoTask,         public isInvalid?: boolean,         public isJustCreated?: boolean,         public isPending?: boolean,         public prevTempUid?: string     ) {         Object.assign(this, task);     }      downgradeTeaserToTask(): ToDoTask {         const task = {...this};          if (!task.description || !task.description.trim()) {             delete task.description;         } else {             task.description = task.description.trim();         }          delete task.isJustCreated;         delete task.isPending;         delete task.prevTempUid;          return task;     }      downgradeTeaserToTaskBlank(): ToDoTaskBlank {         \/\/ \u2026 some code     } }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u041d\u043e \u044d\u0442\u043e \u0432\u043e\u043f\u0440\u043e\u0441 \u0441\u0442\u0438\u043b\u044f, \u0446\u0435\u043b\u0435\u0441\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e\u0441\u0442\u0438 \u0438 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u0438\u043c \u043f\u0443\u0442\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0412 \u0446\u0435\u043b\u043e\u043c \u0436\u0435, \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434\u0430, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0438\u043c\u0435\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0437\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435\u043c \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438. \u0422\u0430\u043a, \u0435\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u043f\u043e \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 <code>uid<\/code> \u0443 <code>ToDoTask<\/code> \u0441\u0442\u0430\u043d\u0435\u0442 \u0447\u0438\u0441\u043b\u043e\u043c, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0437\u043d\u0430\u0442\u044c \u043e\u0431\u043e \u0432\u0441\u0435\u0445 \u0443\u0447\u0430\u0441\u0442\u043a\u0430\u0445 \u043a\u043e\u0434\u0430, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0445 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/cc\/7g\/yz\/cc7gyzy0tc4oh5zpomvjy09endw.png\"\/><\/p>\n<p>  <a name=\"NestedDecomposition\"><\/a>  <\/p>\n<h2 id=\"vlozhennaya-dekompoziciya\">\u0412\u043b\u043e\u0436\u0435\u043d\u043d\u0430\u044f \u0434\u0435\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f<\/h2>\n<p>  <\/p>\n<p>\u0418\u0442\u0430\u043a, \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>ToDoTask<\/code>, \u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0441\u044b\u043b\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043d\u0435\u0433\u043e. \u0421\u0445\u043e\u0436\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043e\u043f\u0438\u0448\u0435\u043c <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/master\/libs\/todo-app-scheme\/specs\/todo-app-spec.json#L996\">ToDoTaskGroup<\/a> \u0438 <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/master\/libs\/todo-app-scheme\/specs\/todo-app-spec.json#L927\">ToDoTaskGroupBlank<\/a>, \u0438 \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432 \u0441\u0435\u0431\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0441 \u0442\u0438\u043f\u043e\u043c <code>ToDoTask<\/code> \u0438 <code>ToDoTaskBlank<\/code>, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u041d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0437\u043e\u0431\u044c\u0435\u043c \u201c\u0413\u0440\u0443\u043f\u043f\u0443 \u0437\u0430\u0434\u0430\u0447\u201d \u043d\u0435 \u043d\u0430 \u0434\u0432\u0430, \u0430 \u043d\u0430 \u0442\u0440\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430: \u0434\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438 \u043c\u044b \u043e\u043f\u0438\u0448\u0435\u043c \u0434\u0435\u043b\u044c\u0442\u0443 \u0432 <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/master\/libs\/todo-app-scheme\/specs\/todo-app-spec.json#L961\">ToDoGroupExtendedData<\/a>. \u0422\u0430\u043a \u044f \u0445\u043e\u0447\u0443 \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u0434\u0438\u043d \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0434\u0432\u0443\u0445 \u0434\u0440\u0443\u0433\u0438\u0445:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">&quot;ToDoGroup&quot;: {   &quot;allOf&quot;: [     {       &quot;$ref&quot;: &quot;#\/components\/schemas\/ToDoGroupBlank&quot;     },     {       &quot;$ref&quot;: &quot;#\/components\/schemas\/ToDoGroupExtendedData&quot;     }   ] }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0443\u044e TypeScript-\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">export type ToDoGroup = ToDoGroupBlank &amp; \/\/ Data needed for group creation  ToDoGroupExtendedData; \/\/ Extended data has to be obtained after first save<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 <code>ToDoGroup<\/code> \u043d\u0435\u0442 \u0441\u0432\u043e\u0435\u0433\u043e \u201c\u0442\u0435\u043b\u0430\u201d, \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0435\u043b \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u0435\u0441\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u0440\u0435\u0442\u044c\u044e \u0447\u0430\u0441\u0442\u044c \u0441 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 (\u0430\u043d\u043e\u043d\u0438\u043c\u043d\u043e\u0439) \u0441\u0445\u0435\u043c\u043e\u0439, \u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0441\u0442\u0430\u043d\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441 \u0434\u0432\u0443\u043c\u044f \u043f\u0440\u0435\u0434\u043a\u0430\u043c\u0438 (\u043d\u043e \u043b\u0443\u0447\u0448\u0435 \u0442\u0430\u043a \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c). \u0418 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u0431\u0440\u0430\u0442\u0438\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>items<\/code> \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 <code>ToDoGroupBlank<\/code> \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043a\u0430\u043a \u043c\u0430\u0441\u0441\u0438\u0432 <code>ToDoTaskBlank<\/code>, \u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e \u0432 <code>ToDoGroupBlank<\/code> \u043d\u0430 <code>ToDoTask<\/code>. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043d\u044e\u0430\u043d\u0441\u044b \u0434\u0435\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0438\u0437 JSON Schema \u0432 TypeScipt.<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">\/* tslint:disable *\/ import { ToDoTaskBlank } from '.\/to-do-task-blank';  \/** * ## Base part of data of group * Data needed for group creation *\/ export interface ToDoGroupBlank {  \/\/ ...  items?: Array&lt;ToDoTaskBlank&gt;;  \/\/ ... }<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"java\">\/* tslint:disable *\/ import { ToDoTask } from '.\/to-do-task';  \/** * ## Extended data of group * Extended data has to be obtained after first save *\/ export interface ToDoGroupExtendedData {  \/\/ ...  items: Array&lt;ToDoTask&gt;; } <\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0443 \u0438 \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0432 <code>ToDoTask<\/code> \/ <code>ToDoTaskBlank<\/code> \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0435\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044e. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432\u044b \u043e\u0431\u0440\u0430\u0442\u0438\u043b\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>attachments<\/code> \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u043a\u0430\u043a \u043c\u0430\u0441\u0441\u0438\u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0442\u0438\u043f\u0430 <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/master\/libs\/todo-app-scheme\/specs\/todo-app-spec.json#L629\">AttachmentMeta<\/a>. \u0418 \u044d\u0442\u043e\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043e\u043f\u0438\u0441\u0430\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">&quot;AttachmentMeta&quot;: {  &quot;description&quot;: &quot;Common meta data model of any type of attachment&quot;,  &quot;oneOf&quot;: [    {&quot;$ref&quot;: &quot;#\/components\/schemas\/AttachmentMetaImage&quot;},    {&quot;$ref&quot;: &quot;#\/components\/schemas\/AttachmentMetaDocument&quot;},    {&quot;$ref&quot;: &quot;#\/components\/schemas\/ExternalResource&quot;}  ] }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c, \u044d\u0442\u043e\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443, \u043e\u043d \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u044b, \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043d\u0435 \u0432\u044b\u043d\u043e\u0441\u0438\u0442 \u0435\u0433\u043e \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043c\u043d\u043e\u0436\u0438\u0442\u044c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438, \u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u0442\u0438\u043f\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">\/**  * Any material attached to the task: may be screenshots, photos, pdf- or doc-  * documents on something else  *\/ attachments?: Array&lt;   | AttachmentMetaImage \/\/ Meta data of image attached to task   | AttachmentMetaDocument \/\/ Meta data of document attached to task   | string \/\/ Link to any external resource &gt;;<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c, \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 <code>AttachmentMetaImage<\/code> \u0438 <code>AttachmentMetaDocument<\/code> \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445 \u0438\u0445 \u0444\u0430\u0439\u043b\u0430\u0445:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">import { AttachmentMetaDocument } from '.\/attachment-meta-document'; import { AttachmentMetaImage } from '.\/attachment-meta-image';<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u043e \u0434\u0430\u0436\u0435 \u0432 <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/master\/libs\/todo-app-scheme\/src\/lib\/typings\/attachment-meta-image.ts\">AttachmentMetaImage<\/a> \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/master\/libs\/todo-app-scheme\/src\/lib\/typings\/image-options.ts#L2\">ImageOptions<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0432\u0430\u0436\u0434\u044b, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435, \u0432\u043d\u0443\u0442\u0440\u0438 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 (\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0438\u0437 <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/master\/libs\/todo-app-scheme\/specs\/todo-app-spec.json#L658\">additionalProperties<\/a>):<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">\/* tslint:disable *\/ import { ImageOptions } from '.\/image-options';  \/**  * Meta data of image attached to task  *\/ export interface AttachmentMetaImage {    \/\/ ...    \/**    * Possible thumbnails of uploaded image    *\/   thumbs?: {     [key: string]: {       \/**        * Link to any external resource        *\/       url?: string;       imageOptions?: ImageOptions;     };   };    \/\/ ...    imageOptions: ImageOptions; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0431\u0430\u0437\u0438\u0440\u0443\u044f\u0441\u044c \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u0445 <code>ToDoTask<\/code> \u0438\u043b\u0438 <code>ToDoGroup<\/code>, \u043c\u044b \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u043c \u0432 \u043d\u0430\u0448 \u043a\u043e\u0434 \u043a\u043e\u0434 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u0438 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0438\u0445 \u0431\u0438\u0437\u043d\u0435\u0441-\u0441\u0432\u044f\u0437\u0435\u0439, \u0447\u0442\u043e \u0434\u0430\u0435\u0442 \u043d\u0430\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0437\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u0432 \u043d\u0430\u0434-\u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u0432\u044b\u0445\u043e\u0434\u044f\u0449\u0438\u043c\u0438 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u0434\u0430. \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u044d\u0442\u043e \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u043e \u0432\u0441\u0435\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445. \u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 OpenAPI, \u0442\u043e \u0443 \u0432\u0430\u0441 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0431\u043e\u043d\u0443\u0441, \u043f\u043e\u043c\u0438\u043c\u043e \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438.<\/p>\n<p>  <a name=\"ServiceGeneration\"><\/a>  <\/p>\n<h2 id=\"avtogeneraciya-servisov-dlya-raboty-s-rest-api\">\u0410\u0432\u0442\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 REST API<\/h2>\n<p>  <a name=\"WhyItNeccessary\"><\/a>  <\/p>\n<h3 id=\"zachem-eto-nuzhno\">\u0417\u0430\u0447\u0435\u043c \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e?<\/h3>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u0441\u0440\u0435\u0434\u043d\u0435-\u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0435 \u0441 \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u043c REST API, \u0442\u043e \u043d\u0435\u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0435\u0433\u043e \u043a\u043e\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441\u044b (\u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438) \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a API. \u041e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0432 \u0441\u0435\u0431\u044f:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041c\u0430\u043f\u0438\u043d\u0433\u0438 URL \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432<\/li>\n<li>\u0412\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u043e\u0442\u0432\u0435\u0442\u0430<\/li>\n<li>\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u043d\u0435\u0448\u0442\u0430\u0442\u043d\u044b\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0439<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u0432\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u044d\u0442\u043e \u043d\u043e\u0441\u0438\u0442 \u0442\u0438\u043f\u043e\u0432\u043e\u0439 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440 \u0438 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u2014 \u043a\u0430\u043a \u0432 \u043e\u0431\u0449\u0438\u0445 \u0447\u0435\u0440\u0442\u0430\u0445, \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0440\u043e\u0438\u0442\u044c\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 API:<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0423\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e-\u0441\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 REST API<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"javascript\">import _ from 'lodash'; import { Observable, fromFetch, throwError } from 'rxjs'; import { switchMap } from 'rxjs\/operators';  \/\/ Definitions  const URLS = {     'getTasksOfGroup': `${env.REST_API_BASE_URL}\/tasks\/\\${groupId}`,     \/\/ ... other urls ... }; const URL_TEMPLATES = _.mapValues(urls, url =&gt; _.template(url));  interface GetTaskConditions {     isDone?: true | false;     offset?: number;     limit?: number; }  interface ErrorReponse {     error: boolean;     message?: string; }  \/\/ Helpers  \/\/ I taken this snippet from StackOverflow only for example function encodeData(data) {     return Object.keys(data).map(function(key) {         return [key, data[key]].map(encodeURIComponent).join(&quot;=&quot;);     }).join(&quot;&amp;&quot;); }  \/\/ REST API functions  \/\/ our REST API working function example function getTasksFromServer(groupUid: string, conditions: GetTaskConditions = {}): Observable&lt;Response&gt; {     if (!groupUid) {         return throwError(new Error('You should specify &quot;groupUid&quot;!'));     }      if (!_.isString(groupUid)) {         return throwError(new Error('`groupUid` should be string!'));     }      if (_.isBoolean(conditions.isDone)) {         \/\/ ... applying of conditions.isDone     } else if (conditions.isDone !== undefined) {         return throwError(new Error('`isDone` should be &quot;true&quot;, &quot;false&quot; or should\\'t be set!'!));     }      if (offset) {         \/\/ ... check of `offset` and applying or error throwing     }      if (limit) {         \/\/ ... check of `limit` and applying or error throwing     }      const url = [         URL_TEMPLATES['getTasksOfGroup']({groupUid}),         ...(conditions ? [encodeData(conditions)] : [])     ];       return fromFetch(url); }  \/\/ Using of REST API working functions function getRemainedTasks(groupUid: number): Observable&lt;ToDoTask[] | ErrorReponse&gt; {     return getTasksFromServer(groupUid, {isDone: false}).pipe(         switchMap(response =&gt; {             if (response.ok) {                 \/\/ OK return data                 return response.json();             } else {                 \/\/ Server is returning a status requiring the client to try something else.                 return of({ error: true, message: `Error ${response.status}` });             }         }),         catchError(err =&gt; {             \/\/ Network or other error, handle appropriately             console.error(err);             return of({ error: true, message: err.message })         })     ); }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u0443\u044e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 REST \u2014 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430, \u044d\u0442\u043e \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c: <a href=\"https:\/\/github.com\/axios\/axios\">Axios<\/a>, <a href=\"https:\/\/angular.io\/guide\/http\">Angular HttpClient<\/a>, \u0438\u043b\u0438 \u043b\u044e\u0431\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u041d\u043e \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u0435\u0439 \u0432\u0441\u0435\u0433\u043e, \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e \u0432\u0430\u0448 \u043a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c \u0441 \u044d\u0442\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c. \u041f\u043e\u0447\u0442\u0438 \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430, \u0432 \u043d\u0435\u043c \u0431\u0443\u0434\u0443\u0442:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0421\u0435\u0440\u0432\u0438\u0441\u044b \u0438\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u044d\u043d\u0434\u043f\u043e\u0439\u043d\u0442\u0430\u043c (\u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>getTasksFromServer<\/code>\u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435)<\/li>\n<li>\u0423\u0447\u0430\u0441\u0442\u043a\u0438 \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 (\u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>getRemainedTasks<\/code>)<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0412 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0438\u0437 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0438\u0440\u0430, \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u0435\u0435: \u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0434\u0435\u043c\u043e-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/master\/libs\/todo-app-scheme\/src\/lib\/typings\/rewrite-group-response.ts#L9\">\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e 5-6 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043e\u0442\u0432\u0435\u0442\u0430<\/a>. \u0427\u0430\u0441\u0442\u043e, REST API \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0442\u0430\u0442\u0443\u0441 \u043e\u0442\u0432\u0435\u0442\u0430 \u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c. \u041d\u043e \u0434\u0430\u0436\u0435 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043c\u0435\u0435\u0442 \u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u044e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f: \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0443\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0442\u0437\u044b\u0432\u043e\u0432 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445, \u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0437\u043d\u0430\u0442\u044c \u043e\u0431 \u0443\u0437\u043a\u0438\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 \u0446\u0438\u0440\u043a\u0443\u043b\u044f\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438.<\/p>\n<p>  <\/p>\n<blockquote><p>\u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0443\u0437\u043b\u0435 \u0441\u0442\u044b\u043a\u043e\u0432\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u043c\u043e\u0433\u0443\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438, \u043d\u0435\u0441\u0432\u043e\u0435\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 (\u0440\u0430\u0432\u043d\u043e \u043a\u0430\u043a \u0438 \u043f\u043e\u0438\u0441\u043a \u0442\u0440\u0443\u0434\u043d\u043e-\u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c) \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0438\u0437\u043d\u0435\u0441\u0443 \u043e\u0447\u0435\u043d\u044c \u0434\u043e\u0440\u043e\u0433\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0430\u043c \u0431\u0443\u0434\u0443\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0443\u0442\u043e\u0447\u043d\u044f\u044e\u0449\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438. \u041f\u043e \u043c\u0435\u0440\u0435 \u0440\u043e\u0441\u0442\u0430 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u044b, \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u043a\u0435\u0439\u0441\u043e\u0432, \u0440\u0430\u0441\u0442\u0435\u0442 \u0438 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439. \u041d\u043e \u0431\u0438\u0437\u043d\u0435\u0441 \u2014 \u044d\u0442\u043e \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0438 \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u0434\u0435\u0442\u044c\u0441\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u0441\u0442\u043e\u0438\u0442 \u043e\u0437\u0430\u0431\u043e\u0442\u0438\u0442\u044c\u0441\u044f \u0442\u0435\u043c, \u043a\u0430\u043a \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u043d\u043e\u0441\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u0440\u0430\u043d\u0435\u0435.<\/p><\/blockquote>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044f\u0441\u044c \u043a \u0442\u0435\u043c\u0435 OpenAPI, \u0437\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u0432 OAS-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u0447\u0442\u043e\u0431\u044b:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041e\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u044d\u043d\u0434-\u043f\u043e\u0439\u043d\u0442\u044b \u0432 \u0432\u0438\u0434\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438\u043b\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432<\/li>\n<li>\u0410\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0441 \u043d\u0443\u0436\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/li>\n<li>\u041f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 URL \u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0432 \u043d\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b<\/li>\n<li>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e \u043f\u0435\u0440\u0435\u0434 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u0438 \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0415\u0441\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0430\u0441\u043f\u0435\u043a\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u2014 <strong>\u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/strong>. \u042f \u0433\u043e\u0432\u043e\u0440\u044e \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443 \u043d\u0430\u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \/ \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u2014 5, 10 \u0438\u043b\u0438 200, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043c\u0435\u043d\u044f\u0442\u044c \u0438\u0445 \u0432 \u043e\u0434\u0438\u043d \u043c\u043e\u043c\u0435\u043d\u0442 \u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u043e\u0434\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u0435. \u0410 \u0437\u043d\u0430\u0447\u0438\u0442, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043d\u0438\u043c\u0438, \u0441\u043e\u0437\u0434\u0430\u0432 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0435 \u0445\u0435\u043b\u043f\u0435\u0440\u044b: \u0442\u0430\u043a\u0438\u0435, \u043a\u0430\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, RxJS-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/master\/apps\/todo-app\/src\/app\/todo-tasks\/todo-tasks.store.ts#L150\">pickResponseBody<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u043d\u0430\u043c \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u043a \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0433\u0434\u0435 \u0434\u0435\u043b\u0430\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438-\u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u0443; \u0438\u043b\u0438 <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/master\/libs\/ng-api-service\/src\/lib\/helpers.spec.ts\">tapResponse<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 side-effect (tap) \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 HTTP-\u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432. \u042d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a\u043e\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e\u0431 \u043e\u0434\u043d\u043e-\u0434\u0432\u0443\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 \u0432 \u043a\u043e\u0434\u0435. \u041d\u043e \u0435\u0441\u043b\u0438 \u0438\u0445 \u0441\u043e\u0442\u043d\u0438, \u0438 \u0440\u0435\u0447\u044c \u0438\u0434\u0435\u0442 \u043e\u0431 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0435 \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u043f\u043e\u043b\u044c\u0437\u0430 \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u043e\u0449\u0443\u0442\u0438\u043c\u0430.<\/p>\n<p>  <\/p>\n<blockquote><p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u044d\u0442\u043e \u043f\u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0441\u043e\u043c\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0435\u043c \u2014 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e-\u0445\u044d\u043b\u043f\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430. \u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0447\u0430\u0441\u0442\u043e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a, \u0447\u0442\u043e \u0441\u0442\u043e\u043b\u044c \u0441\u043a\u0440\u043e\u043c\u043d\u043e\u0435 \u043d\u043e\u0432\u043e\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0441\u0442\u043e\u0438\u0442 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0434\u043e\u0440\u043e\u0436\u0435, \u0447\u0435\u043c \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e &quot;\u043f\u0430\u0440\u043a&quot; \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \/ \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a API \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0440\u0430\u0437\u043d\u043e\u0448\u0435\u0440\u0441\u0442\u043d\u043e\u0439 \u043e\u0440\u0434\u043e\u0439 \u0438\u0437 &quot;\u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438-\u0441\u043b\u043e\u0436\u0438\u0432\u0448\u0438\u0445\u0441\u044f&quot; \u0438 &quot;\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445&quot; \u0440\u0435\u0448\u0435\u043d\u0438\u0439. \u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0432\u0432\u0435\u0441\u0442\u0438 \u0447\u0442\u043e-\u0442\u043e \u043e\u0434\u043d\u043e \u0438 \u043e\u0431\u0449\u0435\u0435, \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0438 \u043e\u0442\u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0442\u044c \u0432\u0441\u0435\u0445 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0435\u0439 \u044d\u0442\u043e\u0433\u043e &quot;\u043e\u0431\u0449\u0435\u0433\u043e&quot; (\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u043d\u0438\u043c\u0438 \u043c\u0435\u0441\u0442), \u0447\u0442\u043e \u0447\u0430\u0441\u0442\u043e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u043e.<\/p><\/blockquote>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430, \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u0440\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u0445\u0435\u043c\u0443 \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 REST API \u0432 \u044d\u043a\u043e\u0441\u0440\u0435\u0434\u0435 Angular. \u0415\u0441\u043b\u0438 \u0431\u044b \u044d\u0442\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u0436\u0438\u0437\u043d\u0435\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0439 \u0438 \u0432\u044b\u0437\u0432\u0430\u043b\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441, \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u043c \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435\u043c, \u0438 \u0437\u0430\u0434\u0443\u043c\u0430\u0442\u044c\u0441\u044f \u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432\/\u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c. \u041d\u043e \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u044d\u0442\u0438 \u043c\u044b\u0441\u043b\u0438 \u043f\u0440\u0435\u0436\u0434\u0435\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b. \u0414\u0430\u043b\u0435\u0435, \u044f \u0445\u043e\u0447\u0443 \u0432\u043a\u0440\u0430\u0442\u0446\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u044f \u043d\u0435 \u0441\u043c\u043e\u0433\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0441\u0435\u0445 \u043d\u044e\u0430\u043d\u0441\u043e\u0432, \u0442.\u043a. \u0441\u0442\u0430\u0442\u044c\u044f \u0443\u0436\u0435 \u0438\u0442\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439.<\/p>\n<p>  <a name=\"HowToGenerateServices\"><\/a>  <\/p>\n<h3 id=\"generaciya-servisov\">\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432<\/h3>\n<p>  <\/p>\n<p>\u0412 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 &quot;<a href=\"#SetupAndUsing\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435<\/a>&quot; \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u043a\u0430\u043a \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u0427\u0442\u043e\u0431\u044b \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c Angular-\u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u0447\u043a\u0443 \u043a \u043d\u0430\u0448\u0435\u043c\u0443 <code>update-typings.js<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">&quot;use strict&quot;;  var cliLib = require('@codegena\/oapi3ts-cli'); var cliApp = new cliLib.CliApplication;  cliApp.createTypings(); cliApp.createServices('angular');<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u044d\u0442\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0432 \u043d\u0430\u0448\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u043e \u0438 Angular-\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 API \u0438\u0437 \u043d\u0430\u0448\u0435\u0439 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438. \u041a\u0430\u043a \u0432\u044b \u0443\u0436\u0435 \u043f\u043e\u043d\u044f\u043b\u0438, \u0434\u0435\u043c\u043e-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0442\u043e\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438-\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u0438 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f <a href=\"https:\/\/github.com\/koshevy\/codegena\/tree\/master\/libs\/todo-app-scheme\/src\/lib\/services\">\u0441 \u043d\u0438\u043c\u0438<\/a>. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0438\u0445, \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0439 \u043d\u0430\u043c <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/d1874f9ab86c6ec2cb966d6de6aef6fe213825f4\/libs\/todo-app-scheme\/src\/lib\/services\/rewrite-group.api.service.ts#L32\">RewriteGroupService<\/a>. \u042d\u0442\u043e \u043f\u043e\u0442\u043e\u043c\u043e\u043a \u043a\u043b\u0430\u0441\u0441\u0430 <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/d1874f9ab86c6ec2cb966d6de6aef6fe213825f4\/libs\/ng-api-service\/src\/lib\/api.service.ts#L55\">ApiService<\/a>, \u0438 \u0443 \u043d\u0438\u0445 \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043e\u0442\u0432\u0435\u0442\u0430, \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043c\u0435\u0442\u0430-\u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041c\u0435\u0442\u0430-\u0434\u0430\u043d\u043d\u044b\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">\/\/ Typings for this API method import {   RewriteGroupParameters,   RewriteGroupResponse,   RewriteGroupRequest } from '..\/typings'; \/\/ Schemas import { schema as domainSchema } from '.\/schema.b4c655ec1635af1be28bd6';  \/**  * Service for angular based on ApiAgent solution.  * Provides assured request to API method with implicit  * validation and common errors handling scheme.  *\/ @Injectable() export class RewriteGroupService extends ApiService&lt;   RewriteGroupResponse,   RewriteGroupRequest,   RewriteGroupParameters &gt; {   protected get method(): 'PUT' {     return 'PUT';   }    \/**    * Path template, example: `\/some\/path\/{id}`.    *\/   protected get pathTemplate(): string {     return '\/group\/{groupId}';   }    \/**    * Parameters in a query.    *\/   protected get queryParams(): string[] {     return ['forceSave'];   }    \/\/ ...    }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0436\u0435, <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/d1874f9ab86c6ec2cb966d6de6aef6fe213825f4\/libs\/todo-app-scheme\/src\/lib\/services\/rewrite-group.api.service.ts#L73\">\u0432 \u0441\u0435\u0440\u0432\u0438\u0441 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u0430 JSON Schema<\/a> \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u043e\u0442\u0432\u0435\u0442\u0430. \u041e\u043d\u0430 \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/d1874f9ab86c6ec2cb966d6de6aef6fe213825f4\/libs\/todo-app-scheme\/src\/lib\/services\/schema.b4c655ec1635af1be28bd6.ts\">\u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u043e\u0431\u0449\u0438\u0445 \u0441\u0445\u0435\u043c, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0441\u044b\u043b\u0430\u044e\u0442\u0441\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">import { schema as domainSchema } from '.\/schema.b4c655ec1635af1be28bd6';<\/code><\/pre>\n<p>  <\/p>\n<blockquote><p>\u0421\u0445\u0435\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 <code>schema.b4c655ec1635af1be28bd6.ts<\/code> \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0447\u0430\u0441\u0442\u044f\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0438 <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/d1874f9ab86c6ec2cb966d6de6aef6fe213825f4\/apps\/todo-app\/src\/app\/todo-tasks\/lib\/helpers.ts#L28\">\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438<\/a> \u0442\u0430\u043a\u0438\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439, \u043a\u0430\u043a \u0417\u0430\u0434\u0430\u0447\u0430.<\/p><\/blockquote>\n<p>  <a name=\"UsingOfGeneratedServices\"><\/a>  <\/p>\n<h3 id=\"ispolzovanie-generiruemyh-servisov\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432<\/h3>\n<p>  <\/p>\n<p>\u041c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043e\u0441\u0442\u0440\u044f\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Angular-\u0441\u0435\u0440\u0432\u0438\u0441\u044b.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u0445\u0435\u043c\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430 \u0434\u043b\u044f Angular-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439<\/b><\/p>\n<div class=\"spoiler_text\">\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c <code>ApiModule<\/code> \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430\u0445 \u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">import {     ApiModule,     API_ERROR_HANDLER } from '@codegena\/ng-api-service';  import {     CreateGroupItemService,     GetGroupsService,     GetGroupItemsService,     UpdateFewItemsService } from '@codegena\/todo-app-scheme';  @NgModule({     imports: [         ApiModule,         \/\/ ...     ],     providers: [         RewriteGroupService,         {             provide: API_ERROR_HANDLER,             useClass: ApiErrorHandlerService         },         \/\/ ...     ],     \/\/ ... }) export class TodoAppModule { }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432 \u043c\u043e\u0434\u0443\u043b\u044c, \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u043b\u044f [\u0438\u043d\u0436\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f])(<a href=\"https:\/\/angular.io\/guide\/dependency-injection\">https:\/\/angular.io\/guide\/dependency-injection<\/a>):<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">@Injectable() export class TodoTasksStore {      constructor(         protected createGroupItemService: CreateGroupItemService,         protected getGroupsService: GetGroupsService,         protected getGroupItemsService: GetGroupItemsService,         protected updateFewItemsService: UpdateFewItemsService     ) {} }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u0441\u0435 \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u043e\u0431 \u044d\u0442\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u0445 \u2014 \u044d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e \u0443 \u043d\u0438\u0445 \u0435\u0441\u0442\u044c \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/github.com\/koshevy\/codegena\/blob\/d1874f9ab86c6ec2cb966d6de6aef6fe213825f4\/libs\/ng-api-service\/src\/lib\/api.service.ts#L244\">request<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">return this.getGroupsService.request(null, {     isComplete: null,     withItems: false }).pipe(     pickResponseBody&lt;GetGroupsResponse&lt;200&gt;&gt;(200, null, true),     switchMap&lt;ToDoGroup[], Observable&lt;ComponentTruth&gt;&gt;(         groups =&gt; this.loadItemsOfSelectedGroups({             ...truth,             groups         })     ) );<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>request<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f <code>Observable&lt;HttpResponse&lt;R&gt; | HttpEvent&lt;R&gt;&gt;<\/code>, \u0438 \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0444\u0430\u0439\u043b\u043e\u0432, \u0442\u043e \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438. \u041e\u0434\u043d\u0430\u043a\u043e, \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e, \u043c\u044b \u043e\u0436\u0438\u0434\u0430\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0442\u0438\u043f \u043e\u0442\u0432\u0435\u0442\u0430, \u0430 \u0432 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0432\u044b\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435. \u041f\u043e \u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 RxJS-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code>pickResponseBody<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0418 \u0437\u0430\u043f\u0440\u043e\u0441, \u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438, \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u0435, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u0435. \u041f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \u0438 \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a API, \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u042d\u0442\u043e \u0438\u0437\u0431\u0430\u0432\u0438\u0442 \u043d\u0430\u0441 \u043e\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0443\u0442\u0438\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438. \u041a\u0430\u043a \u043c\u044b \u043f\u043e\u043c\u043d\u0438\u043c, \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/3y\/xe\/dy\/3yxedy51z7su99butzrk2dvunnq.png\"\/><\/p>\n<p>  <\/p>\n<p>\u041d\u043e \u044d\u0442\u043e \u043d\u0435 \u0441\u0430\u043c\u0430\u044f \u043d\u0430\u0434\u0435\u0436\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430. \u0412\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u043f\u043e JSON Schema \u0434\u0430\u0441\u0442 \u043d\u0430\u043c \u0431\u043e\u043b\u0435\u0435 \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043e\u0448\u0438\u0431\u043e\u043a \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d &quot;\u0440\u043e\u043d\u044f\u043b&quot; \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435. \u041d\u043e \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0442\u0438\u0445\u043e \u043e\u043f\u043e\u0432\u0435\u0449\u0430\u0442\u044c \u043d\u0430\u0448 <a href=\"https:\/\/sentry.io\/welcome\/\">Sentry<\/a> \u0438\u043b\u0438 <a href=\"https:\/\/www.elastic.co\/products\/kibana\">Kibana<\/a>, \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443. \u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u041f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438 \u0432\u043e\u0432\u0441\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0435\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0442\u043b\u0430\u0434\u043a\u0438.<\/p>\n<p>  <\/p>\n<blockquote><p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u044f \u043d\u0435 \u0441\u043c\u043e\u0433\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431\u043e \u0432\u0441\u0435\u0445 \u043d\u044e\u0430\u043d\u0441\u0430\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435. \u0414\u0430\u0439\u0442\u0435 \u0437\u043d\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u044d\u0442\u0430 \u0442\u0435\u043c\u0430 \ud83d\ude42<\/p><\/blockquote>\n<p>  <a name=\"AfterWord\"><\/a>  <\/p>\n<h2 id=\"vmesto-poslesloviya\">\u0412\u043c\u0435\u0441\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0441\u043b\u043e\u0432\u0438\u044f<\/h2>\n<p>  <\/p>\n<p>\u0415\u0441\u0442\u044c \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432 \u043a\u043e\u043d\u0446\u0435 \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u0441\u043a\u043e\u043c\u043a\u0430\u043d\u043d\u043e\u0439. \u041d\u043e \u044f \u0432\u044b\u0445\u043e\u0436\u0443 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u0441\u0432\u043e\u0435\u0433\u043e \u0442\u0430\u0439\u043c-\u0431\u043e\u043a\u0441\u0430, \u0438 \u0441\u0442\u0440\u043e\u043a\u0438 &quot;\u0442\u0440\u0443\u0434\u043d\u043e \u0432\u044b\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0438 \u043d\u0435 \u0432\u044b\u0441\u043a\u0430\u0437\u0430\u0442\u044c&quot; \u0438\u0437 \u043d\u0435\u0441\u0442\u0430\u0440\u0435\u044e\u0449\u0435\u0439 \u043f\u0435\u0441\u043d\u0438 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e \u043c\u0435\u043d\u044f. \u0412\u0441\u0435 \u0436\u0435, \u044f \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043b\u043e\u0436\u0438\u043b\u0430\u0441\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u0430.<\/p>\n<p>  <\/p>\n<p>\u0427\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u043e\u0433\u043e \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u2014 \u0435\u0433\u043e \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0430\u044f \u0441\u0443\u0434\u044c\u0431\u0430 \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430, \u0438 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u043f\u043b\u0430\u043d\u043e\u0432\/\u0430\u043c\u0431\u0438\u0446\u0438\u0439 \u043d\u0430 \u043d\u0435\u0433\u043e \u043d\u0435\u0442 (\u0438 \u0431\u044b\u0442\u044c \u043d\u0435 \u043c\u043e\u0436\u0435\u0442). \u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0432\u044f\u0437\u044c, \u043b\u044e\u0431\u0430\u044f \u2014 \u0431\u0443\u0434\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430.<\/p>\n<p>  <\/p>\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u0435.<\/p>\n<\/div>\n<p>               <script class=\"js-mediator-script\">!function(e){function t(t,n){if(!(n in e)){for(var r,a=e.document,i=a.scripts,o=i.length;o--;)if(-1!==i[o].src.indexOf(t)){r=i[o];break}if(!r){r=a.createElement(\"script\"),r.type=\"text\/javascript\",r.async=!0,r.defer=!0,r.src=t,r.charset=\"UTF-8\";var d=function(){var e=a.getElementsByTagName(\"script\")[0];e.parentNode.insertBefore(r,e)};\"[object Opera]\"==e.opera?a.addEventListener?a.addEventListener(\"DOMContentLoaded\",d,!1):e.attachEvent(\"onload\",d):d() } } }t(\"\/\/mediator.mail.ru\/script\/2820404\/\",\"_mediator\")}(window);<\/script>      <br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/483628\/\"> https:\/\/habr.com\/ru\/post\/483628\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/483628\/\">\n<p>\u0414\u0432\u0430 \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434 \u044f \u043d\u0430\u0447\u0430\u043b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 <del>\u0435\u0449\u0435 \u043e\u0434\u043d\u043e\u0433\u043e<\/del> \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0438\u0437 <a href=\"https:\/\/swagger.io\/docs\/specification\/about\/\">OpenAPI Specification<\/a> v3 \u0432 TypeScript (\u043e\u043d <a href=\"https:\/\/github.com\/koshevy\/codegena#codegeneration-from-oas3\">\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 Github<\/a>). \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e, \u044f \u0437\u0430\u0434\u0430\u043b\u0441\u044f \u0446\u0435\u043b\u044c\u044e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0443\u044e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0445 \u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 TypeScript, \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 <a href=\"https:\/\/json-schema.org\/\">JSON Schema<\/a>, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a <a href=\"https:\/\/json-schema.org\/understanding-json-schema\/reference\/combining.html\">oneOf\/anyOf\/allOf<\/a> \u0438 \u0442.\u043f. (\u0443 <a href=\"https:\/\/github.com\/swagger-api\/swagger-codegen\">\u0440\u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/a> \u043e\u0442 Swagger \u0441 \u044d\u0442\u0438\u043c \u0431\u044b\u043b\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b). \u0414\u0440\u0443\u0433\u0430\u044f \u0438\u0434\u0435\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u043b\u0430\u0441\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0445\u0435\u043c\u044b \u0438\u0437 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0439 \u0434\u043b\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u043d\u0430 \u0444\u0440\u043e\u043d\u0442\u0435, \u0431\u044d\u043a\u0435 \u0438 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0447\u0430\u0441\u0442\u044f\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/hz\/cd\/u4\/hzcdu47rcjbutgqbe6pdb2k46x8.png\"\/><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-297014","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/297014","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=297014"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/297014\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=297014"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=297014"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=297014"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}