diff --git a/auth.go b/auth.go index cbe9a13..6face6a 100644 --- a/auth.go +++ b/auth.go @@ -1,12 +1,52 @@ package writeas import ( + "fmt" "net/http" ) +// LogIn authenticates a user with Write.as. +// See https://writeas.github.io/docs/#authenticate-a-user +func (c *Client) LogIn(username, pass string) (*AuthUser, error) { + u := &AuthUser{} + up := struct { + Alias string `json:"alias"` + Pass string `json:"pass"` + }{ + Alias: username, + Pass: pass, + } + + env, err := c.post("/auth/login", up, u) + if err != nil { + return nil, err + } + + var ok bool + if u, ok = env.Data.(*AuthUser); !ok { + return nil, fmt.Errorf("Wrong data returned from API.") + } + + status := env.Code + if status == http.StatusOK { + return u, nil + } else if status == http.StatusBadRequest { + return nil, fmt.Errorf("Bad request: %s", env.ErrorMessage) + } else if status == http.StatusUnauthorized { + return nil, fmt.Errorf("Incorrect password.") + } else if status == http.StatusNotFound { + return nil, fmt.Errorf("User does not exist.") + } else if status == http.StatusTooManyRequests { + return nil, fmt.Errorf("Stop repeatedly trying to log in.") + } else { + return nil, fmt.Errorf("Problem authenticating: %s. %v\n", status, err) + } + return u, nil +} + func (c *Client) isNotLoggedIn(code int) bool { if c.token == "" { return false } return code == http.StatusUnauthorized } diff --git a/user.go b/user.go new file mode 100644 index 0000000..bc5c4a1 --- /dev/null +++ b/user.go @@ -0,0 +1,22 @@ +package writeas + +import ( + "time" +) + +type ( + // AuthUser represents a just-authenticated user. It contains information + // that'll only be returned once (now) per user session. + AuthUser struct { + AccessToken string `json:"access_token,omitempty"` + Password string `json:"password,omitempty"` + User *User `json:"user"` + } + + // User represents a registered Write.as user. + User struct { + Username string `json:"username"` + Email string `json:"email"` + Created time.Time `json:"created"` + } +)