diff --git a/src/API.js b/src/API.js deleted file mode 100644 index 1023dccd..00000000 --- a/src/API.js +++ /dev/null @@ -1,85 +0,0 @@ -import Request from 'request-promise'; -import { Groups, Projects, Issues, Runners, Users, MergeRequests, Version } from './Models'; - -function defaultRequest(url, endpoint, { - headers, - body, - qs, - formData, - resolveWithFullResponse = false, -}) { - const params = { - url: `${url}${endpoint}`, - headers, - json: true, - }; - - if (body) params.body = body; - if (qs) params.qs = qs; - if (formData) params.formData = formData; - - params.resolveWithFullResponse = resolveWithFullResponse; - - return params; -} - -class API { - constructor({ url = 'https://gitlab.com', token, oauthToken }) { - this.url = `${url}/api/v4/`; - this.headers = {}; - - if (oauthToken) { - this.headers.Authorization = `Bearer ${oauthToken}`; - } else if (token) { - this.headers['private-token'] = token; - } else { - throw new Error('`token` (private-token) or `oauth_token` is mandatory'); - } - - this.groups = new Groups(this); - this.projects = new Projects(this); - this.issues = new Issues(this); - this.users = new Users(this); - this.runners = new Runners(this); - this.mergeRequests = new MergeRequests(this); - this.version = new Version(this); - } - - get(endpoint, options, fullResponse = false) { - return Request.get(defaultRequest(this.url, endpoint, { - headers: this.headers, - qs: options, - resolveWithFullResponse: fullResponse, - })); - } - - post(endpoint, options) { - return Request.post(defaultRequest(this.url, endpoint, { - headers: this.headers, - body: options, - })); - } - - postForm(endpoint, options) { - return Request.post(defaultRequest(this.url, endpoint, { - headers: this.headers, - formData: options, - })); - } - - put(endpoint, options) { - return Request.put(defaultRequest(this.url, endpoint, { - headers: this.headers, - body: options, - })); - } - - delete(endpoint, options) { - return Request.delete(defaultRequest(this.url, endpoint, { - headers: this.headers, - qs: options, - })); - } -} - -export default API; diff --git a/src/Models/GroupProjects.js b/src/Models/GroupProjects.js deleted file mode 100644 index 36684c64..00000000 --- a/src/Models/GroupProjects.js +++ /dev/null @@ -1,18 +0,0 @@ -import BaseModel from './BaseModel'; -import { parse } from '../Utils'; - -class GroupProjects extends BaseModel { - all(groupId, options = {}) { - const gId = parse(groupId); - - return this.get(`groups/${gId}/projects`, options); - } - - add(groupId, projectId) { - const [gId, pId] = [groupId, projectId].map(parse); - - return this.post(`groups/${gId}/projects/${pId}`); - } -} - -export default GroupProjects; diff --git a/src/Models/Groups.js b/src/Models/Groups.js deleted file mode 100644 index 56f42867..00000000 --- a/src/Models/Groups.js +++ /dev/null @@ -1,53 +0,0 @@ -import BaseModel from './BaseModel'; -import GroupProjects from './GroupProjects'; -import ResourceAccessRequests from './ResourceAccessRequests'; -import ResourceCustomAttributes from './ResourceCustomAttributes'; -import ResourceMembers from './ResourceMembers'; -import ResourceMilestones from './ResourceMilestones'; -import { parse } from '../Utils'; - -class Groups extends BaseModel { - constructor(...args) { - super(...args); - - this.projects = new GroupProjects(...args); - this.accessRequests = new ResourceAccessRequests('groups', ...args); - this.customAttributes = new ResourceCustomAttributes('groups', ...args); - this.members = new ResourceMembers('groups', ...args); - this.milestones = new ResourceMilestones('groups', ...args); - } - - all(options = {}) { - return this.get('groups', options); - } - - allSubgroups(groupId, options = {}) { - const gId = parse(groupId); - - return this.get(`groups/${gId}/subgroups`, options); - } - - show(groupId) { - const gId = parse(groupId); - - return this.get(`groups/${gId}`); - } - - create(options = {}) { - return this.post('groups', options); - } - - remove(groupId) { - const gId = parse(groupId); - - return this.delete(`groups/${gId}`); - } - - search(nameOrPath) { - return this.get('groups', { - search: nameOrPath, - }); - } -} - -export default Groups; diff --git a/src/Models/Issues.js b/src/Models/Issues.js deleted file mode 100644 index cf42690c..00000000 --- a/src/Models/Issues.js +++ /dev/null @@ -1,9 +0,0 @@ -import BaseModel from './BaseModel'; - -class Issues extends BaseModel { - all(options = {}) { - return this.get('issues', options); - } -} - -export default Issues; diff --git a/src/Models/MergeRequests.js b/src/Models/MergeRequests.js deleted file mode 100644 index a5928ad9..00000000 --- a/src/Models/MergeRequests.js +++ /dev/null @@ -1,9 +0,0 @@ -import BaseModel from './BaseModel'; - -class MergeRequests extends BaseModel { - all(options = {}) { - return this.get('merge_requests', options); - } -} - -export default MergeRequests; diff --git a/src/Models/ProjectDeployKeys.js b/src/Models/ProjectDeployKeys.js deleted file mode 100644 index 2bc86727..00000000 --- a/src/Models/ProjectDeployKeys.js +++ /dev/null @@ -1,24 +0,0 @@ -import BaseModel from './BaseModel'; -import { parse } from '../Utils'; - -class ProjectDeployKeys extends BaseModel { - add(projectId, options = {}) { - const pId = parse(projectId); - - return this.post(`projects/${pId}/deploy_keys`, options); - } - - all(projectId) { - const pId = parse(projectId); - - return this.get(`projects/${pId}/deploy_keys`); - } - - show(projectId, keyId) { - const [pId, kId] = [projectId, keyId].map(parse); - - return this.get(`projects/${pId}/deploy_keys/${kId}`); - } -} - -export default ProjectDeployKeys; diff --git a/src/Models/ProjectEnvironments.js b/src/Models/ProjectEnvironments.js deleted file mode 100644 index 8f61d7e4..00000000 --- a/src/Models/ProjectEnvironments.js +++ /dev/null @@ -1,12 +0,0 @@ -import BaseModel from './BaseModel'; -import { parse } from '../Utils'; - -class Environments extends BaseModel { - all(projectId, options = {}) { - const pId = parse(projectId); - - return this.get(`projects/${pId}/environments`, options); - } -} - -export default Environments; diff --git a/src/Models/ProjectHooks.js b/src/Models/ProjectHooks.js deleted file mode 100644 index bfe0c55a..00000000 --- a/src/Models/ProjectHooks.js +++ /dev/null @@ -1,36 +0,0 @@ -import BaseModel from './BaseModel'; -import { parse } from '../Utils'; - -class ProjectHooks extends BaseModel { - all(projectId) { - const pId = parse(projectId); - - return this.get(`projects/${pId}/hooks`); - } - - show(projectId, hookId) { - const [pId, hId] = [projectId, hookId].map(parse); - - return this.get(`projects/${pId}/hooks/${hId}`); - } - - add(projectId, url, options = {}) { - const pId = parse(projectId); - - return this.post(`projects/${pId}/hooks`, Object.assign({ url }, options)); - } - - edit(projectId, hookId, url, options = {}) { - const [pId, hId] = [projectId, hookId].map(parse); - - return this.put(`projects/${pId}/hooks/${hId}`, Object.assign({ url }, options)); - } - - remove(projectId, hookId) { - const [pId, hId] = [projectId, hookId].map(parse); - - return this.delete(`projects/${pId}/hooks/${hId}`); - } -} - -export default ProjectHooks; diff --git a/src/Models/ProjectIssues.js b/src/Models/ProjectIssues.js deleted file mode 100644 index 91794206..00000000 --- a/src/Models/ProjectIssues.js +++ /dev/null @@ -1,62 +0,0 @@ -import BaseModel from './BaseModel'; -import { parse } from '../Utils'; -import ResourceNotes from './ResourceNotes'; - -class ProjectIssues extends BaseModel { - constructor(...args) { - super(...args); - - this.notes = new ResourceNotes('projects', 'issues', ...args); - } - - all(projectId, options = {}) { - const pId = parse(projectId); - - return this.get(`projects/${pId}/issues`, options); - } - - create(projectId, options = {}) { - const pId = parse(projectId); - - return this.post(`projects/${pId}/issues`, options); - } - - edit(projectId, issueId, options = {}) { - const [pId, iId] = [projectId, issueId].map(parse); - - return this.put(`projects/${pId}/issues/${iId}`, options); - } - - link(projectId, issueIId, targetProjectId, targetIssueId, options = {}) { - const [pId, iId] = [projectId, issueIId].map(parse); - const [targetpId, targetIId] = [targetProjectId, targetIssueId].map(parse); - - return this.post(`projects/${pId}/issues/${iId}/links`, Object.assign({ target_project_id: targetpId, target_issue_id: targetIId }, options)); - } - - remove(projectId, issueId) { - const [pId, iId] = [projectId, issueId].map(parse); - - return this.delete(`projects/${pId}/issues/${iId}`); - } - - show(projectId, issueId) { - const [pId, iId] = [projectId, issueId].map(parse); - - return this.get(`projects/${pId}/issues/${iId}`); - } - - subscribe(projectId, issueId, options = {}) { - const [pId, iId] = [projectId, issueId].map(parse); - - return this.post(`projects/${pId}/issues/${iId}/subscribe`, options); - } - - unsubscribe(projectId, issueId) { - const [pId, iId] = [projectId, issueId].map(parse); - - return this.delete(`projects/${pId}/issues/${iId}/unsubscribe`); - } -} - -export default ProjectIssues; diff --git a/src/Models/ProjectJobs.js b/src/Models/ProjectJobs.js deleted file mode 100644 index a38a9ef2..00000000 --- a/src/Models/ProjectJobs.js +++ /dev/null @@ -1,12 +0,0 @@ -import BaseModel from './BaseModel'; -import { parse } from '../Utils'; - -class Jobs extends BaseModel { - all(projectId, options = {}) { - const pId = parse(projectId); - - return this.get(`projects/${pId}/jobs`, options); - } -} - -export default Jobs; diff --git a/src/Models/ProjectLabels.js b/src/Models/ProjectLabels.js deleted file mode 100644 index 58b8bcfa..00000000 --- a/src/Models/ProjectLabels.js +++ /dev/null @@ -1,42 +0,0 @@ -import BaseModel from './BaseModel'; -import { parse } from '../Utils'; - -class ProjectLabels extends BaseModel { - all(projectId, options = {}) { - const pId = parse(projectId); - - return this.get(`projects/${pId}/labels`, options); - } - - create(projectId, options = {}) { - const pId = parse(projectId); - - return this.post(`projects/${pId}/labels`, options); - } - - edit(projectId, labelName, options = {}) { - const pId = parse(projectId); - - return this.put(`projects/${pId}/labels`, Object.assign({ name: labelName }, options)); - } - - remove(projectId, labelName) { - const pId = parse(projectId); - - return this.delete(`projects/${pId}/labels`, { name: labelName }); - } - - subscribe(projectId, labelId, options = {}) { - const [pId, lId] = [projectId, labelId].map(parse); - - return this.post(`projects/${pId}/issues/${lId}/subscribe`, options); - } - - unsubscribe(projectId, labelId) { - const [pId, lId] = [projectId, labelId].map(parse); - - return this.delete(`projects/${pId}/issues/${lId}/unsubscribe`); - } -} - -export default ProjectLabels; diff --git a/src/Models/ProjectMergeRequestChanges.js b/src/Models/ProjectMergeRequestChanges.js deleted file mode 100644 index 4ea2bed3..00000000 --- a/src/Models/ProjectMergeRequestChanges.js +++ /dev/null @@ -1,12 +0,0 @@ -import BaseModel from './BaseModel'; -import { parse } from '../Utils'; - -class ProjectMergeRequestChanges extends BaseModel { - show(projectId, mergerequestId) { - const [pId, mId] = [projectId, mergerequestId].map(parse); - - return this.get(`projects/${pId}/merge_requests/${mId}/changes`); - } -} - -export default ProjectMergeRequestChanges; diff --git a/src/Models/ProjectMergeRequestCommits.js b/src/Models/ProjectMergeRequestCommits.js deleted file mode 100644 index b0038239..00000000 --- a/src/Models/ProjectMergeRequestCommits.js +++ /dev/null @@ -1,12 +0,0 @@ -import BaseModel from './BaseModel'; -import { parse } from '../Utils'; - -class ProjectMergeRequestCommits extends BaseModel { - show(projectId, mergerequestId) { - const [pId, mId] = [projectId, mergerequestId].map(parse); - - return this.get(`projects/${pId}/merge_requests/${mId}/commits`); - } -} - -export default ProjectMergeRequestCommits; diff --git a/src/Models/ProjectMergeRequestVersions.js b/src/Models/ProjectMergeRequestVersions.js deleted file mode 100644 index 81330c15..00000000 --- a/src/Models/ProjectMergeRequestVersions.js +++ /dev/null @@ -1,18 +0,0 @@ -import BaseModel from './BaseModel'; -import { parse } from '../Utils'; - -class ProjectMergeRequestVersions extends BaseModel { - all(projectId, mergerequestId) { - const [pId, mId] = [projectId, mergerequestId].map(parse); - - return this.get(`projects/${pId}/merge_requests/${mId}/versions`); - } - - show(projectId, mergerequestId, versionId) { - const [pId, mId, vId] = [projectId, mergerequestId, versionId].map(parse); - - return this.get(`projects/${pId}/merge_requests/${mId}/versions/${vId}`); - } -} - -export default ProjectMergeRequestVersions; diff --git a/src/Models/ProjectMergeRequests.js b/src/Models/ProjectMergeRequests.js deleted file mode 100644 index 48edb9e1..00000000 --- a/src/Models/ProjectMergeRequests.js +++ /dev/null @@ -1,120 +0,0 @@ -import BaseModel from './BaseModel'; -import { parse } from '../Utils'; -import ProjectMergeRequestVersions from './ProjectMergeRequestVersions'; -import ProjectMergeRequestChanges from './ProjectMergeRequestChanges'; -import ProjectMergeRequestCommits from './ProjectMergeRequestCommits'; -import ResourceNotes from './ResourceNotes'; - -class ProjectMergeRequests extends BaseModel { - constructor(...args) { - super(...args); - - this.commits = new ProjectMergeRequestCommits(...args); - this.changes = new ProjectMergeRequestChanges(...args); - this.versions = new ProjectMergeRequestVersions(...args); - this.notes = new ResourceNotes('projects', 'merge_requests', ...args); - } - - accept(projectId, mergerequestId, options = {}) { - const [pId, mId] = [projectId, mergerequestId].map(parse); - - return this.put(`projects/${pId}/merge_requests/${mId}/merge`, options); - } - - all(projectId, options = {}) { - const pId = parse(projectId); - - return this.get(`projects/${pId}/merge_requests`, options); - } - - cancelOnPipelineSucess(projectId, mergerequestId) { - const [pId, mId] = [projectId, mergerequestId].map(parse); - - return this.put(`projects/${pId}/merge_requests/${mId}/cancel_merge_when_pipeline_succeeds`); - } - - closesIssues(projectId, mergerequestId) { - const [pId, mId] = [projectId, mergerequestId].map(parse); - - return this.get(`projects/${pId}/merge_requests/${mId}/closes_issues`); - } - - create(projectId, sourceBranch, targetBranch, title, options = {}) { - const pId = parse(projectId); - - return this.post(`projects/${pId}/merge_requests`, Object.assign({ - id: pId, - source_branch: sourceBranch, - target_branch: targetBranch, - title, - }, options)); - } - - createTodo(projectId, mergerequestId) { - const [pId, mId] = [projectId, mergerequestId].map(parse); - - return this.post(`projects/${pId}/merge_requests/${mId}/todo`); - } - - edit(projectId, mergerequestId, options = {}) { - const [pId, mId] = [projectId, mergerequestId].map(parse); - - return this.put(`projects/${pId}/merge_requests/${mId}`, options); - } - - remove(projectId, mergerequestId) { - const [pId, mId] = [projectId, mergerequestId].map(parse); - - return this.delete(`projects/${pId}/merge_requests/${mId}`); - } - - show(projectId, mergerequestId) { - const [pId, mId] = [projectId, mergerequestId].map(parse); - - return this.get(`projects/${pId}/merge_requests/${mId}`); - } - - subscribe(projectId, mergerequestId, options = {}) { - const [pId, mId] = [projectId, mergerequestId].map(parse); - - return this.post(`projects/${pId}/merge_requests/${mId}/subscribe`, options); - } - - resetSpentTime(projectId, mergerequestId) { - const [pId, mId] = [projectId, mergerequestId].map(parse); - - return this.post(`projects/${pId}/merge_requests/${mId}/reset_spent_time`); - } - - resetTimeEstimate(projectId, mergerequestId) { - const [pId, mId] = [projectId, mergerequestId].map(parse); - - return this.post(`projects/${pId}/merge_requests/${mId}/reset_time_estimate`); - } - - spentTime(projectId, mergerequestId, duration) { - const [pId, mId] = [projectId, mergerequestId].map(parse); - - return this.post(`projects/${pId}/merge_requests/${mId}/add_spent_time`, { duration }); - } - - timeEstimate(projectId, mergerequestId, duration) { - const [pId, mId] = [projectId, mergerequestId].map(parse); - - return this.post(`projects/${pId}/merge_requests/${mId}/time_estimate`, { duration }); - } - - timeStats(projectId, mergerequestId) { - const [pId, mId] = [projectId, mergerequestId].map(parse); - - return this.get(`projects/${pId}/merge_requests/${mId}/time_stats`); - } - - unsubscribe(projectId, mergerequestId) { - const [pId, mId] = [projectId, mergerequestId].map(parse); - - return this.delete(`projects/${pId}/merge_requests/${mId}/unsubscribe`); - } -} - -export default ProjectMergeRequests; diff --git a/src/Models/ProjectPipelines.js b/src/Models/ProjectPipelines.js deleted file mode 100644 index b75a90b9..00000000 --- a/src/Models/ProjectPipelines.js +++ /dev/null @@ -1,12 +0,0 @@ -import BaseModel from './BaseModel'; -import { parse } from '../Utils'; - -class Pipelines extends BaseModel { - all(projectId, options = {}) { - const pId = parse(projectId); - - return this.get(`projects/${pId}/pipelines`, options); - } -} - -export default Pipelines; diff --git a/src/Models/ProjectProtectedBranches.js b/src/Models/ProjectProtectedBranches.js deleted file mode 100644 index 55393315..00000000 --- a/src/Models/ProjectProtectedBranches.js +++ /dev/null @@ -1,30 +0,0 @@ -import BaseModel from './BaseModel'; -import { parse } from '../Utils'; - -class ProjectProtectedBranches extends BaseModel { - all(projectId) { - const pId = parse(projectId); - - return this.get(`projects/${pId}/protected_branches`); - } - - protect(projectId, branchName, options = {}) { - const pId = parse(projectId); - - return this.post(`projects/${pId}/protected_branches`, Object.assign(options, { name: branchName })); - } - - show(projectId, branchName) { - const pId = parse(projectId); - - return this.get(`projects/${pId}/protected_branches/${branchName}`); - } - - unprotect(projectId, branchName) { - const pId = parse(projectId); - - return this.delete(`projects/${pId}/protected_branches/${branchName}`); - } -} - -export default ProjectProtectedBranches; diff --git a/src/Models/ProjectRepository.js b/src/Models/ProjectRepository.js deleted file mode 100644 index f3580b32..00000000 --- a/src/Models/ProjectRepository.js +++ /dev/null @@ -1,55 +0,0 @@ -import BaseModel from './BaseModel'; -import { parse } from '../Utils'; -import ProjectRepositoryBranches from './ProjectRepositoryBranches'; -import ProjectRepositoryTags from './ProjectRepositoryTags'; -import ProjectRepositoryCommits from './ProjectRepositoryCommits'; -import ProjectRepositoryFiles from './ProjectRepositoryFiles'; - -class ProjectRepository extends BaseModel { - constructor(...args) { - super(...args); - - this.branches = new ProjectRepositoryBranches(...args); - this.tags = new ProjectRepositoryTags(...args); - this.commits = new ProjectRepositoryCommits(...args); - this.files = new ProjectRepositoryFiles(...args); - } - - compare(projectId, from, to) { - const pId = parse(projectId); - - return this.get(`projects/${pId}/repository/compare`, { from, to }); - } - - contributors(projectId) { - const pId = parse(projectId); - - return this.get(`projects/${pId}/repository/contributors`); - } - - showArchive(projectId, { sha }) { - const pId = parse(projectId); - - return this.get(`projects/${pId}/repository/archive`, { sha }); - } - - showBlob(projectId, sha) { - const pId = parse(projectId); - - return this.get(`projects/${pId}/repository/blobs/${sha}`); - } - - showBlobRaw(projectId, sha) { - const pId = parse(projectId); - - return this.get(`projects/${pId}/repository/blobs/${sha}/raw`); - } - - tree(projectId, options = {}) { - const pId = parse(projectId); - - return this.get(`projects/${pId}/repository/tree`, options); - } -} - -export default ProjectRepository; diff --git a/src/Models/ProjectRepositoryBranches.js b/src/Models/ProjectRepositoryBranches.js deleted file mode 100644 index eb9fef1a..00000000 --- a/src/Models/ProjectRepositoryBranches.js +++ /dev/null @@ -1,42 +0,0 @@ -import BaseModel from './BaseModel'; -import { parse } from '../Utils'; - -class ProjectRepositoryBranches extends BaseModel { - all(projectId) { - const pId = parse(projectId); - - return this.get(`projects/${pId}/repository/branches`); - } - - create(projectId, branchName, ref) { - const pId = parse(projectId); - - return this.post(`projects/${pId}/repository/branches`, { branch: branchName, ref }); - } - - protect(projectId, branchName, options = {}) { - const pId = parse(projectId); - - return this.put(`projects/${pId}/repository/branches/${branchName}/protect`, options); - } - - remove(projectId, branchName) { - const pId = parse(projectId); - - return this.delete(`projects/${pId}/repository/branches/${branchName}`); - } - - show(projectId, branchName) { - const pId = parse(projectId); - - return this.get(`projects/${pId}/repository/branches/${branchName}`); - } - - unprotect(projectId, branchName) { - const pId = parse(projectId); - - return this.put(`projects/${pId}/repository/branches/${branchName}/unprotect`); - } -} - -export default ProjectRepositoryBranches; diff --git a/src/Models/ProjectRepositoryCommitComments.js b/src/Models/ProjectRepositoryCommitComments.js deleted file mode 100644 index 77dc9ac9..00000000 --- a/src/Models/ProjectRepositoryCommitComments.js +++ /dev/null @@ -1,18 +0,0 @@ -import BaseModel from './BaseModel'; -import { parse } from '../Utils'; - -class ProjectRepositoryCommitComments extends BaseModel { - all(projectId, sha, options = {}) { - const pId = parse(projectId); - - return this.get(`projects/${pId}/repository/commits/${sha}/comments`, options); - } - - create(projectId, sha, note, options = {}) { - const pId = parse(projectId); - - return this.post(`projects/${pId}/repository/commits/${sha}/comments`, Object.assign({ note }, options)); - } -} - -export default ProjectRepositoryCommitComments; diff --git a/src/Models/ProjectRepositoryCommits.js b/src/Models/ProjectRepositoryCommits.js deleted file mode 100644 index eef345d6..00000000 --- a/src/Models/ProjectRepositoryCommits.js +++ /dev/null @@ -1,37 +0,0 @@ -import BaseModel from './BaseModel'; -import { parse } from '../Utils'; -import ProjectRepositoryCommitComments from './ProjectRepositoryCommitComments'; - -class ProjectRepositoryCommits extends BaseModel { - constructor(...args) { - super(...args); - - this.comments = new ProjectRepositoryCommitComments(...args); - } - - all(projectId, options = {}) { - const pId = parse(projectId); - - return this.get(`projects/${pId}/repository/commits`, options); - } - - diff(projectId, sha) { - const pId = parse(projectId); - - return this.get(`projects/${pId}/repository/commits/${sha}/diff`); - } - - show(projectId, sha) { - const pId = parse(projectId); - - return this.get(`projects/${pId}/repository/commits/${sha}`); - } - - statuses(projectId, sha, options = {}) { - const pId = parse(projectId); - - return this.get(`projects/${pId}/repository/commits/${sha}/statuses`, options); - } -} - -export default ProjectRepositoryCommits; diff --git a/src/Models/ProjectRepositoryFiles.js b/src/Models/ProjectRepositoryFiles.js deleted file mode 100644 index 84956295..00000000 --- a/src/Models/ProjectRepositoryFiles.js +++ /dev/null @@ -1,44 +0,0 @@ -import BaseModel from './BaseModel'; -import { parse } from '../Utils'; - -class ProjectRepositoryFiles extends BaseModel { - create(projectId, filePath, branch, options = {}) { - const pId = parse(projectId); - const path = parse(filePath); - const extendedOptions = Object.assign({ branch }, options); - - return this.post(`projects/${pId}/repository/files/${path}`, extendedOptions); - } - - edit(projectId, filePath, branch, options = {}) { - const pId = parse(projectId); - const path = parse(filePath); - const extendedOptions = Object.assign({ branch }, options); - - return this.put(`projects/${pId}/repository/files/${path}`, extendedOptions); - } - - remove(projectId, filePath, branch, options = {}) { - const pId = parse(projectId); - const path = parse(filePath); - const extendedOptions = Object.assign({ branch }, options); - - return this.delete(`projects/${pId}/repository/files/${path}`, extendedOptions); - } - - show(projectId, filePath, ref) { - const pId = parse(projectId); - const path = parse(filePath); - - return this.get(`projects/${pId}/repository/files/${path}`, { ref }); - } - - showRaw(projectId, filePath, ref) { - const pId = parse(projectId); - const path = parse(filePath); - - return this.get(`projects/${pId}/repository/files/${path}/raw`, { ref }); - } -} - -export default ProjectRepositoryFiles; diff --git a/src/Models/ProjectRepositoryTags.js b/src/Models/ProjectRepositoryTags.js deleted file mode 100644 index 5759c7ad..00000000 --- a/src/Models/ProjectRepositoryTags.js +++ /dev/null @@ -1,30 +0,0 @@ -import BaseModel from './BaseModel'; -import { parse } from '../Utils'; - -class ProjectRepositoryTags extends BaseModel { - all(projectId, options = {}) { - const pId = parse(projectId); - - return this.get(`projects/${pId}/repository/tags`, options); - } - - create(projectId, options = {}) { - const pId = parse(projectId); - - return this.post(`projects/${pId}/repository/tags`, options); - } - - remove(projectId, tagName) { - const pId = parse(projectId); - - return this.delete(`projects/${pId}/repository/tags/${encodeURI(tagName)}`); - } - - show(projectId, tagName) { - const pId = parse(projectId); - - return this.get(`projects/${pId}/repository/tags/${encodeURI(tagName)}`); - } -} - -export default ProjectRepositoryTags; diff --git a/src/Models/ProjectRunners.js b/src/Models/ProjectRunners.js deleted file mode 100644 index bea160dc..00000000 --- a/src/Models/ProjectRunners.js +++ /dev/null @@ -1,26 +0,0 @@ -import BaseModel from './BaseModel'; -import { parse } from '../Utils'; - -class ProjectRunners extends BaseModel { - all(projectId, options = {}) { - const pId = parse(projectId); - - return this.get(`projects/${pId}/runners`, options); - } - - enable(projectId, runnerId) { - const [pId, rId] = [projectId, runnerId].map(parse); - - return this.post(`projects/${pId}/runners`, { - runner_id: rId, - }); - } - - disable(projectId, runnerId) { - const [pId, rId] = [projectId, runnerId].map(parse); - - return this.delete(`projects/${pId}/runners/${rId}`); - } -} - -export default ProjectRunners; diff --git a/src/Models/ProjectServices.js b/src/Models/ProjectServices.js deleted file mode 100644 index fb83f964..00000000 --- a/src/Models/ProjectServices.js +++ /dev/null @@ -1,24 +0,0 @@ -import BaseModel from './BaseModel'; -import { parse } from '../Utils'; - -class ProjectServices extends BaseModel { - edit(projectId, serviceName, options = {}) { - const pId = parse(projectId); - - return this.put(`projects/${pId}/services/${serviceName}`, options); - } - - remove(projectId, serviceName) { - const pId = parse(projectId); - - return this.delete(`projects/${pId}/services/${serviceName}`); - } - - show(projectId, serviceName) { - const pId = parse(projectId); - - return this.get(`projects/${pId}/services/${serviceName}`); - } -} - -export default ProjectServices; diff --git a/src/Models/ProjectTriggers.js b/src/Models/ProjectTriggers.js deleted file mode 100644 index e016de2d..00000000 --- a/src/Models/ProjectTriggers.js +++ /dev/null @@ -1,36 +0,0 @@ -import BaseModel from './BaseModel'; -import { parse } from '../Utils'; - -class ProjectTriggers extends BaseModel { - add(projectId, options = {}) { - const pId = parse(projectId); - - return this.post(`projects/${pId}/triggers`, options); - } - - all(projectId) { - const pId = parse(projectId); - - return this.get(`projects/${pId}/triggers`); - } - - edit(projectId, triggerId, options = {}) { - const [pId, tId] = [projectId, triggerId].map(parse); - - return this.put(`projects/${pId}/triggers/${tId}`, options); - } - - remove(projectId, triggerId) { - const [pId, tId] = [projectId, triggerId].map(parse); - - return this.delete(`projects/${pId}/triggers/${tId}`); - } - - show(projectId, triggerId) { - const [pId, tId] = [projectId, triggerId].map(parse); - - return this.get(`projects/${pId}/triggers/${tId}`); - } -} - -export default ProjectTriggers; diff --git a/src/Models/Projects.js b/src/Models/Projects.js deleted file mode 100644 index af7ad30a..00000000 --- a/src/Models/Projects.js +++ /dev/null @@ -1,142 +0,0 @@ -import Fs from 'fs'; -import Path from 'path'; -import BaseModel from './BaseModel'; -import { parse } from '../Utils'; -import ProjectHooks from './ProjectHooks'; -import ProjectIssues from './ProjectIssues'; -import ProjectLabels from './ProjectLabels'; -import ProjectRepository from './ProjectRepository'; -import ProjectProtectedBranches from './ProjectProtectedBranches'; -import ProjectDeployKeys from './ProjectDeployKeys'; -import ProjectMergeRequests from './ProjectMergeRequests'; -import ProjectServices from './ProjectServices'; -import ProjectTriggers from './ProjectTriggers'; -import ProjectRunners from './ProjectRunners'; -import ProjectPipelines from './ProjectPipelines'; -import ProjectJobs from './ProjectJobs'; -import ProjectEnvironments from './ProjectEnvironments'; -import ResourceCustomAttributes from './ResourceCustomAttributes'; -import ResourceMembers from './ResourceMembers'; -import ResourceAccessRequests from './ResourceAccessRequests'; -import ResourceMilestones from './ResourceMilestones'; -import ResourceNotes from './ResourceNotes'; - - -class Projects extends BaseModel { - constructor(...args) { - super(...args); - - this.hooks = new ProjectHooks(...args); - this.issues = new ProjectIssues(...args); - this.labels = new ProjectLabels(...args); - this.repository = new ProjectRepository(...args); - this.protectedBranches = new ProjectProtectedBranches(...args); - this.deployKeys = new ProjectDeployKeys(...args); - this.mergeRequests = new ProjectMergeRequests(...args); - this.services = new ProjectServices(...args); - this.triggers = new ProjectTriggers(...args); - this.pipelines = new ProjectPipelines(...args); - this.jobs = new ProjectJobs(...args); - this.environments = new ProjectEnvironments(...args); - this.runners = new ProjectRunners(...args); - this.customAttributes = new ResourceCustomAttributes('projects', ...args); - this.members = new ResourceMembers('projects', ...args); - this.accessRequests = new ResourceAccessRequests('projects', ...args); - this.milestones = new ResourceMilestones('projects', ...args); - this.snippets = new ResourceNotes('projects', 'snippets', ...args); - } - - all(options = {}) { - return this.get('projects', options); - } - - create(options = {}) { - if (options.userId) { - const uId = parse(options.userId); - - return this.post(`projects/user/${uId}`, options); - } - - return this.post('projects', options); - } - - edit(projectId, options = {}) { - const pId = parse(projectId); - - return this.put(`projects/${pId}`, options); - } - - fork(projectId, options = {}) { - const pId = parse(projectId); - - return this.post(`projects/${pId}/fork`, options); - } - - remove(projectId) { - const pId = parse(projectId); - - return this.delete(`projects/${pId}`); - } - - search(projectName) { - return this.get('projects', { search: projectName }); - } - - share(projectId, groupId, groupAccess, options) { - const pId = parse(projectId); - - if (!groupId || !groupAccess) throw new Error('Missing required arguments'); - - options.group_id = groupId; - options.group_access = groupAccess; - - return this.post(`projects/${pId}/share`, options); - } - - show(projectId) { - const pId = parse(projectId); - - return this.get(`projects/${pId}`); - } - - star(projectId) { - const pId = parse(projectId); - - return this.post(`projects/${pId}/star`); - } - - statuses(projectId, sha, state, options = {}) { - const pId = parse(projectId); - - return this.post(`projects/${pId}/statuses/${sha}`, Object.assign({ state }, options)); - } - - unshare(projectId, groupId) { - const [pId, gId] = [projectId, groupId].map(parse); - - return this.delete(`projects/${pId}/share${gId}`); - } - - unstar(projectId) { - const pId = parse(projectId); - - return this.post(`projects/${pId}/unstar`); - } - - upload(projectId, filePath, { fileName = Path.basename(filePath) } = {}) { - const pId = parse(projectId); - const file = Fs.readFileSync(filePath); - - return this.postForm(`projects/${pId}/uploads`, { - file: { - value: file, - options: { - filename: fileName, - contentType: 'application/octet-stream', - }, - }, - }); - } -} - -module.exports = Projects; diff --git a/src/Models/ResourceAccessRequests.js b/src/Models/ResourceAccessRequests.js deleted file mode 100644 index 828f22e5..00000000 --- a/src/Models/ResourceAccessRequests.js +++ /dev/null @@ -1,45 +0,0 @@ -import BaseModel from './BaseModel'; -import { parse } from '../Utils'; - -const ACCESS_LEVELS = { - GUEST: 10, - REPORTER: 20, - DEVELOPER: 30, - MASTER: 40, - OWNER: 50, -}; - -class ResourceAccessRequests extends BaseModel { - constructor(resourceType, ...args) { - super(...args); - - this.resourceType = resourceType; - this.ACCESS_LEVELS = ACCESS_LEVELS; - } - - all(resourceId) { - const rId = parse(resourceId); - - return this.get(`${this.resourceType}/${rId}/access_requests`); - } - - request(resourceId) { - const rId = parse(resourceId); - - return this.post(`${this.resourceType}/${rId}/access_requests`); - } - - approve(resourceId, userId, { access_level = 30 }) { - const [rId, uId] = [resourceId, userId].map(parse); - - return this.post(`${this.resourceType}/${rId}/access_requests/${uId}/approve`, { access_level }); - } - - deny(resourceId, userId) { - const [rId, uId] = [resourceId, userId].map(parse); - - return this.delete(`${this.resourceType}/${rId}/access_requests/${uId}/approve`); - } -} - -export default ResourceAccessRequests; diff --git a/src/Models/ResourceCustomAttributes.js b/src/Models/ResourceCustomAttributes.js deleted file mode 100644 index 1fff9f1d..00000000 --- a/src/Models/ResourceCustomAttributes.js +++ /dev/null @@ -1,36 +0,0 @@ -import BaseModel from './BaseModel'; -import { parse } from '../Utils'; - -class ResourceCustomAttributes extends BaseModel { - constructor(resourceType, ...args) { - super(...args); - - this.resourceType = resourceType; - } - - all(resourceId) { - const rId = parse(resourceId); - - return this.get(`${this.resourceType}/${rId}/custom_attributes`); - } - - set(resourceId, customAttributeId, value) { - const [rId, cId] = [resourceId, customAttributeId].map(parse); - - return this.put(`${this.resourceType}/${rId}/custom_attributes/${cId}`, { value }); - } - - remove(resourceId, customAttributeId) { - const [rId, cId] = [resourceId, customAttributeId].map(parse); - - return this.delete(`${this.resourceType}/${rId}/custom_attributes/${cId}`); - } - - show(resourceId, customAttributeId) { - const [rId, cId] = [resourceId, customAttributeId].map(parse); - - return this.get(`${this.resourceType}/${rId}/custom_attributes/${cId}`); - } -} - -export default ResourceCustomAttributes; diff --git a/src/Models/ResourceMembers.js b/src/Models/ResourceMembers.js deleted file mode 100644 index 604b0052..00000000 --- a/src/Models/ResourceMembers.js +++ /dev/null @@ -1,47 +0,0 @@ -import BaseModel from './BaseModel'; -import { parse } from '../Utils'; - -class ResourceMembers extends BaseModel { - constructor(resourceType, ...args) { - super(...args); - - this.resourceType = resourceType; - } - - all(resourceId) { - const rId = parse(resourceId); - - return this.get(`${this.resourceType}/${rId}/members`); - } - - add(resourceId, userId, accessLevel) { - const [rId, uId] = [resourceId, userId].map(parse); - - return this.post(`${this.resourceType}/${rId}/members`, { - user_id: uId, - access_level: parseInt(accessLevel, 10), - }); - } - - edit(resourceId, userId, accessLevel) { - const [rId, uId] = [resourceId, userId].map(parse); - - return this.put(`${this.resourceType}/${rId}/members/${uId}`, { - access_level: parseInt(accessLevel, 10), - }); - } - - show(resourceId, userId) { - const [rId, uId] = [resourceId, userId].map(parse); - - return this.get(`${this.resourceType}/${rId}/members/${uId}`); - } - - remove(resourceId, userId) { - const [rId, uId] = [resourceId, userId].map(parse); - - return this.delete(`${this.resourceType}/${rId}/members/${uId}`); - } -} - -export default ResourceMembers; diff --git a/src/Models/ResourceMilestoneIssues.js b/src/Models/ResourceMilestoneIssues.js deleted file mode 100644 index a7b9d640..00000000 --- a/src/Models/ResourceMilestoneIssues.js +++ /dev/null @@ -1,18 +0,0 @@ -import BaseModel from './BaseModel'; -import { parse } from '../Utils'; - -class GroupMilestoneIssues extends BaseModel { - constructor(resourceType, ...args) { - super(...args); - - this.resourceType = resourceType; - } - - all(resourceId, milestoneId) { - const [rId, mId] = [resourceId, milestoneId].map(parse); - - return this.get(`${this.resourceType}/${rId}/milestones/${mId}/issues`); - } -} - -export default GroupMilestoneIssues; diff --git a/src/Models/ResourceMilestoneMergeRequests.js b/src/Models/ResourceMilestoneMergeRequests.js deleted file mode 100644 index f7fdae85..00000000 --- a/src/Models/ResourceMilestoneMergeRequests.js +++ /dev/null @@ -1,18 +0,0 @@ -import BaseModel from './BaseModel'; -import { parse } from '../Utils'; - -class ResourceMilestoneMergeRequests extends BaseModel { - constructor(resourceType, ...args) { - super(...args); - - this.resourceType = resourceType; - } - - all(resourceId, milestoneId) { - const [rId, mId] = [resourceId, milestoneId].map(parse); - - return this.get(`${this.resourceType}/${rId}/milestones/${mId}/merge_requests`); - } -} - -export default ResourceMilestoneMergeRequests; diff --git a/src/Models/ResourceMilestones.js b/src/Models/ResourceMilestones.js deleted file mode 100644 index 96d61a1e..00000000 --- a/src/Models/ResourceMilestones.js +++ /dev/null @@ -1,40 +0,0 @@ -import BaseModel from './BaseModel'; -import { parse } from '../Utils'; -import ResourceMilestoneIssues from './ResourceMilestoneIssues'; -import ResourceMilestoneMergeRequests from './ResourceMilestoneMergeRequests'; - -class ResourceMilestones extends BaseModel { - constructor(resourceType, ...args) { - super(...args); - - this.resourceType = resourceType; - this.issues = new ResourceMilestoneIssues(resourceType, ...args); - this.mergeRequests = new ResourceMilestoneMergeRequests(resourceType, ...args); - } - - all(resourceId, options = {}) { - const rId = parse(resourceId); - - return this.get(`${this.resourceType}/${rId}/milestones`, options); - } - - create(resourceId, title, options) { - const rId = parse(resourceId); - - return this.post(`${this.resourceType}/${rId}/milestones`, options); - } - - edit(resourceId, milestoneId, options) { - const [rId, mId] = [resourceId, milestoneId].map(parse); - - return this.put(`${this.resourceType}/${rId}/milestones/${mId}`, options); - } - - show(resourceId, milestoneId) { - const [rId, mId] = [resourceId, milestoneId].map(parse); - - return this.get(`${this.resourceType}/${rId}/milestones/${mId}`); - } -} - -export default ResourceMilestones; diff --git a/src/Models/ResourceNotes.js b/src/Models/ResourceNotes.js deleted file mode 100644 index 95443000..00000000 --- a/src/Models/ResourceNotes.js +++ /dev/null @@ -1,47 +0,0 @@ -import BaseModel from './BaseModel'; -import { parse } from '../Utils'; - -class ResourceNotes extends BaseModel { - constructor(resourceType, resource2Type, ...args) { - super(...args); - - this.resourceType = resourceType; - this.resource2Type = resource2Type; - } - - all(resourceId, resource2Id, options = {}) { - const [rId, r2Id] = [resourceId, resource2Id].map(parse); - - return this.get(`${this.resourceType}/${rId}/${this.resource2Type}/${r2Id}/notes`, options); - } - - create(resourceId, resource2Id, options = {}) { - if (!options.body) throw new Error('Missing required property: body'); - - const [rId, r2Id] = [resourceId, resource2Id].map(parse); - - return this.post(`${this.resourceType}/${rId}/${this.resource2Type}/${r2Id}/notes`, options); - } - - edit(resourceId, resource2Id, noteId, options = {}) { - if (!options.body) throw new Error('Missing required property: body'); - - const [rId, r2Id, nId] = [resourceId, resource2Id, noteId].map(parse); - - return this.put(`${this.resourceType}/${rId}/${this.resource2Type}/${r2Id}/notes/${nId}`, options); - } - - remove(resourceId, resource2Id, noteId) { - const [rId, r2Id, nId] = [resourceId, resource2Id, noteId].map(parse); - - return this.delete(`${this.resourceType}/${rId}/${this.resource2Type}/${r2Id}/notes/${nId}`); - } - - show(resourceId, resource2Id, noteId) { - const [rId, r2Id, nId] = [resourceId, resource2Id, noteId].map(parse); - - return this.get(`${this.resourceType}/${rId}/${this.resource2Type}/${r2Id}/notes/${nId}`); - } -} - -export default ResourceNotes; diff --git a/src/Models/Runners.js b/src/Models/Runners.js deleted file mode 100644 index 30a35323..00000000 --- a/src/Models/Runners.js +++ /dev/null @@ -1,38 +0,0 @@ -import BaseModel from './BaseModel'; -import { parse } from '../Utils'; - -class Runners extends BaseModel { - all(options = {}) { - return this.get('runners/all', options); - } - - allOwned(options = {}) { - return this.get('runners', options); - } - - edit(runnerId, attributes) { - const rId = parse(runnerId); - - return this.put(`runners/${rId}`, attributes); - } - - remove(runnerId) { - const rId = parse(runnerId); - - return this.delete(`runners/${rId}`); - } - - show(runnerId) { - const rId = parse(runnerId); - - return this.get(`runners/${rId}`); - } - - showJobs(runnerId) { - const rId = parse(runnerId); - - return this.get(`runners/${rId}/jobs`); - } -} - -export default Runners; diff --git a/src/Models/UserKeys.js b/src/Models/UserKeys.js deleted file mode 100644 index 7ef3dc1a..00000000 --- a/src/Models/UserKeys.js +++ /dev/null @@ -1,28 +0,0 @@ -import BaseModel from './BaseModel'; -import { parse } from '../Utils'; - -class UserKeys extends BaseModel { - add(userId, title, key) { - const uId = parse(userId); - - return this.post(`users/${uId}/keys`, { - title, - key, - }); - } - - remove(userId, keyId) { - const uId = parse(userId); - const kId = parse(keyId); - - return this.delete(`users/${uId}/keys/${kId}`); - } - - all(userId) { - const uId = parse(userId); - - return this.get(`users/${uId}/keys`); - } -} - -export default UserKeys; diff --git a/src/Models/Users.js b/src/Models/Users.js deleted file mode 100644 index b5a93682..00000000 --- a/src/Models/Users.js +++ /dev/null @@ -1,46 +0,0 @@ -import BaseModel from './BaseModel'; -import { parse } from '../Utils'; -import UserKeys from './UserKeys'; -import ResourceCustomAttributes from './ResourceCustomAttributes'; - -class Users extends BaseModel { - constructor(...args) { - super(...args); - - this.customAttributes = new ResourceCustomAttributes('users', ...args); - this.keys = new UserKeys(...args); - } - - all(options = {}) { - return this.get('users', options); - } - - create(options = {}) { - return this.post('users', options); - } - - current() { - return this.get('user'); - } - - session(email, password) { - return this.post('session', { - email, - password, - }); - } - - search(emailOrUsername) { - return this.get('users', { - search: emailOrUsername, - }); - } - - show(userId) { - const uId = parse(userId); - - return this.get(`users/${uId}`); - } -} - -export default Users; diff --git a/src/Models/Version.js b/src/Models/Version.js deleted file mode 100644 index 42b69801..00000000 --- a/src/Models/Version.js +++ /dev/null @@ -1,9 +0,0 @@ -import BaseModel from './BaseModel'; - -class Version extends BaseModel { - show() { - return this.get('version'); - } -} - -export default Version; diff --git a/src/Models/index.js b/src/Models/index.js deleted file mode 100644 index b050b3f6..00000000 --- a/src/Models/index.js +++ /dev/null @@ -1,17 +0,0 @@ -import Groups from './Groups'; -import Projects from './Projects'; -import Issues from './Issues'; -import Users from './Users'; -import Runners from './Runners'; -import MergeRequests from './MergeRequests'; -import Version from './Version'; - -export { - Groups, - Projects, - Runners, - Issues, - Users, - MergeRequests, - Version, -}; diff --git a/src/Utils.js b/src/Utils.js deleted file mode 100644 index 10014106..00000000 --- a/src/Utils.js +++ /dev/null @@ -1,9 +0,0 @@ -function parse(value) { - if (Number.isInteger(value)) return value; - - return encodeURIComponent(value); -} - -export { - parse, -}; diff --git a/src/index.js b/src/index.js index 4409e9b9..36cd7cc4 100644 --- a/src/index.js +++ b/src/index.js @@ -1,3 +1,9 @@ -import API from './API'; +import * as Services from './services'; -module.exports = ({ url, token, oauthToken }) => new API({ url, token, oauthToken }); +export const API = credentials => + Object.entries(Services).reduce( + (output, [key, Value]) => { output[key] = new Value(credentials); return output; }, + {}, + ); + +export * from './services'; diff --git a/src/Models/BaseModel.js b/src/infrastructure/BaseService.js similarity index 53% rename from src/Models/BaseModel.js rename to src/infrastructure/BaseService.js index 8c0598e6..652d85e2 100644 --- a/src/Models/BaseModel.js +++ b/src/infrastructure/BaseService.js @@ -19,32 +19,17 @@ async function getAllPages(client, endpoint, options, results = []) { } class BaseModel { - constructor(APIClient) { - this.client = APIClient; - } + constructor({ url = 'https://gitlab.com', token, oauthToken }) { + this.url = `${url}/api/v4/`; + this.headers = {}; - get(endpoint, options = {}) { - if (!options.page) { - return getAllPages(this.client, endpoint, options); + if (oauthToken) { + this.headers.Authorization = `Bearer ${oauthToken}`; + } else if (token) { + this.headers['private-token'] = token; + } else { + throw new Error('`token` (private-token) or `oauth_token` is mandatory'); } - - return this.client.get(endpoint, options); - } - - post(endpoint, options = {}) { - return this.client.post(endpoint, options); - } - - postForm(endpoint, options = {}) { - return this.client.postForm(endpoint, options); - } - - put(endpoint, options = {}) { - return this.client.put(endpoint, options); - } - - delete(endpoint, options = {}) { - return this.client.delete(endpoint, options); } } diff --git a/src/infrastructure/RequestHelper.js b/src/infrastructure/RequestHelper.js new file mode 100644 index 00000000..c0fe6271 --- /dev/null +++ b/src/infrastructure/RequestHelper.js @@ -0,0 +1,59 @@ +import Request from 'request-promise'; +import Humps from 'humps'; + +function defaultRequest(url, endpoint, { + headers, + body, + qs, + formData, + resolveWithFullResponse = false, +}) { + const params = { + url: `${url}${endpoint}`, + headers, + json: true, + }; + + if (body) params.body = Humps.decamelizeKeys(body); + if (qs) params.qs = Humps.decamelizeKeys(qs); + if (formData) params.formData = formData; + + params.resolveWithFullResponse = resolveWithFullResponse; + + return params; +} + +class RequestHelper { + static get(service, endpoint, options, fullResponse = false) { + return Request.get(defaultRequest(service.url, endpoint, { + headers: service.headers, + qs: options, + resolveWithFullResponse: fullResponse, + })); + } + + static post(service, endpoint, options, form = false) { + const body = form ? 'fromData' : 'body'; + + return Request.post(defaultRequest(service.url, endpoint, { + headers: service.headers, + [body]: options, + })); + } + + static put(service, endpoint, options) { + return Request.put(defaultRequest(service.url, endpoint, { + headers: service.headers, + body: options, + })); + } + + static delete(service, endpoint, options) { + return Request.delete(defaultRequest(service.url, endpoint, { + headers: service.headers, + qs: options, + })); + } +} + +export default RequestHelper; diff --git a/src/infrastructure/index.js b/src/infrastructure/index.js new file mode 100644 index 00000000..fdbb748f --- /dev/null +++ b/src/infrastructure/index.js @@ -0,0 +1,2 @@ +export { default as BaseService } from './BaseService'; +export { default as RequestHelper } from './RequestHelper'; diff --git a/src/services/Branches.js b/src/services/Branches.js new file mode 100644 index 00000000..8e5eeb25 --- /dev/null +++ b/src/services/Branches.js @@ -0,0 +1,57 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +export class Branches extends BaseService { + all(projectId, options = {}) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/repository/branches`, options); + } + + create(projectId, branchName, ref) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.post(this, `projects/${pId}/repository/branches`, { + branch: branchName, + ref, + }); + } + + protect(projectId, branchName, options = {}) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.put( + this, + `projects/${pId}/repository/branches/${branchName}/protect`, + options, + ); + } + + remove(projectId, branchName) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.delete( + this, + `projects/${pId}/repository/branches/${branchName}`, + ); + } + + show(projectId, branchName) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get( + this, + `projects/${pId}/repository/branches/${branchName}`, + ); + } + + unprotect(projectId, branchName) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.put( + this, + `projects/${pId}/repository/branches/${branchName}/unprotect`, + ); + } +} + +export default Branches; diff --git a/src/services/Commits.js b/src/services/Commits.js new file mode 100644 index 00000000..2ee5149a --- /dev/null +++ b/src/services/Commits.js @@ -0,0 +1,59 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +export class Commits extends BaseService { + all(projectId, options = {}) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get( + this, + `projects/${pId}/repository/commits`, + options, + ); + } + + allComments(projectId, sha) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get( + this, + `projects/${pId}/repository/commits/${sha}/comments`, + ); + } + + createComment(projectId, sha, note, options = {}) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.post( + this, + `projects/${pId}/repository/commits/${sha}/comments`, + Object.assign({ note }, options), + ); + } + + diff(projectId, sha) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get( + this, + `projects/${pId}/repository/commits/${sha}/diff`, + ); + } + + show(projectId, sha) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/repository/commits/${sha}`); + } + + statuses(projectId, sha, options = {}) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get( + this, + `projects/${pId}/repository/commits/${sha}/statuses`, + options, + ); + } +} + +export default Commits; diff --git a/src/services/DeployKeys.js b/src/services/DeployKeys.js new file mode 100644 index 00000000..c972758e --- /dev/null +++ b/src/services/DeployKeys.js @@ -0,0 +1,23 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +export class DeployKeys extends BaseService { + add(projectId, options = {}) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.post(this, `projects/${pId}/deploy_keys`, options); + } + + all(projectId) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/deploy_keys`); + } + + show(projectId, keyId) { + const [pId, kId] = [projectId, keyId].map(encodeURIComponent); + + return RequestHelper.get(this, `projects/${pId}/deploy_keys/${kId}`); + } +} + +export default DeployKeys; diff --git a/src/services/Environments.js b/src/services/Environments.js new file mode 100644 index 00000000..44595275 --- /dev/null +++ b/src/services/Environments.js @@ -0,0 +1,11 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +export class Environments extends BaseService { + all(projectId, options = {}) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/environments`, options); + } +} + +export default Environments; diff --git a/src/services/GroupAccessRequests.js b/src/services/GroupAccessRequests.js new file mode 100644 index 00000000..d8445ef7 --- /dev/null +++ b/src/services/GroupAccessRequests.js @@ -0,0 +1,9 @@ +import { ResourceAccessRequests } from '../templates'; + +export class GroupAccessRequests { + constructor(options) { + return new ResourceAccessRequests('groups', options); + } +} + +export default GroupAccessRequests; diff --git a/src/services/GroupCustomAttributes.js b/src/services/GroupCustomAttributes.js new file mode 100644 index 00000000..1d5cc914 --- /dev/null +++ b/src/services/GroupCustomAttributes.js @@ -0,0 +1,9 @@ +import { ResourceCustomAttributes } from '../templates'; + +export class GroupCustomAttributes { + constructor(options) { + return new ResourceCustomAttributes('groups', options); + } +} + +export default GroupCustomAttributes; diff --git a/src/services/GroupMembers.js b/src/services/GroupMembers.js new file mode 100644 index 00000000..36dc86a9 --- /dev/null +++ b/src/services/GroupMembers.js @@ -0,0 +1,9 @@ +import { ResourceMembers } from '../templates'; + +export class GroupMembers { + constructor(options) { + return new ResourceMembers('groups', options); + } +} + +export default GroupMembers; diff --git a/src/services/GroupMilestones.js b/src/services/GroupMilestones.js new file mode 100644 index 00000000..febbaba7 --- /dev/null +++ b/src/services/GroupMilestones.js @@ -0,0 +1,9 @@ +import { ResourceMilestones } from '../templates'; + +export class GroupMilestones { + constructor(options) { + return new ResourceMilestones('groups', options); + } +} + +export default GroupMilestones; diff --git a/src/services/GroupProjects.js b/src/services/GroupProjects.js new file mode 100644 index 00000000..96c62ebf --- /dev/null +++ b/src/services/GroupProjects.js @@ -0,0 +1,17 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +export class GroupProjects extends BaseService { + all(groupId, options = {}) { + const gId = encodeURIComponent(groupId); + + return RequestHelper.get(this, `groups/${gId}/projects`, options); + } + + add(groupId, projectId) { + const [gId, pId] = [groupId, projectId].map(encodeURIComponent); + + return RequestHelper.post(this, `groups/${gId}/projects/${pId}`); + } +} + +export default GroupProjects; diff --git a/src/services/Groups.js b/src/services/Groups.js new file mode 100644 index 00000000..8375c29e --- /dev/null +++ b/src/services/Groups.js @@ -0,0 +1,37 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +export class Groups extends BaseService { + all(options = {}) { + return RequestHelper.get(this, 'groups', options); + } + + allSubgroups(groupId, options = {}) { + const gId = encodeURIComponent(groupId); + + return RequestHelper.get(this, `groups/${gId}/subgroups`, options); + } + + show(groupId) { + const gId = encodeURIComponent(groupId); + + return RequestHelper.get(this, `groups/${gId}`); + } + + create(options = {}) { + return RequestHelper.post(this, 'groups', options); + } + + remove(groupId) { + const gId = encodeURIComponent(groupId); + + return RequestHelper.delete(this, `groups/${gId}`); + } + + search(nameOrPath) { + return RequestHelper.get(this, 'groups', { + search: nameOrPath, + }); + } +} + +export default Groups; diff --git a/src/services/Issues.js b/src/services/Issues.js new file mode 100644 index 00000000..478ef328 --- /dev/null +++ b/src/services/Issues.js @@ -0,0 +1,72 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +export class Issues extends BaseService { + all(projectId, options = {}) { + const pId = encodeURIComponent(projectId); + + if (projectId) { + return RequestHelper.get(this, `projects/${pId}/issues`, options); + } + + return RequestHelper.get(this, 'issues', options); + } + + create(projectId, options = {}) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.post(this, `projects/${pId}/issues`, options); + } + + edit(projectId, issueId, options = {}) { + const [pId, iId] = [projectId, issueId].map(encodeURIComponent); + + return RequestHelper.put(this, `projects/${pId}/issues/${iId}`, options); + } + + link(projectId, issueIId, targetProjectId, targetIssueId, options = {}) { + const [pId, iId] = [projectId, issueIId].map(encodeURIComponent); + const [targetpId, targetIId] = [targetProjectId, targetIssueId].map(encodeURIComponent); + + return RequestHelper.post( + this, + `projects/${pId}/issues/${iId}/links`, + Object.assign( + { target_project_id: targetpId, target_issue_id: targetIId }, + options, + ), + ); + } + + remove(projectId, issueId) { + const [pId, iId] = [projectId, issueId].map(encodeURIComponent); + + return RequestHelper.delete(this, `projects/${pId}/issues/${iId}`); + } + + show(projectId, issueId) { + const [pId, iId] = [projectId, issueId].map(encodeURIComponent); + + return RequestHelper.get(this, `projects/${pId}/issues/${iId}`); + } + + subscribe(projectId, issueId, options = {}) { + const [pId, iId] = [projectId, issueId].map(encodeURIComponent); + + return RequestHelper.post( + this, + `projects/${pId}/issues/${iId}/subscribe`, + options, + ); + } + + unsubscribe(projectId, issueId) { + const [pId, iId] = [projectId, issueId].map(encodeURIComponent); + + return RequestHelper.delete( + this, + `projects/${pId}/issues/${iId}/unsubscribe`, + ); + } +} + +export default Issues; diff --git a/src/services/Jobs.js b/src/services/Jobs.js new file mode 100644 index 00000000..8812630f --- /dev/null +++ b/src/services/Jobs.js @@ -0,0 +1,11 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +export class Jobs extends BaseService { + all(projectId, options = {}) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/jobs`, options); + } +} + +export default Jobs; diff --git a/src/services/Labels.js b/src/services/Labels.js new file mode 100644 index 00000000..57cf24e9 --- /dev/null +++ b/src/services/Labels.js @@ -0,0 +1,54 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +export class Labels extends BaseService { + all(projectId, options = {}) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/labels`, options); + } + + create(projectId, options = {}) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.post(this, `projects/${pId}/labels`, options); + } + + edit(projectId, labelName, options = {}) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.put( + this, + `projects/${pId}/labels`, + Object.assign({ name: labelName }, options), + ); + } + + remove(projectId, labelName) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.delete(this, `projects/${pId}/labels`, { + name: labelName, + }); + } + + subscribe(projectId, labelId, options = {}) { + const [pId, lId] = [projectId, labelId].map(encodeURIComponent); + + return RequestHelper.post( + this, + `projects/${pId}/issues/${lId}/subscribe`, + options, + ); + } + + unsubscribe(projectId, labelId) { + const [pId, lId] = [projectId, labelId].map(encodeURIComponent); + + return RequestHelper.delete( + this, + `projects/${pId}/issues/${lId}/unsubscribe`, + ); + } +} + +export default Labels; diff --git a/src/services/MergeRequestNotes.js b/src/services/MergeRequestNotes.js new file mode 100644 index 00000000..1b196637 --- /dev/null +++ b/src/services/MergeRequestNotes.js @@ -0,0 +1,9 @@ +import { ResourceNotes } from '../templates'; + +export class MergeRequestNotes { + constructor(options) { + return new ResourceNotes('mergerequests', 'notes', options); + } +} + +export default MergeRequestNotes; diff --git a/src/services/MergeRequestVersions.js b/src/services/MergeRequestVersions.js new file mode 100644 index 00000000..b7c404ef --- /dev/null +++ b/src/services/MergeRequestVersions.js @@ -0,0 +1,23 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +export class MergeRequestVersions extends BaseService { + all(projectId, mergerequestId) { + const [pId, mId] = [projectId, mergerequestId].map(encodeURIComponent); + + return RequestHelper.get( + this, + `projects/${pId}/merge_requests/${mId}/versions`, + ); + } + + show(projectId, mergerequestId, versionId) { + const [pId, mId, vId] = [projectId, mergerequestId, versionId].map(encodeURIComponent); + + return RequestHelper.get( + this, + `projects/${pId}/merge_requests/${mId}/versions/${vId}`, + ); + } +} + +export default MergeRequestVersions; diff --git a/src/services/MergeRequests.js b/src/services/MergeRequests.js new file mode 100644 index 00000000..5330c1e4 --- /dev/null +++ b/src/services/MergeRequests.js @@ -0,0 +1,176 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +export class MergeRequests extends BaseService { + accept(projectId, mergerequestId, options = {}) { + const [pId, mId] = [projectId, mergerequestId].map(encodeURIComponent); + + return RequestHelper.put( + this, + `projects/${pId}/merge_requests/${mId}/merge`, + options, + ); + } + + all(projectId, options = {}) { + const pId = encodeURIComponent(projectId); + + if (projectId) { + return RequestHelper.get(this, `projects/${pId}/merge_requests`, options); + } + + return RequestHelper.get(this, 'merge_requests', options); + } + + cancelOnPipelineSucess(projectId, mergerequestId) { + const [pId, mId] = [projectId, mergerequestId].map(encodeURIComponent); + + return RequestHelper.put( + this, + `projects/${pId}/merge_requests/${mId}/cancel_merge_when_pipeline_succeeds`, + ); + } + + changes(projectId, mergerequestId) { + const [pId, mId] = [projectId, mergerequestId].map(encodeURIComponent); + + return RequestHelper.get( + this, + `projects/${pId}/merge_requests/${mId}/changes`, + ); + } + + closesIssues(projectId, mergerequestId) { + const [pId, mId] = [projectId, mergerequestId].map(encodeURIComponent); + + return RequestHelper.get( + this, + `projects/${pId}/merge_requests/${mId}/closes_issues`, + ); + } + + commits(projectId, mergerequestId) { + const [pId, mId] = [projectId, mergerequestId].map(encodeURIComponent); + + return RequestHelper.get( + this, + `projects/${pId}/merge_requests/${mId}/commits`, + ); + } + + create(projectId, sourceBranch, targetBranch, title, options = {}) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.post( + this, + `projects/${pId}/merge_requests`, + Object.assign( + { + id: pId, + source_branch: sourceBranch, + target_branch: targetBranch, + title, + }, + options, + ), + ); + } + + createTodo(projectId, mergerequestId) { + const [pId, mId] = [projectId, mergerequestId].map(encodeURIComponent); + + return RequestHelper.post( + this, + `projects/${pId}/merge_requests/${mId}/todo`, + ); + } + + edit(projectId, mergerequestId, options = {}) { + const [pId, mId] = [projectId, mergerequestId].map(encodeURIComponent); + + return RequestHelper.put( + this, + `projects/${pId}/merge_requests/${mId}`, + options, + ); + } + + remove(projectId, mergerequestId) { + const [pId, mId] = [projectId, mergerequestId].map(encodeURIComponent); + + return RequestHelper.delete(this, `projects/${pId}/merge_requests/${mId}`); + } + + show(projectId, mergerequestId) { + const [pId, mId] = [projectId, mergerequestId].map(encodeURIComponent); + + return RequestHelper.get(this, `projects/${pId}/merge_requests/${mId}`); + } + + subscribe(projectId, mergerequestId, options = {}) { + const [pId, mId] = [projectId, mergerequestId].map(encodeURIComponent); + + return RequestHelper.post( + this, + `projects/${pId}/merge_requests/${mId}/subscribe`, + options, + ); + } + + resetSpentTime(projectId, mergerequestId) { + const [pId, mId] = [projectId, mergerequestId].map(encodeURIComponent); + + return RequestHelper.post( + this, + `projects/${pId}/merge_requests/${mId}/reset_spent_time`, + ); + } + + resetTimeEstimate(projectId, mergerequestId) { + const [pId, mId] = [projectId, mergerequestId].map(encodeURIComponent); + + return RequestHelper.post( + this, + `projects/${pId}/merge_requests/${mId}/reset_time_estimate`, + ); + } + + spentTime(projectId, mergerequestId, duration) { + const [pId, mId] = [projectId, mergerequestId].map(encodeURIComponent); + + return RequestHelper.post( + this, + `projects/${pId}/merge_requests/${mId}/add_spent_time`, + { duration }, + ); + } + + timeEstimate(projectId, mergerequestId, duration) { + const [pId, mId] = [projectId, mergerequestId].map(encodeURIComponent); + + return RequestHelper.post( + this, + `projects/${pId}/merge_requests/${mId}/time_estimate`, + { duration }, + ); + } + + timeStats(projectId, mergerequestId) { + const [pId, mId] = [projectId, mergerequestId].map(encodeURIComponent); + + return RequestHelper.get( + this, + `projects/${pId}/merge_requests/${mId}/time_stats`, + ); + } + + unsubscribe(projectId, mergerequestId) { + const [pId, mId] = [projectId, mergerequestId].map(encodeURIComponent); + + return RequestHelper.delete( + this, + `projects/${pId}/merge_requests/${mId}/unsubscribe`, + ); + } +} + +export default MergeRequests; diff --git a/src/services/Pipelines.js b/src/services/Pipelines.js new file mode 100644 index 00000000..562a1774 --- /dev/null +++ b/src/services/Pipelines.js @@ -0,0 +1,11 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +export class Pipelines extends BaseService { + all(projectId, options = {}) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/pipelines`, options); + } +} + +export default Pipelines; diff --git a/src/services/ProjectAccessRequests.js b/src/services/ProjectAccessRequests.js new file mode 100644 index 00000000..45388ef1 --- /dev/null +++ b/src/services/ProjectAccessRequests.js @@ -0,0 +1,9 @@ +import { ResourceAccessRequests } from '../templates'; + +export class ProjectAccessRequests { + constructor(options) { + return new ResourceAccessRequests('projects', options); + } +} + +export default ProjectAccessRequests; diff --git a/src/services/ProjectCustomAttributes.js b/src/services/ProjectCustomAttributes.js new file mode 100644 index 00000000..7f0271f9 --- /dev/null +++ b/src/services/ProjectCustomAttributes.js @@ -0,0 +1,9 @@ +import { ResourceCustomAttributes } from '../templates'; + +export class ProjectCustomAttributes { + constructor(options) { + return new ResourceCustomAttributes('projects', options); + } +} + +export default ProjectCustomAttributes; diff --git a/src/services/ProjectHooks.js b/src/services/ProjectHooks.js new file mode 100644 index 00000000..f29462db --- /dev/null +++ b/src/services/ProjectHooks.js @@ -0,0 +1,43 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +export class ProjectHooks extends BaseService { + all(projectId, options = {}) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/hooks`, options); + } + + show(projectId, hookId) { + const [pId, hId] = [projectId, hookId].map(encodeURIComponent); + + return RequestHelper.get(this, `projects/${pId}/hooks/${hId}`); + } + + add(projectId, url, options = {}) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.post( + this, + `projects/${pId}/hooks`, + Object.assign({ url }, options), + ); + } + + edit(projectId, hookId, url, options = {}) { + const [pId, hId] = [projectId, hookId].map(encodeURIComponent); + + return RequestHelper.put( + this, + `projects/${pId}/hooks/${hId}`, + Object.assign({ url }, options), + ); + } + + remove(projectId, hookId) { + const [pId, hId] = [projectId, hookId].map(encodeURIComponent); + + return RequestHelper.delete(this, `projects/${pId}/hooks/${hId}`); + } +} + +export default ProjectHooks; diff --git a/src/services/ProjectMembers.js b/src/services/ProjectMembers.js new file mode 100644 index 00000000..40e97276 --- /dev/null +++ b/src/services/ProjectMembers.js @@ -0,0 +1,9 @@ +import { ResourceMembers } from '../templates'; + +export class ProjectMembers { + constructor(options) { + return new ResourceMembers('projects', options); + } +} + +export default ProjectMembers; diff --git a/src/services/ProjectMilestones.js b/src/services/ProjectMilestones.js new file mode 100644 index 00000000..cf109576 --- /dev/null +++ b/src/services/ProjectMilestones.js @@ -0,0 +1,9 @@ +import { ResourceMilestones } from '../templates'; + +export class ProjectMilestones { + constructor(options) { + return new ResourceMilestones('projects', options); + } +} + +export default ProjectMilestones; diff --git a/src/services/ProjectRunners.js b/src/services/ProjectRunners.js new file mode 100644 index 00000000..93392b0f --- /dev/null +++ b/src/services/ProjectRunners.js @@ -0,0 +1,25 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +export class ProjectRunners extends BaseService { + all(projectId, options = {}) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/runners`, options); + } + + enable(projectId, runnerId) { + const [pId, rId] = [projectId, runnerId].map(encodeURIComponent); + + return RequestHelper.post(this, `projects/${pId}/runners`, { + runner_id: rId, + }); + } + + disable(projectId, runnerId) { + const [pId, rId] = [projectId, runnerId].map(encodeURIComponent); + + return RequestHelper.delete(this, `projects/${pId}/runners/${rId}`); + } +} + +export default ProjectRunners; diff --git a/src/services/ProjectSnippets.js b/src/services/ProjectSnippets.js new file mode 100644 index 00000000..0a292ce0 --- /dev/null +++ b/src/services/ProjectSnippets.js @@ -0,0 +1,9 @@ +import { ResourceNotes } from '../templates'; + +export class ProjectSnippets { + constructor(options) { + return new ResourceNotes('projects', 'snippets', options); + } +} + +export default ProjectSnippets; diff --git a/src/services/Projects.js b/src/services/Projects.js new file mode 100644 index 00000000..796ea90b --- /dev/null +++ b/src/services/Projects.js @@ -0,0 +1,108 @@ +import Fs from 'fs'; +import Path from 'path'; +import { BaseService, RequestHelper } from '../infrastructure'; + +export class Projects extends BaseService { + all(options = {}) { + return RequestHelper.get(this, 'projects', options); + } + + create(options = {}) { + if (options.userId) { + const uId = encodeURIComponent(options.userId); + + return RequestHelper.post(this, `projects/user/${uId}`, options); + } + + return RequestHelper.post(this, 'projects', options); + } + + edit(projectId, options = {}) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.put(this, `projects/${pId}`, options); + } + + fork(projectId, options = {}) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.post(this, `projects/${pId}/fork`, options); + } + + remove(projectId) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.delete(this, `projects/${pId}`); + } + + search(projectName) { + return RequestHelper.get(this, 'projects', { search: projectName }); + } + + share(projectId, groupId, groupAccess, options) { + const pId = encodeURIComponent(projectId); + + if (!groupId || !groupAccess) throw new Error('Missing required arguments'); + + options.group_id = groupId; + options.group_access = groupAccess; + + return RequestHelper.post(this, `projects/${pId}/share`, options); + } + + show(projectId) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}`); + } + + star(projectId) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.post(this, `projects/${pId}/star`); + } + + statuses(projectId, sha, state, options = {}) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.post( + this, + `projects/${pId}/statuses/${sha}`, + Object.assign({ state }, options), + ); + } + + unshare(projectId, groupId) { + const [pId, gId] = [projectId, groupId].map(encodeURIComponent); + + return RequestHelper.delete(this, `projects/${pId}/share${gId}`); + } + + unstar(projectId) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.post(this, `projects/${pId}/unstar`); + } + + upload(projectId, filePath, { fileName = Path.basename(filePath) } = {}) { + const pId = encodeURIComponent(projectId); + const file = Fs.readFileSync(filePath); + + return RequestHelper.post( + this, + `projects/${pId}/uploads`, + { + file: { + value: file, + options: { + filename: fileName, + contentType: 'application/octet-stream', + }, + }, + }, + true, + ); + } +} + +export default Projects; diff --git a/src/services/ProtectedBranches.js b/src/services/ProtectedBranches.js new file mode 100644 index 00000000..5c9582d7 --- /dev/null +++ b/src/services/ProtectedBranches.js @@ -0,0 +1,39 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +export class ProtectedBranches extends BaseService { + all(projectId, options = {}) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/protected_branches`, options); + } + + protect(projectId, branchName, options = {}) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.post( + this, + `projects/${pId}/protected_branches`, + Object.assign(options, { name: branchName }), + ); + } + + show(projectId, branchName) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get( + this, + `projects/${pId}/protected_branches/${branchName}`, + ); + } + + unprotect(projectId, branchName) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.delete( + this, + `projects/${pId}/protected_branches/${branchName}`, + ); + } +} + +export default ProtectedBranches; diff --git a/src/services/Repositories.js b/src/services/Repositories.js new file mode 100644 index 00000000..5ed10d7d --- /dev/null +++ b/src/services/Repositories.js @@ -0,0 +1,49 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +export class Repositories extends BaseService { + compare(projectId, from, to) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/repository/compare`, { + from, + to, + }); + } + + contributors(projectId) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/repository/contributors`); + } + + showArchive(projectId, { sha }) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/repository/archive`, { + sha, + }); + } + + showBlob(projectId, sha) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/repository/blobs/${sha}`); + } + + showBlobRaw(projectId, sha) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get( + this, + `projects/${pId}/repository/blobs/${sha}/raw`, + ); + } + + tree(projectId, options = {}) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/repository/tree`, options); + } +} + +export default Repositories; diff --git a/src/services/RepositoryFiles.js b/src/services/RepositoryFiles.js new file mode 100644 index 00000000..e67f2595 --- /dev/null +++ b/src/services/RepositoryFiles.js @@ -0,0 +1,56 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +export class RepositoryFiles extends BaseService { + create(projectId, filePath, branch, options = {}) { + const [pId, path] = [projectId, filePath].map(encodeURIComponent); + const extendedOptions = Object.assign({ branch }, options); + + return RequestHelper.post( + this, + `projects/${pId}/repository/files/${path}`, + extendedOptions, + ); + } + + edit(projectId, filePath, branch, options = {}) { + const [pId, path] = [projectId, filePath].map(encodeURIComponent); + const extendedOptions = Object.assign({ branch }, options); + + return RequestHelper.put( + this, + `projects/${pId}/repository/files/${path}`, + extendedOptions, + ); + } + + remove(projectId, filePath, branch, options = {}) { + const [pId, path] = [projectId, filePath].map(encodeURIComponent); + const extendedOptions = Object.assign({ branch }, options); + + return RequestHelper.delete( + this, + `projects/${pId}/repository/files/${path}`, + extendedOptions, + ); + } + + show(projectId, filePath, ref) { + const [pId, path] = [projectId, filePath].map(encodeURIComponent); + + return RequestHelper.get(this, `projects/${pId}/repository/files/${path}`, { + ref, + }); + } + + showRaw(projectId, filePath, ref) { + const [pId, path] = [projectId, filePath].map(encodeURIComponent); + + return RequestHelper.get( + this, + `projects/${pId}/repository/files/${path}/raw`, + { ref }, + ); + } +} + +export default RepositoryFiles; diff --git a/src/services/Runners.js b/src/services/Runners.js new file mode 100644 index 00000000..c52f0833 --- /dev/null +++ b/src/services/Runners.js @@ -0,0 +1,37 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +export class Runners extends BaseService { + all(options = {}) { + return RequestHelper.get(this, 'runners/all', options); + } + + allOwned(options = {}) { + return RequestHelper.get(this, 'runners', options); + } + + edit(runnerId, attributes) { + const rId = encodeURIComponent(runnerId); + + return RequestHelper.put(this, `runners/${rId}`, attributes); + } + + remove(runnerId) { + const rId = encodeURIComponent(runnerId); + + return RequestHelper.delete(this, `runners/${rId}`); + } + + show(runnerId) { + const rId = encodeURIComponent(runnerId); + + return RequestHelper.get(this, `runners/${rId}`); + } + + showJobs(runnerId) { + const rId = encodeURIComponent(runnerId); + + return RequestHelper.get(this, `runners/${rId}/jobs`); + } +} + +export default Runners; diff --git a/src/services/Services.js b/src/services/Services.js new file mode 100644 index 00000000..d2960281 --- /dev/null +++ b/src/services/Services.js @@ -0,0 +1,30 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +export class Services extends BaseService { + edit(projectId, serviceName, options = {}) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.put( + this, + `projects/${pId}/services/${serviceName}`, + options, + ); + } + + remove(projectId, serviceName) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.delete( + this, + `projects/${pId}/services/${serviceName}`, + ); + } + + show(projectId, serviceName) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/services/${serviceName}`); + } +} + +export default Services; diff --git a/src/services/SystemHooks.js b/src/services/SystemHooks.js new file mode 100644 index 00000000..323362d4 --- /dev/null +++ b/src/services/SystemHooks.js @@ -0,0 +1,41 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +export class SystemHooks extends BaseService { + all(options = {}) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `hooks`, options); + } + + show(hookId) { + const hId = encodeURIComponent(hookId); + + return RequestHelper.get(this, `hooks/${hId}`); + } + + add(url, options = {}) { + return RequestHelper.post( + this, + `hooks`, + Object.assign({ url }, options), + ); + } + + edit(hookId, url, options = {}) { + const hId = encodeURIComponent(hookId); + + return RequestHelper.put( + this, + `hooks/${hId}`, + Object.assign({ url }, options), + ); + } + + remove(projectId, hookId) { + const hId = encodeURIComponent(hookId); + + return RequestHelper.delete(this, `hooks/${hId}`); + } +} + +export default SystemHooks; diff --git a/src/services/Tags.js b/src/services/Tags.js new file mode 100644 index 00000000..dafe50e1 --- /dev/null +++ b/src/services/Tags.js @@ -0,0 +1,35 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +export class Tags extends BaseService { + all(projectId, options = {}) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/repository/tags`, options); + } + + create(projectId, options = {}) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.post(this, `projects/${pId}/repository/tags`, options); + } + + remove(projectId, tagName) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.delete( + this, + `projects/${pId}/repository/tags/${encodeURI(tagName)}`, + ); + } + + show(projectId, tagName) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get( + this, + `projects/${pId}/repository/tags/${encodeURI(tagName)}`, + ); + } +} + +export default Tags; diff --git a/src/services/Triggers.js b/src/services/Triggers.js new file mode 100644 index 00000000..b036d891 --- /dev/null +++ b/src/services/Triggers.js @@ -0,0 +1,35 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +export class Triggers extends BaseService { + add(projectId, options = {}) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.post(this, `projects/${pId}/triggers`, options); + } + + all(projectId) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/triggers`); + } + + edit(projectId, triggerId, options = {}) { + const [pId, tId] = [projectId, triggerId].map(encodeURIComponent); + + return RequestHelper.put(this, `projects/${pId}/triggers/${tId}`, options); + } + + remove(projectId, triggerId) { + const [pId, tId] = [projectId, triggerId].map(encodeURIComponent); + + return RequestHelper.delete(this, `projects/${pId}/triggers/${tId}`); + } + + show(projectId, triggerId) { + const [pId, tId] = [projectId, triggerId].map(encodeURIComponent); + + return RequestHelper.get(this, `projects/${pId}/triggers/${tId}`); + } +} + +export default Triggers; diff --git a/src/services/UserCustomAttributes.js b/src/services/UserCustomAttributes.js new file mode 100644 index 00000000..68a7ea27 --- /dev/null +++ b/src/services/UserCustomAttributes.js @@ -0,0 +1,9 @@ +import { ResourceCustomAttributes } from '../templates'; + +export class UserCustomAttributes { + constructor(options) { + return new ResourceCustomAttributes('users', options); + } +} + +export default UserCustomAttributes; diff --git a/src/services/Users.js b/src/services/Users.js new file mode 100644 index 00000000..63b52e29 --- /dev/null +++ b/src/services/Users.js @@ -0,0 +1,174 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +export class Users extends BaseService { + all(options = {}) { + return RequestHelper.get(this, 'users', options); + } + + activities() { + return RequestHelper.get(this, 'users/activities'); + } + + block(userId) { + const uId = encodeURIComponent(userId); + + return RequestHelper.post(this, `users/${uId}/block`); + } + + create(options = {}) { + return RequestHelper.post(this, 'users', options); + } + + current() { + return RequestHelper.get(this, 'user'); + } + + session(email, password) { + return RequestHelper.post(this, 'session', { + email, + password, + }); + } + + search(emailOrUsername) { + return RequestHelper.get(this, 'users', { + search: emailOrUsername, + }); + } + + show(userId) { + const uId = encodeURIComponent(userId); + + return RequestHelper.get(this, `users/${uId}`); + } + + remove(userId) { + const uId = encodeURIComponent(userId); + + return RequestHelper.delete(this, `users/${uId}`); + } + + unblock(userId) { + const uId = encodeURIComponent(userId); + + return RequestHelper.post(this, `users/${uId}/unblock`); + } + + // Emails + addEmail(email, userId) { + const url = userId ? `users/${encodeURIComponent(userId)}/emails` : 'users/emails'; + + return RequestHelper.post(this, url, { + email, + }); + } + + allEmails(userId) { + const url = userId ? `users/${encodeURIComponent(userId)}/emails` : 'users/emails'; + + return RequestHelper.get(this, url); + } + + showEmail(emailId) { + const eId = encodeURIComponent(emailId); + + return RequestHelper.get(this, `users/emails/${eId}`); + } + + removeEmail(emailId, userId) { + const eId = encodeURIComponent(emailId); + const url = userId ? `users/${encodeURIComponent(userId)}/emails` : 'users/emails'; + + return RequestHelper.delete(this, `${url}/${eId}`); + } + + // Impersonation Tokens + allImpersonationTokens(userId) { + const uId = encodeURIComponent(userId); + + return RequestHelper.get(this, `users/${uId}/impersonation_tokens`); + } + + createImpersonationToken(userId, name, scopes, expiresAt) { + const uId = encodeURIComponent(userId); + + return RequestHelper.post(this, `users/${uId}/impersonation_tokens`, { + name, + expiresAt, + scopes, + }); + } + + showImpersonationToken(userId, tokenId) { + const [uId, tId] = [userId, tokenId].map(encodeURIComponent); + + return RequestHelper.get(this, `users/${uId}/impersonation_tokens/${tId}`); + } + + revokeImpersonationToken(userId, tokenId) { + const [uId, tId] = [userId, tokenId].map(encodeURIComponent); + + return RequestHelper.delete(this, `users/${uId}/impersonation_tokens/${tId}`); + } + + // GPG Keys + allGPGKeys(userId) { + const url = userId ? `users/${encodeURIComponent(userId)}/gpg_keys` : 'users/gpg_keys'; + + return RequestHelper.get(this, url); + } + + addGPGKey(title, key, userId) { + const url = userId ? `users/${encodeURIComponent(userId)}/gpg_keys` : 'users/gpg_keys'; + + return RequestHelper.post(this, url, { + title, + key, + }); + } + + showGPGKey(keyId, userId) { + const kId = encodeURIComponent(keyId); + const url = userId ? `users/${encodeURIComponent(userId)}/gpg_keys` : 'users/gpg_keys'; + + return RequestHelper.get(this, `${url}/${kId}`); + } + + removeGPGKey(keyId, userId) { + const kId = encodeURIComponent(keyId); + const url = userId ? `users/${encodeURIComponent(userId)}/gpg_keys` : 'users/gpg_keys'; + + return RequestHelper.delete(this, `${url}/${kId}`); + } + + // SSH Keys + allKeys(userId) { + const url = userId ? `users/${encodeURIComponent(userId)}/keys` : 'users/keys'; + + return RequestHelper.get(this, url); + } + + addKey(title, key, userId) { + const url = userId ? `users/${encodeURIComponent(userId)}/keys` : 'users/keys'; + + return RequestHelper.post(this, url, { + title, + key, + }); + } + + showKey(keyId) { + const kId = encodeURIComponent(keyId); + + return RequestHelper.get(this, `users/keys/${kId}`); + } + + removeKey(keyId, userId) { + const kId = encodeURIComponent(keyId); + const url = userId ? `users/${encodeURIComponent(userId)}/keys` : 'users/keys'; + + return RequestHelper.delete(this, `${url}/${kId}`); + } +} + +export default Users; diff --git a/src/services/Version.js b/src/services/Version.js new file mode 100644 index 00000000..92360ad7 --- /dev/null +++ b/src/services/Version.js @@ -0,0 +1,9 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +class Version extends BaseService { + show() { + return RequestHelper.get(this, 'version'); + } +} + +export default Version; diff --git a/src/services/index.js b/src/services/index.js new file mode 100644 index 00000000..6a81873f --- /dev/null +++ b/src/services/index.js @@ -0,0 +1,41 @@ +// Groups +export * from './GroupAccessRequests'; +export * from './GroupCustomAttributes'; +export * from './GroupMembers'; +export * from './GroupMilestones'; +export * from './GroupProjects'; +export * from './Groups'; + +// Projects +export * from './Branches'; +export * from './Commits'; +export * from './CommitNotes'; +export * from './DeployKeys'; +export * from './Environments'; +export * from './Issues'; +export * from './Jobs'; +export * from './Labels'; +export * from './MergeRequests'; +export * from './MergeRequestNotes'; +export * from './MergeRequestVersions'; +export * from './Pipelines'; +export * from './Projects'; +export * from './ProjectAccessRequests'; +export * from './ProjectCustomAttributes'; +export * from './ProjectHooks'; +export * from './ProjectMembers'; +export * from './ProjectMilestones'; +export * from './ProjectSnippets'; +export * from './ProtectedBranches'; +export * from './Repositories'; +export * from './RepositoryFiles'; +export * from './Runners'; +export * from './Services'; +export * from './Tags'; +export * from './Triggers'; + +// General +export * from './SystemHooks'; +export * from './Users'; +// export * from './UserKeys'; +// export * from './UserGPGKeys'; diff --git a/src/templates/ResourceAccessRequests.js b/src/templates/ResourceAccessRequests.js new file mode 100644 index 00000000..36a160f8 --- /dev/null +++ b/src/templates/ResourceAccessRequests.js @@ -0,0 +1,57 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +export const ACCESS_LEVELS = { + GUEST: 10, + REPORTER: 20, + DEVELOPER: 30, + MASTER: 40, + OWNER: 50, +}; + +export class ResourceAccessRequests extends BaseService { + constructor(resourceType, ...args) { + super(...args); + + this.resourceType = resourceType; + this.ACCESS_LEVELS = ACCESS_LEVELS; + } + + all(resourceId) { + const rId = encodeURIComponent(resourceId); + + return RequestHelper.get( + this, + `${this.resourceType}/${rId}/access_requests`, + ); + } + + request(resourceId) { + const rId = encodeURIComponent(resourceId); + + return RequestHelper.post( + this, + `${this.resourceType}/${rId}/access_requests`, + ); + } + + approve(resourceId, userId, { accessLevel = 30 }) { + const [rId, uId] = [resourceId, userId].map(encodeURIComponent); + + return RequestHelper.post( + this, + `${this.resourceType}/${rId}/access_requests/${uId}/approve`, + { accessLevel }, + ); + } + + deny(resourceId, userId) { + const [rId, uId] = [resourceId, userId].map(encodeURIComponent); + + return RequestHelper.delete( + this, + `${this.resourceType}/${rId}/access_requests/${uId}/approve`, + ); + } +} + +export default ResourceAccessRequests; diff --git a/src/templates/ResourceCustomAttributes.js b/src/templates/ResourceCustomAttributes.js new file mode 100644 index 00000000..0ae6faa4 --- /dev/null +++ b/src/templates/ResourceCustomAttributes.js @@ -0,0 +1,48 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +export class ResourceCustomAttributes extends BaseService { + constructor(resourceType, ...args) { + super(...args); + + this.resourceType = resourceType; + } + + all(resourceId) { + const rId = encodeURIComponent(resourceId); + + return RequestHelper.get( + this, + `${this.resourceType}/${rId}/custom_attributes`, + ); + } + + set(resourceId, customAttributeId, value) { + const [rId, cId] = [resourceId, customAttributeId].map(encodeURIComponent); + + return RequestHelper.put( + this, + `${this.resourceType}/${rId}/custom_attributes/${cId}`, + { value }, + ); + } + + remove(resourceId, customAttributeId) { + const [rId, cId] = [resourceId, customAttributeId].map(encodeURIComponent); + + return RequestHelper.delete( + this, + `${this.resourceType}/${rId}/custom_attributes/${cId}`, + ); + } + + show(resourceId, customAttributeId) { + const [rId, cId] = [resourceId, customAttributeId].map(encodeURIComponent); + + return RequestHelper.get( + this, + `${this.resourceType}/${rId}/custom_attributes/${cId}`, + ); + } +} + +export default ResourceCustomAttributes; diff --git a/src/templates/ResourceMembers.js b/src/templates/ResourceMembers.js new file mode 100644 index 00000000..7ec45fd0 --- /dev/null +++ b/src/templates/ResourceMembers.js @@ -0,0 +1,56 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +export class ResourceMembers extends BaseService { + constructor(resourceType, ...args) { + super(...args); + + this.resourceType = resourceType; + } + + all(resourceId) { + const rId = encodeURIComponent(resourceId); + + return RequestHelper.get(this, `${this.resourceType}/${rId}/members`); + } + + add(resourceId, userId, accessLevel) { + const [rId, uId] = [resourceId, userId].map(encodeURIComponent); + + return RequestHelper.post(this, `${this.resourceType}/${rId}/members`, { + user_id: uId, + access_level: parseInt(accessLevel, 10), + }); + } + + edit(resourceId, userId, accessLevel) { + const [rId, uId] = [resourceId, userId].map(encodeURIComponent); + + return RequestHelper.put( + this, + `${this.resourceType}/${rId}/members/${uId}`, + { + access_level: parseInt(accessLevel, 10), + }, + ); + } + + show(resourceId, userId) { + const [rId, uId] = [resourceId, userId].map(encodeURIComponent); + + return RequestHelper.get( + this, + `${this.resourceType}/${rId}/members/${uId}`, + ); + } + + remove(resourceId, userId) { + const [rId, uId] = [resourceId, userId].map(encodeURIComponent); + + return RequestHelper.delete( + this, + `${this.resourceType}/${rId}/members/${uId}`, + ); + } +} + +export default ResourceMembers; diff --git a/src/templates/ResourceMilestones.js b/src/templates/ResourceMilestones.js new file mode 100644 index 00000000..379166d2 --- /dev/null +++ b/src/templates/ResourceMilestones.js @@ -0,0 +1,50 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +export class ResourceMilestones extends BaseService { + constructor(resourceType, ...args) { + super(...args); + + this.resourceType = resourceType; + } + + all(resourceId, options = {}) { + const rId = encodeURIComponent(resourceId); + + return RequestHelper.get(this, `${this.resourceType}/${rId}/milestones`, options); + } + + create(resourceId, title, options) { + const rId = encodeURIComponent(resourceId); + + return RequestHelper.post(this, `${this.resourceType}/${rId}/milestones`, options); + } + + edit(resourceId, milestoneId, options) { + const [rId, mId] = [resourceId, milestoneId].map(encodeURIComponent); + + return RequestHelper.put(this, `${this.resourceType}/${rId}/milestones/${mId}`, options); + } + + issues(resourceId, milestoneId) { + const [rId, mId] = [resourceId, milestoneId].map(encodeURIComponent); + + return RequestHelper.get( + this, + `${this.resourceType}/${rId}/milestones/${mId}/issues`, + ); + } + + mergeRequests(resourceId, milestoneId) { + const [rId, mId] = [resourceId, milestoneId].map(encodeURIComponent); + + return RequestHelper.get(this, `${this.resourceType}/${rId}/milestones/${mId}/merge_requests`); + } + + show(resourceId, milestoneId) { + const [rId, mId] = [resourceId, milestoneId].map(encodeURIComponent); + + return RequestHelper.get(this, `${this.resourceType}/${rId}/milestones/${mId}`); + } +} + +export default ResourceMilestones; diff --git a/src/templates/ResourceNotes.js b/src/templates/ResourceNotes.js new file mode 100644 index 00000000..e7a11ce8 --- /dev/null +++ b/src/templates/ResourceNotes.js @@ -0,0 +1,46 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +export class ResourceNotes extends BaseService { + constructor(resourceType, resource2Type, ...args) { + super(...args); + + this.resourceType = resourceType; + this.resource2Type = resource2Type; + } + + all(resourceId, resource2Id, options = {}) { + const [rId, r2Id] = [resourceId, resource2Id].map(encodeURIComponent); + + return RequestHelper.get(this, `${this.resourceType}/${rId}/${this.resource2Type}/${r2Id}/notes`, options); + } + + create(resourceId, resource2Id, options = {}) { + if (!options.body) throw new Error('Missing required property: body'); + + const [rId, r2Id] = [resourceId, resource2Id].map(encodeURIComponent); + + return RequestHelper.post(this, `${this.resourceType}/${rId}/${this.resource2Type}/${r2Id}/notes`, options); + } + + edit(resourceId, resource2Id, noteId, options = {}) { + if (!options.body) throw new Error('Missing required property: body'); + + const [rId, r2Id, nId] = [resourceId, resource2Id, noteId].map(encodeURIComponent); + + return RequestHelper.put(this, `${this.resourceType}/${rId}/${this.resource2Type}/${r2Id}/notes/${nId}`, options); + } + + remove(resourceId, resource2Id, noteId) { + const [rId, r2Id, nId] = [resourceId, resource2Id, noteId].map(encodeURIComponent); + + return RequestHelper.delete(this, `${this.resourceType}/${rId}/${this.resource2Type}/${r2Id}/notes/${nId}`); + } + + show(resourceId, resource2Id, noteId) { + const [rId, r2Id, nId] = [resourceId, resource2Id, noteId].map(encodeURIComponent); + + return RequestHelper.get(this, `${this.resourceType}/${rId}/${this.resource2Type}/${r2Id}/notes/${nId}`); + } +} + +export default ResourceNotes; diff --git a/src/templates/index.js b/src/templates/index.js new file mode 100644 index 00000000..5ae496a5 --- /dev/null +++ b/src/templates/index.js @@ -0,0 +1,5 @@ +export * from './ResourceNotes'; +export * from './ResourceAccessRequests'; +export * from './ResourceMembers'; +export * from './ResourceMilestones'; +export * from './ResourceCustomAttributes';