diff options
Diffstat (limited to 'api/chat/chat.go')
-rw-r--r-- | api/chat/chat.go | 61 |
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) } } |