From 9c0dffad8d9e8e0e71669cbc3d9803ed53b00cdc Mon Sep 17 00:00:00 2001 From: celogeek <65178+celogeek@users.noreply.github.com> Date: Mon, 13 Dec 2021 09:32:43 +0100 Subject: [PATCH] factorize piwigo call --- internal/piwigo/post.go | 77 +++++++++++++++++++++++++++++++++++++++++ login.go | 59 +++++++------------------------ 2 files changed, 89 insertions(+), 47 deletions(-) create mode 100644 internal/piwigo/post.go diff --git a/internal/piwigo/post.go b/internal/piwigo/post.go new file mode 100644 index 0000000..c957ad1 --- /dev/null +++ b/internal/piwigo/post.go @@ -0,0 +1,77 @@ +package piwigo + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + "net/url" +) + +type Piwigo struct { + Url string + Token string + Method string +} + +type PiwigoResult struct { + Stat string `json:"stat"` + Err int `json:"err"` + ErrMessage string `json:"message"` + Result interface{} `json:"result"` +} + +func (p *Piwigo) BuildUrl() (string, error) { + + Url, Err := url.Parse(p.Url) + if Err != nil { + return "", Err + } + Url.Path += "/ws.php" + q := Url.Query() + q.Set("format", "json") + q.Set("method", p.Method) + Url.RawQuery = q.Encode() + return Url.String(), nil +} + +func (p *Piwigo) Post(req *url.Values, resp interface{}) error { + Url, Err := p.BuildUrl() + if Err != nil { + return Err + } + + r, Err := http.PostForm(Url, *req) + if Err != nil { + return Err + } + + defer r.Body.Close() + + b, Err := ioutil.ReadAll(r.Body) + if Err != nil { + return Err + } + + Result := PiwigoResult{ + Result: resp, + } + + Err = json.Unmarshal(b, &Result) + if Err != nil { + return Err + } + + if Result.Stat != "ok" { + return fmt.Errorf("[Error %d] %s", Result.Err, Result.ErrMessage) + } + + for _, c := range r.Cookies() { + if c.Name == "pwg_id" { + p.Token = c.Value + break + } + } + + return nil +} diff --git a/login.go b/login.go index 309bc31..20db775 100644 --- a/login.go +++ b/login.go @@ -1,12 +1,10 @@ package main import ( - "encoding/json" - "errors" "fmt" - "io/ioutil" - "net/http" "net/url" + + "github.com/celogeek/piwigo-cli/internal/piwigo" ) type LoginCommand struct { @@ -17,57 +15,24 @@ type LoginCommand struct { var loginCommand LoginCommand -type Result struct { - Stat string `json:"stat"` - Result bool `json:"result"` -} - func (c *LoginCommand) Execute(args []string) error { fmt.Printf("Login on %s...\n", c.Url) - Url, err := url.Parse(c.Url) - if err != nil { - return err - } - Url.Path = "ws.php" - q := Url.Query() - q.Set("format", "json") - q.Set("method", "pwg.session.login") - Url.RawQuery = q.Encode() - fmt.Println(Url.String()) - - Form := url.Values{} - Form.Set("username", c.Login) - Form.Set("password", c.Password) - - r, err := http.PostForm(Url.String(), Form) - if err != nil { - return err - } - defer r.Body.Close() - - b, err := ioutil.ReadAll(r.Body) - if err != nil { - return err + Piwigo := piwigo.Piwigo{ + Url: c.Url, + Method: "pwg.session.login", } - result := Result{} + result := false - err = json.Unmarshal(b, &result) - if err != nil { - return err + if Err := Piwigo.Post(&url.Values{ + "username": []string{c.Login}, + "password": []string{c.Password}, + }, &result); Err != nil { + return Err } - if !result.Result { - return errors.New("can't login with the credential provided") - } - - for _, c := range r.Cookies() { - if c.Name == "pwg_id" { - fmt.Println("Token:", c.Value) - break - } - } + fmt.Printf("Token: %s\n", Piwigo.Token) return nil }