Blob


1 package mailmux
3 import (
4 "bytes"
5 "encoding/json"
6 "errors"
7 "fmt"
8 "net/http"
9 "net/url"
10 )
12 const apiurl = "https://mailmux.net/v1/aliases"
14 const jsonContentType = "application/json"
16 type Client struct {
17 *http.Client
18 addr string
19 user string
20 token string
21 }
23 func Dial(uri, user, token string) *Client {
24 return &Client{http.DefaultClient, uri, user, token}
25 }
27 func (c *Client) Register(username, password string) error {
28 mcall := &Mcall{
29 Type: Tregister,
30 Username: username,
31 Password: password,
32 }
34 body := &bytes.Buffer{}
35 if err := json.NewEncoder(body).Encode(mcall); err != nil {
36 return fmt.Errorf("register %s: %v", username, err)
37 }
38 resp, err := c.Post(c.addr + "/register", jsonContentType, body)
39 if err != nil {
40 return fmt.Errorf("register %s: %v", username, err)
41 }
42 if resp.StatusCode == http.StatusOK {
43 return nil
44 }
46 defer resp.Body.Close()
47 rerror, err := ParseMcall(resp.Body)
48 if err != nil {
49 return fmt.Errorf("register %s: parse response: %v", username, err)
50 }
51 return fmt.Errorf("register %s: %s", username, rerror.Error)
52 }
54 func (c *Client) NewAlias() (Alias, error) {
55 v := url.Values{}
56 v.Add("username", c.user)
57 v.Add("token", c.token)
58 resp, err := http.PostForm(c.addr + "/aliases", v)
59 if err != nil {
60 return Alias{}, err
61 }
62 defer resp.Body.Close()
63 if resp.StatusCode != http.StatusOK {
64 return Alias{}, errors.New(resp.Status)
65 }
67 return Alias{}, nil
68 }
70 func (c *Client) Aliases() ([]Alias, error) {
71 v := url.Values{}
72 v.Add("user", c.user)
73 v.Add("token", c.token)
74 req, err := http.NewRequest(http.MethodGet, apiurl, nil)
75 if err != nil {
76 return nil, fmt.Errorf("list aliases: %w", err)
77 }
78 req.URL.RawQuery = v.Encode()
79 resp, err := c.Do(req)
80 if err != nil {
81 return nil, fmt.Errorf("list aliases: %w", err)
82 }
83 defer resp.Body.Close()
84 return nil, nil
85 }