From 66c7fc261fe51acd9808ea5d262e0265f85032f0 Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 4 Dec 2025 03:13:13 +0000 Subject: [PATCH] tsk-11: Obtain refresh token (#18) Closes #11 Reviewed-on: https://git.kundeng.us/phoenix/catapult/pulls/18 Co-authored-by: phoenix Co-committed-by: phoenix --- go.mod | 4 +-- go.sum | 4 +++ internal/service/auth.go | 43 +++++++++++++++++++++++++++ internal/service/core/service.go | 51 ++++++++++++++++++-------------- 4 files changed, 78 insertions(+), 24 deletions(-) diff --git a/go.mod b/go.mod index c8be3e2..6d3daa5 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module git.kundeng.us/phoenix/catapult go 1.25.4 require ( - git.kundeng.us/phoenix/swoosh v0.0.6 + git.kundeng.us/phoenix/swoosh v0.0.7 git.kundeng.us/phoenix/textsender-models v0.0.11 github.com/google/uuid v1.6.0 github.com/joho/godotenv v1.5.1 @@ -13,5 +13,5 @@ require ( github.com/golang-jwt/jwt/v5 v5.3.0 // indirect github.com/golang/mock v1.6.0 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/twilio/twilio-go v1.28.7 // indirect + github.com/twilio/twilio-go v1.28.8 // indirect ) diff --git a/go.sum b/go.sum index 697f0cb..f244f03 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ git.kundeng.us/phoenix/swoosh v0.0.6 h1:9+BFsmuxufEPJErMJUioyRGb0KoIPdwW+PSbEva5UuU= git.kundeng.us/phoenix/swoosh v0.0.6/go.mod h1:czsMdVpt7HKkaP1HOl5+j9ePOQCA0r9UW4uAxwAbTPk= +git.kundeng.us/phoenix/swoosh v0.0.7 h1:9M42tgKr6o34YOiwds7offvjCUoFzYN2B5TrFKbefFo= +git.kundeng.us/phoenix/swoosh v0.0.7/go.mod h1:9iXlBd7UCMA7/jj8gZ1CxEfBualsClpiJrqGj8Fo2Xw= git.kundeng.us/phoenix/textsender-models v0.0.11 h1:kd2FdeZJhJJAXBm8MoyadtgNGyzC+puU1oR8B8N+MfE= git.kundeng.us/phoenix/textsender-models v0.0.11/go.mod h1:9iPDQJg1Tc6WMNoW5+f8YKmnosMwlWHJ++hmxNLDEe0= github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A= @@ -31,6 +33,8 @@ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5Cc github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/twilio/twilio-go v1.28.7 h1:WzzQDR/rqmNkVs1TwtcHFPYGTdSdPnx/eAZf5UIXzr4= github.com/twilio/twilio-go v1.28.7/go.mod h1:FpgNWMoD8CFnmukpKq9RNpUSGXC0BwnbeKZj2YHlIkw= +github.com/twilio/twilio-go v1.28.8 h1:wbFz7Wt4S5mCEaes6FcM/ddcJGIhdjwp/9CHb9e+4fk= +github.com/twilio/twilio-go v1.28.8/go.mod h1:FpgNWMoD8CFnmukpKq9RNpUSGXC0BwnbeKZj2YHlIkw= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= diff --git a/internal/service/auth.go b/internal/service/auth.go index 20d3756..ed128e6 100644 --- a/internal/service/auth.go +++ b/internal/service/auth.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" "net/http" + "time" "git.kundeng.us/phoenix/textsender-models/tx0/token" @@ -53,3 +54,45 @@ func (a *Auth) GetToken() (*token.Login, error) { return r.Data[0], nil } + +type refreshTokenRequest struct { + AccessToken string `json:"access_token"` +} + +func (a *Auth) GetRefreshToken(tok *token.Login) (*token.Login, error) { + req := refreshTokenRequest{AccessToken: tok.AccessToken} + + jsonData, err := json.Marshal(req) + if err != nil { + return nil, err + } + + resp, err := http.Post(fmt.Sprintf("%s/api/v1/token/refresh", a.Application.AuthUrl), "application/json", bytes.NewBuffer(jsonData)) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + var r tokenResponse + err = json.NewDecoder(resp.Body).Decode(&r) + if err != nil { + return nil, err + } else { + if len(r.Data) == 0 { + return nil, nil + } else { + return r.Data[0], nil + } + } +} + +func (s *Auth) TokenExpired(tok *token.Login) bool { + now := time.Now() + expiredTime := time.Unix(tok.ExpiresIn, 0) + + if now.After(expiredTime) { + return true + } else { + return false + } +} diff --git a/internal/service/core/service.go b/internal/service/core/service.go index c77dd44..42abe2d 100644 --- a/internal/service/core/service.go +++ b/internal/service/core/service.go @@ -3,7 +3,6 @@ package core import ( "context" "encoding/json" - "fmt" "log" "sync" "time" @@ -57,46 +56,54 @@ func (s *Service) worker1() { // Do some work now := time.Now() log.Println("Worker 1: Processing...") + catapultAuth := service.Auth{Application: s.App} if s.token == nil { - catapultAuth := service.Auth{Application: s.App} + log.Println("Token has not been fetched") + log.Println("Fetching token") if token, err := catapultAuth.GetToken(); err != nil { - fmt.Println("Error:", err) + log.Println("Error:", err) } else { - fmt.Println("Access token:", token.AccessToken) + log.Println("Token fetched") s.token = token } + } else if catapultAuth.TokenExpired(s.token) { + // Get refresh token + log.Println("Token expired") + log.Println("Fetching refresh token") + refreshToken, err := catapultAuth.GetRefreshToken(s.token) + if err != nil { + log.Println("Error getting refresh token:", err) + } else { + log.Println("Refresh token fetched") + s.token = refreshToken + } } - log.Println("Twilio config account sid:", s.App.TwilioConfig.AccountSID) - log.Println("Twilio config auth token:", s.App.TwilioConfig.AuthToken) - log.Println("Twilio config service sid:", s.App.TwilioConfig.ServiceSID) - log.Println("Twilio config number:", s.App.TwilioConfig.Number) - queue := service.Queue{Application: s.App, Token: s.token} if item, exists, err := queue.GetQueue(); err != nil { - fmt.Println("Error:", err) + log.Println("Error:", err) } else { if *exists { - fmt.Println("Scheduled message Id:", item.Id) - fmt.Println("Created:", item.Created) - fmt.Println("Scheduled:", item.Scheduled) - fmt.Println("Status:", item.Status) + log.Println("Scheduled message Id:", item.Id) + log.Println("Created:", item.Created) + log.Println("Scheduled:", item.Scheduled) + log.Println("Status:", item.Status) log.Println("User Id:", item.UserId) if scheduledMessageValid(item, now) { - fmt.Println("Scheduled Message can be sent") + log.Println("Scheduled Message can be sent") scheduler := service.Scheduler{Application: s.App, Token: s.token} if events, err := scheduler.GetEvents(item.Id); err != nil { - fmt.Println("Error getting event:", err) + log.Println("Error getting event:", err) } else { for _, event := range events { if msg, err := scheduler.GetMessage(event.MessageId); err != nil { - fmt.Println("Error getting message:", err) + log.Println("Error getting message:", err) } else { if c, err := scheduler.GetContact(event.RecipientId); err != nil { - fmt.Println("Error getting contact:", err) + log.Println("Error getting contact:", err) } else { - fmt.Println("Message Id:", msg.Id) - fmt.Println("Contact Id:", c.Id) + log.Println("Message Id:", msg.Id) + log.Println("Contact Id:", c.Id) if res, sent, err := scheduler.ScheduleMessage(*item, *event, *c, *msg); err != nil { log.Println("Failure with scheduling the message:", err) } else { @@ -139,10 +146,10 @@ func (s *Service) worker1() { } } } else { - fmt.Println("Invalid scheduled message") + log.Println("Invalid scheduled message") } } else { - fmt.Println("Empty queue") + log.Println("Empty queue") } } }