From cef7f8a150ea53b1df8d108de3c3822c1ebbd1d5 Mon Sep 17 00:00:00 2001 From: phoenix Date: Fri, 28 Nov 2025 16:54:11 +0000 Subject: [PATCH] tsk-5: Fetch token (#9) Closes #5 Reviewed-on: https://git.kundeng.us/phoenix/catapult/pulls/9 Co-authored-by: phoenix Co-committed-by: phoenix --- .env.local.sample | 4 +++ .gitignore | 4 +++ cmd/catapult/main.go | 10 +++++-- go.mod | 10 +++++++ go.sum | 8 ++++++ internal/app/app.go | 51 +++++++++++++++++++++++++++++++++++ internal/auth/auth.go | 55 ++++++++++++++++++++++++++++++++++++++ internal/config/config.go | 30 +++++++++++++-------- internal/config/version.go | 12 +++++++++ 9 files changed, 171 insertions(+), 13 deletions(-) create mode 100644 .env.local.sample create mode 100644 go.sum create mode 100644 internal/app/app.go create mode 100644 internal/auth/auth.go create mode 100644 internal/config/version.go diff --git a/.env.local.sample b/.env.local.sample new file mode 100644 index 0000000..1199b55 --- /dev/null +++ b/.env.local.sample @@ -0,0 +1,4 @@ +AUTH_URL=https://auth.txt.com +API_URL=https://txt.com +SERVICE_USERNAME=suave +SERVICE_PASSPHRASE=9238urc9328nr329 diff --git a/.gitignore b/.gitignore index 7409731..e623776 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,5 @@ catapult +/vendor + +.env +.env.local diff --git a/cmd/catapult/main.go b/cmd/catapult/main.go index 9853b05..f38f94c 100644 --- a/cmd/catapult/main.go +++ b/cmd/catapult/main.go @@ -6,12 +6,13 @@ import ( "os/signal" "syscall" + "git.kundeng.us/phoenix/catapult/internal/app" "git.kundeng.us/phoenix/catapult/internal/config" "git.kundeng.us/phoenix/catapult/internal/version" ) func main() { - fmt.Println(config.App_Name) + fmt.Println(app.App_Name) versionFlag := config.CheckVersionFlag() if *versionFlag { @@ -19,8 +20,13 @@ func main() { return } - service := config.NewService() + myApp, err := app.Load() + if err != nil { + fmt.Println("Error loading app: %w", err) + return + } + service := config.NewService(myApp) sigChan := make(chan os.Signal, 1) signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) diff --git a/go.mod b/go.mod index 2732c40..08c976c 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,13 @@ module git.kundeng.us/phoenix/catapult go 1.25.4 + +require ( + git.kundeng.us/phoenix/textsender-models v0.0.10 + github.com/joho/godotenv v1.5.1 +) + +require ( + github.com/golang-jwt/jwt/v5 v5.3.0 // indirect + github.com/google/uuid v1.6.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..b0f3a9b --- /dev/null +++ b/go.sum @@ -0,0 +1,8 @@ +git.kundeng.us/phoenix/textsender-models v0.0.10 h1:0AMe/zm4Xte2BcuqqhRP7+42m+4To+rUnHkR2a9eXlI= +git.kundeng.us/phoenix/textsender-models v0.0.10/go.mod h1:9iPDQJg1Tc6WMNoW5+f8YKmnosMwlWHJ++hmxNLDEe0= +github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo= +github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= diff --git a/internal/app/app.go b/internal/app/app.go new file mode 100644 index 0000000..370c074 --- /dev/null +++ b/internal/app/app.go @@ -0,0 +1,51 @@ +package app + +import ( + "fmt" + "os" + "path" + + "github.com/joho/godotenv" +) + +const App_Name = "catapult" + +type App struct { + ApiUrl string + AuthUrl string + ServiceUsername string + ServicePassphrase string +} + +func Load() (*App, error) { + err := godotenv.Load() + if err != nil { + cwd, _ := os.Getwd() + envPath := path.Join(cwd, "../..", ".env") + if err = godotenv.Load(envPath); err != nil { + prevPath := path.Join(envPath, "../..", ".env") + if err = godotenv.Load(prevPath); err != nil { + return nil, fmt.Errorf("Error loading .env file: %w", err) + } + } + } + + apiUrl := os.Getenv("API_URL") + authUrl := os.Getenv("AUTH_URL") + serviceUsername := os.Getenv("SERVICE_USERNAME") + servicePassphrase := os.Getenv("SERVICE_PASSPHRASE") + + if len(apiUrl) == 0 { + return nil, fmt.Errorf("Api Url not provided") + } else if len(authUrl) == 0 { + return nil, fmt.Errorf("Auth url not provided") + } else if len(serviceUsername) == 0 { + return nil, fmt.Errorf("Service username not provided") + } else if len(servicePassphrase) == 0 { + return nil, fmt.Errorf("Service passphrase not provided") + } else { + return &App{ + ApiUrl: apiUrl, AuthUrl: authUrl, ServiceUsername: serviceUsername, ServicePassphrase: servicePassphrase, + }, nil + } +} diff --git a/internal/auth/auth.go b/internal/auth/auth.go new file mode 100644 index 0000000..0298994 --- /dev/null +++ b/internal/auth/auth.go @@ -0,0 +1,55 @@ +package auth + +import ( + "bytes" + "encoding/json" + "fmt" + "net/http" + + "git.kundeng.us/phoenix/textsender-models/tx0/token" + + "git.kundeng.us/phoenix/catapult/internal/app" +) + +type Auth struct { + Application *app.App +} + +type service struct { + Username string `json:"username"` + Passphrase string `json:"passphrase"` +} + +type response struct { + Message string `json:"message"` + Data []*token.Login `json:"data"` +} + +func (a *Auth) GetToken() (*token.Login, error) { + serv := service{ + Username: a.Application.ServiceUsername, + Passphrase: a.Application.ServicePassphrase, + } + + jsonData, err := json.Marshal(serv) + if err != nil { + return nil, err + } + resp, err := http.Post( + fmt.Sprintf("%s/api/v1/service/login", a.Application.AuthUrl), + "application/json", + bytes.NewBuffer(jsonData), + ) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + var r response + err = json.NewDecoder(resp.Body).Decode(&r) + if err != nil { + return nil, err + } + + return r.Data[0], nil +} diff --git a/internal/config/config.go b/internal/config/config.go index 7dcdd13..e680084 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -2,32 +2,31 @@ package config import ( "context" - "flag" + "fmt" "log" "sync" "time" + + "git.kundeng.us/phoenix/textsender-models/tx0/token" + + "git.kundeng.us/phoenix/catapult/internal/app" + "git.kundeng.us/phoenix/catapult/internal/auth" ) -const App_Name = "catapult" - -func CheckVersionFlag() *bool { - versionFlag := flag.Bool("version", false, "Print version information") - flag.Parse() - - return versionFlag -} - type Service struct { wg sync.WaitGroup ctx context.Context cancel context.CancelFunc + App *app.App + token *token.Login } -func NewService() *Service { +func NewService(application *app.App) *Service { ctx, cancel := context.WithCancel(context.Background()) return &Service{ ctx: ctx, cancel: cancel, + App: application, } } @@ -55,6 +54,15 @@ func (s *Service) worker1() { case <-ticker.C: // Do some work log.Println("Worker 1: Processing...") + if s.token == nil { + catapultAuth := auth.Auth{Application: s.App} + if token, err := catapultAuth.GetToken(); err != nil { + fmt.Println("Error:", err) + } else { + fmt.Println("Access token:", token.AccessToken) + s.token = token + } + } } } } diff --git a/internal/config/version.go b/internal/config/version.go new file mode 100644 index 0000000..81b9574 --- /dev/null +++ b/internal/config/version.go @@ -0,0 +1,12 @@ +package config + +import ( + "flag" +) + +func CheckVersionFlag() *bool { + versionFlag := flag.Bool("version", false, "Print version information") + flag.Parse() + + return versionFlag +}