{"id":65361,"date":"2024-06-06T06:44:05","date_gmt":"2024-06-06T03:14:05","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/bringing-it-all-together-integrating-graphql-with-gin-in-go-49b9\/"},"modified":"2024-06-06T06:44:05","modified_gmt":"2024-06-06T03:14:05","slug":"bringing-it-all-together-integrating-graphql-with-gin-in-go-49b9","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/bringing-it-all-together-integrating-graphql-with-gin-in-go-49b9\/","title":{"rendered":"\u06af\u0631\u062f\u0622\u0648\u0631\u06cc \u0647\u0645\u0647 \u0686\u06cc\u0632: \u0627\u062f\u063a\u0627\u0645 GraphQL \u0628\u0627 Gin in Go"},"content":{"rendered":"<div data-article-id=\"1878629\" id=\"article-body\">\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0645\u0631\u062d\u0644\u0647 \u0627\u0632 \u0633\u0641\u0631 \u062e\u0648\u062f\u060c \u0628\u0647 \u062d\u0648\u0632\u0647 \u0627\u062f\u063a\u0627\u0645 \u0645\u06cc\u0627\u0646\u200c\u0627\u0641\u0632\u0627\u0631 \u0628\u0627 \u062c\u06cc\u0646 \u0648 \u0627\u062c\u0631\u0627\u06cc \u0645\u06cc\u0627\u0646\u200c\u0627\u0641\u0632\u0627\u0631 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 gocloak \u0645\u06cc\u200c\u067e\u0631\u062f\u0627\u0632\u06cc\u0645.  \u0628\u0627 \u062a\u06a9\u06cc\u0647 \u0628\u0631 \u0645\u0628\u0646\u0627\u06cc\u06cc \u06a9\u0647 \u062f\u0631 \u0628\u062e\u0634\u200c\u0647\u0627\u06cc \u0642\u0628\u0644\u06cc \u06af\u0630\u0627\u0634\u062a\u0647 \u0634\u062f\u060c \u0627\u06a9\u0646\u0648\u0646 \u062a\u0644\u0627\u0634\u200c\u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 \u0627\u062f\u063a\u0627\u0645 \u0645\u06cc\u0627\u0646\u200c\u0627\u0641\u0632\u0627\u0631 \u0628\u0647\u200c\u0637\u0648\u0631 \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u062f\u0631 \u0633\u0631\u0648\u0631 GraphQL \u062e\u0648\u062f \u0645\u062a\u062d\u062f \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645.  \u0628\u0627 \u062c\u06cc\u0646\u060c \u06cc\u06a9 \u0686\u0627\u0631\u0686\u0648\u0628 \u0648\u0628 \u0642\u062f\u0631\u062a\u0645\u0646\u062f HTTP \u0628\u0631\u0627\u06cc Go\u060c \u0645\u0627 \u0642\u0627\u0628\u0644\u06cc\u062a\u200c\u0647\u0627\u06cc \u0633\u0631\u0648\u0631 \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 \u062a\u0631\u06a9\u06cc\u0628 \u062a\u0648\u0627\u0628\u0639 \u0645\u06cc\u0627\u0646\u200c\u0627\u0641\u0632\u0627\u0631 \u0628\u0631\u0627\u06cc \u067e\u06cc\u0634 \u067e\u0631\u062f\u0627\u0632\u0634 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627 \u0627\u0641\u0632\u0627\u06cc\u0634 \u0645\u06cc\u200c\u062f\u0647\u06cc\u0645.  \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 gocloak\u060c \u06cc\u06a9 \u0645\u0627\u0698\u0648\u0644 Go \u0628\u0631\u0627\u06cc \u0631\u0627\u0628\u0637 \u0628\u0627 Keycloak\u060c \u0645\u0627 \u0633\u0631\u0648\u0631 \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u06cc\u0645\u0646 \u0645\u06cc \u06a9\u0646\u06cc\u0645.  \u0627\u06cc\u0646 \u0645\u0631\u062d\u0644\u0647 \u0645\u062d\u0648\u0631\u06cc \u0646\u0634\u0627\u0646\u200c\u062f\u0647\u0646\u062f\u0647 \u0647\u0645\u06af\u0631\u0627\u06cc\u06cc \u0647\u0645\u0647 \u0639\u0646\u0627\u0635\u0631 \u0642\u0628\u0644\u06cc \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631 \u0627\u06cc\u062c\u0627\u062f \u062a\u0627\u0628\u0639 \u0627\u062c\u0631\u0627\u06cc \u0633\u0631\u0648\u0631\u060c \u06a9\u0647 \u0627\u062c\u0631\u0627\u06cc \u0633\u0631\u0648\u0631 GraphQL API \u0645\u0627 \u0631\u0627 \u0647\u0645\u0627\u0647\u0646\u06af \u0645\u06cc\u200c\u06a9\u0646\u062f\u060c \u0628\u0647 \u0627\u0648\u062c \u062e\u0648\u062f \u0645\u06cc\u200c\u0631\u0633\u062f.  \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u0627\u06cc\u0646 \u0645\u0624\u0644\u0641\u0647 \u0647\u0627 \u0628\u0631\u0627\u06cc \u0627\u0631\u062a\u0642\u0627\u0621 \u0639\u0645\u0644\u06a9\u0631\u062f \u0648 \u0627\u0645\u0646\u06cc\u062a \u0633\u0631\u0648\u0631 \u0645\u0627 \u0647\u0645\u0627\u0647\u0646\u06af \u0645\u06cc \u0634\u0648\u0646\u062f.<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/bringing-it-all-together-integrating-graphql-with-gin-in-go-49b9\/#%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%D9%85%DB%8C%D8%A7%D9%86_%D8%A7%D9%81%D8%B2%D8%A7%D8%B1_%D8%A7%D8%AD%D8%B1%D8%A7%D8%B2_%D9%87%D9%88%DB%8C%D8%AA_%D8%A8%D8%A7_Keycloak_%D9%88_Gocloak\" >\u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0628\u0627 Keycloak \u0648 Gocloak<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/bringing-it-all-together-integrating-graphql-with-gin-in-go-49b9\/#%D9%86%D9%87%D8%A7%DB%8C%DB%8C_%DA%A9%D8%B1%D8%AF%D9%86_%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_%D8%B3%D8%B1%D9%88%D8%B1_%D8%B9%D9%85%D9%84%DA%A9%D8%B1%D8%AF_%D8%A7%D8%AC%D8%B1%D8%A7\" >\u0646\u0647\u0627\u06cc\u06cc \u06a9\u0631\u062f\u0646 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u0633\u0631\u0648\u0631: \u0639\u0645\u0644\u06a9\u0631\u062f \u0627\u062c\u0631\u0627<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/bringing-it-all-together-integrating-graphql-with-gin-in-go-49b9\/#%D9%86%DA%A9%D8%A7%D8%AA_%D9%BE%D8%A7%DB%8C%D8%A7%D9%86%DB%8C_%D8%A8%D8%A7%D8%B2%D8%A8%DB%8C%D9%86%DB%8C_GraphQL\" >\u0646\u06a9\u0627\u062a \u067e\u0627\u06cc\u0627\u0646\u06cc: \u0628\u0627\u0632\u0628\u06cc\u0646\u06cc GraphQL<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/bringing-it-all-together-integrating-graphql-with-gin-in-go-49b9\/#%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%DA%AF%DB%8C%D8%B1%DB%8C_%D9%87%D9%85%D9%87_%D8%B1%D8%A7_%D8%A8%D8%A7_%D9%87%D9%85_%D8%AC%D9%85%D8%B9_%DA%A9%D9%86%DB%8C%D8%AF\" >\u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc: \u0647\u0645\u0647 \u0631\u0627 \u0628\u0627 \u0647\u0645 \u062c\u0645\u0639 \u06a9\u0646\u06cc\u062f<\/a><\/li><\/ul><\/nav><\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%D9%85%DB%8C%D8%A7%D9%86_%D8%A7%D9%81%D8%B2%D8%A7%D8%B1_%D8%A7%D8%AD%D8%B1%D8%A7%D8%B2_%D9%87%D9%88%DB%8C%D8%AA_%D8%A8%D8%A7_Keycloak_%D9%88_Gocloak\"><\/span>\n<p>  \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0628\u0627 Keycloak \u0648 Gocloak<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631 \u0646\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0628\u0627\u06cc\u062f \u0628\u0647 \u0633\u0631\u0648\u0631 \u062e\u0648\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u0645 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u0633\u062a.  \u062f\u0631 \u0627\u06cc\u0646 \u0645\u062b\u0627\u0644\u060c \u0627\u0632 Keycloak \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0627\u0631\u0627\u0626\u0647\u200c\u062f\u0647\u0646\u062f\u0647 \u0647\u0648\u06cc\u062a \u062e\u0648\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645.  \u0628\u0631\u0627\u06cc \u0627\u0631\u062a\u0628\u0627\u0637 \u0628\u0627 Keycloak \u062f\u0631 Go\u060c \u0627\u0632 \u0645\u0627\u0698\u0648\u0644 gocloak \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645.  \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 gocloak\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u0645 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0645\u06cc\u0627\u0646\u200c\u0627\u0641\u0632\u0627\u0631 Gin \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0631\u0627 \u062f\u0631 \u0628\u0631\u0627\u0628\u0631 Keycloak \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u0645.<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631\u060c \u0628\u0627 \u062a\u0639\u06cc\u06cc\u0646 \u0647\u062f\u0631\u06cc \u06a9\u0647 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u0627\u0632 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u0645\u060c \u0634\u0631\u0648\u0639 \u0645\u06cc \u06a9\u0646\u06cc\u0645.  Keycloak \u0627\u0632 \u067e\u0631\u0648\u062a\u06a9\u0644 OpenID Connect \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0645\u0627 \u0627\u0646\u062a\u0638\u0627\u0631 \u062f\u0627\u0631\u06cc\u0645 <code>Authorization<\/code> \u0647\u062f\u0631 \u0628\u0631\u0627\u06cc \u0634\u0631\u0648\u0639 \u0628\u0627 \u06a9\u0644\u0645\u0647 &#8220;Bearer&#8221; \u0648 \u0628\u0647 \u062f\u0646\u0628\u0627\u0644 \u0622\u0646 \u06cc\u06a9 \u0641\u0627\u0635\u0644\u0647 \u0648 \u0633\u067e\u0633 \u0631\u0634\u062a\u0647 \u062a\u0648\u06a9\u0646 \u06a9\u0627\u0645\u0644.  \u062f\u0631 \u0632\u06cc\u0631\u060c \u062b\u0627\u0628\u062a \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u06a9\u0646\u06cc\u0645 <code>\"Bearer \"<\/code> \u0628\u0647 \u0627\u06cc\u0646 \u0645\u0646\u0638\u0648\u0631:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight go\"><code><span class=\"k\">const<\/span> <span class=\"n\">headerPrefix<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"Bearer \"<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062f\u0631 \u0645\u0631\u062d\u0644\u0647 \u0628\u0639\u062f\u060c \u0628\u0627\u06cc\u062f \u062a\u0648\u06a9\u0646 \u0631\u0627 \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u06cc\u0645.  \u0628\u0631\u0627\u06cc \u0631\u0633\u06cc\u062f\u0646 \u0628\u0647 \u0627\u06cc\u0646 \u0647\u062f\u0641\u060c \u062a\u0627\u0628\u0639\u06cc \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0646\u0634\u0627\u0646\u06af\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 Gorm \u0631\u0627 \u0645\u06cc \u067e\u0630\u06cc\u0631\u062f (<code>*gorm.DB<\/code>) \u0648 \u06cc\u06a9 \u0646\u0634\u0627\u0646\u06af\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a HTTP (<code>*http.Request<\/code>).  \u0627\u06cc\u0646 \u062a\u0627\u0628\u0639 \u0647\u062f\u0631 Authorization \u0631\u0627 \u0627\u0632 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u0645\u06cc\u200c\u06a9\u0646\u062f\u060c \u062a\u0648\u06a9\u0646 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Keycloak \u062a\u0623\u06cc\u06cc\u062f \u0645\u06cc\u200c\u06a9\u0646\u062f \u0648 \u062f\u0631 \u0635\u0648\u0631\u062a \u06cc\u0627\u0641\u062a\u0646 \u0645\u0637\u0627\u0628\u0642\u062a \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647\u060c \u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u0628\u0631\u0645\u06cc\u200c\u06af\u0631\u062f\u0627\u0646\u062f.  \u0627\u06af\u0631 \u062a\u0645\u0627\u0633 \u0647\u0627 \u0628\u0627 \u0645\u0648\u0641\u0642\u06cc\u062a \u062a\u06a9\u0645\u06cc\u0644 \u0646\u0634\u0648\u062f\u060c \u0639\u0645\u0644\u06a9\u0631\u062f \u06cc\u06a9 \u062e\u0637\u0627 \u0628\u0631\u0645\u06cc \u06af\u0631\u062f\u0627\u0646\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight go\"><code><span class=\"k\">func<\/span> <span class=\"n\">ValidateToken<\/span><span class=\"p\">(<\/span><span class=\"n\">db<\/span> <span class=\"o\">*<\/span><span class=\"n\">gorm<\/span><span class=\"o\">.<\/span><span class=\"n\">DB<\/span><span class=\"p\">,<\/span> <span class=\"n\">req<\/span> <span class=\"o\">*<\/span><span class=\"n\">http<\/span><span class=\"o\">.<\/span><span class=\"n\">Request<\/span><span class=\"p\">)<\/span> <span class=\"p\">(<\/span><span class=\"o\">*<\/span><span class=\"n\">model<\/span><span class=\"o\">.<\/span><span class=\"n\">User<\/span><span class=\"p\">,<\/span> <span class=\"kt\">error<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">authToken<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">req<\/span><span class=\"o\">.<\/span><span class=\"n\">Header<\/span><span class=\"o\">.<\/span><span class=\"n\">Get<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Authorization\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">authToken<\/span> <span class=\"o\">=<\/span> <span class=\"n\">strings<\/span><span class=\"o\">.<\/span><span class=\"n\">TrimPrefix<\/span><span class=\"p\">(<\/span><span class=\"n\">authToken<\/span><span class=\"p\">,<\/span> <span class=\"n\">headerPrefix<\/span><span class=\"p\">)<\/span> <span class=\"c\">\/\/ Strip the \"Auth \" from the bearer token<\/span>\n    <span class=\"n\">keycloak<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">config<\/span><span class=\"o\">.<\/span><span class=\"n\">Config<\/span><span class=\"o\">.<\/span><span class=\"n\">Auth<\/span>\n\n    <span class=\"c\">\/\/ Make call to keycloak authenticating the token<\/span>\n    <span class=\"n\">client<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">gocloak<\/span><span class=\"o\">.<\/span><span class=\"n\">NewClient<\/span><span class=\"p\">(<\/span><span class=\"n\">keycloak<\/span><span class=\"o\">.<\/span><span class=\"n\">Endpoint<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"c\">\/\/ Add certificate verification if a certificate path is set<\/span>\n    <span class=\"k\">if<\/span> <span class=\"nb\">len<\/span><span class=\"p\">(<\/span><span class=\"n\">keycloak<\/span><span class=\"o\">.<\/span><span class=\"n\">CertificatePath<\/span><span class=\"p\">)<\/span> <span class=\"o\">&gt;<\/span> <span class=\"m\">0<\/span> <span class=\"p\">{<\/span>\n        <span class=\"n\">log<\/span><span class=\"o\">.<\/span><span class=\"n\">Infof<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Reading certificate from %s...\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">keycloak<\/span><span class=\"o\">.<\/span><span class=\"n\">CertificatePath<\/span><span class=\"p\">)<\/span>\n        <span class=\"n\">cert<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">os<\/span><span class=\"o\">.<\/span><span class=\"n\">ReadFile<\/span><span class=\"p\">(<\/span><span class=\"n\">keycloak<\/span><span class=\"o\">.<\/span><span class=\"n\">CertificatePath<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\n            <span class=\"n\">log<\/span><span class=\"o\">.<\/span><span class=\"n\">Errorf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"[identity.cert] Unable to read certificate =&gt; %v\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span><span class=\"p\">)<\/span>\n            <span class=\"k\">return<\/span> <span class=\"no\">nil<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span>\n        <span class=\"p\">}<\/span>\n        <span class=\"n\">certPool<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">x509<\/span><span class=\"o\">.<\/span><span class=\"n\">NewCertPool<\/span><span class=\"p\">()<\/span>\n        <span class=\"k\">if<\/span> <span class=\"n\">ok<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">certPool<\/span><span class=\"o\">.<\/span><span class=\"n\">AppendCertsFromPEM<\/span><span class=\"p\">(<\/span><span class=\"n\">cert<\/span><span class=\"p\">);<\/span> <span class=\"o\">!<\/span><span class=\"n\">ok<\/span> <span class=\"p\">{<\/span>\n            <span class=\"n\">log<\/span><span class=\"o\">.<\/span><span class=\"n\">Errorf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"[identity.cert] Unable to add cert to pool =&gt; %v\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span><span class=\"p\">)<\/span>\n            <span class=\"k\">return<\/span> <span class=\"no\">nil<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span>\n        <span class=\"p\">}<\/span>\n        <span class=\"n\">restyClient<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">client<\/span><span class=\"o\">.<\/span><span class=\"n\">RestyClient<\/span><span class=\"p\">()<\/span>\n        <span class=\"n\">restyClient<\/span><span class=\"o\">.<\/span><span class=\"n\">SetTLSClientConfig<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"n\">tls<\/span><span class=\"o\">.<\/span><span class=\"n\">Config<\/span><span class=\"p\">{<\/span><span class=\"n\">RootCAs<\/span><span class=\"o\">:<\/span> <span class=\"n\">certPool<\/span><span class=\"p\">})<\/span>\n        <span class=\"n\">log<\/span><span class=\"o\">.<\/span><span class=\"n\">Info<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Imported certificate to keycloak client\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"n\">res<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">client<\/span><span class=\"o\">.<\/span><span class=\"n\">RetrospectToken<\/span><span class=\"p\">(<\/span><span class=\"n\">req<\/span><span class=\"o\">.<\/span><span class=\"n\">Context<\/span><span class=\"p\">(),<\/span> <span class=\"n\">authToken<\/span><span class=\"p\">,<\/span> <span class=\"n\">keycloak<\/span><span class=\"o\">.<\/span><span class=\"n\">ClientID<\/span><span class=\"p\">,<\/span> <span class=\"n\">keycloak<\/span><span class=\"o\">.<\/span><span class=\"n\">ClientSecret<\/span><span class=\"p\">,<\/span> <span class=\"n\">keycloak<\/span><span class=\"o\">.<\/span><span class=\"n\">RealmName<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\n        <span class=\"n\">log<\/span><span class=\"o\">.<\/span><span class=\"n\">Errorf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"unable to validate access token =&gt; %v\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">return<\/span> <span class=\"no\">nil<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span>\n    <span class=\"p\">}<\/span>\n    <span class=\"n\">log<\/span><span class=\"o\">.<\/span><span class=\"n\">Debugf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"[auth] Access Token =&gt; %v\"<\/span><span class=\"p\">,<\/span> <span class=\"o\">*<\/span><span class=\"n\">res<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">if<\/span> <span class=\"o\">!*<\/span><span class=\"n\">res<\/span><span class=\"o\">.<\/span><span class=\"n\">Active<\/span> <span class=\"p\">{<\/span>\n        <span class=\"n\">err<\/span> <span class=\"o\">=<\/span> <span class=\"n\">errors<\/span><span class=\"o\">.<\/span><span class=\"n\">New<\/span><span class=\"p\">(<\/span><span class=\"s\">\"session is not active\"<\/span><span class=\"p\">)<\/span>\n        <span class=\"n\">log<\/span><span class=\"o\">.<\/span><span class=\"n\">Errorf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"session is not active =&gt; %v\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">return<\/span> <span class=\"no\">nil<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span>\n    <span class=\"p\">}<\/span>\n    <span class=\"c\">\/\/ fetch userinfo and query the database for the user<\/span>\n    <span class=\"n\">info<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">client<\/span><span class=\"o\">.<\/span><span class=\"n\">GetUserInfo<\/span><span class=\"p\">(<\/span><span class=\"n\">req<\/span><span class=\"o\">.<\/span><span class=\"n\">Context<\/span><span class=\"p\">(),<\/span> <span class=\"n\">authToken<\/span><span class=\"p\">,<\/span> <span class=\"n\">keycloak<\/span><span class=\"o\">.<\/span><span class=\"n\">RealmName<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\n        <span class=\"n\">log<\/span><span class=\"o\">.<\/span><span class=\"n\">Errorf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"unable to fetch user info =&gt; %v\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">return<\/span> <span class=\"no\">nil<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"c\">\/\/ add the user to the database if there is no current entry for the user<\/span>\n    <span class=\"k\">var<\/span> <span class=\"n\">user<\/span> <span class=\"n\">model<\/span><span class=\"o\">.<\/span><span class=\"n\">User<\/span>\n    <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">=<\/span> <span class=\"n\">db<\/span><span class=\"o\">.<\/span><span class=\"n\">FirstOrCreate<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"n\">user<\/span><span class=\"p\">,<\/span> <span class=\"n\">model<\/span><span class=\"o\">.<\/span><span class=\"n\">User<\/span><span class=\"p\">{<\/span>\n        <span class=\"n\">Username<\/span><span class=\"o\">:<\/span> <span class=\"o\">*<\/span><span class=\"n\">info<\/span><span class=\"o\">.<\/span><span class=\"n\">PreferredUsername<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">Name<\/span><span class=\"o\">:<\/span>     <span class=\"n\">fmt<\/span><span class=\"o\">.<\/span><span class=\"n\">Sprintf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"%s %s\"<\/span><span class=\"p\">,<\/span> <span class=\"o\">*<\/span><span class=\"n\">info<\/span><span class=\"o\">.<\/span><span class=\"n\">GivenName<\/span><span class=\"p\">,<\/span> <span class=\"o\">*<\/span><span class=\"n\">info<\/span><span class=\"o\">.<\/span><span class=\"n\">FamilyName<\/span><span class=\"p\">),<\/span>\n    <span class=\"p\">})<\/span><span class=\"o\">.<\/span><span class=\"n\">Error<\/span><span class=\"p\">;<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\n        <span class=\"n\">log<\/span><span class=\"o\">.<\/span><span class=\"n\">Errorf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"unable to save user to database =&gt; %v\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">return<\/span> <span class=\"no\">nil<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"n\">log<\/span><span class=\"o\">.<\/span><span class=\"n\">Debug<\/span><span class=\"p\">(<\/span><span class=\"n\">user<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"k\">return<\/span> <span class=\"o\">&amp;<\/span><span class=\"n\">user<\/span><span class=\"p\">,<\/span> <span class=\"no\">nil<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06cc\u0646 <code>AuthenticationMiddleware<\/code> \u062a\u0627\u0628\u0639 \u0628\u0631\u0627\u06cc \u0627\u062f\u063a\u0627\u0645 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u062f\u0631 \u06cc\u06a9 \u0648\u0628 \u0633\u0631\u0648\u0631 \u062c\u06cc\u0646 \u0637\u0631\u0627\u062d\u06cc \u0634\u062f\u0647 \u0627\u0633\u062a.  \u0627\u06cc\u0646 \u062a\u0627\u0628\u0639 \u06cc\u06a9 \u0646\u0634\u0627\u0646\u06af\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 Gorm \u0645\u06cc \u06af\u06cc\u0631\u062f (<code>*gorm.DB<\/code>) \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0622\u0631\u06af\u0648\u0645\u0627\u0646 \u0648 \u062a\u0627\u0628\u0639 Gin handler \u0631\u0627 \u0628\u0631\u0645\u06cc \u06af\u0631\u062f\u0627\u0646\u062f.  \u062f\u0631 \u062f\u0627\u062e\u0644 \u06af\u0631\u062f\u0627\u0646\u0646\u062f\u0647\u060c \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631 \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u0645\u06cc \u06a9\u0646\u062f <code>ValidateToken<\/code> \u062a\u0627\u0628\u0639\u060c \u0646\u0634\u0627\u0646\u06af\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0648 \u062f\u0631\u062e\u0648\u0627\u0633\u062a HTTP \u0641\u0639\u0644\u06cc \u0631\u0627 \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc \u06a9\u0646\u062f.  \u0627\u06af\u0631 \u0627\u0639\u062a\u0628\u0627\u0631 \u0633\u0646\u062c\u06cc \u062a\u0648\u06a9\u0646 \u0646\u0627\u0645\u0648\u0641\u0642 \u0628\u0627\u0634\u062f\u060c \u06cc\u06a9 \u062e\u0637\u0627 \u062b\u0628\u062a \u0645\u06cc \u0634\u0648\u062f \u0648 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0628\u0627 \u0648\u0636\u0639\u06cc\u062a HTTP 403 (\u0645\u0645\u0646\u0648\u0639) \u0644\u063a\u0648 \u0645\u06cc \u0634\u0648\u062f.  \u0627\u06af\u0631 \u062a\u0648\u06a9\u0646 \u0628\u0627 \u0645\u0648\u0641\u0642\u06cc\u062a \u062a\u0623\u06cc\u06cc\u062f \u0634\u0648\u062f\u060c \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u06a9\u0627\u0631\u0628\u0631 \u0628\u0647 \u0632\u0645\u06cc\u0646\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc \u0634\u0648\u062f \u0648 \u0628\u0647 \u06a9\u0646\u062a\u0631\u0644 \u06a9\u0646\u0646\u062f\u0647 \u0647\u0627\u06cc \u067e\u0627\u06cc\u06cc\u0646 \u062f\u0633\u062a\u06cc \u0627\u0645\u06a9\u0627\u0646 \u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0647 \u0622\u0646 \u0631\u0627 \u0645\u06cc \u062f\u0647\u062f.  \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a\u060c \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631 \u062a\u0645\u0627\u0633 \u0645\u06cc \u06af\u06cc\u0631\u062f <code>c.Next()<\/code> \u0628\u0631\u0627\u06cc \u0627\u0646\u062a\u0642\u0627\u0644 \u06a9\u0646\u062a\u0631\u0644 \u0628\u0647 \u06a9\u0646\u062a\u0631\u0644 \u06a9\u0646\u0646\u062f\u0647 \u0628\u0639\u062f\u06cc \u062f\u0631 \u0632\u0646\u062c\u06cc\u0631\u0647.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight go\"><code><span class=\"k\">func<\/span> <span class=\"n\">AuthenticationMiddleware<\/span><span class=\"p\">(<\/span><span class=\"n\">db<\/span> <span class=\"o\">*<\/span><span class=\"n\">gorm<\/span><span class=\"o\">.<\/span><span class=\"n\">DB<\/span><span class=\"p\">)<\/span> <span class=\"n\">gin<\/span><span class=\"o\">.<\/span><span class=\"n\">HandlerFunc<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"k\">func<\/span><span class=\"p\">(<\/span><span class=\"n\">c<\/span> <span class=\"o\">*<\/span><span class=\"n\">gin<\/span><span class=\"o\">.<\/span><span class=\"n\">Context<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"n\">user<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">ValidateToken<\/span><span class=\"p\">(<\/span><span class=\"n\">db<\/span><span class=\"p\">,<\/span> <span class=\"n\">c<\/span><span class=\"o\">.<\/span><span class=\"n\">Request<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\n            <span class=\"n\">log<\/span><span class=\"o\">.<\/span><span class=\"n\">Errorf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"unable to authenticate token =&gt; %v\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span><span class=\"p\">)<\/span>\n            <span class=\"n\">err<\/span> <span class=\"o\">=<\/span> <span class=\"n\">c<\/span><span class=\"o\">.<\/span><span class=\"n\">AbortWithError<\/span><span class=\"p\">(<\/span><span class=\"n\">http<\/span><span class=\"o\">.<\/span><span class=\"n\">StatusForbidden<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span><span class=\"p\">)<\/span>\n            <span class=\"n\">log<\/span><span class=\"o\">.<\/span><span class=\"n\">Debug<\/span><span class=\"p\">(<\/span><span class=\"n\">err<\/span><span class=\"p\">)<\/span>\n            <span class=\"k\">return<\/span>\n        <span class=\"p\">}<\/span>\n\n        <span class=\"n\">c<\/span><span class=\"o\">.<\/span><span class=\"n\">Request<\/span> <span class=\"o\">=<\/span> <span class=\"n\">c<\/span><span class=\"o\">.<\/span><span class=\"n\">Request<\/span><span class=\"o\">.<\/span><span class=\"n\">WithContext<\/span><span class=\"p\">(<\/span><span class=\"n\">context<\/span><span class=\"o\">.<\/span><span class=\"n\">WithValue<\/span><span class=\"p\">(<\/span><span class=\"n\">c<\/span><span class=\"o\">.<\/span><span class=\"n\">Request<\/span><span class=\"o\">.<\/span><span class=\"n\">Context<\/span><span class=\"p\">(),<\/span> <span class=\"n\">userKey<\/span><span class=\"p\">,<\/span> <span class=\"n\">user<\/span><span class=\"p\">))<\/span>\n        <span class=\"n\">c<\/span><span class=\"o\">.<\/span><span class=\"n\">Next<\/span><span class=\"p\">()<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062f\u0631 \u0646\u0647\u0627\u06cc\u062a\u060c <code>ForUser<\/code> \u062a\u0627\u0628\u0639 \u0628\u0631\u0627\u06cc \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u06a9\u0627\u0631\u0628\u0631 \u062a\u0623\u06cc\u06cc\u062f \u0634\u062f\u0647 \u0627\u0632 \u0632\u0645\u06cc\u0646\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u062f\u0631 \u06cc\u06a9 \u0648\u0628 \u0633\u0631\u0648\u0631 Gin \u0637\u0631\u0627\u062d\u06cc \u0634\u062f\u0647 \u0627\u0633\u062a.  \u0627\u06cc\u0646 \u062a\u0627\u0628\u0639 \u06cc\u06a9 \u0632\u0645\u06cc\u0646\u0647 (<code>ctx<\/code>) \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u0622\u0631\u06af\u0648\u0645\u0627\u0646 \u0648 \u062a\u0644\u0627\u0634 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u06a9\u0627\u0631\u0628\u0631 \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0647 \u062f\u0631 \u0632\u0645\u06cc\u0646\u0647 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06cc\u06a9 \u06a9\u0644\u06cc\u062f \u0627\u0632 \u067e\u06cc\u0634 \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 (<code>userKey<\/code>).  \u0627\u0632 \u0622\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f <code>ctx.Value<\/code> \u0631\u0648\u0634 \u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0647 \u0645\u0642\u062f\u0627\u0631 \u0645\u0631\u062a\u0628\u0637 \u0628\u0627 <code>userKey<\/code> \u0648 \u0628\u0631\u0627\u06cc \u062a\u0628\u062f\u06cc\u0644 \u0622\u0646 \u0628\u0647 a \u06cc\u06a9 \u0646\u0648\u0639 \u0627\u062f\u0639\u0627 \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u062f\u0647\u062f <code>*model.User<\/code>.  \u0627\u06af\u0631 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u06a9\u0627\u0631\u0628\u0631 \u067e\u06cc\u062f\u0627 \u0646\u0634\u062f \u06cc\u0627 \u0646\u0648\u0639 \u0627\u0638\u0647\u0627\u0631 \u0646\u0627\u0645\u0648\u0641\u0642 \u0628\u0648\u062f\u060c \u062a\u0627\u0628\u0639 \u0628\u0631\u0645\u06cc \u06af\u0631\u062f\u062f <code>nil<\/code>.  \u0627\u06cc\u0646 \u062a\u0627\u0628\u0639 \u0627\u0628\u0632\u0627\u0631 \u0628\u0647 \u0633\u0627\u06cc\u0631 \u0628\u062e\u0634\u200c\u0647\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc\u200c\u062f\u0647\u062f \u062a\u0627 \u0628\u0647 \u0631\u0627\u062d\u062a\u06cc \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0634\u062f\u0647 \u0627\u0632 \u0632\u0645\u06cc\u0646\u0647 \u062f\u0633\u062a\u0631\u0633\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0646\u062f \u0648 \u0639\u0645\u0644\u06cc\u0627\u062a \u062e\u0627\u0635 \u06a9\u0627\u0631\u0628\u0631 \u0648 \u0645\u062f\u06cc\u0631\u06cc\u062a \u062f\u0627\u062f\u0647\u200c\u0647\u0627 \u0631\u0627 \u062a\u0633\u0647\u06cc\u0644 \u06a9\u0646\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight go\"><code><span class=\"k\">func<\/span> <span class=\"n\">ForUser<\/span><span class=\"p\">(<\/span><span class=\"n\">ctx<\/span> <span class=\"n\">context<\/span><span class=\"o\">.<\/span><span class=\"n\">Context<\/span><span class=\"p\">)<\/span> <span class=\"o\">*<\/span><span class=\"n\">model<\/span><span class=\"o\">.<\/span><span class=\"n\">User<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">user<\/span><span class=\"p\">,<\/span> <span class=\"n\">_<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">ctx<\/span><span class=\"o\">.<\/span><span class=\"n\">Value<\/span><span class=\"p\">(<\/span><span class=\"n\">userKey<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"p\">(<\/span><span class=\"o\">*<\/span><span class=\"n\">model<\/span><span class=\"o\">.<\/span><span class=\"n\">User<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">return<\/span> <span class=\"n\">user<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D9%86%D9%87%D8%A7%DB%8C%DB%8C_%DA%A9%D8%B1%D8%AF%D9%86_%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_%D8%B3%D8%B1%D9%88%D8%B1_%D8%B9%D9%85%D9%84%DA%A9%D8%B1%D8%AF_%D8%A7%D8%AC%D8%B1%D8%A7\"><\/span>\n<p>  \u0646\u0647\u0627\u06cc\u06cc \u06a9\u0631\u062f\u0646 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u0633\u0631\u0648\u0631: \u0639\u0645\u0644\u06a9\u0631\u062f \u0627\u062c\u0631\u0627<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0628\u0627 \u0648\u062c\u0648\u062f \u062a\u0645\u0627\u0645 \u0627\u062c\u0632\u0627\u06cc \u0645\u06cc\u0627\u0646\u200c\u0627\u0641\u0632\u0627\u0631\u06cc \u06a9\u0647 \u062f\u0631 \u0633\u0631\u062a\u0627\u0633\u0631 \u0633\u0631\u06cc \u0627\u06cc\u062c\u0627\u062f \u0634\u062f\u0647\u200c\u0627\u0646\u062f\u060c \u0632\u0645\u0627\u0646 \u0622\u0646 \u0631\u0633\u06cc\u062f\u0647 \u0627\u0633\u062a \u06a9\u0647 \u0647\u0645\u0647 \u0686\u06cc\u0632 \u0631\u0627 \u0628\u0627 \u0647\u0645 \u062c\u0645\u0639 \u06a9\u0646\u06cc\u0645 \u0648 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0633\u0631\u0648\u0631 \u0631\u0627 \u0646\u0647\u0627\u06cc\u06cc \u06a9\u0646\u06cc\u0645.  \u0627\u06cc\u0646 <code>Run<\/code> \u062a\u0627\u0628\u0639 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0686\u0633\u0628 \u0639\u0645\u0644 \u0645\u06cc \u06a9\u0646\u062f\u060c \u0627\u062f\u063a\u0627\u0645 \u0627\u062c\u0632\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631 \u0631\u0627 \u0647\u0645\u0627\u0647\u0646\u06af \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0633\u0631\u0648\u0631 \u062c\u06cc\u0646 \u0631\u0627 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u0645\u06cc \u06a9\u0646\u062f.  \u0627\u06cc\u0646 \u062a\u0627\u0628\u0639 \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0631\u0648\u062a\u0631 Gin \u0631\u0627 \u0645\u0642\u062f\u0627\u0631\u062f\u0647\u06cc \u0627\u0648\u0644\u06cc\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f\u060c \u0644\u0627\u06cc\u0647\u200c\u0647\u0627\u06cc \u0645\u06cc\u0627\u0646\u200c\u0627\u0641\u0632\u0627\u0631 \u0631\u0627 \u0628\u0647 \u062a\u0631\u062a\u06cc\u0628 \u062f\u0644\u062e\u0648\u0627\u0647 \u0627\u0639\u0645\u0627\u0644 \u0645\u06cc\u200c\u06a9\u0646\u062f \u0648 \u0645\u0633\u06cc\u0631\u0647\u0627 \u06cc\u0627 \u0646\u0642\u0627\u0637 \u067e\u0627\u06cc\u0627\u0646\u06cc \u0631\u0627 \u0628\u0631\u0627\u06cc \u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u062f\u0631\u06cc\u0627\u0641\u062a\u06cc \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc\u200c\u06a9\u0646\u062f.  \u0627\u06cc\u0646 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0633\u0631\u0648\u0631 \u0631\u0627 \u06a9\u067e\u0633\u0648\u0644\u0647 \u0645\u06cc \u06a9\u0646\u062f \u0648 \u06cc\u06a9 \u0646\u0642\u0637\u0647 \u0648\u0631\u0648\u062f\u06cc \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u0628\u0631\u0627\u06cc \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u0648\u0628 \u0633\u0631\u0648\u0631 \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc \u06a9\u0646\u062f.  \u0628\u0627 \u0627\u062f\u063a\u0627\u0645 \u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc \u0645\u06cc\u0627\u0646\u200c\u0627\u0641\u0632\u0627\u0631 \u0648 \u0645\u0646\u0637\u0642 \u0627\u0648\u0644\u06cc\u0647\u200c\u0633\u0627\u0632\u06cc \u0633\u0631\u0648\u0631 \u062f\u0631 \u06cc\u06a9 \u0639\u0645\u0644\u06a9\u0631\u062f \u0648\u0627\u062d\u062f\u060c \u0627\u0632 \u062b\u0628\u0627\u062a\u060c \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u0648 \u0633\u0647\u0648\u0644\u062a \u0645\u062f\u06cc\u0631\u06cc\u062a \u0628\u0631\u0627\u06cc \u06a9\u0644 \u0628\u0631\u0646\u0627\u0645\u0647 \u0633\u0631\u0648\u0631 \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645.<\/p>\n<p>\u0627\u06cc\u0646 <code>Run<\/code> \u062a\u0627\u0628\u0639 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0633\u0631\u0648\u0631 \u0631\u0627 \u062a\u0646\u0638\u06cc\u0645 \u0645\u06cc \u06a9\u0646\u062f\u060c \u0645\u0633\u06cc\u0631\u0647\u0627 \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u06a9\u0646\u062f\u060c \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631 \u0631\u0627 \u0627\u0639\u0645\u0627\u0644 \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0633\u0631\u0648\u0631 \u0631\u0627 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u0645\u06cc \u06a9\u0646\u062f.  \u0633\u0631\u0648\u0631 \u0631\u0627 \u0628\u0627 \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631 \u067e\u06cc\u0634 \u0641\u0631\u0636 Gin \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u0645\u06cc \u06a9\u0646\u062f\u060c \u0646\u0642\u0627\u0637 \u067e\u0627\u06cc\u0627\u0646\u06cc \u0631\u0627 \u0628\u0631\u0627\u06cc \u0645\u062d\u0631\u06a9\u060c \u0632\u0645\u06cc\u0646 \u0628\u0627\u0632\u06cc GraphQL \u0648 \u062e\u0648\u062f GraphQL \u062a\u0646\u0638\u06cc\u0645 \u0645\u06cc \u06a9\u0646\u062f.  \u067e\u0634\u062a\u0647 \u0645\u06cc\u0627\u0646\u200c\u0627\u0641\u0632\u0627\u0631 \u0634\u0627\u0645\u0644 \u0633\u0631\u0648\u06cc\u0633\u200c\u0647\u0627\u060c \u0645\u06cc\u0627\u0646\u200c\u0627\u0641\u0632\u0627\u0631 \u0628\u0627\u0631\u06af\u0630\u0627\u0631 \u062f\u0627\u062f\u0647\u060c \u0648 \u0645\u06cc\u0627\u0646\u200c\u0627\u0641\u0632\u0627\u0631 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0628\u0631\u0627\u06cc \u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u062c\u0646\u0628\u0647\u200c\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u067e\u0631\u062f\u0627\u0632\u0634 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0648 \u0627\u0645\u0646\u06cc\u062a \u0627\u0633\u062a.  \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a\u060c \u0633\u0631\u0648\u0631 \u0631\u0627 \u0634\u0631\u0648\u0639 \u0645\u06cc \u06a9\u0646\u062f \u062a\u0627 \u0628\u0647 \u0645\u06cc\u0632\u0628\u0627\u0646 \u0648 \u067e\u0648\u0631\u062a \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0634\u062f\u0647 \u06af\u0648\u0634 \u062f\u0647\u062f \u0648 \u0646\u0642\u0637\u0647 \u067e\u0627\u06cc\u0627\u0646\u06cc \u0631\u0627 \u0628\u0631\u0627\u06cc \u0645\u0631\u062c\u0639 \u062b\u0628\u062a \u06a9\u0646\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight go\"><code><span class=\"k\">func<\/span> <span class=\"n\">Run<\/span><span class=\"p\">(<\/span><span class=\"n\">db<\/span> <span class=\"o\">*<\/span><span class=\"n\">gorm<\/span><span class=\"o\">.<\/span><span class=\"n\">DB<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">config<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">config<\/span><span class=\"o\">.<\/span><span class=\"n\">Config<\/span>\n    <span class=\"n\">endpoint<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">fmt<\/span><span class=\"o\">.<\/span><span class=\"n\">Sprintf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"%s:%d\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">config<\/span><span class=\"o\">.<\/span><span class=\"n\">Service<\/span><span class=\"o\">.<\/span><span class=\"n\">Host<\/span><span class=\"p\">,<\/span> <span class=\"n\">config<\/span><span class=\"o\">.<\/span><span class=\"n\">Service<\/span><span class=\"o\">.<\/span><span class=\"n\">Port<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">r<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">gin<\/span><span class=\"o\">.<\/span><span class=\"n\">Default<\/span><span class=\"p\">()<\/span>\n\n    <span class=\"n\">r<\/span><span class=\"o\">.<\/span><span class=\"n\">GET<\/span><span class=\"p\">(<\/span><span class=\"s\">\"\/actuator\/*endpoint\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">handlers<\/span><span class=\"o\">.<\/span><span class=\"n\">ActuatorHandler<\/span><span class=\"p\">(<\/span><span class=\"n\">db<\/span><span class=\"p\">))<\/span>\n    <span class=\"n\">r<\/span><span class=\"o\">.<\/span><span class=\"n\">Use<\/span><span class=\"p\">(<\/span><span class=\"n\">middleware<\/span><span class=\"o\">.<\/span><span class=\"n\">Services<\/span><span class=\"p\">(<\/span><span class=\"n\">db<\/span><span class=\"p\">,<\/span> <span class=\"n\">index<\/span><span class=\"o\">.<\/span><span class=\"n\">IndexConnection<\/span><span class=\"p\">))<\/span>\n    <span class=\"n\">r<\/span><span class=\"o\">.<\/span><span class=\"n\">Use<\/span><span class=\"p\">(<\/span><span class=\"n\">middleware<\/span><span class=\"o\">.<\/span><span class=\"n\">DataloaderMiddleware<\/span><span class=\"p\">())<\/span>\n    <span class=\"n\">r<\/span><span class=\"o\">.<\/span><span class=\"n\">GET<\/span><span class=\"p\">(<\/span><span class=\"n\">config<\/span><span class=\"o\">.<\/span><span class=\"n\">Service<\/span><span class=\"o\">.<\/span><span class=\"n\">PlaygroundPath<\/span><span class=\"p\">,<\/span> <span class=\"n\">handlers<\/span><span class=\"o\">.<\/span><span class=\"n\">PlaygroundHandler<\/span><span class=\"p\">())<\/span>\n    <span class=\"n\">r<\/span><span class=\"o\">.<\/span><span class=\"n\">Use<\/span><span class=\"p\">(<\/span><span class=\"n\">gin<\/span><span class=\"o\">.<\/span><span class=\"n\">Recovery<\/span><span class=\"p\">())<\/span>\n\n    <span class=\"n\">secured<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">r<\/span><span class=\"o\">.<\/span><span class=\"n\">Group<\/span><span class=\"p\">(<\/span><span class=\"n\">config<\/span><span class=\"o\">.<\/span><span class=\"n\">Service<\/span><span class=\"o\">.<\/span><span class=\"n\">Path<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">secured<\/span><span class=\"o\">.<\/span><span class=\"n\">Use<\/span><span class=\"p\">(<\/span><span class=\"n\">middleware<\/span><span class=\"o\">.<\/span><span class=\"n\">AuthenticationMiddleware<\/span><span class=\"p\">(<\/span><span class=\"n\">db<\/span><span class=\"p\">))<\/span>\n    <span class=\"n\">secured<\/span><span class=\"o\">.<\/span><span class=\"n\">POST<\/span><span class=\"p\">(<\/span><span class=\"s\">\"https:\/\/dev.to\/\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">handlers<\/span><span class=\"o\">.<\/span><span class=\"n\">GraphqlHandler<\/span><span class=\"p\">())<\/span>\n\n    <span class=\"n\">log<\/span><span class=\"o\">.<\/span><span class=\"n\">Infof<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Running @ http:\/\/%s\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">endpoint<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">log<\/span><span class=\"o\">.<\/span><span class=\"n\">Fatal<\/span><span class=\"p\">(<\/span><span class=\"n\">r<\/span><span class=\"o\">.<\/span><span class=\"n\">Run<\/span><span class=\"p\">(<\/span><span class=\"n\">endpoint<\/span><span class=\"p\">))<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06cc\u0646 <code>Run<\/code> \u062a\u0627\u0628\u0639 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0646\u0642\u0637\u0647 \u0645\u0631\u06a9\u0632\u06cc \u0645\u0646\u0637\u0642 \u0633\u0631\u0648\u0631 \u0645\u0627 \u0639\u0645\u0644 \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0627\u062f\u063a\u0627\u0645 GraphQL \u0628\u0627 Gin in Go \u0631\u0627 \u0647\u0645\u0627\u0647\u0646\u06af \u0645\u06cc \u06a9\u0646\u062f.  \u06a9\u067e\u0633\u0648\u0644\u0647 \u0634\u062f\u0647 \u062f\u0631 \u062f\u0627\u062e\u0644 <code>pkg\/server<\/code> \u0628\u0633\u062a\u0647\u060c \u0646\u0634\u0627\u0646\u200c\u062f\u0647\u0646\u062f\u0647 \u0627\u0648\u062c \u062a\u0644\u0627\u0634\u200c\u0647\u0627\u06cc \u0645\u0627 \u062f\u0631 \u0645\u0627\u0698\u0648\u0644\u200c\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u0648 \u0644\u0627\u06cc\u0647\u200c\u0647\u0627\u06cc \u0645\u06cc\u0627\u0646\u200c\u0627\u0641\u0632\u0627\u0631 \u0627\u0633\u062a.  \u062f\u0631 \u067e\u0627\u06cc\u06cc\u0646 \u0646\u0642\u0637\u0647 \u0648\u0631\u0648\u062f\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0627\u060c \u0648\u0627\u0642\u0639 \u062f\u0631 <code>cmd\/main.go<\/code>\u060c \u0627\u0633\u062a\u0646\u0627\u062f \u0645\u06cc \u06a9\u0646\u06cc\u0645 <code>server.Run<\/code> \u0628\u0631\u0627\u06cc \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u0633\u0631\u0648\u0631 \u0648 \u0632\u0646\u062f\u0647 \u06a9\u0631\u062f\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u062c\u0647\u0632 \u0628\u0647 GraphQL.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D9%86%DA%A9%D8%A7%D8%AA_%D9%BE%D8%A7%DB%8C%D8%A7%D9%86%DB%8C_%D8%A8%D8%A7%D8%B2%D8%A8%DB%8C%D9%86%DB%8C_GraphQL\"><\/span>\n<p>  \u0646\u06a9\u0627\u062a \u067e\u0627\u06cc\u0627\u0646\u06cc: \u0628\u0627\u0632\u0628\u06cc\u0646\u06cc GraphQL<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u06cc\u0646 <code>GraphqlHandler<\/code> \u062a\u0627\u0628\u0639 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0646\u0642\u0637\u0647 \u0648\u0631\u0648\u062f \u0628\u0631\u0627\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0647\u0627\u06cc GraphQL \u062f\u0631 \u0633\u0631\u0648\u0631 \u0645\u0627 \u0639\u0645\u0644 \u0645\u06cc \u06a9\u0646\u062f.  a \u0631\u0627 \u0645\u0642\u062f\u0627\u0631 \u062f\u0647\u06cc \u0627\u0648\u0644\u06cc\u0647 \u0645\u06cc \u06a9\u0646\u062f <code>config<\/code> \u0633\u0627\u062e\u062a\u0627\u0631 \u0628\u0627 \u062a\u0648\u0627\u0628\u0639 \u062d\u0644 \u06a9\u0646\u0646\u062f\u0647 \u0627\u0631\u0627\u0626\u0647 \u0634\u062f\u0647 \u062a\u0648\u0633\u0637 \u0645\u0627 <code>graph<\/code> \u0628\u0633\u062a\u0647 \u0628\u0646\u062f\u06cc  \u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u0627\u06cc\u0646\u060c \u062f\u0633\u062a\u0648\u0631\u0627\u0644\u0639\u0645\u0644 \u0647\u0627\u06cc\u06cc \u0645\u0627\u0646\u0646\u062f \u0627\u0639\u062a\u0628\u0627\u0631 \u0633\u0646\u062c\u06cc \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062f\u0631 \u0647\u0646\u06af\u0627\u0645 \u0627\u062c\u0631\u0627\u06cc \u067e\u0631\u0633 \u0648 \u062c\u0648 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0645\u06cc \u06a9\u0646\u062f.  \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a\u060c \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06cc\u06a9 \u0647\u0646\u062f\u0644\u0631 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u062f <code>handler.NewDefaultServer<\/code>\u060c \u062f\u0631 \u0637\u0631\u062d\u0648\u0627\u0631\u0647 \u0627\u062c\u0631\u0627\u06cc\u06cc \u0627\u06cc\u062c\u0627\u062f \u0634\u062f\u0647 \u062a\u0648\u0633\u0637 gqlgen \u0628\u0631 \u0627\u0633\u0627\u0633 \u0637\u0631\u062d \u0648 \u062d\u0644 \u06a9\u0646\u0646\u062f\u0647 \u0647\u0627\u06cc \u0645\u0627 \u0627\u0631\u0633\u0627\u0644 \u0645\u06cc \u0634\u0648\u062f.  \u0633\u067e\u0633 \u0627\u06cc\u0646 \u06a9\u0646\u062a\u0631\u0644\u0631 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u062a\u0627\u0628\u0639 \u0645\u06cc\u0627\u0646\u200c\u0627\u0641\u0632\u0627\u0631 Gin \u0628\u0631\u06af\u0631\u062f\u0627\u0646\u062f\u0647 \u0645\u06cc\u200c\u0634\u0648\u062f \u0648 \u0628\u0647 \u0622\u0646 \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc\u200c\u062f\u0647\u062f \u062a\u0627 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc GraphQL \u0631\u0627 \u06a9\u0647 \u0628\u0647 \u0633\u0631\u0648\u0631 \u0645\u0627 \u0645\u06cc\u200c\u0622\u06cc\u0646\u062f\u060c \u067e\u0631\u062f\u0627\u0632\u0634 \u06a9\u0646\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight go\"><code><span class=\"k\">func<\/span> <span class=\"n\">GraphqlHandler<\/span><span class=\"p\">()<\/span> <span class=\"n\">gin<\/span><span class=\"o\">.<\/span><span class=\"n\">HandlerFunc<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">config<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">generated<\/span><span class=\"o\">.<\/span><span class=\"n\">Config<\/span><span class=\"p\">{<\/span><span class=\"n\">Resolvers<\/span><span class=\"o\">:<\/span> <span class=\"o\">&amp;<\/span><span class=\"n\">graph<\/span><span class=\"o\">.<\/span><span class=\"n\">Resolver<\/span><span class=\"p\">{}}<\/span>\n    <span class=\"c\">\/\/ Add directives<\/span>\n    <span class=\"n\">config<\/span><span class=\"o\">.<\/span><span class=\"n\">Directives<\/span><span class=\"o\">.<\/span><span class=\"n\">Validate<\/span> <span class=\"o\">=<\/span> <span class=\"n\">directives<\/span><span class=\"o\">.<\/span><span class=\"n\">Validate<\/span>\n\n    <span class=\"n\">h<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">handler<\/span><span class=\"o\">.<\/span><span class=\"n\">NewDefaultServer<\/span><span class=\"p\">(<\/span><span class=\"n\">generated<\/span><span class=\"o\">.<\/span><span class=\"n\">NewExecutableSchema<\/span><span class=\"p\">(<\/span><span class=\"n\">config<\/span><span class=\"p\">))<\/span>\n    <span class=\"k\">return<\/span> <span class=\"k\">func<\/span><span class=\"p\">(<\/span><span class=\"n\">c<\/span> <span class=\"o\">*<\/span><span class=\"n\">gin<\/span><span class=\"o\">.<\/span><span class=\"n\">Context<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span> <span class=\"n\">h<\/span><span class=\"o\">.<\/span><span class=\"n\">ServeHTTP<\/span><span class=\"p\">(<\/span><span class=\"n\">c<\/span><span class=\"o\">.<\/span><span class=\"n\">Writer<\/span><span class=\"p\">,<\/span> <span class=\"n\">c<\/span><span class=\"o\">.<\/span><span class=\"n\">Request<\/span><span class=\"p\">)<\/span> <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u0645\u0627 \u06a9\u0627\u0631\u0647\u0627\u06cc \u0646\u0647\u0627\u06cc\u06cc \u0631\u0627 \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 GraphQL \u062e\u0648\u062f \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u062f\u0647\u06cc\u0645\u060c \u0628\u06cc\u0627\u06cc\u06cc\u062f \u062f\u0648\u0628\u0627\u0631\u0647 \u06cc\u06a9\u06cc \u0627\u0632 \u062d\u0644 \u06a9\u0646\u0646\u062f\u0647 \u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u0645 \u062a\u0627 \u0646\u0634\u0627\u0646 \u062f\u0647\u06cc\u0645 \u0686\u06af\u0648\u0646\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631 \u0631\u0627 \u0628\u0647 \u0637\u0648\u0631 \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u062f\u0631 \u0639\u0645\u0644\u06cc\u0627\u062a GraphQL \u062e\u0648\u062f \u0627\u062f\u063a\u0627\u0645 \u06a9\u0646\u06cc\u0645.  \u0645\u06cc\u0627\u0646\u200c\u0627\u0641\u0632\u0627\u0631 \u0646\u0642\u0634 \u0645\u0647\u0645\u06cc \u062f\u0631 \u0631\u0647\u06af\u06cc\u0631\u06cc \u0648 \u0627\u0641\u0632\u0627\u06cc\u0634 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627 \u0642\u0628\u0644 \u0627\u0632 \u0631\u0633\u06cc\u062f\u0646 \u0628\u0647 \u062d\u0644\u200c\u06a9\u0646\u0646\u062f\u0647\u200c\u0647\u0627\u06cc \u0645\u0627 \u0628\u0627\u0632\u06cc \u0645\u06cc\u200c\u06a9\u0646\u062f \u0648 \u0628\u0647 \u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc\u200c\u062f\u0647\u062f \u06a9\u0627\u0631\u0647\u0627\u06cc \u0627\u0636\u0627\u0641\u06cc \u0645\u0627\u0646\u0646\u062f \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a\u060c \u062b\u0628\u062a\u200c\u0646\u0627\u0645 \u06cc\u0627 \u062f\u0633\u062a\u06a9\u0627\u0631\u06cc \u062f\u0627\u062f\u0647\u200c\u0647\u0627 \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u0645.  \u0628\u0627 \u0627\u062f\u063a\u0627\u0645 \u0645\u06cc\u0627\u0646\u200c\u0627\u0641\u0632\u0627\u0631 \u062f\u0631 \u062a\u0648\u0627\u0628\u0639 \u062d\u0644\u200c\u06a9\u0646\u0646\u062f\u0647\u200c\u0645\u0627\u0646\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u0645 \u0639\u0645\u0644\u06a9\u0631\u062f \u0648 \u0627\u0645\u0646\u06cc\u062a GraphQL API \u062e\u0648\u062f \u0631\u0627 \u0628\u062f\u0648\u0646 \u0628\u0647 \u0647\u0645 \u0631\u06cc\u062e\u062a\u0646 \u0645\u0646\u0637\u0642 \u062d\u0644\u200c\u06a9\u0646\u0646\u062f\u0647 \u062e\u0648\u062f \u0627\u0641\u0632\u0627\u06cc\u0634 \u062f\u0647\u06cc\u0645.  \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u0647 \u062c\u0632\u0626\u06cc\u0627\u062a \u0627\u06cc\u0646 \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631\u0647\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u0646\u062f \u0628\u0647 \u0637\u0648\u0631 \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u062f\u0631 \u0645\u0639\u0645\u0627\u0631\u06cc \u0633\u0631\u0648\u0631 GraphQL \u0645\u0627 \u06af\u0646\u062c\u0627\u0646\u062f\u0647 \u0634\u0648\u0646\u062f\u060c \u0628\u067e\u0631\u062f\u0627\u0632\u06cc\u0645.<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0642\u0637\u0639\u0647 \u06a9\u062f Go\u060c \u0645\u0627 \u0627\u0632 User Resolver \u06a9\u0647 \u0642\u0628\u0644\u0627\u064b \u062f\u0631 \u0633\u0631\u0648\u0631 GraphQL \u0645\u0627 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0634\u062f\u0647 \u0628\u0648\u062f\u060c \u062f\u0648\u0628\u0627\u0631\u0647 \u0628\u0627\u0632\u062f\u06cc\u062f \u0645\u06cc \u06a9\u0646\u06cc\u0645.  \u0627\u06cc\u0646 \u062a\u0627\u0628\u0639 \u062d\u0644\u200c\u06a9\u0646\u0646\u062f\u0647 \u06a9\u0647 Pantries \u0646\u0627\u0645 \u062f\u0627\u0631\u062f\u060c \u0645\u0633\u0626\u0648\u0644 \u0648\u0627\u06a9\u0634\u06cc \u0641\u0647\u0631\u0633\u062a\u06cc \u0627\u0632 \u0627\u0646\u0628\u0627\u0631\u0647\u0627\u06cc \u0645\u0631\u062a\u0628\u0637 \u0628\u0627 \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u062e\u0627\u0635 \u0627\u0633\u062a.  \u062f\u0631 \u062f\u0627\u062e\u0644 \u062a\u0627\u0628\u0639\u060c \u0645\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0632\u0645\u06cc\u0646\u0647 \u0628\u0647 \u0644\u0627\u06cc\u0647 \u062e\u062f\u0645\u0627\u062a \u062f\u0633\u062a\u0631\u0633\u06cc \u067e\u06cc\u062f\u0627 \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u0648 \u0627\u0632 \u06cc\u06a9 \u062a\u0627\u0628\u0639 \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631 \u0628\u0631\u0627\u06cc \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0633\u0631\u0648\u06cc\u0633 \u0644\u0627\u0632\u0645 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645.  \u067e\u0633 \u0627\u0632 \u0628\u0647 \u062f\u0633\u062a \u0622\u0648\u0631\u062f\u0646\u060c \u0645\u0627 \u0645\u062a\u062f FetchPantriesByAuthor \u0631\u0627 \u0627\u0632 PantryService \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u062a\u0627 \u0627\u0646\u0628\u0627\u0631\u0647\u0627\u06cc \u0645\u0631\u062a\u0628\u0637 \u0628\u0627 \u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u06a9\u0646\u06cc\u0645.  \u0627\u06cc\u0646 \u062a\u0627\u0628\u0639 \u067e\u0627\u0631\u0627\u0645\u062a\u0631\u0647\u0627\u06cc \u0627\u062e\u062a\u06cc\u0627\u0631\u06cc \u0645\u0627\u0646\u0646\u062f \u0633\u0641\u0627\u0631\u0634\u060c \u062c\u0632\u0626\u06cc\u0627\u062a \u0635\u0641\u062d\u0647 \u0628\u0646\u062f\u06cc (startAt \u0648 \u0627\u0646\u062f\u0627\u0632\u0647) \u0631\u0627 \u0645\u06cc \u067e\u0630\u06cc\u0631\u062f \u0648 \u06cc\u06a9 PantryList \u0631\u0627 \u0628\u0647 \u0647\u0645\u0631\u0627\u0647 \u0647\u0631 \u06af\u0648\u0646\u0647 \u062e\u0637\u0627\u06cc \u0627\u062d\u062a\u0645\u0627\u0644\u06cc \u06a9\u0647 \u062f\u0631 \u0637\u0648\u0644 \u0641\u0631\u0622\u06cc\u0646\u062f \u0628\u0627 \u0622\u0646 \u0645\u0648\u0627\u062c\u0647 \u0645\u06cc \u0634\u0648\u062f \u0628\u0631\u0645\u06cc \u06af\u0631\u062f\u0627\u0646\u062f.  \u0627\u06cc\u0646 \u062d\u0644\u200c\u06a9\u0646\u0646\u062f\u0647 \u0646\u0634\u0627\u0646 \u0645\u06cc\u200c\u062f\u0647\u062f \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u0645\u06cc\u0627\u0646\u200c\u0627\u0641\u0632\u0627\u0631 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u0628\u0647 \u0637\u0648\u0631 \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u0628\u0627 \u062a\u0648\u0627\u0628\u0639 \u062d\u0644\u200c\u06a9\u0646\u0646\u062f\u0647 \u0627\u062f\u063a\u0627\u0645 \u0634\u0648\u062f \u062a\u0627 \u0639\u0645\u0644\u06a9\u0631\u062f \u0633\u0631\u0648\u0631 GraphQL \u0645\u0627 \u0631\u0627 \u0627\u0641\u0632\u0627\u06cc\u0634 \u062f\u0647\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight go\"><code><span class=\"k\">func<\/span> <span class=\"p\">(<\/span><span class=\"n\">r<\/span> <span class=\"o\">*<\/span><span class=\"n\">userResolver<\/span><span class=\"p\">)<\/span> <span class=\"n\">Pantries<\/span><span class=\"p\">(<\/span><span class=\"n\">ctx<\/span> <span class=\"n\">context<\/span><span class=\"o\">.<\/span><span class=\"n\">Context<\/span><span class=\"p\">,<\/span> <span class=\"n\">obj<\/span> <span class=\"o\">*<\/span><span class=\"n\">model<\/span><span class=\"o\">.<\/span><span class=\"n\">User<\/span><span class=\"p\">,<\/span> <span class=\"n\">order<\/span> <span class=\"o\">*<\/span><span class=\"n\">model<\/span><span class=\"o\">.<\/span><span class=\"n\">SearchOrder<\/span><span class=\"p\">,<\/span> <span class=\"n\">startAt<\/span> <span class=\"o\">*<\/span><span class=\"kt\">int<\/span><span class=\"p\">,<\/span> <span class=\"n\">size<\/span> <span class=\"o\">*<\/span><span class=\"kt\">int<\/span><span class=\"p\">)<\/span> <span class=\"p\">(<\/span><span class=\"o\">*<\/span><span class=\"n\">model<\/span><span class=\"o\">.<\/span><span class=\"n\">PantryList<\/span><span class=\"p\">,<\/span> <span class=\"kt\">error<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">services<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">middleware<\/span><span class=\"o\">.<\/span><span class=\"n\">ForServices<\/span><span class=\"p\">(<\/span><span class=\"n\">ctx<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">return<\/span> <span class=\"n\">services<\/span><span class=\"o\">.<\/span><span class=\"n\">PantryService<\/span><span class=\"o\">.<\/span><span class=\"n\">FetchPantriesByAuthor<\/span><span class=\"p\">(<\/span><span class=\"n\">order<\/span><span class=\"p\">,<\/span> <span class=\"o\">&amp;<\/span><span class=\"n\">obj<\/span><span class=\"o\">.<\/span><span class=\"n\">ID<\/span><span class=\"p\">,<\/span> <span class=\"n\">startAt<\/span><span class=\"p\">,<\/span> <span class=\"n\">size<\/span><span class=\"p\">)<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%DA%AF%DB%8C%D8%B1%DB%8C_%D9%87%D9%85%D9%87_%D8%B1%D8%A7_%D8%A8%D8%A7_%D9%87%D9%85_%D8%AC%D9%85%D8%B9_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc: \u0647\u0645\u0647 \u0631\u0627 \u0628\u0627 \u0647\u0645 \u062c\u0645\u0639 \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u062f\u0631 \u062e\u0627\u062a\u0645\u0647\u060c \u0627\u06cc\u0646 \u0633\u0631\u06cc \u0645\u0642\u0627\u0644\u0647 \u0631\u0627\u0647\u0646\u0645\u0627\u06cc \u062c\u0627\u0645\u0639\u06cc \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u06cc\u06a9 \u0633\u0631\u0648\u0631 API \u0642\u0648\u06cc GraphQL \u062f\u0631 Go \u0627\u0631\u0627\u0626\u0647 \u06a9\u0631\u062f\u0647 \u0627\u0633\u062a.  \u0645\u0627 \u0628\u0627 \u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc gqlgen \u0628\u0631\u0627\u06cc \u0627\u062f\u063a\u0627\u0645 GraphQL \u0634\u0631\u0648\u0639 \u06a9\u0631\u062f\u06cc\u0645\u060c \u0622\u0646 \u0631\u0627 \u0645\u0637\u0627\u0628\u0642 \u0628\u0627 \u0642\u0631\u0627\u0631\u062f\u0627\u062f\u0647\u0627\u06cc \u067e\u0631\u0648\u0698\u0647 Go \u0633\u0641\u0627\u0631\u0634\u06cc \u06a9\u0631\u062f\u06cc\u0645 \u0648 \u0637\u0631\u062d GraphQL \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 \u062d\u0644\u200c\u06a9\u0646\u0646\u062f\u0647\u200c\u0647\u0627 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0631\u062f\u06cc\u0645.  \u0645\u0627 \u0645\u062f\u0644 \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0633\u0631\u0648\u06cc\u0633\u200c\u0647\u0627 \u0627\u0646\u062a\u0632\u0627\u0639 \u06a9\u0631\u062f\u06cc\u0645\u060c \u0622\u0646\u0647\u0627 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0645\u06cc\u0627\u0646\u200c\u0627\u0641\u0632\u0627\u0631 \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u06a9\u0631\u062f\u06cc\u0645 \u0648 \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc \u062f\u0631 \u0633\u0637\u062d \u0637\u0631\u062d\u0648\u0627\u0631\u0647 \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u06a9\u0631\u062f\u06cc\u0645.  \u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u0627\u06cc\u0646\u060c \u0645\u0627 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u062f\u0627\u062f\u0647\u200c\u0647\u0627 \u0631\u0627 \u0628\u0627 \u062f\u06cc\u062a\u0627\u0644\u0648\u062f\u0631\u0647\u0627 \u0628\u0647\u06cc\u0646\u0647 \u06a9\u0631\u062f\u06cc\u0645 \u0648 \u0627\u0632 \u0627\u062c\u0631\u0627\u06cc \u06a9\u0627\u0631\u0622\u0645\u062f \u067e\u0631\u0633 \u0648 \u062c\u0648 \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u06a9\u0631\u062f\u06cc\u0645.  \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a\u060c \u0645\u0627 \u0647\u0645\u0647 \u0686\u06cc\u0632 \u0631\u0627 \u0628\u0627 \u0645\u06cc\u0627\u0646 \u0627\u0641\u0632\u0627\u0631 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0648 \u06cc\u06a9 \u062a\u0627\u0628\u0639 \u0627\u062c\u0631\u0627 \u06a9\u0647 \u062f\u0631 \u0628\u0633\u062a\u0647 \u0633\u0631\u0648\u0631 \u0645\u062d\u0635\u0648\u0631 \u0634\u062f\u0647 \u0628\u0648\u062f\u060c \u0628\u0647 \u0647\u0645 \u06af\u0631\u0647 \u0632\u062f\u06cc\u0645.  \u0628\u0627 \u062f\u0646\u0628\u0627\u0644 \u06a9\u0631\u062f\u0646 \u0627\u06cc\u0646 \u0645\u0631\u0627\u062d\u0644\u060c \u0645\u0627 \u06cc\u06a9 \u067e\u0627\u06cc\u0647 \u0645\u062d\u06a9\u0645 \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f API\u0647\u0627\u06cc GraphQL \u0642\u062f\u0631\u062a\u0645\u0646\u062f \u062f\u0631 Go \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u0647\u200c\u0627\u06cc\u0645 \u06a9\u0647 \u0622\u0645\u0627\u062f\u0647 \u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u0645\u0648\u0627\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u062e\u062a\u0644\u0641 \u0648 \u0645\u0642\u06cc\u0627\u0633\u200c\u0628\u0646\u062f\u06cc \u0628\u0647 \u0622\u0633\u0627\u0646\u06cc \u0647\u0633\u062a\u0646\u062f.<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u062f\u0631 \u0627\u06cc\u0646 \u0645\u0631\u062d\u0644\u0647 \u0627\u0632 \u0633\u0641\u0631 \u062e\u0648\u062f\u060c \u0628\u0647 \u062d\u0648\u0632\u0647 \u0627\u062f\u063a\u0627\u0645 \u0645\u06cc\u0627\u0646\u200c\u0627\u0641\u0632\u0627\u0631 \u0628\u0627 \u062c\u06cc\u0646 \u0648 \u0627\u062c\u0631\u0627\u06cc \u0645\u06cc\u0627\u0646\u200c\u0627\u0641\u0632\u0627\u0631 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 gocloak \u0645\u06cc\u200c\u067e\u0631\u062f\u0627\u0632\u06cc\u0645. \u0628\u0627 \u062a\u06a9\u06cc\u0647 \u0628\u0631 \u0645\u0628\u0646\u0627\u06cc\u06cc \u06a9\u0647 \u062f\u0631 \u0628\u062e\u0634\u200c\u0647\u0627\u06cc \u0642\u0628\u0644\u06cc \u06af\u0630\u0627\u0634\u062a\u0647 \u0634\u062f\u060c \u0627\u06a9\u0646\u0648\u0646 \u062a\u0644\u0627\u0634\u200c\u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 \u0627\u062f\u063a\u0627\u0645 \u0645\u06cc\u0627\u0646\u200c\u0627\u0641\u0632\u0627\u0631 \u0628\u0647\u200c\u0637\u0648\u0631 \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u062f\u0631 \u0633\u0631\u0648\u0631 GraphQL \u062e\u0648\u062f \u0645\u062a\u062d\u062f \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645. \u0628\u0627 \u062c\u06cc\u0646\u060c \u06cc\u06a9 \u0686\u0627\u0631\u0686\u0648\u0628 \u0648\u0628 \u0642\u062f\u0631\u062a\u0645\u0646\u062f HTTP \u0628\u0631\u0627\u06cc &hellip;<\/p>\n","protected":false},"author":2,"featured_media":65362,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-65361","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/65361","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=65361"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/65361\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/65362"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=65361"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=65361"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=65361"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}