Skip to content

Commit

Permalink
Refactor Conversation, Message API calls, store
Browse files Browse the repository at this point in the history
  • Loading branch information
pranavrajs committed Oct 27, 2019
1 parent c21c839 commit 170f871
Show file tree
Hide file tree
Showing 13 changed files with 215 additions and 402 deletions.
2 changes: 1 addition & 1 deletion app/builders/messages/outgoing/normal_builder.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ class Messages::Outgoing::NormalBuilder

def initialize(user, conversation, params)
@content = params[:message]
@private = ['1', 'true', 1].include? params[:private]
@private = ['1', 'true', 1, true].include? params[:private]
@conversation = conversation
@user = user
@fb_id = params[:fb_id]
Expand Down
26 changes: 20 additions & 6 deletions app/controllers/api/v1/facebook_indicators_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,26 @@ class Api::V1::FacebookIndicatorsController < Api::BaseController
around_action :handle_with_exception

def mark_seen
Facebook::Messenger::Bot.deliver(payload('mark_seen'), access_token: @access_token)
fb_bot.deliver(payload('mark_seen'), access_token: @access_token)
head :ok
end

def typing_on
Facebook::Messenger::Bot.deliver(payload('typing_on'), access_token: @access_token)
fb_bot.deliver(payload('typing_on'), access_token: @access_token)
head :ok
end

def typing_off
Facebook::Messenger::Bot.deliver(payload('typing_off'), access_token: @access_token)
fb_bot.deliver(payload('typing_off'), access_token: @access_token)
head :ok
end

private

def fb_bot
::Facebook::Messenger::Bot
end

def handle_with_exception
yield
rescue Facebook::Messenger::Error => e
Expand All @@ -27,14 +31,24 @@ def handle_with_exception

def payload(action)
{
recipient: { id: params[:sender_id] },
recipient: { id: contact.source_id },
sender_action: action
}
end

def inbox
@inbox ||= current_account.inboxes.find(permitted_params[:inbox_id])
end

def set_access_token
# have to cache this
inbox = current_account.inboxes.find(params[:inbox_id])
@access_token = inbox.channel.page_access_token
end

def contact
@contact ||= inbox.contact_inboxes.find_by!(contact_id: permitted_params[:contact_id])
end

def permitted_params
params.permit(:inbox_id, :contact_id)
end
end
24 changes: 24 additions & 0 deletions app/javascript/dashboard/api/channel/fbChannel.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/* global axios */
import ApiClient from '../ApiClient';

class FBChannel extends ApiClient {
constructor() {
super('facebook_indicators');
}

markSeen({ inboxId, contactId }) {
return axios.post(`${this.url}/mark_seen`, {
inbox_id: inboxId,
contact_id: contactId,
});
}

toggleTyping({ status, inboxId, contactId }) {
return axios.post(`${this.url}/typing_${status}`, {
inbox_id: inboxId,
contact_id: contactId,
});
}
}

export default new FBChannel();
77 changes: 1 addition & 76 deletions app/javascript/dashboard/api/endPoints.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ const endPoints = {
logout: {
url: 'auth/sign_out',
},

me: {
url: 'api/v1/conversations.json',
params: { type: 0, page: 1 },
Expand All @@ -23,28 +24,6 @@ const endPoints = {
params: { inbox_id: null },
},

conversations(id) {
return { url: `api/v1/conversations/${id}.json`, params: { before: null } };
},

resolveConversation(id) {
return { url: `api/v1/conversations/${id}/toggle_status.json` };
},

sendMessage(conversationId, message) {
return {
url: `api/v1/conversations/${conversationId}/messages.json`,
params: { message },
};
},

addPrivateNote(conversationId, message) {
return {
url: `api/v1/conversations/${conversationId}/messages.json?`,
params: { message, private: 'true' },
};
},

fetchLabels: {
url: 'api/v1/labels.json',
},
Expand Down Expand Up @@ -86,60 +65,6 @@ const endPoints = {
params: { omniauth_token: '' },
},

assignAgent(conversationId, AgentId) {
return {
url: `/api/v1/conversations/${conversationId}/assignments?assignee_id=${AgentId}`,
};
},

fbMarkSeen: {
url: 'api/v1/facebook_indicators/mark_seen',
},

fbTyping(status) {
return {
url: `api/v1/facebook_indicators/typing_${status}`,
};
},

markMessageRead(id) {
return {
url: `api/v1/conversations/${id}/update_last_seen`,
params: {
agent_last_seen_at: null,
},
};
},

// Canned Response [GET, POST, PUT, DELETE]
cannedResponse: {
get() {
return {
url: 'api/v1/canned_responses',
};
},
getOne({ id }) {
return {
url: `api/v1/canned_responses/${id}`,
};
},
post() {
return {
url: 'api/v1/canned_responses',
};
},
put(id) {
return {
url: `api/v1/canned_responses/${id}`,
};
},
delete(id) {
return {
url: `api/v1/canned_responses/${id}`,
};
},
},

reports: {
account(metric, from, to) {
return {
Expand Down
123 changes: 28 additions & 95 deletions app/javascript/dashboard/api/inbox/conversation.js
Original file line number Diff line number Diff line change
@@ -1,104 +1,37 @@
/* eslint no-console: 0 */
/* global axios */
/* eslint no-undef: "error" */
/* eslint no-unused-expressions: ["error", { "allowShortCircuit": true }] */
import endPoints from '../endPoints';
import ApiClient from '../ApiClient';

export default {
fetchConversation(id) {
const urlData = endPoints('conversations')(id);
const fetchPromise = new Promise((resolve, reject) => {
axios
.get(urlData.url)
.then(response => {
resolve(response);
})
.catch(error => {
reject(Error(error));
});
});
return fetchPromise;
},

toggleStatus(id) {
const urlData = endPoints('resolveConversation')(id);
const fetchPromise = new Promise((resolve, reject) => {
axios
.post(urlData.url)
.then(response => {
resolve(response);
})
.catch(error => {
reject(Error(error));
});
});
return fetchPromise;
},
class ConversationApi extends ApiClient {
constructor() {
super('conversations');
}

assignAgent([id, agentId]) {
const urlData = endPoints('assignAgent')(id, agentId);
const fetchPromise = new Promise((resolve, reject) => {
axios
.post(urlData.url)
.then(response => {
resolve(response);
})
.catch(error => {
reject(Error(error));
});
get({ inboxId, convStatus, assigneeStatus }) {
return axios.get(this.url, {
params: {
inbox_id: inboxId,
conversation_status_id: convStatus,
assignee_type_id: assigneeStatus,
},
});
return fetchPromise;
},
}

markSeen({ inboxId, senderId }) {
const urlData = endPoints('fbMarkSeen');
const fetchPromise = new Promise((resolve, reject) => {
axios
.post(urlData.url, {
inbox_id: inboxId,
sender_id: senderId,
})
.then(response => {
resolve(response);
})
.catch(error => {
reject(Error(error));
});
});
return fetchPromise;
},
toggleStatus(conversationId) {
return axios.post(`${this.url}/${conversationId}/toggle_status`, {});
}

fbTyping({ flag, inboxId, senderId }) {
const urlData = endPoints('fbTyping')(flag);
const fetchPromise = new Promise((resolve, reject) => {
axios
.post(urlData.url, {
inbox_id: inboxId,
sender_id: senderId,
})
.then(response => {
resolve(response);
})
.catch(error => {
reject(Error(error));
});
});
return fetchPromise;
},
assignAgent({ conversationId, agentId }) {
axios.post(
`${this.url}/${conversationId}/assignments?assignee_id=${agentId}`,
{}
);
}

markMessageRead({ id, lastSeen }) {
const urlData = endPoints('markMessageRead')(id);
urlData.params.agent_last_seen_at = lastSeen;
const fetchPromise = new Promise((resolve, reject) => {
axios
.post(urlData.url, urlData.params)
.then(response => {
resolve(response);
})
.catch(error => {
reject(Error(error));
});
return axios.post(`${this.url}/${id}/update_last_seen`, {
agent_last_seen_at: lastSeen,
});
return fetchPromise;
},
};
}
}

export default new ConversationApi();
32 changes: 0 additions & 32 deletions app/javascript/dashboard/api/inbox/index.js

This file was deleted.

Loading

0 comments on commit 170f871

Please sign in to comment.