Files
email-api-client/client/token.go
Ron Rise 847fcfd0b8
All checks were successful
🚀 Publish Release Package / publish (push) Successful in 22s
refactor: update package paths and improve client context handling
2025-06-25 11:13:08 -04:00

99 lines
1.8 KiB
Go
Executable File

package client
import (
"bytes"
"encoding/json"
"gitea.siteworxpro.com/golang-packages/email-api-client/redis"
"net/http"
"time"
)
type Token struct {
AccessToken string `json:"access_token"`
TokenType string `json:"token_type"`
ExpiresIn uint16 `json:"expires_in"`
}
type AccessTokenRequest struct {
GrantType string `json:"grant_type"`
ClientId string `json:"client_id"`
ClientSecret string `json:"client_secret"`
}
func NewToken(config *Configuration) *Token {
return &Token{}
}
func getToken(configuration *Configuration) (*Token, error) {
token := FromCache()
if token.AccessToken != "" {
return token, nil
}
request := accessTokenRequest{
GrantType: "client_credentials",
ClientId: configuration.ClientId,
ClientSecret: configuration.ClientSecret,
}
body, _ := json.Marshal(request)
resp, err := http.Post(configuration.Endpoint+"/access_token", "application/json", bytes.NewBuffer(body))
if err != nil {
return nil, err
}
responseBody := make([]byte, resp.ContentLength)
_, err = resp.Body.Read(responseBody)
if err != nil {
return nil, err
}
err = json.Unmarshal(responseBody, token)
if err != nil {
return nil, err
}
saveCache(token)
return token, nil
}
func FromCache() *Token {
rdb := redis.NewRedis()
token := Token{}
result, err := rdb.Get("api.access_token").Result()
if err != nil {
return &token
}
err = json.Unmarshal([]byte(result), &token)
if err != nil {
return &token
}
return &token
}
func saveCache(token *Token) {
rdb := redis.NewRedis()
tokenJson, _ := json.Marshal(token)
expiresIn := time.Duration(int64(token.ExpiresIn) * 100000000)
cmd := rdb.Set("api.access_token", tokenJson, expiresIn)
result, err := cmd.Result()
if err != nil {
return
}
println(result)
}