A self hosted chat application with end-to-end encrypted messaging.
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.

118 lines
5.1 KiB

  1. import * as log from "loglevel";
  2. import { ChatMessageDTO } from "../dto/ChatMessageDTO";
  3. import { EncryptionService } from "../service/EncryptionService";
  4. import { SJCLEncryptionService } from "../service/SJCLEncryptionService";
  5. import { JsonAPI } from "../singleton/JsonAPI";
  6. import { Sprintf } from "../singleton/Sprintf";
  7. import { ChatMessageViewModel } from "../viewmodel/ChatMessageViewModel";
  8. import { ChatModel } from "./ChatModel";
  9. import { fetchErrorHandler } from "./FetchErrorHandler";
  10. export class ChatModelHelper {
  11. private static readonly _encryptionService: EncryptionService = new SJCLEncryptionService();
  12. public static async getMessages(userName: string, passphrase: string, page: number | null, lastMessageTime: string | null, chatModel: ChatModel): Promise<ChatMessageViewModel[]> {
  13. switch (lastMessageTime) {
  14. case null: {
  15. const data: ChatMessageDTO[] = await this.getPaginatedMessagesAjax(userName, page!);
  16. const data2 = Promise.all(data.map(vm => this.toChatMessageVMAsync(vm, passphrase)).reverse());
  17. return data2;
  18. // return data.map(vm => this.toChatMessageVM(vm, passphrase)).reverse();
  19. }
  20. default: {
  21. const data: ChatMessageDTO[] = await this.getNewMessagesAjax(userName, lastMessageTime);
  22. return data.map(vm => this.toChatMessageVM(vm, passphrase));
  23. }
  24. }
  25. }
  26. private static async toChatMessageVMAsync(chatMessageDTO: ChatMessageDTO, passphrase: string): Promise<ChatMessageViewModel> {
  27. const vm = new ChatMessageViewModel();
  28. vm.fromUser = chatMessageDTO.fromUser;
  29. vm.toUser = chatMessageDTO.toUser;
  30. // vm.messageTime = chatMessageDTO.messageTime;
  31. chatMessageDTO.messageTime == null ? log.error("Message time somehow null") : vm.messageTime = chatMessageDTO.messageTime;
  32. vm.message = await this._encryptionService.decryptAsPromise(passphrase, chatMessageDTO.messageCipher);
  33. return vm;
  34. }
  35. private static toChatMessageVM(chatMessageDTO: ChatMessageDTO, passphrase: string): ChatMessageViewModel {
  36. const vm = new ChatMessageViewModel();
  37. vm.fromUser = chatMessageDTO.fromUser;
  38. vm.toUser = chatMessageDTO.toUser;
  39. // vm.messageTime = chatMessageDTO.messageTime;
  40. chatMessageDTO.messageTime == null ? log.error("Message time somehow null") : vm.messageTime = chatMessageDTO.messageTime;
  41. vm.message = this._encryptionService.decrypt(passphrase, chatMessageDTO.messageCipher) as string;
  42. return vm;
  43. }
  44. private static async getAllMessagesAjax(toUser: string): Promise<any> {
  45. const headers = new Headers();
  46. if (JsonAPI.authToken == null) {
  47. log.error("authToken null");
  48. return;
  49. };
  50. headers.append('X-AUTH-TOKEN', JsonAPI.authToken);
  51. const url = Sprintf(JsonAPI.CHAT_MESSAGES_GET, toUser);
  52. // const url = Sprintf(JsonAPI.CHAT_MESSAGE_PAGE_GET, toUser,1,5);
  53. log.debug(url)
  54. // const response = await fetch(`${JsonAPI.CHAT_MESSAGES_GET}/${toUser}`, {
  55. // method: 'GET',
  56. // headers: headers
  57. // });
  58. const response = await fetch(url, {
  59. method: 'GET',
  60. headers: headers
  61. });
  62. console.log(response.clone());
  63. if (fetchErrorHandler(response.clone())) {
  64. return null;
  65. }
  66. const data: Promise<any> = await response.json();
  67. return data;
  68. }
  69. private static async getPaginatedMessagesAjax(toUser: string, page: number): Promise<any> {
  70. const headers = new Headers();
  71. if (JsonAPI.authToken == null) {
  72. log.error("authToken null");
  73. return;
  74. };
  75. headers.append('X-AUTH-TOKEN', JsonAPI.authToken);
  76. // const url = Sprintf(JsonAPI.CHAT_MESSAGES_GET, toUser);
  77. const url = Sprintf(JsonAPI.CHAT_MESSAGE_PAGE_GET, toUser, page, 5);
  78. log.debug(url)
  79. // const response = await fetch(`${JsonAPI.CHAT_MESSAGES_GET}/${toUser}`, {
  80. // method: 'GET',
  81. // headers: headers
  82. // });
  83. const response = await fetch(url, {
  84. method: 'GET',
  85. headers: headers
  86. });
  87. console.log(response.clone());
  88. if (fetchErrorHandler(response.clone())) {
  89. return null;
  90. }
  91. const data: Promise<any> = await response.json();
  92. return data;
  93. }
  94. private static async getNewMessagesAjax(toUser: string, lastMessageTimeStamp: string): Promise<any> {
  95. const headers = new Headers();
  96. if (JsonAPI.authToken == null) {
  97. log.error("authToken null");
  98. return;
  99. };
  100. headers.append('X-AUTH-TOKEN', JsonAPI.authToken);
  101. const response = await fetch(`${JsonAPI.CHAT_MESSAGES_GET}/${toUser}/${lastMessageTimeStamp}`, {
  102. method: 'GET',
  103. headers: headers
  104. });
  105. console.log(response.clone());
  106. if (fetchErrorHandler(response.clone())) {
  107. return null;
  108. }
  109. const data: Promise<any> = await response.json();
  110. return data;
  111. }
  112. }