2022-07-10 16:19:33 +00:00
|
|
|
package utils
|
2022-07-11 05:12:42 +00:00
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"context"
|
|
|
|
"encoding/json"
|
|
|
|
"io/ioutil"
|
|
|
|
"net/http"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/authorizerdev/authorizer/server/constants"
|
|
|
|
"github.com/authorizerdev/authorizer/server/db"
|
|
|
|
"github.com/authorizerdev/authorizer/server/db/models"
|
2022-08-02 08:42:36 +00:00
|
|
|
"github.com/authorizerdev/authorizer/server/memorystore"
|
2022-07-15 16:41:08 +00:00
|
|
|
"github.com/authorizerdev/authorizer/server/refs"
|
2022-07-11 05:12:42 +00:00
|
|
|
log "github.com/sirupsen/logrus"
|
|
|
|
)
|
|
|
|
|
|
|
|
func RegisterEvent(ctx context.Context, eventName string, authRecipe string, user models.User) error {
|
2023-03-26 01:50:45 +00:00
|
|
|
webhooks, err := db.Provider.GetWebhookByEventName(ctx, eventName)
|
2022-07-11 05:12:42 +00:00
|
|
|
if err != nil {
|
2023-03-26 02:18:06 +00:00
|
|
|
log.Debug("Error getting webhook: %v", err)
|
2022-07-11 05:12:42 +00:00
|
|
|
return err
|
|
|
|
}
|
2023-03-26 01:50:45 +00:00
|
|
|
for _, webhook := range webhooks {
|
|
|
|
if !refs.BoolValue(webhook.Enabled) {
|
2023-03-29 01:36:33 +00:00
|
|
|
continue
|
2023-03-26 01:50:45 +00:00
|
|
|
}
|
|
|
|
userBytes, err := json.Marshal(user.AsAPIUser())
|
|
|
|
if err != nil {
|
|
|
|
log.Debug("error marshalling user obj: ", err)
|
2023-03-29 01:59:44 +00:00
|
|
|
continue
|
2023-03-26 01:50:45 +00:00
|
|
|
}
|
|
|
|
userMap := map[string]interface{}{}
|
|
|
|
err = json.Unmarshal(userBytes, &userMap)
|
|
|
|
if err != nil {
|
|
|
|
log.Debug("error un-marshalling user obj: ", err)
|
2023-03-29 01:59:44 +00:00
|
|
|
continue
|
2023-03-26 01:50:45 +00:00
|
|
|
}
|
2022-07-11 05:12:42 +00:00
|
|
|
|
2023-03-26 01:50:45 +00:00
|
|
|
reqBody := map[string]interface{}{
|
2023-03-29 02:01:07 +00:00
|
|
|
"webhook_id": webhook.ID,
|
|
|
|
"event_name": eventName,
|
|
|
|
"event_description": webhook.EventDescription,
|
|
|
|
"user": userMap,
|
2023-03-26 01:50:45 +00:00
|
|
|
}
|
2022-07-11 05:12:42 +00:00
|
|
|
|
2023-03-26 01:50:45 +00:00
|
|
|
if eventName == constants.UserLoginWebhookEvent || eventName == constants.UserSignUpWebhookEvent {
|
|
|
|
reqBody["auth_recipe"] = authRecipe
|
|
|
|
}
|
2022-07-11 05:12:42 +00:00
|
|
|
|
2023-03-26 01:50:45 +00:00
|
|
|
requestBody, err := json.Marshal(reqBody)
|
|
|
|
if err != nil {
|
|
|
|
log.Debug("error marshalling requestBody obj: ", err)
|
2023-03-29 01:36:33 +00:00
|
|
|
continue
|
2023-03-26 01:50:45 +00:00
|
|
|
}
|
2022-08-02 08:42:36 +00:00
|
|
|
|
2023-03-26 01:50:45 +00:00
|
|
|
// dont trigger webhook call in case of test
|
|
|
|
envKey, err := memorystore.Provider.GetStringStoreEnvVariable(constants.EnvKeyEnv)
|
|
|
|
if err != nil {
|
2023-03-29 01:36:33 +00:00
|
|
|
continue
|
2023-03-26 01:50:45 +00:00
|
|
|
}
|
|
|
|
if envKey == constants.TestEnv {
|
2023-03-29 01:36:33 +00:00
|
|
|
_, err := db.Provider.AddWebhookLog(ctx, models.WebhookLog{
|
2023-03-26 01:50:45 +00:00
|
|
|
HttpStatus: 200,
|
|
|
|
Request: string(requestBody),
|
|
|
|
Response: string(`{"message": "test"}`),
|
|
|
|
WebhookID: webhook.ID,
|
|
|
|
})
|
2023-03-29 01:36:33 +00:00
|
|
|
if err != nil {
|
|
|
|
log.Debug("error saving webhook log:", err)
|
|
|
|
}
|
|
|
|
continue
|
2023-03-26 01:50:45 +00:00
|
|
|
}
|
2022-08-02 08:42:36 +00:00
|
|
|
|
2023-03-26 01:50:45 +00:00
|
|
|
requestBytesBuffer := bytes.NewBuffer(requestBody)
|
|
|
|
req, err := http.NewRequest("POST", refs.StringValue(webhook.Endpoint), requestBytesBuffer)
|
|
|
|
if err != nil {
|
|
|
|
log.Debug("error creating webhook post request: ", err)
|
2023-03-29 01:36:33 +00:00
|
|
|
continue
|
2023-03-26 01:50:45 +00:00
|
|
|
}
|
|
|
|
req.Header.Set("Content-Type", "application/json")
|
2022-07-11 05:12:42 +00:00
|
|
|
|
2023-03-26 01:50:45 +00:00
|
|
|
if webhook.Headers != nil {
|
|
|
|
for key, val := range webhook.Headers {
|
|
|
|
req.Header.Set(key, val.(string))
|
|
|
|
}
|
2022-07-11 05:12:42 +00:00
|
|
|
}
|
|
|
|
|
2023-03-26 01:50:45 +00:00
|
|
|
client := &http.Client{Timeout: time.Second * 30}
|
|
|
|
resp, err := client.Do(req)
|
|
|
|
if err != nil {
|
|
|
|
log.Debug("error making request: ", err)
|
2023-03-29 01:36:33 +00:00
|
|
|
continue
|
2023-03-26 01:50:45 +00:00
|
|
|
}
|
|
|
|
defer resp.Body.Close()
|
2022-07-11 05:12:42 +00:00
|
|
|
|
2023-03-26 01:50:45 +00:00
|
|
|
responseBytes, err := ioutil.ReadAll(resp.Body)
|
|
|
|
if err != nil {
|
|
|
|
log.Debug("error reading response: ", err)
|
2023-03-29 01:36:33 +00:00
|
|
|
continue
|
2023-03-26 01:50:45 +00:00
|
|
|
}
|
2022-07-11 05:12:42 +00:00
|
|
|
|
2023-03-26 01:50:45 +00:00
|
|
|
statusCode := int64(resp.StatusCode)
|
|
|
|
_, err = db.Provider.AddWebhookLog(ctx, models.WebhookLog{
|
|
|
|
HttpStatus: statusCode,
|
|
|
|
Request: string(requestBody),
|
|
|
|
Response: string(responseBytes),
|
|
|
|
WebhookID: webhook.ID,
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
log.Debug("failed to add webhook log: ", err)
|
2023-03-29 01:36:33 +00:00
|
|
|
continue
|
2023-03-26 01:50:45 +00:00
|
|
|
}
|
2022-07-11 05:12:42 +00:00
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|