user.go raw
1 package mailinabox
2
3 import (
4 "context"
5 "fmt"
6 "net/http"
7 )
8
9 // Session Represents user session data.
10 type Session struct {
11 APIKey string `json:"api_key,omitempty"`
12 Email string `json:"email,omitempty"`
13 Privileges []string `json:"privileges,omitempty"`
14 Status string `json:"status,omitempty"`
15 Reason string `json:"reason,omitempty"`
16 }
17
18 // UserService User API.
19 // https://mailinabox.email/api-docs.html#tag/User
20 type UserService service
21
22 // Login Returns user information and a session API key.
23 // https://mailinabox.email/api-docs.html#operation/login
24 func (s *UserService) Login(ctx context.Context) (*Session, error) {
25 endpoint := s.client.baseURL.JoinPath("admin", "login")
26
27 req, err := http.NewRequestWithContext(ctx, http.MethodGet, endpoint.String(), http.NoBody)
28 if err != nil {
29 return nil, fmt.Errorf("unable to create request: %w", err)
30 }
31
32 var result Session
33
34 err = s.client.doJSON(req, &result)
35 if err != nil {
36 return nil, err
37 }
38
39 if result.Status != "ok" {
40 return nil, fmt.Errorf("%s: %s", result.Status, result.Reason)
41 }
42
43 return &result, nil
44 }
45
46 // Logout Invalidates a session API key so that it cannot be used after this API call.
47 // https://mailinabox.email/api-docs.html#operation/logout
48 func (s *UserService) Logout(ctx context.Context) (*Session, error) {
49 endpoint := s.client.baseURL.JoinPath("admin", "logout")
50
51 req, err := http.NewRequestWithContext(ctx, http.MethodPost, endpoint.String(), http.NoBody)
52 if err != nil {
53 return nil, fmt.Errorf("unable to create request: %w", err)
54 }
55
56 var result Session
57
58 err = s.client.doJSON(req, &result)
59 if err != nil {
60 return nil, err
61 }
62
63 if result.Status != "ok" {
64 return nil, fmt.Errorf("%s: %s", result.Status, result.Reason)
65 }
66
67 return &result, nil
68 }
69