| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- package slack
- import (
- "encoding/json"
- "fmt"
- "net/http"
- "github.com/porter-dev/porter/internal/models/integrations"
- "golang.org/x/oauth2"
- )
- func TokenToSlackIntegration(token *oauth2.Token) (*integrations.SlackIntegration, error) {
- // cast the "incoming_webhook" field to a map[string]string
- webhookConfig, ok := token.Extra("incoming_webhook").(map[string]interface{})
- if !ok {
- return nil, fmt.Errorf("could not get incoming webhook field from token")
- }
- teamInfo, err := getTeamInfo(token)
- if err != nil {
- return nil, err
- }
- return &integrations.SlackIntegration{
- SharedOAuthModel: integrations.SharedOAuthModel{
- AccessToken: []byte(token.AccessToken),
- },
- TeamID: teamInfo.Team.ID,
- TeamName: teamInfo.Team.Name,
- TeamIconURL: teamInfo.Team.Icon.Image132,
- Channel: webhookConfig["channel"].(string),
- ChannelID: webhookConfig["channel_id"].(string),
- ConfigurationURL: webhookConfig["configuration_url"].(string),
- Webhook: []byte(webhookConfig["url"].(string)),
- }, nil
- }
- type teamInfoResponse struct {
- OK bool `json:"ok"`
- Team struct {
- ID string `json:"id"`
- Name string `json:"name"`
- Icon struct {
- Image132 string `json:"image_132"`
- }
- } `json:"team"`
- }
- func getTeamInfo(token *oauth2.Token) (*teamInfoResponse, error) {
- url := "https://slack.com/api/team.info"
- // Create a new request using http
- req, err := http.NewRequest("GET", url, nil)
- // add authorization header to the request
- req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", token.AccessToken))
- // Send req using http Client
- client := &http.Client{}
- resp, err := client.Do(req)
- if err != nil {
- return nil, err
- }
- defer resp.Body.Close()
- teamInfo := teamInfoResponse{}
- err = json.NewDecoder(resp.Body).Decode(&teamInfo)
- if err != nil {
- return nil, err
- }
- return &teamInfo, nil
- }
|