@amityco/ts-sdk 0.0.1-beta.27 → 0.0.1-beta.29
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.
- package/.eslintrc.json +1 -0
- package/dist/@types/core/payload.d.ts +15 -13
- package/dist/@types/core/payload.d.ts.map +1 -1
- package/dist/@types/domains/channel.d.ts +17 -1
- package/dist/@types/domains/channel.d.ts.map +1 -1
- package/dist/@types/domains/client.d.ts +13 -0
- package/dist/@types/domains/client.d.ts.map +1 -1
- package/dist/@types/domains/community.d.ts +24 -2
- package/dist/@types/domains/community.d.ts.map +1 -1
- package/dist/@types/domains/content.d.ts +27 -3
- package/dist/@types/domains/content.d.ts.map +1 -1
- package/dist/@types/domains/file.d.ts +36 -3
- package/dist/@types/domains/file.d.ts.map +1 -1
- package/dist/@types/domains/follow.d.ts +11 -0
- package/dist/@types/domains/follow.d.ts.map +1 -1
- package/dist/@types/domains/group.d.ts +1 -0
- package/dist/@types/domains/group.d.ts.map +1 -1
- package/dist/@types/domains/message.d.ts +13 -0
- package/dist/@types/domains/message.d.ts.map +1 -1
- package/dist/@types/global.d.ts +1 -0
- package/dist/@types/global.d.ts.map +1 -1
- package/dist/@types/index.d.ts +3 -3
- package/dist/@types/index.d.ts.map +1 -1
- package/dist/channel/api/addChannelMembers.d.ts.map +1 -1
- package/dist/channel/api/addChannelMembersRole.d.ts.map +1 -1
- package/dist/channel/api/banChannelMembers.d.ts.map +1 -1
- package/dist/channel/api/createChannel.d.ts.map +1 -1
- package/dist/channel/api/getChannel.d.ts.map +1 -1
- package/dist/channel/api/getChannels.d.ts.map +1 -1
- package/dist/channel/api/joinChannel.d.ts.map +1 -1
- package/dist/channel/api/leaveChannel.d.ts.map +1 -1
- package/dist/channel/api/queryChannelMembers.d.ts.map +1 -1
- package/dist/channel/api/queryChannels.d.ts +1 -10
- package/dist/channel/api/queryChannels.d.ts.map +1 -1
- package/dist/channel/api/removeChannelMembers.d.ts.map +1 -1
- package/dist/channel/api/removeChannelMembersRole.d.ts.map +1 -1
- package/dist/channel/api/unbanChannelMembers.d.ts.map +1 -1
- package/dist/channel/api/updateChannel.d.ts.map +1 -1
- package/dist/channel/events/index.d.ts +1 -0
- package/dist/channel/events/index.d.ts.map +1 -1
- package/dist/channel/events/onChannelCreated.d.ts.map +1 -1
- package/dist/channel/events/onChannelDeleted.d.ts.map +1 -1
- package/dist/channel/events/onChannelJoined.d.ts.map +1 -1
- package/dist/channel/events/onChannelLeft.d.ts.map +1 -1
- package/dist/channel/events/onChannelMemberAdded.d.ts.map +1 -1
- package/dist/channel/events/onChannelMemberRemoved.d.ts.map +1 -1
- package/dist/channel/events/onChannelUpdated.d.ts.map +1 -1
- package/dist/channel/observers/index.d.ts +2 -0
- package/dist/channel/observers/index.d.ts.map +1 -1
- package/dist/channel/observers/liveChannels.d.ts +20 -0
- package/dist/channel/observers/liveChannels.d.ts.map +1 -0
- package/dist/channel/observers/observeChannel.d.ts +1 -1
- package/dist/channel/observers/observeChannel.d.ts.map +1 -1
- package/dist/channel/observers/observeChannels.d.ts +17 -0
- package/dist/channel/observers/observeChannels.d.ts.map +1 -0
- package/dist/channel/observers/tests/liveChannels.test.d.ts +2 -0
- package/dist/channel/observers/tests/liveChannels.test.d.ts.map +1 -0
- package/dist/channel/tests/utils/prepareChannelPayload.test.d.ts +2 -0
- package/dist/channel/tests/utils/prepareChannelPayload.test.d.ts.map +1 -0
- package/dist/channel/utils/index.d.ts +2 -0
- package/dist/channel/utils/index.d.ts.map +1 -0
- package/dist/channel/utils/prepareChannelPayload.d.ts +3 -0
- package/dist/channel/utils/prepareChannelPayload.d.ts.map +1 -0
- package/dist/client/api/connectClient.d.ts +1 -8
- package/dist/client/api/connectClient.d.ts.map +1 -1
- package/dist/client/api/createClient.d.ts +8 -1
- package/dist/client/api/createClient.d.ts.map +1 -1
- package/dist/client/api/getFeedSettings.d.ts +16 -0
- package/dist/client/api/getFeedSettings.d.ts.map +1 -0
- package/dist/client/api/index.d.ts +1 -0
- package/dist/client/api/index.d.ts.map +1 -1
- package/dist/community/api/createCommunity.d.ts +1 -1
- package/dist/community/api/createCommunity.d.ts.map +1 -1
- package/dist/community/api/getCommunities.d.ts.map +1 -1
- package/dist/community/api/getCommunity.d.ts.map +1 -1
- package/dist/community/api/getRecommendedCommunities.d.ts.map +1 -1
- package/dist/community/api/getTopTrendingCommunities.d.ts.map +1 -1
- package/dist/community/api/queryCommunities.d.ts.map +1 -1
- package/dist/community/api/updateCommunity.d.ts +1 -1
- package/dist/community/api/updateCommunity.d.ts.map +1 -1
- package/dist/community/events/utils.d.ts.map +1 -1
- package/dist/community/utils/index.d.ts +2 -0
- package/dist/community/utils/index.d.ts.map +1 -0
- package/dist/community/utils/payload.d.ts +11 -0
- package/dist/community/utils/payload.d.ts.map +1 -0
- package/dist/core/events.d.ts +3 -3
- package/dist/core/events.d.ts.map +1 -1
- package/dist/core/query/query.d.ts +1 -1
- package/dist/core/tests/query/query/runQuery.test.d.ts +2 -0
- package/dist/core/tests/query/query/runQuery.test.d.ts.map +1 -0
- package/dist/file/api/createVideo.d.ts +2 -1
- package/dist/file/api/createVideo.d.ts.map +1 -1
- package/dist/follow/api/queryFollowers.d.ts +1 -5
- package/dist/follow/api/queryFollowers.d.ts.map +1 -1
- package/dist/follow/api/queryFollowings.d.ts +1 -5
- package/dist/follow/api/queryFollowings.d.ts.map +1 -1
- package/dist/follow/observers/index.d.ts +2 -0
- package/dist/follow/observers/index.d.ts.map +1 -1
- package/dist/follow/observers/liveFollowers.d.ts +20 -0
- package/dist/follow/observers/liveFollowers.d.ts.map +1 -0
- package/dist/follow/observers/liveFollowings.d.ts +20 -0
- package/dist/follow/observers/liveFollowings.d.ts.map +1 -0
- package/dist/follow/tests/observers/liveFollowers.test.d.ts +2 -0
- package/dist/follow/tests/observers/liveFollowers.test.d.ts.map +1 -0
- package/dist/follow/tests/observers/liveFollowings.test.d.ts +2 -0
- package/dist/follow/tests/observers/liveFollowings.test.d.ts.map +1 -0
- package/dist/index.cjs.js +751 -128
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.esm.js +737 -129
- package/dist/index.umd.js +4 -4
- package/dist/message/api/queryMessages.d.ts +1 -10
- package/dist/message/api/queryMessages.d.ts.map +1 -1
- package/dist/message/observers/index.d.ts +1 -0
- package/dist/message/observers/index.d.ts.map +1 -1
- package/dist/message/observers/liveMessages.d.ts +20 -0
- package/dist/message/observers/liveMessages.d.ts.map +1 -0
- package/dist/message/observers/observeMessages.d.ts +0 -1
- package/dist/message/observers/observeMessages.d.ts.map +1 -1
- package/dist/message/observers/tests/liveMessages.test.d.ts +2 -0
- package/dist/message/observers/tests/liveMessages.test.d.ts.map +1 -0
- package/dist/post/observers/livePosts.d.ts.map +1 -1
- package/dist/utils/constants.d.ts +1 -0
- package/dist/utils/constants.d.ts.map +1 -1
- package/dist/utils/tests/client.d.ts +5 -2
- package/dist/utils/tests/client.d.ts.map +1 -1
- package/dist/utils/tests/dummy/channel.d.ts +33 -0
- package/dist/utils/tests/dummy/channel.d.ts.map +1 -0
- package/dist/utils/tests/dummy/follow.d.ts +12 -0
- package/dist/utils/tests/dummy/follow.d.ts.map +1 -0
- package/dist/utils/tests/dummy/index.d.ts +11 -0
- package/dist/utils/tests/dummy/index.d.ts.map +1 -0
- package/dist/utils/tests/dummy/message.d.ts +8 -0
- package/dist/utils/tests/dummy/message.d.ts.map +1 -0
- package/dist/utils/tests/{dummy.d.ts → dummy/post.d.ts} +3 -2
- package/dist/utils/tests/dummy/post.d.ts.map +1 -0
- package/dist/utils/tests/dummy/user.d.ts +5 -0
- package/dist/utils/tests/dummy/user.d.ts.map +1 -0
- package/dist/utils/tests/index.d.ts +3 -2
- package/dist/utils/tests/index.d.ts.map +1 -1
- package/dist/utils/tests/utils.d.ts +2 -0
- package/dist/utils/tests/utils.d.ts.map +1 -0
- package/package.json +1 -1
- package/src/@types/core/payload.ts +19 -13
- package/src/@types/domains/channel.ts +34 -1
- package/src/@types/domains/client.ts +17 -0
- package/src/@types/domains/community.ts +27 -2
- package/src/@types/domains/content.ts +35 -3
- package/src/@types/domains/file.ts +42 -3
- package/src/@types/domains/follow.ts +28 -0
- package/src/@types/domains/group.ts +1 -0
- package/src/@types/domains/message.ts +20 -0
- package/src/@types/global.ts +2 -0
- package/src/@types/index.ts +4 -3
- package/src/channel/api/addChannelMembers.ts +6 -5
- package/src/channel/api/addChannelMembersRole.ts +5 -1
- package/src/channel/api/banChannelMembers.ts +7 -3
- package/src/channel/api/createChannel.ts +6 -2
- package/src/channel/api/getChannel.ts +5 -1
- package/src/channel/api/getChannels.ts +5 -1
- package/src/channel/api/joinChannel.ts +5 -1
- package/src/channel/api/leaveChannel.ts +5 -1
- package/src/channel/api/queryChannelMembers.ts +16 -12
- package/src/channel/api/queryChannels.ts +12 -14
- package/src/channel/api/removeChannelMembers.ts +6 -5
- package/src/channel/api/removeChannelMembersRole.ts +5 -1
- package/src/channel/api/unbanChannelMembers.ts +7 -3
- package/src/channel/api/updateChannel.ts +5 -1
- package/src/channel/events/index.ts +1 -0
- package/src/channel/events/onChannelCreated.ts +6 -2
- package/src/channel/events/onChannelDeleted.ts +6 -2
- package/src/channel/events/onChannelJoined.ts +6 -2
- package/src/channel/events/onChannelLeft.ts +6 -2
- package/src/channel/events/onChannelMemberAdded.ts +6 -2
- package/src/channel/events/onChannelMemberRemoved.ts +6 -2
- package/src/channel/events/onChannelUpdated.ts +6 -2
- package/src/channel/observers/index.ts +2 -0
- package/src/channel/observers/liveChannels.ts +178 -0
- package/src/channel/observers/observeChannel.ts +1 -11
- package/src/channel/observers/observeChannels.ts +59 -0
- package/src/channel/observers/tests/liveChannels.test.ts +173 -0
- package/src/channel/tests/utils/prepareChannelPayload.test.ts +120 -0
- package/src/channel/utils/index.ts +1 -0
- package/src/channel/utils/prepareChannelPayload.ts +31 -0
- package/src/client/api/connectClient.ts +4 -9
- package/src/client/api/createClient.ts +19 -4
- package/src/client/api/getFeedSettings.ts +29 -0
- package/src/client/api/index.ts +2 -0
- package/src/community/api/createCommunity.ts +9 -3
- package/src/community/api/getCommunities.ts +10 -3
- package/src/community/api/getCommunity.ts +5 -1
- package/src/community/api/getRecommendedCommunities.ts +5 -2
- package/src/community/api/getTopTrendingCommunities.ts +4 -1
- package/src/community/api/queryCommunities.ts +5 -2
- package/src/community/api/updateCommunity.ts +7 -3
- package/src/community/events/utils.ts +13 -7
- package/src/community/utils/index.ts +1 -0
- package/src/community/utils/payload.ts +44 -0
- package/src/core/events.ts +2 -1
- package/src/core/model/identifyModel.ts +1 -1
- package/src/core/query/query.ts +3 -3
- package/src/core/tests/query/query/runQuery.test.ts +182 -0
- package/src/file/api/createVideo.ts +6 -0
- package/src/follow/api/queryFollowers.ts +3 -5
- package/src/follow/api/queryFollowings.ts +3 -5
- package/src/follow/api/utils.ts +7 -3
- package/src/follow/observers/index.ts +3 -0
- package/src/follow/observers/liveFollowers.ts +149 -0
- package/src/follow/observers/liveFollowings.ts +149 -0
- package/src/follow/tests/observers/liveFollowers.test.ts +240 -0
- package/src/follow/tests/observers/liveFollowings.test.ts +239 -0
- package/src/index.ts +1 -1
- package/src/message/api/queryMessages.ts +3 -10
- package/src/message/observers/index.ts +1 -0
- package/src/message/observers/liveMessages.ts +141 -0
- package/src/message/observers/observeMessages.ts +0 -1
- package/src/message/observers/tests/liveMessages.test.ts +313 -0
- package/src/post/observers/livePosts.ts +2 -1
- package/src/post/tests/api/getPost.test.ts +3 -3
- package/src/post/tests/api/queryPosts.test.ts +4 -4
- package/src/utils/constants.ts +1 -0
- package/src/utils/tests/client.ts +31 -3
- package/src/utils/tests/dummy/channel.ts +96 -0
- package/src/utils/tests/dummy/follow.ts +60 -0
- package/src/utils/tests/dummy/index.ts +8 -0
- package/src/utils/tests/dummy/message.ts +21 -0
- package/src/utils/tests/dummy/post.ts +31 -0
- package/src/utils/tests/dummy/user.ts +26 -0
- package/src/utils/tests/index.ts +3 -2
- package/src/utils/tests/utils.ts +3 -0
- package/dist/utils/tests/dummy.d.ts.map +0 -1
- package/src/utils/tests/dummy.ts +0 -7
package/src/client/api/index.ts
CHANGED
|
@@ -3,6 +3,8 @@ import { getActiveClient } from '~/client/api';
|
|
|
3
3
|
import { ingestInCache } from '~/cache/api/ingestInCache';
|
|
4
4
|
import { fireEvent } from '~/core/events';
|
|
5
5
|
|
|
6
|
+
import { packCommunityPayload, unpackCommunityPayload } from '../utils';
|
|
7
|
+
|
|
6
8
|
/**
|
|
7
9
|
* ```js
|
|
8
10
|
* import { createCommunity } from '@amityco/ts-sdk'
|
|
@@ -25,8 +27,7 @@ export const createCommunity = async (
|
|
|
25
27
|
| 'description'
|
|
26
28
|
| 'isPublic'
|
|
27
29
|
| 'isOfficial'
|
|
28
|
-
| '
|
|
29
|
-
| 'needApprovalOnPostCreation'
|
|
30
|
+
| 'postSetting'
|
|
30
31
|
| 'tags'
|
|
31
32
|
| 'metadata'
|
|
32
33
|
> & {
|
|
@@ -38,7 +39,12 @@ export const createCommunity = async (
|
|
|
38
39
|
const client = getActiveClient();
|
|
39
40
|
client.log('user/createCommunity', bundle);
|
|
40
41
|
|
|
41
|
-
const { data } = await client.http.post<Amity.CommunityPayload>(
|
|
42
|
+
const { data: payload } = await client.http.post<Amity.CommunityPayload>(
|
|
43
|
+
'/api/v3/communities/',
|
|
44
|
+
packCommunityPayload(bundle),
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
const data = unpackCommunityPayload(payload);
|
|
42
48
|
|
|
43
49
|
const cachedAt = client.cache && Date.now();
|
|
44
50
|
if (client.cache) ingestInCache(data, { cachedAt });
|
|
@@ -3,6 +3,8 @@ import { getActiveClient } from '~/client/api';
|
|
|
3
3
|
import { pullFromCache } from '~/cache/api';
|
|
4
4
|
import { ingestInCache } from '~/cache/api/ingestInCache';
|
|
5
5
|
|
|
6
|
+
import { unpackCommunityPayload } from '../utils';
|
|
7
|
+
|
|
6
8
|
/**
|
|
7
9
|
* ```js
|
|
8
10
|
* import { getCommunities } from '@amityco/ts-sdk'
|
|
@@ -24,9 +26,14 @@ export const getCommunities = async (
|
|
|
24
26
|
client.log('community/getCommunities', communityIds);
|
|
25
27
|
|
|
26
28
|
// API-FIX: endpoint should not be /list, parameters should be querystring.
|
|
27
|
-
const { data } = await client.http.get<Amity.CommunityPayload>(
|
|
28
|
-
|
|
29
|
-
|
|
29
|
+
const { data: payload } = await client.http.get<Amity.CommunityPayload>(
|
|
30
|
+
`/api/v3/communities/list`,
|
|
31
|
+
{
|
|
32
|
+
params: { communityIds },
|
|
33
|
+
},
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
const data = unpackCommunityPayload(payload);
|
|
30
37
|
|
|
31
38
|
const cachedAt = client.cache && Date.now();
|
|
32
39
|
if (client.cache) ingestInCache(data, { cachedAt });
|
|
@@ -3,6 +3,8 @@ import { getActiveClient } from '~/client/api';
|
|
|
3
3
|
import { pullFromCache } from '~/cache/api';
|
|
4
4
|
import { ingestInCache } from '~/cache/api/ingestInCache';
|
|
5
5
|
|
|
6
|
+
import { unpackCommunityPayload } from '../utils';
|
|
7
|
+
|
|
6
8
|
/**
|
|
7
9
|
* ```js
|
|
8
10
|
* import { getCommunity } from '@amityco/ts-sdk'
|
|
@@ -24,10 +26,12 @@ export const getCommunity = async (
|
|
|
24
26
|
client.log('community/getCommunity', communityId);
|
|
25
27
|
|
|
26
28
|
// API-FIX: endpoint should not be /list, parameters should be querystring.
|
|
27
|
-
const { data } = await client.http.get<Amity.CommunityPayload>(
|
|
29
|
+
const { data: payload } = await client.http.get<Amity.CommunityPayload>(
|
|
28
30
|
`/api/v3/communities/${communityId}`,
|
|
29
31
|
);
|
|
30
32
|
|
|
33
|
+
const data = unpackCommunityPayload(payload);
|
|
34
|
+
|
|
31
35
|
const cachedAt = client.cache && Date.now();
|
|
32
36
|
if (client.cache) ingestInCache(data, { cachedAt });
|
|
33
37
|
|
|
@@ -4,6 +4,8 @@ import { getResolver } from '~/core/model';
|
|
|
4
4
|
import { pullFromCache, pushToCache } from '~/cache/api';
|
|
5
5
|
import { ingestInCache } from '~/cache/api/ingestInCache';
|
|
6
6
|
|
|
7
|
+
import { unpackCommunityPayload } from '../utils';
|
|
8
|
+
|
|
7
9
|
/**
|
|
8
10
|
* ```js
|
|
9
11
|
* import { getRecommendedCommunities } from '@amityco/ts-sdk'
|
|
@@ -27,12 +29,13 @@ export const getRecommendedCommunities = async (
|
|
|
27
29
|
const { limit = 5 } = query ?? {};
|
|
28
30
|
|
|
29
31
|
// API-FIX: backend doesnt answer Amity.Response
|
|
30
|
-
// const { data } = await client.http.get<Amity.Response<CommunityPayload>>(
|
|
31
|
-
const { data } = await client.http.get<Amity.CommunityPayload>(
|
|
32
|
+
// const { data: payload } = await client.http.get<Amity.Response<CommunityPayload>>(
|
|
33
|
+
const { data: payload } = await client.http.get<Amity.CommunityPayload>(
|
|
32
34
|
`/api/v3/communities/recommended`,
|
|
33
35
|
{ params: { options: { limit } } },
|
|
34
36
|
);
|
|
35
37
|
|
|
38
|
+
const data = unpackCommunityPayload(payload);
|
|
36
39
|
const { communities } = data;
|
|
37
40
|
|
|
38
41
|
const cachedAt = client.cache && Date.now();
|
|
@@ -4,6 +4,8 @@ import { getResolver } from '~/core/model';
|
|
|
4
4
|
import { pullFromCache, pushToCache } from '~/cache/api';
|
|
5
5
|
import { ingestInCache } from '~/cache/api/ingestInCache';
|
|
6
6
|
|
|
7
|
+
import { unpackCommunityPayload } from '../utils';
|
|
8
|
+
|
|
7
9
|
/**
|
|
8
10
|
* ```js
|
|
9
11
|
* import { getTopTrendingCommunities } from '@amityco/ts-sdk'
|
|
@@ -28,11 +30,12 @@ export const getTopTrendingCommunities = async (
|
|
|
28
30
|
|
|
29
31
|
// API-FIX: backend doesnt answer Amity.Response
|
|
30
32
|
// const { data } = await client.http.get<Amity.Response<CommunityPayload>>(
|
|
31
|
-
const { data } = await client.http.get<Amity.CommunityPayload>(
|
|
33
|
+
const { data: payload } = await client.http.get<Amity.CommunityPayload>(
|
|
32
34
|
`/api/v3/communities/top-trending`,
|
|
33
35
|
{ params: { options: { limit } } },
|
|
34
36
|
);
|
|
35
37
|
|
|
38
|
+
const data = unpackCommunityPayload(payload);
|
|
36
39
|
const { communities } = data;
|
|
37
40
|
|
|
38
41
|
const cachedAt = client.cache && Date.now();
|
|
@@ -5,6 +5,8 @@ import { pushToCache } from '~/cache/api';
|
|
|
5
5
|
import { ingestInCache } from '~/cache/api/ingestInCache';
|
|
6
6
|
import { getResolver } from '~/core/model';
|
|
7
7
|
|
|
8
|
+
import { unpackCommunityPayload } from '../utils';
|
|
9
|
+
|
|
8
10
|
/**
|
|
9
11
|
* ```js
|
|
10
12
|
* import { queryCommunities } from '@amityco/ts-sdk'
|
|
@@ -54,12 +56,13 @@ export const queryCommunities = async (query?: {
|
|
|
54
56
|
);
|
|
55
57
|
|
|
56
58
|
const { paging, ...payload } = data;
|
|
57
|
-
const
|
|
59
|
+
const unpackedPayload = unpackCommunityPayload(payload);
|
|
60
|
+
const { communities } = unpackedPayload;
|
|
58
61
|
|
|
59
62
|
const cachedAt = client.cache && Date.now();
|
|
60
63
|
|
|
61
64
|
if (client.cache) {
|
|
62
|
-
ingestInCache(
|
|
65
|
+
ingestInCache(unpackedPayload as Amity.CommunityPayload, { cachedAt });
|
|
63
66
|
|
|
64
67
|
const cacheKey = [
|
|
65
68
|
'community',
|
|
@@ -3,6 +3,8 @@ import { getActiveClient } from '~/client/api';
|
|
|
3
3
|
import { ingestInCache } from '~/cache/api/ingestInCache';
|
|
4
4
|
import { fireEvent } from '~/core/events';
|
|
5
5
|
|
|
6
|
+
import { packCommunityPayload, unpackCommunityPayload } from '../utils';
|
|
7
|
+
|
|
6
8
|
/**
|
|
7
9
|
* ```js
|
|
8
10
|
* import { updateCommunity } from '@amityco/ts-sdk'
|
|
@@ -22,17 +24,19 @@ export const updateCommunity = async (
|
|
|
22
24
|
communityId: Amity.Community['communityId'],
|
|
23
25
|
patch: Patch<
|
|
24
26
|
Amity.Community,
|
|
25
|
-
'displayName' | 'description' | 'avatarFileId' | 'tags' | 'metadata'
|
|
27
|
+
'displayName' | 'description' | 'avatarFileId' | 'postSetting' | 'tags' | 'metadata'
|
|
26
28
|
>,
|
|
27
29
|
): Promise<Amity.Cached<Amity.Community>> => {
|
|
28
30
|
const client = getActiveClient();
|
|
29
31
|
client.log('community/updateCommunity', communityId, patch);
|
|
30
32
|
|
|
31
|
-
const { data } = await client.http.put<Amity.CommunityPayload>(
|
|
33
|
+
const { data: payload } = await client.http.put<Amity.CommunityPayload>(
|
|
32
34
|
`/api/v3/communities/${communityId}`,
|
|
33
|
-
patch,
|
|
35
|
+
packCommunityPayload(patch),
|
|
34
36
|
);
|
|
35
37
|
|
|
38
|
+
const data = unpackCommunityPayload(payload);
|
|
39
|
+
|
|
36
40
|
const cachedAt = client.cache && Date.now();
|
|
37
41
|
if (client.cache) ingestInCache(data, { cachedAt });
|
|
38
42
|
|
|
@@ -4,6 +4,8 @@ import { createEventSubscriber } from '~/core/events';
|
|
|
4
4
|
import { pullFromCache } from '~/cache/api';
|
|
5
5
|
import { getResolver } from '~/core/model';
|
|
6
6
|
|
|
7
|
+
import { unpackCommunityPayload } from '../utils';
|
|
8
|
+
|
|
7
9
|
export const createCommunityEventSubscriber = (
|
|
8
10
|
event: keyof Amity.MqttCommunityMessageEvents,
|
|
9
11
|
callback: Amity.Listener<Amity.Community>,
|
|
@@ -11,16 +13,18 @@ export const createCommunityEventSubscriber = (
|
|
|
11
13
|
const client = getActiveClient();
|
|
12
14
|
|
|
13
15
|
const filter = (payload: Amity.CommunityPayload) => {
|
|
16
|
+
const unpackedPayload = unpackCommunityPayload(payload);
|
|
17
|
+
|
|
14
18
|
if (!client.cache) {
|
|
15
19
|
// TODO: here we are missing specific properties here!
|
|
16
|
-
callback(
|
|
20
|
+
callback(unpackedPayload.communities[0]);
|
|
17
21
|
} else {
|
|
18
|
-
ingestInCache(
|
|
22
|
+
ingestInCache(unpackedPayload);
|
|
19
23
|
|
|
20
24
|
const community = pullFromCache<Amity.Community>([
|
|
21
25
|
'community',
|
|
22
26
|
'get',
|
|
23
|
-
|
|
27
|
+
unpackedPayload.communities[0].communityId,
|
|
24
28
|
])!;
|
|
25
29
|
|
|
26
30
|
callback(community.data);
|
|
@@ -77,21 +81,23 @@ export const createCommunityMemberEventSubscriber = (
|
|
|
77
81
|
const client = getActiveClient();
|
|
78
82
|
|
|
79
83
|
const filter = (payload: Amity.CommunityMembershipPayload) => {
|
|
84
|
+
const unpackedPayload = unpackCommunityPayload(payload);
|
|
85
|
+
|
|
80
86
|
if (!client.cache) {
|
|
81
87
|
// TODO: here we are missing specific properties here!
|
|
82
|
-
callback(
|
|
88
|
+
callback(unpackedPayload.communities[0], getEventRelatedMember(event, unpackedPayload));
|
|
83
89
|
} else {
|
|
84
|
-
ingestInCache(
|
|
90
|
+
ingestInCache(unpackedPayload);
|
|
85
91
|
|
|
86
92
|
const community = pullFromCache<Amity.Community>([
|
|
87
93
|
'community',
|
|
88
94
|
'get',
|
|
89
|
-
|
|
95
|
+
unpackedPayload.communities[0].communityId,
|
|
90
96
|
])!;
|
|
91
97
|
const member = pullFromCache<Amity.Membership<'community'>>([
|
|
92
98
|
'communityUsers',
|
|
93
99
|
'get',
|
|
94
|
-
getResolver('communityUsers')(getEventRelatedMember(event,
|
|
100
|
+
getResolver('communityUsers')(getEventRelatedMember(event, unpackedPayload)),
|
|
95
101
|
])!;
|
|
96
102
|
|
|
97
103
|
callback(community.data, member.data);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './payload';
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { CommunityPostSettingMaps, DefaultCommunityPostSetting } from '~/@types';
|
|
2
|
+
|
|
3
|
+
const getMatchPostSetting = (value: {
|
|
4
|
+
needApprovalOnPostCreation: Amity.RawCommunity['needApprovalOnPostCreation'];
|
|
5
|
+
onlyAdminCanPost: Amity.RawCommunity['onlyAdminCanPost'];
|
|
6
|
+
}): Amity.Community['postSetting'] =>
|
|
7
|
+
Object.keys(CommunityPostSettingMaps).find(
|
|
8
|
+
key =>
|
|
9
|
+
value.needApprovalOnPostCreation ===
|
|
10
|
+
CommunityPostSettingMaps[key].needApprovalOnPostCreation &&
|
|
11
|
+
value.onlyAdminCanPost === CommunityPostSettingMaps[key].onlyAdminCanPost,
|
|
12
|
+
) ?? DefaultCommunityPostSetting;
|
|
13
|
+
|
|
14
|
+
/*
|
|
15
|
+
* Unpack community payload by mapping payload field to postSetting value.
|
|
16
|
+
*/
|
|
17
|
+
export const unpackCommunityPayload = <T extends Amity.CommunityPayload>({
|
|
18
|
+
communities,
|
|
19
|
+
...restPayload
|
|
20
|
+
}: T) => ({
|
|
21
|
+
communities: communities.map<Amity.Community>(
|
|
22
|
+
({ needApprovalOnPostCreation, onlyAdminCanPost, ...restCommunityPayload }) => ({
|
|
23
|
+
postSetting: getMatchPostSetting({
|
|
24
|
+
needApprovalOnPostCreation,
|
|
25
|
+
onlyAdminCanPost,
|
|
26
|
+
}),
|
|
27
|
+
...restCommunityPayload,
|
|
28
|
+
}),
|
|
29
|
+
),
|
|
30
|
+
...restPayload,
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
/*
|
|
34
|
+
* Repack community payload by mapping postSetting to the actual value.
|
|
35
|
+
*/
|
|
36
|
+
export const packCommunityPayload = <
|
|
37
|
+
T extends { postSetting?: Amity.Community['postSetting']; [k: string]: any },
|
|
38
|
+
>({
|
|
39
|
+
postSetting = undefined,
|
|
40
|
+
...restParam
|
|
41
|
+
}: T) => ({
|
|
42
|
+
...restParam,
|
|
43
|
+
...(postSetting ? CommunityPostSettingMaps[postSetting] : undefined),
|
|
44
|
+
});
|
package/src/core/events.ts
CHANGED
|
@@ -13,8 +13,9 @@ const WS_EVENTS = [
|
|
|
13
13
|
'reconnect_error',
|
|
14
14
|
'reconnect_failed',
|
|
15
15
|
|
|
16
|
+
'v3.channel.didCreate',
|
|
16
17
|
'v3.channel.didUpdate',
|
|
17
|
-
'v3.channel.
|
|
18
|
+
'v3.channel.didDelete',
|
|
18
19
|
'v3.channel.didJoin',
|
|
19
20
|
'v3.channel.didLeave',
|
|
20
21
|
'v3.channel.didAddUsers',
|
|
@@ -26,7 +26,7 @@ const CRITERIAS: Criterias = {
|
|
|
26
26
|
channel: ['channelId', 'rateLimit'],
|
|
27
27
|
channelUsers: ['channelId', 'userId', 'membership'],
|
|
28
28
|
message: ['messageId'],
|
|
29
|
-
community: ['communityId', '
|
|
29
|
+
community: ['communityId', 'postSetting'],
|
|
30
30
|
category: ['categoryId'],
|
|
31
31
|
communityUsers: ['userId', 'communityId', 'communityMembership'],
|
|
32
32
|
post: ['postId', 'feedId'],
|
package/src/core/query/query.ts
CHANGED
|
@@ -85,7 +85,7 @@ export const isFresh = (model?: Amity.Cachable, lifeSpan = 0) => {
|
|
|
85
85
|
* This wrapper is necessary to create for optimistically calls
|
|
86
86
|
*
|
|
87
87
|
*
|
|
88
|
-
* @param
|
|
88
|
+
* @param func A compatible API function from the ts sdk
|
|
89
89
|
* @param args The arguments to pass to the function passed as `fn`
|
|
90
90
|
* @returns A wrapper containing both the function and its future arguments
|
|
91
91
|
*
|
|
@@ -221,8 +221,8 @@ export const runQuery = <Args extends any[], Returned extends any>(
|
|
|
221
221
|
* the modal key in the param itself
|
|
222
222
|
* For update & delete the first argument is always an id which is of type
|
|
223
223
|
* string, whereas for create the first and only argument is the param object
|
|
224
|
-
*
|
|
225
|
-
* When creating an AmityObject optimistically we need to pass the modal key
|
|
224
|
+
*
|
|
225
|
+
* When creating an AmityObject optimistically we need to pass the modal key
|
|
226
226
|
* on to the server. ex: for create message modal key will be 'messageId`
|
|
227
227
|
*/
|
|
228
228
|
if (typeof args[0] !== 'string') {
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { ASCApiError } from '~/core/errors';
|
|
2
|
+
import { disableCache, enableCache, pushToCache } from '~/cache/api';
|
|
3
|
+
import { runQuery, createQuery } from '~/core/query';
|
|
4
|
+
import { createPost, getPost } from '~/post/api';
|
|
5
|
+
import { deleteMessage } from '~/message/api';
|
|
6
|
+
|
|
7
|
+
import { posts, client } from '~/utils/tests';
|
|
8
|
+
|
|
9
|
+
const createPostArgs: Parameters<typeof createPost> = [
|
|
10
|
+
{
|
|
11
|
+
tags: ['a', 'b'],
|
|
12
|
+
data: {
|
|
13
|
+
text: 'hello!',
|
|
14
|
+
},
|
|
15
|
+
targetType: 'user',
|
|
16
|
+
targetId: 'userId1',
|
|
17
|
+
},
|
|
18
|
+
];
|
|
19
|
+
const post = { postId: posts.page1[0] };
|
|
20
|
+
const deletingMsgId = 'deletingId';
|
|
21
|
+
|
|
22
|
+
describe('Core/Query/runQuery', () => {
|
|
23
|
+
test('should call query with arguments', () => {
|
|
24
|
+
const createPostMock = jest.fn().mockResolvedValue('test');
|
|
25
|
+
|
|
26
|
+
const query = createQuery(createPostMock, createPostArgs);
|
|
27
|
+
runQuery(query);
|
|
28
|
+
|
|
29
|
+
expect(createPostMock).toBeCalledTimes(1);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
test('should call callback with cache when valid', () => {
|
|
33
|
+
enableCache();
|
|
34
|
+
|
|
35
|
+
const callback = jest.fn();
|
|
36
|
+
|
|
37
|
+
const cachedAt = Date.now();
|
|
38
|
+
pushToCache(['post', 'get', post.postId], post, { cachedAt });
|
|
39
|
+
|
|
40
|
+
const query = createQuery(getPost, post.postId);
|
|
41
|
+
runQuery(query, callback);
|
|
42
|
+
|
|
43
|
+
expect(callback).toBeCalled();
|
|
44
|
+
expect(callback).toBeCalledTimes(1);
|
|
45
|
+
expect(callback).toHaveBeenCalledWith({
|
|
46
|
+
cachedAt,
|
|
47
|
+
origin: 'local',
|
|
48
|
+
loading: false,
|
|
49
|
+
data: post,
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
disableCache();
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test('should call callback with server data for invalid cache', async () => {
|
|
56
|
+
enableCache();
|
|
57
|
+
|
|
58
|
+
const callback = jest.fn();
|
|
59
|
+
client.http.get = jest.fn().mockResolvedValue({ data: { posts: [post] } });
|
|
60
|
+
|
|
61
|
+
// at the time of writing this test, cache is valid for 2 minutes
|
|
62
|
+
const expiredDate = Date.parse('04 Dec 1995 00:12:00 GMT');
|
|
63
|
+
pushToCache(['post', 'get', post.postId], post, { cachedAt: expiredDate });
|
|
64
|
+
|
|
65
|
+
const query = createQuery(getPost, post.postId);
|
|
66
|
+
runQuery(query, callback);
|
|
67
|
+
|
|
68
|
+
expect(callback).toHaveBeenCalledWith({
|
|
69
|
+
cachedAt: expiredDate,
|
|
70
|
+
origin: 'local',
|
|
71
|
+
loading: true,
|
|
72
|
+
data: post,
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
await expect(getPost(post.postId)).resolves.toBeTruthy();
|
|
76
|
+
|
|
77
|
+
expect(callback).toHaveBeenCalledTimes(2);
|
|
78
|
+
// checking object containing as expiredAt cannot be predicted :D
|
|
79
|
+
expect(callback).toHaveBeenCalledWith(
|
|
80
|
+
expect.objectContaining({
|
|
81
|
+
origin: 'server',
|
|
82
|
+
loading: false,
|
|
83
|
+
data: post,
|
|
84
|
+
}),
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
disableCache();
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test('should execute mutators optimistically', () => {
|
|
91
|
+
enableCache();
|
|
92
|
+
|
|
93
|
+
const createMessage: any = jest.fn().mockResolvedValue('test');
|
|
94
|
+
// mutators are defined as having a property called optimistically
|
|
95
|
+
createMessage.optimistically = jest.fn();
|
|
96
|
+
|
|
97
|
+
const query = createQuery(createMessage);
|
|
98
|
+
runQuery(query);
|
|
99
|
+
|
|
100
|
+
expect(createMessage.optimistically).toHaveBeenCalled();
|
|
101
|
+
// should call server right after
|
|
102
|
+
expect(createMessage).toHaveBeenCalled();
|
|
103
|
+
|
|
104
|
+
disableCache();
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
/*
|
|
108
|
+
* NOTE: del not tested as the args are exactly the same as update
|
|
109
|
+
*
|
|
110
|
+
* Tested due to bug where optimistic args was modifying args for del &
|
|
111
|
+
* update when it does not need to
|
|
112
|
+
*/
|
|
113
|
+
test('should not change args optimistically for update', () => {
|
|
114
|
+
enableCache();
|
|
115
|
+
|
|
116
|
+
client.http.delete = jest.fn().mockResolvedValue(true);
|
|
117
|
+
// 'get', gets called after delete to verify delete
|
|
118
|
+
client.http.get = jest.fn();
|
|
119
|
+
|
|
120
|
+
const query = createQuery(deleteMessage, deletingMsgId);
|
|
121
|
+
runQuery(query);
|
|
122
|
+
|
|
123
|
+
expect(client.http.delete).toHaveBeenCalledWith(`/api/v3/messages/${deletingMsgId}`);
|
|
124
|
+
|
|
125
|
+
disableCache();
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
test('should throw error if optimistic execution fails', async () => {
|
|
129
|
+
enableCache();
|
|
130
|
+
|
|
131
|
+
const callback = jest.fn();
|
|
132
|
+
const createMessage: any = jest.fn().mockResolvedValue('test');
|
|
133
|
+
// mutators are defined as having a property called optimistically
|
|
134
|
+
createMessage.optimistically = jest.fn().mockImplementation(() => {
|
|
135
|
+
throw new Error();
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
const query = createQuery(createMessage);
|
|
139
|
+
runQuery(query, callback);
|
|
140
|
+
|
|
141
|
+
expect(createMessage.optimistically).toThrow();
|
|
142
|
+
expect(callback).toBeCalledWith({
|
|
143
|
+
origin: 'local',
|
|
144
|
+
loading: true,
|
|
145
|
+
data: undefined,
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
disableCache();
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
test('should return error if call to server fails', async () => {
|
|
152
|
+
enableCache();
|
|
153
|
+
|
|
154
|
+
client.http.delete = jest
|
|
155
|
+
.fn()
|
|
156
|
+
.mockRejectedValueOnce(
|
|
157
|
+
new ASCApiError('not found!', Amity.ServerError.ITEM_NOT_FOUND, Amity.ErrorLevel.ERROR),
|
|
158
|
+
);
|
|
159
|
+
const callback = jest.fn();
|
|
160
|
+
|
|
161
|
+
const query = createQuery(deleteMessage, deletingMsgId);
|
|
162
|
+
runQuery(query, callback);
|
|
163
|
+
|
|
164
|
+
expect(callback).toHaveBeenCalledWith({
|
|
165
|
+
origin: 'local',
|
|
166
|
+
loading: true,
|
|
167
|
+
data: undefined,
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
await expect(deleteMessage(deletingMsgId)).rejects.toThrow();
|
|
171
|
+
|
|
172
|
+
expect(callback).toHaveBeenCalledTimes(2);
|
|
173
|
+
expect(callback).toHaveBeenCalledWith(
|
|
174
|
+
expect.objectContaining({
|
|
175
|
+
origin: 'server',
|
|
176
|
+
loading: false,
|
|
177
|
+
}),
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
disableCache();
|
|
181
|
+
});
|
|
182
|
+
});
|
|
@@ -11,6 +11,7 @@ import { ingestInCache } from '~/cache/api/ingestInCache';
|
|
|
11
11
|
* Creates an {@link Amity.File<'video'>}
|
|
12
12
|
*
|
|
13
13
|
* @param formData The data necessary to create a new {@link Amity.File<'video'>}
|
|
14
|
+
* @param feedType The {@link Amity.File<'video'>} feed type
|
|
14
15
|
* @param onProgress The callback to track the upload progress
|
|
15
16
|
* @returns The newly created {@link Amity.File<'video'>}
|
|
16
17
|
*
|
|
@@ -19,6 +20,7 @@ import { ingestInCache } from '~/cache/api/ingestInCache';
|
|
|
19
20
|
*/
|
|
20
21
|
export const createVideo = async (
|
|
21
22
|
formData: FormData,
|
|
23
|
+
feedType?: Amity.ContentFeedType,
|
|
22
24
|
onProgress?: (percent: number) => void,
|
|
23
25
|
): Promise<Amity.Cached<Amity.File<'video'>[]>> => {
|
|
24
26
|
const client = getActiveClient();
|
|
@@ -27,6 +29,10 @@ export const createVideo = async (
|
|
|
27
29
|
if (!formData.getAll('files').length)
|
|
28
30
|
throw new Error('The formData object must have a `files` key.');
|
|
29
31
|
|
|
32
|
+
if (feedType) {
|
|
33
|
+
formData.append('feedType', feedType);
|
|
34
|
+
}
|
|
35
|
+
|
|
30
36
|
const headers =
|
|
31
37
|
'getHeaders' in formData
|
|
32
38
|
? (formData as any).getHeaders()
|
|
@@ -14,11 +14,9 @@ import { queryFollows } from './utils';
|
|
|
14
14
|
* @category Follow API
|
|
15
15
|
* @async
|
|
16
16
|
*/
|
|
17
|
-
export const queryFollowers = async (
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
page?: Amity.PageRaw;
|
|
21
|
-
}): Promise<Amity.Cached<Amity.Paged<Amity.FollowStatus, Amity.PageRaw>>> =>
|
|
17
|
+
export const queryFollowers = async (
|
|
18
|
+
query: Amity.QueryFollowers,
|
|
19
|
+
): Promise<Amity.Cached<Amity.Paged<Amity.FollowStatus, Amity.PageRaw>>> =>
|
|
22
20
|
queryFollows('followers', query);
|
|
23
21
|
|
|
24
22
|
/**
|
|
@@ -14,11 +14,9 @@ import { queryFollows } from './utils';
|
|
|
14
14
|
* @category Follow API
|
|
15
15
|
* @async
|
|
16
16
|
*/
|
|
17
|
-
export const queryFollowings = async (
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
page?: Amity.PageRaw;
|
|
21
|
-
}): Promise<Amity.Cached<Amity.Paged<Amity.FollowStatus, Amity.PageRaw>>> =>
|
|
17
|
+
export const queryFollowings = async (
|
|
18
|
+
query: Amity.QueryFollowings,
|
|
19
|
+
): Promise<Amity.Cached<Amity.Paged<Amity.FollowStatus, Amity.PageRaw>>> =>
|
|
22
20
|
queryFollows('following', query);
|
|
23
21
|
|
|
24
22
|
/**
|
package/src/follow/api/utils.ts
CHANGED
|
@@ -36,9 +36,9 @@ export const queryFollows = async (
|
|
|
36
36
|
ingestInCache(payload as Amity.FollowersPayload, { cachedAt });
|
|
37
37
|
|
|
38
38
|
const cacheKey = [
|
|
39
|
-
|
|
39
|
+
'follow',
|
|
40
40
|
'query',
|
|
41
|
-
{ ...params, userId, options: { ...page } } as Amity.Serializable,
|
|
41
|
+
{ ...params, userId, options: { ...page }, type: key } as Amity.Serializable,
|
|
42
42
|
];
|
|
43
43
|
pushToCache(cacheKey, { follows: follows.map(getResolver('follow')), paging });
|
|
44
44
|
}
|
|
@@ -60,7 +60,11 @@ queryFollows.locally = (
|
|
|
60
60
|
|
|
61
61
|
const { page, ...params } = query;
|
|
62
62
|
|
|
63
|
-
const queryKey = [
|
|
63
|
+
const queryKey = [
|
|
64
|
+
'follow',
|
|
65
|
+
'query',
|
|
66
|
+
{ ...params, options: { ...page }, type: key } as Amity.Serializable,
|
|
67
|
+
];
|
|
64
68
|
const { data, cachedAt } =
|
|
65
69
|
pullFromCache<{ follows: string[] } & Amity.Pagination>(queryKey) ?? {};
|
|
66
70
|
|