nidus-sync/api/voipms.go

106 lines
2.9 KiB
Go
Raw Permalink Normal View History

package api
import (
"context"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
//"github.com/Gleipnir-Technology/nidus-sync/config"
"github.com/Gleipnir-Technology/nidus-sync/platform/text"
"github.com/rs/zerolog/log"
)
/*
{
"data": {
"id": 101252305,
"event_type": "message.received",
"record_type": "event",
"payload": {
"id": 101252305,
"record_type": "message",
"from": {
"phone_number": "+18016984649"
},
"to": [
{
"phone_number": "+15593720139",
"status": "webhook_delivered"
}
],
"text": "test3",
"received_at": "2026-01-29T20:16:23.000000+00:00",
"type": "SMS",
"media": []
}
}
}
*/
type VoipMSStatusPhoneFrom struct {
PhoneNumber string `json:"phone_number"`
}
type VoipMSStatusPhoneTo struct {
PhoneNumber string `json:"phone_number"`
Status string `json:"status"`
}
type VoipMSStatusPayload struct {
ID int `json:"id"`
RecordType string `json:"record_type"`
From VoipMSStatusPhoneFrom `json:"from"`
To []VoipMSStatusPhoneTo `json:"to"`
Text string `json:"text"`
ReceivedAt string `json:"received_at"`
Type string `json:"type"`
//Media []something
}
type VoipMSStatusUpdate struct {
ID int `json:"id"`
EventType string `json:"event_type"`
RecordType string `json:"record_type"`
Payload VoipMSStatusPayload `json:"payload"`
}
type VoipMSTextPostBody struct {
Data VoipMSStatusUpdate `json:"data"`
}
func voipmsTextGet(w http.ResponseWriter, r *http.Request) {
query := r.URL.Query()
name := query.Get("to")
age := query.Get("from")
message := query.Get("message")
files := query.Get("files")
id := query.Get("id")
date := query.Get("date")
log.Info().Str("name", name).Str("age", age).Str("message", message).Str("files", files).Str("id", id).Str("date", date).Msg("Incoming text message")
}
func voipmsTextPost(w http.ResponseWriter, r *http.Request) {
body, err := ioutil.ReadAll(r.Body)
if err != nil {
http.Error(w, "failed to read", http.StatusInternalServerError)
return
}
//debugSaveRequest(r)
var b VoipMSTextPostBody
err = json.Unmarshal(body, &b)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
to := "unknown"
if len(b.Data.Payload.To) > 0 {
to = b.Data.Payload.To[0].PhoneNumber
}
log.Info().Int("ID", b.Data.ID).Str("event_type", b.Data.EventType).Str("record_type", b.Data.RecordType).Str("from", b.Data.Payload.From.PhoneNumber).Str("to", to).Str("content", b.Data.Payload.Text).Msg("Text status")
// Convert phone numbers from Voip.ms into E164 format for consistency
go func() {
err := text.HandleTextMessage(context.Background(), b.Data.Payload.From.PhoneNumber, to, b.Data.Payload.Text)
if err != nil {
log.Error().Err(err).Msg("failed to handle VoIP.ms incoming text")
}
}()
fmt.Fprintf(w, "ok")
}