From 1e844948c709242c6e62e852356e08ecb0f5d860 Mon Sep 17 00:00:00 2001 From: Denis Istratov Date: Sat, 19 Oct 2024 12:00:00 +0300 Subject: [PATCH] update go-sdk-slim.go, test.jpg --- go-sdk-slim.go | 660 +++++++++++++++++++++++++++++++++++++++++++++++++ test.jpg | Bin 0 -> 5873 bytes 2 files changed, 660 insertions(+) create mode 100644 go-sdk-slim.go create mode 100644 test.jpg diff --git a/go-sdk-slim.go b/go-sdk-slim.go new file mode 100644 index 0000000..555d6c3 --- /dev/null +++ b/go-sdk-slim.go @@ -0,0 +1,660 @@ +package main + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "io" + "mime/multipart" + "net/http" +) + +type ConfidentialType string + +const ( + ALL ConfidentialType = "ALL" + FRIENDS ConfidentialType = "FRIENDS" + NOBODY ConfidentialType = "NOBODY" +) + +type ESAccount struct { + DateOfBirth string + Description string + Follows []string + Followers []string +} + +func (a ESAccount) String() string { + follows, _ := json.Marshal(a.Follows) + followers, _ := json.Marshal(a.Followers) + return fmt.Sprintf(`{ "date_of_birth": "%s", "description": "%s", "follows": %s, "followers": %s }`, a.DateOfBirth, a.Description, follows, followers) +} + +type ESUser struct { + ID int + Username string + FirstName string + LastName string + PictureURL string + Email string + Access string + TelegramID string + GoogleID string + Token string + Account *ESAccount + Confidencial map[string]ConfidentialType +} + +func (u ESUser) String() string { + return fmt.Sprintf(`{ "id": %d, "username": "%s", "first_name": "%s", "last_name": "%s", "picture_url": "%s", "email": "%s", "access": "%s", "telegram_id": "%s", "google_id": "%s" }`, u.ID, u.Username, u.FirstName, u.LastName, u.PictureURL, u.Email, u.Access, u.TelegramID, u.GoogleID) +} + +type ESCleint struct { + Token string +} + +func (c *ESCleint) getSelf() (*ESUser, error) { + url := "https://auth.easystartup.su/api/user/self" + response, err := http.Get(url) + if err != nil { + return nil, err + } + defer response.Body.Close() + + if response.StatusCode != 200 { + return nil, errors.New("Bad response code: " + fmt.Sprint(response.StatusCode)) + } + + var data map[string]interface{} + if err := json.NewDecoder(response.Body).Decode(&data); err != nil { + return nil, err + } + + account, err := c.getSelfAccount() + if err != nil { + return nil, err + } + + confidencial, err := c.getSelfConfidential() + if err != nil { + return nil, err + } + + return &ESUser{ + ID: int(data["id"].(float64)), + Username: data["username"].(string), + FirstName: data["first_name"].(string), + LastName: data["last_name"].(string), + PictureURL: data["picture_url"].(string), + Email: data["email"].(string), + Access: data["access"].(string), + TelegramID: data["telegram_id"].(string), + GoogleID: data["google_id"].(string), + Token: c.Token, + Account: account, + Confidencial: confidencial, + }, nil +} + +func (c *ESCleint) follow(id int) error { + url := fmt.Sprintf("https://account.easystartup.su/api/following/follow/%d", id) + req, err := http.NewRequest("PUT", url, nil) + if err != nil { + return err + } + req.Header = c.headers() + + response, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + defer response.Body.Close() + + if response.StatusCode != 200 { + return errors.New("Bad response code: " + fmt.Sprint(response.StatusCode)) + } + return nil +} + +func (c *ESCleint) unfollow(id int) error { + url := fmt.Sprintf("https://account.easystartup.su/api/following/unfollow/%d", id) + req, err := http.NewRequest("PUT", url, nil) + if err != nil { + return err + } + req.Header = c.headers() + + response, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + defer response.Body.Close() + + if response.StatusCode != 200 { + return errors.New("Bad response code: " + fmt.Sprint(response.StatusCode)) + } + return nil +} + +func (c *ESCleint) getSelfAccount() (*ESAccount, error) { + url := "https://account.easystartup.su/api/account" + response, err := http.Get(url) + if err != nil { + return nil, err + } + defer response.Body.Close() + + if response.StatusCode != 200 { + return nil, errors.New("Bad response code: " + fmt.Sprint(response.StatusCode)) + } + + var data map[string]interface{} + if err := json.NewDecoder(response.Body).Decode(&data); err != nil { + return nil, err + } + + follows := []string{} + if data["follows"] != nil { + for _, f := range data["follows"].([]interface{}) { + follows = append(follows, f.(string)) + } + } + + followers := []string{} + if data["followers"] != nil { + for _, f := range data["followers"].([]interface{}) { + followers = append(followers, f.(string)) + } + } + + return &ESAccount{ + DateOfBirth: data["date_of_birth"].(string), + Description: data["description"].(string), + Follows: follows, + Followers: followers, + }, nil +} + +func (c *ESCleint) editSelfAccount(user *ESUser) error { + url := "https://account.easystartup.su/api/account" + data := map[string]string{ + "date_of_birth": user.Account.DateOfBirth, + "description": user.Account.Description, + } + jsonData, _ := json.Marshal(data) + + req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData)) + if err != nil { + return err + } + req.Header = c.headers() + + response, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + defer response.Body.Close() + + if response.StatusCode != 200 { + return errors.New("Bad response code: " + fmt.Sprint(response.StatusCode)) + } + return nil +} + +func (c *ESCleint) editSelfConfidential(user *ESUser) error { + url := "https://account.easystartup.su/api/confidential" + data := user.Confidencial + for k, v := range data { + data[k] = v + } + jsonData, _ := json.Marshal(data) + + req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData)) + if err != nil { + return err + } + req.Header = c.headers() + + response, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + defer response.Body.Close() + + if response.StatusCode != 200 { + return errors.New("Bad response code: " + fmt.Sprint(response.StatusCode)) + } + return nil +} + +func (c *ESCleint) getSelfConfidential() (map[string]ConfidentialType, error) { + url := "https://account.easystartup.su/api/confidential" + response, err := http.Get(url) + if err != nil { + return nil, err + } + defer response.Body.Close() + + if response.StatusCode != 200 { + return nil, errors.New("Bad response code: " + fmt.Sprint(response.StatusCode)) + } + + var data map[string]string + if err := json.NewDecoder(response.Body).Decode(&data); err != nil { + return nil, err + } + + confidential := make(map[string]ConfidentialType) + for k, v := range data { + confidential[k] = ConfidentialType(v) + } + return confidential, nil +} + +func (c *ESCleint) editSelf(user *ESUser) error { + url := "https://auth.easystartup.su/api/user/self" + data := map[string]string{ + "email": user.Email, + "first_name": user.FirstName, + "last_name": user.LastName, + "username": user.Username, + } + jsonData, _ := json.Marshal(data) + + req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData)) + if err != nil { + return err + } + req.Header = c.headers() + + response, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + defer response.Body.Close() + + if err := c.editSelfAccount(user); err != nil { + return err + } + if err := c.editSelfConfidential(user); err != nil { + return err + } + + if response.StatusCode != 200 { + return errors.New("Bad response code: " + fmt.Sprint(response.StatusCode)) + } + return nil +} + +func (c *ESCleint) getAccount(id int) (*ESAccount, error) { + url := fmt.Sprintf("https://account.easystartup.su/api/account/%d", id) + response, err := http.Get(url) + if err != nil { + return nil, err + } + defer response.Body.Close() + + if response.StatusCode != 200 { + return nil, errors.New("Bad response code: " + fmt.Sprint(response.StatusCode)) + } + + var data map[string]interface{} + if err := json.NewDecoder(response.Body).Decode(&data); err != nil { + return nil, err + } + + follows := []string{} + if data["follows"] != nil { + for _, f := range data["follows"].([]interface{}) { + follows = append(follows, f.(string)) + } + } + + followers := []string{} + if data["followers"] != nil { + for _, f := range data["followers"].([]interface{}) { + followers = append(followers, f.(string)) + } + } + + return &ESAccount{ + DateOfBirth: data["date_of_birth"].(string), + Description: data["description"].(string), + Follows: follows, + Followers: followers, + }, nil +} + +func (c *ESCleint) editAccount(user *ESUser) error { + url := fmt.Sprintf("https://account.easystartup.su/api/confidential/%d", user.ID) + data := map[string]string{ + "date_of_birth": user.Account.DateOfBirth, + "description": user.Account.Description, + } + jsonData, _ := json.Marshal(data) + + req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData)) + if err != nil { + return err + } + req.Header = c.headers() + + response, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + defer response.Body.Close() + + if response.StatusCode != 200 { + return errors.New("Bad response code: " + fmt.Sprint(response.StatusCode)) + } + return nil +} + +func (c *ESCleint) editConfidential(user *ESUser) error { + url := fmt.Sprintf("https://account.easystartup.su/api/confidential/%d", user.ID) + data := user.Confidencial + for k, v := range data { + data[k] = v + } + jsonData, _ := json.Marshal(data) + + req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData)) + if err != nil { + return err + } + req.Header = c.headers() + + response, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + defer response.Body.Close() + + if response.StatusCode != 200 { + return errors.New("Bad response code: " + fmt.Sprint(response.StatusCode)) + } + return nil +} + +func (c *ESCleint) getConfidential(id int) (map[string]ConfidentialType, error) { + url := fmt.Sprintf("https://account.easystartup.su/api/confidential/%d", id) + response, err := http.Get(url) + if err != nil { + return nil, err + } + defer response.Body.Close() + + if response.StatusCode != 200 { + return nil, errors.New("Bad response code: " + fmt.Sprint(response.StatusCode)) + } + + var data map[string]string + if err := json.NewDecoder(response.Body).Decode(&data); err != nil { + return nil, err + } + + confidential := make(map[string]ConfidentialType) + for k, v := range data { + confidential[k] = ConfidentialType(v) + } + return confidential, nil +} + +func (c *ESCleint) picture(file io.Reader) error { + url := "https://account.easystartup.su/api/account/picture" + body := &bytes.Buffer{} + writer := multipart.NewWriter(body) + part, err := writer.CreateFormFile("file", "pic.png") + if err != nil { + return err + } + if _, err := io.Copy(part, file); err != nil { + return err + } + writer.Close() + + req, err := http.NewRequest("POST", url, body) + if err != nil { + return err + } + req.Header = c.headers() + req.Header.Set("Content-Type", writer.FormDataContentType()) + + response, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + defer response.Body.Close() + + if response.StatusCode != 200 { + return errors.New("Bad response code: " + fmt.Sprint(response.StatusCode)) + } + return nil +} + +func (c *ESCleint) create(user *ESUser) (*ESUser, error) { + url := "https://auth.easystartup.su/api/user/" + jsn, _ := json.Marshal(user) + + req, err := http.NewRequest("PUT", url, bytes.NewBuffer(jsn)) + if err != nil { + return nil, err + } + req.Header = c.headers() + + response, err := http.DefaultClient.Do(req) + if err != nil { + return nil, err + } + defer response.Body.Close() + + if response.StatusCode != 200 { + return nil, errors.New("Bad response code: " + fmt.Sprint(response.StatusCode)) + } + + var data map[string]interface{} + if err := json.NewDecoder(response.Body).Decode(&data); err != nil { + return nil, err + } + + account, err := c.getAccount(int(data["id"].(float64))) + if err != nil { + return nil, err + } + + confidencial, err := c.getConfidential(int(data["id"].(float64))) + if err != nil { + return nil, err + } + + return &ESUser{ + ID: int(data["id"].(float64)), + Username: data["username"].(string), + FirstName: data["first_name"].(string), + LastName: data["last_name"].(string), + PictureURL: data["picture_url"].(string), + Email: data["email"].(string), + Access: data["access"].(string), + TelegramID: data["telegram_id"].(string), + GoogleID: data["google_id"].(string), + Token: c.Token, + Account: account, + Confidencial: confidencial, + }, nil +} + +func (c *ESCleint) edit(user *ESUser) error { + url := fmt.Sprintf("https://auth.easystartup.su/api/user/%d", user.ID) + jsn, _ := json.Marshal(user) + + req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsn)) + if err != nil { + return err + } + req.Header = c.headers() + + response, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + defer response.Body.Close() + + if err := c.editAccount(user); err != nil { + return err + } + if err := c.editConfidential(user); err != nil { + return err + } + + if response.StatusCode != 200 { + return errors.New("Bad response code: " + fmt.Sprint(response.StatusCode)) + } + return nil +} + +func (c *ESCleint) delete(user *ESUser) error { + url := fmt.Sprintf("https://auth.easystartup.su/api/user/%d", user.ID) + req, err := http.NewRequest("DELETE", url, nil) + if err != nil { + return err + } + req.Header = c.headers() + + response, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + defer response.Body.Close() + + if response.StatusCode != 200 { + return errors.New("Bad response code: " + fmt.Sprint(response.StatusCode)) + } + + url = fmt.Sprintf("https://auth.easystartup.su/api/account/%d", user.ID) + req, err = http.NewRequest("DELETE", url, nil) + if err != nil { + return err + } + req.Header = c.headers() + + response, err = http.DefaultClient.Do(req) + if err != nil { + return err + } + defer response.Body.Close() + + if response.StatusCode != 200 { + return errors.New("Bad response code: " + fmt.Sprint(response.StatusCode)) + } + return nil +} + +func (c *ESCleint) users(start int, limit int) ([]interface{}, error) { + url := fmt.Sprintf("https://auth.easystartup.su/api/user/all?start=%d&limit=%d", start, limit) + response, err := http.Get(url) + if err != nil { + return nil, err + } + defer response.Body.Close() + + if response.StatusCode != 200 { + return nil, errors.New("Bad response code: " + fmt.Sprint(response.StatusCode)) + } + + var data []interface{} + if err := json.NewDecoder(response.Body).Decode(&data); err != nil { + return nil, err + } + return data, nil +} + +func (c *ESCleint) public(id int) ([]interface{}, error) { + url := fmt.Sprintf("https://account.easystartup.su/api/public/%d", id) + response, err := http.Get(url) + if err != nil { + return nil, err + } + defer response.Body.Close() + + if response.StatusCode != 200 { + return nil, errors.New("Bad response code: " + fmt.Sprint(response.StatusCode)) + } + + var data []interface{} + if err := json.NewDecoder(response.Body).Decode(&data); err != nil { + return nil, err + } + return data, nil +} + +func (c *ESCleint) usersCount() (int, error) { + url := "https://auth.easystartup.su/api/user/count" + response, err := http.Get(url) + if err != nil { + return 0, err + } + defer response.Body.Close() + + if response.StatusCode != 200 { + return 0, errors.New("Bad response code: " + fmt.Sprint(response.StatusCode)) + } + + var data map[string]int + if err := json.NewDecoder(response.Body).Decode(&data); err != nil { + return 0, err + } + return data["count"], nil +} + +func (c *ESCleint) get(id int) (*ESUser, error) { + url := fmt.Sprintf("https://auth.easystartup.su/api/user/%d", id) + response, err := http.Get(url) + if err != nil { + return nil, err + } + defer response.Body.Close() + + if response.StatusCode != 200 { + return nil, errors.New("Bad response code: " + fmt.Sprint(response.StatusCode)) + } + + var data map[string]interface{} + if err := json.NewDecoder(response.Body).Decode(&data); err != nil { + return nil, err + } + + account, err := c.getAccount(int(data["id"].(float64))) + if err != nil { + return nil, err + } + + confidencial, err := c.getConfidential(int(data["id"].(float64))) + if err != nil { + return nil, err + } + + return &ESUser{ + ID: int(data["id"].(float64)), + Username: data["username"].(string), + FirstName: data["first_name"].(string), + LastName: data["last_name"].(string), + PictureURL: data["picture_url"].(string), + Email: data["email"].(string), + Access: data["access"].(string), + TelegramID: data["telegram_id"].(string), + GoogleID: data["google_id"].(string), + Token: c.Token, + Account: account, + Confidencial: confidencial, + }, nil +} + +func (c *ESCleint) headers() map[string]string { + return map[string]string{ + "Authorization": "Bearer " + c.Token, + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0", + "Accept": "application/json", + } +} diff --git a/test.jpg b/test.jpg new file mode 100644 index 0000000000000000000000000000000000000000..44bc65d302802edecd59e0fbc07cf131de4c9322 GIT binary patch literal 5873 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