Skip to content

Commit 837d60b

Browse files
committed
Merge pull request #113 from teamsnap/AWE-354-MemberEmailAddresses-Invite-Endpoint
Adds inviteMemberEmailAddresses method to sdk.
2 parents cb45988 + 6bc37d3 commit 837d60b

File tree

10 files changed

+200
-66
lines changed

10 files changed

+200
-66
lines changed

CHANGELOG.md

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

3+
### Feb 17, 2016 // Version 1.10.0
4+
- Adds `inviteMemberEmailAddresses` method.
5+
- Lock down dependencies while we investigate upgrading to latest and greatest.
6+
---
7+
38
### Feb 15, 2016 // Version 1.9.0
49
- Refactors `bulkLoad` to accept "Smart Load" params.
510

docs/collections/member_email_addresses.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
- [createMemberEmailAddress](#createMemberEmailAddress)
77
- [saveMemberEmailAddress](#saveMemberEmailAddress)
88
- [deleteMemberEmailAddress](#deleteMemberEmailAddress)
9+
- [inviteMemberEmailAddresses](#inviteMemberEmailAddresses)
910

1011

1112
---
@@ -115,3 +116,41 @@ teamsnap.saveMemberEmailAddress(memberEmailAddress).then(function(){
115116
});
116117
});
117118
```
119+
<a id="inviteMemberEmailAddresses"></a>
120+
## `inviteMemberEmailAddresses(params, callback)`
121+
Invite memberEmailAddresses to a team
122+
123+
### Params
124+
* `options`: [object] - Object that contains additional data:
125+
* `memberEmailAddressIds`: [string] A comma separated list of ids
126+
* `teamId`: [int] Id of Team
127+
* `memberId`: [int] Id of member associated with `memberEmailAddressIds`
128+
* `notifyAsMemberId`: [int] Id of member sending invitation
129+
* `introduction`: [string] Introduction text for invitation (optional)
130+
131+
### Examples
132+
```javascript
133+
// ~~~~~
134+
// Invites a MemberEmailAddress.
135+
teamsnap.inviteMemberEmailAddresses(params);
136+
137+
// ~~~~~
138+
// Creates a new memberEmailAddress and invites it to the team.
139+
var memberEmailAddress = teamsnap.createMemberEmailAddress({
140+
memberId: 1,
141+
142+
receivesTeamEmails: true
143+
});
144+
145+
var options = {
146+
memberEmailAddressIds: "'" + memberEmailAddress.id + "'"
147+
teamId: 1,
148+
memberId: 2,
149+
notifyAsMemberId: 1,
150+
introduction: "Welcome to the team!"
151+
};
152+
153+
teamsnap.inviteMemberEmailAddresses(options).then(function() {
154+
// memberEmailAddress has been invited!
155+
});
156+
```

lib/teamsnap.js

Lines changed: 40 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,53 +8,52 @@ var window, global = {};
88

99
var modules = {};
1010
var cache = {};
11-
var has = ({}).hasOwnProperty;
12-
1311
var aliases = {};
12+
var has = ({}).hasOwnProperty;
1413

1514
var endsWith = function(str, suffix) {
1615
return str.indexOf(suffix, str.length - suffix.length) !== -1;
1716
};
1817

18+
var _cmp = 'components/';
1919
var unalias = function(alias, loaderPath) {
2020
var start = 0;
2121
if (loaderPath) {
22-
if (loaderPath.indexOf('components/' === 0)) {
23-
start = 'components/'.length;
22+
if (loaderPath.indexOf(_cmp) === 0) {
23+
start = _cmp.length;
2424
}
2525
if (loaderPath.indexOf('/', start) > 0) {
2626
loaderPath = loaderPath.substring(start, loaderPath.indexOf('/', start));
2727
}
2828
}
2929
var result = aliases[alias + '/index.js'] || aliases[loaderPath + '/deps/' + alias + '/index.js'];
3030
if (result) {
31-
return 'components/' + result.substring(0, result.length - '.js'.length);
31+
return _cmp + result.substring(0, result.length - '.js'.length);
3232
}
3333
return alias;
3434
};
3535

36-
var expand = (function() {
37-
var reg = /^\.\.?(\/|$)/;
38-
return function(root, name) {
39-
var results = [], parts, part;
40-
parts = (reg.test(name) ? root + '/' + name : name).split('/');
41-
for (var i = 0, length = parts.length; i < length; i++) {
42-
part = parts[i];
43-
if (part === '..') {
44-
results.pop();
45-
} else if (part !== '.' && part !== '') {
46-
results.push(part);
47-
}
36+
var _reg = /^\.\.?(\/|$)/;
37+
var expand = function(root, name) {
38+
var results = [], part;
39+
var parts = (_reg.test(name) ? root + '/' + name : name).split('/');
40+
for (var i = 0, length = parts.length; i < length; i++) {
41+
part = parts[i];
42+
if (part === '..') {
43+
results.pop();
44+
} else if (part !== '.' && part !== '') {
45+
results.push(part);
4846
}
49-
return results.join('/');
50-
};
51-
})();
47+
}
48+
return results.join('/');
49+
};
50+
5251
var dirname = function(path) {
5352
return path.split('/').slice(0, -1).join('/');
5453
};
5554

5655
var localRequire = function(path) {
57-
return function(name) {
56+
return function expanded(name) {
5857
var absolute = expand(dirname(path), name);
5958
return globals.require(absolute, path);
6059
};
@@ -109,6 +108,7 @@ var window, global = {};
109108
};
110109

111110
require.brunch = true;
111+
require._cache = cache;
112112
globals.require = require;
113113
})();
114114
var require = global.require;
@@ -1348,6 +1348,8 @@ exports.loadMemberBalances = function(params, callback) {
13481348
});
13491349

13501350
require.register("collections/memberEmailAddresses", function(exports, require, module) {
1351+
exports.INVITED_STATES = ["new", "new_user", "existing_user"];
1352+
13511353
exports.loadMemberEmailAddresses = function(params, callback) {
13521354
if (this.isId(params)) {
13531355
params = {
@@ -1366,6 +1368,22 @@ exports.createMemberEmailAddress = function(data) {
13661368
});
13671369
};
13681370

1371+
exports.inviteMemberEmailAddresses = function(options, callback) {
1372+
if (!options.memberEmailAddressIds) {
1373+
throw new TSArgsError('teamsnap.inviteMemberEmailAddresses', 'options.memberEmailAddressIds is required.');
1374+
}
1375+
if (!options.memberId) {
1376+
throw new TSArgsError('teamsnap.inviteMemberEmailAddresses', 'options.memberId is required.');
1377+
}
1378+
if (!options.teamId) {
1379+
throw new TSArgsError('teamsnap.inviteMemberEmailAddresses', 'options.teamId is required.');
1380+
}
1381+
if (!options.notifyAsMemberId) {
1382+
throw new TSArgsError('teamsnap.inviteMemberEmailAddresses', 'options.notifyAsMemberId is required.');
1383+
}
1384+
return this.collections.memberEmailAddresses.exec('invite', options).pop().callback(callback);
1385+
};
1386+
13691387
exports.saveMemberEmailAddress = function(memberEmailAddress, callback) {
13701388
if (!memberEmailAddress) {
13711389
throw new TSArgsError('teamsnap.saveMemberEmailAddress', '`memberEmailAddress` must be provided');
@@ -5787,7 +5805,7 @@ ref = require('./model'), Collection = ref.Collection, Item = ref.Item;
57875805
require('./errors');
57885806

57895807
TeamSnap = (function() {
5790-
TeamSnap.prototype.version = '1.9.0';
5808+
TeamSnap.prototype.version = '1.10.0';
57915809

57925810
TeamSnap.prototype.promises = promises;
57935811

lib/teamsnap.min.js

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/test/js/test.js

Lines changed: 51 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,53 +6,52 @@
66

77
var modules = {};
88
var cache = {};
9-
var has = ({}).hasOwnProperty;
10-
119
var aliases = {};
10+
var has = ({}).hasOwnProperty;
1211

1312
var endsWith = function(str, suffix) {
1413
return str.indexOf(suffix, str.length - suffix.length) !== -1;
1514
};
1615

16+
var _cmp = 'components/';
1717
var unalias = function(alias, loaderPath) {
1818
var start = 0;
1919
if (loaderPath) {
20-
if (loaderPath.indexOf('components/' === 0)) {
21-
start = 'components/'.length;
20+
if (loaderPath.indexOf(_cmp) === 0) {
21+
start = _cmp.length;
2222
}
2323
if (loaderPath.indexOf('/', start) > 0) {
2424
loaderPath = loaderPath.substring(start, loaderPath.indexOf('/', start));
2525
}
2626
}
2727
var result = aliases[alias + '/index.js'] || aliases[loaderPath + '/deps/' + alias + '/index.js'];
2828
if (result) {
29-
return 'components/' + result.substring(0, result.length - '.js'.length);
29+
return _cmp + result.substring(0, result.length - '.js'.length);
3030
}
3131
return alias;
3232
};
3333

34-
var expand = (function() {
35-
var reg = /^\.\.?(\/|$)/;
36-
return function(root, name) {
37-
var results = [], parts, part;
38-
parts = (reg.test(name) ? root + '/' + name : name).split('/');
39-
for (var i = 0, length = parts.length; i < length; i++) {
40-
part = parts[i];
41-
if (part === '..') {
42-
results.pop();
43-
} else if (part !== '.' && part !== '') {
44-
results.push(part);
45-
}
34+
var _reg = /^\.\.?(\/|$)/;
35+
var expand = function(root, name) {
36+
var results = [], part;
37+
var parts = (_reg.test(name) ? root + '/' + name : name).split('/');
38+
for (var i = 0, length = parts.length; i < length; i++) {
39+
part = parts[i];
40+
if (part === '..') {
41+
results.pop();
42+
} else if (part !== '.' && part !== '') {
43+
results.push(part);
4644
}
47-
return results.join('/');
48-
};
49-
})();
45+
}
46+
return results.join('/');
47+
};
48+
5049
var dirname = function(path) {
5150
return path.split('/').slice(0, -1).join('/');
5251
};
5352

5453
var localRequire = function(path) {
55-
return function(name) {
54+
return function expanded(name) {
5655
var absolute = expand(dirname(path), name);
5756
return globals.require(absolute, path);
5857
};
@@ -107,6 +106,7 @@
107106
};
108107

109108
require.brunch = true;
109+
require._cache = cache;
110110
globals.require = require;
111111
})();
112112
require.register("test/assignments", function(exports, require, module) {
@@ -5693,7 +5693,7 @@ describe('Member Email Addresses', function() {
56935693
return done();
56945694
});
56955695
});
5696-
return it('should be able to delete a member email', function(done) {
5696+
it('should be able to delete a member email', function(done) {
56975697
return teamsnap.deleteMemberEmailAddress(email, function(err, result) {
56985698
expect(err).to.be["null"];
56995699
return teamsnap.loadMemberEmailAddresses({
@@ -5706,6 +5706,35 @@ describe('Member Email Addresses', function() {
57065706
});
57075707
});
57085708
});
5709+
return it('should be able to invite a member email', function(done) {
5710+
var manager;
5711+
manager = teamsnap.createMember();
5712+
manager.teamId = team.id;
5713+
manager.firstName = 'Manager';
5714+
return teamsnap.saveMember(manager, function(err, result) {
5715+
var value;
5716+
email = teamsnap.createMemberEmailAddress();
5717+
email.memberId = member.id;
5718+
email.email = value = '[email protected]';
5719+
return teamsnap.saveMemberEmailAddress(email, function(err, result) {
5720+
var options;
5721+
expect(err).to.be["null"];
5722+
result.should.have.property('email', value);
5723+
options = {
5724+
teamId: team.id,
5725+
introduction: "Welcome to the team!",
5726+
memberId: member.id,
5727+
memberEmailAddressIds: "" + email.id,
5728+
notifyAsMemberId: manager.id
5729+
};
5730+
return teamsnap.inviteMemberEmailAddresses(options, function(err, result) {
5731+
expect(err).to.be["null"];
5732+
result.should.have.property('invitationState', 'new');
5733+
return done();
5734+
});
5735+
});
5736+
});
5737+
});
57095738
});
57105739

57115740
});

lib/test/js/test.min.js

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "teamsnap.js",
3-
"version": "1.9.0",
3+
"version": "1.10.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",
@@ -15,15 +15,15 @@
1515
},
1616
"main": "lib/teamsnap",
1717
"dependencies": {
18-
"xmlhttprequest": "latest",
19-
"form-data": "latest"
18+
"xmlhttprequest": "1.8.0",
19+
"form-data": "1.0.0-rc3"
2020
},
2121
"devDependencies": {
22-
"brunch": "latest",
23-
"library-brunch": "latest",
24-
"javascript-brunch": "latest",
25-
"coffee-script-brunch": "latest",
26-
"uglify-js-brunch": "latest",
27-
"coffeelint-brunch": "latest"
22+
"brunch": "1.8.5",
23+
"library-brunch": "1.2.0",
24+
"javascript-brunch": "1.8.0",
25+
"coffee-script-brunch": "1.8.3",
26+
"uglify-js-brunch": "1.7.8",
27+
"coffeelint-brunch": "1.7.1"
2828
}
2929
}

src/collections/memberEmailAddresses.coffee

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
exports.INVITED_STATES = ["new", "new_user", "existing_user"]
12

23
exports.loadMemberEmailAddresses = (params, callback) ->
34
if @isId params
@@ -14,6 +15,25 @@ exports.createMemberEmailAddress = (data) ->
1415
type: 'memberEmailAddress'
1516
receivesTeamEmails: true
1617

18+
exports.inviteMemberEmailAddresses = (options, callback) ->
19+
unless options.memberEmailAddressIds
20+
throw new TSArgsError 'teamsnap.inviteMemberEmailAddresses',
21+
'options.memberEmailAddressIds is required.'
22+
23+
unless options.memberId
24+
throw new TSArgsError 'teamsnap.inviteMemberEmailAddresses',
25+
'options.memberId is required.'
26+
27+
unless options.teamId
28+
throw new TSArgsError 'teamsnap.inviteMemberEmailAddresses',
29+
'options.teamId is required.'
30+
31+
unless options.notifyAsMemberId
32+
throw new TSArgsError 'teamsnap.inviteMemberEmailAddresses',
33+
'options.notifyAsMemberId is required.'
34+
35+
@collections.memberEmailAddresses
36+
.exec('invite', options).pop().callback callback
1737

1838
exports.saveMemberEmailAddress = (memberEmailAddress, callback) ->
1939
unless memberEmailAddress

src/teamsnap.coffee

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ promises = require './promises'
33
require './errors'
44

55
class TeamSnap
6-
version: '1.9.0'
6+
version: '1.10.0'
77
promises: promises
88
when: promises.when
99
TeamSnap: TeamSnap

0 commit comments

Comments
 (0)