Skip to content

Commit

Permalink
Merge pull request #74 from huboard/discorick/messaging
Browse files Browse the repository at this point in the history
Discorick/messaging
  • Loading branch information
rauhryan committed Aug 6, 2015
2 parents 8bff2ac + 3e9997b commit 26a1702
Show file tree
Hide file tree
Showing 22 changed files with 613 additions and 206 deletions.
11 changes: 7 additions & 4 deletions ember-app/app/app.js
Expand Up @@ -46,8 +46,15 @@ Ember.onLoad("Ember.Application", function ($app) {
correlationId : correlationId,
sockets: {},
client: new Faye.Client(application.get('socketBackend')),
publish: function(message){
var channel = message.meta.channel.toLowerCase();
this.get('sockets')[channel].callbacks.fire(message);
},
subscribe: function (channel, callback) {
channel = channel.toLowerCase();
if(!this.get("sockets")[channel]){
this.subscribeTo(channel);
}
this.get("sockets")[channel].callbacks.add(callback);
return callback;
},
Expand All @@ -67,10 +74,6 @@ Ember.onLoad("Ember.Application", function ($app) {
source: source,
callbacks: callbacks
};

},
init: function () {
this.subscribeTo(this.get("repo.full_name"));
}
});
}
Expand Down
7 changes: 3 additions & 4 deletions ember-app/app/components/columns/hb-milestone.js
@@ -1,15 +1,14 @@
import Ember from "ember";
import HbColumn from "../columns/hb-column";
import SocketMixin from 'app/mixins/socket';
import MilestoneSocketMixin from 'app/mixins/sockets/milestone';
import MilestoneEvents from 'app/mixins/events/milestone';
import Messaging from 'app/mixins/messaging';

var HbMilestoneComponent = HbColumn.extend(
MilestoneSocketMixin, SocketMixin, {
MilestoneEvents, Messaging, {
classNames: ["milestone"],
classNameBindings:["isFirstColumn:no-milestone"],
isTaskColumn: false,

//Data
sortedIssues: function () {
var issues = this.get("issues").filter(function(i){
return !i.get("isArchived");
Expand Down
6 changes: 3 additions & 3 deletions ember-app/app/components/hb-task-card.js
@@ -1,11 +1,11 @@
import Ember from "ember";
import IssueFiltersMixin from "app/mixins/issue-filters";
import MemberDragAndDropMixin from "app/mixins/member-drag-and-drop";
import IssueSocketMixin from "app/mixins/sockets/issue";
import SocketMixin from "app/mixins/socket";
import CardEvent from "app/mixins/events/card";
import Messaging from "app/mixins/messaging";

var HbCardComponent = Ember.Component.extend(
SocketMixin, IssueFiltersMixin, MemberDragAndDropMixin, IssueSocketMixin, {
Messaging, IssueFiltersMixin, MemberDragAndDropMixin, CardEvent, {
tagName: "li",
classNames: ["card"],
classNameBindings: ["isFiltered","isDraggable:is-draggable", "isClosable:closable", "colorLabel", "issue.color:border", "stateClass"],
Expand Down
55 changes: 6 additions & 49 deletions ember-app/app/controllers/application.js
@@ -1,7 +1,9 @@
import Ember from 'ember';
import Issue from 'app/models/issue';
import BoardEvents from "app/mixins/events/board";
import Messaging from "app/mixins/messaging";

var ApplicationController = Ember.Controller.extend({
var ApplicationController = Ember.Controller.extend(
BoardEvents, Messaging, {
qps: Ember.inject.service("query-params"),
isSidebarOpen: false,
filters: Ember.inject.service(),
Expand All @@ -11,54 +13,9 @@ var ApplicationController = Ember.Controller.extend({
}
}.observes("model.board"),

sockets: {
config: {
messagePath: "issueNumber",
channelPath: "repositoryName"
},
issue_closed: function(message) {
var issue = this.get("model.board.issues").findBy('number', message.issue.number);
//Fix the need to delay event subscriptions
subscribeDisabled: true,

if(issue) {
issue.set("state", "closed");
} else {
this.get("model.board.issues").pushObject(Issue.create(message.issue));
}
},
issue_opened: function(message) {
var issue = this.get("model.board.issues").findBy('number', message.issue.number);

if(issue) {
issue.set("state", "open");
} else {
var model = Issue.create(message.issue);
if(message.issue.current_state.name === "__nil__") {
model.set("current_state", this.get("model.board.columns.firstObject"));
}else {
var column = this.get("model.board.columns").find(function(c) {
return c.name === message.issue.current_state.name;
});
model.set("current_state", column);
}
this.get("model.board.issues").pushObject(model);
}
},
issue_reopened: function(message) {
var issue = this.get("model.board.issues").findBy('number', message.issue.number);

if(issue) {
issue.set("state", "open");
} else {
this.get("model.board.issues").pushObject(Issue.create(message.issue));
}
}
},
issueNumber: function () {
return "*";
}.property(),
repositoryName: function () {
return this.get("model.full_name");
}.property("model.full_name"),
currentUser: function(){
return App.get("currentUser");
}.property("App.currentUser"),
Expand Down
32 changes: 23 additions & 9 deletions ember-app/app/controllers/issue.js
@@ -1,7 +1,13 @@
import Ember from 'ember';
import IssueEvent from "app/mixins/events/issue";
import Messaging from "app/mixins/messaging";

var IssueController = Ember.Controller.extend({
var IssueController = Ember.Controller.extend(
IssueEvent, Messaging, {
needs: ["application"],
//Fix the need to delay event subscriptions
subscribeDisabled: true,

isCollaborator: function(){
return this.get("model.repo.is_collaborator");
}.property("model.repo.is_collaborator"),
Expand Down Expand Up @@ -76,17 +82,25 @@ var IssueController = Ember.Controller.extend({
}.bind(this));
},
close: function(){
if (this.get("commentBody")){
this.send("submitComment");
}
this.get("model").close();
var _self = this;
this.get("model").close().then(function(response){
var channel = _self.hbevents.channel;
var topic = "issues.{model.number}.issue_closed";
_self.publish(channel, topic, {issue: response});
});

this.send("moveToColumn", this.get("columns.lastObject"));
if (this.get("commentBody")){ this.send("submitComment"); }
},
reopenCard: function(){
if (this.get("commentBody")){
this.send("submitComment");
}
this.get("model").reopenCard();
var _self = this;
this.get("model").reopenCard().then(function(response){
var channel = _self.hbevents.channel;
var topic = "issues.{model.number}.issue_reopened";
_self.publish(channel, topic, {issue: response});
});

if (this.get("commentBody")){ this.send("submitComment"); }
}
},
commentBody: null,
Expand Down
31 changes: 31 additions & 0 deletions ember-app/app/mixins/events/board.js
@@ -0,0 +1,31 @@
import Ember from 'ember';
import Issue from 'app/models/issue';

var BoardEventsMixin = Ember.Mixin.create({
hbevents: {
channel: "{model.full_name}",
"issues.*.issue_opened": "newIssue"
},
_eventHandlers: {
newIssue: function(message) {
var issue = this.get("model.board.issues").findBy('number', message.issue.number);

if(issue) {
issue.set("state", "open");
} else {
var model = Issue.create(message.issue);
if(message.issue.current_state.name === "__nil__") {
model.set("current_state", this.get("model.board.columns.firstObject"));
}else {
var column = this.get("model.board.columns").find(function(c) {
return c.name === message.issue.current_state.name;
});
model.set("current_state", column);
}
this.get("model.board.issues").pushObject(model);
}
}
}
});

export default BoardEventsMixin;
47 changes: 47 additions & 0 deletions ember-app/app/mixins/events/card.js
@@ -0,0 +1,47 @@
import Ember from 'ember';

var CardEventMixin = Ember.Mixin.create({
hbevents: {
channel: "{repositoryName}",
"issues.{issue.number}.issue_status_changed": "statusChanged",
"issues.{issue.number}.issue_archived": "archived",
"issues.{issue.number}.issue_closed": "closed",
"issues.{issue.number}.issue_reopened": "opened",
"issues.{issue.number}.assigned": "assigned",
"issues.{issue.number}.moved": "moved",
"issues.{issue.number}.reordered": "reordered",
"issues.{issue.number}.milestone_changed": "milestoneChanged",
},
_eventHandlers: {
statusChanged: function(message){
this.get("issue").set("_data", message.issue._data);
},
archived: function(){
this.get('issue').set('isArchived', true);
},
closed: function(message){
this.get("issue").set("state", message.issue.state);
},
opened: function(message){
this.get("issue").set("state", message.issue.state);
},
assigned: function(message){
this.get("issue").set("assignee", message.issue.assignee);
},
moved: function (message) {
this.get('issue').setProperties({
current_state : message.issue.current_state,
_data: message.issue._data
});
},
reordered: function (message) {
this.get("issue").set("current_state", message.issue.current_state);
this.get("issue").set("_data", message.issue._data);
},
milestoneChanged: function(message) {
this.get("issue").set("milestone", message.issue.milestone);
},
}
});

export default CardEventMixin;
19 changes: 19 additions & 0 deletions ember-app/app/mixins/events/issue.js
@@ -0,0 +1,19 @@
import Ember from 'ember';

var IssueEventMixin = Ember.Mixin.create({
hbevents: {
channel: "{model.repo.full_name}",
"issues.{model.number}.issue_closed": "closed",
"issues.{model.number}.issue_reopened": "opened"
},
_eventHandlers: {
closed: function(){
//Not Yet Implemented
},
opened: function(){
//Not Yet Implemented
},
}
});

export default IssueEventMixin;
20 changes: 20 additions & 0 deletions ember-app/app/mixins/events/milestone.js
@@ -0,0 +1,20 @@
import Ember from 'ember';

var MilestoneEventMixin = Ember.Mixin.create({
hbevents: {
channel: "{model.milestone.repo.full_name}",
},
_eventHandlers: {
milestone_reordered: function(message){
this.get('model.milestone').setProperties({
description: message.milestone.description,
_data: message.milestone._data
});
},
_socketDisabled: function(){
return !!this.get('model.noMilestone');
}.property('model.noMilestone')
}
});

export default MilestoneEventMixin;
83 changes: 83 additions & 0 deletions ember-app/app/mixins/messaging.js
@@ -0,0 +1,83 @@
import Ember from "ember";
import eventParsing from "app/utilities/messaging/event-parsing";

var MessagingMixin = Ember.Mixin.create({

////
// event_data: {
// channel: "thechannel",
// indentifier: 1,
// type: "sometype",
// action: "theaction",
// handler: "theHandler"
// }
////

//Subscribing
subscribeToMessages: function(){
var _self = this;
var socket = this.get("socket");
_.each(this.get("hbevents"), function(handler, event){
if(event === "channel"){ return; }
var event_data = eventParsing.parse(event, handler, _self);
var sub = socket.subscribe(event_data.channel, function(message){
if(socket.correlationId !== message.meta.correlationId){
_self._eventHandler(event_data, message);
}
});
_self._subscriptions[event] = [event_data.channel, sub];
});
},
_eventHandler: function(event_data, message){
var _self = this;
if(event_data.action === message.meta.action){
this._handleEventInScope(event_data, message, function(){
_self._eventHandlers[event_data.handler].call(_self, message.payload);
});
}
},
_handleEventInScope: function(event_data, message, callback){
if(!message.meta.type || event_data.type === message.meta.type){
if(event_data.identifier === "*"){ callback(); }
if(event_data.identifier === String(message.meta.identifier)){
callback();
}
}
},

unsubscribeFromMessages: function(){
var _self = this;
_.each(this._subscriptions, function(sub, event){
if(event === "channel"){ return; }
_self.get("socket").unsubscribe(sub[0], sub[1]);
delete _self._subscriptions[event];
});
},

//Publishing
publish: function(channel, topic, payload){
var meta = eventParsing.parse(`${channel} ${topic}`, null, this);
this.get("socket").publish({
meta: meta,
payload: payload
});
},

//Lifecycle
init: function(){
if(!this.get("socket")){
throw "Missing the Socket!";
}
this._super();
this._subscriptions = {};
if(!this.get("subscribeDisabled")){
this.subscribeToMessages();
}
},
willDestroy: function(){
this.unsubscribeFromMessages();
this._super();
}
});

export default MessagingMixin;

0 comments on commit 26a1702

Please sign in to comment.