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

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. package Messages
  2. import (
  3. "encoding/base64"
  4. "encoding/json"
  5. "fmt"
  6. "net/http"
  7. "time"
  8. "git.tovijaeschke.xyz/tovi/Envelope/Backend/Database"
  9. "git.tovijaeschke.xyz/tovi/Envelope/Backend/Service"
  10. "git.tovijaeschke.xyz/tovi/Envelope/Backend/Util"
  11. )
  12. // TODO: Encrypt sender and conversationID metadata + add more
  13. type payload struct {
  14. Messages []rawMessageData `json:"messages"`
  15. Sender string `json:"sender"`
  16. ConversationID string `json:"conversation_id"`
  17. Tokens []string `json:"tokens"`
  18. }
  19. type rawMessageData struct {
  20. MessageData Database.MessageData `json:"message_data"`
  21. Messages Database.MessageList `json:"message"`
  22. }
  23. // CreateMessage sends a message
  24. func CreateMessage(w http.ResponseWriter, r *http.Request) {
  25. var (
  26. messagesData payload
  27. messageData rawMessageData
  28. message Database.Message
  29. t time.Time
  30. decodedFile []byte
  31. fileName string
  32. i int
  33. err error
  34. )
  35. err = json.NewDecoder(r.Body).Decode(&messagesData)
  36. if err != nil {
  37. http.Error(w, "Error", http.StatusInternalServerError)
  38. return
  39. }
  40. for _, messageData = range messagesData.Messages {
  41. if messageData.MessageData.Data == "" {
  42. decodedFile, err = base64.StdEncoding.DecodeString(messageData.MessageData.Attachment.Data)
  43. fileName, err = Util.WriteFile(decodedFile)
  44. messageData.MessageData.Attachment.FilePath = fileName
  45. }
  46. for i, message = range messageData.Messages {
  47. t, err = time.Parse(time.RFC3339, message.ExpiryRaw)
  48. if err == nil {
  49. err = messageData.Messages[i].Expiry.Scan(t)
  50. if err != nil {
  51. http.Error(w, "Error", http.StatusInternalServerError)
  52. return
  53. }
  54. }
  55. }
  56. err = (&messageData.MessageData).CreateMessageData()
  57. if err != nil {
  58. http.Error(w, "Error", http.StatusInternalServerError)
  59. return
  60. }
  61. err = (&messageData.Messages).CreateMessages()
  62. if err != nil {
  63. http.Error(w, "Error", http.StatusInternalServerError)
  64. return
  65. }
  66. }
  67. _ = Service.SendNotification(
  68. messagesData.Tokens,
  69. fmt.Sprintf(
  70. "%s sent a message",
  71. messagesData.Sender,
  72. ),
  73. map[string]string{
  74. "conversation_id": messagesData.ConversationID,
  75. },
  76. )
  77. w.WriteHeader(http.StatusNoContent)
  78. }