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.

98 lines
4.2 KiB

  1. import { ChatMessageDTO } from "../dto/ChatMessageDTO";
  2. import * as log from "loglevel";
  3. import { ChatMessageViewModel } from "../viewmodel/ChatMessageViewModel";
  4. import { JsonAPI } from "../singleton/JsonAPI";
  5. import { fetchErrorHandler } from "./FetchErrorHandler";
  6. import { EncryptionService } from "../service/EncryptionService";
  7. import { SJCLEncryptionService } from "../service/SJCLEncryptionService";
  8. import { ChatModel } from "./ChatModel"
  9. export class ChatModelHelper {
  10. private static readonly encryptionService = new SJCLEncryptionService();
  11. public static async getMessages(userName: string, passphrase: string, lastMessageTime: string | null, chatModel: ChatModel): Promise<ChatMessageViewModel[]> {
  12. switch (lastMessageTime) {
  13. case null: {
  14. // this.getAllMessagesAjax(userName)
  15. // .then((data: ChatMessageDTO[]) => {
  16. // log.debug(`Subject: received all messages`);
  17. // // let userNames = data.map(ChatMessageViewModel => ChatMessageViewModel.fromUser)
  18. // // let sumt = data.map(chatMessageViewModel => { return this.encryptionService.decrypt(passphrase, chatMessageViewModel.messageCipher) });
  19. // return data.map(vm => this.toChatMessageVM(vm, passphrase));
  20. // // chatModel.setUserMessages(userName, chatMessageVMs);
  21. // // chatModel.notify();
  22. // })
  23. // break;
  24. const data: ChatMessageDTO[] = await this.getAllMessagesAjax(userName);
  25. return data.map(vm => this.toChatMessageVM(vm, passphrase));
  26. }
  27. default: {
  28. // this.getNewMessagesAjax(userName, lastMessageTime)
  29. // .then((data: ChatMessageDTO[]) => {
  30. // log.debug(`Subject: received new messages`);
  31. // return data.map(vm => this.toChatMessageVM(vm, passphrase));
  32. // // chatModel.setUserMessages(userName, chatMessageVMs);
  33. // // this.state = data;
  34. // // chatModel.notify();
  35. // })
  36. // break;
  37. const data: ChatMessageDTO[] = await this.getNewMessagesAjax(userName, lastMessageTime);
  38. return data.map(vm => this.toChatMessageVM(vm, passphrase));
  39. }
  40. }
  41. // return null;
  42. }
  43. private static toChatMessageVM(chatMessageDTO: ChatMessageDTO, passphrase: string): ChatMessageViewModel {
  44. const vm = new ChatMessageViewModel();
  45. vm.fromUser = chatMessageDTO.fromUser;
  46. vm.toUser = chatMessageDTO.toUser;
  47. vm.messageTime = chatMessageDTO.messageTime;
  48. vm.message = this.encryptionService.decrypt(passphrase, chatMessageDTO.messageCipher) as string;
  49. return vm;
  50. }
  51. private static async getAllMessagesAjax(toUser: string): Promise<any> {
  52. const headers = new Headers();
  53. if (JsonAPI.authToken == null) {
  54. log.error("authToken null");
  55. return;
  56. };
  57. headers.append('X-AUTH-TOKEN', JsonAPI.authToken);
  58. const response = await fetch(`${JsonAPI.CHAT_MESSAGES_GET}/${toUser}`, {
  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 getNewMessagesAjax(toUser: string, lastMessageTimeStamp: string): 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 response = await fetch(`${JsonAPI.CHAT_MESSAGES_GET}/${toUser}/${lastMessageTimeStamp}`, {
  77. method: 'GET',
  78. headers: headers
  79. });
  80. console.log(response.clone());
  81. if (fetchErrorHandler(response.clone())) {
  82. return null;
  83. }
  84. const data: Promise<any> = await response.json();
  85. return data;
  86. }
  87. }