summaryrefslogtreecommitdiff
path: root/adapters
diff options
context:
space:
mode:
Diffstat (limited to 'adapters')
-rw-r--r--adapters/messaging/db.go29
-rw-r--r--adapters/messaging/http_sms.go69
-rw-r--r--adapters/messaging/messaging.go60
-rw-r--r--adapters/messaging/ntfy.go35
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)
+ }
+ }
+}