Skip to content

Commit 437dcd2

Browse files
committed
Merge pull request #124 from teamsnap/message-mark-as-read
Adds ability to query messages and execute mark as read functionality.
2 parents ff927d8 + 946cab1 commit 437dcd2

File tree

13 files changed

+383
-9
lines changed

13 files changed

+383
-9
lines changed

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
# TeamSnap JavaScript SDK CHANGELOG
22

3+
### March 22, 2016 // Version 1.13.0
4+
- Adds `loadMessages` method.
5+
- Adds `markMessageAsRead` method.
6+
- Adds `loadMessageData` method.
7+
8+
---
9+
310
### March 21, 2016 // Version 1.12.1
411
- Reloads `memberEmailAddresses` and `contactEmailAddresses` in `importMembersFromTeam` method
512
in persistence wrapper.

docs/collections/message_data.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Message Data
2+
3+
## Methods
4+
5+
- [loadMessageData](#loadMessageData)
6+
7+
8+
---
9+
<a id="loadMessageData"></a>
10+
## `loadMessageData(params, callback)`
11+
Loads items from the `messageData` collection based on given params.
12+
13+
### Params
14+
* `params`: [int, object] - can be either a `teamId` or an object with query parameters.
15+
* `callback`: [function] - callback to be executed when the operation completes.
16+
17+
To see a list of all available search params you can run:
18+
`teamsnap.collections.messageData.queries.search.params`
19+
20+
### Examples
21+
```javascript
22+
// ~~~~~
23+
// Loads all messageData for `teamId: 1`.
24+
teamsnap.loadMessageData(1);
25+
26+
// ~~~~~
27+
// Loads all messageData for `userId: 1`.
28+
teamsnap.loadMessageData({userId: 1});
29+
```

docs/collections/messages.md

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
# Messages
2+
3+
## Methods
4+
5+
- [loadMessages](#loadMessages)
6+
- [markMessageAsRead](#markMessageAsRead)
7+
8+
9+
---
10+
<a id="loadMessages"></a>
11+
## `loadMessages(params, callback)`
12+
Loads items from the `messages` collection based on given params.
13+
14+
### Params
15+
* `params`: [int, object] - can be either a `teamId` or an object with query parameters.
16+
* `callback`: [function] - callback to be executed when the operation completes.
17+
18+
To see a list of all available search params you can run:
19+
`teamsnap.collections.messages.queries.search.params`
20+
21+
### Examples
22+
```javascript
23+
// ~~~~~
24+
// Loads all messages for `teamId: 1`.
25+
teamsnap.loadMessages(1);
26+
27+
// ~~~~~
28+
// Loads messages for `userId: 1`.
29+
teamsnap.loadMessages({userId: 1});
30+
```
31+
32+
33+
---
34+
35+
36+
<a id="markMessageAsRead"></a>
37+
## `markMessageAsRead(params)`
38+
Marks a `message` item as read.
39+
40+
### Params
41+
* `params`: [int, object] - ID of the message, or the message object to mark as read.
42+
43+
### Examples
44+
```javascript
45+
// ~~~~~
46+
// Marks a message as read.
47+
var message = teamsnap.markMessageAsRead(1);
48+
49+
// ~~~~~
50+
// Marks a message as read.
51+
var message = teamsnap.markMessageAsRead(messageToMarkAsUnread);
52+
```

lib/teamsnap.js

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1872,6 +1872,49 @@ exports.saveMemberPreferences = function(memberPreferences, callback) {
18721872

18731873
});
18741874

1875+
require.register("collections/messageData", function(exports, require, module) {
1876+
exports.loadMessageData = function(params, callback) {
1877+
if (this.isId(params)) {
1878+
params = {
1879+
teamId: params
1880+
};
1881+
} else if (!(params && typeof params === 'object')) {
1882+
throw new TSArgsError('teamsnap.loadMessageData', 'must provide a teamId or query parameters');
1883+
}
1884+
return this.loadItems('messageDatum', params, callback);
1885+
};
1886+
1887+
});
1888+
1889+
require.register("collections/messages", function(exports, require, module) {
1890+
exports.loadMessages = function(params, callback) {
1891+
if (this.isId(params)) {
1892+
params = {
1893+
teamId: params
1894+
};
1895+
} else if (!(params && typeof params === 'object')) {
1896+
throw new TSArgsError('teamsnap.loadMessages', 'must provide a teamId or query parameters');
1897+
}
1898+
return this.loadItems('message', params, callback);
1899+
};
1900+
1901+
exports.markMessageAsRead = function(params, callback) {
1902+
if (typeof params === 'object') {
1903+
params = {
1904+
id: params.id
1905+
};
1906+
} else if (this.isId(params)) {
1907+
params = {
1908+
id: params
1909+
};
1910+
} else {
1911+
throw new TSArgsError('teamsnap.markMessageAsRead', 'a message `id` or `message` object must be provided');
1912+
}
1913+
return this.collections.messages.exec('markMessageAsRead', params).pop().callback(callback);
1914+
};
1915+
1916+
});
1917+
18751918
require.register("collections/opponents", function(exports, require, module) {
18761919
exports.loadOpponents = function(params, callback) {
18771920
if (this.isId(params)) {
@@ -5820,6 +5863,10 @@ add(require('./collections/memberStatistics'));
58205863

58215864
add(require('./collections/members'));
58225865

5866+
add(require('./collections/messageData'));
5867+
5868+
add(require('./collections/messages'));
5869+
58235870
add(require('./collections/opponents'));
58245871

58255872
add(require('./collections/opponentsResults'));
@@ -5896,7 +5943,7 @@ ref = require('./model'), Collection = ref.Collection, Item = ref.Item;
58965943
require('./errors');
58975944

58985945
TeamSnap = (function() {
5899-
TeamSnap.prototype.version = '1.12.1';
5946+
TeamSnap.prototype.version = '1.13.0';
59005947

59015948
TeamSnap.prototype.promises = promises;
59025949

@@ -5936,7 +5983,7 @@ var i, len, plural, pluralLookup, singularLookup, teamTypes, teamsnap, type, typ
59365983

59375984
teamsnap = exports;
59385985

5939-
types = ['user', 'assignment', 'availability', 'broadcastAlert', 'broadcastEmail', 'broadcastEmailAttachment', 'contact', 'contactEmailAddress', 'contactPhoneNumber', 'customDatum', 'customField', 'leagueCustomDatum', 'leagueCustomField', 'divisionContact', 'divisionContactEmailAddress', 'divisionContactPhoneNumber', 'divisionLocation', 'divisionMember', 'divisionMemberEmailAddress', 'divisionMemberPhoneNumber', 'divisionMemberPreferences', 'divisionTeamStanding', 'event', 'eventStatistic', 'facebookPage', 'forumPost', 'forumSubscription', 'forumTopic', 'leagueRegistrantDocument', 'location', 'member', 'memberBalance', 'memberEmailAddress', 'memberFile', 'memberLink', 'memberPayment', 'memberPhoneNumber', 'memberPreferences', 'memberStatistic', 'opponent', 'opponentResults', 'paymentNote', 'plan', 'smsGateway', 'sponsor', 'statistic', 'statisticAggregate', 'statisticDatum', 'statisticGroup', 'sport', 'team', 'teamFee', 'teamMedium', 'teamMediumComment', 'teamMediaGroup', 'teamPaypalPreferences', 'teamPreferences', 'teamPublicSite', 'teamResults', 'teamStatistic', 'timeZone', 'trackedItem', 'trackedItemStatus'];
5986+
types = ['user', 'assignment', 'availability', 'broadcastAlert', 'broadcastEmail', 'broadcastEmailAttachment', 'contact', 'contactEmailAddress', 'contactPhoneNumber', 'customDatum', 'customField', 'leagueCustomDatum', 'leagueCustomField', 'divisionContact', 'divisionContactEmailAddress', 'divisionContactPhoneNumber', 'divisionLocation', 'divisionMember', 'divisionMemberEmailAddress', 'divisionMemberPhoneNumber', 'divisionMemberPreferences', 'divisionTeamStanding', 'event', 'eventStatistic', 'facebookPage', 'forumPost', 'forumSubscription', 'forumTopic', 'leagueRegistrantDocument', 'location', 'member', 'memberBalance', 'memberEmailAddress', 'memberFile', 'memberLink', 'memberPayment', 'memberPhoneNumber', 'memberPreferences', 'memberStatistic', 'message', 'messageDatum', 'opponent', 'opponentResults', 'paymentNote', 'plan', 'smsGateway', 'sponsor', 'statistic', 'statisticAggregate', 'statisticDatum', 'statisticGroup', 'sport', 'team', 'teamFee', 'teamMedium', 'teamMediumComment', 'teamMediaGroup', 'teamPaypalPreferences', 'teamPreferences', 'teamPublicSite', 'teamResults', 'teamStatistic', 'timeZone', 'trackedItem', 'trackedItemStatus'];
59405987

59415988
teamTypes = types.slice();
59425989

@@ -5960,6 +6007,7 @@ pluralLookup = {
59606007
divisionMemberPreferences: 'divisionMembersPreferences',
59616008
opponentResults: 'opponentsResults',
59626009
statisticDatum: 'statisticData',
6010+
messageDatum: 'messageData',
59636011
teamMedium: 'teamMedia',
59646012
teamPaypalPreferences: 'teamsPaypalPreferences',
59656013
teamPreferences: 'teamsPreferences',

lib/test/js/test.js

Lines changed: 143 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5812,12 +5812,55 @@ describe('Member Links', function() {
58125812
});
58135813

58145814
require.register("test/memberPayments", function(exports, require, module) {
5815+
var memberPayment;
5816+
5817+
memberPayment = {};
5818+
58155819
describe('Member Payments', function() {
5816-
return it('should be able to load all member payments for team', function(done) {
5817-
return teamsnap.loadMemberPayments(team.id, function(err, result) {
5818-
expect(err).to.be["null"];
5819-
result.should.be.an('array');
5820-
return done();
5820+
beforeEach(function(done) {
5821+
team.members = [
5822+
{
5823+
id: 1,
5824+
firstName: 'Ownie',
5825+
lastName: 'Owner',
5826+
memberPayments: [
5827+
{
5828+
type: 'memberPayment',
5829+
id: 222,
5830+
amountDue: 100.00,
5831+
amountPaid: 50.00,
5832+
memberId: 1,
5833+
teamId: team.id
5834+
}
5835+
]
5836+
}
5837+
];
5838+
memberPayment = team.members[0].memberPayments[0];
5839+
return done();
5840+
});
5841+
describe('loadMemberPayments', function() {
5842+
return it('should be able to load all member payments for team', function() {
5843+
return teamsnap.loadMemberPayments(team.id, function(err, result) {
5844+
expect(err).to.be["null"];
5845+
return result.should.be.an('array');
5846+
});
5847+
});
5848+
});
5849+
return describe('memberPaymentTransaction', function() {
5850+
it('should accept a memberPayment object', function() {
5851+
return teamsnap.memberPaymentTransaction(memberPayment, 4, function(err, result) {
5852+
return result.id.should.equal(222);
5853+
});
5854+
});
5855+
it('should accept a memberPaymentId', function() {
5856+
return teamsnap.memberPaymentTransaction(memberPayment.id, 10.00, function(err, result) {
5857+
return result.id.should.equal(222);
5858+
});
5859+
});
5860+
return it('should adjust memberPayment.amoutPaid', function() {
5861+
return teamsnap.memberPaymentTransaction(memberPayment.id, 10.00, function(err, result) {
5862+
return result.amountPaid.should.equal(90.00);
5863+
});
58215864
});
58225865
});
58235866
});
@@ -5967,6 +6010,101 @@ describe('Member Preferences', function() {
59676010

59686011
});
59696012

6013+
require.register("test/messageData", function(exports, require, module) {
6014+
describe('Message Data', function() {
6015+
return it('should be able to load message data for team', function(done) {
6016+
return teamsnap.loadMessageData({
6017+
teamId: team.id
6018+
}, function(err, result) {
6019+
expect(err).to.be["null"];
6020+
result.should.be.an('array');
6021+
return done();
6022+
});
6023+
});
6024+
});
6025+
6026+
});
6027+
6028+
require.register("test/messages", function(exports, require, module) {
6029+
describe('Messages', function() {
6030+
var recipient, sender;
6031+
sender = null;
6032+
recipient = null;
6033+
before(function(done) {
6034+
return teamsnap.loadMe().then(function(me) {
6035+
return teamsnap.loadMembers({
6036+
userId: me.id
6037+
}, function(err, result) {
6038+
expect(err).to.be["null"];
6039+
expect(result.length).to.be.above(0);
6040+
sender = result[0];
6041+
return done();
6042+
});
6043+
});
6044+
});
6045+
it('should be able to load all messages for team', function(done) {
6046+
return teamsnap.loadMessages(team.id, function(err, result) {
6047+
expect(err).to.be["null"];
6048+
result.should.be.an('array');
6049+
return done();
6050+
});
6051+
});
6052+
it('should be able to mark message as read by ID', function(done) {
6053+
var alert;
6054+
alert = teamsnap.createBroadcastAlert();
6055+
alert.teamId = team.id;
6056+
alert.memberId = sender.id;
6057+
alert.body = "Hello again world";
6058+
alert.recipientIds = [sender.id];
6059+
return teamsnap.saveBroadcastAlert(alert, function(err, result) {
6060+
expect(err).to.be["null"];
6061+
return teamsnap.loadMessages(team.id, function(err, result) {
6062+
var messages;
6063+
expect(err).to.be["null"];
6064+
result.should.be.an('array');
6065+
messages = result.filter(function(i) {
6066+
return i.messageId === alert.id && i.status === 'received';
6067+
});
6068+
expect(messages[0].readAt).to.be["null"];
6069+
return teamsnap.markMessageAsRead(messages[0].id, function(err, result) {
6070+
console.log(err);
6071+
expect(err).to.be["null"];
6072+
expect(result.readAt).to.not.be["null"];
6073+
return done();
6074+
});
6075+
});
6076+
});
6077+
});
6078+
return it('should be able to mark message as read by object', function(done) {
6079+
var alert;
6080+
alert = teamsnap.createBroadcastAlert();
6081+
alert.teamId = team.id;
6082+
alert.memberId = sender.id;
6083+
alert.body = "Hello again world";
6084+
alert.recipientIds = [sender.id];
6085+
return teamsnap.saveBroadcastAlert(alert, function(err, result) {
6086+
return teamsnap.loadMessages(team.id, function(err, result) {
6087+
var messages;
6088+
expect(err).to.be["null"];
6089+
result.should.be.an('array');
6090+
console.log(result);
6091+
messages = result.filter(function(i) {
6092+
return i.messageId === alert.id && i.status === 'received';
6093+
});
6094+
expect(messages[0].readAt).to.be["null"];
6095+
return teamsnap.markMessageAsRead(messages[0], function(err, result) {
6096+
console.log(err);
6097+
expect(err).to.be["null"];
6098+
expect(result.readAt).to.not.be["null"];
6099+
return done();
6100+
});
6101+
});
6102+
});
6103+
});
6104+
});
6105+
6106+
});
6107+
59706108
require.register("test/opponentResults", function(exports, require, module) {
59716109
describe('Opponent Results', function() {
59726110
var opponent1, opponent2;

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "teamsnap.js",
3-
"version": "1.12.1",
3+
"version": "1.13.0",
44
"description": "A JavaScript library for using the TeamSnap API.",
55
"author": "Jacob Wright with TeamSnap (http://www.teamsnap.com)",
66
"homepage": "https://github.com/teamsnap/teamsnap-javascript-sdk",

src/collections/messageData.coffee

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
exports.loadMessageData = (params, callback) ->
2+
if @isId params
3+
params = teamId: params
4+
else unless params and typeof params is 'object'
5+
throw new TSArgsError 'teamsnap.loadMessageData', 'must provide a
6+
teamId or query parameters'
7+
8+
@loadItems 'messageDatum', params, callback

src/collections/messages.coffee

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
exports.loadMessages = (params, callback) ->
2+
if @isId params
3+
params = teamId: params
4+
else unless params and typeof params is 'object'
5+
throw new TSArgsError 'teamsnap.loadMessages', 'must provide a
6+
teamId or query parameters'
7+
8+
@loadItems 'message', params, callback
9+
10+
exports.markMessageAsRead = (params, callback) ->
11+
if typeof params is 'object'
12+
params = id: params.id
13+
else if @isId params
14+
params = id: params
15+
else
16+
throw new TSArgsError 'teamsnap.markMessageAsRead', 'a message `id` or `message` object must be provided'
17+
18+
@collections.messages.exec('markMessageAsRead', params)
19+
.pop().callback callback

src/sdk.coffee

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,8 @@ add require './collections/memberPhoneNumbers'
199199
add require './collections/membersPreferences'
200200
add require './collections/memberStatistics'
201201
add require './collections/members'
202+
add require './collections/messageData'
203+
add require './collections/messages'
202204
add require './collections/opponents'
203205
add require './collections/opponentsResults'
204206
add require './collections/paymentNotes'

0 commit comments

Comments
 (0)