summaryrefslogtreecommitdiff
path: root/api
diff options
context:
space:
mode:
Diffstat (limited to 'api')
-rw-r--r--api/api.go12
-rw-r--r--api/chat/chat.go61
2 files changed, 33 insertions, 40 deletions
diff --git a/api/api.go b/api/api.go
index 07db731..cb5101b 100644
--- a/api/api.go
+++ b/api/api.go
@@ -99,19 +99,15 @@ func MakeMux(argv *args.Arguments, dbConn *sql.DB) *http.ServeMux {
LogRequestContinuation(requestContext, r, w)(chat.ValidateFren, FailurePassingContinuation)(chat.FetchMessagesContinuation, FailurePassingContinuation)(template.TemplateContinuation("messages.html", false), FailurePassingContinuation)(LogExecutionTimeContinuation, LogExecutionTimeContinuation)(IdContinuation, IdContinuation)
})
- messageHandler := messaging.HttpSmsMessagingAdapter{
- ApiToken: os.Getenv("HTTPSMS_API_TOKEN"),
- FromPhoneNumber: os.Getenv("FROM_PHONE_NUMBER"),
- ToPhoneNumber: os.Getenv("TO_PHONE_NUMBER"),
- Endpoint: argv.HttpSmsEndpoint,
- }
- sendMessageContinuation := chat.SendMessageContinuation(&messageHandler)
+ httpsms := messaging.HttpSmsContinuation(os.Getenv("HTTPSMS_API_TOKEN"), os.Getenv("FROM_PHONE_NUMBER"), os.Getenv("TO_PHONE_NUMBER"), argv.HttpSmsEndpoint)
+ ntfy := messaging.SendNtfy(argv.NtfyTopic, argv.NtfyEndpoint)
+ sendMessageContinuation := chat.SendMessageContinuation(messaging.Compose(ntfy, httpsms))
mux.HandleFunc("POST /chat", func(w http.ResponseWriter, r *http.Request) {
requestContext := makeRequestContext()
LogRequestContinuation(requestContext, r, w)(chat.ValidateFren, FailurePassingContinuation)(sendMessageContinuation, FailurePassingContinuation)(template.TemplateContinuation("chat.html", true), FailurePassingContinuation)(LogExecutionTimeContinuation, LogExecutionTimeContinuation)(IdContinuation, IdContinuation)
})
- smsEventProcessor := chat.ChatEventProcessorContinuation(os.Getenv("HTTPSMS_SIGNING_KEY"))
+ smsEventProcessor := chat.ChatEventProcessorContinuation(os.Getenv("TO_PHONE_NUMBER"), os.Getenv("HTTPSMS_SIGNING_KEY"), ntfy)
mux.HandleFunc("POST /chat/event", func(w http.ResponseWriter, r *http.Request) {
requestContext := makeRequestContext()
LogRequestContinuation(requestContext, r, w)(smsEventProcessor, FailurePassingContinuation)(LogExecutionTimeContinuation, LogExecutionTimeContinuation)(IdContinuation, IdContinuation)
diff --git a/api/chat/chat.go b/api/chat/chat.go
index 51ee47d..fcff9f0 100644
--- a/api/chat/chat.go
+++ b/api/chat/chat.go
@@ -2,13 +2,15 @@ package chat
import (
"encoding/json"
- "github.com/golang-jwt/jwt/v5"
+ "fmt"
"io"
"log"
"net/http"
"strings"
"time"
+ "github.com/golang-jwt/jwt/v5"
+
"git.simponic.xyz/simponic/phoneof/adapters/messaging"
"git.simponic.xyz/simponic/phoneof/api/types"
"git.simponic.xyz/simponic/phoneof/database"
@@ -59,28 +61,27 @@ func FetchMessagesContinuation(context *types.RequestContext, req *http.Request,
}
}
-func SendMessageContinuation(messagingAdapter messaging.MessagingAdapter) func(context *types.RequestContext, req *http.Request, resp http.ResponseWriter) types.ContinuationChain {
+func SendMessageContinuation(messagingPipeline messaging.Continuation) func(context *types.RequestContext, req *http.Request, resp http.ResponseWriter) types.ContinuationChain {
return func(context *types.RequestContext, req *http.Request, resp http.ResponseWriter) types.ContinuationChain {
return func(success types.Continuation, failure types.Continuation) types.ContinuationChain {
rawMessage := req.FormValue("message")
now := time.Now().UTC()
- messageRequestId, err := messagingAdapter.SendMessage(context.User.Name + " " + rawMessage)
+
+ persist := messaging.PersistMessageContinuation(context.DBConn, context.User.Id, context.Id, now, true)
+ var err error
+ messaging.LogContinuation(messaging.Message{
+ FrenName: context.User.Name,
+ Message: rawMessage,
+ })(messagingPipeline, messaging.FailurePassingContinuation)(persist, messaging.FailurePassingContinuation)(messaging.IdContinuation, func(message messaging.Message) messaging.ContinuationChain {
+ err = fmt.Errorf("err sending message from: %s %s", context.User, rawMessage)
+ return messaging.FailurePassingContinuation(message)
+ })
+
if err != nil {
- log.Printf("err sending message %s %s %s", context.User, rawMessage, err)
// yeah this might be a 400 or whatever, i’ll fix it later
resp.WriteHeader(http.StatusInternalServerError)
return failure(context, req, resp)
}
-
- message, err := database.SaveMessage(context.DBConn, &database.Message{
- Id: messageRequestId,
- FrenId: context.User.Id,
- Message: rawMessage,
- Time: now,
- FrenSent: true,
- })
-
- log.Printf("Saved message %v", message)
return success(context, req, resp)
}
}
@@ -120,7 +121,7 @@ type HttpSmsEvent struct {
Id string `json:"id"`
}
-func ChatEventProcessorContinuation(signingKey string) func(context *types.RequestContext, req *http.Request, resp http.ResponseWriter) types.ContinuationChain {
+func ChatEventProcessorContinuation(allowedFrom string, signingKey string, messagingPipeline messaging.Continuation) func(context *types.RequestContext, req *http.Request, resp http.ResponseWriter) types.ContinuationChain {
return func(context *types.RequestContext, req *http.Request, resp http.ResponseWriter) types.ContinuationChain {
return func(success types.Continuation, failure types.Continuation) types.ContinuationChain {
// check signing
@@ -156,38 +157,34 @@ func ChatEventProcessorContinuation(signingKey string) func(context *types.Reque
log.Printf("got non-receive event %s", event.Type)
return success(context, req, resp)
}
+ if event.Data.Contact != allowedFrom {
+ log.Printf("someone did something naughty %s", event.Data.Contact)
+ return success(context, req, resp)
+ }
- // respond to texts with "<fren name> <content>"
- content := strings.SplitN(event.Data.Content, " ", 2)
- if len(content) < 2 {
- log.Printf("no space delimiter")
+ message, err := messaging.Decode(event.Data.Content)
+ if err != nil {
+ log.Printf("err when decoding message %s", err)
resp.WriteHeader(http.StatusBadRequest)
return failure(context, req, resp)
}
- name := content[0]
- rawMessage := content[1]
- fren, err := database.FindFrenByName(context.DBConn, name)
+ fren, err := database.FindFrenByName(context.DBConn, message.FrenName)
if err != nil {
- log.Printf("err when getting fren %s %s", name, err)
+ log.Printf("err when getting fren %s %s", fren.Name, err)
resp.WriteHeader(http.StatusBadRequest)
return failure(context, req, resp)
}
- // save the message!
- _, err = database.SaveMessage(context.DBConn, &database.Message{
- Id: event.Id,
- FrenId: fren.Id,
- Message: rawMessage,
- Time: event.Data.Timestamp,
- FrenSent: false,
+ persist := messaging.PersistMessageContinuation(context.DBConn, fren.Id, context.Id, event.Data.Timestamp, false)
+ messaging.LogContinuation(*message)(messagingPipeline, messaging.FailurePassingContinuation)(persist, messaging.FailurePassingContinuation)(messaging.IdContinuation, func(message messaging.Message) messaging.ContinuationChain {
+ err = fmt.Errorf("err propagating stuff for message %s", message)
+ return messaging.FailurePassingContinuation(message)
})
if err != nil {
- log.Printf("err when saving message %s %s", name, err)
resp.WriteHeader(http.StatusInternalServerError)
return failure(context, req, resp)
}
-
return success(context, req, resp)
}
}