messenger.service.ts 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import { ReportDataService } from "./reportData.service";
  2. import { Report, Messenger } from "../types";
  3. class ReportCreatedMessenger implements Messenger {
  4. deliveryMessage(report: Report, user: string): void {
  5. console.log(`A new report with id ${report.id} was created by the user ${user}`);
  6. }
  7. }
  8. class ReportApprovedMessenger implements Messenger {
  9. deliveryMessage(report: Report) {
  10. console.log(`The report id: ${report.id} is now ${report.approved ? 'approved' : 'rejected'}`);
  11. }
  12. }
  13. class ReportRejectMessenger implements Messenger {
  14. // "noUnusedParameters" doesn't complain about parameters named "_*"
  15. deliveryMessage(_report: Report, user: string) {
  16. console.log(`The user ${user} has reject one of your reports`);
  17. }
  18. }
  19. type MessengerEventsHandled =
  20. 'MessengerReportCreated' |
  21. 'MessengerReportApproved' |
  22. 'MessengerReportRejected';
  23. function getMessenger(event: MessengerEventsHandled): Messenger {
  24. switch (event) {
  25. case 'MessengerReportCreated':
  26. return new ReportCreatedMessenger();
  27. case 'MessengerReportApproved':
  28. return new ReportApprovedMessenger();
  29. case 'MessengerReportRejected':
  30. return new ReportRejectMessenger();
  31. // No need for a default: all cases possible based on the type are
  32. // covered. This is called "exhaustive check".
  33. }
  34. }
  35. export class MessengerWatcher {
  36. constructor(private ReportDataService: ReportDataService) { }
  37. watch() {
  38. this
  39. .ReportDataService
  40. .reportCreated
  41. .subscribe(report => getMessenger('MessengerReportCreated')
  42. .deliveryMessage(report, 'someUser'));
  43. this
  44. .ReportDataService
  45. .reportApprovedReject
  46. .subscribe(({ report, user }) => {
  47. const eventType = report.approved ?
  48. 'MessengerReportApproved' :
  49. 'MessengerReportRejected';
  50. getMessenger(eventType)
  51. .deliveryMessage(report, user);
  52. });
  53. }
  54. }