// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. import {buildQueryString} from '@utils/helpers'; import {PER_PAGE_DEFAULT} from './constants'; export interface ClientPostsMix { createPost: (post: Post) => Promise; updatePost: (post: Post) => Promise; getPost: (postId: string) => Promise; patchPost: (postPatch: Partial & {id: string}) => Promise; deletePost: (postId: string) => Promise; getPostThread: (postId: string) => Promise; getPosts: (channelId: string, page?: number, perPage?: number) => Promise; getPostsSince: (channelId: string, since: number) => Promise; getPostsBefore: (channelId: string, postId: string, page?: number, perPage?: number) => Promise; getPostsAfter: (channelId: string, postId: string, page?: number, perPage?: number) => Promise; getFileInfosForPost: (postId: string) => Promise; getSavedPosts: (userId: string, channelId?: string, teamId?: string, page?: number, perPage?: number) => Promise; getPinnedPosts: (channelId: string) => Promise; markPostAsUnread: (userId: string, postId: string) => Promise; pinPost: (postId: string) => Promise; unpinPost: (postId: string) => Promise; addReaction: (userId: string, postId: string, emojiName: string) => Promise; removeReaction: (userId: string, postId: string, emojiName: string) => Promise; getReactionsForPost: (postId: string) => Promise; searchPostsWithParams: (teamId: string, params: PostSearchParams) => Promise; searchPosts: (teamId: string, terms: string, isOrSearch: boolean) => Promise; doPostAction: (postId: string, actionId: string, selectedOption?: string) => Promise; doPostActionWithCookie: (postId: string, actionId: string, actionCookie: string, selectedOption?: string) => Promise; } const ClientPosts = (superclass: any) => class extends superclass { createPost = async (post: Post) => { this.analytics.trackAPI('api_posts_create', {channel_id: post.channel_id}); if (post.root_id != null && post.root_id !== '') { this.analytics.trackAPI('api_posts_replied', {channel_id: post.channel_id}); } return this.doFetch( `${this.getPostsRoute()}`, {method: 'post', body: post, noRetry: true}, ); }; updatePost = async (post: Post) => { this.analytics.trackAPI('api_posts_update', {channel_id: post.channel_id}); return this.doFetch( `${this.getPostRoute(post.id)}`, {method: 'put', body: post}, ); }; getPost = async (postId: string) => { return this.doFetch( `${this.getPostRoute(postId)}`, {method: 'get'}, ); }; patchPost = async (postPatch: Partial & {id: string}) => { this.analytics.trackAPI('api_posts_patch', {channel_id: postPatch.channel_id}); return this.doFetch( `${this.getPostRoute(postPatch.id)}/patch`, {method: 'put', body: postPatch}, ); }; deletePost = async (postId: string) => { this.analytics.trackAPI('api_posts_delete'); return this.doFetch( `${this.getPostRoute(postId)}`, {method: 'delete'}, ); }; getPostThread = async (postId: string) => { return this.doFetch( `${this.getPostRoute(postId)}/thread`, {method: 'get'}, ); }; getPosts = async (channelId: string, page = 0, perPage = PER_PAGE_DEFAULT) => { return this.doFetch( `${this.getChannelRoute(channelId)}/posts${buildQueryString({page, per_page: perPage})}`, {method: 'get'}, ); }; getPostsSince = async (channelId: string, since: number) => { return this.doFetch( `${this.getChannelRoute(channelId)}/posts${buildQueryString({since})}`, {method: 'get'}, ); }; getPostsBefore = async (channelId: string, postId: string, page = 0, perPage = PER_PAGE_DEFAULT) => { this.analytics.trackAPI('api_posts_get_before', {channel_id: channelId}); return this.doFetch( `${this.getChannelRoute(channelId)}/posts${buildQueryString({before: postId, page, per_page: perPage})}`, {method: 'get'}, ); }; getPostsAfter = async (channelId: string, postId: string, page = 0, perPage = PER_PAGE_DEFAULT) => { this.analytics.trackAPI('api_posts_get_after', {channel_id: channelId}); return this.doFetch( `${this.getChannelRoute(channelId)}/posts${buildQueryString({after: postId, page, per_page: perPage})}`, {method: 'get'}, ); }; getFileInfosForPost = async (postId: string) => { return this.doFetch( `${this.getPostRoute(postId)}/files/info`, {method: 'get'}, ); }; getSavedPosts = async (userId: string, channelId = '', teamId = '', page = 0, perPage = PER_PAGE_DEFAULT) => { this.analytics.trackAPI('api_posts_get_flagged', {team_id: teamId}); return this.doFetch( `${this.getUserRoute(userId)}/posts/flagged${buildQueryString({channel_id: channelId, team_id: teamId, page, per_page: perPage})}`, {method: 'get'}, ); }; getPinnedPosts = async (channelId: string) => { this.analytics.trackAPI('api_posts_get_pinned', {channel_id: channelId}); return this.doFetch( `${this.getChannelRoute(channelId)}/pinned`, {method: 'get'}, ); }; markPostAsUnread = async (userId: string, postId: string) => { this.analytics.trackAPI('api_post_set_unread_post'); return this.doFetch( `${this.getUserRoute(userId)}/posts/${postId}/set_unread`, {method: 'post'}, ); }; pinPost = async (postId: string) => { this.analytics.trackAPI('api_posts_pin'); return this.doFetch( `${this.getPostRoute(postId)}/pin`, {method: 'post'}, ); }; unpinPost = async (postId: string) => { this.analytics.trackAPI('api_posts_unpin'); return this.doFetch( `${this.getPostRoute(postId)}/unpin`, {method: 'post'}, ); }; addReaction = async (userId: string, postId: string, emojiName: string) => { this.analytics.trackAPI('api_reactions_save', {post_id: postId}); return this.doFetch( `${this.getReactionsRoute()}`, {method: 'post', body: {user_id: userId, post_id: postId, emoji_name: emojiName}}, ); }; removeReaction = async (userId: string, postId: string, emojiName: string) => { this.analytics.trackAPI('api_reactions_delete', {post_id: postId}); return this.doFetch( `${this.getUserRoute(userId)}/posts/${postId}/reactions/${emojiName}`, {method: 'delete'}, ); }; getReactionsForPost = async (postId: string) => { return this.doFetch( `${this.getPostRoute(postId)}/reactions`, {method: 'get'}, ); }; searchPostsWithParams = async (teamId: string, params: PostSearchParams) => { this.analytics.trackAPI('api_posts_search'); const endpoint = teamId ? `${this.getTeamRoute(teamId)}/posts/search` : `${this.getPostsRoute()}/search`; return this.doFetch(endpoint, {method: 'post', body: params}); }; searchPosts = async (teamId: string, terms: string, isOrSearch: boolean) => { return this.searchPostsWithParams(teamId, {terms, is_or_search: isOrSearch}); }; doPostAction = async (postId: string, actionId: string, selectedOption = '') => { return this.doPostActionWithCookie(postId, actionId, '', selectedOption); }; doPostActionWithCookie = async (postId: string, actionId: string, actionCookie: string, selectedOption = '') => { if (selectedOption) { this.analytics.trackAPI('api_interactive_messages_menu_selected'); } else { this.analytics.trackAPI('api_interactive_messages_button_clicked'); } const msg: any = { selected_option: selectedOption, }; if (actionCookie !== '') { msg.cookie = actionCookie; } return this.doFetch( `${this.getPostRoute(postId)}/actions/${encodeURIComponent(actionId)}`, {method: 'post', body: msg}, ); }; }; export default ClientPosts;