Skip to content

Commit

Permalink
Add calls API support (#10)
Browse files Browse the repository at this point in the history
* Add calls API support

Signed-off-by: Milos Gajdos <milosthegajdos@gmail.com>
  • Loading branch information
milosgajdos authored Jun 18, 2024
1 parent b90b039 commit ea8b4ae
Show file tree
Hide file tree
Showing 11 changed files with 609 additions and 140 deletions.
106 changes: 94 additions & 12 deletions account_connections.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,88 @@ type TwilioAccount struct {
SupportsAnyCaller bool `json:"account_supports_any_caller_id"`
}

type TelAccountConn struct {
ID string `json:"id"`
UserID string `json:"user_id"`
Type AccountConnType `json:"type"`
Credentials map[string]any `json:"credentials"`
SteeringPool []string `json:"steering_pool"`
SupportAnyCaller bool `json:"account_supports_any_caller_id"`
}

func (ta *TelAccountConn) UnmarshalJSON(data []byte) error {
// Check if the data is a plain string ID
var id string
if err := json.Unmarshal(data, &id); err == nil {
ta.ID = id
return nil
}

// Otherwise, unmarshal as a full TelAccountConn object
type Alias TelAccountConn
aux := &struct {
*Alias
}{
Alias: (*Alias)(ta),
}
if err := json.Unmarshal(data, &aux); err != nil {
return err
}

return nil
}

type TellMetadataType string

const (
TelMetadataVonage TellMetadataType = "telephony_metadata_vonage"
TelMetadataTwilio TellMetadataType = "telephony_metadata_twilio"
)

type VonageTelMetadata struct {
Type TellMetadataType `json:"type"`
}

type TwilioTelMetadata struct {
Type TellMetadataType `json:"type"`
CallSID string `json:"call_sid"`
CallStatus string `json:"call_status"`
TransferCallSID string `json:"transfer_call_sid"`
TransferCallStatus string `json:"transfer_call_status"`
ConferenceSID string `json:"conference_sid"`
}

type TelMetadataBase struct {
Type TellMetadataType `json:"type"`
}

type TelMetadata struct {
TelMetadataBase
*VonageTelMetadata
*TwilioTelMetadata
}

func (t *TelMetadata) UnmarshalJSON(data []byte) error {
var base TelMetadataBase
if err := json.Unmarshal(data, &base); err != nil {
return err
}
t.TelMetadataBase = base

switch t.TelMetadataBase.Type {
case TelMetadataVonage:
t.VonageTelMetadata = &VonageTelMetadata{
Type: TelMetadataVonage,
}
return nil
case TelMetadataTwilio:
t.TwilioTelMetadata = &TwilioTelMetadata{}
return json.Unmarshal(data, t.TwilioTelMetadata)
}

return nil
}

type AccountConnsBase struct {
ID string `json:"id"`
UserID string `json:"user_id"`
Expand Down Expand Up @@ -145,7 +227,7 @@ func (c *Client) ListAccountConns(ctx context.Context, paging *PageParams) (*Acc
return nil, err
}

resp, err := request.Do[APIError](c.opts.HTTPClient, req)
resp, err := request.Do[APIParamError](c.opts.HTTPClient, req)
if err != nil {
return nil, err
}
Expand All @@ -158,8 +240,8 @@ func (c *Client) ListAccountConns(ctx context.Context, paging *PageParams) (*Acc
return nil, err
}
return actions, nil
case http.StatusForbidden:
var apiErr APIAuthError
case http.StatusForbidden, http.StatusBadRequest:
var apiErr APIGenError
if jsonErr := json.NewDecoder(resp.Body).Decode(&apiErr); jsonErr != nil {
return nil, errors.Join(err, jsonErr)
}
Expand Down Expand Up @@ -191,7 +273,7 @@ func (c *Client) GetAccountConn(ctx context.Context, acctConnID string) (*Accoun
q.Add("id", acctConnID)
req.URL.RawQuery = q.Encode()

resp, err := request.Do[APIError](c.opts.HTTPClient, req)
resp, err := request.Do[APIParamError](c.opts.HTTPClient, req)
if err != nil {
return nil, err
}
Expand All @@ -204,8 +286,8 @@ func (c *Client) GetAccountConn(ctx context.Context, acctConnID string) (*Accoun
return nil, err
}
return action, nil
case http.StatusForbidden:
var apiErr APIAuthError
case http.StatusForbidden, http.StatusBadRequest:
var apiErr APIGenError
if jsonErr := json.NewDecoder(resp.Body).Decode(&apiErr); jsonErr != nil {
return nil, errors.Join(err, jsonErr)
}
Expand Down Expand Up @@ -241,7 +323,7 @@ func (c *Client) CreateAccountConn(ctx context.Context, createReq *CreateAccount
return nil, err
}

resp, err := request.Do[APIError](c.opts.HTTPClient, req)
resp, err := request.Do[APIParamError](c.opts.HTTPClient, req)
if err != nil {
return nil, err
}
Expand All @@ -254,8 +336,8 @@ func (c *Client) CreateAccountConn(ctx context.Context, createReq *CreateAccount
return nil, err
}
return action, nil
case http.StatusForbidden:
var apiErr APIAuthError
case http.StatusForbidden, http.StatusBadRequest:
var apiErr APIGenError
if jsonErr := json.NewDecoder(resp.Body).Decode(&apiErr); jsonErr != nil {
return nil, errors.Join(err, jsonErr)
}
Expand Down Expand Up @@ -294,7 +376,7 @@ func (c *Client) UpdateAccountConn(ctx context.Context, actionID string, updateR
q.Add("id", actionID)
req.URL.RawQuery = q.Encode()

resp, err := request.Do[APIError](c.opts.HTTPClient, req)
resp, err := request.Do[APIParamError](c.opts.HTTPClient, req)
if err != nil {
return nil, err
}
Expand All @@ -307,8 +389,8 @@ func (c *Client) UpdateAccountConn(ctx context.Context, actionID string, updateR
return nil, err
}
return action, nil
case http.StatusForbidden:
var apiErr APIAuthError
case http.StatusForbidden, http.StatusBadRequest:
var apiErr APIGenError
if jsonErr := json.NewDecoder(resp.Body).Decode(&apiErr); jsonErr != nil {
return nil, errors.Join(err, jsonErr)
}
Expand Down
26 changes: 12 additions & 14 deletions actions.go
Original file line number Diff line number Diff line change
Expand Up @@ -117,8 +117,6 @@ type ActionBase struct {
Trigger interface{} `json:"action_trigger"`
}

// TODO: Unmarshal from a string
// See voice
type Action struct {
ActionBase
Config interface{} `json:"config,omitempty"`
Expand Down Expand Up @@ -245,7 +243,7 @@ func (c *Client) ListActions(ctx context.Context, paging *PageParams) (*Actions,
return nil, err
}

resp, err := request.Do[APIError](c.opts.HTTPClient, req)
resp, err := request.Do[APIParamError](c.opts.HTTPClient, req)
if err != nil {
return nil, err
}
Expand All @@ -258,8 +256,8 @@ func (c *Client) ListActions(ctx context.Context, paging *PageParams) (*Actions,
return nil, err
}
return actions, nil
case http.StatusForbidden:
var apiErr APIAuthError
case http.StatusForbidden, http.StatusBadRequest:
var apiErr APIGenError
if jsonErr := json.NewDecoder(resp.Body).Decode(&apiErr); jsonErr != nil {
return nil, errors.Join(err, jsonErr)
}
Expand Down Expand Up @@ -291,7 +289,7 @@ func (c *Client) GetAction(ctx context.Context, actionID string) (*Action, error
q.Add("id", actionID)
req.URL.RawQuery = q.Encode()

resp, err := request.Do[APIError](c.opts.HTTPClient, req)
resp, err := request.Do[APIParamError](c.opts.HTTPClient, req)
if err != nil {
return nil, err
}
Expand All @@ -304,8 +302,8 @@ func (c *Client) GetAction(ctx context.Context, actionID string) (*Action, error
return nil, err
}
return action, nil
case http.StatusForbidden:
var apiErr APIAuthError
case http.StatusForbidden, http.StatusBadRequest:
var apiErr APIGenError
if jsonErr := json.NewDecoder(resp.Body).Decode(&apiErr); jsonErr != nil {
return nil, errors.Join(err, jsonErr)
}
Expand Down Expand Up @@ -341,7 +339,7 @@ func (c *Client) CreateAction(ctx context.Context, createReq *CreateActionReq) (
return nil, err
}

resp, err := request.Do[APIError](c.opts.HTTPClient, req)
resp, err := request.Do[APIParamError](c.opts.HTTPClient, req)
if err != nil {
return nil, err
}
Expand All @@ -354,8 +352,8 @@ func (c *Client) CreateAction(ctx context.Context, createReq *CreateActionReq) (
return nil, err
}
return action, nil
case http.StatusForbidden:
var apiErr APIAuthError
case http.StatusForbidden, http.StatusBadRequest:
var apiErr APIGenError
if jsonErr := json.NewDecoder(resp.Body).Decode(&apiErr); jsonErr != nil {
return nil, errors.Join(err, jsonErr)
}
Expand Down Expand Up @@ -394,7 +392,7 @@ func (c *Client) UpdateAction(ctx context.Context, actionID string, updateReq *U
q.Add("id", actionID)
req.URL.RawQuery = q.Encode()

resp, err := request.Do[APIError](c.opts.HTTPClient, req)
resp, err := request.Do[APIParamError](c.opts.HTTPClient, req)
if err != nil {
return nil, err
}
Expand All @@ -407,8 +405,8 @@ func (c *Client) UpdateAction(ctx context.Context, actionID string, updateReq *U
return nil, err
}
return action, nil
case http.StatusForbidden:
var apiErr APIAuthError
case http.StatusForbidden, http.StatusBadRequest:
var apiErr APIGenError
if jsonErr := json.NewDecoder(resp.Body).Decode(&apiErr); jsonErr != nil {
return nil, errors.Join(err, jsonErr)
}
Expand Down
44 changes: 32 additions & 12 deletions agents.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,26 @@ type Agent struct {
LLMTemperature float64 `json:"llm_temperature"`
}

func (a *Agent) UnmarshalJSON(data []byte) error {
var id string
if err := json.Unmarshal(data, &id); err == nil {
a.ID = id
return nil
}

type Alias Agent
aux := &struct {
*Alias
}{
Alias: (*Alias)(a),
}
if err := json.Unmarshal(data, &aux); err != nil {
return err
}

return nil
}

type AgentReqbase struct {
Name string `json:"name"`
Prompt string `json:"prompt"`
Expand Down Expand Up @@ -141,7 +161,7 @@ func (c *Client) ListAgents(ctx context.Context, paging *PageParams) (*Agents, e
return nil, err
}

resp, err := request.Do[APIError](c.opts.HTTPClient, req)
resp, err := request.Do[APIParamError](c.opts.HTTPClient, req)
if err != nil {
return nil, err
}
Expand All @@ -154,8 +174,8 @@ func (c *Client) ListAgents(ctx context.Context, paging *PageParams) (*Agents, e
return nil, err
}
return actions, nil
case http.StatusForbidden:
var apiErr APIAuthError
case http.StatusForbidden, http.StatusBadRequest:
var apiErr APIGenError
if jsonErr := json.NewDecoder(resp.Body).Decode(&apiErr); jsonErr != nil {
return nil, errors.Join(err, jsonErr)
}
Expand Down Expand Up @@ -187,7 +207,7 @@ func (c *Client) GetAgent(ctx context.Context, agentID string) (*Agent, error) {
q.Add("id", agentID)
req.URL.RawQuery = q.Encode()

resp, err := request.Do[APIError](c.opts.HTTPClient, req)
resp, err := request.Do[APIParamError](c.opts.HTTPClient, req)
if err != nil {
return nil, err
}
Expand All @@ -200,8 +220,8 @@ func (c *Client) GetAgent(ctx context.Context, agentID string) (*Agent, error) {
return nil, err
}
return action, nil
case http.StatusForbidden:
var apiErr APIAuthError
case http.StatusForbidden, http.StatusBadRequest:
var apiErr APIGenError
if jsonErr := json.NewDecoder(resp.Body).Decode(&apiErr); jsonErr != nil {
return nil, errors.Join(err, jsonErr)
}
Expand Down Expand Up @@ -237,7 +257,7 @@ func (c *Client) CreateAgent(ctx context.Context, createReq *CreateAgentReq) (*A
return nil, err
}

resp, err := request.Do[APIError](c.opts.HTTPClient, req)
resp, err := request.Do[APIParamError](c.opts.HTTPClient, req)
if err != nil {
return nil, err
}
Expand All @@ -250,8 +270,8 @@ func (c *Client) CreateAgent(ctx context.Context, createReq *CreateAgentReq) (*A
return nil, err
}
return action, nil
case http.StatusForbidden:
var apiErr APIAuthError
case http.StatusForbidden, http.StatusBadRequest:
var apiErr APIGenError
if jsonErr := json.NewDecoder(resp.Body).Decode(&apiErr); jsonErr != nil {
return nil, errors.Join(err, jsonErr)
}
Expand Down Expand Up @@ -290,7 +310,7 @@ func (c *Client) UpdateAgent(ctx context.Context, actionID string, updateReq *Up
q.Add("id", actionID)
req.URL.RawQuery = q.Encode()

resp, err := request.Do[APIError](c.opts.HTTPClient, req)
resp, err := request.Do[APIParamError](c.opts.HTTPClient, req)
if err != nil {
return nil, err
}
Expand All @@ -303,8 +323,8 @@ func (c *Client) UpdateAgent(ctx context.Context, actionID string, updateReq *Up
return nil, err
}
return action, nil
case http.StatusForbidden:
var apiErr APIAuthError
case http.StatusForbidden, http.StatusBadRequest:
var apiErr APIGenError
if jsonErr := json.NewDecoder(resp.Body).Decode(&apiErr); jsonErr != nil {
return nil, errors.Join(err, jsonErr)
}
Expand Down
Loading

0 comments on commit ea8b4ae

Please sign in to comment.