Encrypted messaging app
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

90 lines
2.2 KiB

package Messages
import (
"encoding/base64"
"encoding/json"
"fmt"
"net/http"
"time"
"git.tovijaeschke.xyz/tovi/Envelope/Backend/Database"
"git.tovijaeschke.xyz/tovi/Envelope/Backend/Service"
"git.tovijaeschke.xyz/tovi/Envelope/Backend/Util"
)
// TODO: Encrypt sender and conversationID metadata + add more
type payload struct {
Messages []rawMessageData `json:"messages"`
Sender string `json:"sender"`
ConversationID string `json:"conversation_id"`
Tokens []string `json:"tokens"`
}
type rawMessageData struct {
MessageData Database.MessageData `json:"message_data"`
Messages Database.MessageList `json:"message"`
}
// CreateMessage sends a message
func CreateMessage(w http.ResponseWriter, r *http.Request) {
var (
messagesData payload
messageData rawMessageData
message Database.Message
t time.Time
decodedFile []byte
fileName string
i int
err error
)
err = json.NewDecoder(r.Body).Decode(&messagesData)
if err != nil {
http.Error(w, "Error", http.StatusInternalServerError)
return
}
for _, messageData = range messagesData.Messages {
if messageData.MessageData.Data == "" {
decodedFile, err = base64.StdEncoding.DecodeString(messageData.MessageData.Attachment.Data)
fileName, err = Util.WriteFile(decodedFile)
messageData.MessageData.Attachment.FilePath = fileName
}
for i, message = range messageData.Messages {
t, err = time.Parse(time.RFC3339, message.ExpiryRaw)
if err == nil {
err = messageData.Messages[i].Expiry.Scan(t)
if err != nil {
http.Error(w, "Error", http.StatusInternalServerError)
return
}
}
}
err = (&messageData.MessageData).CreateMessageData()
if err != nil {
http.Error(w, "Error", http.StatusInternalServerError)
return
}
err = (&messageData.Messages).CreateMessages()
if err != nil {
http.Error(w, "Error", http.StatusInternalServerError)
return
}
}
_ = Service.SendNotification(
messagesData.Tokens,
fmt.Sprintf(
"%s sent a message",
messagesData.Sender,
),
map[string]string{
"conversation_id": messagesData.ConversationID,
},
)
w.WriteHeader(http.StatusNoContent)
}