@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
@@ -0,0 +1,70 @@
1
+ import { client, poll11 } from '~/utils/tests';
2
+ import { ASCError } from '~/core/errors';
3
+ import { disableCache, enableCache } from '~/cache/api';
4
+ import { createPoll } from '../createPoll';
5
+ import { getPoll } from '../getPoll';
6
+
7
+ describe('createPoll', () => {
8
+ beforeAll(enableCache);
9
+ afterAll(disableCache);
10
+
11
+ const bundle: Parameters<typeof createPoll>[0] = {
12
+ answerType: 'single',
13
+ answers: [
14
+ {
15
+ data: 'answer1',
16
+ dataType: 'text',
17
+ },
18
+ {
19
+ data: 'answer1',
20
+ dataType: 'text',
21
+ },
22
+ ],
23
+ question: 'question',
24
+ };
25
+
26
+ // integration_test_id: 5dc099fd-8e89-4f78-bf6c-fda6dbd06b66
27
+ it('should create a poll with a single answer', async () => {
28
+ client.http.post = jest.fn().mockResolvedValueOnce({ data: { polls: [poll11] } });
29
+
30
+ const { data: poll } = await createPoll(bundle);
31
+ const { data: cachedPoll } = getPoll.locally(poll.pollId)!;
32
+
33
+ expect(poll.pollId).toBeDefined();
34
+ expect(cachedPoll).toMatchObject(poll);
35
+ });
36
+
37
+ // integration_test_id: d18d4f13-6ac5-42f1-822b-a22fc0a7cf90
38
+ it('should create a poll with multiple answers', async () => {
39
+ client.http.post = jest.fn().mockResolvedValueOnce({ data: { polls: [poll11] } });
40
+
41
+ const { data: poll } = await createPoll({
42
+ ...bundle,
43
+ answerType: 'multiple',
44
+ });
45
+
46
+ expect(poll.pollId).toBeDefined();
47
+ });
48
+
49
+ // integration_test_id: 4cda145c-0bc8-4aaf-9ec0-02676bbde8a6
50
+ it('should fail if question exceeds 500 characters', async () => {
51
+ client.http.post = jest
52
+ .fn()
53
+ .mockRejectedValueOnce(
54
+ new ASCError('error message', Amity.ServerError.BUSINESS_ERROR, Amity.ErrorLevel.FATAL),
55
+ );
56
+
57
+ await expect(() => createPoll(bundle)).rejects.toThrow();
58
+ });
59
+
60
+ // integration_test_id: a96780e1-758e-4de7-9c18-fdb34c4cacc7
61
+ it('should fail if question exceeds 200 characters', async () => {
62
+ client.http.post = jest
63
+ .fn()
64
+ .mockRejectedValueOnce(
65
+ new ASCError('error message', Amity.ServerError.BUSINESS_ERROR, Amity.ErrorLevel.FATAL),
66
+ );
67
+
68
+ await expect(() => createPoll(bundle)).rejects.toThrow();
69
+ });
70
+ });
@@ -0,0 +1,31 @@
1
+ import { client, poll11 } from '~/utils/tests';
2
+ import { ASCError } from '~/core/errors';
3
+ import { disableCache, enableCache } from '~/cache/api';
4
+ import { getPoll } from '../getPoll';
5
+
6
+ describe('getPoll', () => {
7
+ beforeAll(enableCache);
8
+ afterAll(disableCache);
9
+
10
+ // integration_test_id: 0d096a75-2f42-489e-8435-e3022eafb1a3
11
+ it('should fetch the poll', async () => {
12
+ client.http.get = jest.fn().mockResolvedValueOnce({ data: { polls: [poll11] } });
13
+
14
+ const { data: poll } = await getPoll(poll11.pollId);
15
+ const { data: cachedPoll } = getPoll.locally(poll11.pollId)!;
16
+
17
+ expect(poll.pollId).toEqual(poll11.pollId);
18
+ expect(cachedPoll).toMatchObject(poll);
19
+ });
20
+
21
+ // integration_test_id: 074fdf85-bbb6-4957-a89e-26aa10871dc4
22
+ it('should fail to fetch if the poll does not exist', async () => {
23
+ client.http.get = jest
24
+ .fn()
25
+ .mockRejectedValueOnce(
26
+ new ASCError('error message', Amity.ServerError.ITEM_NOT_FOUND, Amity.ErrorLevel.FATAL),
27
+ );
28
+
29
+ await expect(() => getPoll('non-existent-poll-id')).rejects.toThrow();
30
+ });
31
+ });
@@ -0,0 +1,41 @@
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 { votePoll } from '../votePoll';
6
+ import { getPoll } from '../getPoll';
7
+
8
+ describe('votePoll', () => {
9
+ beforeAll(enableCache);
10
+ afterAll(disableCache);
11
+
12
+ // integration_test_id: 2abcbca5-f845-4e96-9405-23781013738e
13
+ it('should vote', async () => {
14
+ client.http.post = jest
15
+ .fn()
16
+ .mockResolvedValueOnce({ data: { polls: [{ ...poll11, isVoted: true }] } });
17
+ const callback = jest.fn();
18
+ onPollUpdated(callback);
19
+
20
+ const { data: poll } = await votePoll(poll11.pollId, [poll11.answers[0].id]);
21
+ const { data: cachedPoll } = getPoll.locally(poll.pollId)!;
22
+ await pause();
23
+
24
+ expect(poll.isVoted).toEqual(true);
25
+ expect(cachedPoll).toMatchObject(poll);
26
+ expect(callback).toHaveBeenCalledWith(poll);
27
+ });
28
+
29
+ // integration_test_id: b6ab2681-7f25-47a0-bc14-f4f542a3cf80
30
+ it('should fail to vote for in an invalid poll', async () => {
31
+ client.http.post = jest
32
+ .fn()
33
+ .mockRejectedValueOnce(
34
+ new ASCError('error message', Amity.ServerError.ITEM_NOT_FOUND, Amity.ErrorLevel.FATAL),
35
+ );
36
+
37
+ await expect(() =>
38
+ votePoll('non-existent-poll-id', ['non-existent-answer-id']),
39
+ ).rejects.toThrow();
40
+ });
41
+ });
@@ -21,7 +21,7 @@ import { ingestInCache } from '~/cache/api/ingestInCache';
21
21
  export const onPollDeleted = (callback: Amity.Listener<Amity.Poll>): Amity.Unsubscriber => {
22
22
  const client = getActiveClient();
23
23
 
24
- const filter = (payload: Amity.PollPayload) => {
24
+ const filter = (payload: Amity.Events['poll.deleted']) => {
25
25
  if (client.cache) ingestInCache(payload);
26
26
 
27
27
  callback(payload.polls[0]);
@@ -21,7 +21,7 @@ import { ingestInCache } from '~/cache/api/ingestInCache';
21
21
  export const onPollUpdated = (callback: Amity.Listener<Amity.Poll>): Amity.Unsubscriber => {
22
22
  const client = getActiveClient();
23
23
 
24
- const filter = (payload: Amity.PollPayload) => {
24
+ const filter = (payload: Amity.Events['poll.updated']) => {
25
25
  if (client.cache) ingestInCache(payload);
26
26
 
27
27
  callback(payload.polls[0]);
@@ -2,6 +2,7 @@ import { getActiveClient } from '~/client/api';
2
2
 
3
3
  import { ingestInCache } from '~/cache/api/ingestInCache';
4
4
  import { fireEvent } from '~/core/events';
5
+ import { prepareMembershipPayload } from '~/group/utils';
5
6
 
6
7
  /**
7
8
  * ```js
@@ -24,25 +25,24 @@ export const approvePost = async (
24
25
  const client = getActiveClient();
25
26
  client.log('post/approvePost', postId);
26
27
 
27
- const { data: approved } = await client.http.post<Amity.PostPayload>(
28
+ const { data: payload } = await client.http.post<Amity.PostPayload>(
28
29
  `/api/v3/posts/${encodeURIComponent(postId)}/approve`,
29
30
  );
30
31
 
31
- const cachedAt = client.cache && Date.now();
32
- if (client.cache) ingestInCache(approved, { cachedAt });
32
+ fireEvent('post.approved', payload);
33
33
 
34
34
  // fire virtual event for community update
35
- if (approved.posts[0].targetType === 'community') {
36
- const community = approved.communities?.[0];
37
-
38
- // @ts-ignore as communities is optional currently in PostPayload
39
- fireEvent('community.updated', { communities: [community] });
35
+ if (payload.posts[0].targetType === 'community') {
36
+ fireEvent('community.updated', payload);
40
37
  }
41
38
 
42
- fireEvent('post.approved', { posts: [approved.posts[0]] });
39
+ const data = prepareMembershipPayload(payload, 'communityUsers');
40
+ const cachedAt = client.cache && Date.now();
41
+
42
+ if (client.cache) ingestInCache(data, { cachedAt });
43
43
 
44
44
  return {
45
- data: approved.posts.find(post => post.postId === postId)!,
45
+ data: data.posts.find(post => post.postId === postId)!,
46
46
  cachedAt,
47
47
  };
48
48
  };
@@ -2,6 +2,7 @@ import { getActiveClient } from '~/client/api';
2
2
 
3
3
  import { ingestInCache } from '~/cache/api/ingestInCache';
4
4
  import { fireEvent } from '~/core/events';
5
+ import { prepareMembershipPayload } from '~/group/utils';
5
6
 
6
7
  /**
7
8
  * ```js
@@ -37,12 +38,14 @@ export const createPost = async <T extends Amity.PostContentType | string>(
37
38
  delete bundle.dataType;
38
39
  }
39
40
 
40
- const { data } = await client.http.post<Amity.PostPayload>('/api/v4/posts', bundle);
41
+ const { data: payload } = await client.http.post<Amity.PostPayload>('/api/v4/posts', bundle);
41
42
 
43
+ fireEvent('post.created', payload);
44
+
45
+ const data = prepareMembershipPayload(payload, 'communityUsers');
42
46
  const cachedAt = client.cache && Date.now();
43
- if (client.cache) ingestInCache(data, { cachedAt });
44
47
 
45
- fireEvent('post.created', data);
48
+ if (client.cache) ingestInCache(data, { cachedAt });
46
49
 
47
50
  const { posts } = data;
48
51
 
@@ -2,6 +2,7 @@ import { getActiveClient } from '~/client/api';
2
2
 
3
3
  import { ingestInCache } from '~/cache/api/ingestInCache';
4
4
  import { fireEvent } from '~/core/events';
5
+ import { prepareMembershipPayload } from '~/group/utils';
5
6
 
6
7
  /**
7
8
  * ```js
@@ -24,25 +25,24 @@ export const declinePost = async (
24
25
  const client = getActiveClient();
25
26
  client.log('post/declinePost', postId);
26
27
 
27
- const { data: declined } = await client.http.post<Amity.PostPayload>(
28
+ const { data: payload } = await client.http.post<Amity.PostPayload>(
28
29
  `/api/v3/posts/${encodeURIComponent(postId)}/decline`,
29
30
  );
30
31
 
31
- const cachedAt = client.cache && Date.now();
32
- if (client.cache) ingestInCache(declined, { cachedAt });
33
-
34
32
  // fire virtual event
35
- if (declined.posts[0].targetType === 'community') {
36
- const community = declined.communities?.[0];
37
-
38
- // @ts-ignore as communities is optional currently in PostPayload
39
- fireEvent('community.updated', { communities: [community] });
33
+ if (payload.posts[0].targetType === 'community') {
34
+ fireEvent('community.updated', payload);
40
35
  }
41
36
 
42
- fireEvent('post.declined', { posts: [declined.posts[0]] });
37
+ fireEvent('post.declined', payload);
38
+
39
+ const data = prepareMembershipPayload(payload, 'communityUsers');
40
+ const cachedAt = client.cache && Date.now();
41
+
42
+ if (client.cache) ingestInCache(data, { cachedAt });
43
43
 
44
44
  return {
45
- data: declined.posts.find(post => post.postId === postId)!,
45
+ data: payload.posts.find(post => post.postId === postId)!,
46
46
  cachedAt,
47
47
  };
48
48
  };
@@ -44,13 +44,30 @@ export const deletePost = async (
44
44
  // later when realtime events covers that for us.
45
45
  if (post.data.targetType === 'community') {
46
46
  const community = await getCommunity(post.data.targetId);
47
- fireEvent('community.updated', { communities: [community.data] });
47
+ fireEvent('community.updated', {
48
+ communities: [community.data],
49
+ categories: [],
50
+ communityUsers: [],
51
+ feeds: [],
52
+ files: [],
53
+ users: [],
54
+ });
48
55
  }
49
56
 
50
57
  // to support hard deletion
51
58
  const deleted = { ...post.data, isDeleted: true };
52
59
 
53
- fireEvent('post.deleted', { posts: [deleted] });
60
+ fireEvent('post.deleted', {
61
+ posts: [deleted],
62
+ categories: [],
63
+ comments: [],
64
+ communities: [],
65
+ communityUsers: [],
66
+ feeds: [],
67
+ files: [],
68
+ postChildren: [],
69
+ users: [],
70
+ });
54
71
 
55
72
  if (permanent) {
56
73
  setTimeout(() => {
@@ -5,6 +5,7 @@ import { ingestInCache } from '~/cache/api/ingestInCache';
5
5
  import { isInTombstone } from '~/cache/api/isInTombstone';
6
6
  import { checkIfShouldGoesToTombstone } from '~/cache/utils';
7
7
  import { pushToTombstone } from '~/cache/api/pushToTombstone';
8
+ import { prepareMembershipPayload } from '~/group/utils';
8
9
 
9
10
  /**
10
11
  * ```js
@@ -26,14 +27,14 @@ export const getPost = async (postId: Amity.Post['postId']): Promise<Amity.Cache
26
27
 
27
28
  isInTombstone('post', postId);
28
29
 
29
- let data: Amity.PostPayload;
30
+ let payload: Amity.PostPayload;
30
31
 
31
32
  try {
32
33
  // API-FIX: endpoint should not be /list, parameters should be querystring.
33
34
  const response = await client.http.get<Amity.PostPayload>(
34
35
  `/api/v3/posts/${encodeURIComponent(postId)}`,
35
36
  );
36
- data = response.data;
37
+ payload = response.data;
37
38
  } catch (error) {
38
39
  if (checkIfShouldGoesToTombstone((error as Amity.ErrorResponse)?.code)) {
39
40
  pushToTombstone('post', postId);
@@ -42,6 +43,8 @@ export const getPost = async (postId: Amity.Post['postId']): Promise<Amity.Cache
42
43
  throw error;
43
44
  }
44
45
 
46
+ const data = prepareMembershipPayload(payload, 'communityUsers');
47
+
45
48
  const cachedAt = client.cache && Date.now();
46
49
  if (client.cache) ingestInCache(data, { cachedAt });
47
50
 
@@ -2,6 +2,7 @@ import { getActiveClient } from '~/client/api';
2
2
 
3
3
  import { pullFromCache } from '~/cache/api';
4
4
  import { ingestInCache } from '~/cache/api/ingestInCache';
5
+ import { prepareMembershipPayload } from '~/group/utils';
5
6
 
6
7
  /**
7
8
  * ```js
@@ -26,10 +27,12 @@ export const getPosts = async (
26
27
  const encodedPostIds = postIds.map(postId => encodeURIComponent(postId));
27
28
 
28
29
  // API-FIX: endpoint should not be /list, parameters should be querystring.
29
- const { data } = await client.http.get<Amity.PostPayload>(`/api/v3/posts/list`, {
30
+ const { data: payload } = await client.http.get<Amity.PostPayload>(`/api/v3/posts/list`, {
30
31
  params: { postIds: encodedPostIds },
31
32
  });
32
33
 
34
+ const data = prepareMembershipPayload(payload, 'communityUsers');
35
+
33
36
  const cachedAt = client.cache && Date.now();
34
37
  if (client.cache) ingestInCache(data, { cachedAt });
35
38
 
@@ -5,6 +5,7 @@ import { toToken, toPageRaw } from '~/core/query';
5
5
  import { pullFromCache, pushToCache } from '~/cache/api';
6
6
  import { ingestInCache } from '~/cache/api/ingestInCache';
7
7
  import { getResolver } from '~/core/model';
8
+ import { prepareMembershipPayload } from '~/group/utils';
8
9
 
9
10
  /**
10
11
  * ```js
@@ -53,12 +54,13 @@ export const queryPosts = async (
53
54
  // const { paging, posts } = unwrapPayload(data)
54
55
  // unpacking
55
56
  const { paging, ...payload } = data;
57
+ const paperedPayload = prepareMembershipPayload(payload, 'communityUsers');
56
58
  const { posts } = payload;
57
59
 
58
60
  const cachedAt = client.cache && Date.now();
59
61
 
60
62
  if (client.cache) {
61
- ingestInCache(payload as Amity.PostPayload, { cachedAt });
63
+ ingestInCache(paperedPayload, { cachedAt });
62
64
 
63
65
  const cacheKey = ['post', 'query', { ...params, options: { ...page } } as Amity.Serializable];
64
66
  pushToCache(cacheKey, { posts: posts.map(getResolver('post')), paging });
@@ -74,9 +74,10 @@ describe('queryPosts.locally', () => {
74
74
  enableCache();
75
75
 
76
76
  const { data } = postQueryResponse;
77
- const { posts: expected, paging } = data;
77
+ const { paging, ...payload } = data;
78
+ const { posts: expected } = payload;
78
79
 
79
- ingestInCache(data as Amity.PostPayload);
80
+ ingestInCache(payload as Amity.ProcessedPostPayload);
80
81
 
81
82
  pushToCache(cacheKey, { posts: expected.map(getResolver('post')), paging });
82
83
 
@@ -98,7 +99,7 @@ describe('queryPosts.locally', () => {
98
99
  ingestInCache({
99
100
  ...data,
100
101
  posts: [data.posts[0]],
101
- } as Amity.PostPayload);
102
+ } as Amity.ProcessedPostPayload);
102
103
 
103
104
  pushToCache(cacheKey, {
104
105
  posts: posts.map(getResolver('post')),
@@ -119,7 +120,7 @@ describe('queryPosts.locally', () => {
119
120
  const { data } = postQueryResponse;
120
121
  const { posts: expected, paging } = data;
121
122
 
122
- ingestInCache(data as Amity.PostPayload);
123
+ ingestInCache(data as Amity.ProcessedPostPayload);
123
124
 
124
125
  pushToCache(cacheKey, { posts: expected.map(getResolver('post')), paging });
125
126
 
@@ -2,6 +2,7 @@ import { getActiveClient } from '~/client/api';
2
2
 
3
3
  import { ingestInCache } from '~/cache/api/ingestInCache';
4
4
  import { fireEvent } from '~/core/events';
5
+ import { prepareMembershipPayload } from '~/group/utils';
5
6
 
6
7
  /**
7
8
  * ```js
@@ -32,11 +33,13 @@ export const updatePost = async (
32
33
  const client = getActiveClient();
33
34
  client.log('user/updatePost', patch);
34
35
 
35
- const { data } = await client.http.put<Amity.PostPayload>(
36
+ const { data: payload } = await client.http.put<Amity.PostPayload>(
36
37
  `/api/v4/posts/${encodeURIComponent(postId)}`,
37
38
  patch,
38
39
  );
39
40
 
41
+ const data = prepareMembershipPayload(payload, 'communityUsers');
42
+
40
43
  const cachedAt = client.cache && Date.now();
41
44
  if (client.cache) ingestInCache(data, { cachedAt });
42
45
 
@@ -30,7 +30,7 @@ export const onPostReactionAdded = (callback: Amity.Listener<Amity.Post>): Amity
30
30
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
31
31
  const { reactor, ...postPayload } = payload;
32
32
 
33
- ingestInCache(postPayload as Amity.CommentPayload);
33
+ ingestInCache(postPayload as Amity.ProcessedPostPayload);
34
34
 
35
35
  const post = pullFromCache<Amity.Post>(['post', 'get', payload.posts[0].postId])!;
36
36
 
@@ -30,7 +30,7 @@ export const onPostReactionRemoved = (callback: Amity.Listener<Amity.Post>): Ami
30
30
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
31
31
  const { reactor, ...postPayload } = payload;
32
32
 
33
- ingestInCache(postPayload as Amity.CommentPayload);
33
+ ingestInCache(postPayload as Amity.ProcessedPostPayload);
34
34
 
35
35
  const post = pullFromCache<Amity.Post>(['post', 'get', payload.posts[0].postId])!;
36
36
 
@@ -2,6 +2,7 @@ import { getActiveClient } from '~/client/api';
2
2
  import { ingestInCache } from '~/cache/api/ingestInCache';
3
3
  import { createEventSubscriber, fireEvent } from '~/core/events';
4
4
  import { queryCache, upsertInCache, pullFromCache } from '~/cache/api';
5
+ import { prepareMembershipPayload } from '~/group/utils';
5
6
 
6
7
  export const createPostEventSubscriber = (
7
8
  event: keyof Amity.MqttPostEvents,
@@ -15,10 +16,19 @@ export const createPostEventSubscriber = (
15
16
  } else {
16
17
  const { communities, ...others } = payload;
17
18
 
18
- ingestInCache(others as Amity.PostPayload);
19
+ const data = prepareMembershipPayload(others, 'communityUsers');
20
+
21
+ ingestInCache(data);
19
22
 
20
23
  if (communities?.[0] && !['post.updated'].includes(event)) {
21
- fireEvent('community.updated', { communities });
24
+ fireEvent('community.updated', {
25
+ communities,
26
+ categories: [],
27
+ communityUsers: [],
28
+ feeds: [],
29
+ files: [],
30
+ users: [],
31
+ });
22
32
  }
23
33
 
24
34
  const post = pullFromCache<Amity.Post>(['post', 'get', payload.posts[0].postId])!;
@@ -6,13 +6,20 @@ import {
6
6
  disconnectClient,
7
7
  generatePost,
8
8
  user12,
9
+ emptyPostPayload,
9
10
  } from '~/utils/tests';
10
11
  import { getFutureDate } from '~/core/model';
12
+
11
13
  import { livePost } from '../livePost';
12
14
 
13
15
  describe('livePost', () => {
14
16
  const post = generatePost();
15
- const response = { data: { posts: [post] } };
17
+ const response = {
18
+ data: {
19
+ ...emptyPostPayload,
20
+ posts: [post],
21
+ } as Amity.PostPayload,
22
+ };
16
23
 
17
24
  beforeAll(async () => {
18
25
  await connectClient();
@@ -47,7 +54,7 @@ describe('livePost', () => {
47
54
 
48
55
  livePost(post.postId, callback);
49
56
  await pause();
50
- client.emitter.emit(event, { posts: [update] });
57
+ client.emitter.emit(event, { ...emptyPostPayload, posts: [update] });
51
58
  await pause();
52
59
 
53
60
  expect(callback).toHaveBeenCalledTimes(3);
@@ -82,7 +89,7 @@ describe('livePost', () => {
82
89
 
83
90
  livePost(post.postId, callback);
84
91
  await pause();
85
- client.emitter.emit(event, { posts: [update], reactor });
92
+ client.emitter.emit(event, { ...emptyPostPayload, posts: [update], reactor });
86
93
  await pause();
87
94
 
88
95
  expect(callback).toHaveBeenCalledTimes(3);
@@ -9,6 +9,7 @@ import {
9
9
  post14,
10
10
  postQueryResponse,
11
11
  postQueryResponsePage2,
12
+ emptyPostPayload,
12
13
  } from '~/utils/tests';
13
14
 
14
15
  import { livePosts } from '../livePosts';
@@ -168,9 +169,7 @@ describe('livePosts', () => {
168
169
  await pause();
169
170
  expect(callback).toHaveBeenCalledTimes(2);
170
171
 
171
- client.emitter.emit(event, {
172
- posts: [post],
173
- });
172
+ client.emitter.emit(event, { ...emptyPostPayload, posts: [post] });
174
173
 
175
174
  const payload = postQueryResponse.data;
176
175
  const deletePayload = payload.posts.filter(p => p.postId !== post.postId);
@@ -209,6 +208,7 @@ describe('livePosts', () => {
209
208
  'it should update post in collection onReactionAdded',
210
209
  'post.addReaction',
211
210
  {
211
+ ...emptyPostPayload,
212
212
  posts: [{ ...post11, reactionsCount: 1 }],
213
213
  reactor: {
214
214
  referenceId: post11.postId,
@@ -224,6 +224,7 @@ describe('livePosts', () => {
224
224
  'it should update post in collection onReactionRemoved',
225
225
  'post.removeReaction',
226
226
  {
227
+ ...emptyPostPayload,
227
228
  posts: [{ ...post11, reactionsCount: 0 }],
228
229
  reactor: {
229
230
  referenceId: post11.postId,
@@ -277,6 +278,7 @@ describe('livePosts', () => {
277
278
  expect(callback).toHaveBeenNthCalledWith(2, expect.objectContaining(snapshot));
278
279
 
279
280
  client.emitter.emit('post.deleted', {
281
+ ...emptyPostPayload,
280
282
  posts: [deletedPost],
281
283
  });
282
284
 
@@ -303,6 +305,7 @@ describe('livePosts', () => {
303
305
  expect(callback).toHaveBeenNthCalledWith(2, expect.objectContaining(snapshot));
304
306
 
305
307
  client.emitter.emit('post.approved', {
308
+ ...emptyPostPayload,
306
309
  posts: [approvedPost],
307
310
  feeds: [
308
311
  {
@@ -323,7 +326,11 @@ describe('livePosts', () => {
323
326
  const feedId = 'publishedFeed';
324
327
  const approvedPost = { ...post14, feedId };
325
328
 
326
- const approvedFeed = { ...postQueryResponsePage2.data.feeds[0], feedType: 'published' };
329
+ const approvedFeed = {
330
+ ...postQueryResponsePage2.data.feeds[0],
331
+ feedType: 'published' as const,
332
+ };
333
+
327
334
  postQueryResponsePage2.data.feeds = [approvedFeed];
328
335
 
329
336
  const callback = jest.fn();
@@ -341,6 +348,7 @@ describe('livePosts', () => {
341
348
  expect(callback).toHaveBeenNthCalledWith(2, expect.objectContaining(snapshot));
342
349
 
343
350
  client.emitter.emit('post.approved', {
351
+ ...emptyPostPayload,
344
352
  posts: [approvedPost],
345
353
  feeds: [
346
354
  {
@@ -1,5 +1,5 @@
1
1
  import { ASCApiError } from '~/core/errors';
2
- import { client, posts } from '~/utils/tests';
2
+ import { client, emptyPostPayload, posts } from '~/utils/tests';
3
3
  import { pushToCache, enableCache, disableCache } from '~/cache/api';
4
4
 
5
5
  import { getPost } from '~/post/api';
@@ -44,7 +44,12 @@ describe('post/api', () => {
44
44
 
45
45
  describe('getPost', () => {
46
46
  test('should return a post', async () => {
47
- client.http.get = jest.fn().mockReturnValueOnce({ data: { posts: [post] } });
47
+ client.http.get = jest.fn().mockReturnValueOnce({
48
+ data: {
49
+ ...emptyPostPayload,
50
+ posts: [post],
51
+ },
52
+ });
48
53
 
49
54
  const data = await getPost(post.postId);
50
55
 
@@ -54,7 +59,12 @@ describe('post/api', () => {
54
59
 
55
60
  test('should put post into the cache after fetch', async () => {
56
61
  enableCache();
57
- client.http.get = jest.fn().mockReturnValueOnce({ data: { posts: [post] } });
62
+ client.http.get = jest.fn().mockReturnValueOnce({
63
+ data: {
64
+ ...emptyPostPayload,
65
+ posts: [post],
66
+ },
67
+ });
58
68
 
59
69
  await getPost(post.postId);
60
70