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