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

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 (285) hide show
  1. package/.eslintrc.json +2 -0
  2. package/dist/@types/core/events.d.ts +22 -22
  3. package/dist/@types/core/events.d.ts.map +1 -1
  4. package/dist/@types/core/model.d.ts +3 -2
  5. package/dist/@types/core/model.d.ts.map +1 -1
  6. package/dist/@types/core/payload.d.ts +87 -34
  7. package/dist/@types/core/payload.d.ts.map +1 -1
  8. package/dist/@types/domains/channel.d.ts +1 -1
  9. package/dist/@types/domains/client.d.ts +1 -1
  10. package/dist/@types/domains/client.d.ts.map +1 -1
  11. package/dist/@types/domains/comment.d.ts +5 -0
  12. package/dist/@types/domains/comment.d.ts.map +1 -1
  13. package/dist/@types/domains/community.d.ts +11 -0
  14. package/dist/@types/domains/community.d.ts.map +1 -1
  15. package/dist/@types/domains/content.d.ts +7 -1
  16. package/dist/@types/domains/content.d.ts.map +1 -1
  17. package/dist/@types/domains/group.d.ts +2 -2
  18. package/dist/@types/global.d.ts +8 -0
  19. package/dist/@types/global.d.ts.map +1 -1
  20. package/dist/cache/api/ingestInCache.d.ts +2 -1
  21. package/dist/cache/api/ingestInCache.d.ts.map +1 -1
  22. package/dist/channel/api/banChannelMembers.d.ts.map +1 -1
  23. package/dist/channel/api/queryChannelMembers.d.ts.map +1 -1
  24. package/dist/channel/api/unbanChannelMembers.d.ts.map +1 -1
  25. package/dist/channel/events/onChannelJoined.d.ts.map +1 -1
  26. package/dist/channel/events/onChannelLeft.d.ts.map +1 -1
  27. package/dist/channel/events/onChannelMemberAdded.d.ts.map +1 -1
  28. package/dist/channel/events/onChannelMemberBanned.d.ts.map +1 -1
  29. package/dist/channel/events/onChannelMemberRemoved.d.ts.map +1 -1
  30. package/dist/channel/events/onChannelMemberUnbanned.d.ts.map +1 -1
  31. package/dist/channel/utils/index.d.ts +2 -2
  32. package/dist/channel/utils/index.d.ts.map +1 -1
  33. package/dist/comment/api/createComment.d.ts +1 -1
  34. package/dist/comment/api/createComment.d.ts.map +1 -1
  35. package/dist/comment/api/deleteComment.d.ts.map +1 -1
  36. package/dist/comment/api/tests/updateComment.test.d.ts +2 -0
  37. package/dist/comment/api/tests/updateComment.test.d.ts.map +1 -0
  38. package/dist/community/api/addCommunityMembers.d.ts.map +1 -1
  39. package/dist/community/api/addCommunityMembersRoles.d.ts +1 -1
  40. package/dist/community/api/addCommunityMembersRoles.d.ts.map +1 -1
  41. package/dist/community/api/deleteCommunity.d.ts.map +1 -1
  42. package/dist/community/api/joinCommunity.d.ts.map +1 -1
  43. package/dist/community/api/leaveCommunity.d.ts.map +1 -1
  44. package/dist/community/api/queryCommunityMembers.d.ts +1 -7
  45. package/dist/community/api/queryCommunityMembers.d.ts.map +1 -1
  46. package/dist/community/api/removeCommunityMembers.d.ts.map +1 -1
  47. package/dist/community/api/removeCommunityMembersRoles.d.ts +1 -1
  48. package/dist/community/api/removeCommunityMembersRoles.d.ts.map +1 -1
  49. package/dist/community/events/index.d.ts +2 -0
  50. package/dist/community/events/index.d.ts.map +1 -1
  51. package/dist/community/events/onCommunityUserRoleAdded.d.ts +17 -0
  52. package/dist/community/events/onCommunityUserRoleAdded.d.ts.map +1 -0
  53. package/dist/community/events/onCommunityUserRoleRemoved.d.ts +17 -0
  54. package/dist/community/events/onCommunityUserRoleRemoved.d.ts.map +1 -0
  55. package/dist/community/events/test/onCommunityUserRoleAdded.test.d.ts +2 -0
  56. package/dist/community/events/test/onCommunityUserRoleAdded.test.d.ts.map +1 -0
  57. package/dist/community/events/test/onCommunityUserRoleRemoved.test.d.ts +2 -0
  58. package/dist/community/events/test/onCommunityUserRoleRemoved.test.d.ts.map +1 -0
  59. package/dist/community/events/utils.d.ts.map +1 -1
  60. package/dist/community/observers/index.d.ts +2 -0
  61. package/dist/community/observers/index.d.ts.map +1 -1
  62. package/dist/community/observers/liveCommunity.d.ts +21 -0
  63. package/dist/community/observers/liveCommunity.d.ts.map +1 -0
  64. package/dist/community/observers/liveCommunityMembers.d.ts +20 -0
  65. package/dist/community/observers/liveCommunityMembers.d.ts.map +1 -0
  66. package/dist/community/observers/tests/liveCommunity.test.d.ts +2 -0
  67. package/dist/community/observers/tests/liveCommunity.test.d.ts.map +1 -0
  68. package/dist/community/observers/tests/liveCommunityMembers.test.d.ts +2 -0
  69. package/dist/community/observers/tests/liveCommunityMembers.test.d.ts.map +1 -0
  70. package/dist/community/utils/payload.d.ts +3 -5
  71. package/dist/community/utils/payload.d.ts.map +1 -1
  72. package/dist/core/device.d.ts.map +1 -1
  73. package/dist/core/events.d.ts +3 -3
  74. package/dist/core/events.d.ts.map +1 -1
  75. package/dist/core/model/idResolvers.d.ts +2 -4
  76. package/dist/core/model/idResolvers.d.ts.map +1 -1
  77. package/dist/core/model/identifyModel.d.ts +2 -2
  78. package/dist/core/model/identifyModel.d.ts.map +1 -1
  79. package/dist/core/model/index.d.ts.map +1 -1
  80. package/dist/core/query/query.d.ts.map +1 -1
  81. package/dist/external/api/tests/createUserToken.test.d.ts +2 -0
  82. package/dist/external/api/tests/createUserToken.test.d.ts.map +1 -0
  83. package/dist/feed/api/queryGlobalFeed.d.ts.map +1 -1
  84. package/dist/group/utils/withUser.d.ts.map +1 -1
  85. package/dist/index.cjs.js +481 -200
  86. package/dist/index.esm.js +477 -200
  87. package/dist/index.umd.js +4 -4
  88. package/dist/message/api/createMessage.d.ts.map +1 -1
  89. package/dist/message/utils/index.d.ts +3 -3
  90. package/dist/message/utils/index.d.ts.map +1 -1
  91. package/dist/poll/api/tests/closePoll.test.d.ts +2 -0
  92. package/dist/poll/api/tests/closePoll.test.d.ts.map +1 -0
  93. package/dist/poll/api/tests/createPoll.test.d.ts +2 -0
  94. package/dist/poll/api/tests/createPoll.test.d.ts.map +1 -0
  95. package/dist/poll/api/tests/getPoll.test.d.ts +2 -0
  96. package/dist/poll/api/tests/getPoll.test.d.ts.map +1 -0
  97. package/dist/poll/api/tests/votePoll.test.d.ts +2 -0
  98. package/dist/poll/api/tests/votePoll.test.d.ts.map +1 -0
  99. package/dist/post/api/approvePost.d.ts.map +1 -1
  100. package/dist/post/api/createPost.d.ts.map +1 -1
  101. package/dist/post/api/declinePost.d.ts.map +1 -1
  102. package/dist/post/api/deletePost.d.ts.map +1 -1
  103. package/dist/post/api/getPost.d.ts.map +1 -1
  104. package/dist/post/api/getPosts.d.ts.map +1 -1
  105. package/dist/post/api/queryPosts.d.ts.map +1 -1
  106. package/dist/post/api/updatePost.d.ts.map +1 -1
  107. package/dist/post/events/utils.d.ts.map +1 -1
  108. package/dist/reaction/api/queryReactions.d.ts.map +1 -1
  109. package/dist/reaction/api/removeReaction.d.ts.map +1 -1
  110. package/dist/reaction/events/onReactorAdded.d.ts.map +1 -1
  111. package/dist/reaction/events/onReactorRemoved.d.ts.map +1 -1
  112. package/dist/reaction/utils/dispatchReactable.d.ts +1 -1
  113. package/dist/reaction/utils/dispatchReactable.d.ts.map +1 -1
  114. package/dist/report/api/createReport.d.ts.map +1 -1
  115. package/dist/report/api/deleteReport.d.ts.map +1 -1
  116. package/dist/subChannel/utils/index.d.ts +1 -1
  117. package/dist/subChannel/utils/index.d.ts.map +1 -1
  118. package/dist/utils/index.d.ts +2 -2
  119. package/dist/utils/index.d.ts.map +1 -1
  120. package/dist/utils/tests/dummy/channel.d.ts +31 -35
  121. package/dist/utils/tests/dummy/channel.d.ts.map +1 -1
  122. package/dist/utils/tests/dummy/community.d.ts +35 -84
  123. package/dist/utils/tests/dummy/community.d.ts.map +1 -1
  124. package/dist/utils/tests/dummy/feed.d.ts +2 -18
  125. package/dist/utils/tests/dummy/feed.d.ts.map +1 -1
  126. package/dist/utils/tests/dummy/member.d.ts +1 -1
  127. package/dist/utils/tests/dummy/post.d.ts +30 -29
  128. package/dist/utils/tests/dummy/post.d.ts.map +1 -1
  129. package/dist/version.d.ts.map +1 -1
  130. package/package.json +1 -1
  131. package/src/@types/core/events.ts +22 -20
  132. package/src/@types/core/model.ts +3 -2
  133. package/src/@types/core/payload.ts +102 -38
  134. package/src/@types/domains/channel.ts +1 -1
  135. package/src/@types/domains/client.ts +1 -1
  136. package/src/@types/domains/comment.ts +7 -0
  137. package/src/@types/domains/community.ts +25 -0
  138. package/src/@types/domains/content.ts +9 -1
  139. package/src/@types/domains/group.ts +2 -2
  140. package/src/@types/global.ts +10 -0
  141. package/src/cache/api/ingestInCache.ts +3 -6
  142. package/src/cache/api/tests/ingestInCache.test.ts +12 -9
  143. package/src/channel/api/addChannelMembers.ts +5 -5
  144. package/src/channel/api/banChannelMembers.ts +1 -3
  145. package/src/channel/api/getChannel.ts +1 -1
  146. package/src/channel/api/queryChannelMembers.ts +1 -3
  147. package/src/channel/api/removeChannelMembers.ts +5 -5
  148. package/src/channel/api/tests/addChannelMembers.test.ts +4 -3
  149. package/src/channel/api/tests/createChannel.test.ts +5 -3
  150. package/src/channel/api/tests/getChannel.test.ts +2 -1
  151. package/src/channel/api/tests/joinChannel.test.ts +2 -2
  152. package/src/channel/api/tests/leaveChannel.test.ts +2 -2
  153. package/src/channel/api/tests/queryChannelMembers.test.ts +2 -5
  154. package/src/channel/api/tests/queryChannels.test.ts +4 -3
  155. package/src/channel/api/tests/removeChannelMembers.test.ts +16 -5
  156. package/src/channel/api/unbanChannelMembers.ts +1 -3
  157. package/src/channel/events/onChannelJoined.ts +1 -3
  158. package/src/channel/events/onChannelLeft.ts +1 -3
  159. package/src/channel/events/onChannelMemberAdded.ts +1 -3
  160. package/src/channel/events/onChannelMemberBanned.ts +1 -3
  161. package/src/channel/events/onChannelMemberRemoved.ts +1 -3
  162. package/src/channel/events/onChannelMemberUnbanned.ts +1 -3
  163. package/src/channel/observers/tests/liveChannelMembers.test.ts +5 -12
  164. package/src/channel/observers/tests/liveChannels.test.ts +3 -1
  165. package/src/channel/utils/index.ts +9 -6
  166. package/src/comment/api/createComment.ts +18 -2
  167. package/src/comment/api/deleteComment.ts +19 -2
  168. package/src/comment/api/tests/createComment.test.ts +169 -9
  169. package/src/comment/api/tests/updateComment.test.ts +189 -0
  170. package/src/comment/events/tests/onCommentCreated.test.ts +3 -3
  171. package/src/comment/events/tests/onCommentDeleted.test.ts +3 -3
  172. package/src/comment/observers/tests/liveComment.test.ts +18 -2
  173. package/src/community/api/addCommunityMembers.ts +6 -3
  174. package/src/community/api/addCommunityMembersRoles.ts +5 -2
  175. package/src/community/api/createCommunity.ts +5 -5
  176. package/src/community/api/deleteCommunity.ts +9 -1
  177. package/src/community/api/getCommunities.ts +2 -2
  178. package/src/community/api/getCommunity.ts +2 -2
  179. package/src/community/api/getRecommendedCommunities.ts +2 -2
  180. package/src/community/api/getTopTrendingCommunities.ts +2 -2
  181. package/src/community/api/joinCommunity.ts +6 -3
  182. package/src/community/api/leaveCommunity.ts +6 -3
  183. package/src/community/api/queryCommunities.ts +3 -3
  184. package/src/community/api/queryCommunityMembers.ts +3 -7
  185. package/src/community/api/removeCommunityMembers.ts +7 -3
  186. package/src/community/api/removeCommunityMembersRoles.ts +5 -2
  187. package/src/community/api/test/queryCommunityMembers.test.ts +2 -1
  188. package/src/community/api/test/removeCommunityMemberRole.test.ts +4 -1
  189. package/src/community/api/updateCommunity.ts +5 -5
  190. package/src/community/events/index.ts +2 -0
  191. package/src/community/events/onCommunityUserRoleAdded.ts +20 -0
  192. package/src/community/events/onCommunityUserRoleRemoved.ts +20 -0
  193. package/src/community/events/test/onCommunityDeleted.test.ts +8 -1
  194. package/src/community/events/test/onCommunityUserRoleAdded.test.ts +50 -0
  195. package/src/community/events/test/onCommunityUserRoleRemoved.test.ts +50 -0
  196. package/src/community/events/utils.ts +4 -8
  197. package/src/community/observers/index.ts +4 -0
  198. package/src/community/observers/liveCommunity.ts +45 -0
  199. package/src/community/observers/liveCommunityMembers.ts +187 -0
  200. package/src/community/observers/tests/liveCommunities.test.ts +38 -18
  201. package/src/community/observers/tests/liveCommunity.test.ts +147 -0
  202. package/src/community/observers/tests/liveCommunityMembers.test.ts +195 -0
  203. package/src/community/utils/payload.ts +28 -22
  204. package/src/core/device.ts +2 -4
  205. package/src/core/model/idResolvers.ts +4 -3
  206. package/src/core/model/identifyModel.ts +3 -3
  207. package/src/core/model/index.ts +1 -0
  208. package/src/core/query/query.ts +7 -0
  209. package/src/core/tests/query/query/runQuery.test.ts +8 -3
  210. package/src/core/tests/subscription.test.ts +80 -2
  211. package/src/external/api/tests/createUserToken.test.ts +29 -0
  212. package/src/feed/api/queryGlobalFeed.ts +8 -4
  213. package/src/group/utils/test/withUsers.test.ts +5 -5
  214. package/src/group/utils/withUser.ts +20 -14
  215. package/src/message/api/createMessage.ts +10 -9
  216. package/src/message/api/getMessage.ts +2 -2
  217. package/src/message/api/getMessages.ts +1 -1
  218. package/src/message/api/queryMessages.ts +2 -2
  219. package/src/message/api/tests/createMessage.test.ts +5 -1
  220. package/src/message/api/updateMessage.ts +1 -1
  221. package/src/message/events/onMessageCreated.ts +1 -1
  222. package/src/message/events/onMessageDeleted.ts +1 -1
  223. package/src/message/events/onMessageFetched.ts +1 -1
  224. package/src/message/events/onMessageFlagCleared.ts +1 -1
  225. package/src/message/events/onMessageFlagged.ts +1 -1
  226. package/src/message/events/onMessageReactionAdded.ts +1 -1
  227. package/src/message/events/onMessageReactionRemoved.ts +1 -1
  228. package/src/message/events/onMessageUnflagged.ts +1 -1
  229. package/src/message/events/onMessageUpdated.ts +1 -1
  230. package/src/message/tests/events.test.ts +10 -2
  231. package/src/message/tests/observers/liveMessage.test.ts +6 -1
  232. package/src/message/tests/observers/liveMessages.test.ts +16 -3
  233. package/src/message/utils/index.ts +5 -3
  234. package/src/poll/api/tests/closePoll.test.ts +50 -0
  235. package/src/poll/api/tests/createPoll.test.ts +70 -0
  236. package/src/poll/api/tests/getPoll.test.ts +31 -0
  237. package/src/poll/api/tests/votePoll.test.ts +41 -0
  238. package/src/poll/events/onPollDeleted.ts +1 -1
  239. package/src/poll/events/onPollUpdated.ts +1 -1
  240. package/src/post/api/approvePost.ts +10 -10
  241. package/src/post/api/createPost.ts +6 -3
  242. package/src/post/api/declinePost.ts +11 -11
  243. package/src/post/api/deletePost.ts +19 -2
  244. package/src/post/api/getPost.ts +5 -2
  245. package/src/post/api/getPosts.ts +4 -1
  246. package/src/post/api/queryPosts.ts +3 -1
  247. package/src/post/api/tests/queryPosts.test.ts +5 -4
  248. package/src/post/api/updatePost.ts +4 -1
  249. package/src/post/events/onPostReactionAdded.ts +1 -1
  250. package/src/post/events/onPostReactionRemoved.ts +1 -1
  251. package/src/post/events/utils.ts +12 -2
  252. package/src/post/observers/tests/livePost.test.ts +10 -3
  253. package/src/post/observers/tests/livePosts.test.ts +12 -4
  254. package/src/post/tests/api/getPost.test.ts +13 -3
  255. package/src/post/tests/api/queryPosts.test.ts +5 -4
  256. package/src/reaction/api/addReaction.ts +3 -3
  257. package/src/reaction/api/queryReactions.ts +2 -0
  258. package/src/reaction/api/removeReaction.ts +4 -3
  259. package/src/reaction/events/onReactionAdded.ts +3 -3
  260. package/src/reaction/events/onReactionRemoved.ts +3 -3
  261. package/src/reaction/events/onReactorAdded.ts +8 -2
  262. package/src/reaction/events/onReactorRemoved.ts +8 -2
  263. package/src/reaction/utils/dispatchReactable.ts +1 -1
  264. package/src/reaction/utils/fetchReference.ts +1 -1
  265. package/src/report/api/createReport.ts +14 -8
  266. package/src/report/api/deleteReport.ts +14 -8
  267. package/src/subChannel/api/createSubChannel.ts +1 -1
  268. package/src/subChannel/api/getSubChannel.ts +1 -1
  269. package/src/subChannel/api/getSubChannels.ts +1 -1
  270. package/src/subChannel/api/querySubChannels.ts +2 -2
  271. package/src/subChannel/api/updateSubChannel.ts +1 -1
  272. package/src/subChannel/events/onSubChannelCreated.ts +1 -1
  273. package/src/subChannel/events/onSubChannelDeleted.ts +1 -1
  274. package/src/subChannel/events/onSubChannelUpdated.ts +1 -1
  275. package/src/subChannel/utils/index.ts +2 -2
  276. package/src/user/observers/tests/liveUsers.test.ts +2 -0
  277. package/src/user/tests/api/getUser.test.ts +17 -3
  278. package/src/utils/index.ts +2 -2
  279. package/src/utils/liveObject.ts +1 -1
  280. package/src/utils/tests/dummy/channel.ts +18 -11
  281. package/src/utils/tests/dummy/community.ts +68 -6
  282. package/src/utils/tests/dummy/feed.ts +1 -1
  283. package/src/utils/tests/dummy/member.ts +1 -1
  284. package/src/utils/tests/dummy/post.ts +93 -9
  285. package/src/version.ts +9 -3
@@ -1,6 +1,9 @@
1
- import { getChannelTopic, getMessageTopic } from '../subscription';
1
+ import { ASCUnknownError } from '~/core/errors';
2
+ import { connectClient, disconnectClient, client } from '~/utils/tests';
2
3
 
3
- describe('Subscription', () => {
4
+ import { getChannelTopic, getMessageTopic, subscribeTopic } from '../subscription';
5
+
6
+ describe('getTopic', () => {
4
7
  test('should generate channel topic', () => {
5
8
  const channel = { path: 'channel-path' };
6
9
 
@@ -13,3 +16,78 @@ describe('Subscription', () => {
13
16
  expect(getMessageTopic(message)).toEqual('message-path');
14
17
  });
15
18
  });
19
+
20
+ describe('subscription', () => {
21
+ beforeAll(connectClient);
22
+ afterAll(disconnectClient);
23
+
24
+ const channel = { path: 'channel-path' };
25
+
26
+ // integration_test_id: cb1b5450-b131-4a00-9c47-aad26f415b20
27
+ test('it should return succesfull result for valid topic', () => {
28
+ client.mqtt.subscribe = jest.fn().mockImplementation(() => () => null);
29
+
30
+ const recieved = subscribeTopic(getChannelTopic(channel), () => null);
31
+
32
+ expect(recieved).toBeTruthy();
33
+ });
34
+
35
+ // integration_test_id: 09db1790-08e1-43d2-a674-866c5dd3c75c
36
+ test('it should return 800000 for subscribing to invalid topid', () => {
37
+ const expected = new ASCUnknownError(Amity.ClientError.UNKNOWN_ERROR, Amity.ErrorLevel.ERROR);
38
+ client.mqtt.subscribe = jest.fn().mockImplementation(() => () => {
39
+ throw expected;
40
+ });
41
+
42
+ try {
43
+ subscribeTopic('invalid topic', () => null);
44
+ } catch (error) {
45
+ expect(error).toEqual(expected);
46
+ }
47
+ });
48
+
49
+ test('it should call mqtt connect if accesstoken does not match', () => {
50
+ const callback = jest.fn();
51
+
52
+ client.token = { accessToken: '', issuedAt: '', expiresAt: '' };
53
+ client.mqtt.connect = callback;
54
+
55
+ subscribeTopic(getChannelTopic(channel), () => null);
56
+
57
+ expect(callback).toHaveBeenCalled();
58
+ });
59
+ });
60
+
61
+ describe('unsubsribe', () => {
62
+ beforeAll(connectClient);
63
+ afterAll(disconnectClient);
64
+
65
+ const channel = { path: 'channel-path' };
66
+
67
+ // integration_test_id: 87978499-5f4e-4a36-a092-56dde566329a
68
+ test('it should succesfully call unsubsribe', () => {
69
+ client.mqtt.unsubscribe = jest.fn().mockImplementation(() => true);
70
+ client.mqtt.subscribe = jest.fn().mockImplementation(() => client.mqtt.unsubscribe);
71
+
72
+ const recieved = subscribeTopic(getChannelTopic(channel), () => null);
73
+
74
+ expect(recieved()).toEqual(true);
75
+ });
76
+
77
+ // integration_test_id: 8d444682-453d-44f8-b8c1-8c282e7db4bc
78
+ test('it should throw error', () => {
79
+ const expected = new ASCUnknownError(Amity.ClientError.UNKNOWN_ERROR, Amity.ErrorLevel.ERROR);
80
+ client.mqtt.unsubscribe = jest.fn().mockImplementation(() => {
81
+ throw expected;
82
+ });
83
+ client.mqtt.subscribe = jest.fn().mockImplementation(() => client.mqtt.unsubscribe);
84
+
85
+ try {
86
+ const recieved = subscribeTopic('invalid topic', () => null);
87
+
88
+ recieved();
89
+ } catch (error) {
90
+ expect(error).toEqual(expected);
91
+ }
92
+ });
93
+ });
@@ -0,0 +1,29 @@
1
+ import { getFutureDate } from '~/core/model';
2
+ import { createHttpTransport } from '~/core/transports';
3
+ import { createUserToken } from '../createUserToken';
4
+
5
+ jest.mock('~/core/transports', () => ({
6
+ __esModule: true,
7
+ ...jest.requireActual('~/core/transports'),
8
+ createHttpTransport: jest.fn(),
9
+ }));
10
+
11
+ describe('createUserToken', () => {
12
+ // integration_test_id: 4771d3b9-1a05-4942-85e1-d2abea936c2f
13
+ it('should return a valid token', async () => {
14
+ const payload = {
15
+ accessToken: 'accessToken',
16
+ refreshToken: 'refreshToken',
17
+ issuedAt: new Date().toISOString(),
18
+ expiresAt: getFutureDate(),
19
+ };
20
+ (createHttpTransport as jest.Mock).mockReturnValue({ post: () => ({ data: payload }) });
21
+
22
+ const { accessToken } = await createUserToken('apiKey', 'sg', {
23
+ userId: 'userId',
24
+ displayName: 'displayName',
25
+ });
26
+
27
+ expect(accessToken).toStrictEqual('accessToken');
28
+ });
29
+ });
@@ -4,6 +4,7 @@ import { toPage, toToken } from '~/core/query';
4
4
  import { ingestInCache } from '~/cache/api/ingestInCache';
5
5
  import { pullFromCache, pushToCache } from '~/cache/api';
6
6
  import { getResolver } from '~/core/model';
7
+ import { prepareMembershipPayload } from '~/group/utils';
7
8
 
8
9
  /**
9
10
  * ```js
@@ -29,7 +30,7 @@ export const queryGlobalFeed = async (query?: {
29
30
 
30
31
  const { useCustomRanking, page, ...params } = query ?? {};
31
32
 
32
- const { data } = await client.http.get<Amity.PostPayload & Amity.Pagination>(
33
+ const { data: queryPayload } = await client.http.get<Amity.PostPayload & Amity.Pagination>(
33
34
  useCustomRanking ? `/api/v5/me/global-feeds` : `/api/v4/me/global-feeds`,
34
35
  {
35
36
  params: {
@@ -41,13 +42,16 @@ export const queryGlobalFeed = async (query?: {
41
42
  },
42
43
  );
43
44
 
44
- const { paging, ...payload } = data;
45
- const { posts } = payload;
45
+ const { paging, ...payload } = queryPayload;
46
+
47
+ const data = prepareMembershipPayload(payload, 'communityUsers');
48
+
49
+ const { posts } = data;
46
50
 
47
51
  const cachedAt = client.cache && Date.now();
48
52
 
49
53
  if (client.cache) {
50
- ingestInCache(payload as Amity.PostPayload);
54
+ ingestInCache(data);
51
55
 
52
56
  const cacheKey = [
53
57
  'globalFeed',
@@ -5,15 +5,15 @@ import { baseMembership, user11, user12 } from '~/utils/tests';
5
5
 
6
6
  const users = [user11, user12];
7
7
 
8
- const member1: Amity.MembershipRaw<Amity.GroupType> = { ...baseMembership, userId: user11.userId };
8
+ const member1: Amity.RawMembership<Amity.GroupType> = { ...baseMembership, userId: user11.userId };
9
9
  const mappedMember1: Amity.Membership<Amity.GroupType> = { ...member1, user: user11 };
10
10
  const unmapableMember1: Amity.Membership<Amity.GroupType> = { ...member1, user: undefined };
11
11
 
12
- const member2: Amity.MembershipRaw<Amity.GroupType> = { ...baseMembership, userId: user12.userId };
12
+ const member2: Amity.RawMembership<Amity.GroupType> = { ...baseMembership, userId: user12.userId };
13
13
  const mappedMember2: Amity.Membership<Amity.GroupType> = { ...member2, user: user12 };
14
14
  const unmapableMember2: Amity.Membership<Amity.GroupType> = { ...member2, user: undefined };
15
15
 
16
- const members1: Amity.MembershipRaw<Amity.GroupType>[] = [member1, member2];
16
+ const members1: Amity.RawMembership<Amity.GroupType>[] = [member1, member2];
17
17
  const mappedMembers1: Amity.Membership<Amity.GroupType>[] = [mappedMember1, mappedMember2];
18
18
  const unmapableMembers1: Amity.Membership<Amity.GroupType>[] = [unmapableMember1, unmapableMember2];
19
19
 
@@ -49,7 +49,7 @@ describe('withUser', () => {
49
49
  test('`.user` should return undefined when user not exist', () => {
50
50
  enableCache();
51
51
  ingestInCache({ users });
52
- const member: Amity.MembershipRaw<Amity.GroupType> = {
52
+ const member: Amity.RawMembership<Amity.GroupType> = {
53
53
  ...member1,
54
54
  userId: 'not-exist-user-id',
55
55
  };
@@ -83,7 +83,7 @@ describe('withUsers', () => {
83
83
  test('`.user` should return undefined when some user not exist', () => {
84
84
  enableCache();
85
85
  ingestInCache({ users });
86
- const members: Amity.MembershipRaw<Amity.GroupType>[] = [
86
+ const members: Amity.RawMembership<Amity.GroupType>[] = [
87
87
  ...members1,
88
88
  { ...member1, userId: 'not-exist-user-id' },
89
89
  ];
@@ -23,22 +23,27 @@ export const withUser = <
23
23
  member: M,
24
24
  userIdProp: I = <I>'userId',
25
25
  userProp: U = <U>'user',
26
- ): Record<U, Amity.User | undefined> & M => ({
27
- get [userProp]() {
28
- const client = getActiveClient();
26
+ ): Record<U, Amity.User | undefined> & M => {
27
+ // If the user prop already exists, do not overwrite.
28
+ if (member[userProp]) return member;
29
29
 
30
- if (!client.cache) return undefined;
30
+ return {
31
+ get [userProp]() {
32
+ const client = getActiveClient();
31
33
 
32
- const userCache = pullFromCache<Amity.User>(['user', 'get', member[userIdProp]])?.data;
34
+ if (!client.cache) return undefined;
33
35
 
34
- if (!userCache) {
35
- return undefined;
36
- }
36
+ const userCache = pullFromCache<Amity.User>(['user', 'get', member[userIdProp]])?.data;
37
37
 
38
- return userCache;
39
- },
40
- ...member,
41
- });
38
+ if (!userCache) {
39
+ return undefined;
40
+ }
41
+
42
+ return userCache;
43
+ },
44
+ ...member,
45
+ };
46
+ };
42
47
 
43
48
  /**
44
49
  * Mapping membership model with user object
@@ -58,8 +63,9 @@ export const withUsers = <
58
63
  members: M,
59
64
  userIdProp: I = <I>'userId',
60
65
  userProp: U = <U>'user',
61
- ): (Record<U, Amity.User | undefined> & M[number])[] =>
62
- members.map(member => withUser(member, userIdProp, userProp));
66
+ ): (Record<U, Amity.User | undefined> & M[number])[] => {
67
+ return members?.map(member => withUser(member, userIdProp, userProp)) ?? members;
68
+ };
63
69
 
64
70
  /**
65
71
  * Transform members prop in any payload with attached users members
@@ -4,7 +4,8 @@ import { getActiveClient } from '~/client/api';
4
4
  import { ingestInCache } from '~/cache/api/ingestInCache';
5
5
  import { UNSYNCED_OBJECT_CACHED_AT_VALUE } from '~/utils/constants';
6
6
  import { upsertInCache, pullFromCache, pushToCache, dropFromCache } from '~/cache/api';
7
- import { convertParams, convertResponseFromRaw } from '../utils';
7
+
8
+ import { convertParams, prepareMessagePayload } from '../utils';
8
9
 
9
10
  // FIXME: temp solution
10
11
  let uniqueId: string | undefined;
@@ -45,12 +46,14 @@ export const createMessage = async <T extends Amity.MessageContentType>(
45
46
 
46
47
  const referenceId = uniqueId;
47
48
  uniqueId = undefined;
48
- const { data } = await client.http
49
- .post<Amity.RawMessagePayload>('/api/v5/messages', {
50
- ...convertParams(bundle),
51
- referenceId,
52
- })
53
- .then(convertResponseFromRaw);
49
+
50
+ const { data: payload } = await client.http.post<Amity.MessagePayload>('/api/v5/messages', {
51
+ ...convertParams(bundle),
52
+ referenceId,
53
+ });
54
+
55
+ const data = prepareMessagePayload(payload);
56
+ const { messages } = data;
54
57
 
55
58
  const cachedAt = client.cache && Date.now();
56
59
  if (client.cache) {
@@ -58,8 +61,6 @@ export const createMessage = async <T extends Amity.MessageContentType>(
58
61
  ingestInCache(data, { cachedAt });
59
62
  }
60
63
 
61
- const { messages } = data;
62
-
63
64
  fireEvent('local.message.created', { messages });
64
65
 
65
66
  return {
@@ -38,12 +38,12 @@ export const getMessage = async (
38
38
 
39
39
  isInTombstone('message', messageId);
40
40
 
41
- let data: Amity.MessagePayload;
41
+ let data: Amity.ProcessedMessagePayload;
42
42
 
43
43
  try {
44
44
  // API-FIX: endpoint should not be /list, parameters should be querystring.
45
45
  const response = await client.http
46
- .get<Amity.RawMessagePayload>(`/api/v5/messages/${encodeURIComponent(messageId)}`)
46
+ .get<Amity.MessagePayload>(`/api/v5/messages/${encodeURIComponent(messageId)}`)
47
47
  .then(convertResponseFromRaw);
48
48
 
49
49
  data = response.data;
@@ -26,7 +26,7 @@ export const getMessages = async (
26
26
  client.log('message/getMessages', messageIds);
27
27
 
28
28
  const { data } = await client.http
29
- .get<Amity.RawMessagePayload>(`/api/v5/messages/list`, {
29
+ .get<Amity.MessagePayload>(`/api/v5/messages/list`, {
30
30
  params: { messageIds: messageIds.map(encodeURIComponent) },
31
31
  })
32
32
  .then(convertResponseFromRaw);
@@ -34,7 +34,7 @@ export const queryMessages = async (
34
34
  // API-FIX: pagination should not be indexed on channelSegment (3)
35
35
  // const { data } = await client.http.get<Amity.Response<Amity.Paged<Amity.MessagePayload>>>(
36
36
  const response = await client.http
37
- .get<Amity.RawMessagePayload & Amity.Pagination>(`/api/v5/messages`, { params })
37
+ .get<Amity.MessagePayload & Amity.Pagination>(`/api/v5/messages`, { params })
38
38
  .then(convertResponseFromRaw);
39
39
 
40
40
  // API-FIX: backend should answer Amity.Response (2)
@@ -45,7 +45,7 @@ export const queryMessages = async (
45
45
  const cachedAt = client.cache && Date.now();
46
46
 
47
47
  if (client.cache) {
48
- ingestInCache(data as Amity.MessagePayload, { cachedAt });
48
+ ingestInCache(data as Amity.ProcessedMessagePayload, { cachedAt });
49
49
 
50
50
  const cacheKey = ['message', 'query', params as Amity.Serializable];
51
51
  pushToCache(cacheKey, { messages: messages.map(getResolver('message')), paging });
@@ -178,7 +178,11 @@ describe('uniqueId / referenceId', () => {
178
178
  const callback = jest.fn();
179
179
 
180
180
  onMessageCreated(callback);
181
- client.emitter.emit('message.created', { messages: [rawNewMessage] });
181
+ client.emitter.emit('message.created', {
182
+ messages: [rawNewMessage],
183
+ files: [],
184
+ users: [],
185
+ });
182
186
  await pause();
183
187
 
184
188
  expect(callback).toHaveBeenCalledWith(
@@ -30,7 +30,7 @@ export const updateMessage = async (
30
30
  client.log('message/updateMessage', patch);
31
31
 
32
32
  const { data } = await client.http
33
- .put<Amity.RawMessagePayload>(
33
+ .put<Amity.MessagePayload>(
34
34
  `/api/v5/messages/${encodeURIComponent(messageId)}`,
35
35
  convertParams(patch),
36
36
  )
@@ -24,7 +24,7 @@ import { prepareMessagePayload } from '../utils';
24
24
  export const onMessageCreated = (callback: Amity.Listener<Amity.Message>): Amity.Unsubscriber => {
25
25
  const client = getActiveClient();
26
26
 
27
- const filter = (rawPayload: Amity.RawMessagePayload) => {
27
+ const filter = (rawPayload: Amity.MessagePayload) => {
28
28
  const payload = prepareMessagePayload(rawPayload);
29
29
  const message = payload.messages[0];
30
30
  const cached = pullFromCache<Amity.Channel>(['channel', 'get', message.channelId]);
@@ -22,7 +22,7 @@ import { prepareMessagePayload } from '../utils';
22
22
  export const onMessageDeleted = (callback: Amity.Listener<Amity.Message>): Amity.Unsubscriber => {
23
23
  const client = getActiveClient();
24
24
 
25
- const filter = (rawPayload: Amity.RawMessagePayload) => {
25
+ const filter = (rawPayload: Amity.MessagePayload) => {
26
26
  const payload = prepareMessagePayload(rawPayload);
27
27
 
28
28
  ingestInCache(payload);
@@ -21,7 +21,7 @@ import { ingestInCache } from '~/cache/api/ingestInCache';
21
21
  export const onMessageFetched = (callback: Amity.Listener<Amity.Message>): Amity.Unsubscriber => {
22
22
  const client = getActiveClient();
23
23
 
24
- const filter = (payload: Amity.MessagePayload) => {
24
+ const filter = (payload: Amity.Events['local.message.fetched']) => {
25
25
  ingestInCache(payload);
26
26
  callback(payload.messages[0]);
27
27
  };
@@ -23,7 +23,7 @@ export const onMessageFlagCleared = (
23
23
  ): Amity.Unsubscriber => {
24
24
  const client = getActiveClient();
25
25
 
26
- const filter = (rawPayload: Amity.RawMessagePayload) => {
26
+ const filter = (rawPayload: Amity.MessagePayload) => {
27
27
  const payload = prepareMessagePayload(rawPayload);
28
28
 
29
29
  ingestInCache(payload);
@@ -22,7 +22,7 @@ import { prepareMessagePayload } from '../utils';
22
22
  export const onMessageFlagged = (callback: Amity.Listener<Amity.Message>): Amity.Unsubscriber => {
23
23
  const client = getActiveClient();
24
24
 
25
- const filter = (rawPayload: Amity.RawMessagePayload) => {
25
+ const filter = (rawPayload: Amity.MessagePayload) => {
26
26
  const payload = prepareMessagePayload(rawPayload);
27
27
 
28
28
  ingestInCache(payload);
@@ -24,7 +24,7 @@ export const onMessageReactionAdded = (
24
24
  ): Amity.Unsubscriber => {
25
25
  const client = getActiveClient();
26
26
 
27
- const filter = (rawPayload: Amity.RawMessagePayload) => {
27
+ const filter = (rawPayload: Amity.MessagePayload) => {
28
28
  const payload = prepareMessagePayload(rawPayload);
29
29
 
30
30
  ingestInCache(payload);
@@ -24,7 +24,7 @@ export const onMessageReactionRemoved = (
24
24
  ): Amity.Unsubscriber => {
25
25
  const client = getActiveClient();
26
26
 
27
- const filter = (rawPayload: Amity.RawMessagePayload) => {
27
+ const filter = (rawPayload: Amity.MessagePayload) => {
28
28
  const payload = prepareMessagePayload(rawPayload);
29
29
 
30
30
  ingestInCache(payload);
@@ -21,7 +21,7 @@ import { prepareMessagePayload } from '../utils';
21
21
  export const onMessageUnflagged = (callback: Amity.Listener<Amity.Message>): Amity.Unsubscriber => {
22
22
  const client = getActiveClient();
23
23
 
24
- const filter = (rawPayload: Amity.RawMessagePayload) => {
24
+ const filter = (rawPayload: Amity.MessagePayload) => {
25
25
  const payload = prepareMessagePayload(rawPayload);
26
26
 
27
27
  ingestInCache(payload);
@@ -22,7 +22,7 @@ import { prepareMessagePayload } from '../utils';
22
22
  export const onMessageUpdated = (callback: Amity.Listener<Amity.Message>): Amity.Unsubscriber => {
23
23
  const client = getActiveClient();
24
24
 
25
- const filter = (rawPayload: Amity.RawMessagePayload) => {
25
+ const filter = (rawPayload: Amity.MessagePayload) => {
26
26
  const payload = prepareMessagePayload(rawPayload);
27
27
 
28
28
  ingestInCache(payload);
@@ -32,7 +32,11 @@ describe('Message Events', () => {
32
32
  test(`should call '${onEvent.name}' callback if '${event}' event is dispatched`, () => {
33
33
  const callback = jest.fn();
34
34
  const unsubscribe = onEvent(callback);
35
- client.emitter.emit(event, { messages: [rawMessage] });
35
+ client.emitter.emit(event, {
36
+ messages: [rawMessage],
37
+ files: [],
38
+ users: [],
39
+ });
36
40
 
37
41
  unsubscribe();
38
42
 
@@ -45,7 +49,11 @@ describe('Message Events', () => {
45
49
  const unsubscribe = onEvent(callback);
46
50
 
47
51
  unsubscribe();
48
- client.emitter.emit(event, { messages: [rawMessage] });
52
+ client.emitter.emit(event, {
53
+ files: [],
54
+ users: [],
55
+ messages: [rawMessage],
56
+ });
49
57
 
50
58
  expect(callback).not.toHaveBeenCalled();
51
59
  });
@@ -3,6 +3,7 @@ import { disableCache, enableCache } from '~/cache/api';
3
3
  import { UNSYNCED_OBJECT_CACHED_AT_MESSAGE } from '~/utils/constants';
4
4
  import { pause, client, connectClient, disconnectClient, generateRawMessage } from '~/utils/tests';
5
5
  import { getFutureDate } from '~/core/model';
6
+
6
7
  import { convertFromRaw } from '../../utils';
7
8
  import { liveMessage } from '../../observers/liveMessage';
8
9
  import { createMessage } from '../../api';
@@ -67,7 +68,11 @@ describe('liveMessage', () => {
67
68
  if (event === 'local.message.fetched') {
68
69
  client.emitter.emit('local.message.fetched', { messages: [updatedMessage] });
69
70
  } else {
70
- client.emitter.emit(event, { messages: [rawUpdatedMessage] });
71
+ client.emitter.emit(event, {
72
+ messages: [rawUpdatedMessage],
73
+ users: [],
74
+ files: [],
75
+ });
71
76
  }
72
77
  await pause();
73
78
 
@@ -8,6 +8,7 @@ import {
8
8
  messages,
9
9
  generateRawMessage,
10
10
  } from '~/utils/tests';
11
+
11
12
  import { convertFromRaw } from '../../utils';
12
13
  import { queryMessages } from '../../api';
13
14
  import { liveMessages } from '../../observers';
@@ -276,7 +277,11 @@ describe('liveMessages', () => {
276
277
  expect(callback).toHaveBeenCalledTimes(2);
277
278
 
278
279
  // fire new message creation event
279
- client.emitter.emit('message.created', { messages: [rawNewMessage] });
280
+ client.emitter.emit('message.created', {
281
+ messages: [rawNewMessage],
282
+ users: [],
283
+ files: [],
284
+ });
280
285
 
281
286
  expect(callback).toHaveBeenNthCalledWith(
282
287
  3,
@@ -305,7 +310,11 @@ describe('liveMessages', () => {
305
310
  expect(callback).toHaveBeenCalledTimes(2);
306
311
 
307
312
  // fire new message creation event
308
- client.emitter.emit('message.updated', { messages: [rawMessage] });
313
+ client.emitter.emit('message.updated', {
314
+ messages: [rawMessage],
315
+ users: [],
316
+ files: [],
317
+ });
309
318
 
310
319
  expect(callback).toHaveBeenNthCalledWith(
311
320
  3,
@@ -333,7 +342,11 @@ describe('liveMessages', () => {
333
342
  expect(callback).toHaveBeenCalledTimes(2);
334
343
 
335
344
  // fire new message creation event
336
- client.emitter.emit('message.deleted', { messages: [rawMessage] });
345
+ client.emitter.emit('message.deleted', {
346
+ messages: [rawMessage],
347
+ users: [],
348
+ files: [],
349
+ });
337
350
 
338
351
  expect(callback).toHaveBeenNthCalledWith(
339
352
  3,
@@ -68,16 +68,18 @@ export function convertFromRaw({
68
68
  return out;
69
69
  }
70
70
 
71
- export const prepareMessagePayload = (payload: Amity.RawMessagePayload): Amity.MessagePayload => {
71
+ export const prepareMessagePayload = (
72
+ payload: Amity.MessagePayload,
73
+ ): Amity.ProcessedMessagePayload => {
72
74
  return {
73
75
  ...payload,
74
76
  messages: payload.messages.map(convertFromRaw),
75
77
  };
76
78
  };
77
79
 
78
- export const convertResponseFromRaw = <T extends Amity.RawMessagePayload>(
80
+ export const convertResponseFromRaw = <T extends Amity.MessagePayload>(
79
81
  response: AxiosResponse<T>,
80
- ): AxiosResponse<Omit<T, 'messages'> & { messages: Amity.MessagePayload['messages'] }> => {
82
+ ): AxiosResponse<Omit<T, 'messages'> & { messages: Amity.ProcessedMessagePayload['messages'] }> => {
81
83
  return {
82
84
  ...response,
83
85
  data: {
@@ -0,0 +1,50 @@
1
+ import { client, pause, poll11 } from '~/utils/tests';
2
+ import { ASCError } from '~/core/errors';
3
+ import { disableCache, enableCache } from '~/cache/api';
4
+ import { onPollUpdated } from '~/poll/events';
5
+ import { closePoll } from '../closePoll';
6
+ import { getPoll } from '../getPoll';
7
+
8
+ describe('closePoll', () => {
9
+ beforeAll(enableCache);
10
+ afterAll(disableCache);
11
+
12
+ // integration_test_id: b679db23-6a49-4858-ba53-2b64ced2f587
13
+ it('should close the poll', async () => {
14
+ client.http.put = jest
15
+ .fn()
16
+ .mockResolvedValueOnce({ data: { polls: [{ ...poll11, status: 'closed' }] } });
17
+ const callback = jest.fn();
18
+ onPollUpdated(callback);
19
+
20
+ const { data: poll } = await closePoll(poll11.pollId);
21
+ const { data: cachedPoll } = getPoll.locally(poll.pollId)!;
22
+ await pause();
23
+
24
+ expect(poll.status).toEqual('closed');
25
+ expect(cachedPoll).toMatchObject(poll);
26
+ expect(callback).toHaveBeenCalledWith(poll);
27
+ });
28
+
29
+ // integration_test_id: ec12e345-0e93-435b-9750-e81408fcb791
30
+ it('should fail to close if the poll does not exist', async () => {
31
+ client.http.put = jest
32
+ .fn()
33
+ .mockRejectedValueOnce(
34
+ new ASCError('error message', Amity.ServerError.ITEM_NOT_FOUND, Amity.ErrorLevel.FATAL),
35
+ );
36
+
37
+ await expect(() => closePoll('non-existent-poll-id')).rejects.toThrow();
38
+ });
39
+
40
+ // integration_test_id: ed6ea62d-199c-4446-a3c3-554812707b42
41
+ it('should fail to close if user does not have permissions', async () => {
42
+ client.http.put = jest
43
+ .fn()
44
+ .mockRejectedValueOnce(
45
+ new ASCError('error message', Amity.ServerError.FORBIDDEN, Amity.ErrorLevel.FATAL),
46
+ );
47
+
48
+ await expect(() => closePoll('no-permissions-poll-id')).rejects.toThrow();
49
+ });
50
+ });