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) }