summaryrefslogtreecommitdiff
path: root/api/chat/chat.go
diff options
context:
space:
mode:
Diffstat (limited to 'api/chat/chat.go')
-rw-r--r--api/chat/chat.go61
1 files changed, 29 insertions, 32 deletions
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)
}
}