Blob


1 package mailmux
3 import (
4 "bytes"
5 "encoding/json"
6 "fmt"
7 "net/http"
9 "mailmux.net/aliases"
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() (aliases.Aliases, error) {
55 tmsg := &Mcall{
56 Type: Tnew,
57 Username: c.user,
58 Password: c.token,
59 }
60 buf := &bytes.Buffer{}
61 if err := json.NewEncoder(buf).Encode(tmsg); err != nil {
62 return nil, fmt.Errorf("new alias: %w", err)
63 }
65 resp, err := http.Post(c.addr+"/aliases", jsonContentType, buf)
66 if err != nil {
67 return nil, fmt.Errorf("new alias: %w", err)
68 }
69 defer resp.Body.Close()
70 rmsg, err := ParseMcall(resp.Body)
71 if err != nil {
72 return nil, fmt.Errorf("new alias: parse response: %w", err)
73 }
74 if rmsg.Type == Rerror {
75 return nil, fmt.Errorf("new alias: %v", rmsg.Error)
76 }
77 return rmsg.Aliases, nil
78 }
80 func (c *Client) Aliases() (aliases.Aliases, error) {
81 tmsg := &Mcall{
82 Type: Tlist,
83 Username: c.user,
84 Password: c.token,
85 }
86 buf := &bytes.Buffer{}
87 if err := json.NewEncoder(buf).Encode(tmsg); err != nil {
88 return nil, fmt.Errorf("list aliases: %w", err)
89 }
90 resp, err := http.Post(c.addr+"/aliases", jsonContentType, buf)
91 if err != nil {
92 return nil, fmt.Errorf("list aliases: %w", err)
93 }
95 defer resp.Body.Close()
96 rmsg, err := ParseMcall(resp.Body)
97 if err != nil {
98 return nil, fmt.Errorf("list aliases: parse response: %w", err)
99 }
100 if rmsg.Type == Rerror {
101 return nil, fmt.Errorf("list aliases: %v", rmsg.Error)
103 return rmsg.Aliases, nil