From 4e94b6b767db6f7e7e76cbb26fdca6d073b4b074 Mon Sep 17 00:00:00 2001 From: Justin Dalrymple Date: Sat, 25 Nov 2017 18:20:13 -0500 Subject: [PATCH] Adding extended group functionality --- src/Models/GroupAccessRequests.js | 42 +++++++++++++++++++++ src/Models/GroupMembers.js | 41 ++++++++++++++++++++ src/Models/GroupMilestoneIssues.js | 12 ++++++ src/Models/GroupMilestoneMergeRequests.js | 12 ++++++ src/Models/GroupMilestones.js | 46 +++++++++++++++++++++++ src/Models/GroupProjects.js | 18 +++++++++ src/Models/Groups.js | 24 ++---------- 7 files changed, 175 insertions(+), 20 deletions(-) create mode 100644 src/Models/GroupAccessRequests.js create mode 100644 src/Models/GroupMembers.js create mode 100644 src/Models/GroupMilestoneIssues.js create mode 100644 src/Models/GroupMilestoneMergeRequests.js create mode 100644 src/Models/GroupMilestones.js create mode 100644 src/Models/GroupProjects.js diff --git a/src/Models/GroupAccessRequests.js b/src/Models/GroupAccessRequests.js new file mode 100644 index 00000000..981dba1f --- /dev/null +++ b/src/Models/GroupAccessRequests.js @@ -0,0 +1,42 @@ +const BaseModel = require('./BaseModel'); +const Utils = require('../Utils'); + +const ACCESS_LEVELS = { + GUEST: 10, + REPORTER: 20, + DEVELOPER: 30, + MASTER: 40, + OWNER: 50, +}; + +class GroupAccessRequests extends BaseModel { + constructor(){ + this.ACCESS_LEVELS = ACCESS_LEVELS; + } + + all(groupId) { + const gId = Utils.parse(groupId); + + return this.get(`groups/${gId}/access_requests`); + } + + request(groupId) { + const gId = Utils.parse(groupId); + + return this.post(`groups/${gId}/access_requests`); + } + + approve(groupId, userId, {access_level = 30}) { + const [gId, uId] = [groupId, userId].map(Utils.parse); + + return this.post(`groups/${gId}/access_requests/${uId}/approve`, {access_level}); + } + + deny(groupId, userId) { + const [gId, uId] = [groupId, userId].map(Utils.parse); + + return this.delete(`groups/${gId}/access_requests/${uId}/approve`); + } +} + +module.exports = GroupAccessRequests; diff --git a/src/Models/GroupMembers.js b/src/Models/GroupMembers.js new file mode 100644 index 00000000..e5c709a6 --- /dev/null +++ b/src/Models/GroupMembers.js @@ -0,0 +1,41 @@ +const BaseModel = require('./BaseModel'); +const Utils = require('../Utils'); + +class GroupMembers extends BaseModel { + all(groupId) { + const gId = Utils.parse(groupId); + + return this.get(`groups/${gId}/members`); + } + + add(groupId, userId, accessLevel) { + const [gId, uId] = [groupId, userId].map(Utils.parse); + + return this.post(`groups/${gId}/members`, { + user_id: uId, + access_level: parseInt(accessLevel, 10), + }); + } + + edit(groupId, userId, accessLevel) { + const [gId, uId] = [groupId, userId].map(Utils.parse); + + return this.put(`groups/${gId}/members/${uId}`, { + access_level: parseInt(accessLevel, 10), + }); + } + + show(groupId, userId) { + const [gId, uId] = [groupId, userId].map(Utils.parse); + + return this.get(`groups/${gId}/members/${uId}`); + } + + remove(groupId, userId) { + const [gId, uId] = [groupId, userId].map(Utils.parse); + + return this.delete(`groups/${gId}/members/${uId}`); + } +} + +module.exports = GroupMembers; diff --git a/src/Models/GroupMilestoneIssues.js b/src/Models/GroupMilestoneIssues.js new file mode 100644 index 00000000..f60e1440 --- /dev/null +++ b/src/Models/GroupMilestoneIssues.js @@ -0,0 +1,12 @@ +const BaseModel = require('./BaseModel'); +const Utils = require('../Utils'); + +class GroupMilestoneIssues extends BaseModel { + all(grougId, milestoneId) { + const [gId, mId] = [groupId, milestoneId].map(Utils.parse); + + return this.get(`groups/${gId}/milestones/${mId}/issues`); + } +} + +module.exports = GroupMilestoneIssues; diff --git a/src/Models/GroupMilestoneMergeRequests.js b/src/Models/GroupMilestoneMergeRequests.js new file mode 100644 index 00000000..2e811a45 --- /dev/null +++ b/src/Models/GroupMilestoneMergeRequests.js @@ -0,0 +1,12 @@ +const BaseModel = require('./BaseModel'); +const Utils = require('../Utils'); + +class GroupMilestoneMergeRequests extends BaseModel { + all(grougId, milestoneId) { + const [gId, mId] = [groupId, milestoneId].map(Utils.parse); + + return this.get(`groups/${pId}/milestones/${mId}/merge_requests`); + } +} + +module.exports = GroupMilestoneIssues; diff --git a/src/Models/GroupMilestones.js b/src/Models/GroupMilestones.js new file mode 100644 index 00000000..2c02e153 --- /dev/null +++ b/src/Models/GroupMilestones.js @@ -0,0 +1,46 @@ +const BaseModel = require('./BaseModel'); +const Utils = require('../Utils'); + +class GroupMilestones extends BaseModel { + constructor(..args){ + this.issues = new GroupMilestoneIssues(..args); + this.mergeRequests = new GroupMilestoneMergeRequests(..args); + } + + all(groupId, options = {}) { + const pId = Utils.parse(groupId); + + return this.get(`groups/${pId}/milestones`, options); + } + + show(groupId, milestoneId) { + const [pId, mId] = [groupId, milestoneId].map(Utils.parse); + + return this.get(`groups/${pId}/milestones/${mId}`); + } + + create(groupId, title, { description, due_date, start_date }) { + const pId = Utils.parse(groupId); + + return this.post(`groups/${pId}/milestones`, { + title, + description, + due_date, + start_date, + }); + } + + update(groupId, milestoneId, { title, description, due_date, start_date, state_event }) { + const [pId, mId] = [projectId, milestoneId].map(Utils.parse); + + return this.put(`groups/${pId}/milestones/${mId}`, { + title, + description, + due_date, + start_date, + state_event, + }); + } +} + +module.exports = GroupMilestones; diff --git a/src/Models/GroupProjects.js b/src/Models/GroupProjects.js new file mode 100644 index 00000000..8d72d2f5 --- /dev/null +++ b/src/Models/GroupProjects.js @@ -0,0 +1,18 @@ +const BaseModel = require('./BaseModel'); +const Utils = require('../Utils'); + +class GroupProjects extends BaseModel { + all(groupId, options = {}) { + const gId = Utils.parse(groupId); + + return this.get(`groups/${gId}/projects`, options); + } + + add(groupId, projectId) { + const [gId, pId] = [groupId, projectId].map(Utils.parse); + + return this.post(`groups/${gId}/projects/${pId}`); + } +} + +module.exports = GroupProjects; diff --git a/src/Models/Groups.js b/src/Models/Groups.js index 57e48343..a1cff5b4 100644 --- a/src/Models/Groups.js +++ b/src/Models/Groups.js @@ -1,31 +1,15 @@ const BaseModel = require('./BaseModel'); const Utils = require('../Utils'); -const ACCESS_LEVELS = { - GUEST: 10, - REPORTER: 20, - DEVELOPER: 30, - MASTER: 40, - OWNER: 50, -}; - -function hasAccess(accessLevel) { - let valid = false; - - Object.values(ACCESS_LEVELS).forEach((level) => { - if (accessLevel === level) { - valid = true; - } - }); - - if (!valid) throw new Error(`\`accessLevel\` must be one of ${JSON.stringify(ACCESS_LEVELS)}`); -} - class Groups extends BaseModel { constructor(...args) { super(...args); this.access_levels = ACCESS_LEVELS; + this.milestones = new GroupMilestones(...args); + this.members = new GroupMembers(...args); + this.projects = new GroupProjects(...args); + this.accessLevels = new GroupAccessLevels(...args); } all(options = {}) {