{"id":7154,"date":"2026-10-08T17:00:42","date_gmt":"2026-10-08T13:30:42","guid":{"rendered":"https:\/\/parmin.cloud\/blog\/?p=7154"},"modified":"2026-10-08T17:00:42","modified_gmt":"2026-10-08T13:30:42","slug":"%d8%b3%d8%a7%d8%ae%d8%aa-%db%8c%da%a9-graphql-api-%d8%af%d8%b1-go-%d8%a8%d8%b1%d8%a7%db%8c-%d8%a2%d9%be%d9%84%d9%88%d8%af-%d9%81%d8%a7%db%8c%d9%84%d9%87%d8%a7-%d8%a8%d9%87-spaces","status":"publish","type":"post","link":"https:\/\/parmin.cloud\/blog\/%d8%b3%d8%a7%d8%ae%d8%aa-%db%8c%da%a9-graphql-api-%d8%af%d8%b1-go-%d8%a8%d8%b1%d8%a7%db%8c-%d8%a2%d9%be%d9%84%d9%88%d8%af-%d9%81%d8%a7%db%8c%d9%84%d9%87%d8%a7-%d8%a8%d9%87-spaces\/","title":{"rendered":"\u0633\u0627\u062e\u062a \u06cc\u06a9 GraphQL API \u062f\u0631 Go \u0628\u0631\u0627\u06cc \u0622\u067e\u0644\u0648\u062f \u0641\u0627\u06cc\u0644\u200c\u0647\u0627 \u0628\u0647 Spaces"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">\u0645\u0642\u062f\u0645\u0647<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc \u0628\u0633\u06cc\u0627\u0631\u06cc \u0627\u0632 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646\u200c\u0647\u0627\u060c \u06cc\u06a9 \u0642\u0627\u0628\u0644\u06cc\u062a \u0645\u0637\u0644\u0648\u0628\u060c \u062a\u0648\u0627\u0646\u0627\u06cc\u06cc \u06a9\u0627\u0631\u0628\u0631 \u062f\u0631 \u0622\u067e\u0644\u0648\u062f \u062a\u0635\u0648\u06cc\u0631 \u067e\u0631\u0648\u0641\u0627\u06cc\u0644 \u0627\u0633\u062a. \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644\u060c \u0633\u0627\u062e\u062a \u0627\u06cc\u0646 \u0642\u0627\u0628\u0644\u06cc\u062a \u0628\u0631\u0627\u06cc \u062a\u0648\u0633\u0639\u0647\u200c\u062f\u0647\u0646\u062f\u06af\u0627\u0646 \u062a\u0627\u0632\u0647\u200c\u0648\u0627\u0631\u062f GraphQL \u2014 \u06a9\u0647 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u062f\u0627\u062e\u0644\u06cc \u0627\u0632 \u0622\u067e\u0644\u0648\u062f \u0641\u0627\u06cc\u0644 \u0646\u062f\u0627\u0631\u062f \u2014 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u0686\u0627\u0644\u0634\u200c\u0628\u0631\u0627\u0646\u06af\u06cc\u0632 \u0628\u0627\u0634\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634\u060c \u06cc\u0627\u062f \u0645\u06cc\u200c\u06af\u06cc\u0631\u06cc\u062f \u062a\u0635\u0627\u0648\u06cc\u0631 \u0631\u0627 \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u0627\u0632 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 Backend \u062e\u0648\u062f \u0628\u0647 \u06cc\u06a9 \u0633\u0631\u0648\u06cc\u0633 \u0630\u062e\u06cc\u0631\u0647\u200c\u0633\u0627\u0632\u06cc \u0634\u062e\u0635 \u062b\u0627\u0644\u062b \u0622\u067e\u0644\u0648\u062f \u06a9\u0646\u06cc\u062f. \u06cc\u06a9 GraphQL API \u0645\u06cc\u200c\u0633\u0627\u0632\u06cc\u062f \u06a9\u0647 \u0627\u0632 SDK \u0633\u0627\u0632\u06af\u0627\u0631 \u0628\u0627 S3 \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 AWS \u0628\u0631\u0627\u06cc Go \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f \u062a\u0627 \u0627\u0632 \u06cc\u06a9 Backend \u0646\u0648\u0634\u062a\u0647\u200c\u0634\u062f\u0647 \u0628\u0627 Go\u060c \u062a\u0635\u0627\u0648\u06cc\u0631 \u0631\u0627 \u0628\u0647 Spaces \u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f \u2014 \u06cc\u06a9 \u0633\u0631\u0648\u06cc\u0633 \u0630\u062e\u06cc\u0631\u0647\u200c\u0633\u0627\u0632\u06cc Object \u0645\u0642\u06cc\u0627\u0633\u200c\u067e\u0630\u06cc\u0631 \u2014 \u0622\u067e\u0644\u0648\u062f \u06a9\u0646\u062f. Backend \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 Go \u06cc\u06a9 GraphQL API \u0627\u0631\u0627\u0626\u0647 \u06a9\u0631\u062f\u0647 \u0648 \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u062f\u0631 \u06cc\u06a9 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 PostgreSQL \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f \u06a9\u0647 \u062a\u0648\u0633\u0637 \u0633\u0631\u0648\u06cc\u0633 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u062f\u06cc\u0631\u06cc\u062a\u200c\u0634\u062f\u0647 \u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f \u0641\u0631\u0627\u0647\u0645 \u0634\u062f\u0647 \u0627\u0633\u062a. \u0628\u0631\u0627\u06cc \u06cc\u06a9 \u0631\u0648\u06cc\u06a9\u0631\u062f \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u0628\u0627 Node.js\u060c \u0645\u0642\u0627\u0644\u0647 \u00ab\u0633\u0627\u062e\u062a \u0648 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u06cc\u06a9 \u0633\u0631\u0648\u0631 GraphQL\u00bb \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062a\u0627 \u067e\u0627\u06cc\u0627\u0646 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634\u060c \u06cc\u06a9 GraphQL API \u0628\u0627 Golang \u0633\u0627\u062e\u062a\u0647\u200c\u0627\u06cc\u062f \u06a9\u0647 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0631\u0633\u0627\u0646\u0647\u200c\u0627\u06cc \u0631\u0627 \u0627\u0632 \u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a Multipart HTTP \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0631\u062f\u0647 \u0648 \u0641\u0627\u06cc\u0644 \u0631\u0627 \u0628\u0647 \u06cc\u06a9 Bucket \u062f\u0627\u062e\u0644 Spaces \u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f \u0622\u067e\u0644\u0648\u062f \u06a9\u0646\u062f.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u0645\u062d\u06cc\u0637 \u062a\u0633\u062a\u200c\u0634\u062f\u0647<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634 \u0628\u0627 \u0646\u0633\u062e\u0647\u200c\u0647\u0627\u06cc \u0632\u06cc\u0631 \u062a\u0633\u062a \u0634\u062f\u0647 \u0627\u0633\u062a:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Go \u0646\u0633\u062e\u0647 \u06f1.\u06f2\u06f2 \u0628\u0647 \u0628\u0627\u0644\u0627<\/li>\n\n\n\n<li>gqlgen \u0646\u0633\u062e\u0647 v0.17.49<\/li>\n\n\n\n<li>aws-sdk-go-v2 \u0646\u0633\u062e\u0647 v1.26 \u0628\u0647 \u0628\u0627\u0644\u0627<\/li>\n\n\n\n<li>go-pg \u0646\u0633\u062e\u0647 v10<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u0642\u0628\u0644 \u0627\u0632 \u0627\u062f\u0627\u0645\u0647\u060c \u0646\u0633\u062e\u0647 \u0646\u0635\u0628\u200c\u0634\u062f\u0647 Go \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 <code>go version<\/code> \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u06cc\u062f.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u0646\u06a9\u0627\u062a \u06a9\u0644\u06cc\u062f\u06cc<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>GraphQL \u0628\u0647\u200c\u0635\u0648\u0631\u062a \u0628\u0648\u0645\u06cc \u0627\u0632 \u0622\u067e\u0644\u0648\u062f \u0641\u0627\u06cc\u0644 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0646\u0645\u06cc\u200c\u06a9\u0646\u062f. graphql-multipart-request-spec \u0627\u0633\u062a\u0627\u0646\u062f\u0627\u0631\u062f \u062c\u0627\u0645\u0639\u0647 \u0627\u0633\u062a \u0648 gqlgen \u0622\u0646 \u0631\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 Scalar \u0628\u0627 \u0646\u0627\u0645 Upload \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0645\u06cc\u200c\u06a9\u0646\u062f.<\/li>\n\n\n\n<li>AWS SDK Go v2 \u0646\u0633\u062e\u0647 SDK \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc\u200c\u0634\u062f\u0647 \u0641\u0639\u0644\u06cc \u0628\u0631\u0627\u06cc \u062a\u0639\u0627\u0645\u0644 \u0628\u0627 \u0630\u062e\u06cc\u0631\u0647\u200c\u0633\u0627\u0632\u06cc \u0633\u0627\u0632\u06af\u0627\u0631 \u0628\u0627 S3 \u2014 \u0634\u0627\u0645\u0644 Spaces \u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f \u2014 \u0627\u0633\u062a.<\/li>\n\n\n\n<li>\u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u0627\u0631\u0633\u0627\u0644\u06cc \u0627\u0632 \u0637\u0631\u06cc\u0642 Mutation\u0647\u0627\u06cc Multipart \u06af\u0631\u0627\u0641\u200c\u06a9\u06cc\u0648\u0627\u0644\u060c \u062f\u0631 Resolver \u0628\u0647\u200c\u0635\u0648\u0631\u062a io.Reader \u0645\u06cc\u200c\u0631\u0633\u0646\u062f. \u0622\u0646\u200c\u0647\u0627 \u0631\u0627 \u0628\u0627 io.ReadAll \u0628\u062e\u0648\u0627\u0646\u06cc\u062f \u06cc\u0627 \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u0628\u0647 \u0630\u062e\u06cc\u0631\u0647\u200c\u0633\u0627\u0632\u06cc \u0627\u0633\u062a\u0631\u06cc\u0645 \u06a9\u0646\u06cc\u062f.<\/li>\n\n\n\n<li>\u0622\u067e\u0644\u0648\u062f \u0633\u0645\u062a \u0633\u0631\u0648\u0631 (\u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634) \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0633\u0627\u062f\u0647\u200c\u062a\u0631\u06cc \u062f\u0627\u0631\u062f. URL\u0647\u0627\u06cc Presigned \u0628\u0627\u0631 \u0633\u0631\u0648\u0631 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u0628\u0632\u0631\u06af \u06a9\u0627\u0647\u0634 \u0645\u06cc\u200c\u062f\u0647\u0646\u062f.<\/li>\n\n\n\n<li>\u0641\u0627\u06cc\u0644\u200c\u0647\u0627 \u0628\u0627 io.ReadAll \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u062f\u0631 \u062d\u0627\u0641\u0638\u0647 \u062e\u0648\u0627\u0646\u062f\u0647 \u0634\u062f\u0647 \u0648 \u0627\u0632 \u0637\u0631\u06cc\u0642 bytes.NewReader \u0628\u0647 PutObject \u067e\u0627\u0633 \u0645\u06cc\u200c\u0634\u0648\u0646\u062f. \u0628\u0631\u0627\u06cc \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u062e\u06cc\u0644\u06cc \u0628\u0632\u0631\u06af\u060c input.File.File \u0631\u0627 \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u0628\u0647 \u0641\u06cc\u0644\u062f Body \u0627\u0633\u062a\u0631\u06cc\u0645 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0627\u0632 \u0645\u0635\u0631\u0641 \u0628\u0627\u0644\u0627\u06cc \u062d\u0627\u0641\u0638\u0647 \u0627\u062c\u062a\u0646\u0627\u0628 \u0634\u0648\u062f.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u067e\u06cc\u0634\u200c\u0646\u06cc\u0627\u0632\u0647\u0627<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc \u062f\u0646\u0628\u0627\u0644 \u06a9\u0631\u062f\u0646 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634 \u0628\u0647 \u0645\u0648\u0627\u0631\u062f \u0632\u06cc\u0631 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u062f:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u06cc\u06a9 \u062d\u0633\u0627\u0628 \u06a9\u0627\u0631\u0628\u0631\u06cc \u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f. \u0627\u06af\u0631 \u0646\u062f\u0627\u0631\u06cc\u062f\u060c \u062b\u0628\u062a\u200c\u0646\u0627\u0645 \u06a9\u0646\u06cc\u062f. \u062f\u0631 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634 \u0627\u0632 Spaces \u0648 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u062f\u06cc\u0631\u06cc\u062a\u200c\u0634\u062f\u0647 \u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f.<\/li>\n\n\n\n<li>\u06cc\u06a9 Space \u062f\u0631 \u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f \u0647\u0645\u0631\u0627\u0647 \u0628\u0627 Access Key \u0648 Access Secret \u06a9\u0647 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0627 \u062f\u0646\u0628\u0627\u0644\u200c\u06a9\u0631\u062f\u0646 \u0631\u0627\u0647\u0646\u0645\u0627\u06cc \u00abSpace \u0648 API Key\u00bb \u0628\u0633\u0627\u0632\u06cc\u062f. \u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0645\u0633\u062a\u0646\u062f\u0627\u062a \u00ab\u0645\u062f\u06cc\u0631\u06cc\u062a \u062f\u0633\u062a\u0631\u0633\u06cc\u00bb \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f.<\/li>\n\n\n\n<li>Go \u0646\u0635\u0628\u200c\u0634\u062f\u0647 \u0631\u0648\u06cc \u0645\u0627\u0634\u06cc\u0646 \u0645\u062d\u0644\u06cc \u062e\u0648\u062f\u060c \u06a9\u0647 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0627 \u062f\u0646\u0628\u0627\u0644\u200c\u06a9\u0631\u062f\u0646 \u0645\u062c\u0645\u0648\u0639\u0647 \u0631\u0627\u0647\u0646\u0645\u0627\u0647\u0627\u06cc \u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc Go \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u062f.<\/li>\n\n\n\n<li>\u062f\u0627\u0646\u0634 \u067e\u0627\u06cc\u0647 Golang \u06a9\u0647 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0645\u062c\u0645\u0648\u0639\u0647 \u0622\u0645\u0648\u0632\u0634\u200c\u0647\u0627\u06cc Go \u0645\u0627 \u0628\u0647 \u062f\u0633\u062a \u0622\u0648\u0631\u06cc\u062f. \u0622\u0645\u0648\u0632\u0634 \u00ab\u0627\u0648\u0644\u06cc\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 Go\u00bb \u0645\u0639\u0631\u0641\u06cc \u062e\u0648\u0628\u06cc \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc\u200c\u06a9\u0646\u062f.<\/li>\n\n\n\n<li>\u062f\u0631\u06a9 GraphQL \u06a9\u0647 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0622\u0646 \u0631\u0627 \u062f\u0631 \u0622\u0645\u0648\u0632\u0634 \u00ab\u0645\u0642\u062f\u0645\u0647\u200c\u0627\u06cc \u0628\u0631 GraphQL\u00bb \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u062f\u0631\u06a9 GraphQL Multipart Request Specification<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">GraphQL \u0645\u06a9\u0627\u0646\u06cc\u0632\u0645 \u0628\u0648\u0645\u06cc \u0628\u0631\u0627\u06cc \u0622\u067e\u0644\u0648\u062f \u0641\u0627\u06cc\u0644 \u062a\u0639\u0631\u06cc\u0641 \u0646\u0645\u06cc\u200c\u06a9\u0646\u062f. graphql-multipart-request-spec (\u0646\u0648\u0634\u062a\u0647 jaydenseric) \u0627\u0633\u062a\u0627\u0646\u062f\u0627\u0631\u062f de facto \u062c\u0627\u0645\u0639\u0647 \u0628\u0631\u0627\u06cc \u0627\u0631\u0633\u0627\u0644 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 GraphQL \u0628\u0627 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc Multipart HTTP \u0627\u0633\u062a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06cc\u0646 Specification \u06cc\u06a9 Payload \u0641\u0631\u0645 \u0633\u0647\u200c\u0628\u062e\u0634\u06cc \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc\u200c\u06a9\u0646\u062f:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>operations:<\/strong> \u06a9\u0648\u0626\u0631\u06cc \u06cc\u0627 Mutation \u06af\u0631\u0627\u0641\u200c\u06a9\u06cc\u0648\u0627\u0644 \u0628\u0647\u200c\u0635\u0648\u0631\u062a \u0631\u0634\u062a\u0647 JSON\u060c \u0628\u0627 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0641\u0627\u06cc\u0644 \u0631\u0648\u06cc null \u062a\u0646\u0638\u06cc\u0645\u200c\u0634\u062f\u0647.<\/li>\n\n\n\n<li><strong>map:<\/strong> \u06cc\u06a9 \u0622\u0628\u062c\u06a9\u062a JSON \u06a9\u0647 \u0647\u0631 \u0628\u062e\u0634 \u0641\u0627\u06cc\u0644 \u0631\u0627 \u0628\u0647 \u0645\u0633\u06cc\u0631 \u0645\u062a\u063a\u06cc\u0631\u0634 \u062f\u0631 operations \u0646\u06af\u0627\u0634\u062a \u0645\u06cc\u200c\u06a9\u0646\u062f.<\/li>\n\n\n\n<li><strong>\u0628\u062e\u0634\u200c\u0647\u0627\u06cc \u0648\u0627\u0642\u0639\u06cc \u0641\u0627\u06cc\u0644<\/strong> \u06a9\u0647 \u0628\u0627 \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc map \u0628\u0647 \u0622\u0646\u200c\u0647\u0627 \u0627\u0631\u062c\u0627\u0639 \u062f\u0627\u062f\u0647 \u0645\u06cc\u200c\u0634\u0648\u0646\u062f.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">gqlgen \u0627\u06cc\u0646 Specification \u0631\u0627 \u0628\u0647\u200c\u0635\u0648\u0631\u062a \u0628\u0648\u0645\u06cc \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0646\u0648\u0639 Scalar \u0628\u0627 \u0646\u0627\u0645 Upload \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0645\u06cc\u200c\u06a9\u0646\u062f. \u062c\u0631\u06cc\u0627\u0646 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0628\u0647 \u0627\u06cc\u0646 \u0634\u06a9\u0644 \u0627\u0633\u062a:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Client (multipart\/form-data)\n    \u2502\n    \u251c\u2500\u2500 operations: { query, variables: { image: null } }\n    \u251c\u2500\u2500 map: { \"0\": &#91;\"variables.image\"] }\n    \u251c\u2500\u2500 0: &lt;binary file data&gt;\n    \u2502\n    \u25bc\nGo HTTP Server (net\/http)\n    \u2502\n    \u25bc\ngqlgen Handler (parses multipart, maps Upload scalar)\n    \u2502\n    \u25bc\nUploadProfileImage Resolver\n    \u2502\n    \u25bc\nAWS SDK Go v2 \u2500\u2500\u25ba Parmin Cloud Spaces (S3-compatible)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0627 \u0627\u06cc\u0646 \u062f\u06cc\u062f\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f GraphQL API \u0631\u0627 \u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc \u0627\u0648\u0644\u06cc\u0647 (Bootstrap) \u06a9\u0631\u062f\u0647 \u0648 Schema \u0631\u0627 \u0637\u0648\u0631\u06cc \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0641\u0627\u06cc\u0644 \u0627\u0632 Scalar \u0628\u0627 \u0646\u0627\u0645 Upload \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u0646\u062f.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0645\u0631\u062d\u0644\u0647 \u06f1 \u2014 \u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc \u0627\u0648\u0644\u06cc\u0647 \u06cc\u06a9 GraphQL API \u062f\u0631 Golang<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0627\u06cc\u0646 \u0645\u0631\u062d\u0644\u0647\u060c \u0627\u0632 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 Gqlgen \u0628\u0631\u0627\u06cc \u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc \u0627\u0648\u0644\u06cc\u0647 GraphQL API \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f. Gqlgen \u06cc\u06a9 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 Go \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a GraphQL API\u0647\u0627 \u0627\u0633\u062a. \u062f\u0648 \u0642\u0627\u0628\u0644\u06cc\u062a \u0645\u0647\u0645\u06cc \u06a9\u0647 Gqlgen \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc\u200c\u06a9\u0646\u062f\u060c \u0631\u0648\u06cc\u06a9\u0631\u062f Schema-First \u0648 \u062a\u0648\u0644\u06cc\u062f \u06a9\u062f (Code Generation) \u0627\u0633\u062a. \u0628\u0627 \u0631\u0648\u06cc\u06a9\u0631\u062f Schema-First\u060c \u0627\u0628\u062a\u062f\u0627 \u0645\u062f\u0644 \u062f\u0627\u062f\u0647 API \u0631\u0627 \u0628\u0627 \u0632\u0628\u0627\u0646 \u062a\u0639\u0631\u06cc\u0641 Schema \u06af\u0631\u0627\u0641\u200c\u06a9\u06cc\u0648\u0627\u0644 (SDL) \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f. \u0633\u067e\u0633 \u06a9\u062f Boilerplate \u0628\u0631\u0627\u06cc API \u0631\u0627 \u0627\u0632 Schema \u062a\u0639\u0631\u06cc\u0641\u200c\u0634\u062f\u0647 \u062a\u0648\u0644\u06cc\u062f \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f. \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0642\u0627\u0628\u0644\u06cc\u062a \u062a\u0648\u0644\u06cc\u062f \u06a9\u062f\u060c \u0646\u06cc\u0627\u0632\u06cc \u0628\u0647 \u0633\u0627\u062e\u062a \u062f\u0633\u062a\u06cc Resolver\u0647\u0627\u06cc Query \u0648 Mutation \u0628\u0631\u0627\u06cc API \u0646\u062f\u0627\u0631\u06cc\u062f\u061b \u0686\u0648\u0646 \u0622\u0646\u200c\u0647\u0627 \u0628\u0647\u200c\u0637\u0648\u0631 \u062e\u0648\u062f\u06a9\u0627\u0631 \u062a\u0648\u0644\u06cc\u062f \u0645\u06cc\u200c\u0634\u0648\u0646\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc \u0634\u0631\u0648\u0639\u060c \u062f\u0633\u062a\u0648\u0631 \u0632\u06cc\u0631 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0646\u0635\u0628 gqlgen \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f. \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634 \u06cc\u06a9 \u0646\u0633\u062e\u0647 \u067e\u0627\u06cc\u062f\u0627\u0631 \u0631\u0627 \u0628\u0631\u0627\u06cc \u062a\u06a9\u0631\u0627\u0631\u067e\u0630\u06cc\u0631\u06cc Pin \u06a9\u0631\u062f\u0647 \u0627\u0633\u062a. \u0628\u0631\u0627\u06cc \u0622\u062e\u0631\u06cc\u0646 Tag \u067e\u0627\u06cc\u062f\u0627\u0631\u060c \u0635\u0641\u062d\u0647 Releases \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 gqlgen \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go install github.com\/99designs\/gqlgen@v0.17.49<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u0633\u067e\u0633\u060c \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u067e\u0631\u0648\u0698\u0647\u200c\u0627\u06cc \u0628\u0627 \u0646\u0627\u0645 parmin \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u0627\u06cc\u0646 \u067e\u0631\u0648\u0698\u0647 \u0628\u0633\u0627\u0632\u06cc\u062f:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir parmin<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u0648\u0627\u0631\u062f \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u067e\u0631\u0648\u0698\u0647 parmin \u0634\u0648\u06cc\u062f:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd parmin<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0632 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u067e\u0631\u0648\u0698\u0647 \u062e\u0648\u062f\u060c \u062f\u0633\u062a\u0648\u0631 \u0632\u06cc\u0631 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u06cc\u06a9 \u0641\u0627\u06cc\u0644 go.mod \u06a9\u0647 \u0645\u0627\u0698\u0648\u0644\u200c\u0647\u0627\u06cc \u062f\u0627\u062e\u0644 \u067e\u0631\u0648\u0698\u0647 parmin \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u06cc\u200c\u06a9\u0646\u062f\u060c \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go mod init parmin<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u0633\u067e\u0633\u060c \u0628\u0627 nano \u06cc\u0627 \u0648\u06cc\u0631\u0627\u06cc\u0634\u06af\u0631 \u0645\u062a\u0646 \u062f\u0644\u062e\u0648\u0627\u0647 \u062e\u0648\u062f\u060c \u0641\u0627\u06cc\u0644\u06cc \u0628\u0627 \u0646\u0627\u0645 tools.go \u062f\u0627\u062e\u0644 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u067e\u0631\u0648\u0698\u0647 \u0628\u0633\u0627\u0632\u06cc\u062f:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>nano tools.go<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u062e\u0637\u0648\u0637 \u0632\u06cc\u0631 \u0631\u0627 \u062f\u0631 \u0641\u0627\u06cc\u0644 tools.go \u0628\u0647\u200c\u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u0627\u0628\u0632\u0627\u0631 \u0628\u0631\u0627\u06cc \u067e\u0631\u0648\u0698\u0647 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><code>tools.go<\/code><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/go:build tools\n\npackage tools\n\nimport _ \"github.com\/99designs\/gqlgen\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u0633\u067e\u0633\u060c \u062f\u0633\u062a\u0648\u0631 tidy \u0631\u0627 \u0628\u0631\u0627\u06cc \u0646\u0635\u0628 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc gqlgen \u06a9\u0647 \u062f\u0631 \u0641\u0627\u06cc\u0644 tools.go \u0645\u0639\u0631\u0641\u06cc \u0634\u062f \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go mod tidy<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0646\u0647\u0627\u06cc\u062a\u060c \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 Gqlgen \u0646\u0635\u0628\u200c\u0634\u062f\u0647\u060c \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc Boilerplate \u0644\u0627\u0632\u0645 \u0628\u0631\u0627\u06cc GraphQL API \u0631\u0627 \u062a\u0648\u0644\u06cc\u062f \u06a9\u0646\u06cc\u062f:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>gqlgen init<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u062c\u0631\u0627\u06cc gqlgen init \u06cc\u06a9 \u0641\u0627\u06cc\u0644 server.go \u0628\u0631\u0627\u06cc \u0627\u062c\u0631\u0627\u06cc \u0633\u0631\u0648\u0631 GraphQL \u0648 \u06cc\u06a9 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc graph \u062d\u0627\u0648\u06cc \u0641\u0627\u06cc\u0644 schema.graphqls \u0628\u0627 \u062a\u0639\u0627\u0631\u06cc\u0641 Schema \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 GraphQL API \u062a\u0648\u0644\u06cc\u062f \u0645\u06cc\u200c\u06a9\u0646\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u062a\u0648\u062c\u0647:<\/strong> \u0627\u06af\u0631 \u067e\u06cc\u0627\u0645 <code>gqlgen: command not found<\/code> \u0631\u0627 \u062f\u06cc\u062f\u06cc\u062f\u060c \u06cc\u0639\u0646\u06cc \u0645\u0633\u06cc\u0631 \u0628\u0627\u06cc\u0646\u0631\u06cc Go \u062f\u0631 PATH \u0634\u0644 \u0634\u0645\u0627 \u0646\u06cc\u0633\u062a. \u0622\u0646 \u0631\u0627 \u0628\u0627 \u0627\u06cc\u0646 \u062f\u0633\u062a\u0648\u0631 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>export PATH=$PATH:$(go env GOPATH)\/bin<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06cc\u0646 \u062e\u0637 \u0631\u0627 \u0628\u0647 \u200e~\/.bashrc \u06cc\u0627 \u200e~\/.zshrc \u062e\u0648\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u062f\u0627\u0626\u0645\u06cc \u0634\u0648\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0627\u06cc\u0646 \u0645\u0631\u062d\u0644\u0647\u060c \u0627\u0632 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 Gqlgen \u0628\u0631\u0627\u06cc \u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc \u0627\u0648\u0644\u06cc\u0647 GraphQL API \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f\u06cc\u062f. \u062f\u0631 \u0627\u062f\u0627\u0645\u0647\u060c Schema \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 GraphQL \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0645\u0631\u062d\u0644\u0647 \u06f2 \u2014 \u062a\u0639\u0631\u06cc\u0641 Schema \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 GraphQL<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0627\u06cc\u0646 \u0645\u0631\u062d\u0644\u0647\u060c Schema \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 GraphQL \u0631\u0627 \u0628\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u0641\u0627\u06cc\u0644 schema.graphqls \u2014 \u06a9\u0647 \u0647\u0646\u06af\u0627\u0645 \u0627\u062c\u0631\u0627\u06cc \u062f\u0633\u062a\u0648\u0631 gqlgen init \u0628\u0647\u200c\u0637\u0648\u0631 \u062e\u0648\u062f\u06a9\u0627\u0631 \u062a\u0648\u0644\u06cc\u062f \u0634\u062f \u2014 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f. \u062f\u0631 \u0627\u06cc\u0646 \u0641\u0627\u06cc\u0644\u060c \u0627\u0646\u0648\u0627\u0639 User \u0648 Query \u0648 Mutation \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0647 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc graph \u0631\u0641\u062a\u0647 \u0648 \u0641\u0627\u06cc\u0644 schema.graphqls \u0631\u0627 \u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f\u061b \u0641\u0627\u06cc\u0644\u06cc \u06a9\u0647 Schema \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 GraphQL \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc\u200c\u06a9\u0646\u062f. Schema Boilerplate \u0631\u0627 \u0628\u0627 \u0628\u0644\u0648\u06a9 \u06a9\u062f \u0632\u06cc\u0631 \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0646\u0648\u0639 User \u0631\u0627 \u0647\u0645\u0631\u0627\u0647 \u0628\u0627 \u06cc\u06a9 Query \u0628\u0631\u0627\u06cc \u062f\u0631\u06cc\u0627\u0641\u062a \u0647\u0645\u0647 \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0648 \u06cc\u06a9 Mutation \u0628\u0631\u0627\u06cc \u062f\u0631\u062c \u062f\u0627\u062f\u0647 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc\u200c\u06a9\u0646\u062f:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><code>schema.graphqls<\/code><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>scalar Upload\n\ntype User {\n  id: ID!\n  fullName: String!\n  email: String!\n  img_uri: String!\n  DateCreated: String!\n}\n\ntype Query {\n  users: &#91;User]!\n}\n\ninput NewUser {\n  fullName: String!\n  email: String!\n  img_uri: String\n  DateCreated: String\n}\n\ninput ProfileImage {\n  userId: String\n  file: Upload\n}\n\ntype Mutation {\n  createUser(input: NewUser!): User!\n  uploadProfileImage(input: ProfileImage!): Boolean!\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0644\u0648\u06a9 \u06a9\u062f\u060c \u062f\u0648 \u0646\u0648\u0639 Mutation \u0648 \u06cc\u06a9 \u0646\u0648\u0639 Query \u0645\u0646\u0641\u0631\u062f \u0628\u0631\u0627\u06cc \u062f\u0631\u06cc\u0627\u0641\u062a \u0647\u0645\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc\u200c\u06a9\u0646\u062f. \u06cc\u06a9 Mutation \u0628\u0631\u0627\u06cc \u062f\u0631\u062c \u06cc\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc \u0645\u0648\u062c\u0648\u062f \u062f\u0631 \u06cc\u06a9 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 GraphQL \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u0634\u0648\u062f\u061b \u062f\u0631\u062d\u0627\u0644\u06cc\u200c\u06a9\u0647 \u06cc\u06a9 Query \u0628\u0631\u0627\u06cc \u0648\u0627\u06a9\u0634\u06cc \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u0633\u062a\u061b \u0645\u0634\u0627\u0628\u0647 \u0641\u0639\u0644 HTTP \u0628\u0627 \u0646\u0627\u0645 GET \u062f\u0631 \u06cc\u06a9 REST API.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Schema \u062f\u0631 \u0628\u0644\u0648\u06a9 \u06a9\u062f \u0628\u0627\u0644\u0627 \u0627\u0632 \u0632\u0628\u0627\u0646 \u062a\u0639\u0631\u06cc\u0641 Schema \u06af\u0631\u0627\u0641\u200c\u06a9\u06cc\u0648\u0627\u0644 \u0628\u0631\u0627\u06cc \u062a\u0639\u0631\u06cc\u0641 \u06cc\u06a9 Mutation \u062d\u0627\u0648\u06cc \u0646\u0648\u0639 CreateUser \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f \u06a9\u0647 \u0648\u0631\u0648\u062f\u06cc NewUser \u0631\u0627 \u0628\u0647\u200c\u0639\u0646\u0648\u0627\u0646 \u067e\u0627\u0631\u0627\u0645\u062a\u0631 \u0645\u06cc\u200c\u067e\u0630\u06cc\u0631\u062f \u0648 \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u0645\u0646\u0641\u0631\u062f \u0628\u0631\u0645\u06cc\u200c\u06af\u0631\u062f\u0627\u0646\u062f. \u0647\u0645\u0686\u0646\u06cc\u0646 \u0634\u0627\u0645\u0644 \u0646\u0648\u0639 uploadProfileImage \u0627\u0633\u062a \u06a9\u0647 ProfileImage \u0631\u0627 \u0645\u06cc\u200c\u067e\u0630\u06cc\u0631\u062f \u0648 \u06cc\u06a9 \u0645\u0642\u062f\u0627\u0631 Boolean \u0628\u0631\u0627\u06cc \u0646\u0634\u0627\u0646\u200c\u062f\u0627\u062f\u0646 \u0648\u0636\u0639\u06cc\u062a \u0645\u0648\u0641\u0642\u06cc\u062a \u0639\u0645\u0644\u06cc\u0627\u062a \u0622\u067e\u0644\u0648\u062f \u0628\u0631\u0645\u06cc\u200c\u06af\u0631\u062f\u0627\u0646\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u062a\u0648\u062c\u0647:<\/strong> Gqlgen \u0628\u0647\u200c\u0637\u0648\u0631 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0646\u0648\u0639 Scalar \u0628\u0627 \u0646\u0627\u0645 Upload \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0631\u062f\u0647 \u0648 \u0645\u0634\u062e\u0635\u0627\u062a \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc\u200c\u06a9\u0646\u062f. \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0622\u0646\u060c \u0641\u0642\u0637 \u0628\u0627\u06cc\u062f \u0622\u0646 \u0631\u0627 \u062f\u0631 \u0628\u0627\u0644\u0627\u06cc \u0641\u0627\u06cc\u0644 Schema \u2014 \u0647\u0645\u0627\u0646\u200c\u0637\u0648\u0631 \u06a9\u0647 \u062f\u0631 \u0628\u0644\u0648\u06a9 \u06a9\u062f \u0628\u0627\u0644\u0627 \u0627\u0646\u062c\u0627\u0645 \u0634\u062f \u2014 \u0627\u0639\u0644\u0627\u0645 \u06a9\u0646\u06cc\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0627\u06cc\u0646 \u0646\u0642\u0637\u0647\u060c \u0633\u0627\u062e\u062a\u0627\u0631 \u0645\u062f\u0644 \u062f\u0627\u062f\u0647 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0631\u062f\u0647\u200c\u0627\u06cc\u062f. \u0642\u062f\u0645 \u0628\u0639\u062f\u06cc\u060c \u062a\u0648\u0644\u06cc\u062f \u062a\u0648\u0627\u0628\u0639 Resolver \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 Query \u0648 Mutation \u0627\u06cc\u0646 Schema \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0642\u0627\u0628\u0644\u06cc\u062a \u062a\u0648\u0644\u06cc\u062f \u06a9\u062f Gqlgen \u0627\u0633\u062a.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0645\u0631\u062d\u0644\u0647 \u06f3 \u2014 \u062a\u0648\u0644\u06cc\u062f Resolver\u0647\u0627\u06cc \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0627\u06cc\u0646 \u0645\u0631\u062d\u0644\u0647\u060c \u0627\u0632 \u0642\u0627\u0628\u0644\u06cc\u062a \u062a\u0648\u0644\u06cc\u062f \u06a9\u062f Gqlgen \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f \u062a\u0627 Resolver\u0647\u0627\u06cc GraphQL \u0631\u0627 \u0628\u0631 \u0627\u0633\u0627\u0633 Schema\u0627\u06cc \u06a9\u0647 \u062f\u0631 \u0645\u0631\u062d\u0644\u0647 \u0642\u0628\u0644 \u0633\u0627\u062e\u062a\u06cc\u062f\u060c \u0628\u0647\u200c\u0637\u0648\u0631 \u062e\u0648\u062f\u06a9\u0627\u0631 \u062a\u0648\u0644\u06cc\u062f \u06a9\u0646\u06cc\u062f. \u06cc\u06a9 Resolver \u062a\u0627\u0628\u0639\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0628\u0631\u0627\u06cc \u06cc\u06a9 \u0641\u06cc\u0644\u062f GraphQL \u0645\u0642\u062f\u0627\u0631\u06cc \u0631\u0627 Resolve \u06cc\u0627 \u0628\u0631\u0645\u06cc\u200c\u06af\u0631\u062f\u0627\u0646\u062f. \u0627\u06cc\u0646 \u0645\u0642\u062f\u0627\u0631 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u06cc\u06a9 \u0622\u0628\u062c\u06a9\u062a \u06cc\u0627 \u06cc\u06a9 \u0646\u0648\u0639 Scalar \u2014 \u0645\u0627\u0646\u0646\u062f \u0631\u0634\u062a\u0647\u060c \u0639\u062f\u062f \u06cc\u0627 \u062d\u062a\u06cc Boolean \u2014 \u0628\u0627\u0634\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u067e\u06a9\u06cc\u062c Gqlgen \u0628\u0631 \u0631\u0648\u06cc\u06a9\u0631\u062f Schema-First \u0628\u0646\u0627 \u0634\u062f\u0647 \u0627\u0633\u062a. \u06cc\u06a9 \u0642\u0627\u0628\u0644\u06cc\u062a \u0648\u0642\u062a\u200c\u0633\u0627\u0632\u0650 Gqlgen\u060c \u062a\u0648\u0627\u0646\u0627\u06cc\u06cc \u062a\u0648\u0644\u06cc\u062f Resolver\u0647\u0627\u06cc \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0634\u0645\u0627 \u0628\u0631 \u0627\u0633\u0627\u0633 Schema \u062a\u0639\u0631\u06cc\u0641\u200c\u0634\u062f\u0647 \u062f\u0631 \u0641\u0627\u06cc\u0644 schema.graphqls \u0627\u0633\u062a. \u0628\u0627 \u0627\u06cc\u0646 \u0642\u0627\u0628\u0644\u06cc\u062a\u060c \u0646\u06cc\u0627\u0632\u06cc \u0628\u0647 \u0646\u0648\u0634\u062a\u0646 \u062f\u0633\u062a\u06cc \u06a9\u062f Boilerplate \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 Resolver\u0647\u0627 \u0646\u062f\u0627\u0631\u06cc\u062f\u061b \u06cc\u0639\u0646\u06cc \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0631\u0648\u06cc \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc Resolver\u0647\u0627\u06cc \u062a\u0639\u0631\u06cc\u0641\u200c\u0634\u062f\u0647 \u062a\u0645\u0631\u06a9\u0632 \u06a9\u0646\u06cc\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0642\u0627\u0628\u0644\u06cc\u062a \u062a\u0648\u0644\u06cc\u062f \u06a9\u062f\u060c \u062f\u0633\u062a\u0648\u0631 \u0632\u06cc\u0631 \u0631\u0627 \u062f\u0631 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u067e\u0631\u0648\u0698\u0647 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u0645\u062f\u0644 \u0648 Resolver\u0647\u0627\u06cc GraphQL API \u062a\u0648\u0644\u06cc\u062f \u0634\u0648\u0646\u062f:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>gqlgen generate<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u067e\u0633 \u0627\u0632 \u0627\u062c\u0631\u0627\u06cc \u062f\u0633\u062a\u0648\u0631 gqlgen generate\u060c \u062f\u0648 \u062e\u0637\u0627\u06cc \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc \u062f\u0631 \u062a\u0631\u0645\u06cc\u0646\u0627\u0644 \u0686\u0627\u067e \u0645\u06cc\u200c\u0634\u0648\u0646\u062f. \u0627\u06cc\u0646 \u062e\u0637\u0627\u0647\u0627 \u0628\u0647 \u0627\u06cc\u0646 \u062f\u0644\u06cc\u0644 \u0631\u062e \u0645\u06cc\u200c\u062f\u0647\u0646\u062f \u06a9\u0647 gqlgen Resolver\u0647\u0627\u06cc Stub \u0642\u062f\u06cc\u0645\u06cc (CreateTodo \u0648 Todos) \u0631\u0627 \u0627\u0632 \u0642\u0627\u0644\u0628 Schema \u067e\u06cc\u0634\u200c\u0641\u0631\u0636 Todo \u062e\u0648\u062f \u0628\u0627 \u062e\u0648\u062f \u0622\u0648\u0631\u062f\u0647 \u06a9\u0647 \u062f\u06cc\u06af\u0631 \u0628\u0627 Schema\u0627\u06cc \u06a9\u0647 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0631\u062f\u06cc\u062f \u0645\u0637\u0627\u0628\u0642\u062a \u0646\u062f\u0627\u0631\u0646\u062f. \u062e\u0631\u0648\u062c\u06cc \u0645\u0634\u0627\u0628\u0647 \u0627\u06cc\u0646 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062e\u0631\u0648\u062c\u06cc:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># parmin\/graph\ngraph\/schema.resolvers.go:22:32: undefined: model.NewTodo\ngraph\/schema.resolvers.go:27:55: undefined: model.Todo<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06cc\u0646 \u062e\u0637\u0627\u0647\u0627 \u0631\u0627 \u0628\u0627 \u062d\u0630\u0641 Stub\u0647\u0627\u06cc \u0642\u062f\u06cc\u0645\u06cc \u062f\u0631 \u0645\u0631\u062d\u0644\u0647 \u0628\u0639\u062f \u0631\u0641\u0639 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f. \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u062c\u062f\u06cc\u062f\u06cc \u0647\u0645 \u062a\u0648\u0644\u06cc\u062f \u0634\u062f\u0647 \u0648 \u067e\u0631\u0648\u0698\u0647 \u0634\u0645\u0627 \u0633\u0627\u062e\u062a\u0627\u0631 \u067e\u0648\u0634\u0647 \u062c\u062f\u06cc\u062f\u06cc \u062e\u0648\u0627\u0647\u062f \u062f\u0627\u0634\u062a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0633\u062a\u0648\u0631 tree \u0631\u0627 \u0627\u0632 \u0631\u06cc\u0634\u0647 \u067e\u0631\u0648\u0698\u0647 \u062e\u0648\u062f \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u062a\u0648\u0644\u06cc\u062f\u0634\u062f\u0647 \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>tree<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u0633\u0627\u062e\u062a\u0627\u0631 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0641\u0639\u0644\u06cc \u0628\u0647 \u0627\u06cc\u0646 \u0634\u06a9\u0644 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062e\u0631\u0648\u062c\u06cc:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go.mod\ngo.sum\ngqlgen.yml\ngraph\n  \u251c\u2500\u2500 db.go\n  \u251c\u2500\u2500 generated\n  \u2502   \u2514\u2500\u2500 generated.go\n  \u251c\u2500\u2500 model\n  \u2502   \u2514\u2500\u2500 models_gen.go\n  \u251c\u2500\u2500 resolver.go\n  \u251c\u2500\u2500 schema.graphqls\n  \u2514\u2500\u2500 schema.resolvers.go\nserver.go\ntmp\n  \u251c\u2500\u2500 build-errors.log\n  \u2514\u2500\u2500 main\ntools.go\n\n2 directories, 8 files<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0645\u06cc\u0627\u0646 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u067e\u0631\u0648\u0698\u0647\u060c \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0645\u0647\u0645 schema.resolvers.go \u0627\u0633\u062a. \u0627\u06cc\u0646 \u0641\u0627\u06cc\u0644 \u0645\u062a\u062f\u0647\u0627\u06cc\u06cc \u0631\u0627 \u062f\u0631 \u0628\u0631 \u062f\u0627\u0631\u062f \u06a9\u0647 \u0627\u0646\u0648\u0627\u0639 Mutation \u0648 Query \u0631\u0627 \u06a9\u0647 \u0642\u0628\u0644\u0627\u064b \u062f\u0631 \u0641\u0627\u06cc\u0644 schema.graphqls \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0646\u062f\u060c \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc \u0631\u0641\u0639 \u062e\u0637\u0627\u0647\u0627\u06cc \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc\u060c \u0645\u062a\u062f\u0647\u0627\u06cc CreateTodo \u0648 Todos \u0631\u0627 \u062f\u0631 \u0627\u0646\u062a\u0647\u0627\u06cc \u0641\u0627\u06cc\u0644 schema.resolvers.go \u062d\u0630\u0641 \u06a9\u0646\u06cc\u062f. Gqlgen \u0627\u06cc\u0646 \u0645\u062a\u062f\u0647\u0627 \u0631\u0627 \u0628\u0647 \u0627\u0646\u062a\u0647\u0627\u06cc \u0641\u0627\u06cc\u0644 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u062f\u0647\u061b \u0686\u0648\u0646 \u062a\u0639\u0627\u0631\u06cc\u0641 \u0646\u0648\u0639 \u062f\u0631 \u0641\u0627\u06cc\u0644 schema.graphqls \u062a\u063a\u06cc\u06cc\u0631 \u06a9\u0631\u062f\u0647 \u0628\u0648\u062f\u0646\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><code>schema.resolvers.go<\/code><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package graph\n\n\/\/ This file will be automatically regenerated based on the schema, any resolver implementations\n\/\/ will be copied through when generating and any unknown code will be moved to the end.\n\nimport (\n    \"context\"\n    \"parmin\/graph\/generated\"\n    \"parmin\/graph\/model\"\n    \"fmt\"\n)\n\nfunc (r *mutationResolver) CreateUser(ctx context.Context, input model.NewUser) (*model.User, error) {\n    panic(fmt.Errorf(\"not implemented\"))\n}\n\nfunc (r *mutationResolver) UploadProfileImage(ctx context.Context, input model.ProfileImage) (bool, error) {\n    panic(fmt.Errorf(\"not implemented\"))\n}\n\nfunc (r *queryResolver) User(ctx context.Context) (*model.User, error) {\n    panic(fmt.Errorf(\"not implemented\"))\n}\n\n\/\/ Mutation returns generated.MutationResolver implementation.\nfunc (r *Resolver) Mutation() generated.MutationResolver { return &amp;mutationResolver{r} }\n\n\/\/ Query returns generated.QueryResolver implementation.\nfunc (r *Resolver) Query() generated.QueryResolver { return &amp;queryResolver{r} }\n\ntype mutationResolver struct{ *Resolver }\ntype queryResolver struct{ *Resolver }\n\n\/\/ !!! WARNING !!!\n\/\/ The code below was going to be deleted when updating resolvers. It has been copied here so you have\n\/\/ one last chance to move it out of harms way if you want. There are two reasons this happens:\n\/\/  - When renaming or deleting a resolver the old code will be put in here. You can safely delete\n\/\/    it when you're done.\n\/\/  - You have helper methods in this file. Move them out to keep these resolver files clean.\n\nfunc (r *mutationResolver) CreateTodo(ctx context.Context, input model.NewTodo) (*model.Todo, error) {\n panic(fmt.Errorf(\"not implemented\"))\n}\nfunc (r *queryResolver) Todos(ctx context.Context) (&#91;]*model.Todo, error) {\n panic(fmt.Errorf(\"not implemented\"))\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u0637\u0628\u0642 \u062a\u0639\u0631\u06cc\u0641 \u0641\u0627\u06cc\u0644 schema.graphqls\u060c \u062a\u0648\u0644\u06cc\u062f\u06a9\u0646\u0646\u062f\u0647 \u06a9\u062f Gqlgen \u062f\u0648 Mutation \u0648 \u06cc\u06a9 \u0645\u062a\u062f Resolver \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 Query \u0633\u0627\u062e\u062a. \u0627\u06cc\u0646 Resolver\u0647\u0627 \u0627\u06cc\u0646 \u0627\u0647\u062f\u0627\u0641 \u0631\u0627 \u062e\u062f\u0645\u062a \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>CreateUser:<\/strong> \u0627\u06cc\u0646 Mutation Resolver\u060c \u06cc\u06a9 \u0631\u06a9\u0648\u0631\u062f \u06a9\u0627\u0631\u0628\u0631 \u062c\u062f\u06cc\u062f \u0631\u0627 \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 Postgres \u0645\u062a\u0635\u0644\u200c\u0634\u062f\u0647 \u062f\u0631\u062c \u0645\u06cc\u200c\u06a9\u0646\u062f.<\/li>\n\n\n\n<li><strong>UploadProfileImage:<\/strong> \u0627\u06cc\u0646 Mutation Resolver\u060c \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0631\u0633\u0627\u0646\u0647\u200c\u0627\u06cc \u062f\u0631\u06cc\u0627\u0641\u062a\u200c\u0634\u062f\u0647 \u0627\u0632 \u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a Multipart HTTP \u0631\u0627 \u06af\u0631\u0641\u062a\u0647 \u0648 \u0641\u0627\u06cc\u0644 \u0631\u0627 \u0628\u0647 \u06cc\u06a9 Bucket \u062f\u0627\u062e\u0644 Spaces \u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f \u0622\u067e\u0644\u0648\u062f \u0645\u06cc\u200c\u06a9\u0646\u062f. \u067e\u0633 \u0627\u0632 \u0622\u067e\u0644\u0648\u062f \u0641\u0627\u06cc\u0644\u060c URL \u0641\u0627\u06cc\u0644 \u0622\u067e\u0644\u0648\u062f\u0634\u062f\u0647 \u062f\u0631 \u0641\u06cc\u0644\u062f img_uri \u06a9\u0627\u0631\u0628\u0631\u0650 \u0642\u0628\u0644\u0627\u064b \u0627\u06cc\u062c\u0627\u062f\u0634\u062f\u0647 \u062f\u0631\u062c \u0645\u06cc\u200c\u0634\u0648\u062f.<\/li>\n\n\n\n<li><strong>Users:<\/strong> \u0627\u06cc\u0646 Query Resolver\u060c \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0647\u0645\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0645\u0648\u062c\u0648\u062f \u06a9\u0648\u0626\u0631\u06cc \u06a9\u0631\u062f\u0647 \u0648 \u0622\u0646\u200c\u0647\u0627 \u0631\u0627 \u0628\u0647\u200c\u0639\u0646\u0648\u0627\u0646 \u0646\u062a\u06cc\u062c\u0647 \u06a9\u0648\u0626\u0631\u06cc \u0628\u0631\u0645\u06cc\u200c\u06af\u0631\u062f\u0627\u0646\u062f.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0627 \u0645\u0631\u0648\u0631 \u0645\u062a\u062f\u0647\u0627\u06cc \u062a\u0648\u0644\u06cc\u062f\u0634\u062f\u0647 \u0627\u0632 \u0627\u0646\u0648\u0627\u0639 Mutation \u0648 Query\u060c \u0645\u062a\u0648\u062c\u0647 \u0645\u06cc\u200c\u0634\u0648\u06cc\u062f \u06a9\u0647 \u0647\u0646\u06af\u0627\u0645 \u0627\u062c\u0631\u0627 \u0628\u0627\u0639\u062b panic \u0628\u0627 \u062e\u0637\u0627\u06cc not implemented \u0645\u06cc\u200c\u0634\u0648\u0646\u062f. \u0627\u06cc\u0646 \u0646\u0634\u0627\u0646 \u0645\u06cc\u200c\u062f\u0647\u062f \u06a9\u0647 \u0647\u0646\u0648\u0632 \u06a9\u062f Boilerplate \u062a\u0648\u0644\u06cc\u062f\u0634\u062f\u0647 \u062e\u0648\u062f\u06a9\u0627\u0631\u0646\u062f. \u0628\u0639\u062f\u0627\u064b \u062f\u0631 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634\u060c \u0628\u0647 \u0641\u0627\u06cc\u0644 schema.resolvers.go \u0628\u0631\u0645\u06cc\u200c\u06af\u0631\u062f\u06cc\u062f \u062a\u0627 \u0627\u06cc\u0646 \u0645\u062a\u062f\u0647\u0627\u06cc \u062a\u0648\u0644\u06cc\u062f\u0634\u062f\u0647 \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0627\u06cc\u0646 \u0646\u0642\u0637\u0647\u060c Resolver\u0647\u0627\u06cc \u0627\u06cc\u0646 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0631\u0627 \u0628\u0631 \u0627\u0633\u0627\u0633 \u0645\u062d\u062a\u0648\u0627\u06cc \u0641\u0627\u06cc\u0644 schema.graphqls \u062a\u0648\u0644\u06cc\u062f \u06a9\u0631\u062f\u06cc\u062f. \u0627\u06a9\u0646\u0648\u0646 \u0627\u0632 \u0633\u0631\u0648\u06cc\u0633 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u062f\u06cc\u0631\u06cc\u062a\u200c\u0634\u062f\u0647 \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647\u200c\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f \u06a9\u0647 \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc \u067e\u0627\u0633\u200c\u062f\u0627\u062f\u0647\u200c\u0634\u062f\u0647 \u0628\u0647 Mutation Resolver\u0647\u0627 \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u0630\u062e\u06cc\u0631\u0647 \u06a9\u0646\u062f.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0645\u0631\u062d\u0644\u0647 \u06f4 \u2014 \u0622\u0645\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0648 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06cc\u06a9 \u0627\u06cc\u0646\u0633\u062a\u0646\u0633 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u062f\u06cc\u0631\u06cc\u062a\u200c\u0634\u062f\u0647 \u062f\u0631 \u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0627\u06cc\u0646 \u0645\u0631\u062d\u0644\u0647\u060c \u0627\u0632 \u06a9\u0646\u0633\u0648\u0644 \u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f \u0628\u0631\u0627\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0647 \u0633\u0631\u0648\u06cc\u0633 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u062f\u06cc\u0631\u06cc\u062a\u200c\u0634\u062f\u0647 \u0648 \u0633\u0627\u062e\u062a \u06cc\u06a9 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 PostgreSQL \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc \u0627\u06cc\u0646 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f. \u067e\u0633 \u0627\u0632 \u0633\u0627\u062e\u062a\u0647\u200c\u0634\u062f\u0646 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647\u060c \u062c\u0632\u0626\u06cc\u0627\u062a \u0631\u0627 \u0628\u0647\u200c\u0635\u0648\u0631\u062a \u0627\u0645\u0646 \u062f\u0631 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 .env \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06af\u0631\u0686\u0647 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u062a\u0635\u0627\u0648\u06cc\u0631 \u0631\u0627 \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0630\u062e\u06cc\u0631\u0647 \u0646\u0645\u06cc\u200c\u06a9\u0646\u062f\u060c \u0647\u0645\u0686\u0646\u0627\u0646 \u0628\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647\u200c\u0627\u06cc \u0628\u0631\u0627\u06cc \u062f\u0631\u062c \u0631\u06a9\u0648\u0631\u062f \u0647\u0631 \u06a9\u0627\u0631\u0628\u0631 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u062f. \u0631\u06a9\u0648\u0631\u062f \u0630\u062e\u06cc\u0631\u0647\u200c\u0634\u062f\u0647 \u0633\u067e\u0633 \u062d\u0627\u0648\u06cc \u0644\u06cc\u0646\u06a9\u200c\u0647\u0627\u06cc\u06cc \u0628\u0647 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u0622\u067e\u0644\u0648\u062f\u0634\u062f\u0647 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0631\u06a9\u0648\u0631\u062f \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u0634\u0627\u0645\u0644 Fullname\u060c email\u060c dateCreated \u0648 \u06cc\u06a9 \u0641\u06cc\u0644\u062f img_uri \u0627\u0632 \u0646\u0648\u0639 \u062f\u0627\u062f\u0647 String \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f. \u0641\u06cc\u0644\u062f img_uri \u062d\u0627\u0648\u06cc URL\u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0628\u0647 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u062a\u0635\u0648\u06cc\u0631\u06cc \u0627\u0634\u0627\u0631\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f \u06a9\u0647 \u062a\u0648\u0633\u0637 \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0627\u06cc\u0646 GraphQL API \u0622\u067e\u0644\u0648\u062f \u0634\u062f\u0647 \u0648 \u062f\u0631 \u06cc\u06a9 Bucket \u0631\u0648\u06cc Spaces \u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f \u062e\u0648\u062f\u060c \u0628\u0647 \u0628\u062e\u0634 Databases \u06a9\u0646\u0633\u0648\u0644 \u0628\u0631\u0648\u06cc\u062f \u062a\u0627 \u06cc\u06a9 \u06a9\u0644\u0627\u0633\u062a\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u062c\u062f\u06cc\u062f \u0628\u0633\u0627\u0632\u06cc\u062f \u0648 PostgreSQL \u0631\u0627 \u0627\u0632 \u0641\u0647\u0631\u0633\u062a \u067e\u0627\u06cc\u06af\u0627\u0647\u200c\u0647\u0627\u06cc \u062f\u0627\u062f\u0647 \u0639\u0631\u0636\u0647\u200c\u0634\u062f\u0647 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0646\u06cc\u062f. \u0647\u0645\u0647 \u0633\u0627\u06cc\u0631 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0631\u0627 \u0631\u0648\u06cc \u0645\u0642\u0627\u062f\u06cc\u0631 \u067e\u06cc\u0634\u200c\u0641\u0631\u0636\u0634\u0627\u0646 \u0628\u06af\u0630\u0627\u0631\u06cc\u062f \u0648 \u0627\u06cc\u0646 \u06a9\u0644\u0627\u0633\u062a\u0631 \u0631\u0627 \u0628\u0627 \u062f\u06a9\u0645\u0647 \u067e\u0627\u06cc\u06cc\u0646 \u0635\u0641\u062d\u0647 \u0628\u0633\u0627\u0632\u06cc\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[\u062a\u0635\u0648\u06cc\u0631: \u06a9\u0644\u0627\u0633\u062a\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u062f\u0631 \u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0641\u0631\u0627\u06cc\u0646\u062f \u0633\u0627\u062e\u062a \u06a9\u0644\u0627\u0633\u062a\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0686\u0646\u062f \u062f\u0642\u06cc\u0642\u0647 \u0637\u0648\u0644 \u0645\u06cc\u200c\u06a9\u0634\u062f \u062a\u0627 \u06a9\u0627\u0645\u0644 \u0634\u0648\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u067e\u0633 \u0627\u0632 \u0633\u0627\u062e\u062a \u06a9\u0644\u0627\u0633\u062a\u0631\u060c \u0645\u0631\u0627\u062d\u0644 \u00abGetting Started\u00bb \u0631\u0627 \u062f\u0631 \u0635\u0641\u062d\u0647 \u06a9\u0644\u0627\u0633\u062a\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u062f\u0646\u0628\u0627\u0644 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u06a9\u0644\u0627\u0633\u062a\u0631 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0622\u0645\u0627\u062f\u0647 \u0634\u0648\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0645\u0631\u062d\u0644\u0647 \u062f\u0648\u0645 \u0631\u0627\u0647\u0646\u0645\u0627\u06cc Getting Started\u060c \u0628\u0631\u0627\u06cc \u0627\u062f\u0627\u0645\u0647 \u0631\u0648\u06cc \u0645\u062a\u0646 \u00abContinue, I\u2019ll do this later\u00bb \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f. \u0628\u0647\u200c\u0635\u0648\u0631\u062a \u067e\u06cc\u0634\u200c\u0641\u0631\u0636\u060c \u06a9\u0644\u0627\u0633\u062a\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0628\u0647 \u0647\u0645\u0647 \u0627\u062a\u0635\u0627\u0644\u0627\u062a \u0628\u0627\u0632 \u0627\u0633\u062a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u062a\u0648\u062c\u0647:<\/strong> \u062f\u0631 \u06cc\u06a9 \u0633\u0646\u0627\u0631\u06cc\u0648\u06cc \u0622\u0645\u0627\u062f\u0647 production\u060c \u0641\u06cc\u0644\u062f \u0648\u0631\u0648\u062f\u06cc \u00abAdd Trusted Sources\u00bb \u062f\u0631 \u0645\u0631\u062d\u0644\u0647 \u062f\u0648\u0645 \u0628\u0627\u06cc\u062f \u0641\u0642\u0637 IP\u0647\u0627\u06cc \u0645\u0648\u0631\u062f \u0627\u0639\u062a\u0645\u0627\u062f \u2014 \u0645\u0627\u0646\u0646\u062f IP \u0633\u0631\u0648\u0631 \u0645\u062c\u0627\u0632\u06cc \u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f \u06a9\u0647 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0631\u0627 \u0627\u062c\u0631\u0627 \u0645\u06cc\u200c\u06a9\u0646\u062f \u2014 \u0631\u0627 \u062f\u0631 \u0628\u0631 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f. \u062f\u0631 \u0637\u0648\u0644 \u062a\u0648\u0633\u0639\u0647\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0647\u200c\u062c\u0627\u06cc \u0622\u0646 IP \u0645\u0627\u0634\u06cc\u0646 \u062a\u0648\u0633\u0639\u0647 \u062e\u0648\u062f \u0631\u0627 \u0628\u0647 \u0641\u06cc\u0644\u062f \u0648\u0631\u0648\u062f\u06cc Add Trusted Sources \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0631\u0648\u06cc \u062f\u06a9\u0645\u0647 \u00abAllow these inbound sources\u00bb \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0647 \u0648 \u0628\u0647 \u0645\u0631\u062d\u0644\u0647 \u0628\u0639\u062f \u0628\u0631\u0648\u06cc\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0645\u0631\u062d\u0644\u0647 \u0628\u0639\u062f\u060c \u062c\u0632\u0626\u06cc\u0627\u062a \u0627\u062a\u0635\u0627\u0644 \u06a9\u0644\u0627\u0633\u062a\u0631 \u0646\u0645\u0627\u06cc\u0634 \u062f\u0627\u062f\u0647 \u0645\u06cc\u200c\u0634\u0648\u0646\u062f. \u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u06a9\u0644\u0627\u0633\u062a\u0631 \u0631\u0627 \u0628\u0627 \u06a9\u0644\u06cc\u06a9 \u0631\u0648\u06cc \u0645\u0646\u0648\u06cc \u06a9\u0634\u0648\u06cc\u06cc Actions \u0648 \u0633\u067e\u0633 \u0627\u0646\u062a\u062e\u0627\u0628 \u06af\u0632\u06cc\u0646\u0647 Connection details \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[\u062a\u0635\u0648\u06cc\u0631: \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0627\u062a\u0635\u0627\u0644 \u06a9\u0644\u0627\u0633\u062a\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u062f\u0631 \u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0627\u06cc\u0646 \u0627\u0633\u06a9\u0631\u06cc\u0646\u200c\u0634\u0627\u062a\u060c \u06a9\u0627\u062f\u0631 \u062e\u0627\u06a9\u0633\u062a\u0631\u06cc \u0633\u0645\u062a \u0631\u0627\u0633\u062a\u060c \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u062a\u0635\u0627\u0644 \u06a9\u0644\u0627\u0633\u062a\u0631 \u062f\u0645\u0648\u06cc \u0633\u0627\u062e\u062a\u0647\u200c\u0634\u062f\u0647 \u0631\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc\u200c\u062f\u0647\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06cc\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u06a9\u0644\u0627\u0633\u062a\u0631 \u0631\u0627 \u0628\u0647\u200c\u0635\u0648\u0631\u062a \u0627\u0645\u0646 \u0628\u0647\u200c\u0639\u0646\u0648\u0627\u0646 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f. \u062f\u0631 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u067e\u0631\u0648\u0698\u0647 parmin\u060c \u06cc\u06a9 \u0641\u0627\u06cc\u0644 .env \u0628\u0633\u0627\u0632\u06cc\u062f \u0648 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u06a9\u0644\u0627\u0633\u062a\u0631 \u062e\u0648\u062f \u0631\u0627 \u0628\u0647 \u0627\u06cc\u0646 \u0642\u0627\u0644\u0628 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f\u061b \u062d\u062a\u0645\u0627\u064b \u0645\u062d\u062a\u0648\u0627\u06cc Placeholder \u0647\u0627\u06cc\u0644\u0627\u06cc\u062a\u200c\u0634\u062f\u0647 \u0631\u0627 \u0628\u0627 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062e\u0648\u062f\u062a\u0627\u0646 \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u06a9\u0646\u06cc\u062f:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><code>.env<\/code><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"> <code>DB_PASSWORD=YOUR_DB_PASSWORD\n DB_PORT=PORT\n DB_NAME=YOUR_DATABASE_NAME\n DB_ADDR=HOST\n DB_USER=USERNAME<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0627 \u0630\u062e\u06cc\u0631\u0647\u200c\u0634\u062f\u0646 \u0627\u0645\u0646 \u062c\u0632\u0626\u06cc\u0627\u062a \u0627\u062a\u0635\u0627\u0644 \u062f\u0631 \u0641\u0627\u06cc\u0644 .env\u060c \u0642\u062f\u0645 \u0628\u0639\u062f\u06cc \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0627\u06cc\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0648 \u0627\u062a\u0635\u0627\u0644 \u06a9\u0644\u0627\u0633\u062a\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0628\u0647 \u067e\u0631\u0648\u0698\u0647 \u0634\u0645\u0627\u0633\u062a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0642\u0628\u0644 \u0627\u0632 \u0627\u062f\u0627\u0645\u0647\u060c \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631 \u0628\u0627 \u067e\u06a9\u06cc\u062c SQL \u0628\u0648\u0645\u06cc Golang \u0647\u0646\u06af\u0627\u0645 \u0627\u062a\u0635\u0627\u0644 \u0628\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 Postgres\u060c \u0628\u0647 \u06cc\u06a9 \u062f\u0631\u0627\u06cc\u0648\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u062f. go-pg \u06cc\u06a9 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 Golang \u0628\u0631\u0627\u06cc \u062a\u0631\u062c\u0645\u0647 \u06a9\u0648\u0626\u0631\u06cc\u200c\u0647\u0627\u06cc ORM (\u0646\u06af\u0627\u0634\u062a \u0634\u06cc\u0621-\u0631\u0627\u0628\u0637\u0647\u200c\u0627\u06cc) \u0628\u0647 \u06a9\u0648\u0626\u0631\u06cc\u200c\u0647\u0627\u06cc SQL \u0628\u0631\u0627\u06cc \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 Postgres \u0627\u0633\u062a. godotenv \u06cc\u06a9 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 Golang \u0628\u0631\u0627\u06cc \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0645\u062d\u06cc\u0637\u06cc \u0627\u0632 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 .env \u0628\u0647 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0634\u0645\u0627\u0633\u062a. \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a\u060c go.uuid \u0628\u0631\u0627\u06cc \u0647\u0631 \u0631\u06a9\u0648\u0631\u062f \u06a9\u0627\u0631\u0628\u0631\u06cc \u06a9\u0647 \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u062f\u0631\u062c \u0645\u06cc\u200c\u0634\u0648\u062f\u060c \u06cc\u06a9 UUID (\u0634\u0646\u0627\u0633\u0647 \u06cc\u06a9\u062a\u0627\u06cc \u062c\u0647\u0627\u0646\u06cc) \u062a\u0648\u0644\u06cc\u062f \u0645\u06cc\u200c\u06a9\u0646\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06cc\u0646 \u062f\u0633\u062a\u0648\u0631 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0646\u0635\u0628 \u0627\u06cc\u0646 \u0645\u0648\u0627\u0631\u062f \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go get github.com\/go-pg\/pg\/v10 github.com\/joho\/godotenv github.com\/satori\/go.uuid<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u062a\u0648\u062c\u0647:<\/strong> \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634 \u0627\u0632 go-pg \u0646\u0633\u062e\u0647 v10 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f \u06a9\u0647 \u0647\u0645\u0686\u0646\u0627\u0646 \u0628\u0627 \u0646\u0633\u062e\u0647\u200c\u0647\u0627\u06cc \u0641\u0639\u0644\u06cc Go \u0633\u0627\u0632\u06af\u0627\u0631 \u0627\u0633\u062a. \u0628\u0631\u0627\u06cc \u067e\u0631\u0648\u0698\u0647\u200c\u0647\u0627\u06cc \u062c\u062f\u06cc\u062f\u060c ORM \u0628\u0627 \u0646\u0627\u0645 bun \u0627\u0632 \u0647\u0645\u0627\u0646 \u0646\u06af\u0647\u062f\u0627\u0631\u0646\u062f\u0647 \u0631\u0627 \u062f\u0631 \u0646\u0638\u0631 \u0628\u06af\u06cc\u0631\u06cc\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0633\u067e\u0633\u060c \u0628\u0647 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc graph \u0631\u0641\u062a\u0647 \u0648 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 db.go \u0628\u0633\u0627\u0632\u06cc\u062f. \u06a9\u062f \u062f\u0627\u062e\u0644 \u0627\u06cc\u0646 \u0641\u0627\u06cc\u0644 \u0631\u0627 \u0628\u0647\u200c\u062a\u062f\u0631\u06cc\u062c \u0628\u0631\u0627\u06cc \u0627\u062a\u0635\u0627\u0644 \u0628\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 Postgres\u0650 \u0633\u0627\u062e\u062a\u0647\u200c\u0634\u062f\u0647 \u062f\u0631 \u06a9\u0644\u0627\u0633\u062a\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u062f\u06cc\u0631\u06cc\u062a\u200c\u0634\u062f\u0647\u060c \u06a9\u0646\u0627\u0631 \u0647\u0645 \u0645\u06cc\u200c\u06af\u0630\u0627\u0631\u06cc\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0628\u062a\u062f\u0627\u060c \u0645\u062d\u062a\u0648\u0627\u06cc \u0628\u0644\u0648\u06a9 \u06a9\u062f \u0631\u0627 \u0628\u0647 \u0641\u0627\u06cc\u0644 db.go \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f. \u0627\u06cc\u0646 \u062a\u0627\u0628\u0639 (createSchema) \u0628\u0644\u0627\u0641\u0627\u0635\u0644\u0647 \u067e\u0633 \u0627\u0632 \u0628\u0631\u0642\u0631\u0627\u0631\u06cc \u0627\u062a\u0635\u0627\u0644 \u0628\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647\u060c \u06cc\u06a9 \u062c\u062f\u0648\u0644 \u06a9\u0627\u0631\u0628\u0631 \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 Postgres \u0645\u06cc\u200c\u0633\u0627\u0632\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><code>db.go<\/code><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package graph\n\nimport (\n    \"github.com\/go-pg\/pg\/v10\"\n    \"github.com\/go-pg\/pg\/v10\/orm\"\n    \"parmin\/graph\/model\"\n)\n\nfunc createSchema(db *pg.DB) error {\n    for _, models := range &#91;]interface{}{(*model.User)(nil)}{\n        if err := db.Model(models).CreateTable(&amp;orm.CreateTableOptions{\n            IfNotExists: true,\n        }); err != nil {\n            panic(err)\n        }\n    }\n\n    return nil\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06af\u0632\u06cc\u0646\u0647 IfNotExists \u06a9\u0647 \u0628\u0647 \u0645\u062a\u062f CreateTable \u0627\u0632 go-pg \u067e\u0627\u0633 \u0645\u06cc\u200c\u0634\u0648\u062f\u060c \u062a\u0627\u0628\u0639 createSchema \u0641\u0642\u0637 \u062f\u0631 \u0635\u0648\u0631\u062a\u06cc \u062c\u062f\u0648\u0644 \u062c\u062f\u06cc\u062f\u06cc \u0631\u0627 \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u062f\u0631\u062c \u0645\u06cc\u200c\u06a9\u0646\u062f \u06a9\u0647 \u062c\u062f\u0648\u0644 \u0648\u062c\u0648\u062f \u0646\u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f. \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u06cc\u0646 \u0641\u0631\u0627\u06cc\u0646\u062f \u0631\u0627 \u0634\u06a9\u0644 \u0633\u0627\u062f\u0647\u200c\u0634\u062f\u0647\u200c\u0627\u06cc \u0627\u0632 Seed \u06a9\u0631\u062f\u0646 \u06cc\u06a9 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u062a\u0627\u0632\u0647\u200c\u0633\u0627\u062e\u062a\u0647 \u062f\u0631\u06a9 \u06a9\u0646\u06cc\u062f. \u0628\u0647\u200c\u062c\u0627\u06cc \u0633\u0627\u062e\u062a \u062f\u0633\u062a\u06cc \u062c\u062f\u0648\u0644\u200c\u0647\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u06a9\u0644\u0627\u06cc\u0646\u062a psql \u06cc\u0627 \u0631\u0627\u0628\u0637 \u06af\u0631\u0627\u0641\u06cc\u06a9\u06cc\u060c \u062a\u0627\u0628\u0639 createSchema \u06a9\u0627\u0631 \u0633\u0627\u062e\u062a \u062c\u062f\u0648\u0644 \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc\u200c\u062f\u0647\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0633\u067e\u0633\u060c \u0645\u062d\u062a\u0648\u0627\u06cc \u0628\u0644\u0648\u06a9 \u06a9\u062f \u0632\u06cc\u0631 \u0631\u0627 \u0628\u0647 \u0641\u0627\u06cc\u0644 db.go \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u06cc\u06a9 \u0627\u062a\u0635\u0627\u0644 \u0628\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 Postgres \u0628\u0631\u0642\u0631\u0627\u0631 \u0634\u062f\u0647 \u0648 \u062a\u0627\u0628\u0639 createConfig \u0628\u0627\u0644\u0627 \u067e\u0633 \u0627\u0632 \u0628\u0631\u0642\u0631\u0627\u0631\u06cc \u0645\u0648\u0641\u0642 \u0627\u062a\u0635\u0627\u0644 \u0627\u062c\u0631\u0627 \u0634\u0648\u062f:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><code>db.go<\/code><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import (\n      \/\/ ...\n\n         \"fmt\" \n         \"os\" \n    )\n\nfunc Connect() *pg.DB {\n    DB_PASSWORD := os.Getenv(\"DB_PASSWORD\")\n    DB_PORT := os.Getenv(\"DB_PORT\")\n    DB_NAME := os.Getenv(\"DB_NAME\")\n    DB_ADDR := os.Getenv(\"DB_ADDR\")\n    DB_USER := os.Getenv(\"DB_USER\")\n\n    connStr := fmt.Sprintf(\n        \"postgresql:\/\/%v:%v@%v:%v\/%v?sslmode=require\",\n        DB_USER, DB_PASSWORD, DB_ADDR, DB_PORT, DB_NAME )\n\n    opt, err := pg.ParseURL(connStr); if err != nil {\n      panic(err)\n      }\n\n    db := pg.Connect(opt)\n\n    if schemaErr := createSchema(db); schemaErr != nil {\n        panic(schemaErr)\n    }\n\n    if _, DBStatus := db.Exec(\"SELECT 1\"); DBStatus != nil {\n        panic(\"PostgreSQL is down\")\n    }\n\n    return db\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u0647\u0646\u06af\u0627\u0645 \u0627\u062c\u0631\u0627\u060c \u062a\u0627\u0628\u0639 Export \u0634\u062f\u0647 Connect \u062f\u0631 \u0628\u0644\u0648\u06a9 \u06a9\u062f \u0628\u0627\u0644\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 go-pg \u06cc\u06a9 \u0627\u062a\u0635\u0627\u0644 \u0628\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 Postgres \u0628\u0631\u0642\u0631\u0627\u0631 \u0645\u06cc\u200c\u06a9\u0646\u062f. \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0639\u0645\u0644\u06cc\u0627\u062a \u0632\u06cc\u0631 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc\u200c\u0634\u0648\u062f:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0628\u062a\u062f\u0627\u060c \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647\u200c\u0627\u06cc \u06a9\u0647 \u062f\u0631 \u0641\u0627\u06cc\u0644 .env \u0631\u06cc\u0634\u0647 \u0630\u062e\u06cc\u0631\u0647 \u06a9\u0631\u062f\u0647\u200c\u0627\u06cc\u062f \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0645\u06cc\u200c\u0634\u0648\u0646\u062f. \u0633\u067e\u0633\u060c \u0645\u062a\u063a\u06cc\u0631\u06cc \u0633\u0627\u062e\u062a\u0647 \u0645\u06cc\u200c\u0634\u0648\u062f \u06a9\u0647 \u0631\u0634\u062a\u0647\u200c\u0627\u06cc \u0642\u0627\u0644\u0628\u200c\u0628\u0646\u062f\u06cc\u200c\u0634\u062f\u0647 \u0628\u0627 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc\u200c\u0634\u062f\u0647 \u0631\u0627 \u0630\u062e\u06cc\u0631\u0647 \u06a9\u0646\u062f. \u0627\u06cc\u0646 \u0645\u062a\u063a\u06cc\u0631 \u0647\u0646\u06af\u0627\u0645 \u0627\u062a\u0635\u0627\u0644 \u0628\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0628\u0647\u200c\u0639\u0646\u0648\u0627\u0646 URI \u0627\u062a\u0635\u0627\u0644 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u062f \u0634\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0633\u067e\u0633\u060c \u0631\u0634\u062a\u0647 \u0627\u062a\u0635\u0627\u0644 \u0633\u0627\u062e\u062a\u0647\u200c\u0634\u062f\u0647 \u062a\u062c\u0632\u06cc\u0647 \u0645\u06cc\u200c\u0634\u0648\u062f \u062a\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0642\u0627\u0644\u0628\u200c\u0628\u0646\u062f\u06cc\u200c\u0634\u062f\u0647 \u0645\u0639\u062a\u0628\u0631\u0646\u062f \u06cc\u0627 \u0646\u0647. \u062f\u0631 \u0635\u0648\u0631\u062a \u0645\u0639\u062a\u0628\u0631 \u0628\u0648\u062f\u0646\u060c \u0631\u0634\u062a\u0647 \u0627\u062a\u0635\u0627\u0644 \u0628\u0647 \u0645\u062a\u062f connect \u0628\u0647\u200c\u0639\u0646\u0648\u0627\u0646 \u0622\u0631\u06af\u0648\u0645\u0627\u0646 \u067e\u0627\u0633 \u062f\u0627\u062f\u0647 \u0634\u062f\u0647 \u062a\u0627 \u0627\u062a\u0635\u0627\u0644\u06cc \u0628\u0631\u0642\u0631\u0627\u0631 \u0634\u0648\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062a\u0627\u0628\u0639 Export \u0634\u062f\u0647 Connect\u060c \u0628\u0627\u06cc\u062f \u062a\u0627\u0628\u0639 \u0631\u0627 \u0628\u0647 \u0641\u0627\u06cc\u0644 server.go \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0647\u0646\u06af\u0627\u0645 \u0634\u0631\u0648\u0639 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0627\u062c\u0631\u0627 \u0634\u0648\u062f. \u0633\u067e\u0633 \u0627\u062a\u0635\u0627\u0644 \u0631\u0627 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646 \u062f\u0631 \u0641\u06cc\u0644\u062f DB \u062f\u0627\u062e\u0644 \u0633\u0627\u062e\u062a\u0627\u0631 Resolver \u0630\u062e\u06cc\u0631\u0647 \u06a9\u0631\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062a\u0627\u0628\u0639 Connect \u06a9\u0647 \u0642\u0628\u0644\u0627\u064b \u0627\u0632 \u067e\u06a9\u06cc\u062c graph \u0633\u0627\u062e\u062a\u0647 \u0634\u062f \u2014 \u0628\u0644\u0627\u0641\u0627\u0635\u0644\u0647 \u067e\u0633 \u0627\u0632 \u0634\u0631\u0648\u0639 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u2014 \u0648 \u0628\u0631\u0627\u06cc \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u0632 \u0641\u0627\u06cc\u0644 .env \u0628\u0647 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646\u060c \u0641\u0627\u06cc\u0644 server.go \u0631\u0627 \u062f\u0631 \u0648\u06cc\u0631\u0627\u06cc\u0634\u06af\u0631 \u06a9\u062f \u062f\u0644\u062e\u0648\u0627\u0647 \u062e\u0648\u062f \u0628\u0627\u0632 \u06a9\u0631\u062f\u0647 \u0648 \u062e\u0637\u0648\u0637 \u0647\u0627\u06cc\u0644\u0627\u06cc\u062a\u200c\u0634\u062f\u0647 \u0632\u06cc\u0631 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u062a\u0648\u062c\u0647:<\/strong> \u0645\u0637\u0645\u0626\u0646 \u0634\u0648\u06cc\u062f \u0645\u062a\u063a\u06cc\u0631 srv \u0645\u0648\u062c\u0648\u062f \u062f\u0631 \u0641\u0627\u06cc\u0644 server.go \u0631\u0627 \u0628\u0627 \u0645\u062a\u063a\u06cc\u0631 srv \u0647\u0627\u06cc\u0644\u0627\u06cc\u062a\u200c\u0634\u062f\u0647 \u0632\u06cc\u0631 \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><code>server.go<\/code><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"> <code>package main\n\nimport (\n  \"log\"\n  \"net\/http\"\n  \"os\"\n  \"parmin\/graph\"\n  \"parmin\/graph\/generated\"\n\n  \"github.com\/99designs\/gqlgen\/graphql\/handler\"\n  \"github.com\/99designs\/gqlgen\/graphql\/playground\"\n \"github.com\/joho\/godotenv\"\n)\n\nconst defaultPort = \"8080\"\n\nfunc main() {\n     err := godotenv.Load(); if err != nil {\n     log.Fatal(\"Error loading .env file\")\n    } \n\n  \/\/ ...\n\n     Database := graph.Connect()\n     srv := handler.NewDefaultServer(\n             generated.NewExecutableSchema(\n                     generated.Config{\n                         Resolvers: &amp;graph.Resolver{\n                             DB: Database,\n                         },\n                     }),\n         )\n\n  \/\/ ...\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0627\u06cc\u0646 \u0642\u0637\u0639\u0647 \u06a9\u062f\u060c \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0630\u062e\u06cc\u0631\u0647\u200c\u0634\u062f\u0647 \u062f\u0631 .env \u0631\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u062a\u0627\u0628\u0639 ()Load \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u06a9\u0631\u062f\u06cc\u062f. \u062a\u0627\u0628\u0639 Connect \u0631\u0627 \u0627\u0632 \u067e\u06a9\u06cc\u062c db \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u06a9\u0631\u062f\u0647 \u0648 \u0622\u0628\u062c\u06a9\u062a Resolver \u0631\u0627 \u0647\u0645 \u0628\u0627 \u0627\u062a\u0635\u0627\u0644 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0630\u062e\u06cc\u0631\u0647\u200c\u0634\u062f\u0647 \u062f\u0631 \u0641\u06cc\u0644\u062f DB \u0633\u0627\u062e\u062a\u06cc\u062f. (\u0627\u062a\u0635\u0627\u0644 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0630\u062e\u06cc\u0631\u0647\u200c\u0634\u062f\u0647 \u0628\u0639\u062f\u0627\u064b \u062f\u0631 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634 \u062a\u0648\u0633\u0637 Resolver\u0647\u0627 \u0642\u0627\u0628\u0644 \u062f\u0633\u062a\u0631\u0633\u06cc \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f.)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u062d\u0627\u0644 \u062d\u0627\u0636\u0631\u060c \u0633\u0627\u062e\u062a\u0627\u0631 Resolver \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 Boilerplate \u062f\u0631 \u0641\u0627\u06cc\u0644 resolver.go\u060c \u0641\u06cc\u0644\u062f DB\u0627\u06cc \u0631\u0627 \u06a9\u0647 \u0627\u062a\u0635\u0627\u0644 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0631\u0627 \u062f\u0631 \u06a9\u062f \u0628\u0627\u0644\u0627 \u0630\u062e\u06cc\u0631\u0647 \u06a9\u0631\u062f\u06cc\u062f\u060c \u062f\u0631 \u0628\u0631 \u0646\u062f\u0627\u0631\u062f. \u0628\u0627\u06cc\u062f \u0641\u06cc\u0644\u062f DB \u0631\u0627 \u0628\u0633\u0627\u0632\u06cc\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc graph\u060c \u0641\u0627\u06cc\u0644 resolver.go \u0631\u0627 \u0628\u0627\u0632 \u06a9\u0631\u062f\u0647 \u0648 \u0633\u0627\u062e\u062a\u0627\u0631 Resolver \u0631\u0627 \u0637\u0648\u0631\u06cc \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u06cc\u062f \u06a9\u0647 \u0641\u06cc\u0644\u062f\u06cc DB \u0628\u0627 \u0646\u0648\u0639 Pointer \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 go-pg \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f\u061b \u0647\u0645\u0627\u0646\u200c\u0637\u0648\u0631 \u06a9\u0647 \u0632\u06cc\u0631 \u0646\u0634\u0627\u0646 \u062f\u0627\u062f\u0647 \u0634\u062f\u0647:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><code>resolver.go<\/code><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package graph\n\nimport \"github.com\/go-pg\/pg\/v10\"\n\n\/\/ This file will not be regenerated automatically.\n\/\/\n\/\/ It serves as dependency injection for your app, add any dependencies you require here.\n\ntype Resolver struct {\n    DB *pg.DB\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06a9\u0646\u0648\u0646 \u0647\u0631 \u0628\u0627\u0631 \u06a9\u0647 \u0641\u0627\u06cc\u0644 \u0648\u0631\u0648\u062f\u06cc server.go \u0627\u062c\u0631\u0627 \u0634\u0648\u062f\u060c \u06cc\u06a9 \u0627\u062a\u0635\u0627\u0644 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0628\u0631\u0642\u0631\u0627\u0631 \u0645\u06cc\u200c\u0634\u0648\u062f \u0648 \u067e\u06a9\u06cc\u062c go-pg \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u0628\u0647\u200c\u0639\u0646\u0648\u0627\u0646 ORM \u0627\u0632 \u062a\u0648\u0627\u0628\u0639 Resolver \u0631\u0648\u06cc \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0639\u0645\u0644\u06cc\u0627\u062a \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0627\u06cc\u0646 \u0645\u0631\u062d\u0644\u0647\u060c \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0633\u0631\u0648\u06cc\u0633 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u062f\u06cc\u0631\u06cc\u062a\u200c\u0634\u062f\u0647 \u062f\u0631 \u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f\u060c \u06cc\u06a9 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 PostgreSQL \u0633\u0627\u062e\u062a\u06cc\u062f. \u0647\u0645\u0686\u0646\u06cc\u0646 \u0641\u0627\u06cc\u0644 db.go \u0628\u0627 \u062a\u0627\u0628\u0639 Connect \u0631\u0627 \u0633\u0627\u062e\u062a\u06cc\u062f \u062a\u0627 \u0647\u0646\u06af\u0627\u0645 \u0634\u0631\u0648\u0639 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646\u060c \u0627\u062a\u0635\u0627\u0644\u06cc \u0628\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 PostgreSQL \u0628\u0631\u0642\u0631\u0627\u0631 \u0634\u0648\u062f. \u062f\u0631 \u0627\u062f\u0627\u0645\u0647\u060c Resolver\u0647\u0627\u06cc \u062a\u0648\u0644\u06cc\u062f\u0634\u062f\u0647 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u062f\u0627\u062f\u0647\u200c\u0647\u0627 \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 PostgreSQL \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0645\u0631\u062d\u0644\u0647 \u06f5 \u2014 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc Resolver\u0647\u0627\u06cc \u062a\u0648\u0644\u06cc\u062f\u0634\u062f\u0647<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0627\u06cc\u0646 \u0645\u0631\u062d\u0644\u0647\u060c \u0645\u062a\u062f\u0647\u0627\u06cc \u0645\u0648\u062c\u0648\u062f \u062f\u0631 \u0641\u0627\u06cc\u0644 schema.resolvers.go \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f\u061b \u0641\u0627\u06cc\u0644\u06cc \u06a9\u0647 \u0628\u0647\u200c\u0639\u0646\u0648\u0627\u0646 Resolver\u0647\u0627\u06cc Mutation \u0648 Query \u0639\u0645\u0644 \u0645\u06cc\u200c\u06a9\u0646\u062f. Mutation Resolver\u0647\u0627\u06cc \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc\u200c\u0634\u062f\u0647\u060c \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u0645\u06cc\u200c\u0633\u0627\u0632\u0646\u062f \u0648 \u062a\u0635\u0648\u06cc\u0631 \u067e\u0631\u0648\u0641\u0627\u06cc\u0644 \u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u0622\u067e\u0644\u0648\u062f \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f\u061b \u062f\u0631\u062d\u0627\u0644\u06cc\u200c\u06a9\u0647 Query Resolver \u0647\u0645\u0647 \u062c\u0632\u0626\u06cc\u0627\u062a \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0630\u062e\u06cc\u0631\u0647\u200c\u0634\u062f\u0647 \u0631\u0627 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0645\u06cc\u200c\u06a9\u0646\u062f.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0645\u062a\u062f\u0647\u0627\u06cc Mutation Resolver<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0641\u0627\u06cc\u0644 schema.graphqls\u060c \u062f\u0648 Mutation Resolver \u062a\u0648\u0644\u06cc\u062f \u0634\u062f\u0646\u062f. \u06cc\u06a9\u06cc \u0628\u0627 \u0647\u062f\u0641 \u062f\u0631\u062c \u0631\u06a9\u0648\u0631\u062f \u06a9\u0627\u0631\u0628\u0631 \u0648 \u062f\u06cc\u06af\u0631\u06cc \u0628\u0631\u0627\u06cc \u0647\u0646\u062f\u0644 \u0622\u067e\u0644\u0648\u062f \u062a\u0635\u0627\u0648\u06cc\u0631 \u067e\u0631\u0648\u0641\u0627\u06cc\u0644. \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644\u060c \u0627\u06cc\u0646 Mutation\u0647\u0627 \u0647\u0646\u0648\u0632 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0646\u0634\u062f\u0647\u200c\u0627\u0646\u062f\u061b \u0686\u0648\u0646 \u06a9\u062f Boilerplate \u0647\u0633\u062a\u0646\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0641\u0627\u06cc\u0644 schema.resolvers.go \u0631\u0627 \u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f. \u0627\u06cc\u0645\u067e\u0648\u0631\u062a\u200c\u0647\u0627 \u0648 Mutation \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 CreateUser \u0631\u0627 \u0628\u0627 \u062e\u0637\u0648\u0637 \u0647\u0627\u06cc\u0644\u0627\u06cc\u062a\u200c\u0634\u062f\u0647 \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u06cc\u062f \u062a\u0627 \u0633\u0637\u0631 \u062c\u062f\u06cc\u062f\u06cc \u062d\u0627\u0648\u06cc \u0648\u0631\u0648\u062f\u06cc \u062c\u0632\u0626\u06cc\u0627\u062a \u06a9\u0627\u0631\u0628\u0631 \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u062f\u0631\u062c \u0634\u0648\u062f:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><code>schema.resolvers.go<\/code><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package graph\n\nimport (\n  \"context\"\n  \"fmt\"\n   \"time\"\n\n  \"parmin\/graph\/generated\"\n  \"parmin\/graph\/model\"\n  \"github.com\/satori\/go.uuid\"\n)\n\nfunc (r *mutationResolver) CreateUser(ctx context.Context, input model.NewUser) (*model.User, error) {\n     user := model.User{\n         ID:          fmt.Sprintf(\"%v\", uuid.NewV4()),\n         FullName:    input.FullName,\n         Email:       input.Email,\n         ImgURI:      \"https:\/\/bit.ly\/3mCSn2i\",\n         DateCreated: time.Now().Format(\"01-02-2006\"),\n     }\n\n     _, err := r.DB.Model(&amp;user).Insert(); if err != nil {\n         return nil, fmt.Errorf(\"error inserting user: %v\", err)\n     }\n\n     return &amp;user, nil\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 Mutation \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 CreateUser\u060c \u062f\u0648 \u0646\u06a9\u062a\u0647 \u062f\u0631\u0628\u0627\u0631\u0647 \u0633\u0637\u0631\u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u0650 \u062f\u0631\u062c\u200c\u0634\u062f\u0647 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f. \u0627\u0648\u0644 \u0627\u06cc\u0646\u06a9\u0647 \u0628\u0647 \u0647\u0631 \u0633\u0637\u0631 \u062f\u0631\u062c\u200c\u0634\u062f\u0647 \u06cc\u06a9 UUID \u062f\u0627\u062f\u0647 \u0645\u06cc\u200c\u0634\u0648\u062f. \u062f\u0648\u0645\u060c \u0641\u06cc\u0644\u062f ImgURI \u062f\u0631 \u0647\u0631 \u0633\u0637\u0631 \u06cc\u06a9 URL \u062a\u0635\u0648\u06cc\u0631 Placeholder \u0628\u0647\u200c\u0639\u0646\u0648\u0627\u0646 \u0645\u0642\u062f\u0627\u0631 \u067e\u06cc\u0634\u200c\u0641\u0631\u0636 \u062f\u0627\u0631\u062f. \u0627\u06cc\u0646 \u0645\u0642\u062f\u0627\u0631 \u067e\u06cc\u0634\u200c\u0641\u0631\u0636\u0650 \u0647\u0645\u0647 \u0631\u06a9\u0648\u0631\u062f\u0647\u0627 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f \u0648 \u0648\u0642\u062a\u06cc \u06a9\u0627\u0631\u0628\u0631 \u062a\u0635\u0648\u06cc\u0631 \u062c\u062f\u06cc\u062f\u06cc \u0622\u067e\u0644\u0648\u062f \u06a9\u0646\u062f\u060c \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0645\u06cc\u200c\u0634\u0648\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0633\u067e\u0633\u060c \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646\u06cc \u06a9\u0647 \u062a\u0627 \u0627\u06cc\u0646 \u0646\u0642\u0637\u0647 \u0633\u0627\u062e\u062a\u0647 \u0634\u062f\u0647 \u0631\u0627 \u062a\u0633\u062a \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f. \u0627\u0632 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u067e\u0631\u0648\u0698\u0647\u060c \u0641\u0627\u06cc\u0644 server.go \u0631\u0627 \u0628\u0627 \u062f\u0633\u062a\u0648\u0631 \u0632\u06cc\u0631 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go run .\/server.go<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u062d\u0627\u0644\u0627\u060c \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0645\u0631\u0648\u0631\u06af\u0631 \u0648\u0628 \u062e\u0648\u062f \u0628\u0647 <a href=\"http:\/\/localhost:8080\">http:\/\/localhost:8080<\/a> \u0628\u0631\u0648\u06cc\u062f \u062a\u0627 \u0628\u0647 GraphQL Playground \u062f\u0627\u062e\u0644\u06cc\u0650 GraphQL API \u062e\u0648\u062f \u062f\u0633\u062a\u0631\u0633\u06cc \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f. Mutation \u06af\u0631\u0627\u0641\u200c\u06a9\u06cc\u0648\u0627\u0644\u0650 \u0628\u0644\u0648\u06a9 \u06a9\u062f \u0632\u06cc\u0631 \u0631\u0627 \u062f\u0631 \u0648\u06cc\u0631\u0627\u06cc\u0634\u06af\u0631 Playground \u062c\u0627\u06cc\u200c\u06af\u0630\u0627\u0631\u06cc \u06a9\u0646\u06cc\u062f \u062a\u0627 \u06cc\u06a9 \u0631\u06a9\u0648\u0631\u062f \u06a9\u0627\u0631\u0628\u0631 \u062c\u062f\u06cc\u062f \u062f\u0631\u062c \u0634\u0648\u062f:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mutation createUser {\n  createUser(\n    input: {\n      email: \"johndoe@gmail.com\"\n      fullName: \"John Doe\"\n    }\n  ) {\n    id\n  }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u062e\u0631\u0648\u062c\u06cc \u062f\u0631 \u067e\u0646\u0644 \u0633\u0645\u062a \u0631\u0627\u0633\u062a \u0645\u0634\u0627\u0628\u0647 \u0627\u06cc\u0646 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[\u062a\u0635\u0648\u06cc\u0631: \u0627\u062c\u0631\u0627\u06cc Mutation \u0633\u0627\u062e\u062a \u06a9\u0627\u0631\u0628\u0631 \u062f\u0631 GraphQL Playground]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0634\u0645\u0627 Mutation \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 CreateUser \u0631\u0627 \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u062a\u0633\u062a\u06cc \u0628\u0627 \u0646\u0627\u0645 John Doe \u0627\u062c\u0631\u0627 \u06a9\u0631\u062f\u06cc\u062f \u0648 id \u0631\u06a9\u0648\u0631\u062f \u06a9\u0627\u0631\u0628\u0631 \u062a\u0627\u0632\u0647 \u062f\u0631\u062c\u200c\u0634\u062f\u0647 \u0628\u0647\u200c\u0639\u0646\u0648\u0627\u0646 \u0646\u062a\u06cc\u062c\u0647 Mutation \u0628\u0631\u06af\u0631\u062f\u0627\u0646\u062f\u0647 \u0634\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u062a\u0648\u062c\u0647:<\/strong> \u0645\u0642\u062f\u0627\u0631 id \u0628\u0631\u06af\u0631\u062f\u0627\u0646\u062f\u0647\u200c\u0634\u062f\u0647 \u0627\u0632 \u06a9\u0648\u0626\u0631\u06cc \u06af\u0631\u0627\u0641\u200c\u06a9\u06cc\u0648\u0627\u0644 \u0627\u062c\u0631\u0627\u0634\u062f\u0647 \u0631\u0627 \u06a9\u067e\u06cc \u06a9\u0646\u06cc\u062f. \u0627\u0632 \u0627\u06cc\u0646 id \u0647\u0646\u06af\u0627\u0645 \u0622\u067e\u0644\u0648\u062f \u062a\u0635\u0648\u06cc\u0631 \u067e\u0631\u0648\u0641\u0627\u06cc\u0644 \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u062a\u0633\u062a\u06cc\u0650 \u0628\u0627\u0644\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u06cc\u062f \u06a9\u0631\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0627\u06cc\u0646 \u0646\u0642\u0637\u0647\u060c \u062a\u0627\u0628\u0639 Mutation Resolver \u062f\u0648\u0645 \u06cc\u0639\u0646\u06cc UploadProfileImage \u0628\u0631\u0627\u06cc \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0628\u0627\u0642\u06cc \u0645\u0627\u0646\u062f\u0647 \u0627\u0633\u062a. \u0627\u0645\u0627 \u0642\u0628\u0644 \u0627\u0632 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0627\u06cc\u0646 \u062a\u0627\u0628\u0639\u060c \u0628\u0627\u06cc\u062f Query Resolver \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f. \u062f\u0644\u06cc\u0644\u0634 \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0647\u0631 \u0622\u067e\u0644\u0648\u062f \u0628\u0647 \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u0645\u0634\u062e\u0635 \u0644\u06cc\u0646\u06a9 \u0645\u06cc\u200c\u0634\u0648\u062f\u061b \u0648 \u0628\u0647 \u0647\u0645\u06cc\u0646 \u062f\u0644\u06cc\u0644 ID \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u0645\u0634\u062e\u0635 \u0631\u0627 \u0642\u0628\u0644 \u0627\u0632 \u0622\u067e\u0644\u0648\u062f \u062a\u0635\u0648\u06cc\u0631 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u06a9\u0631\u062f\u06cc\u062f.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0645\u062a\u062f Query Resolver<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u0637\u0628\u0642 \u062a\u0639\u0631\u06cc\u0641 \u0641\u0627\u06cc\u0644 schema.graphqls\u060c \u06cc\u06a9 Query Resolver \u0628\u0631\u0627\u06cc \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0647\u0645\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646\u0650 \u0633\u0627\u062e\u062a\u0647\u200c\u0634\u062f\u0647 \u062a\u0648\u0644\u06cc\u062f \u0634\u062f. \u0645\u0634\u0627\u0628\u0647 \u0645\u062a\u062f\u0647\u0627\u06cc Mutation Resolver \u0642\u0628\u0644\u06cc\u060c \u0628\u0627\u06cc\u062f \u0645\u062a\u062f Query Resolver \u0631\u0627 \u0647\u0645 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0641\u0627\u06cc\u0644 schema.resolvers.go \u0631\u0627 \u0628\u0627\u0632 \u06a9\u0631\u062f\u0647 \u0648 Query Resolver \u062a\u0648\u0644\u06cc\u062f\u0634\u062f\u0647 Users \u0631\u0627 \u0628\u0627 \u062e\u0637\u0648\u0637 \u0647\u0627\u06cc\u0644\u0627\u06cc\u062a\u200c\u0634\u062f\u0647 \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u06cc\u062f. \u06a9\u062f \u062c\u062f\u06cc\u062f \u062f\u0627\u062e\u0644 \u0645\u062a\u062f Users \u067e\u0627\u06cc\u06cc\u0646\u060c \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 Postgres \u0631\u0627 \u0628\u0631\u0627\u06cc \u0647\u0645\u0647 \u0633\u0637\u0631\u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u06a9\u0648\u0626\u0631\u06cc \u06a9\u0631\u062f\u0647 \u0648 \u0646\u062a\u06cc\u062c\u0647 \u0631\u0627 \u0628\u0631\u0645\u06cc\u200c\u06af\u0631\u062f\u0627\u0646\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><code>schema.resolvers.go<\/code><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package graph\n\nfunc (r *queryResolver) Users(ctx context.Context) (&#91;]*model.User, error) {\n  var users &#91;]*model.User\n\n  err := r.DB.Model(&amp;users).Select()\n    if err != nil {\n     return nil, err\n    }\n\n  return users, nil\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0627\u062e\u0644 \u062a\u0627\u0628\u0639 Resolver \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 Users \u062f\u0631 \u0628\u0627\u0644\u0627\u060c \u0648\u0627\u06a9\u0634\u06cc \u0647\u0645\u0647 \u0631\u06a9\u0648\u0631\u062f\u0647\u0627\u06cc \u062f\u0627\u062e\u0644 \u062c\u062f\u0648\u0644 \u06a9\u0627\u0631\u0628\u0631 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0645\u062a\u062f select \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 go-pg \u0631\u0648\u06cc \u0645\u062f\u0644 User \u2014 \u0628\u062f\u0648\u0646 \u067e\u0627\u0633 \u062f\u0627\u062f\u0646 \u0628\u0646\u062f WHERE \u06cc\u0627 LIMIT \u0628\u0647 \u06a9\u0648\u0626\u0631\u06cc \u2014 \u0645\u0645\u06a9\u0646 \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u062a\u0648\u062c\u0647:<\/strong> \u0628\u0631\u0627\u06cc \u06cc\u06a9 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0628\u0632\u0631\u06af\u200c\u062a\u0631 \u06a9\u0647 \u0631\u06a9\u0648\u0631\u062f\u0647\u0627\u06cc \u0632\u06cc\u0627\u062f\u06cc \u0627\u0632 \u06a9\u0648\u0626\u0631\u06cc \u0628\u0631\u06af\u0631\u062f\u0627\u0646\u062f\u0647 \u0645\u06cc\u200c\u0634\u0648\u0646\u062f\u060c \u062f\u0631 \u0646\u0638\u0631 \u06af\u0631\u0641\u062a\u0646 \u0635\u0641\u062d\u0647\u200c\u0628\u0646\u062f\u06cc (Pagination) \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc \u0628\u0631\u06af\u0631\u062f\u0627\u0646\u062f\u0647\u200c\u0634\u062f\u0647 \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0627\u06cc\u06cc \u0628\u0647\u062a\u0631 \u0645\u0647\u0645 \u0627\u0633\u062a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc \u062a\u0633\u062a \u0627\u06cc\u0646 Query Resolver \u0627\u0632 \u0645\u0631\u0648\u0631\u06af\u0631 \u062e\u0648\u062f\u060c \u0628\u0647 <a href=\"http:\/\/localhost:8080\">http:\/\/localhost:8080<\/a> \u0628\u0631\u0648\u06cc\u062f \u062a\u0627 \u0628\u0647 GraphQL Playground \u062f\u0633\u062a\u0631\u0633\u06cc \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f. Query \u06af\u0631\u0627\u0641\u200c\u06a9\u06cc\u0648\u0627\u0644 \u0632\u06cc\u0631 \u0631\u0627 \u062f\u0631 \u0648\u06cc\u0631\u0627\u06cc\u0634\u06af\u0631 Playground \u062c\u0627\u06cc\u200c\u06af\u0630\u0627\u0631\u06cc \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0647\u0645\u0647 \u0631\u06a9\u0648\u0631\u062f\u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u0627\u0646\u0650 \u0633\u0627\u062e\u062a\u0647\u200c\u0634\u062f\u0647 \u0648\u0627\u06a9\u0634\u06cc \u0634\u0648\u0646\u062f:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>query fetchUsers {\n  users {\n      fullName\n      id\n      img_uri\n  }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u062e\u0631\u0648\u062c\u06cc \u062f\u0631 \u067e\u0646\u0644 \u0633\u0645\u062a \u0631\u0627\u0633\u062a \u0645\u0634\u0627\u0628\u0647 \u0627\u06cc\u0646 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[\u062a\u0635\u0648\u06cc\u0631: \u0646\u062a\u06cc\u062c\u0647 Query \u062f\u0631 GraphQL Playground]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0646\u062a\u0627\u06cc\u062c \u0628\u0631\u06af\u0631\u062f\u0627\u0646\u062f\u0647\u200c\u0634\u062f\u0647 \u0645\u06cc\u200c\u0628\u06cc\u0646\u06cc\u062f \u06a9\u0647 \u06cc\u06a9 \u0622\u0628\u062c\u06a9\u062a users \u0628\u0627 \u0645\u0642\u062f\u0627\u0631 \u0622\u0631\u0627\u06cc\u0647\u200c\u0627\u06cc \u0628\u0631\u06af\u0631\u062f\u0627\u0646\u062f\u0647 \u0634\u062f. \u0641\u0639\u0644\u0627\u064b \u0641\u0642\u0637 \u06a9\u0627\u0631\u0628\u0631\u0650 \u0642\u0628\u0644\u0627\u064b \u0633\u0627\u062e\u062a\u0647\u200c\u0634\u062f\u0647 \u062f\u0631 \u0622\u0631\u0627\u06cc\u0647 users \u0628\u0631\u06af\u0631\u062f\u0627\u0646\u062f\u0647 \u0634\u062f\u0647\u061b \u0686\u0648\u0646 \u062a\u0646\u0647\u0627 \u0631\u06a9\u0648\u0631\u062f \u062c\u062f\u0648\u0644 \u0647\u0645\u06cc\u0646 \u0627\u0633\u062a. \u0627\u06af\u0631 Mutation \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 createUser \u0631\u0627 \u0628\u0627 \u062c\u0632\u0626\u06cc\u0627\u062a \u062c\u062f\u06cc\u062f \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f\u060c \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0628\u06cc\u0634\u062a\u0631\u06cc \u062f\u0631 \u0622\u0631\u0627\u06cc\u0647 users \u0628\u0631\u06af\u0631\u062f\u0627\u0646\u062f\u0647 \u0645\u06cc\u200c\u0634\u0648\u0646\u062f. \u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0628\u06cc\u0646\u06cc\u062f \u06a9\u0647 \u0641\u06cc\u0644\u062f img_uri \u062f\u0631 \u062f\u0627\u062f\u0647\u200c\u0647\u0627\u06cc \u0628\u0631\u06af\u0631\u062f\u0627\u0646\u062f\u0647\u200c\u0634\u062f\u0647\u060c URL \u062a\u0635\u0648\u06cc\u0631\u0650 \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646\u0650 \u0647\u0627\u0631\u062f\u06a9\u062f\u200c\u0634\u062f\u0647 \u0631\u0627 \u062f\u0627\u0631\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0627\u06cc\u0646 \u0646\u0642\u0637\u0647\u060c \u0647\u0631 \u062f\u0648 \u0645\u0648\u0631\u062f\u0650 Mutation \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 CreateUser \u0648 Query \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 User \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u06a9\u0631\u062f\u0647\u200c\u0627\u06cc\u062f. \u0647\u0645\u0647\u200c\u0686\u06cc\u0632 \u0622\u0645\u0627\u062f\u0647 \u0627\u0633\u062a \u062a\u0627 \u062a\u0635\u0627\u0648\u06cc\u0631 \u0631\u0627 \u0627\u0632 Resolver \u062f\u0648\u0645 \u06cc\u0639\u0646\u06cc UploadProfileImage \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0631\u062f\u0647 \u0648 \u062a\u0635\u0648\u06cc\u0631 \u062f\u0631\u06cc\u0627\u0641\u062a\u06cc \u0631\u0627 \u0628\u0627 \u06cc\u06a9 SDK \u0633\u0627\u0632\u06af\u0627\u0631 \u0628\u0627 S3 \u0627\u0632 AWS-GO \u0628\u0647 \u06cc\u06a9 Bucket \u062f\u0631 Spaces \u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f \u0622\u067e\u0644\u0648\u062f \u06a9\u0646\u06cc\u062f.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0645\u0631\u062d\u0644\u0647 \u06f6 \u2014 \u0622\u067e\u0644\u0648\u062f \u062a\u0635\u0627\u0648\u06cc\u0631 \u0628\u0647 Spaces \u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0627\u06cc\u0646 \u0645\u0631\u062d\u0644\u0647\u060c Mutation Resolver \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 UploadProfileImage \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f \u062a\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 AWS SDK \u0628\u0631\u0627\u06cc Go v2\u060c \u06cc\u06a9 \u062a\u0635\u0648\u06cc\u0631 \u0631\u0627 \u0628\u0647 Space \u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f \u062e\u0648\u062f \u0622\u067e\u0644\u0648\u062f \u06a9\u0646\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc \u0634\u0631\u0648\u0639\u060c \u0628\u0647 \u0628\u062e\u0634 Spaces \u06a9\u0646\u0633\u0648\u0644 \u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f \u062e\u0648\u062f \u0628\u0631\u0648\u06cc\u062f\u061b \u062c\u0627\u06cc\u06cc \u06a9\u0647 \u06cc\u06a9 Bucket \u062c\u062f\u06cc\u062f \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u0622\u067e\u0644\u0648\u062f\u0634\u062f\u0647 \u0627\u0632 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 Backend \u062e\u0648\u062f \u0645\u06cc\u200c\u0633\u0627\u0632\u06cc\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0631\u0648\u06cc \u062f\u06a9\u0645\u0647 \u00abCreate New Space\u00bb \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f. \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0631\u0627 \u0631\u0648\u06cc \u0645\u0642\u0627\u062f\u06cc\u0631 \u067e\u06cc\u0634\u200c\u0641\u0631\u0636 \u0628\u06af\u0630\u0627\u0631\u06cc\u062f \u0648 \u06cc\u06a9 \u0646\u0627\u0645 \u06cc\u06a9\u062a\u0627 \u0628\u0631\u0627\u06cc Space \u062c\u062f\u06cc\u062f \u0645\u0634\u062e\u0635 \u06a9\u0646\u06cc\u062f:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[\u062a\u0635\u0648\u06cc\u0631: \u0633\u0627\u062e\u062a Space \u062c\u062f\u06cc\u062f \u062f\u0631 \u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u067e\u0633 \u0627\u0632 \u0633\u0627\u062e\u062a\u0647\u200c\u0634\u062f\u0646 Space \u062c\u062f\u06cc\u062f\u060c \u0628\u0647 \u062a\u0628 settings \u0628\u0631\u0648\u06cc\u062f \u0648 Endpoint\u060c \u0646\u0627\u0645 \u0648 Region \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 Space \u0631\u0627 \u06a9\u067e\u06cc \u06a9\u0646\u06cc\u062f. \u0627\u06cc\u0646 \u0645\u0648\u0627\u0631\u062f \u0631\u0627 \u0628\u0647 \u0641\u0627\u06cc\u0644 .env \u062f\u0627\u062e\u0644 \u067e\u0631\u0648\u0698\u0647 GraphQL \u0628\u0647 \u0627\u06cc\u0646 \u0642\u0627\u0644\u0628 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><code>.env<\/code><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SPACE_ENDPOINT=BUCKET_ENDPOINT\nDO_SPACE_REGION=DO_SPACE_REGION\nDO_SPACE_NAME=DO_SPACE_NAME<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0647\u200c\u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644\u060c \u0627\u0633\u06a9\u0631\u06cc\u0646\u200c\u0634\u0627\u062a \u0632\u06cc\u0631 \u062a\u0628 Settings \u0631\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc\u200c\u062f\u0647\u062f \u0648 \u062c\u0632\u0626\u06cc\u0627\u062a \u0646\u0627\u0645\u060c Region \u0648 Endpoint \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 Space \u0646\u0645\u0648\u0646\u0647 (\u200fVictory-space) \u0631\u0627 \u0647\u0627\u06cc\u0644\u0627\u06cc\u062a \u0645\u06cc\u200c\u06a9\u0646\u062f:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[\u062a\u0635\u0648\u06cc\u0631: Endpoint\u060c \u0646\u0627\u0645 \u0648 Region \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 Space \u0646\u0645\u0648\u0646\u0647 (Victory-space)]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0647\u200c\u0639\u0646\u0648\u0627\u0646 \u0628\u062e\u0634\u06cc \u0627\u0632 \u067e\u06cc\u0634\u200c\u0646\u06cc\u0627\u0632\u0647\u0627\u060c \u06cc\u06a9 Access Key \u0648 Secret Key \u0628\u0631\u0627\u06cc Space \u062e\u0648\u062f \u0633\u0627\u062e\u062a\u06cc\u062f. Access Key \u0648 Secret Key \u062e\u0648\u062f \u0631\u0627 \u062f\u0631 \u0641\u0627\u06cc\u0644 .env \u062f\u0627\u062e\u0644 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 GraphQL \u0628\u0647 \u0627\u06cc\u0646 \u0642\u0627\u0644\u0628 \u062c\u0627\u06cc\u200c\u06af\u0630\u0627\u0631\u06cc \u06a9\u0646\u06cc\u062f:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><code>.env<\/code><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ACCESS_KEY=YOUR_SPACE_ACCESS_KEY\nSECRET_KEY=YOUR_SPACE_SECRET_KEY<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0627\u06cc\u0646 \u0646\u0642\u0637\u0647\u060c \u0628\u0627\u06cc\u062f \u0628\u0627 \u062a\u0631\u06a9\u06cc\u0628 \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc CTRL + C \u0633\u0631\u0648\u0631 GraphQL \u0631\u0627 \u0645\u062a\u0648\u0642\u0641 \u06a9\u0631\u062f\u0647 \u0648 \u062f\u0633\u062a\u0648\u0631 \u0632\u06cc\u0631 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0631\u06cc\u200c\u0627\u0633\u062a\u0627\u0631\u062a \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 GraphQL \u0628\u0627 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u062c\u062f\u06cc\u062f\u0650 \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc\u200c\u0634\u062f\u0647 \u062f\u0631 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go run .\/server.go<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u062d\u0627\u0644\u0627 \u06a9\u0647 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a Space \u0634\u0645\u0627 \u062f\u0631 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u0634\u062f\u0647\u060c \u0645\u0646\u0637\u0642 \u0622\u067e\u0644\u0648\u062f \u0631\u0627 \u062f\u0631 Mutation Resolver \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 UploadProfileImage \u0645\u06cc\u200c\u0633\u0627\u0632\u06cc\u062f. \u0627\u0648\u0644\u06cc\u0646 \u0642\u062f\u0645\u060c \u0627\u0641\u0632\u0648\u062f\u0646 \u0648 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc AWS SDK \u0628\u0631\u0627\u06cc Go v2 \u0628\u0631\u0627\u06cc \u0627\u062a\u0635\u0627\u0644 \u0628\u0647 Space \u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f \u0634\u0645\u0627\u0633\u062a. \u0645\u0633\u062a\u0646\u062f\u0627\u062a Spaces \u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f\u060c \u0639\u0645\u0644\u06cc\u0627\u062a\u06cc \u0631\u0627 \u06a9\u0647 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0627 \u06cc\u06a9 AWS SDK \u0631\u0648\u06cc API \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 Spaces \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u062f \u0641\u0647\u0631\u0633\u062a \u0645\u06cc\u200c\u06a9\u0646\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0633\u062a\u0648\u0631 \u0632\u06cc\u0631 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0646\u0635\u0628 \u067e\u06a9\u06cc\u062c\u200c\u0647\u0627\u06cc AWS SDK Go v2 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go get github.com\/aws\/aws-sdk-go-v2 github.com\/aws\/aws-sdk-go-v2\/config github.com\/aws\/aws-sdk-go-v2\/credentials github.com\/aws\/aws-sdk-go-v2\/service\/s3<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0686\u0646\u062f \u0628\u0644\u0648\u06a9 \u06a9\u062f \u0628\u0639\u062f\u06cc\u060c \u0645\u0646\u0637\u0642 \u0622\u067e\u0644\u0648\u062f \u0631\u0627 \u062f\u0631 Mutation Resolver \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 UploadProfileImage \u0628\u0647\u200c\u062a\u062f\u0631\u06cc\u062c \u06a9\u0646\u0627\u0631 \u0647\u0645 \u0645\u06cc\u200c\u06af\u0630\u0627\u0631\u06cc\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0628\u062a\u062f\u0627\u060c \u0641\u0627\u06cc\u0644 schema.resolvers.go \u0631\u0627 \u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f. \u062e\u0637\u0648\u0637 \u0647\u0627\u06cc\u0644\u0627\u06cc\u062a\u200c\u0634\u062f\u0647 \u0631\u0627 \u0628\u0631\u0627\u06cc \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc AWS SDK \u0628\u0627 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0630\u062e\u06cc\u0631\u0647\u200c\u0634\u062f\u0647 \u0648 \u0628\u0631\u0642\u0631\u0627\u0631\u06cc \u0627\u062a\u0635\u0627\u0644 \u0628\u0627 Space \u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f \u062e\u0648\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u062a\u0648\u062c\u0647:<\/strong> \u06a9\u062f \u062f\u0627\u062e\u0644 \u0628\u0644\u0648\u06a9 \u06a9\u062f \u0632\u06cc\u0631 \u06a9\u0627\u0645\u0644 \u0646\u06cc\u0633\u062a\u061b \u0686\u0648\u0646 \u062f\u0631 \u062d\u0627\u0644 \u06a9\u0646\u0627\u0631 \u0647\u0645 \u06af\u0630\u0627\u0634\u062a\u0646 \u062a\u062f\u0631\u06cc\u062c\u06cc \u0645\u0646\u0637\u0642 \u0622\u067e\u0644\u0648\u062f \u0647\u0633\u062a\u06cc\u062f. \u06a9\u062f \u0631\u0627 \u062f\u0631 \u0628\u0644\u0648\u06a9\u200c\u0647\u0627\u06cc \u0628\u0639\u062f\u06cc \u06a9\u0627\u0645\u0644 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><code>schema.resolvers.go<\/code><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package graph\n\nimport (\n    \"context\"\n    \"fmt\"\n    \"os\"\n    ...\n\n    \"github.com\/aws\/aws-sdk-go-v2\/aws\"\n    \"github.com\/aws\/aws-sdk-go-v2\/config\"\n    \"github.com\/aws\/aws-sdk-go-v2\/credentials\"\n    \"github.com\/aws\/aws-sdk-go-v2\/service\/s3\"\n)\n\nfunc (r *mutationResolver) UploadProfileImage(ctx context.Context, input model.ProfileImage) (bool, error) {\n    cfg, err := config.LoadDefaultConfig(ctx,\n        config.WithRegion(os.Getenv(\"DO_SPACE_REGION\")),\n        config.WithCredentialsProvider(\n            credentials.NewStaticCredentialsProvider(\n                os.Getenv(\"ACCESS_KEY\"),\n                os.Getenv(\"SECRET_KEY\"),\n                \"\",\n            ),\n        ),\n        config.WithBaseEndpoint(os.Getenv(\"SPACE_ENDPOINT\")),\n    )\n    if err != nil {\n        return false, fmt.Errorf(\"failed to load AWS config: %w\", err)\n    }\n    s3Client := s3.NewFromConfig(cfg)\n    \/\/ ... (upload logic in next block)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u062d\u0627\u0644\u0627 \u06a9\u0647 SDK \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0634\u062f\u060c \u0642\u062f\u0645 \u0628\u0639\u062f\u06cc \u0622\u067e\u0644\u0648\u062f \u0641\u0627\u06cc\u0644\u0650 \u0627\u0631\u0633\u0627\u0644\u06cc \u062f\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a Multipart HTTP \u0627\u0633\u062a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u062d\u062a\u0648\u0627\u06cc \u0641\u0627\u06cc\u0644 \u0631\u0627 \u0628\u0627 io.ReadAll \u0627\u0632 \u062f\u0631\u062e\u0648\u0627\u0633\u062a Multipart \u0628\u062e\u0648\u0627\u0646\u06cc\u062f\u061b \u0633\u067e\u0633 \u0622\u0646 \u0631\u0627 \u0628\u0627 API \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 PutObject \u0627\u0632 AWS SDK Go v2 \u0628\u0647 Spaces \u0622\u067e\u0644\u0648\u062f \u06a9\u0646\u06cc\u062f. \u06a9\u0644\u0627\u06cc\u0646\u062a \u0627\u0632 \u0647\u0645\u0627\u0646 Endpoint \u06af\u0631\u0627\u0641\u200c\u06a9\u06cc\u0648\u0627\u0644 \u0628\u0631\u0627\u06cc \u0622\u067e\u0644\u0648\u062f \u0641\u0627\u06cc\u0644\u200c\u0647\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f\u061b \u067e\u0633 \u0647\u06cc\u0686 API \u0622\u067e\u0644\u0648\u062f \u062c\u062f\u0627\u06af\u0627\u0646\u0647\u200c\u0627\u06cc \u0644\u0627\u0632\u0645 \u0646\u06cc\u0633\u062a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc \u0627\u06cc\u0646 \u06a9\u0627\u0631\u060c \u06a9\u062f \u0632\u06cc\u0631 \u0631\u0627 \u0628\u0647 Mutation Resolver \u0645\u0648\u062c\u0648\u062f UploadProfileImage \u062f\u0631 \u0641\u0627\u06cc\u0644 schema.resolvers.go \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f. \u0627\u06cc\u0645\u067e\u0648\u0631\u062a io \u0648 \u067e\u06a9\u06cc\u062c types \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 s3 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><code>schema.resolvers.go<\/code><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package graph\n\nimport (\n    \"bytes\"\n    \"context\"\n    \"fmt\"\n    \"io\"\n    \"os\"\n    ...\n\n    \"github.com\/aws\/aws-sdk-go-v2\/aws\"\n    \"github.com\/aws\/aws-sdk-go-v2\/service\/s3\"\n    \"github.com\/aws\/aws-sdk-go-v2\/service\/s3\/types\"\n)\n\nfunc (r *mutationResolver) UploadProfileImage(ctx context.Context, input model.ProfileImage) (bool, error) {\n    \/\/ ... (cfg and s3Client from previous block)\n\n    SpaceName := os.Getenv(\"DO_SPACE_NAME\")\n    SpaceRegion := os.Getenv(\"DO_SPACE_REGION\")\n    userFileName := fmt.Sprintf(\"%v-%v\", input.UserID, input.File.Filename)\n\n    fileBytes, readErr := io.ReadAll(input.File.File)\n    if readErr != nil {\n        return false, fmt.Errorf(\"error reading file: %w\", readErr)\n    }\n\n    _, uploadErr := s3Client.PutObject(ctx, &amp;s3.PutObjectInput{\n        Bucket: aws.String(SpaceName),\n        Key:    aws.String(userFileName),\n        Body:   bytes.NewReader(fileBytes),\n        ACL:    types.ObjectCannedACLPublicRead,\n    })\n    if uploadErr != nil {\n        return false, fmt.Errorf(\"error uploading file: %w\", uploadErr)\n    }\n\n    \/\/ ... (user update logic in next block)\n    return true, nil\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u062a\u0648\u062c\u0647:<\/strong> \u0645\u062a\u063a\u06cc\u0631 SpaceRegion \u0627\u06cc\u0646\u062c\u0627 \u0627\u0639\u0644\u0627\u0645 \u0634\u062f\u0647 \u0627\u0645\u0627 \u062f\u0631 \u0628\u0644\u0648\u06a9 \u06a9\u062f \u0628\u0639\u062f\u06cc \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a URL \u0641\u0627\u06cc\u0644 \u0622\u067e\u0644\u0648\u062f\u0634\u062f\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u0634\u0648\u062f. Go \u0627\u06af\u0631 \u0633\u0631\u0648\u0631 \u0631\u0627 \u0642\u0628\u0644 \u0627\u0632 \u0627\u0641\u0632\u0648\u062f\u0646 \u0645\u0646\u0637\u0642 \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u06a9\u0627\u0631\u0628\u0631 \u062f\u0631 \u0645\u0631\u062d\u0644\u0647 \u0628\u0639\u062f \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f\u060c \u062e\u0637\u0627\u06cc \u00abdeclared and not used\u00bb \u0628\u0631\u0645\u06cc\u200c\u06af\u0631\u062f\u0627\u0646\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062a\u0627\u0628\u0639 ReadAll \u0627\u0632 \u067e\u06a9\u06cc\u062c io\u060c \u0645\u062d\u062a\u0648\u0627\u06cc \u0641\u0627\u06cc\u0644 \u0631\u0627 \u0627\u0632 \u062f\u0631\u062e\u0648\u0627\u0633\u062a Multipart \u062f\u0631 \u062d\u0627\u0641\u0638\u0647 \u0645\u06cc\u200c\u062e\u0648\u0627\u0646\u06cc\u062f\u061b \u0633\u067e\u0633 \u0622\u0646 \u0631\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 bytes.NewReader \u0628\u0647 PutObject \u067e\u0627\u0633 \u0645\u06cc\u200c\u062f\u0647\u06cc\u062f. \u0628\u0631\u0627\u06cc \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u062e\u06cc\u0644\u06cc \u0628\u0632\u0631\u06af\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u0633\u062a\u06cc\u062f \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u0627\u0632 input.File.File \u0627\u0633\u062a\u0631\u06cc\u0645 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0627\u0632 \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u06a9\u0644 \u0641\u0627\u06cc\u0644 \u062f\u0631 \u062d\u0627\u0641\u0638\u0647 \u0627\u062c\u062a\u0646\u0627\u0628 \u0634\u0648\u062f. \u0633\u0627\u062e\u062a\u0627\u0631 PutObjectInput \u0645\u0648\u0627\u0631\u062f Bucket\u060c Key\u060c ACL \u0648 Body \u0631\u0627 \u0628\u0631\u0627\u06cc \u0622\u067e\u0644\u0648\u062f \u0645\u0634\u062e\u0635 \u0645\u06cc\u200c\u06a9\u0646\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u062a\u0648\u062c\u0647:<\/strong> \u0641\u06cc\u0644\u062f Access Control List (ACL) \u0631\u0648\u06cc types.ObjectCannedACLPublicRead \u062a\u0646\u0638\u06cc\u0645 \u0634\u062f\u0647 \u062a\u0627 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u0622\u067e\u0644\u0648\u062f\u0634\u062f\u0647 \u0631\u0648\u06cc \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u0642\u0627\u0628\u0644 \u0645\u0634\u0627\u0647\u062f\u0647 \u0628\u0627\u0634\u0646\u062f. \u0627\u06af\u0631 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0634\u0645\u0627 \u0622\u0628\u062c\u06a9\u062a\u200c\u0647\u0627\u06cc \u062e\u0635\u0648\u0635\u06cc \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u062f\u060c \u0627\u06cc\u0646 \u0641\u06cc\u0644\u062f \u0631\u0627 \u062d\u0630\u0641 \u06a9\u0646\u06cc\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0645\u062a\u062f PutObject \u0622\u067e\u0644\u0648\u062f \u0628\u0647 Bucket \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc\u200c\u062f\u0647\u062f. \u062f\u0631 \u0635\u0648\u0631\u062a \u062e\u0637\u0627\u060c Resolver \u0645\u0642\u062f\u0627\u0631 false \u0648 \u06cc\u06a9 \u062e\u0637\u0627 \u0628\u0631\u0645\u06cc\u200c\u06af\u0631\u062f\u0627\u0646\u062f \u0648 Mutation \u067e\u0627\u06cc\u0627\u0646 \u0645\u06cc\u200c\u06cc\u0627\u0628\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc \u062a\u0633\u062a Mutation Resolver \u0622\u067e\u0644\u0648\u062f\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u06cc\u06a9 \u062a\u0635\u0648\u06cc\u0631 \u0646\u0645\u0648\u0646\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f. \u0628\u0627 \u062f\u0633\u062a\u0648\u0631 wget \u062a\u0635\u0648\u06cc\u0631 \u0646\u0645\u0648\u0646\u0647 \u0631\u0627 \u062f\u0627\u0646\u0644\u0648\u062f \u06a9\u0646\u06cc\u062f:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>wget https:\/\/html.sammy-codes.com\/images\/small-profile.jpeg<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u0633\u067e\u0633\u060c \u062f\u0633\u062a\u0648\u0631 cURL \u0632\u06cc\u0631 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u0631\u0633\u0627\u0644 \u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a HTTP \u0628\u0647 GraphQL API \u0648 \u0622\u067e\u0644\u0648\u062f \u062a\u0635\u0648\u06cc\u0631 \u2014 \u06a9\u0647 \u0628\u0647 \u0628\u062f\u0646\u0647 \u0641\u0631\u0645 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u0636\u0627\u0641\u0647 \u0634\u062f\u0647 \u2014 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u062a\u0648\u062c\u0647:<\/strong> \u0627\u06af\u0631 \u0631\u0648\u06cc \u0633\u06cc\u0633\u062a\u0645\u200c\u0639\u0627\u0645\u0644 \u0648\u06cc\u0646\u062f\u0648\u0632 \u0647\u0633\u062a\u06cc\u062f\u060c \u0628\u0647 \u062f\u0644\u06cc\u0644 Escape\u0647\u0627\u06cc Backslash\u060c \u062a\u0648\u0635\u06cc\u0647 \u0645\u06cc\u200c\u0634\u0648\u062f \u062f\u0633\u062a\u0648\u0631\u0627\u062a cURL \u0631\u0627 \u0628\u0627 \u0634\u0644 Git Bash \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl localhost:8080\/query  -F operations='{ \"query\": \"mutation uploadProfileImage($image: Upload! $userId : String!) { uploadProfileImage(input: { file: $image  userId : $userId}) }\", \"variables\": { \"image\": null, \"userId\" : \"12345\" } }' -F map='{ \"0\": &#91;\"variables.image\"] }'  -F 0=@small-profile.jpeg<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u062a\u0648\u062c\u0647:<\/strong> \u062f\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0628\u0627\u0644\u0627 \u0627\u0632 \u06cc\u06a9 \u0645\u0642\u062f\u0627\u0631 userId \u062a\u0635\u0627\u062f\u0641\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645\u061b \u0686\u0648\u0646 \u0641\u0631\u0627\u06cc\u0646\u062f \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0631\u06a9\u0648\u0631\u062f \u06a9\u0627\u0631\u0628\u0631 \u0647\u0646\u0648\u0632 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0646\u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062e\u0631\u0648\u062c\u06cc \u0645\u0634\u0627\u0628\u0647 \u0627\u06cc\u0646 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f \u06a9\u0647 \u0646\u0634\u0627\u0646 \u0645\u06cc\u200c\u062f\u0647\u062f \u0622\u067e\u0644\u0648\u062f \u0641\u0627\u06cc\u0644 \u0645\u0648\u0641\u0642 \u0628\u0648\u062f\u0647:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\"data\": { \"uploadProfileImage\": true }}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0628\u062e\u0634 Spaces \u06a9\u0646\u0633\u0648\u0644 \u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f\u060c \u062a\u0635\u0648\u06cc\u0631\u0650 \u0622\u067e\u0644\u0648\u062f\u0634\u062f\u0647 \u0627\u0632 \u062a\u0631\u0645\u06cc\u0646\u0627\u0644 \u062e\u0648\u062f \u0631\u0627 \u067e\u06cc\u062f\u0627 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[\u062a\u0635\u0648\u06cc\u0631: \u06cc\u06a9 Bucket \u062f\u0631 \u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f \u0628\u0627 \u0641\u0647\u0631\u0633\u062a \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u0622\u067e\u0644\u0648\u062f\u0634\u062f\u0647]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0627\u06cc\u0646 \u0646\u0642\u0637\u0647\u060c \u0622\u067e\u0644\u0648\u062f \u0641\u0627\u06cc\u0644 \u062f\u0627\u062e\u0644 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u06a9\u0627\u0631 \u0645\u06cc\u200c\u06a9\u0646\u062f\u061b \u0627\u0645\u0627 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627 \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631\u06cc \u06a9\u0647 \u0622\u067e\u0644\u0648\u062f \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u062f\u0627\u062f\u0647 \u0644\u06cc\u0646\u06a9 \u0646\u06cc\u0633\u062a\u0646\u062f. \u0647\u062f\u0641 \u0647\u0631 \u0622\u067e\u0644\u0648\u062f \u0641\u0627\u06cc\u0644 \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0641\u0627\u06cc\u0644 \u062f\u0631 \u06cc\u06a9 Bucket \u0630\u062e\u06cc\u0631\u0647\u200c\u0633\u0627\u0632\u06cc \u0622\u067e\u0644\u0648\u062f \u0634\u062f\u0647 \u0648 \u0633\u067e\u0633 \u0628\u0627 \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0641\u06cc\u0644\u062f img_uri \u06a9\u0627\u0631\u0628\u0631\u060c \u0628\u0647 \u0627\u0648 \u0644\u06cc\u0646\u06a9 \u0634\u0648\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0641\u0627\u06cc\u0644 resolver.go \u0631\u0627 \u062f\u0631 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc graph \u0628\u0627\u0632 \u06a9\u0631\u062f\u0647 \u0648 \u0628\u0644\u0648\u06a9 \u06a9\u062f \u0632\u06cc\u0631 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f. \u0627\u06cc\u0646 \u0641\u0627\u06cc\u0644 \u0634\u0627\u0645\u0644 \u062f\u0648 \u0645\u062a\u062f \u0627\u0633\u062a: \u06cc\u06a9\u06cc \u0628\u0631\u0627\u06cc \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u0627\u0632 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0628\u0631 \u0627\u0633\u0627\u0633 \u06cc\u06a9 \u0641\u06cc\u0644\u062f \u0645\u0634\u062e\u0635 \u0648 \u062a\u0627\u0628\u0639 \u062f\u06cc\u06af\u0631\u06cc \u0628\u0631\u0627\u06cc \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0631\u06a9\u0648\u0631\u062f \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><code>resolver.go<\/code><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import (\n...\n\n  \"parmin\/graph\/model\"\n  \"fmt\"\n)\n\n...\n\nfunc (r *mutationResolver) GetUserByField(field, value string) (*model.User, error) {\n    user := model.User{}\n\n    err := r.DB.Model(&amp;user).Where(fmt.Sprintf(\"%v = ?\", field), value).First()\n\n    return &amp;user, err\n}\n\nfunc (r *mutationResolver) UpdateUser(user *model.User) (*model.User, error) {\n    _, err := r.DB.Model(user).Where(\"id = ?\", user.ID).Update()\n    return user, err\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0648\u0644\u06cc\u0646 \u062a\u0627\u0628\u0639 GetUserByField \u0628\u0627\u0644\u0627\u060c \u0622\u0631\u06af\u0648\u0645\u0627\u0646\u200c\u0647\u0627\u06cc field \u0648 value \u2014 \u0647\u0631 \u062f\u0648 \u0627\u0632 \u0646\u0648\u0639 \u0631\u0634\u062a\u0647 \u2014 \u0631\u0627 \u0645\u06cc\u200c\u067e\u0630\u06cc\u0631\u062f. \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 ORM \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 go-pg\u060c \u06cc\u06a9 \u06a9\u0648\u0626\u0631\u06cc \u0631\u0648\u06cc \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0627\u062c\u0631\u0627 \u06a9\u0631\u062f\u0647 \u0648 \u0628\u0627 \u06cc\u06a9 \u0628\u0646\u062f WHERE \u0627\u0632 \u062c\u062f\u0648\u0644 \u06a9\u0627\u0631\u0628\u0631 \u062f\u0627\u062f\u0647 \u0648\u0627\u06a9\u0634\u06cc \u0645\u06cc\u200c\u06a9\u0646\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0648\u0645\u06cc\u0646 \u062a\u0627\u0628\u0639 UpdateUser \u062f\u0631 \u0628\u0644\u0648\u06a9 \u06a9\u062f\u060c \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 go-pg \u06cc\u06a9 \u0639\u0628\u0627\u0631\u062a UPDATE \u0628\u0631\u0627\u06cc \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u06cc\u06a9 \u0631\u06a9\u0648\u0631\u062f \u062f\u0631 \u062c\u062f\u0648\u0644 \u06a9\u0627\u0631\u0628\u0631 \u0627\u062c\u0631\u0627 \u0645\u06cc\u200c\u06a9\u0646\u062f. \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0645\u062a\u062f where\u060c \u0628\u0646\u062f\u06cc WHERE \u0647\u0645\u0631\u0627\u0647 \u0628\u0627 \u06cc\u06a9 \u0634\u0631\u0637 \u0628\u0647 \u0639\u0628\u0627\u0631\u062a UPDATE \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc\u200c\u0634\u0648\u062f \u062a\u0627 \u0641\u0642\u0637 \u0633\u0637\u0631\u06cc \u06a9\u0647 \u0647\u0645\u0627\u0646 ID \u067e\u0627\u0633\u200c\u062f\u0627\u062f\u0647\u200c\u0634\u062f\u0647 \u0628\u0647 \u062a\u0627\u0628\u0639 \u0631\u0627 \u062f\u0627\u0631\u062f \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0634\u0648\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0627\u06cc\u0646 \u062f\u0648 \u0645\u062a\u062f \u062f\u0631 Mutation \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 UploadProfileImage \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f. \u0645\u062d\u062a\u0648\u0627\u06cc \u0628\u0644\u0648\u06a9 \u06a9\u062f \u0647\u0627\u06cc\u0644\u0627\u06cc\u062a\u200c\u0634\u062f\u0647 \u0632\u06cc\u0631 \u0631\u0627 \u0628\u0647 Mutation \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 UploadProfileImage \u062f\u0627\u062e\u0644 \u0641\u0627\u06cc\u0644 schema.resolvers.go \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f. \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u06cc\u06a9 \u0633\u0637\u0631 \u0645\u0634\u062e\u0635 \u0631\u0627 \u0627\u0632 \u062c\u062f\u0648\u0644 \u06a9\u0627\u0631\u0628\u0631 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u06a9\u0631\u062f\u0647 \u0648 \u067e\u0633 \u0627\u0632 \u0622\u067e\u0644\u0648\u062f \u0641\u0627\u06cc\u0644\u060c \u0641\u06cc\u0644\u062f img_uri \u062f\u0631 \u0631\u06a9\u0648\u0631\u062f \u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0645\u06cc\u200c\u06a9\u0646\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u062a\u0648\u062c\u0647:<\/strong> \u06a9\u062f \u0647\u0627\u06cc\u0644\u0627\u06cc\u062a\u200c\u0634\u062f\u0647 \u0631\u0627 \u062f\u0631 \u062e\u0637\u06cc \u0628\u0627\u0644\u0627\u06cc \u062f\u0633\u062a\u0648\u0631 return \u0645\u0648\u062c\u0648\u062f \u062f\u0627\u062e\u0644 Mutation \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 UploadProfileImage \u0642\u0631\u0627\u0631 \u062f\u0647\u06cc\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><code>schema.resolvers.go<\/code><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package graph\n\nfunc (r *mutationResolver) UploadProfileImage(ctx context.Context, input model.ProfileImage) (bool, error) {\n    \/\/ ... (upload logic above)\n\n    user, userErr := r.GetUserByField(\"id\", *input.UserID)\n    if userErr != nil {\n        return false, fmt.Errorf(\"error getting user: %v\", userErr)\n    }\n\n    fileUrl := fmt.Sprintf(\"https:\/\/%v.%v.digitaloceanspaces.com\/%v\", SpaceName, SpaceRegion, userFileName)\n    user.ImgURI = fileUrl\n\n    if _, err := r.UpdateUser(user); err != nil {\n        return false, fmt.Errorf(\"err updating user: %v\", err)\n    }\n\n    return true, nil\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u062a\u0648\u062c\u0647:<\/strong> \u0646\u0627\u0645 \u0641\u06cc\u0644\u062f\u06cc \u06a9\u0647 \u0628\u0647 GetUserByField \u067e\u0627\u0633 \u062f\u0627\u062f\u0647 \u0645\u06cc\u200c\u0634\u0648\u062f \u0628\u0627\u06cc\u062f \u0628\u0627 \u0646\u0627\u0645 \u0633\u062a\u0648\u0646 \u062d\u0631\u0648\u0641\u200c\u06a9\u0648\u0686\u06a9\u060c \u0647\u0645\u0627\u0646\u200c\u0637\u0648\u0631 \u06a9\u0647 \u062f\u0631 PostgreSQL \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f\u060c \u0645\u0637\u0627\u0628\u0642\u062a \u06a9\u0646\u062f. go-pg \u0647\u0646\u06af\u0627\u0645 \u0633\u0627\u062e\u062a \u062c\u062f\u0648\u0644\u060c \u0646\u0627\u0645 \u0641\u06cc\u0644\u062f\u0647\u0627\u06cc \u0633\u0627\u062e\u062a\u0627\u0631 \u0631\u0627 \u0628\u0647 \u062d\u0631\u0648\u0641 \u06a9\u0648\u0686\u06a9 \u062a\u0628\u062f\u06cc\u0644 \u0645\u06cc\u200c\u06a9\u0646\u062f\u061b \u067e\u0633 ID \u0628\u0647 id \u062a\u0628\u062f\u06cc\u0644 \u0645\u06cc\u200c\u0634\u0648\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0632 \u06a9\u062f \u062c\u062f\u06cc\u062f \u0627\u0636\u0627\u0641\u0647\u200c\u0634\u062f\u0647 \u0628\u0647 \u0641\u0627\u06cc\u0644 schema.resolvers.go\u060c \u06cc\u06a9 \u0631\u0634\u062a\u0647 id \u0648 ID \u06a9\u0627\u0631\u0628\u0631 \u0628\u0647 \u062a\u0627\u0628\u0639 \u06a9\u0645\u06a9\u06cc GetUserByField \u067e\u0627\u0633 \u062f\u0627\u062f\u0647 \u0645\u06cc\u200c\u0634\u0648\u062f \u062a\u0627 \u0631\u06a9\u0648\u0631\u062f \u06a9\u0627\u0631\u0628\u0631\u06cc \u06a9\u0647 Mutation \u0631\u0627 \u0627\u062c\u0631\u0627 \u0645\u06cc\u200c\u06a9\u0646\u062f \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0634\u0648\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0633\u067e\u0633 \u0645\u062a\u063a\u06cc\u0631 \u062c\u062f\u06cc\u062f\u06cc \u0633\u0627\u062e\u062a\u0647 \u0634\u062f\u0647 \u0648 \u0645\u0642\u062f\u0627\u0631\u06cc \u0645\u06cc\u200c\u06af\u06cc\u0631\u062f \u06a9\u0647 \u0631\u0634\u062a\u0647\u200c\u0627\u06cc \u0642\u0627\u0644\u0628\u200c\u0628\u0646\u062f\u06cc\u200c\u0634\u062f\u0647 \u0628\u0631\u0627\u06cc \u062f\u0627\u0634\u062a\u0646 \u0644\u06cc\u0646\u06a9 \u0641\u0627\u06cc\u0644\u0650 \u062a\u0627\u0632\u0647 \u0622\u067e\u0644\u0648\u062f\u0634\u062f\u0647 \u0628\u0647 \u0642\u0627\u0644\u0628 <a href=\"https:\/\/BUCKET_NAME.SPACE_REGION.digitaloceanspaces.com\/USER_ID-FILE_NAME\">https:\/\/BUCKET_NAME.SPACE_REGION.digitaloceanspaces.com\/USER_ID-FILE_NAME<\/a> \u0627\u0633\u062a. \u0641\u06cc\u0644\u062f ImgURI \u062f\u0631 \u0645\u062f\u0644 \u06a9\u0627\u0631\u0628\u0631\u0650 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc\u200c\u0634\u062f\u0647\u060c \u0645\u0642\u062f\u0627\u0631 \u0627\u06cc\u0646 \u0631\u0634\u062a\u0647 \u0642\u0627\u0644\u0628\u200c\u0628\u0646\u062f\u06cc\u200c\u0634\u062f\u0647 \u0628\u0647\u200c\u0639\u0646\u0648\u0627\u0646 \u0644\u06cc\u0646\u06a9 \u0641\u0627\u06cc\u0644 \u0622\u067e\u0644\u0648\u062f\u0634\u062f\u0647 \u0631\u0627 \u062f\u0648\u0628\u0627\u0631\u0647 \u06af\u0631\u0641\u062a\u0647 \u0627\u0633\u062a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0633\u062a\u0648\u0631 curl \u0632\u06cc\u0631 \u0631\u0627 \u062f\u0631 \u062a\u0631\u0645\u06cc\u0646\u0627\u0644 \u062e\u0648\u062f \u062c\u0627\u06cc\u200c\u06af\u0630\u0627\u0631\u06cc \u06a9\u0631\u062f\u0647 \u0648 Placeholder \u0647\u0627\u06cc\u0644\u0627\u06cc\u062a\u200c\u0634\u062f\u0647 USER_ID \u0631\u0627 \u062f\u0631 \u062f\u0633\u062a\u0648\u0631 \u0628\u0627 userId \u06a9\u0627\u0631\u0628\u0631\u06cc \u06a9\u0647 \u0627\u0632 \u0637\u0631\u06cc\u0642 GraphQL Playground \u062f\u0631 \u0645\u0631\u062d\u0644\u0647 \u0642\u0628\u0644\u06cc \u0633\u0627\u062e\u062a\u06cc\u062f \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u06a9\u0646\u06cc\u062f. \u0645\u0637\u0645\u0626\u0646 \u0634\u0648\u06cc\u062f userId \u062f\u0627\u062e\u0644 \u06af\u06cc\u0648\u0645\u0647 \u0642\u0631\u0627\u0631 \u06af\u0631\u0641\u062a\u0647 \u0628\u0627\u0634\u062f \u062a\u0627 \u062a\u0631\u0645\u06cc\u0646\u0627\u0644 \u0628\u062a\u0648\u0627\u0646\u062f \u0645\u0642\u062f\u0627\u0631 \u0631\u0627 \u0628\u0647\u200c\u062f\u0631\u0633\u062a\u06cc Encode \u06a9\u0646\u062f:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl localhost:8080\/query  -F operations='{ \"query\": \"mutation uploadProfileImage($image: Upload! $userId : String!) { uploadProfileImage(input: { file: $image  userId : $userId}) }\", \"variables\": { \"image\": null, \"userId\" : \"USER_ID\" } }' -F map='{ \"0\": &#91;\"variables.image\"] }'  -F 0=@small-profile.jpeg<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u062e\u0631\u0648\u062c\u06cc \u0645\u0634\u0627\u0628\u0647 \u0627\u06cc\u0646 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062e\u0631\u0648\u062c\u06cc:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\"data\": { \"uploadProfileImage\": true }}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc \u062a\u0623\u06cc\u06cc\u062f \u0628\u06cc\u0634\u062a\u0631\u0650 \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc img_uri \u06a9\u0627\u0631\u0628\u0631\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 Query \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 fetchUsers \u062f\u0631 GraphQL Playground \u0645\u0631\u0648\u0631\u06af\u0631 \u0628\u0631\u0627\u06cc \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u062c\u0632\u0626\u06cc\u0627\u062a \u06a9\u0627\u0631\u0628\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f. \u0627\u06af\u0631 \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0645\u0648\u0641\u0642 \u0628\u0648\u062f\u0647 \u0628\u0627\u0634\u062f\u060c \u0645\u06cc\u200c\u0628\u06cc\u0646\u06cc\u062f \u06a9\u0647 URL \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646\u0650 \u067e\u06cc\u0634\u200c\u0641\u0631\u0636 <a href=\"https:\/\/bit.ly\/3mCSn2i\">https:\/\/bit.ly\/3mCSn2i<\/a> \u062f\u0631 \u0641\u06cc\u0644\u062f img_uri \u0628\u0647 \u0645\u0642\u062f\u0627\u0631 \u062a\u0635\u0648\u06cc\u0631 \u0622\u067e\u0644\u0648\u062f\u0634\u062f\u0647 \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062e\u0631\u0648\u062c\u06cc \u062f\u0631 \u067e\u0646\u0644 \u0633\u0645\u062a \u0631\u0627\u0633\u062a \u0645\u0634\u0627\u0628\u0647 \u0627\u06cc\u0646 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[\u062a\u0635\u0648\u06cc\u0631: \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0631\u06a9\u0648\u0631\u062f \u0628\u0647\u200c\u0631\u0648\u0632 \u0634\u062f\u0647 \u06a9\u0627\u0631\u0628\u0631 \u062f\u0631 GraphQL Playground]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0646\u062a\u0627\u06cc\u062c \u0628\u0631\u06af\u0631\u062f\u0627\u0646\u062f\u0647\u200c\u0634\u062f\u0647\u060c img_uri \u062f\u0631 \u0627\u0648\u0644\u06cc\u0646 \u0622\u0628\u062c\u06a9\u062a \u06a9\u0627\u0631\u0628\u0631\u0650 \u0628\u0631\u06af\u0631\u062f\u0627\u0646\u062f\u0647\u200c\u0634\u062f\u0647 \u0627\u0632 \u06a9\u0648\u0626\u0631\u06cc\u060c \u0645\u0642\u062f\u0627\u0631\u06cc \u062f\u0627\u0631\u062f \u06a9\u0647 \u0628\u0627 \u0622\u067e\u0644\u0648\u062f \u0641\u0627\u06cc\u0644\u06cc \u0628\u0647 \u06cc\u06a9 Bucket \u062f\u0627\u062e\u0644 Spaces \u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f \u0645\u0637\u0627\u0628\u0642\u062a \u062f\u0627\u0631\u062f. \u0644\u06cc\u0646\u06a9 \u062f\u0631 \u0641\u06cc\u0644\u062f img_uri \u0627\u0632 Endpoint \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 Bucket\u060c ID \u06a9\u0627\u0631\u0628\u0631 \u0648 \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a \u0646\u0627\u0645 \u0641\u0627\u06cc\u0644 \u062a\u0634\u06a9\u06cc\u0644 \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc \u062a\u0633\u062a \u062f\u0633\u062a\u0631\u0633\u06cc\u0650 \u0641\u0627\u06cc\u0644 \u0622\u067e\u0644\u0648\u062f\u0634\u062f\u0647 \u06a9\u0647 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u06af\u0632\u06cc\u0646\u0647 ACL \u062a\u0646\u0638\u06cc\u0645 \u0634\u062f\u0647\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0644\u06cc\u0646\u06a9 img_uri \u0631\u0627 \u062f\u0631 \u0645\u0631\u0648\u0631\u06af\u0631 \u062e\u0648\u062f \u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f. \u0628\u0647 \u062f\u0644\u06cc\u0644 Metadata \u067e\u06cc\u0634\u200c\u0641\u0631\u0636 \u0631\u0648\u06cc \u062a\u0635\u0648\u06cc\u0631 \u0622\u067e\u0644\u0648\u062f\u0634\u062f\u0647\u060c \u0628\u0647\u200c\u0637\u0648\u0631 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0628\u0647\u200c\u0635\u0648\u0631\u062a \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u062a\u0635\u0648\u06cc\u0631 \u0631\u0648\u06cc \u06a9\u0627\u0645\u067e\u06cc\u0648\u062a\u0631 \u0634\u0645\u0627 \u062f\u0627\u0646\u0644\u0648\u062f \u0645\u06cc\u200c\u0634\u0648\u062f. \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0641\u0627\u06cc\u0644 \u0631\u0627 \u0628\u0627\u0632 \u06a9\u0631\u062f\u0647 \u0648 \u062a\u0635\u0648\u06cc\u0631 \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[\u062a\u0635\u0648\u06cc\u0631: \u0646\u0645\u0627\u06cc \u062f\u0627\u0646\u0644\u0648\u062f\u0634\u062f\u0647 \u0641\u0627\u06cc\u0644 \u0622\u067e\u0644\u0648\u062f \u0634\u062f\u0647]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062a\u0635\u0648\u06cc\u0631 \u062f\u0631 \u0644\u06cc\u0646\u06a9 img_uri \u0647\u0645\u0627\u0646 \u062a\u0635\u0648\u06cc\u0631\u06cc \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f \u06a9\u0647 \u0627\u0632 \u062e\u0637 \u0641\u0631\u0645\u0627\u0646 \u0622\u067e\u0644\u0648\u062f \u0634\u062f\u061b \u06a9\u0647 \u0646\u0634\u0627\u0646 \u0645\u06cc\u200c\u062f\u0647\u062f \u0645\u062a\u062f\u0647\u0627\u06cc \u0641\u0627\u06cc\u0644 resolver.go \u0628\u0647\u200c\u062f\u0631\u0633\u062a\u06cc \u0627\u062c\u0631\u0627 \u0634\u062f\u0647\u200c\u0627\u0646\u062f \u0648 \u06a9\u0644 \u0645\u0646\u0637\u0642 \u0622\u067e\u0644\u0648\u062f \u0641\u0627\u06cc\u0644 \u062f\u0631 Mutation \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 UploadProfileImage \u0637\u0628\u0642 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0627\u0631 \u0645\u06cc\u200c\u06a9\u0646\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0627\u06cc\u0646 \u0645\u0631\u062d\u0644\u0647\u060c \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 AWS SDK \u0628\u0631\u0627\u06cc Go v2 \u0627\u0632 Mutation Resolver \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 UploadProfileImage\u060c \u06cc\u06a9 \u062a\u0635\u0648\u06cc\u0631 \u0631\u0627 \u0628\u0647 Space \u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f \u0622\u067e\u0644\u0648\u062f \u06a9\u0631\u062f\u06cc\u062f.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0627\u0646\u062a\u062e\u0627\u0628 \u0628\u06cc\u0646 \u0622\u067e\u0644\u0648\u062f \u0633\u0645\u062a \u0633\u0631\u0648\u0631 \u0648 Presigned URL\u0647\u0627<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634 \u0627\u0632 \u0622\u067e\u0644\u0648\u062f \u0633\u0645\u062a \u0633\u0631\u0648\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f: \u0633\u0631\u0648\u0631 Go \u0641\u0627\u06cc\u0644 \u0631\u0627 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0631\u062f\u0647 \u0648 \u0628\u0647 Spaces \u0627\u0633\u062a\u0631\u06cc\u0645 \u0645\u06cc\u200c\u06a9\u0646\u062f. \u0645\u0646\u0637\u0642 \u06a9\u0644\u0627\u06cc\u0646\u062a \u0633\u0627\u062f\u0647 \u0645\u06cc\u200c\u0645\u0627\u0646\u062f \u0648 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0641\u0627\u06cc\u0644 \u0631\u0627 \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc \u06cc\u0627 Transform \u06a9\u0646\u06cc\u062f. \u062a\u0648\u0627\u0641\u0642 \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0641\u0627\u06cc\u0644 \u0627\u0632 \u0633\u0631\u0648\u0631 \u0634\u0645\u0627 \u0639\u0628\u0648\u0631 \u0645\u06cc\u200c\u06a9\u0646\u062f\u061b \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u0628\u0632\u0631\u06af\u060c \u062a\u0623\u062e\u06cc\u0631 \u0648 \u0647\u0632\u06cc\u0646\u0647 Egress \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f. \u0627\u06cc\u0646 \u0631\u0648\u06cc\u06a9\u0631\u062f \u0628\u0631\u0627\u06cc \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u06a9\u0648\u0686\u06a9 \u062a\u0627 \u0645\u062a\u0648\u0633\u0637 \u0648 \u0645\u0648\u0627\u0631\u062f\u06cc \u06a9\u0647 \u0628\u0647 \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc \u0633\u0645\u062a \u0633\u0631\u0648\u0631 \u06cc\u0627 \u062f\u0633\u062a\u0631\u0633\u06cc \u06a9\u0646\u062a\u0631\u0644\u200c\u0634\u062f\u0647 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u062f \u0645\u0646\u0627\u0633\u0628 \u0627\u0633\u062a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0627 URL\u0647\u0627\u06cc Presigned\u060c \u0633\u0631\u0648\u0631 Go \u06cc\u06a9 Presigned URL \u0645\u062d\u062f\u0648\u062f \u0628\u0647 \u0632\u0645\u0627\u0646 \u0627\u0632 S3 \u062a\u0648\u0644\u06cc\u062f \u06a9\u0631\u062f\u0647 \u0648 \u0622\u0646 \u0631\u0627 \u0628\u0647 \u06a9\u0644\u0627\u06cc\u0646\u062a \u0628\u0631\u0645\u06cc\u200c\u06af\u0631\u062f\u0627\u0646\u062f. \u06a9\u0644\u0627\u06cc\u0646\u062a \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u0628\u0647 Spaces \u0622\u067e\u0644\u0648\u062f \u0645\u06cc\u200c\u06a9\u0646\u062f\u061b \u067e\u0633 \u0633\u0631\u0648\u0631 \u0647\u0631\u06af\u0632 Payload \u0628\u0627\u06cc\u0646\u0631\u06cc \u0631\u0627 \u0647\u0646\u062f\u0644 \u0646\u0645\u06cc\u200c\u06a9\u0646\u062f. \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0628\u0627\u0631 \u0648 Egress \u0633\u0631\u0648\u0631 \u0631\u0627 \u06a9\u0627\u0647\u0634 \u062f\u0627\u062f\u0647 \u0648 \u0628\u0631\u0627\u06cc \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u0628\u0632\u0631\u06af \u0648 \u06a9\u0644\u0627\u06cc\u0646\u062a\u200c\u0647\u0627\u06cc \u0645\u0648\u0628\u0627\u06cc\u0644 \u0628\u0647\u062a\u0631 \u0627\u0633\u062a. \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc \u0633\u062e\u062a\u200c\u062a\u0631 \u0627\u0633\u062a\u061b \u0686\u0648\u0646 \u0622\u067e\u0644\u0648\u062f \u062e\u0627\u0631\u062c \u0627\u0632 Resolver \u0634\u0645\u0627 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc\u200c\u0634\u0648\u062f \u0648 \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0628\u0647 \u06cc\u06a9 Callback \u06cc\u0627 \u0645\u0631\u062d\u0644\u0647 \u062c\u062f\u0627\u06af\u0627\u0646\u0647 \u0628\u0631\u0627\u06cc \u062a\u0623\u06cc\u06cc\u062f \u0622\u0628\u062c\u06a9\u062a \u0646\u06cc\u0627\u0632 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u0645\u0644\u0627\u062d\u0638\u0647<\/th><th>\u0622\u067e\u0644\u0648\u062f \u0633\u0645\u062a \u0633\u0631\u0648\u0631<\/th><th>Presigned URL<\/th><\/tr><\/thead><tbody><tr><td>\u062a\u0646\u0627\u0633\u0628 \u0627\u0646\u062f\u0627\u0632\u0647 \u0641\u0627\u06cc\u0644<\/td><td>\u06a9\u0648\u0686\u06a9 \u062a\u0627 \u0645\u062a\u0648\u0633\u0637 (\u06a9\u0645\u062a\u0631 \u0627\u0632 \u06f1\u06f0\u06f0 \u0645\u06af\u0627\u0628\u0627\u06cc\u062a)<\/td><td>\u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u0628\u0632\u0631\u06af (\u06f1\u06f0\u06f0 \u0645\u06af\u0627\u0628\u0627\u06cc\u062a \u0628\u0647 \u0628\u0627\u0644\u0627)<\/td><\/tr><tr><td>\u0647\u0632\u06cc\u0646\u0647 Egress \u0633\u0631\u0648\u0631<\/td><td>\u0628\u0644\u0647<\/td><td>\u062e\u06cc\u0631<\/td><\/tr><tr><td>\u067e\u06cc\u0686\u06cc\u062f\u06af\u06cc \u06a9\u0644\u0627\u06cc\u0646\u062a<\/td><td>\u067e\u0627\u06cc\u06cc\u0646<\/td><td>\u0645\u062a\u0648\u0633\u0637<\/td><\/tr><tr><td>\u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc \u0641\u0627\u06cc\u0644<\/td><td>\u0622\u0633\u0627\u0646 (\u0633\u0645\u062a \u0633\u0631\u0648\u0631)<\/td><td>\u0633\u062e\u062a\u200c\u062a\u0631 (\u0646\u06cc\u0627\u0632\u0645\u0646\u062f Callback)<\/td><\/tr><tr><td>\u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u062f\u0631 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634<\/td><td>\u0628\u0644\u0647<\/td><td>\u062e\u06cc\u0631<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc \u062a\u0648\u0644\u06cc\u062f \u06cc\u06a9 Presigned URL \u0628\u0627 AWS SDK Go v2\u060c \u0627\u0632 \u06cc\u06a9 \u06a9\u0644\u0627\u06cc\u0646\u062a Presign \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import (\n    \"context\"\n    \"fmt\"\n    \"os\"\n    \"time\"\n\n    \"github.com\/aws\/aws-sdk-go-v2\/aws\"\n    \"github.com\/aws\/aws-sdk-go-v2\/service\/s3\"\n)\n\n\/\/ GeneratePresignedURL returns a time-limited upload URL for the given object key.\n\/\/ s3Client is an *s3.Client already configured with your Spaces endpoint and credentials.\nfunc GeneratePresignedURL(s3Client *s3.Client, objectKey string) (string, error) {\n    presignClient := s3.NewPresignClient(s3Client)\n    presignResult, err := presignClient.PresignPutObject(context.TODO(),\n        &amp;s3.PutObjectInput{\n            Bucket: aws.String(os.Getenv(\"DO_SPACE_NAME\")),\n            Key:    aws.String(objectKey),\n        },\n        s3.WithPresignExpires(15*time.Minute),\n    )\n    if err != nil {\n        return \"\", fmt.Errorf(\"failed to generate presigned URL: %w\", err)\n    }\n    return presignResult.URL, nil\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u062a\u0648\u062c\u0647:<\/strong> \u0645\u0642\u062f\u0627\u0631 s3Client \u0627\u06cc\u0646\u062c\u0627 \u0647\u0645\u0627\u0646 \u200e*s3.Client \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc\u200c\u0634\u062f\u0647 \u062f\u0631 \u0645\u0631\u062d\u0644\u0647 \u06f6 \u0628\u0627 Endpoint \u0648 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a Spaces \u0634\u0645\u0627\u0633\u062a. \u0645\u0642\u062f\u0627\u0631 userFileName \u0631\u0627 \u0628\u0647\u200c\u0639\u0646\u0648\u0627\u0646 \u0622\u0631\u06af\u0648\u0645\u0627\u0646 objectKey \u067e\u0627\u0633 \u0628\u062f\u0647\u06cc\u062f. URL \u0628\u0631\u06af\u0631\u062f\u0627\u0646\u062f\u0647\u200c\u0634\u062f\u0647 \u06f1\u06f5 \u062f\u0642\u06cc\u0642\u0647 \u0627\u0639\u062a\u0628\u0627\u0631 \u062f\u0627\u0631\u062f. \u0622\u0646 \u0631\u0627 \u0627\u0632 Resolver \u062e\u0648\u062f \u0628\u0631\u06af\u0631\u062f\u0627\u0646\u062f\u0647 \u0648 \u0627\u062c\u0627\u0632\u0647 \u062f\u0647\u06cc\u062f \u06a9\u0644\u0627\u06cc\u0646\u062a \u0641\u0627\u06cc\u0644 \u0631\u0627 \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b PUT \u06a9\u0646\u062f.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0645\u062f\u06cc\u0631\u06cc\u062a \u062e\u0637\u0627 \u0648 \u062d\u0627\u0644\u062a\u200c\u0647\u0627\u06cc \u0634\u06a9\u0633\u062a \u0631\u0627\u06cc\u062c<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u062c\u062f\u0648\u0644 \u0632\u06cc\u0631 \u0628\u0647 \u062a\u0634\u062e\u06cc\u0635 \u0634\u06a9\u0633\u062a\u200c\u0647\u0627\u06cc \u0631\u0627\u06cc\u062c \u0647\u0646\u06af\u0627\u0645 \u0622\u067e\u0644\u0648\u062f \u0628\u0647 Spaces \u0627\u0632 \u06cc\u06a9 Resolver \u06af\u0631\u0627\u0641\u200c\u06a9\u06cc\u0648\u0627\u0644 \u06a9\u0645\u06a9 \u0645\u06cc\u200c\u06a9\u0646\u062f:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u062e\u0637\u0627<\/th><th>\u0639\u0644\u062a<\/th><th>\u0631\u0627\u0647\u200c\u062d\u0644<\/th><\/tr><\/thead><tbody><tr><td>NoCredentialProviders<\/td><td>\u0646\u0628\u0648\u062f\u0646 \u06cc\u0627 \u0646\u0627\u062f\u0631\u0633\u062a \u0628\u0648\u062f\u0646 ACCESS_KEY \/ SECRET_KEY \u062f\u0631 .env<\/td><td>\u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u06cc\u062f \u0645\u0642\u0627\u062f\u06cc\u0631 .env \u0628\u0627 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a API Key \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 Spaces \u0645\u0637\u0627\u0628\u0642\u062a \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0646\u062f<\/td><\/tr><tr><td>InvalidEndpoint<\/td><td>URL \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 Endpoint \u0628\u062f\u0648\u0646 https:\/\/ \u06cc\u0627 \u0634\u0627\u0645\u0644 \u0646\u0627\u0645 Bucket<\/td><td>\u0642\u0627\u0644\u0628 \u0628\u0627\u06cc\u062f https:\/\/.digitaloceanspaces.com \u0628\u0627\u0634\u062f<\/td><\/tr><tr><td>RequestError: send request failed<\/td><td>\u0631\u0634\u062a\u0647 Region \u0627\u0634\u062a\u0628\u0627\u0647<\/td><td>Region \u0631\u0627 \u0628\u0627 Slug \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 Region \u0641\u0636\u0627\u06cc \u062e\u0648\u062f \u0645\u0637\u0627\u0628\u0642\u062a \u062f\u0647\u06cc\u062f (\u0645\u062b\u0644\u0627\u064b nyc3)<\/td><\/tr><tr><td>Scalar \u0628\u0627 \u0646\u0627\u0645 Upload \u062f\u0631 gqlgen \u0628\u0631\u0627\u0628\u0631 nil \u0627\u0633\u062a<\/td><td>\u06a9\u0644\u0627\u06cc\u0646\u062a Content-Type: application\/json \u0628\u0647\u200c\u062c\u0627\u06cc multipart\/form-data \u0641\u0631\u0633\u062a\u0627\u062f\u0647<\/td><td>\u0645\u0637\u0645\u0626\u0646 \u0634\u0648\u06cc\u062f \u06a9\u0644\u0627\u06cc\u0646\u062a Content-Type \u062f\u0631\u0633\u062a \u0631\u0627 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0631\u062f\u0647 \u0648 \u0627\u0632 Specification \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 Multipart \u067e\u06cc\u0631\u0648\u06cc \u0645\u06cc\u200c\u06a9\u0646\u062f<\/td><\/tr><tr><td>panic: not implemented<\/td><td>Resolver \u0628\u0639\u062f \u0627\u0632 gqlgen generate \u0628\u0647\u200c\u0637\u0648\u0631 \u06a9\u0627\u0645\u0644 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0646\u0634\u062f\u0647<\/td><td>panic(fmt.Errorf(&#8220;not implemented&#8221;)) \u0631\u0627 \u0628\u0627 \u0645\u0646\u0637\u0642 \u0648\u0627\u0642\u0639\u06cc Resolver \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u06a9\u0646\u06cc\u062f<\/td><\/tr><tr><td>EntityTooLarge<\/td><td>\u0641\u0627\u06cc\u0644 \u0627\u0632 \u0633\u0642\u0641\u0650 \u0647\u0631 \u0622\u0628\u062c\u06a9\u062a Spaces (\u200f\u06f5 \u062a\u0631\u0627\u0628\u0627\u06cc\u062a \u0628\u0631\u0627\u06cc \u0622\u0628\u062c\u06a9\u062a \u0645\u0646\u0641\u0631\u062f) \u0628\u06cc\u0634\u062a\u0631 \u0627\u0633\u062a<\/td><td>\u0628\u0631\u0627\u06cc \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u0628\u0627\u0644\u0627\u06cc \u06f5 \u06af\u06cc\u06af\u0627\u0628\u0627\u06cc\u062a\u060c \u0627\u0632 \u0622\u067e\u0644\u0648\u062f Multipart \u0628\u0627 s3.CreateMultipartUpload \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Spaces \u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f \u0627\u0632 \u0622\u0628\u062c\u06a9\u062a\u200c\u0647\u0627\u06cc \u0645\u0646\u0641\u0631\u062f \u062a\u0627 \u06f5 \u062a\u0631\u0627\u0628\u0627\u06cc\u062a \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0645\u06cc\u200c\u06a9\u0646\u062f. \u0622\u067e\u0644\u0648\u062f Multipart \u0628\u0631\u0627\u06cc \u0622\u0628\u062c\u06a9\u062a\u200c\u0647\u0627\u06cc \u0628\u0632\u0631\u06af\u200c\u062a\u0631 \u0627\u0632 \u06f5 \u06af\u06cc\u06af\u0627\u0628\u0627\u06cc\u062a \u0627\u0644\u0632\u0627\u0645\u06cc \u0627\u0633\u062a. \u0628\u0631\u0627\u06cc \u0645\u062d\u062f\u0648\u062f\u06cc\u062a\u200c\u0647\u0627 \u0648 \u0633\u0647\u0645\u06cc\u0647\u200c\u0647\u0627\u06cc (Quota) \u0641\u0639\u0644\u06cc \u0646\u0631\u062e\u060c \u0645\u0633\u062a\u0646\u062f\u0627\u062a API \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 Spaces \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0633\u0648\u0627\u0644\u0627\u062a \u0645\u062a\u062f\u0627\u0648\u0644<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u06f1. \u0622\u06cc\u0627 GraphQL \u0628\u0647\u200c\u0635\u0648\u0631\u062a \u0628\u0648\u0645\u06cc \u0627\u0632 \u0622\u067e\u0644\u0648\u062f \u0641\u0627\u06cc\u0644 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0645\u06cc\u200c\u06a9\u0646\u062f\u061f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u062e\u06cc\u0631. Specification \u06af\u0631\u0627\u0641\u200c\u06a9\u06cc\u0648\u0627\u0644 \u0645\u06a9\u0627\u0646\u06cc\u0632\u0645 \u0622\u067e\u0644\u0648\u062f \u0641\u0627\u06cc\u0644 \u062a\u0639\u0631\u06cc\u0641 \u0646\u0645\u06cc\u200c\u06a9\u0646\u062f. \u0622\u067e\u0644\u0648\u062f \u0641\u0627\u06cc\u0644\u200c\u0647\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 graphql-multipart-request-spec \u0647\u0646\u062f\u0644 \u0645\u06cc\u200c\u0634\u0648\u062f\u061b \u06a9\u0647 GraphQL \u0631\u0627 \u0631\u0648\u06cc HTTP \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0631\u0645\u0632\u0646\u06af\u0627\u0631\u06cc multipart\/form-data \u06af\u0633\u062a\u0631\u0634 \u0645\u06cc\u200c\u062f\u0647\u062f. \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647\u200c\u0647\u0627\u06cc\u06cc \u0645\u062b\u0644 gqlgen \u0627\u06cc\u0646 Specification \u0631\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0646\u0648\u0639 Scalar \u0628\u0627 \u0646\u0627\u0645 Upload \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u06f2. \u06a9\u062f\u0627\u0645 \u0646\u0633\u062e\u0647 \u0627\u0632 AWS SDK \u0628\u0631\u0627\u06cc Go \u0631\u0627 \u0628\u0627\u06cc\u062f \u0628\u0627 Spaces \u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u0645\u061f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0632 AWS SDK Go v2 \u200f(\u200fgithub.com\/aws\/aws-sdk-go-v2) \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f. AWS SDK Go v1 \u062f\u0631 \u062d\u0627\u0644\u062a \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u0627\u0633\u062a \u0648 \u0641\u0642\u0637 \u067e\u0686\u200c\u0647\u0627\u06cc \u0627\u0645\u0646\u06cc\u062a\u06cc \u0628\u062d\u0631\u0627\u0646\u06cc \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc\u200c\u06a9\u0646\u062f. Spaces \u0628\u0627 \u0647\u0631 \u062f\u0648 \u0633\u0627\u0632\u06af\u0627\u0631 \u0627\u0633\u062a\u061b \u0627\u0645\u0627 v2 \u0627\u0646\u062a\u062e\u0627\u0628 \u062a\u0648\u0635\u06cc\u0647\u200c\u0634\u062f\u0647 \u0628\u0631\u0627\u06cc \u067e\u0631\u0648\u0698\u0647\u200c\u0647\u0627\u06cc \u062c\u062f\u06cc\u062f \u0627\u0633\u062a.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u06f3. \u0686\u0637\u0648\u0631 Endpoint \u062f\u0631\u0633\u062a \u0631\u0627 \u0628\u0631\u0627\u06cc Spaces \u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f \u062f\u0631 AWS SDK Go v2 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u0645\u061f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0632 \u0642\u0627\u0644\u0628 https:\/\/.digitaloceanspaces.com \u0628\u062f\u0648\u0646 \u0646\u0627\u0645 Bucket \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f. \u0645\u062b\u0644\u0627\u064b\u060c \u0628\u0631\u0627\u06cc Region \u0628\u0627 \u0646\u0627\u0645 nyc3: \u200f<a href=\"https:\/\/nyc3.digitaloceanspaces.com\">https:\/\/nyc3.digitaloceanspaces.com<\/a>. \u0627\u06cc\u0646 \u0631\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 config.WithBaseEndpoint \u062f\u0631 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc SDK \u2014 \u0647\u0645\u0627\u0646\u200c\u0637\u0648\u0631 \u06a9\u0647 \u062f\u0631 Resolver \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 UploadProfileImage \u062f\u0631 \u0645\u0631\u062d\u0644\u0647 \u06f6 \u0646\u0634\u0627\u0646 \u062f\u0627\u062f\u0647 \u0634\u062f \u2014 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u06f4. \u062d\u062f\u0627\u06a9\u062b\u0631 \u0627\u0646\u062f\u0627\u0632\u0647 \u0641\u0627\u06cc\u0644 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc\u200c\u0634\u062f\u0647 \u062a\u0648\u0633\u0637 \u06cc\u06a9 \u0622\u067e\u0644\u0648\u062f \u0645\u0646\u0641\u0631\u062f \u0628\u0647 Spaces \u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f \u0686\u0642\u062f\u0631 \u0627\u0633\u062a\u061f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u06cc\u06a9 \u0622\u067e\u0644\u0648\u062f \u0622\u0628\u062c\u06a9\u062a \u0645\u0646\u0641\u0631\u062f \u0627\u0632 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc\u06cc \u062a\u0627 \u06f5 \u062a\u0631\u0627\u0628\u0627\u06cc\u062a \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0645\u06cc\u200c\u06a9\u0646\u062f. \u0622\u0628\u062c\u06a9\u062a\u200c\u0647\u0627\u06cc \u0628\u0632\u0631\u06af\u200c\u062a\u0631 \u0627\u0632 \u06f5 \u06af\u06cc\u06af\u0627\u0628\u0627\u06cc\u062a \u0628\u0627\u06cc\u062f \u0627\u0632 API \u0622\u067e\u0644\u0648\u062f Multipart \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 S3 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u0646\u062f. \u0628\u0631\u0627\u06cc \u0645\u0642\u0627\u062f\u06cc\u0631 \u0641\u0639\u0644\u06cc\u060c \u0628\u0647 \u0645\u0633\u062a\u0646\u062f\u0627\u062a \u0645\u062d\u062f\u0648\u062f\u06cc\u062a\u200c\u0647\u0627\u06cc Spaces \u0645\u0631\u0627\u062c\u0639\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u06f5. \u0622\u06cc\u0627 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627 \u0631\u0627 \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u0627\u0632 \u0633\u0631\u0648\u0631 GraphQL \u0622\u067e\u0644\u0648\u062f \u06a9\u0646\u0645 \u06cc\u0627 \u0627\u0632 Presigned URL \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u0645\u061f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0631\u0627\u06cc \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u06a9\u0648\u0686\u06a9 \u0648 \u0633\u0646\u0627\u0631\u06cc\u0648\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0628\u0647 \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc \u0633\u0645\u062a \u0633\u0631\u0648\u0631 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u0646\u062f\u060c \u0622\u067e\u0644\u0648\u062f \u0645\u0633\u062a\u0642\u06cc\u0645 \u0627\u0632 \u0637\u0631\u06cc\u0642 Resolver (\u0647\u0645\u0627\u0646\u200c\u0637\u0648\u0631 \u06a9\u0647 \u062f\u0631 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634 \u0646\u0634\u0627\u0646 \u062f\u0627\u062f\u0647 \u0634\u062f) \u0631\u0648\u06cc\u06a9\u0631\u062f \u0633\u0627\u062f\u0647\u200c\u062a\u0631\u06cc \u0627\u0633\u062a. \u0628\u0631\u0627\u06cc \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u0628\u0632\u0631\u06af \u06cc\u0627 \u062e\u0637\u0648\u0637 \u0644\u0648\u0644\u0647 \u0628\u0627 \u062a\u0648\u0627\u0646 \u0639\u0628\u0648\u0631\u06cc \u0628\u0627\u0644\u0627\u060c \u06cc\u06a9 Presigned URL \u062a\u0648\u0644\u06cc\u062f \u06a9\u0631\u062f\u0647 \u0648 \u0627\u062c\u0627\u0632\u0647 \u062f\u0647\u06cc\u062f \u06a9\u0644\u0627\u06cc\u0646\u062a \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u0628\u0647 Spaces \u0622\u067e\u0644\u0648\u062f \u06a9\u0646\u062f\u061b \u0628\u062f\u0648\u0646 \u0639\u0628\u0648\u0631 \u0627\u0632 \u0633\u0631\u0648\u0631 Go. \u0628\u0631\u0627\u06cc \u0645\u0642\u0627\u06cc\u0633\u0647 \u06a9\u0627\u0645\u0644\u060c \u0628\u062e\u0634 \u00ab\u0627\u0646\u062a\u062e\u0627\u0628 \u0628\u06cc\u0646 \u0622\u067e\u0644\u0648\u062f \u0633\u0645\u062a \u0633\u0631\u0648\u0631 \u0648 Presigned URL\u0647\u0627\u00bb \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u06f6. \u0686\u0637\u0648\u0631 \u06cc\u06a9 Mutation \u0622\u067e\u0644\u0648\u062f \u0641\u0627\u06cc\u0644 GraphQL \u0631\u0627 \u0628\u062f\u0648\u0646 Frontend \u062a\u0633\u062a \u06a9\u0646\u0645\u061f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u0627\u0632 cURL \u0628\u0627 \u0641\u0644\u06af -F \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0641\u0631\u0645 Multipart \u06a9\u0647 \u0627\u0632 graphql-multipart-request-spec \u067e\u06cc\u0631\u0648\u06cc \u0645\u06cc\u200c\u06a9\u0646\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f. \u062f\u0633\u062a\u0648\u0631 \u062a\u0633\u062a \u062f\u0631 \u0645\u0631\u062d\u0644\u0647 \u06f6 \u0627\u0631\u0627\u0626\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a. \u0647\u0645\u0686\u0646\u06cc\u0646 \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc\u06cc \u0645\u062b\u0644 Insomnia \u0627\u0632 Mutation\u0647\u0627\u06cc Multipart \u06af\u0631\u0627\u0641\u200c\u06a9\u06cc\u0648\u0627\u0644 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u06cc\u06a9 \u0641\u06cc\u0644\u062f \u0622\u067e\u0644\u0648\u062f \u0641\u0627\u06cc\u0644 \u0627\u062e\u062a\u0635\u0627\u0635\u06cc \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u06f7. \u0622\u06cc\u0627 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u0645 \u0627\u0632 \u0627\u06cc\u0646 \u0631\u0648\u06cc\u06a9\u0631\u062f \u0628\u0627 \u0633\u0627\u06cc\u0631 \u0627\u0631\u0627\u0626\u0647\u200c\u062f\u0647\u0646\u062f\u06af\u0627\u0646 \u0630\u062e\u06cc\u0631\u0647\u200c\u0633\u0627\u0632\u06cc Object \u0633\u0627\u0632\u06af\u0627\u0631 \u0628\u0627 S3 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u0645\u061f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u0628\u0644\u0647. \u0647\u0631 \u0627\u0631\u0627\u0626\u0647\u200c\u062f\u0647\u0646\u062f\u0647 \u0633\u0627\u0632\u06af\u0627\u0631 \u0628\u0627 S3 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u0628\u0627 \u062a\u063a\u06cc\u06cc\u0631 URL \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 Endpoint \u062f\u0631 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637\u06cc \u062e\u0648\u062f \u0648 \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u062f\u0633\u062a\u0631\u0633\u06cc\u200c\u062a\u0627\u0646 \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u0634\u0648\u062f. AWS SDK Go v2 \u0648\u0642\u062a\u06cc \u06cc\u06a9 Endpoint \u0633\u0641\u0627\u0631\u0634\u06cc \u062a\u0639\u06cc\u06cc\u0646 \u0634\u062f\u0647\u060c \u0646\u0633\u0628\u062a \u0628\u0647 \u0627\u0631\u0627\u0626\u0647\u200c\u062f\u0647\u0646\u062f\u0647 \u0632\u06cc\u0631\u0628\u0646\u0627\u06cc\u06cc \u0628\u06cc\u200c\u0637\u0631\u0641 \u0627\u0633\u062a.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u062c\u0645\u0639\u200c\u0628\u0646\u062f\u06cc<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u062f\u0631 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634\u060c \u06cc\u06a9 \u0622\u067e\u0644\u0648\u062f \u0641\u0627\u06cc\u0644 \u0628\u0647 \u06cc\u06a9 Bucket \u0633\u0627\u062e\u062a\u0647\u200c\u0634\u062f\u0647 \u0631\u0648\u06cc \u06cc\u06a9 Space \u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 AWS SDK \u0628\u0631\u0627\u06cc Go v2 \u0627\u0632 \u06cc\u06a9 Mutation Resolver \u062f\u0631 \u06cc\u06a9 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 GraphQL \u0627\u0646\u062c\u0627\u0645 \u062f\u0627\u062f\u06cc\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0645\u0642\u062f\u0645\u0647 \u0628\u0631\u0627\u06cc \u0628\u0633\u06cc\u0627\u0631\u06cc \u0627\u0632 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646\u200c\u0647\u0627\u060c \u06cc\u06a9 \u0642\u0627\u0628\u0644\u06cc\u062a \u0645\u0637\u0644\u0648\u0628\u060c \u062a\u0648\u0627\u0646\u0627\u06cc\u06cc \u06a9\u0627\u0631\u0628\u0631 \u062f\u0631 \u0622\u067e\u0644\u0648\u062f \u062a\u0635\u0648\u06cc\u0631 \u067e\u0631\u0648\u0641\u0627\u06cc\u0644 \u0627\u0633\u062a. \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644\u060c \u0633\u0627\u062e\u062a \u0627\u06cc\u0646 \u0642\u0627\u0628\u0644\u06cc\u062a \u0628\u0631\u0627\u06cc \u062a\u0648\u0633\u0639\u0647\u200c\u062f\u0647\u0646\u062f\u06af\u0627\u0646 \u062a\u0627\u0632\u0647\u200c\u0648\u0627\u0631\u062f GraphQL \u2014 \u06a9\u0647 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u062f\u0627\u062e\u0644\u06cc \u0627\u0632 \u0622\u067e\u0644\u0648\u062f \u0641\u0627\u06cc\u0644 \u0646\u062f\u0627\u0631\u062f \u2014 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u0686\u0627\u0644\u0634\u200c\u0628\u0631\u0627\u0646\u06af\u06cc\u0632 \u0628\u0627\u0634\u062f. \u062f\u0631 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634\u060c \u06cc\u0627\u062f \u0645\u06cc\u200c\u06af\u06cc\u0631\u06cc\u062f \u062a\u0635\u0627\u0648\u06cc\u0631 \u0631\u0627 \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u0627\u0632 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 Backend \u062e\u0648\u062f \u0628\u0647 \u06cc\u06a9 \u0633\u0631\u0648\u06cc\u0633 \u0630\u062e\u06cc\u0631\u0647\u200c\u0633\u0627\u0632\u06cc \u0634\u062e\u0635 \u062b\u0627\u0644\u062b &hellip;<\/p>\n","protected":false},"author":9,"featured_media":7155,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[190,8],"tags":[],"class_list":["post-7154","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programming","category-8"],"_links":{"self":[{"href":"https:\/\/parmin.cloud\/blog\/wp-json\/wp\/v2\/posts\/7154","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/parmin.cloud\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/parmin.cloud\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/parmin.cloud\/blog\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/parmin.cloud\/blog\/wp-json\/wp\/v2\/comments?post=7154"}],"version-history":[{"count":1,"href":"https:\/\/parmin.cloud\/blog\/wp-json\/wp\/v2\/posts\/7154\/revisions"}],"predecessor-version":[{"id":7156,"href":"https:\/\/parmin.cloud\/blog\/wp-json\/wp\/v2\/posts\/7154\/revisions\/7156"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/parmin.cloud\/blog\/wp-json\/wp\/v2\/media\/7155"}],"wp:attachment":[{"href":"https:\/\/parmin.cloud\/blog\/wp-json\/wp\/v2\/media?parent=7154"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/parmin.cloud\/blog\/wp-json\/wp\/v2\/categories?post=7154"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/parmin.cloud\/blog\/wp-json\/wp\/v2\/tags?post=7154"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}