github.com/crowdsecurity/crowdsec@v1.6.1/pkg/apiclient/alerts_service.go (about)

     1  package apiclient
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"net/http"
     7  
     8  	qs "github.com/google/go-querystring/query"
     9  
    10  	"github.com/crowdsecurity/crowdsec/pkg/models"
    11  )
    12  
    13  // type ApiAlerts service
    14  
    15  type AlertsService service
    16  
    17  type AlertsListOpts struct {
    18  	ScopeEquals          *string `url:"scope,omitempty"`
    19  	ValueEquals          *string `url:"value,omitempty"`
    20  	ScenarioEquals       *string `url:"scenario,omitempty"`
    21  	IPEquals             *string `url:"ip,omitempty"`
    22  	RangeEquals          *string `url:"range,omitempty"`
    23  	OriginEquals         *string `url:"origin,omitempty"`
    24  	Since                *string `url:"since,omitempty"`
    25  	TypeEquals           *string `url:"decision_type,omitempty"`
    26  	Until                *string `url:"until,omitempty"`
    27  	IncludeSimulated     *bool   `url:"simulated,omitempty"`
    28  	ActiveDecisionEquals *bool   `url:"has_active_decision,omitempty"`
    29  	IncludeCAPI          *bool   `url:"include_capi,omitempty"`
    30  	Limit                *int    `url:"limit,omitempty"`
    31  	Contains             *bool   `url:"contains,omitempty"`
    32  	ListOpts
    33  }
    34  
    35  type AlertsDeleteOpts struct {
    36  	ScopeEquals          *string `url:"scope,omitempty"`
    37  	ValueEquals          *string `url:"value,omitempty"`
    38  	ScenarioEquals       *string `url:"scenario,omitempty"`
    39  	IPEquals             *string `url:"ip,omitempty"`
    40  	RangeEquals          *string `url:"range,omitempty"`
    41  	Since                *string `url:"since,omitempty"`
    42  	Until                *string `url:"until,omitempty"`
    43  	OriginEquals         *string `url:"origin,omitempty"`
    44  	ActiveDecisionEquals *bool   `url:"has_active_decision,omitempty"`
    45  	SourceEquals         *string `url:"alert_source,omitempty"`
    46  	Contains             *bool   `url:"contains,omitempty"`
    47  	Limit                *int    `url:"limit,omitempty"`
    48  	ListOpts
    49  }
    50  
    51  func (s *AlertsService) Add(ctx context.Context, alerts models.AddAlertsRequest) (*models.AddAlertsResponse, *Response, error) {
    52  	u := fmt.Sprintf("%s/alerts", s.client.URLPrefix)
    53  
    54  	req, err := s.client.NewRequest(http.MethodPost, u, &alerts)
    55  	if err != nil {
    56  		return nil, nil, err
    57  	}
    58  
    59  	addedIds := models.AddAlertsResponse{}
    60  
    61  	resp, err := s.client.Do(ctx, req, &addedIds)
    62  	if err != nil {
    63  		return nil, resp, err
    64  	}
    65  
    66  	return &addedIds, resp, nil
    67  }
    68  
    69  // to demo query arguments
    70  func (s *AlertsService) List(ctx context.Context, opts AlertsListOpts) (*models.GetAlertsResponse, *Response, error) {
    71  	u := fmt.Sprintf("%s/alerts", s.client.URLPrefix)
    72  
    73  	params, err := qs.Values(opts)
    74  	if err != nil {
    75  		return nil, nil, fmt.Errorf("building query: %w", err)
    76  	}
    77  
    78  	URI := u
    79  	if len(params) > 0 {
    80  		URI = fmt.Sprintf("%s?%s", URI, params.Encode())
    81  	}
    82  
    83  	req, err := s.client.NewRequest(http.MethodGet, URI, nil)
    84  	if err != nil {
    85  		return nil, nil, fmt.Errorf("building request: %w", err)
    86  	}
    87  
    88  	alerts := models.GetAlertsResponse{}
    89  
    90  	resp, err := s.client.Do(ctx, req, &alerts)
    91  	if err != nil {
    92  		return nil, resp, fmt.Errorf("performing request: %w", err)
    93  	}
    94  
    95  	return &alerts, resp, nil
    96  }
    97  
    98  // to demo query arguments
    99  func (s *AlertsService) Delete(ctx context.Context, opts AlertsDeleteOpts) (*models.DeleteAlertsResponse, *Response, error) {
   100  	params, err := qs.Values(opts)
   101  	if err != nil {
   102  		return nil, nil, err
   103  	}
   104  
   105  	u := fmt.Sprintf("%s/alerts?%s", s.client.URLPrefix, params.Encode())
   106  
   107  	req, err := s.client.NewRequest(http.MethodDelete, u, nil)
   108  	if err != nil {
   109  		return nil, nil, err
   110  	}
   111  
   112  	alerts := models.DeleteAlertsResponse{}
   113  
   114  	resp, err := s.client.Do(ctx, req, &alerts)
   115  	if err != nil {
   116  		return nil, resp, err
   117  	}
   118  
   119  	return &alerts, resp, nil
   120  }
   121  
   122  func (s *AlertsService) DeleteOne(ctx context.Context, alertID string) (*models.DeleteAlertsResponse, *Response, error) {
   123  	u := fmt.Sprintf("%s/alerts/%s", s.client.URLPrefix, alertID)
   124  
   125  	req, err := s.client.NewRequest(http.MethodDelete, u, nil)
   126  	if err != nil {
   127  		return nil, nil, err
   128  	}
   129  
   130  	alerts := models.DeleteAlertsResponse{}
   131  
   132  	resp, err := s.client.Do(ctx, req, &alerts)
   133  	if err != nil {
   134  		return nil, resp, err
   135  	}
   136  
   137  	return &alerts, resp, nil
   138  }
   139  
   140  func (s *AlertsService) GetByID(ctx context.Context, alertID int) (*models.Alert, *Response, error) {
   141  	u := fmt.Sprintf("%s/alerts/%d", s.client.URLPrefix, alertID)
   142  
   143  	req, err := s.client.NewRequest(http.MethodGet, u, nil)
   144  	if err != nil {
   145  		return nil, nil, err
   146  	}
   147  
   148  	alert := models.Alert{}
   149  
   150  	resp, err := s.client.Do(ctx, req, &alert)
   151  	if err != nil {
   152  		return nil, nil, err
   153  	}
   154  
   155  	return &alert, resp, nil
   156  }