From c80981554948337ef4f526e308844997f90832d3 Mon Sep 17 00:00:00 2001 From: phoenix Date: Mon, 1 Dec 2025 21:24:05 +0000 Subject: [PATCH] tsk-14: Record when message was sent (#16) Closes #14 Reviewed-on: https://git.kundeng.us/phoenix/catapult/pulls/16 Co-authored-by: phoenix Co-committed-by: phoenix --- cmd/catapult/main.go | 5 +- go.mod | 4 +- go.sum | 8 +-- internal/app/app.go | 2 +- internal/service/contact.go | 6 +-- internal/service/core/service.go | 24 ++++++++- internal/service/message.go | 6 +-- internal/service/message_event_response.go | 58 +++++++++++++++++++++ internal/service/scheduled_message_event.go | 7 ++- internal/service/scheduler.go | 26 ++++++--- 10 files changed, 118 insertions(+), 28 deletions(-) create mode 100644 internal/service/message_event_response.go diff --git a/cmd/catapult/main.go b/cmd/catapult/main.go index f784bf8..f5cb847 100644 --- a/cmd/catapult/main.go +++ b/cmd/catapult/main.go @@ -2,6 +2,7 @@ package main import ( "fmt" + "log" "os" "os/signal" "syscall" @@ -13,7 +14,7 @@ import ( ) func main() { - fmt.Println(app.App_Name) + log.Println(app.App_Name) versionFlag := config.CheckVersionFlag() if *versionFlag { @@ -23,7 +24,7 @@ func main() { myApp, err := app.Load() if err != nil { - fmt.Println("Error loading app: %w", err) + log.Println("Error loading app: %w", err) return } diff --git a/go.mod b/go.mod index c684548..c8be3e2 100644 --- a/go.mod +++ b/go.mod @@ -3,8 +3,8 @@ module git.kundeng.us/phoenix/catapult go 1.25.4 require ( - git.kundeng.us/phoenix/swoosh v0.0.5 - git.kundeng.us/phoenix/textsender-models v0.0.10 + git.kundeng.us/phoenix/swoosh v0.0.6 + git.kundeng.us/phoenix/textsender-models v0.0.11 github.com/google/uuid v1.6.0 github.com/joho/godotenv v1.5.1 ) diff --git a/go.sum b/go.sum index 648186e..697f0cb 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ -git.kundeng.us/phoenix/swoosh v0.0.5 h1:++kc6xRlt01ToMeIOSzYtGnYjug6x0p0euZwJ+xHDs4= -git.kundeng.us/phoenix/swoosh v0.0.5/go.mod h1:BTn6gDaHWTP/OpvDjOFZJwN9kJ1xd9Rl6yFJGy8xV1k= -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= +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/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= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= diff --git a/internal/app/app.go b/internal/app/app.go index 8467b13..8cd29fb 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -16,7 +16,7 @@ type App struct { AuthUrl string ServiceUsername string ServicePassphrase string - TwilioConfig *config.TwiloConfig + TwilioConfig *config.TwiloConfig } func Load() (*App, error) { diff --git a/internal/service/contact.go b/internal/service/contact.go index f10be91..988080e 100644 --- a/internal/service/contact.go +++ b/internal/service/contact.go @@ -19,15 +19,15 @@ type Contact struct { } type getContactResponse struct { - Message string `json:"message"` - Data []*contact.Contact `json:"data"` + Message string `json:"message"` + Data []*contact.Contact `json:"data"` } func (c *Contact) GetContact(id uuid.UUID) (*contact.Contact, error) { params := url.Values{} params.Add("id", id.String()) pm := params.Encode() - fullUrl := fmt.Sprintf("%s/api/v1/contact?%s", c.Application.ApiUrl, pm) + fullUrl := fmt.Sprintf("%s/api/v1/contact?%s", c.Application.ApiUrl, pm) fmt.Println("Url:", fullUrl) req, err := http.NewRequest("GET", fullUrl, nil) if err != nil { diff --git a/internal/service/core/service.go b/internal/service/core/service.go index 4a5e2de..c77dd44 100644 --- a/internal/service/core/service.go +++ b/internal/service/core/service.go @@ -97,7 +97,7 @@ func (s *Service) worker1() { } else { fmt.Println("Message Id:", msg.Id) fmt.Println("Contact Id:", c.Id) - if res, err := scheduler.ScheduleMessage(*item, *event, *c, *msg); err != nil { + if res, sent, err := scheduler.ScheduleMessage(*item, *event, *c, *msg); err != nil { log.Println("Failure with scheduling the message:", err) } else { if res != nil { @@ -107,6 +107,28 @@ func (s *Service) worker1() { } else { jsonValue := string(bytes) log.Println("Result:", jsonValue) + + if eventResponse, err := scheduler.RecordEventResponse(event, item.UserId, bytes, sent); err != nil { + log.Println("Failure recording event response:", err) + } else { + if len(eventResponse) == 0 { + log.Println("No event responses") + } else { + eventResponse := eventResponse[0] + log.Println("Event response saved. Id:", eventResponse.Id) + sameJsonValue := string(eventResponse.Response) + + if jsonValue == sameJsonValue { + log.Println("Matches") + } else if len(jsonValue) == len(sameJsonValue) { + log.Println("Same size") + log.Println(jsonValue) + log.Println(sameJsonValue) + } else { + log.Println("Not the same") + } + } + } } } else { log.Println("Result should not be empty") diff --git a/internal/service/message.go b/internal/service/message.go index a50face..ed32e88 100644 --- a/internal/service/message.go +++ b/internal/service/message.go @@ -19,15 +19,15 @@ type Message struct { } type getMessageResponse struct { - Message string `json:"message"` - Data []*message.Message `json:"data"` + Message string `json:"message"` + Data []*message.Message `json:"data"` } func (m *Message) GetMessage(id uuid.UUID) (*message.Message, error) { params := url.Values{} params.Add("id", id.String()) pm := params.Encode() - fullUrl := fmt.Sprintf("%s/api/v1/message?%s", m.Application.ApiUrl, pm) + fullUrl := fmt.Sprintf("%s/api/v1/message?%s", m.Application.ApiUrl, pm) fmt.Println("Url:", fullUrl) req, err := http.NewRequest("GET", fullUrl, nil) if err != nil { diff --git a/internal/service/message_event_response.go b/internal/service/message_event_response.go new file mode 100644 index 0000000..b3e6ade --- /dev/null +++ b/internal/service/message_event_response.go @@ -0,0 +1,58 @@ +package service + +import ( + "encoding/json" + "fmt" + "net/http" + "strings" + + "git.kundeng.us/phoenix/textsender-models/tx0/message" + "git.kundeng.us/phoenix/textsender-models/tx0/token" + + "git.kundeng.us/phoenix/catapult/internal/app" +) + +type MessageEventResponse struct { + Application *app.App + Token *token.Login +} + +type recordMessageEventResponse struct { + Message string `json:"message"` + Data []*message.MessageEventResponse `json:"data"` +} + +func (m *MessageEventResponse) RecordEventResponse(mer *message.MessageEventResponse) ([]*message.MessageEventResponse, error) { + fullUrl := fmt.Sprintf("%s/api/v1/schedule/message/event/response/record", m.Application.ApiUrl) + jsonData, err := json.Marshal(mer) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("POST", fullUrl, strings.NewReader(string(jsonData))) + if err != nil { + return nil, err + } + + token := m.Token.AccessToken + req.Header.Set("Authorization", "Bearer "+token) + + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + var r recordMessageEventResponse + 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, nil + } + } +} diff --git a/internal/service/scheduled_message_event.go b/internal/service/scheduled_message_event.go index 1ef1deb..a83f57c 100644 --- a/internal/service/scheduled_message_event.go +++ b/internal/service/scheduled_message_event.go @@ -6,22 +6,21 @@ import ( "net/http" "net/url" - "github.com/google/uuid" "git.kundeng.us/phoenix/textsender-models/tx0/message/scheduling" "git.kundeng.us/phoenix/textsender-models/tx0/token" + "github.com/google/uuid" "git.kundeng.us/phoenix/catapult/internal/app" ) - type ScheduledMessageEvent struct { Application *app.App Token *token.Login } type getScheduledMessageEventResponse struct { - Message string `json:"message"` - Data []*scheduling.ScheduledMessageEvent `json:"data"` + Message string `json:"message"` + Data []*scheduling.ScheduledMessageEvent `json:"data"` } func (s *ScheduledMessageEvent) GetEvents(scheduledMessageId uuid.UUID) ([]*scheduling.ScheduledMessageEvent, error) { diff --git a/internal/service/scheduler.go b/internal/service/scheduler.go index 2a89be7..18620c8 100644 --- a/internal/service/scheduler.go +++ b/internal/service/scheduler.go @@ -1,7 +1,7 @@ package service import ( - "fmt" + "time" "git.kundeng.us/phoenix/swoosh/swoop/send" "git.kundeng.us/phoenix/swoosh/swoop/types" @@ -14,10 +14,9 @@ import ( "git.kundeng.us/phoenix/catapult/internal/app" ) - type Scheduler struct { Application *app.App - Token *token.Login + Token *token.Login } func (s *Scheduler) GetEvents(scheduledMessageId uuid.UUID) ([]*scheduling.ScheduledMessageEvent, error) { @@ -41,18 +40,29 @@ func (s *Scheduler) GetMessage(id uuid.UUID) (*message.Message, error) { func (s *Scheduler) GetContact(id uuid.UUID) (*contact.Contact, error) { ctct := Contact{Application: s.Application, Token: s.Token} if c, err := ctct.GetContact(id); err != nil { - return nil ,err + return nil, err } else { return c, nil } } -func (s *Scheduler) ScheduleMessage(schMsg scheduling.ScheduledMessage, event scheduling.ScheduledMessageEvent, c contact.Contact, msg message.Message) (*types.TwilioResult, error) { +func (s *Scheduler) ScheduleMessage(schMsg scheduling.ScheduledMessage, event scheduling.ScheduledMessageEvent, c contact.Contact, msg message.Message) (*types.TwilioResult, *time.Time, error) { msgSender := send.MessageSender{Config: s.Application.TwilioConfig} if res, err := msgSender.Send(msg, c, &schMsg.Scheduled); err != nil { - return nil, err + return nil, nil, err } else { - fmt.Println(res.AccountSid) - return res, nil + sent := time.Now() + return res, &sent, nil + } +} + +func (s *Scheduler) RecordEventResponse(schMsgEvent *scheduling.ScheduledMessageEvent, userId uuid.UUID, bytes []byte, sent *time.Time) ([]*message.MessageEventResponse, error) { + mre := message.MessageEventResponse{ScheduledMessageEventId: schMsgEvent.Id, UserId: userId, Response: bytes, Sent: *sent} + + msgEventResponse := MessageEventResponse{Application: s.Application, Token: s.Token} + if responses, err := msgEventResponse.RecordEventResponse(&mre); err != nil { + return nil, err + } else { + return responses, nil } }