@amityco/ts-sdk 0.0.1-beta.37 → 0.0.1-beta.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/.eslintrc.json +3 -5
  2. package/dist/@types/core/events.d.ts +1 -0
  3. package/dist/@types/core/events.d.ts.map +1 -1
  4. package/dist/@types/core/model.d.ts +2 -0
  5. package/dist/@types/core/model.d.ts.map +1 -1
  6. package/dist/@types/domains/category.d.ts +7 -0
  7. package/dist/@types/domains/category.d.ts.map +1 -1
  8. package/dist/@types/domains/channel.d.ts +2 -2
  9. package/dist/@types/domains/channel.d.ts.map +1 -1
  10. package/dist/@types/domains/community.d.ts +12 -0
  11. package/dist/@types/domains/community.d.ts.map +1 -1
  12. package/dist/@types/domains/feed.d.ts +1 -2
  13. package/dist/@types/domains/feed.d.ts.map +1 -1
  14. package/dist/@types/domains/message.d.ts +1 -1
  15. package/dist/@types/domains/message.d.ts.map +1 -1
  16. package/dist/@types/domains/post.d.ts +1 -1
  17. package/dist/@types/domains/post.d.ts.map +1 -1
  18. package/dist/@types/domains/user.d.ts +8 -0
  19. package/dist/@types/domains/user.d.ts.map +1 -1
  20. package/dist/@types/global.d.ts +5 -0
  21. package/dist/@types/global.d.ts.map +1 -1
  22. package/dist/category/api/queryCategories.d.ts +1 -5
  23. package/dist/category/api/queryCategories.d.ts.map +1 -1
  24. package/dist/category/observers/index.d.ts +2 -0
  25. package/dist/category/observers/index.d.ts.map +1 -0
  26. package/dist/category/observers/liveCategories.d.ts +18 -0
  27. package/dist/category/observers/liveCategories.d.ts.map +1 -0
  28. package/dist/category/observers/tests/liveCategories.test.d.ts +2 -0
  29. package/dist/category/observers/tests/liveCategories.test.d.ts.map +1 -0
  30. package/dist/channel/api/tests/getChannels.test.d.ts +2 -0
  31. package/dist/channel/api/tests/getChannels.test.d.ts.map +1 -0
  32. package/dist/channel/api/tests/leaveChannel.test.d.ts +2 -0
  33. package/dist/channel/api/tests/leaveChannel.test.d.ts.map +1 -0
  34. package/dist/channel/observers/liveChannel.d.ts.map +1 -1
  35. package/dist/channel/observers/liveChannels.d.ts.map +1 -1
  36. package/dist/client/api/accessTokenExpiryWatcher.d.ts +4 -1
  37. package/dist/client/api/accessTokenExpiryWatcher.d.ts.map +1 -1
  38. package/dist/client/api/connectClient.d.ts.map +1 -1
  39. package/dist/client/api/getToken.d.ts +3 -1
  40. package/dist/client/api/getToken.d.ts.map +1 -1
  41. package/dist/client/utils/setClientToken.d.ts +3 -3
  42. package/dist/comment/api/deleteComment.d.ts.map +1 -1
  43. package/dist/comment/api/getComment.d.ts.map +1 -1
  44. package/dist/comment/observers/index.d.ts +1 -0
  45. package/dist/comment/observers/index.d.ts.map +1 -1
  46. package/dist/comment/observers/liveComment.d.ts +21 -0
  47. package/dist/comment/observers/liveComment.d.ts.map +1 -0
  48. package/dist/comment/observers/tests/liveComment.test.d.ts +2 -0
  49. package/dist/comment/observers/tests/liveComment.test.d.ts.map +1 -0
  50. package/dist/community/api/queryCommunities.d.ts +1 -10
  51. package/dist/community/api/queryCommunities.d.ts.map +1 -1
  52. package/dist/community/events/index.d.ts +1 -0
  53. package/dist/community/events/index.d.ts.map +1 -1
  54. package/dist/community/events/onCommunityUserChanged.d.ts +17 -0
  55. package/dist/community/events/onCommunityUserChanged.d.ts.map +1 -0
  56. package/dist/community/events/utils.d.ts +1 -0
  57. package/dist/community/events/utils.d.ts.map +1 -1
  58. package/dist/community/observers/index.d.ts +1 -0
  59. package/dist/community/observers/index.d.ts.map +1 -1
  60. package/dist/community/observers/liveCommunities.d.ts +20 -0
  61. package/dist/community/observers/liveCommunities.d.ts.map +1 -0
  62. package/dist/community/observers/tests/liveCommunities.test.d.ts +2 -0
  63. package/dist/community/observers/tests/liveCommunities.test.d.ts.map +1 -0
  64. package/dist/core/events.d.ts +3 -3
  65. package/dist/core/events.d.ts.map +1 -1
  66. package/dist/core/model/idResolvers.d.ts.map +1 -1
  67. package/dist/core/model/identifyModel.d.ts.map +1 -1
  68. package/dist/core/model/index.d.ts.map +1 -1
  69. package/dist/core/query/filtering.d.ts +10 -0
  70. package/dist/core/query/filtering.d.ts.map +1 -1
  71. package/dist/core/query/paging.d.ts +2 -2
  72. package/dist/core/query/paging.d.ts.map +1 -1
  73. package/dist/core/query/sorting.d.ts +6 -0
  74. package/dist/core/query/sorting.d.ts.map +1 -1
  75. package/dist/core/query/tests/paging.test.d.ts +2 -0
  76. package/dist/core/query/tests/paging.test.d.ts.map +1 -0
  77. package/dist/core/transports/http.d.ts +0 -5
  78. package/dist/core/transports/http.d.ts.map +1 -1
  79. package/dist/file/api/test/createImage.test.d.ts +2 -0
  80. package/dist/file/api/test/createImage.test.d.ts.map +1 -0
  81. package/dist/file/api/test/createVideo.test.d.ts +2 -0
  82. package/dist/file/api/test/createVideo.test.d.ts.map +1 -0
  83. package/dist/index.cjs.js +607 -252
  84. package/dist/index.d.ts +1 -0
  85. package/dist/index.d.ts.map +1 -1
  86. package/dist/index.esm.js +599 -251
  87. package/dist/index.umd.js +4 -4
  88. package/dist/message/api/queryMessages.d.ts +2 -2
  89. package/dist/message/api/queryMessages.d.ts.map +1 -1
  90. package/dist/message/observers/liveMessage.d.ts.map +1 -1
  91. package/dist/post/observers/index.d.ts +1 -0
  92. package/dist/post/observers/index.d.ts.map +1 -1
  93. package/dist/post/observers/livePost.d.ts +21 -0
  94. package/dist/post/observers/livePost.d.ts.map +1 -0
  95. package/dist/post/observers/livePosts.d.ts +2 -2
  96. package/dist/post/observers/livePosts.d.ts.map +1 -1
  97. package/dist/post/observers/tests/livePost.test.d.ts +2 -0
  98. package/dist/post/observers/tests/livePost.test.d.ts.map +1 -0
  99. package/dist/report/api/createReport.d.ts.map +1 -1
  100. package/dist/report/api/deleteReport.d.ts.map +1 -1
  101. package/dist/report/api/tests/createReport.test.d.ts +2 -0
  102. package/dist/report/api/tests/createReport.test.d.ts.map +1 -0
  103. package/dist/report/api/tests/deleteReport.test.d.ts +2 -0
  104. package/dist/report/api/tests/deleteReport.test.d.ts.map +1 -0
  105. package/dist/subChannel/api/tests/deleteSubChannel.test.d.ts +2 -0
  106. package/dist/subChannel/api/tests/deleteSubChannel.test.d.ts.map +1 -0
  107. package/dist/subChannel/api/tests/getSubChannel.test.d.ts +2 -0
  108. package/dist/subChannel/api/tests/getSubChannel.test.d.ts.map +1 -0
  109. package/dist/subChannel/api/tests/getSubChannels.test.d.ts +2 -0
  110. package/dist/subChannel/api/tests/getSubChannels.test.d.ts.map +1 -0
  111. package/dist/subChannel/api/tests/updateSubChannel.test.d.ts +2 -0
  112. package/dist/subChannel/api/tests/updateSubChannel.test.d.ts.map +1 -0
  113. package/dist/subChannel/observers/liveSubChannel.d.ts.map +1 -1
  114. package/dist/user/api/queryUsers.d.ts +1 -6
  115. package/dist/user/api/queryUsers.d.ts.map +1 -1
  116. package/dist/user/api/tests/updateUser.test.d.ts +2 -0
  117. package/dist/user/api/tests/updateUser.test.d.ts.map +1 -0
  118. package/dist/user/observers/index.d.ts +1 -0
  119. package/dist/user/observers/index.d.ts.map +1 -1
  120. package/dist/user/observers/liveUser.d.ts.map +1 -1
  121. package/dist/user/observers/liveUsers.d.ts +18 -0
  122. package/dist/user/observers/liveUsers.d.ts.map +1 -0
  123. package/dist/user/observers/tests/liveUsers.test.d.ts +2 -0
  124. package/dist/user/observers/tests/liveUsers.test.d.ts.map +1 -0
  125. package/dist/utils/liveObject.d.ts +2 -0
  126. package/dist/utils/liveObject.d.ts.map +1 -0
  127. package/dist/utils/tests/dummy/category.d.ts +64 -0
  128. package/dist/utils/tests/dummy/category.d.ts.map +1 -0
  129. package/dist/utils/tests/dummy/channel.d.ts +50 -0
  130. package/dist/utils/tests/dummy/channel.d.ts.map +1 -1
  131. package/dist/utils/tests/dummy/community.d.ts +132 -0
  132. package/dist/utils/tests/dummy/community.d.ts.map +1 -1
  133. package/dist/utils/tests/dummy/feed.d.ts +21 -0
  134. package/dist/utils/tests/dummy/feed.d.ts.map +1 -0
  135. package/dist/utils/tests/dummy/file.d.ts +3 -0
  136. package/dist/utils/tests/dummy/file.d.ts.map +1 -1
  137. package/dist/utils/tests/dummy/index.d.ts +2 -0
  138. package/dist/utils/tests/dummy/index.d.ts.map +1 -1
  139. package/dist/utils/tests/dummy/post.d.ts +11 -0
  140. package/dist/utils/tests/dummy/post.d.ts.map +1 -1
  141. package/dist/utils/tests/dummy/subChannel.d.ts +0 -20
  142. package/dist/utils/tests/dummy/subChannel.d.ts.map +1 -1
  143. package/dist/utils/tests/dummy/user.d.ts +81 -0
  144. package/dist/utils/tests/dummy/user.d.ts.map +1 -1
  145. package/dist/utils/tests/liveObject.test.d.ts +2 -0
  146. package/dist/utils/tests/liveObject.test.d.ts.map +1 -0
  147. package/package.json +4 -4
  148. package/src/@types/core/events.ts +1 -0
  149. package/src/@types/core/model.ts +4 -0
  150. package/src/@types/domains/category.ts +13 -0
  151. package/src/@types/domains/channel.ts +2 -2
  152. package/src/@types/domains/community.ts +25 -0
  153. package/src/@types/domains/feed.ts +1 -3
  154. package/src/@types/domains/message.ts +4 -1
  155. package/src/@types/domains/post.ts +1 -1
  156. package/src/@types/domains/user.ts +14 -0
  157. package/src/@types/global.ts +5 -0
  158. package/src/cache/api/tests/ingestInCache.test.ts +2 -0
  159. package/src/category/api/queryCategories.ts +3 -5
  160. package/src/category/observers/index.ts +1 -0
  161. package/src/category/observers/liveCategories.ts +141 -0
  162. package/src/category/observers/tests/liveCategories.test.ts +147 -0
  163. package/src/channel/api/tests/createChannel.test.ts +30 -6
  164. package/src/channel/api/tests/getChannel.test.ts +3 -1
  165. package/src/channel/api/tests/getChannels.test.ts +97 -0
  166. package/src/channel/api/tests/joinChannel.test.ts +62 -3
  167. package/src/channel/api/tests/leaveChannel.test.ts +90 -0
  168. package/src/channel/api/tests/queryChannels.test.ts +38 -1
  169. package/src/channel/observers/liveChannel.ts +8 -80
  170. package/src/channel/observers/liveChannels.ts +29 -24
  171. package/src/client/api/accessTokenExpiryWatcher.ts +7 -5
  172. package/src/client/api/connectClient.ts +0 -2
  173. package/src/client/api/tests/accessTokenExpiryWatcher.test.ts +8 -5
  174. package/src/comment/api/deleteComment.ts +5 -5
  175. package/src/comment/api/getComment.ts +8 -3
  176. package/src/comment/observers/index.ts +1 -0
  177. package/src/comment/observers/liveComment.ts +43 -0
  178. package/src/comment/observers/tests/liveComment.test.ts +95 -0
  179. package/src/community/api/queryCommunities.ts +3 -10
  180. package/src/community/api/test/addCommunityMember.test.ts +14 -2
  181. package/src/community/api/test/joinCommunity.test.ts +14 -2
  182. package/src/community/api/test/leaveCommunity.test.ts +11 -1
  183. package/src/community/api/test/removeCommunityMembers.test.ts +11 -1
  184. package/src/community/events/index.ts +1 -0
  185. package/src/community/events/onCommunityUserChanged.ts +20 -0
  186. package/src/community/events/test/onCommunityJoined.test.ts +1 -1
  187. package/src/community/events/test/onCommunityUserAdded.test.ts +1 -1
  188. package/src/community/events/test/onCommunityUserBanned.test.ts +1 -1
  189. package/src/community/events/test/onCommunityUserUnbaned.test.ts +1 -1
  190. package/src/community/events/test/utils.test.ts +52 -3
  191. package/src/community/events/utils.ts +49 -0
  192. package/src/community/observers/index.ts +1 -0
  193. package/src/community/observers/liveCommunities.ts +188 -0
  194. package/src/community/observers/tests/liveCommunities.test.ts +284 -0
  195. package/src/core/model/idResolvers.ts +2 -0
  196. package/src/core/model/identifyModel.ts +1 -0
  197. package/src/core/model/index.ts +2 -0
  198. package/src/core/query/filtering.ts +33 -3
  199. package/src/core/query/paging.ts +5 -4
  200. package/src/core/query/sorting.ts +8 -0
  201. package/src/core/query/tests/paging.test.ts +66 -0
  202. package/src/core/transports/http.ts +17 -13
  203. package/src/core/transports/test/http.test.ts +49 -60
  204. package/src/file/api/createFile.ts +1 -1
  205. package/src/file/api/createImage.ts +1 -1
  206. package/src/file/api/createVideo.ts +1 -1
  207. package/src/file/api/test/createImage.test.ts +69 -0
  208. package/src/file/api/test/createVideo.test.ts +81 -0
  209. package/src/index.ts +1 -0
  210. package/src/message/api/queryMessages.ts +7 -7
  211. package/src/message/api/tests/queryMessages.test.ts +6 -6
  212. package/src/message/observers/liveMessage.ts +11 -83
  213. package/src/message/tests/observers/liveMessage.test.ts +1 -143
  214. package/src/message/tests/observers/liveMessages.test.ts +4 -4
  215. package/src/post/observers/index.ts +1 -0
  216. package/src/post/observers/livePost.ts +47 -0
  217. package/src/post/observers/livePosts.ts +14 -22
  218. package/src/post/observers/tests/livePost.test.ts +97 -0
  219. package/src/post/observers/tests/livePosts.test.ts +65 -8
  220. package/src/report/api/createReport.ts +1 -6
  221. package/src/report/api/deleteReport.ts +2 -6
  222. package/src/report/api/tests/createReport.test.ts +93 -0
  223. package/src/report/api/tests/deleteReport.test.ts +93 -0
  224. package/src/stream/api/tests/createStream.test.ts +3 -11
  225. package/src/stream/api/tests/deleteStream.test.ts +5 -3
  226. package/src/subChannel/api/tests/createSubChannel.test.ts +21 -14
  227. package/src/subChannel/api/tests/deleteSubChannel.test.ts +112 -0
  228. package/src/subChannel/api/tests/getSubChannel.test.ts +97 -0
  229. package/src/subChannel/api/tests/getSubChannels.test.ts +97 -0
  230. package/src/subChannel/api/tests/updateSubChannel.test.ts +86 -0
  231. package/src/subChannel/observers/liveSubChannel.ts +6 -56
  232. package/src/subChannel/observers/tests/liveSubChannel.test.ts +0 -82
  233. package/src/user/api/queryUsers.ts +1 -6
  234. package/src/user/api/tests/updateUser.test.ts +60 -0
  235. package/src/user/observers/index.ts +1 -0
  236. package/src/user/observers/liveUser.ts +9 -61
  237. package/src/user/observers/liveUsers.ts +162 -0
  238. package/src/user/observers/tests/liveUsers.test.ts +202 -0
  239. package/src/user/tests/observers/liveUser.test.ts +1 -154
  240. package/src/utils/liveObject.ts +86 -0
  241. package/src/utils/tests/dummy/category.ts +57 -0
  242. package/src/utils/tests/dummy/channel.ts +52 -1
  243. package/src/utils/tests/dummy/community.ts +94 -0
  244. package/src/utils/tests/dummy/feed.ts +13 -0
  245. package/src/utils/tests/dummy/file.ts +32 -0
  246. package/src/utils/tests/dummy/index.ts +3 -0
  247. package/src/utils/tests/dummy/post.ts +62 -47
  248. package/src/utils/tests/dummy/stream.ts +73 -73
  249. package/src/utils/tests/dummy/subChannel.ts +0 -22
  250. package/src/utils/tests/dummy/user.ts +57 -0
  251. package/src/utils/tests/liveObject.test.ts +172 -0
@@ -1,9 +1,6 @@
1
1
  import { ASCApiError } from '~/core/errors';
2
2
  import { disableCache, enableCache } from '~/cache/api';
3
- import {
4
- LIVE_OBJECT_ENABLE_CACHE_MESSAGE,
5
- UNSYNCED_OBJECT_CACHED_AT_MESSAGE,
6
- } from '~/utils/constants';
3
+ import { UNSYNCED_OBJECT_CACHED_AT_MESSAGE } from '~/utils/constants';
7
4
  import { pause, client, connectClient, disconnectClient, generateRawMessage } from '~/utils/tests';
8
5
  import { getFutureDate } from '~/core/model';
9
6
  import { convertFromRaw } from '../../utils';
@@ -37,145 +34,6 @@ describe('liveMessage', () => {
37
34
 
38
35
  afterEach(disableCache);
39
36
 
40
- test('it should show message if cache not enabled', () => {
41
- /*
42
- * NOTE: at the time of writing this test cache is diabled by default, but
43
- * there is a proposal to enable cache by default. So I'm disabling cache
44
- * here to ensure cache is disabled
45
- */
46
- disableCache();
47
-
48
- const callback = jest.fn();
49
- jest.spyOn(global.console, 'log');
50
- client.http.get = jest.fn();
51
-
52
- // call liveMessage check if mocked console get's called with the correct
53
- // message
54
- client.use();
55
- liveMessage(message.messageId, callback);
56
-
57
- expect(console.log).toBeCalledWith(LIVE_OBJECT_ENABLE_CACHE_MESSAGE);
58
- });
59
-
60
- test('it should return message live object', async () => {
61
- const snapshot = getSnapshot();
62
-
63
- // mock response of queryMessages and validate
64
- const callback = jest.fn();
65
- client.http.get = jest.fn().mockResolvedValue(messageQueryResponseRaw);
66
-
67
- liveMessage(message.messageId, callback);
68
-
69
- expect(callback).toHaveBeenCalledTimes(1);
70
-
71
- // check if cache data returned (should be empty)
72
- expect(callback).toHaveBeenCalledWith(expect.objectContaining(snapshot));
73
-
74
- await pause();
75
-
76
- expect(callback).toHaveBeenCalledTimes(2);
77
-
78
- snapshot.loading = false;
79
- snapshot.data = message;
80
-
81
- expect(callback).toHaveBeenCalledWith(expect.objectContaining(snapshot));
82
- });
83
-
84
- test('it should return error on api failure', async () => {
85
- const snapshot = getSnapshot();
86
- const error = new ASCApiError(
87
- 'server error!',
88
- Amity.ServerError.ITEM_NOT_FOUND,
89
- Amity.ErrorLevel.ERROR,
90
- );
91
-
92
- // mock response of queryMessages and validate
93
- const callback = jest.fn();
94
- client.http.get = jest.fn().mockRejectedValue(error);
95
-
96
- liveMessage(message.messageId, callback);
97
-
98
- expect(callback).toHaveBeenCalledTimes(1);
99
-
100
- // check if cache data returned (should be empty)
101
- expect(callback).toHaveBeenCalledWith(expect.objectContaining(snapshot));
102
-
103
- await pause();
104
-
105
- expect(callback).toHaveBeenCalledTimes(2);
106
-
107
- snapshot.error = error;
108
- snapshot.loading = false;
109
- expect(callback).toHaveBeenLastCalledWith(expect.objectContaining(snapshot));
110
- });
111
-
112
- test('it should terminate updates on api failure', async () => {
113
- const snapshot = getSnapshot();
114
- const error = new ASCApiError(
115
- 'server error!',
116
- Amity.ServerError.ITEM_NOT_FOUND,
117
- Amity.ErrorLevel.ERROR,
118
- );
119
-
120
- // mock response of queryMessages and validate
121
- const callback = jest.fn();
122
- client.http.get = jest.fn().mockRejectedValue(error);
123
-
124
- liveMessage(message.messageId, callback);
125
-
126
- expect(callback).toHaveBeenCalledTimes(1);
127
-
128
- // check if cache data returned (should be empty)
129
- expect(callback).toHaveBeenCalledWith(expect.objectContaining(snapshot));
130
-
131
- await pause();
132
-
133
- expect(callback).toHaveBeenCalledTimes(2);
134
-
135
- snapshot.error = error;
136
- snapshot.loading = false;
137
- expect(callback).toHaveBeenLastCalledWith(expect.objectContaining(snapshot));
138
-
139
- const rawUpdatedMessage = { ...rawMessage, updatedAt: getFutureDate(rawMessage.updatedAt) };
140
- const updatedMessage = convertFromRaw(rawUpdatedMessage);
141
- client.emitter.emit('message.updated', { messages: [rawUpdatedMessage] });
142
-
143
- delete snapshot.error;
144
- snapshot.loading = false;
145
- snapshot.data = updatedMessage;
146
- expect(callback).not.toHaveBeenNthCalledWith(3, expect.objectContaining(snapshot));
147
- });
148
-
149
- test('it should not return updates on obtain once!', async () => {
150
- const snapshot = getSnapshot();
151
-
152
- // mock response of queryMessages and validate
153
- const callback = jest.fn();
154
- client.http.get = jest.fn().mockResolvedValue(messageQueryResponseRaw);
155
-
156
- const unsub = liveMessage(message.messageId, callback);
157
-
158
- expect(callback).toHaveBeenCalledTimes(1);
159
-
160
- // check if cache data returned (should be empty)
161
- expect(callback).toHaveBeenCalledWith(expect.objectContaining(snapshot));
162
-
163
- await pause();
164
-
165
- expect(callback).toHaveBeenCalledTimes(2);
166
-
167
- unsub();
168
-
169
- const rawUpdatedMessage = { ...rawMessage, updatedAt: getFutureDate(rawMessage.updatedAt) };
170
- const updatedMessage = convertFromRaw(rawUpdatedMessage);
171
- client.emitter.emit('message.updated', { messages: [rawUpdatedMessage] });
172
-
173
- delete snapshot.error;
174
- snapshot.loading = false;
175
- snapshot.data = updatedMessage;
176
- expect(callback).not.toHaveBeenNthCalledWith(3, expect.objectContaining(snapshot));
177
- });
178
-
179
37
  const events: [string, keyof Amity.Events][] = [
180
38
  ['it should return updated message on onFetch', 'local.message.fetched'],
181
39
  ['it should return updated message on onUpdate', 'message.updated'],
@@ -182,8 +182,8 @@ describe('liveMessages', () => {
182
182
  data: {
183
183
  messages: returnValue,
184
184
  paging: {
185
- previous: 'eyJiZWZvcmUiOjU1LCJsYXN0IjoxMH0=',
186
- next: 'eyJiZWZvcmUiOjU1LCJsYXN0IjoxMH0=',
185
+ previous: 'eyJsaW1pdCI6MiwiYmVmb3JlIjo2MzQ3MTYxNDM5MTExMTAwMDAwMH0',
186
+ next: 'eyJsaW1pdCI6MiwiYmVmb3JlIjo2MzQ3MTYxNDM5MTExMTAwMDAwMH0',
187
187
  },
188
188
  },
189
189
  })
@@ -191,8 +191,8 @@ describe('liveMessages', () => {
191
191
  data: {
192
192
  messages: returnValue2,
193
193
  paging: {
194
- previous: 'eyJiZWZvcmUiOjU1LCJsYXN0IjoxMH0=',
195
- next: 'eyJiZWZvcmUiOjU1LCJsYXN0IjoxMH0=',
194
+ previous: 'eyJsaW1pdCI6MiwiYmVmb3JlIjo2MzQ3MTYxNDM5MTExMTAwMDAwMH0',
195
+ next: 'eyJsaW1pdCI6MiwiYmVmb3JlIjo2MzQ3MTYxNDM5MTExMTAwMDAwMH0',
196
196
  },
197
197
  },
198
198
  });
@@ -1,3 +1,4 @@
1
1
  export * from './observePosts';
2
2
  export * from './observePost';
3
+ export * from './livePost';
3
4
  export * from './livePosts';
@@ -0,0 +1,47 @@
1
+ import { liveObject } from '~/utils/liveObject';
2
+ import { getPost } from '../api';
3
+ import {
4
+ onPostApproved,
5
+ onPostDeclined,
6
+ onPostDeleted,
7
+ onPostFlagged,
8
+ onPostReactionAdded,
9
+ onPostReactionRemoved,
10
+ onPostUnflagged,
11
+ onPostUpdated,
12
+ } from '../events';
13
+
14
+ /**
15
+ * ```js
16
+ * import { livePost } from '@amityco/ts-sdk';
17
+ *
18
+ * let post;
19
+ *
20
+ * const unsubscribe = livePost(postId, response => {
21
+ * post = response.data;
22
+ * });
23
+ * ```
24
+ *
25
+ * Observe all mutation on a given {@link Amity.Post}
26
+ *
27
+ * @param postId the ID of the message to observe
28
+ * @param callback the function to call when new data are available
29
+ * @returns An {@link Amity.Unsubscriber} function to run when willing to stop observing the sub channel
30
+ *
31
+ * @category Post Live Object
32
+ */
33
+ export const livePost = (
34
+ postId: Amity.Post['postId'],
35
+ callback: Amity.LiveObjectCallback<Amity.Post>,
36
+ ): Amity.Unsubscriber => {
37
+ return liveObject(postId, callback, 'postId', getPost, [
38
+ onPostApproved,
39
+ onPostDeclined,
40
+ onPostDeleted,
41
+ onPostFlagged,
42
+ onPostReactionAdded,
43
+ onPostReactionRemoved,
44
+ onPostUnflagged,
45
+ onPostUpdated,
46
+ ]);
47
+ };
@@ -7,6 +7,7 @@ import {
7
7
  runQuery,
8
8
  queryOptions,
9
9
  filterByPropEquality,
10
+ filterByFeedType,
10
11
  sortByFirstCreated,
11
12
  sortByLastCreated,
12
13
  } from '~/core/query';
@@ -43,8 +44,8 @@ import { queryPosts } from '../api';
43
44
  *
44
45
  * Observe all mutations on a list of {@link Amity.Post} for a given target object
45
46
  *
46
- * @param targetType the type of the target
47
- * @param targetId the ID of the target
47
+ * @param param.targetType the type of the target
48
+ * @param param.targetId the ID of the target
48
49
  * @param callback the function to call when new data are available
49
50
  * @returns An {@link Amity.Unsubscriber} function to run when willing to stop observing the messages
50
51
  *
@@ -86,13 +87,16 @@ export const livePosts = (
86
87
  posts = filterByPropEquality(posts, 'isDeleted', params.isDeleted);
87
88
 
88
89
  const sortBy = params.sortBy ? params.sortBy : 'lastCreated';
89
-
90
90
  posts = posts.sort(sortBy === 'lastCreated' ? sortByLastCreated : sortByFirstCreated);
91
91
 
92
92
  if (params.tags) {
93
93
  posts = posts.filter(p => p.tags?.some(t => params.tags?.includes(t)));
94
94
  }
95
95
 
96
+ if (params.targetType === 'community' && params.feedType) {
97
+ posts = filterByFeedType(posts, params.feedType);
98
+ }
99
+
96
100
  callback({
97
101
  onNextPage: onFetch,
98
102
  data: posts,
@@ -108,27 +112,15 @@ export const livePosts = (
108
112
  if (params.targetId !== post.targetId || params.targetType !== post.targetType || !collection)
109
113
  return;
110
114
 
111
- if (['onCreate', 'onApproved'].includes(action)) {
112
- collection.data = [...new Set([post.postId, ...collection.data])];
113
- } else if (['onDelete', 'onDeclined'].includes(action)) {
114
- collection.data = collection.data.filter(p => p !== post.postId);
115
-
116
- /*
117
- * if isDeleted is true, collection should add deleted items to the
118
- * begining of the collection
119
- */
120
- if (params.isDeleted) collection.data.unshift(post.postId);
121
- }
122
-
123
115
  /*
124
- * FIX-ME
125
- * This is a shortcoming as the feed object is not saved to the cache.
126
- * The responder should pull the feed from cache once available and should
127
- * match the collection to feedType param
128
- * https://ekoapp.atlassian.net/browse/ASC-9382
116
+ * This is not ideal, but currently this is the only way to update the
117
+ * collection on post declined
129
118
  */
130
- if (params.feedType === 'reviewing' && action === 'onApproved')
131
- collection.data = collection.data.filter(p => p !== post.postId);
119
+ if (action === 'onDeclined') {
120
+ collection.data = collection.data.filter(postId => postId !== post.postId);
121
+ } else {
122
+ collection.data = [...new Set([post.postId, ...collection.data])];
123
+ }
132
124
 
133
125
  pushToCache(cacheKey, collection);
134
126
 
@@ -0,0 +1,97 @@
1
+ import { disableCache, enableCache } from '~/cache/api';
2
+ import {
3
+ pause,
4
+ client,
5
+ connectClient,
6
+ disconnectClient,
7
+ generatePost,
8
+ user12,
9
+ } from '~/utils/tests';
10
+ import { getFutureDate } from '~/core/model';
11
+ import { livePost } from '../livePost';
12
+
13
+ describe('livePost', () => {
14
+ const post = generatePost();
15
+ const response = { data: { posts: [post] } };
16
+
17
+ beforeAll(async () => {
18
+ await connectClient();
19
+ });
20
+
21
+ afterAll(async () => {
22
+ await disconnectClient();
23
+ });
24
+
25
+ beforeEach(enableCache);
26
+
27
+ afterEach(disableCache);
28
+
29
+ const events: [string, keyof Amity.MqttPostEvents][] = [
30
+ ['should get update on post.updated event', 'post.updated'],
31
+ ['should get update on post.deleted event', 'post.deleted'],
32
+ ['should get update on post.approved event', 'post.approved'],
33
+ ['should get update on post.declined event', 'post.declined'],
34
+ ['should get update on post.flagged event', 'post.flagged'],
35
+ ['should get update on post.unflagged event', 'post.unflagged'],
36
+ ];
37
+
38
+ test.each(events)('%s', async (test, event) => {
39
+ const update = {
40
+ ...post,
41
+ data: { text: 'new-text' },
42
+ updatedAt: getFutureDate(post.updatedAt),
43
+ };
44
+
45
+ const callback = jest.fn();
46
+ client.http.get = jest.fn().mockResolvedValue(response);
47
+
48
+ livePost(post.postId, callback);
49
+ await pause();
50
+ client.emitter.emit(event, { posts: [update] });
51
+ await pause();
52
+
53
+ expect(callback).toHaveBeenCalledTimes(3);
54
+ expect(callback).toHaveBeenNthCalledWith(
55
+ 3,
56
+ expect.objectContaining({
57
+ data: update,
58
+ loading: false,
59
+ }),
60
+ );
61
+ });
62
+
63
+ test.each([
64
+ ['should get update on post.addReaction event', 'post.addReaction'],
65
+ ['should get update on post.removeReaction event', 'post.removeReaction'],
66
+ ] as [string, keyof Amity.MqttPostEvents][])('%s', async (test, event) => {
67
+ const update = {
68
+ ...post,
69
+ data: { text: 'new-text' },
70
+ updatedAt: getFutureDate(post.updatedAt),
71
+ };
72
+ const reactor: Amity.Reaction = {
73
+ createdAt: getFutureDate(post.updatedAt),
74
+ reactionId: 'like',
75
+ reactionName: 'like',
76
+ referenceId: post.postId,
77
+ referenceType: 'post',
78
+ userId: user12.userId,
79
+ };
80
+ const callback = jest.fn();
81
+ client.http.get = jest.fn().mockResolvedValue(response);
82
+
83
+ livePost(post.postId, callback);
84
+ await pause();
85
+ client.emitter.emit(event, { posts: [update], reactor });
86
+ await pause();
87
+
88
+ expect(callback).toHaveBeenCalledTimes(3);
89
+ expect(callback).toHaveBeenNthCalledWith(
90
+ 3,
91
+ expect.objectContaining({
92
+ data: update,
93
+ loading: false,
94
+ }),
95
+ );
96
+ });
97
+ });
@@ -6,6 +6,7 @@ import {
6
6
  connectClient,
7
7
  disconnectClient,
8
8
  post11,
9
+ post14,
9
10
  postQueryResponse,
10
11
  postQueryResponsePage2,
11
12
  } from '~/utils/tests';
@@ -133,23 +134,30 @@ describe('livePosts', () => {
133
134
  expect(callback).toHaveBeenNthCalledWith(4, expect.objectContaining(snapshot));
134
135
  });
135
136
 
136
- const events: [string, keyof Amity.Events, Amity.Post][] = [
137
+ const events: [string, keyof Amity.Events, Amity.Post, Amity.PostLiveCollection][] = [
137
138
  [
138
139
  'it should add new post to collection onCreate',
139
140
  'post.created',
140
141
  { ...post11, postId: 'new-post-id' },
142
+ params,
141
143
  ],
142
- ['it should edit post in collection onUpdate', 'post.updated', post11],
144
+ ['it should edit post in collection onUpdate', 'post.updated', post11, params],
143
145
  [
144
146
  'it should update post in collection onApproved',
145
147
  'post.approved',
146
148
  { ...post11, postId: 'approved-post-id' },
149
+ params,
147
150
  ],
148
- ['it should remove post in collection onDelete', 'post.deleted', post11],
149
- ['it should remove post in collection onDeclined', 'post.declined', post11],
151
+ [
152
+ 'it should remove post in collection onDelete',
153
+ 'post.deleted',
154
+ { ...post11, isDeleted: true },
155
+ { ...params, isDeleted: false },
156
+ ],
157
+ ['it should remove post in collection onDeclined', 'post.declined', post11, params],
150
158
  ];
151
159
 
152
- test.each(events)('%s', async (test, event, post) => {
160
+ test.each(events)('%s', async (test, event, post, params) => {
153
161
  const snapshot = getSnapshot();
154
162
 
155
163
  const callback = jest.fn();
@@ -165,7 +173,7 @@ describe('livePosts', () => {
165
173
  });
166
174
 
167
175
  const payload = postQueryResponse.data;
168
- const deletePayload = payload.posts.filter(post => post.postId !== post11.postId);
176
+ const deletePayload = payload.posts.filter(p => p.postId !== post.postId);
169
177
 
170
178
  snapshot.loading = false;
171
179
  // get data based on event
@@ -277,11 +285,51 @@ describe('livePosts', () => {
277
285
  });
278
286
 
279
287
  test('it should remove approved post when feedtype reviewing', async () => {
280
- const approvedPost = post11;
288
+ const feedId = 'publishedFeed';
289
+ const approvedPost = { ...post14, feedId };
290
+
291
+ const callback = jest.fn();
292
+ client.http.get = jest.fn().mockResolvedValue(postQueryResponsePage2);
293
+
294
+ livePosts({ ...params, targetType: 'community', feedType: 'reviewing' }, callback);
295
+
296
+ await pause();
297
+ const payload = postQueryResponsePage2.data.posts;
298
+ const snapshot = getSnapshot();
299
+
300
+ snapshot.data = payload;
301
+ snapshot.loading = false;
302
+
303
+ expect(callback).toHaveBeenNthCalledWith(2, expect.objectContaining(snapshot));
304
+
305
+ client.emitter.emit('post.approved', {
306
+ posts: [approvedPost],
307
+ feeds: [
308
+ {
309
+ ...postQueryResponsePage2.data.feeds[0],
310
+ targetType: 'community',
311
+ feedId,
312
+ feedType: 'published',
313
+ },
314
+ ],
315
+ });
316
+
317
+ snapshot.data = payload.filter(({ postId }) => postId !== approvedPost.postId);
318
+
319
+ expect(callback).toHaveBeenNthCalledWith(3, expect.objectContaining(snapshot));
320
+ });
321
+
322
+ test('it should remove reviewing post when feedtype published', async () => {
323
+ const feedId = 'publishedFeed';
324
+ const approvedPost = { ...post14, feedId };
325
+
326
+ const approvedFeed = { ...postQueryResponsePage2.data.feeds[0], feedType: 'published' };
327
+ postQueryResponsePage2.data.feeds = [approvedFeed];
328
+
281
329
  const callback = jest.fn();
282
330
  client.http.get = jest.fn().mockResolvedValue(postQueryResponsePage2);
283
331
 
284
- livePosts({ ...params, feedType: 'reviewing' }, callback);
332
+ livePosts({ ...params, targetType: 'community', feedType: 'published' }, callback);
285
333
 
286
334
  await pause();
287
335
  const payload = postQueryResponsePage2.data.posts;
@@ -294,9 +342,18 @@ describe('livePosts', () => {
294
342
 
295
343
  client.emitter.emit('post.approved', {
296
344
  posts: [approvedPost],
345
+ feeds: [
346
+ {
347
+ ...postQueryResponsePage2.data.feeds[0],
348
+ targetType: 'community',
349
+ feedId,
350
+ feedType: 'reviewing',
351
+ },
352
+ ],
297
353
  });
298
354
 
299
355
  snapshot.data = payload.filter(({ postId }) => postId !== approvedPost.postId);
356
+
300
357
  expect(callback).toHaveBeenNthCalledWith(3, expect.objectContaining(snapshot));
301
358
  });
302
359
  });
@@ -49,12 +49,7 @@ export const createReport = async (
49
49
  referenceType === 'message' ? prepareMessagePayload(data as Amity.RawMessagePayload) : data,
50
50
  );
51
51
 
52
- if (referenceType === 'message') {
53
- fireEvent('message.flagged', data as Amity.RawMessagePayload);
54
- } else {
55
- // @ts-ignore
56
- fireEvent(`${referenceType}.flagged`, data);
57
- }
52
+ fireEvent(`${referenceType}.flagged`, data);
58
53
 
59
54
  return !!data;
60
55
  };
@@ -49,12 +49,8 @@ export const deleteReport = async (
49
49
  referenceType === 'message' ? prepareMessagePayload(data as Amity.RawMessagePayload) : data,
50
50
  );
51
51
 
52
- if (referenceType === 'message') {
53
- fireEvent('message.unflagged', data as Amity.RawMessagePayload);
54
- } else {
55
- // @ts-ignore
56
- fireEvent(`${referenceType}.unflagged`, data);
57
- }
52
+ // @ts-ignore
53
+ fireEvent(`${referenceType}.unflagged`, data);
58
54
 
59
55
  return !!data;
60
56
  };
@@ -0,0 +1,93 @@
1
+ import { disableCache, enableCache, pullFromCache } from '~/cache/api';
2
+ import {
3
+ client,
4
+ connectClient,
5
+ disconnectClient,
6
+ flaggedUser,
7
+ flaggedUserQueryResponse,
8
+ } from '~/utils/tests';
9
+ import { ASCApiError } from '~/core/errors';
10
+
11
+ import { onUserFlagged } from '~/user/events';
12
+
13
+ import { createReport } from '..';
14
+ import REFERENCE_TYPES from '../../constants/referenceTypes';
15
+
16
+ describe('createReport', () => {
17
+ beforeAll(connectClient);
18
+ afterAll(disconnectClient);
19
+
20
+ // integration_test_id: ca4a760f-4342-4a99-9f3c-6c17cd205ca6
21
+ test('it should flag user with userId', async () => {
22
+ const expected = true;
23
+ client.http.post = jest.fn().mockResolvedValue(flaggedUserQueryResponse);
24
+
25
+ const received = await createReport('user', flaggedUser.userId);
26
+
27
+ expect(received).toBe(expected);
28
+ });
29
+
30
+ // integration_test_id: e8d0f02c-3558-488f-bdae-e70835d8cefb
31
+ test('it should throw error with 400400 when sending invalid userId', async () => {
32
+ client.http.post = jest
33
+ .fn()
34
+ .mockRejectedValueOnce(
35
+ new ASCApiError('unauthorized', Amity.ServerError.ITEM_NOT_FOUND, Amity.ErrorLevel.ERROR),
36
+ );
37
+
38
+ await expect(createReport('user', flaggedUser.userId)).rejects.toThrow('400400');
39
+ });
40
+
41
+ test('it should fire event for user', async () => {
42
+ let dispose;
43
+ const expected = flaggedUser;
44
+
45
+ client.http.post = jest.fn().mockResolvedValue(flaggedUserQueryResponse);
46
+
47
+ const callbackPromise = new Promise(resolve => {
48
+ dispose = onUserFlagged(resolve);
49
+ }).finally(dispose);
50
+
51
+ const recieved = await createReport('user', flaggedUser.userId);
52
+
53
+ expect(recieved).toBe(true);
54
+ await expect(callbackPromise).resolves.toEqual(expect.objectContaining(expected));
55
+ });
56
+
57
+ test.todo('it should fire event for flagging message');
58
+ test.todo('it should fire event for flagging post');
59
+
60
+ const tests: [keyof typeof REFERENCE_TYPES, string, string][] = [
61
+ ['user', 'userId', `/api/v4/me/flags/${encodeURIComponent('userId')}`],
62
+ ['post', 'postId', `/api/v3/posts/${encodeURIComponent('postId')}/flag`],
63
+ ['message', 'messageId', `/api/v5/messages/${encodeURIComponent('messageId')}/flags`],
64
+ ];
65
+
66
+ test.each(tests)(
67
+ 'it should call the appropriate api for %s',
68
+ async (referenceType, referenceId, expected) => {
69
+ const apimock = jest.fn();
70
+
71
+ client.http.post = apimock.mockResolvedValue({ data: {} });
72
+
73
+ await createReport(referenceType, referenceId);
74
+
75
+ const received = apimock.mock.lastCall[0];
76
+
77
+ expect(received).toBe(expected);
78
+ },
79
+ );
80
+
81
+ test('it should add data to cache', async () => {
82
+ enableCache();
83
+ const expected = flaggedUser;
84
+ client.http.post = jest.fn().mockResolvedValue(flaggedUserQueryResponse);
85
+
86
+ await createReport('user', flaggedUser.userId);
87
+ const recieved = pullFromCache(['user', 'get', flaggedUser.userId]);
88
+
89
+ expect(recieved?.data).toBe(expected);
90
+
91
+ disableCache();
92
+ });
93
+ });