diff options
Diffstat (limited to 'adapters')
-rw-r--r-- | adapters/messaging/db.go | 29 | ||||
-rw-r--r-- | adapters/messaging/http_sms.go | 69 | ||||
-rw-r--r-- | adapters/messaging/messaging.go | 60 | ||||
-rw-r--r-- | adapters/messaging/ntfy.go | 35 |
4 files changed, 152 insertions, 41 deletions
diff --git a/adapters/messaging/db.go b/adapters/messaging/db.go new file mode 100644 index 0000000..4cad3e2 --- /dev/null +++ b/adapters/messaging/db.go @@ -0,0 +1,29 @@ +package messaging + +import ( + "database/sql" + "log" + "time" + + "git.simponic.xyz/simponic/phoneof/database" +) + +func PersistMessageContinuation(dbConn *sql.DB, frenId string, messageId string, sentAt time.Time, frenSent bool) Continuation { + return func(message Message) ContinuationChain { + log.Printf("persisting message %v %s %s %s %v", message, frenId, messageId, sentAt, frenSent) + return func(success Continuation, failure Continuation) ContinuationChain { + _, err := database.SaveMessage(dbConn, &database.Message{ + Id: messageId, + FrenId: frenId, + Message: message.Message, + Time: sentAt, + FrenSent: frenSent, + }) + if err != nil { + log.Printf("err when saving message %s", err) + return failure(message) + } + return success(message) + } + } +} diff --git a/adapters/messaging/http_sms.go b/adapters/messaging/http_sms.go index c722f21..8d1c99f 100644 --- a/adapters/messaging/http_sms.go +++ b/adapters/messaging/http_sms.go @@ -11,13 +11,6 @@ import ( "git.simponic.xyz/simponic/phoneof/utils" ) -type HttpSmsMessagingAdapter struct { - ApiToken string - FromPhoneNumber string - ToPhoneNumber string - Endpoint string -} - type HttpSmsMessageData struct { RequestId string `json:"request_id"` } @@ -26,37 +19,35 @@ type HttpSmsMessageSendResponse struct { Data HttpSmsMessageData `json:"data"` } -func (adapter *HttpSmsMessagingAdapter) encodeMessage(message string) string { - requestId := utils.RandomId() - return fmt.Sprintf(`{"from":"%s","to":"%s","content":"%s","request_id":"%s"}`, adapter.FromPhoneNumber, adapter.ToPhoneNumber, message, requestId) -} - -func (adapter *HttpSmsMessagingAdapter) SendMessage(message string) (string, error) { - url := fmt.Sprintf("%s/v1/messages/send", adapter.Endpoint) - payload := strings.NewReader(adapter.encodeMessage(message)) - - req, _ := http.NewRequest("POST", url, payload) - req.Header.Add("x-api-key", adapter.ApiToken) - req.Header.Add("Content-Type", "application/json") - res, err := http.DefaultClient.Do(req) - if err != nil { - log.Printf("got err sending message send req %s", err) - return "", err - } - - if res.StatusCode/100 != 2 { - return "", fmt.Errorf("error sending message: %s %d", message, res.StatusCode) +func HttpSmsContinuation(apiToken string, fromPhoneNumber string, toPhoneNumber string, httpSmsEndpoint string) Continuation { + return func(message Message) ContinuationChain { + encodedMsg := fmt.Sprintf(`{"from":"%s","to":"%s","content":"%s"}`, fromPhoneNumber, toPhoneNumber, utils.Quote(message.Encode())) + log.Println(encodedMsg) + + return func(success Continuation, failure Continuation) ContinuationChain { + url := fmt.Sprintf("%s/v1/messages/send", httpSmsEndpoint) + payload := strings.NewReader(encodedMsg) + + req, _ := http.NewRequest("POST", url, payload) + req.Header.Add("x-api-key", apiToken) + req.Header.Add("Content-Type", "application/json") + res, err := http.DefaultClient.Do(req) + if err != nil || res.StatusCode/100 != 2 { + log.Printf("got err sending message send req %s %v %s", message, res, err) + return failure(message) + } + + defer res.Body.Close() + body, _ := io.ReadAll(res.Body) + + var response HttpSmsMessageSendResponse + err = json.Unmarshal(body, &response) + if err != nil { + log.Printf("got error unmarshaling response: %s %s", body, err) + return failure(message) + } + + return success(message) + } } - - defer res.Body.Close() - body, _ := io.ReadAll(res.Body) - - var response HttpSmsMessageSendResponse - err = json.Unmarshal(body, &response) - if err != nil { - log.Printf("got error unmarshaling response: %s %s", body, err) - return "", err - } - - return response.Data.RequestId, nil } diff --git a/adapters/messaging/messaging.go b/adapters/messaging/messaging.go index 607258a..f802503 100644 --- a/adapters/messaging/messaging.go +++ b/adapters/messaging/messaging.go @@ -1,5 +1,61 @@ package messaging -type MessagingAdapter interface { - SendMessage(message string) (string, error) +import ( + "fmt" + "log" + "strings" + "time" +) + +type Message struct { + FrenName string + Message string +} + +func (m *Message) Encode() string { + return m.FrenName + " " + m.Message +} + +func Decode(message string) (*Message, error) { + content := strings.SplitN(message, " ", 2) + if len(content) < 2 { + return nil, fmt.Errorf("no space delimiter") + } + return &Message{ + FrenName: content[0], + Message: content[1], + }, nil +} + +func IdContinuation(message Message) ContinuationChain { + return func(success Continuation, _failure Continuation) ContinuationChain { + return success(message) + } } + +func FailurePassingContinuation(message Message) ContinuationChain { + return func(_success Continuation, failure Continuation) ContinuationChain { + return failure(message) + } +} + +func LogContinuation(message Message) ContinuationChain { + return func(success Continuation, _failure Continuation) ContinuationChain { + now := time.Now().UTC() + + log.Println(now, message) + return success(message) + } +} + +// basically b(a(message)) if and only if b is successful +func Compose(a Continuation, b Continuation) Continuation { + return func(message Message) ContinuationChain { + return func(success Continuation, failure Continuation) ContinuationChain { + return b(message)(a, FailurePassingContinuation)(success, failure) + } + } +} + +type Continuation func(Message) ContinuationChain +type ContinuationChain func(Continuation, Continuation) ContinuationChain diff --git a/adapters/messaging/ntfy.go b/adapters/messaging/ntfy.go new file mode 100644 index 0000000..837c01b --- /dev/null +++ b/adapters/messaging/ntfy.go @@ -0,0 +1,35 @@ +package messaging + +import ( + "fmt" + "log" + "net/http" + "strings" + + "git.simponic.xyz/simponic/phoneof/utils" +) + +func SendNtfy(topic string, ntfyEndpoint string) Continuation { + return func(message Message) ContinuationChain { + return func(success Continuation, failure Continuation) ContinuationChain { + log.Println(message) + if message.FrenName != "ntfy" { + log.Printf("fren name for message %v is not ntfy so we wont send it there", message) + return success(message) + } + encodedMsg := fmt.Sprintf(`{"message": "%s", "topic": "%s"}`, utils.Quote(message.Message), utils.Quote(topic)) + + url := ntfyEndpoint + payload := strings.NewReader(encodedMsg) + + req, _ := http.NewRequest("PUT", url, payload) + req.Header.Add("Content-Type", "application/json") + res, err := http.DefaultClient.Do(req) + if err != nil || res.StatusCode/100 != 2 { + log.Printf("got err sending message send req %s %v %s", encodedMsg, res, err) + return failure(message) + } + return success(message) + } + } +} |