diff --git a/.codeclimate.yml b/.codeclimate.yml index 04fe87d7..f7e53999 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -7,6 +7,11 @@ engines: languages: javascript: mass_threshold: 65 + shellcheck: + enabled: true +checks: + method-count: + enabled: false ratings: paths: - "**.js" \ No newline at end of file diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index b3167f9f..00000000 --- a/.eslintrc +++ /dev/null @@ -1,17 +0,0 @@ -{ - "parser": "babel-eslint", - "env": - { - "browser": true, - "node": true - }, - "extends": "airbnb", - "rules": { - "arrow-body-style": [2, "as-needed"], - "no-param-reassign": [ - "error", { - "props": false - } - ] - } -} \ No newline at end of file diff --git a/.eslintrc.yaml b/.eslintrc.yaml new file mode 100644 index 00000000..d026c4b8 --- /dev/null +++ b/.eslintrc.yaml @@ -0,0 +1,12 @@ +--- +env: + node: true + browser: true +parser: babel-eslint +extends: + - airbnb +rules: + arrow-body-style: [2, "as-needed"] + no-param-reassign: ["error", {"props":false}] + import/prefer-default-export: 1 + diff --git a/.npmignore b/.npmignore index c578d0a2..475c70bf 100644 --- a/.npmignore +++ b/.npmignore @@ -1,3 +1,3 @@ node_modules -logs npm-debug.log +dist \ No newline at end of file diff --git a/README.md b/README.md index de42006f..61114e12 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,10 @@ It wraps the HTTP v4 API library described [here](https://github.com/gitlabhq/gi * [Install](#install) * [Usage](#usage) + * [Supported APIs](#supported-apis) * [Import](#import) + * [Specific Imports](#specific-imports) + * [Bundle Imports](#bundle-imports) * [Examples](#examples) * [Pagination](#pagination) * [Docs](#docs) @@ -24,6 +27,7 @@ It wraps the HTTP v4 API library described [here](https://github.com/gitlabhq/gi * [License](#licence) * [Changelog](#changelog) + ## Install ```bash @@ -32,33 +36,221 @@ npm install node-gitlab-api ``` ## Usage +### Supported APIs +The API's that are currently supported are: +``` +// General +ApplicationSettings +BroadcastMessages +Events +FeatureFlags +GeoNodes +GitignoreTemplates +GitLabCIYMLTemplates +Keys +Licence +LicenceTemplates +Lint +Namespaces +NotificationSettings +PagesDomains +Search +SidekiqMetrics +SystemHooks +Wikis + +// Groups +Groups +GroupAccessRequests +GroupBadges +GroupCustomAttributes +GroupIssueBoards +GroupMembers +GroupMilestones +GroupProjects +GroupVariables +Epics +EpicIssues +EpicNotes +EpicDiscussions + +// Projects +Branches +Commits +Deployments +DeployKeys +Environments +Issues +IssueNotes +IssueDiscussions +IssueAwardEmojis +Jobs +Labels +MergeRequests +MergeRequestAwardEmojis +MergeRequestNotes +Pipelines +PipelineSchedules +PipelineScheduleVariables +Projects +ProjectAccessRequests +ProjectCustomAttributes +ProjectImportExport +ProjectIssueBoards +ProjectHooks +ProjectMembers +ProjectMilestones +ProjectSnippets +ProjectSnippetNotes +ProjectSnippetDiscussions +ProjectSnippetAwardEmojis +ProtectedBranches +ProjectVariables +Repositories +RepositoryFiles +Runners +Services +Tags +Todos +Triggers + +// Users +Users +UserEmails +UserImpersonationTokens +UserKeys +UserGPGKeys + +``` ### Import -#### ES6 (>=node 8.0.0) + URL to your GitLab instance should not include `/api/v4` path. Instantiate the library using a basic token created in your [Gitlab Profile](https://docs.gitlab.com/ce/user/profile/personal_access_tokens.html) + ```javascript -const GitlabAPI = require('node-gitlab-api')({ +// ES6 (>=node 8.0.0) +import Gitlab from 'node-gitlab-api'; + +// ES5 +const Gitlab = require('node-gitlab-api/dist/es5').default + + +// Instantiating +const api = new Gitlab({ url: 'http://example.com', // Defaults to http://gitlab.com token: 'abcdefghij123456' //Can be created in your profile. }) -``` -Or, use a OAuth token instead! +// Or, use a OAuth token instead! -```javascript -const GitlabAPI = require('node-gitlab-api')({ +const api = new Gitlab({ url: 'http://example.com', // Defaults to http://gitlab.com oauthToken: 'abcdefghij123456' }) + ``` -#### ES5 -The same parameters as above, but the require url inclues a `/dist/es5`: + +#### Specific Imports + +Sometimes you dont want to import and instantiate the whole gitlab api, perhaps you only want access to the Projects API. To do this, one only needs to import and instantiate this specific API: ```javascript -const GitlabAPI = require('node-gitlab-api/dist/es5')({ - ... +import { Projects } from 'node-gitlab-api'; + +const service = new Projects({ + url: 'http://example.com', // Defaults to http://gitlab.com + token: 'abcdefghij123456' //Can be created in your profile. }) + +``` + +#### Bundle Imports + +It can be annoying to have to import all the API's pertaining to a specific resource. For example, the Projects resource is composed of many API's, Projects, Issues, Labels, MergeRequests, etc. For convience, there is a Bundle export for importing and instantiating all these related API's at once. + + +```javascript +import { ProjectsBundle } from 'node-gitlab-api'; + +const services = new ProjectsBundle({ + url: 'http://example.com', // Defaults to http://gitlab.com + token: 'abcdefghij123456' //Can be created in your profile. +}) + +services.Projects.all() +services.MergeRequests.all() +etc.. + +``` + +Currently there are three Bundles: +1. ProjectsBundle which includes: +``` +Branches +Commits +Deployments +DeployKeys +Environments +Issues +IssueNotes +IssueDiscussions +IssueAwardEmojis +Jobs +Labels +MergeRequests +MergeRequestAwardEmojis +MergeRequestNotes +Pipelines +PipelineSchedules +PipelineScheduleVariables +Projects +ProjectAccessRequests +ProjectCustomAttributes +ProjectImportExport +ProjectIssueBoards +ProjectHooks +ProjectMembers +ProjectMilestones +ProjectSnippets +ProjectSnippetNotes +ProjectSnippetDiscussions +ProjectSnippetAwardEmojis +ProtectedBranches +ProjectVariables +Repositories +RepositoryFiles +Runners +Services +Tags +Todos +Triggers +``` + +2. UsersBundle which includes: +``` +Users, +UserEmails, +UserImpersonationTokens, +UserKeys, +UserGPGKeys +``` + +3. GroupsBundle which includes: +``` +Groups +GroupAccessRequests +GroupBadges +GroupCustomAttributes +GroupIssueBoards +GroupMembers +GroupMilestones +GroupProjects +GroupVariables +Epics +EpicIssues +EpicNotes +EpicDiscussions ``` ### Examples @@ -67,14 +259,18 @@ Once you have your library instantiated, you can utilize many of the API's funct Using the await/async method ```javascript -// Listing users -let users = await GitlabAPI.users.all(); -``` +import Gitlab from 'node-gitlab-api'; -Or using Promise-Then notation -```javascript -// Listing projects -GitlabAPI.projects.all() +const api = new Gitlab({ + url: 'http://example.com', // Defaults to http://gitlab.com + token: 'abcdefghij123456' //Can be created in your profile. +}); + +// Listing users +let users = await api.Users.all(); + +// Or using Promise-Then notation +api.Projects.all() .then((projects) => { console.log(projects) }) @@ -87,7 +283,14 @@ General rule about all the function parameters: ie. ```javascript -GitlabAPI.projects.create(projectId, { +import Gitlab from 'node-gitlab-api'; + +const api = new Gitlab({ + url: 'http://example.com', // Defaults to http://gitlab.com + token: 'abcdefghij123456' //Can be created in your profile. +}); + +api.Projects.create(projectId, { //options defined in the Gitlab API documentation }) ``` @@ -98,25 +301,34 @@ For any .all() function on a resource, it will return all the items from Gitlab. ```javascript -// Listing projects -let projects = await GitlabAPI.projects.all({max_pages:2}); +import Gitlab from 'node-gitlab-api'; + +const api = new Gitlab({ + url: 'http://example.com', // Defaults to http://gitlab.com + token: 'abcdefghij123456' //Can be created in your profile. +}); + +let projects = await api.Projects.all({maxPages:2}); ``` You can also use this in conjunction to the perPage argument which would override the default of 30 per page set by Gitlab: ```javascript -// Listing projects -let projects = await GitlabAPI.projects.all({max_pages:2, per_page:40}); +import Gitlab from 'node-gitlab-api'; + +const api = new Gitlab({ + url: 'http://example.com', // Defaults to http://gitlab.com + token: 'abcdefghij123456' //Can be created in your profile. +}); + +let projects = await api.Projects.all({maxPages:2, perPage:40}); ``` ## Docs -Although there are the official docs for the API, below are some additional docs for this node package! Would eventually like to document everything, but there is quite a bit to document. PR's are welcome! 😎 - -* [Projects](https://github.com/jdalrymple/node-gitlab-api/blob/master/docs/projects.md) -* [Groups](https://github.com/jdalrymple/node-gitlab-api/blob/master/docs/groups.md) +Although there are the official docs for the API, there are some extra goodies offered by this package! After the 3.0.0 release, the next large project will be putting together proper documention for these goodies [#39]! Stay tuned!! ## Tests @@ -139,12 +351,59 @@ This started off as a fork from [node-gitlab](https://github.com/node-gitlab/nod - [fewieden](https://github.com/fewieden) - [Jeff Pelton](https://github.com/comster) - [Claude Abounegm](https://github.com/claude-abounegm) +- [Stefan Hall](https://github.com/Marethyu1) +- [Jordan Wallet](https://github.com/Mr-Wallet) + ## License [MIT](https://github.com/jdalrymple/node-gitlab-api/blob/master/LICENSE.md) ## Changelog + +[3.0.0](https://github.com/jdalrymple/node-gitlab-api/tags/3.0.0) (2018-4-2) +------------------ +- Exporting all services seperatly ie. const { Projects } from 'node-gitlab-api'; as well as the usual default export: const Gitlab from 'node-gitlab-api' +- Exporting bunbles which are groups of related API's. These include: ProjectsBundle, UsersBundle and GroupsBundle +- Added events support to the Projects, and Users +- Added full support for ProjectVariables and GroupVariables +- Added support for Events. This is also exposed in Projects and Users under the events function +- Fixed the missing options parameter for the ProjectMembers and GroupMemebers APIs in PR [#45] thanks to [Stefan Hall](https://github.com/Marethyu1) +- Supporting both camelCase and snake_case option properties: `projects.all({perPage:5}) === projects.all({per_page: 5})` +- Fixed problem with .all() functions where only the some of the results were being returned +- Completed support for all Gitlab APIs, #49, #53 + +### Breaking Changes between 2.2.6 and 3.0.0 +- Instantiation of the API must use the new operator consistently. See usage above. +- All services being exported are not capitalized for clarity that they are themselves api's and not properties. ie. Gitlab.Projects vs Gitlab.projects +- All subservices (services exposed as properties of other services) have been moved out into their own service +``` +ProjectRepository -> Repositories, Tags, Commits, Branches and RepositoryFiles +Users -> Users, UserKeys, UserGPGKeys, UserCustomAttributes, UserVariables + +``` +- Moved createTodo function from MergeRequests API to Todos API +- Many services have been renamed: +``` +ProjectProtectedBranches -> ProtectedBranches +ProjectDeployKeys -> DeployKeys +ProjectEnvironments -> Enviroments +ProjectJobs -> Jobs +ProjectLabels -> Labels +ProjectPipelines -> Pipelines +ProjectRepository -> Repositories +ProjectServices -> Services +ProjectTriggers -> Triggers +``` + +- Some services were merged: +``` +Issues = ProjectIssues + Issues. ProjectId is optional for all() +MergeRequests = ProjectMergeRequests + MergeRequests + MergeRequestsChanges + MergeRequestsCommits + MergeRequestVersions. ProjectId is optional for all() +Runners = ProjectRunners + Runners. ProjectId is optional for all() + +``` + [2.2.8](https://github.com/jdalrymple/node-gitlab-api/tags/2.2.7) (2018-4-1) ------------------ - Updating babel @@ -153,6 +412,18 @@ This started off as a fork from [node-gitlab](https://github.com/node-gitlab/nod ------------------ - Fixing babel runtime +[2.2.6](https://github.com/jdalrymple/node-gitlab-api/tags/2.2.6) (2018-3-15) +------------------ +- Fixed more issues within the url concatenation + +[2.2.5](https://github.com/jdalrymple/node-gitlab-api/tags/2.2.5) (2018-3-15) +------------------ +- Fixed #48 - Problem with trailing `\` in url + +[2.2.4](https://github.com/jdalrymple/node-gitlab-api/5d7c031ca2b833b28633647195560379d88ba5b3) (2018-2-12) +------------------ +- Fixing babel runtime + [2.2.6](https://github.com/jdalrymple/node-gitlab-api/tags/2.2.6) (2018-3-15) ------------------ - Fixed more issues within the url concatenation diff --git a/docs/group-access-requests.md b/docs/group-access-requests.md deleted file mode 100644 index 2979af4b..00000000 --- a/docs/group-access-requests.md +++ /dev/null @@ -1,53 +0,0 @@ -## Group Milestones - -* [List all group access-requests](#list-all-group-access-requests) -* [Request access to a group](#request-access-to-a-group) -* [Approve a group access request](#approve-a-group-access-request) -* [Deny a group access request](#deny-a-group-access-request) - -### List all group access requests - -Gets a list of access requests viewable by the authenticated user. - -```javascript -let milestones = GitlabAPI.group.accessRequests.all(groupId); -``` -**Parameters**: [List all access requests](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/access_requests.md#list-access-requests-for-a-group-or-project) - -**Extra Parameters** - -| Argument | Description | Type | Required | Default | -|---------------|--------------------------|----------|----------|-------------------| -| max_pages |Limits the amount of pages returned | Number | No | All pages | - - -### Request access to a group - -Requests access for the authenticated user to a group or project. - -```javascript -let milestone = GitlabAPI.groups.accessRequest.request(groupId); -``` -**Parameters**: [Get a milestone](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/access_requests.md#request-access-to-a-group-or-project) - - -### Approve a group access request - -Approves an access request for the given user. - - -```javascript -let milestone = GitlabAPI.groups.accessRequest.approve(groupId, userId); -``` -**Parameters**: [Approve an access request](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/access_requests.md#approve-an-access-request) - - -### Deny a group access request - -Deny an access request for the given user. - - -```javascript -let milestone = GitlabAPI.groups.accessRequest.deny(groupId, userId); -``` -**Parameters**: [Deny an access request](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/access_requests.md#deny-an-access-request) diff --git a/docs/group-members.md b/docs/group-members.md deleted file mode 100644 index 53eb89db..00000000 --- a/docs/group-members.md +++ /dev/null @@ -1,66 +0,0 @@ -## Group Members - -* [List all members](#list-all-members) -* [Get a member](#get-a-member) -* [Add a member](#add-a-member) -* [Edit a member](#edit-a-member) -* [Remove a member](#remove-a-member) - -### List all members - -Gets a list of group members viewable by the authenticated user. - -```javascript -let members = GitlabAPI.group.members.all(groupId); -``` -**Parameters**: [List all members](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/members.md#list-all-members-of-a-group-or-project) - -**Extra Parameters** - -| Argument | Description | Type | Required | Default | -|---------------|--------------------------|----------|----------|-------------------| -| max_pages |Limits the amount of pages returned | Number | No | All pages | - - -### Get a member - -Gets a member of a group. - -```javascript -let member = GitlabAPI.groups.members.show(groupId, memberId); -``` -**Parameters**: [Get a member](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/members.md#get-a-member-of-a-group-or-project) - - -### Add a member - -Gets a member of a group. - -```javascript -let member = GitlabAPI.groups.members.add(groupId, { - // params -}); -``` -**Parameters**: [Add a member](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/members.md#add-a-member-to-a-group-or-project) - - -### Edit a member - -Edits a member of a group. - -```javascript -let member = GitlabAPI.groups.members.edit(groupId, { - // params -}); -``` -**Parameters**: [Add a member](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/members.md#add-a-member-to-a-group-or-project) - - -### Remove a member - -Removes a member of a group. - -```javascript -GitlabAPI.groups.members.remove(groupId, memberId); -``` -**Parameters**: [Remove a member](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/members.md#remove-a-member-to-a-group-or-project) diff --git a/docs/group-milestone-issues.md b/docs/group-milestone-issues.md deleted file mode 100644 index 9ad14c66..00000000 --- a/docs/group-milestone-issues.md +++ /dev/null @@ -1,18 +0,0 @@ -## Group Milestones Issues - -* [List all group milestone issues](#list-all-group-milestone-issues) - -### List all group milestone issues - -Gets a list of all of issues associated with a specific group milestone viewable by the authenticated user. - -```javascript -let milestones = GitlabAPI.group.milestones.issues.all(groupId); -``` -**Parameters**: [List all group milestone issues](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/group_milestones.md#get-all-issues-assigned-to-a-single-milestone) - -**Extra Parameters** - -| Argument | Description | Type | Required | Default | -|---------------|--------------------------|----------|----------|-------------------| -| max_pages |Limits the amount of pages returned | Number | No | All pages | diff --git a/docs/group-milestone-merge-requests.md b/docs/group-milestone-merge-requests.md deleted file mode 100644 index f357d6e5..00000000 --- a/docs/group-milestone-merge-requests.md +++ /dev/null @@ -1,18 +0,0 @@ -## Group Milestones Merge Requests - -* [List all group milestone merge requests](#list-all-group-milestone-merge-requests) - -### List all group milestone merge requests - -Gets a list of all of issues associated with a specific group milestone viewable by the authenticated user. - -```javascript -let milestones = GitlabAPI.group.milestones.mergeRequests.all(groupId); -``` -**Parameters**: [List all group milestone issues](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/group_milestones.md#get-all-merge-requests-assigned-to-a-single-milestone) - -**Extra Parameters** - -| Argument | Description | Type | Required | Default | -|---------------|--------------------------|----------|----------|-------------------| -| max_pages |Limits the amount of pages returned | Number | No | All pages | diff --git a/docs/group-milestones.md b/docs/group-milestones.md deleted file mode 100644 index f1e3697b..00000000 --- a/docs/group-milestones.md +++ /dev/null @@ -1,55 +0,0 @@ -## Group Milestones - -* [List all group milestones](#list-all-group-milestones) -* [Get a group milestone](#get-a-group-milestone) -* [Create a group milestone](#create-a-group-milestone) -* [Edit a group milestone](#edit-a-group-milestone) - -### List all group milestones - -Gets a list of group milestones viewable by the authenticated user. - -```javascript -let milestones = GitlabAPI.group.milestones.all(groupId); -``` -**Parameters**: [List all milestones](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/group_milestones.md#list-group-milestones) - -**Extra Parameters** - -| Argument | Description | Type | Required | Default | -|---------------|--------------------------|----------|----------|-------------------| -| max_pages |Limits the amount of pages returned | Number | No | All pages | - - -### Get a group milestone - -Gets a group milestone. - -```javascript -let milestone = GitlabAPI.groups.milestones.show(groupId, milestoneId); -``` -**Parameters**: [Get a milestone](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/group_milestones.md#get-single-milestone) - - -### Create a group milestone - -Creates a group milestone. - -```javascript -let milestone = GitlabAPI.groups.milestones.create(groupId, { - // params -}); -``` -**Parameters**: [Create a milestone](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/group_milestones.md#create-new-milestone) - - -### Edit a group milestone - -Edits a group milestone. - -```javascript -let milestone = GitlabAPI.groups.milestones.edit(groupId, { - // params -}); -``` -**Parameters**: [Edit a milestone](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/group_milestones.md#edit-milestone) diff --git a/docs/group-projects.md b/docs/group-projects.md deleted file mode 100644 index 60ead65f..00000000 --- a/docs/group-projects.md +++ /dev/null @@ -1,29 +0,0 @@ -## Group Projects - -* [List all group projects](#list-all-group-projects) -* [Add a project to a group](#add-a-project-to-a-group) - -### List all group projects - -Gets a list of group projects viewable by the authenticated user. - -```javascript -let milestones = GitlabAPI.groups.projects.all(groupId); -``` -**Parameters**: [List all a group projects](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/groups.md#list-a-groups-projects) - -**Extra Parameters** - -| Argument | Description | Type | Required | Default | -|---------------|--------------------------|----------|----------|-------------------| -| max_pages |Limits the amount of pages returned | Number | No | All pages | - - -### Add a project to a group - -Adds a project to a group. - -```javascript -let milestone = GitlabAPI.groups.projects.add(groupId, projectId); -``` -**Parameters**: [Transfer project to group](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/groups.md#transfer-project-to-group) diff --git a/docs/groups.md b/docs/groups.md deleted file mode 100644 index 89373802..00000000 --- a/docs/groups.md +++ /dev/null @@ -1,110 +0,0 @@ -# Groups API - -* [Groups](#Groups) - * [List all groups](#list-all-groups) - * [List all group's subgroups](#list-all-groups-subgroups) - * [Get a single group](#get-a-single-group) - * [Create a group](#create-a-group) - * [Edit a group](#edit-a-group) - * [Search for a group](#edit-a-group) -* [Group Members](https://github.com/jdalrymple/node-gitlab-api/blob/master/docs/group-members.md) -* [Group Milestones](https://github.com/jdalrymple/node-gitlab-api/blob/master/docs/group-milestones.md) - * [Group Milestones Issues](https://github.com/jdalrymple/node-gitlab-api/blob/master/docs/group-milestone-issues.md) - * [Group Milestones Merge Requests](https://github.com/jdalrymple/node-gitlab-api/blob/master/docs/group-milestone-merge-requests.md) -* [Group Projects](https://github.com/jdalrymple/node-gitlab-api/blob/master/docs/group-projects.md) -* [Group Access Requests](https://github.com/jdalrymple/node-gitlab-api/blob/master/docs/group-access-requests.md) - -## Groups - -### List all groups - -Get a list of visible Groups for authenticated user. When accessed without authentication, only public Groups are returned. - -```javascript -let groups = GitlabAPI.groups.all(); -``` - -**Parameters**: [List all Groups](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/groups.md#list-groups) - -**Extra Parameters** - -| Argument | Description | Type | Required | Default | -|---------------|--------------------------|----------|----------|-------------------| -| max_pages |Limits the amount of pages returned | Number | No | All pages | - - -### List all groups subgroups - -Get a list of visible Groups for authenticated user. When accessed without authentication, only public Groups are returned. - -```javascript -let groups = GitlabAPI.groups.allSubgroups(groupId, { //params }); -``` - -**Parameters**: [List all Groups](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/groups.md#list-a-groupss-subgroups) - -**Extra Parameters** - -| Argument | Description | Type | Required | Default | -|---------------|--------------------------|----------|----------|-------------------| -| max_pages |Limits the amount of pages returned | Number | No | All pages | - - -### Get a single group - -Get a specific group. This endpoint can be accessed without authentication if -the group is publicly accessible. - -```javascript -// From a group ID -let groupA = GitlabAPI.groups.show(21); - -// From a Groups url -let groupB = GitlabAPI.groups.show('diaspora/diaspora'); -``` - -**Parameters**: [Get a single group](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/groups.md#details-of-a-group) - - -### Create a group - -Creates a new group owned by the authenticated user. - -```javascript -let groupA = GitlabAPI.groups.create({ - // params -}); -``` -**Parameters**: [Create a group](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/groups.md#new-group) - - -### Edit a group - -Creates a new group owned by the specified user. Available only for admins. - -```javascript -let groupA = GitlabAPI.groups.edit(groupId, { - // params -}); -``` -**Parameters**: [Edit a group](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/groups.md#update-group) - - -### Remove a group - -Removes a group including all associated resources (issues, merge requests etc.) - -```javascript -GitlabAPI.groups.remove(groupId); -``` -**Parameters**: [Remove a group](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/groups.md#remove-group) - - -### Search for a group - -Searches for a group and returns a group including all associated resources (issues, merge requests etc.) - -```javascript -GitlabAPI.groups.search(query); -``` -**Parameters**: [Search for a group](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/groups.md#search-for-group) diff --git a/docs/project-hooks.md b/docs/project-hooks.md deleted file mode 100644 index 1479e575..00000000 --- a/docs/project-hooks.md +++ /dev/null @@ -1,63 +0,0 @@ -## Project Hooks - -* [Get all hooks](#get-all-hooks) -* [Get a hook](#get-a-hook) -* [Add a hook](#add-a-hook-to-a-project) -* [Edit a hook](#edit-a-hook) -* [Remove a hook](#remove-a-hook) - -### Get all hooks - -Get a list of project hooks. - -```javascript -// From a project ID -let hooks = GitlabAPI.projects.hooks.all(projectId); -``` -Parameters: [Get all project hooks](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/projects.md#list-project-hooks) - -### Get a hook - -Get a specific hook for a project. - -```javascript -// From a project ID -let hook = GitlabAPI.projects.hooks.show(projectId, hookId); -``` -Parameters: [Get project hook](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/projects.md#get-project-hook) - -### Add a hook to a project - -Adds a hook to a specified project. - -```javascript -// From a project ID -let hook = GitlabAPI.projects.hooks.add(projectId, { - // params -}); -``` -Parameters: [Add a hook](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/projects.md#add-project-hook) - -### Edit a hook - -Edits a hook for a specified project. - -```javascript -// From a project ID -let hook = GitlabAPI.projects.hooks.edit(projectId, hookId, { - // params -}); -``` -Parameters: [Edit a hook](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/projects.md#edit-project-hook) - -### Remove a hook - -Remove a hook from a project. - -```javascript -// From a project ID -GitlabAPI.projects.hooks.remove(projectId, hookId); -``` -Parameters: [Remove a hook](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/projects.md#delete-project-hook) - - diff --git a/docs/project-members.md b/docs/project-members.md deleted file mode 100644 index 64512fae..00000000 --- a/docs/project-members.md +++ /dev/null @@ -1,63 +0,0 @@ -## Project Members - -* [Get all members](#get-all-members) -* [Get a member](#get-a-member) -* [Add a member](#add-a-member) -* [Edit a member](#edit-a-member) -* [Remove a member](#remove-a-member) - - -### Get all members - -Gets a list of all project members viewable by the authenticated user. - -```javascript -let members = GitlabAPI.projects.members.all(projectId); -``` -**Parameters**: [Get all members](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/members.md#list-all-members-of-a-group-or-project) - -**Extra Parameters** - -| Argument | Description | Type | Required | Default | -|---------------|--------------------------|----------|----------|-------------------| -| max_pages |Limits the amount of pages returned | Number | No | All pages | - - -### Get a member - -Gets a member of a project. - -```javascript -let member = GitlabAPI.projects.members.show(projectId, memberId); -``` -**Parameters**: [Get a member](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/members.md#get-a-member-of-a-group-or-project) - - -### Add a member - -Adds a member to a project. - -```javascript -let member = GitlabAPI.projects.members.add(projectId, userId, accessLevel); -``` -**Parameters**: [Add a member](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/members.md#add-a-member-to-a-group-or-project) - - -### Edit a member - -Edits a member of a project. - -```javascript -let member = GitlabAPI.projects.members.edit(projectId, userId, accessLevel); -``` -**Parameters**: [Edit a member](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/members.md#add-a-member-to-a-group-or-project) - - -### Remove a member - -Removes a member of a project. - -```javascript -GitlabAPI.projects.members.remove(projectId, memberId); -``` -**Parameters**: [Remove a member](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/members.md#remove-a-member-to-a-group-or-project) diff --git a/docs/project-repository-files.md b/docs/project-repository-files.md deleted file mode 100644 index 6ca8d5eb..00000000 --- a/docs/project-repository-files.md +++ /dev/null @@ -1,14 +0,0 @@ -## Project Repository Files - -* [Get a file](#get-a-file) - -### Get a file - -Get file from repository - -```javascript -// From a project ID -let file = GitlabAPI.projects.repository.files.show(projectId, filePath, branch ); -``` -Parameters: [Get file from repository](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/repository_files.md#get-file-from-repository) - diff --git a/docs/project-triggers.md b/docs/project-triggers.md deleted file mode 100644 index f9424f05..00000000 --- a/docs/project-triggers.md +++ /dev/null @@ -1,67 +0,0 @@ -## Project Triggers - -* [Get all triggers](#get-all-triggers) -* [Get a trigger](#get-a-trigger) -* [Add a trigger](#add-a-trigger) -* [Edit a trigger](#edit-a-trigger) -* [Remove a trigger](#edit-a-trigger) - -### Get all project triggers - -Allow to share project with group. - -```javascript -// From a project ID -let triggers = GitlabAPI.projects.triggers.all(projectId); -``` -**Parameters**: [Get all project triggers](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/pipeline_triggers.md#list-project-triggers) - -**Extra Parameters** - -| Argument | Description | Type | Required | Default | -|---------------|--------------------------|----------|----------|-------------------| -| max_pages |Limits the amount of pages returned | Number | No | All pages | - -### Get a trigger - -Get details of project's build trigger. - -```javascript -// From a project ID -let trigger = GitlabAPI.projects.triggers.show(projectId, triggerId); -``` -**Parameters**: [Get trigger details](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/pipeline_triggers.md#get-trigger-details) - -### Add a trigger - -Create a trigger for a project. - -```javascript -// From a project ID -let trigger = GitlabAPI.projects.triggers.add(projectId, { - // params -}); -``` -**Parameters**: [Create a trigger](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/pipeline_triggers.md#create-a-project-trigger) - -### Edit a trigger - -Edit a trigger on a project. - -```javascript -// From a project ID -let trigger = GitlabAPI.projects.triggers.edit(projectId, triggerId, { - // params -}); -``` -**Parameters**: [Edit a trigger](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/pipeline_triggers.md#update-a-project-trigger) - -### Remove a trigger - -Remove a trigger from a project. - -```javascript -// From a project ID -let trigger = GitlabAPI.projects.triggers.remove(projectId, triggerId); -``` -**Parameters**: [Remove a trigger](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/pipeline_triggers.md#remove-a-project-trigger) diff --git a/docs/projects.md b/docs/projects.md deleted file mode 100644 index 8772cbdd..00000000 --- a/docs/projects.md +++ /dev/null @@ -1,172 +0,0 @@ - # Projects API - -* [Projects](#projects) - * [Get all projects](#get-all-projects) - * [Get a single project](#get-a-single-project) - * [Create a project](#create-a-project) - * [Create a project for user](#create-a-project-for-user) - * [Edit a project](#edit-a-project) - * [Fork a project](#fork-a-project) - * [Star a project](#star-a-project) - * [Unstar a project](#unstar-a-project) - * [Remove a project](#remove-a-project) - * [Search for a project](#search-for-a-project) - * [Post the build status to a commit](#post-the-build-startus-to-a-commit) - * [Share project with group](#share-project-with-group) - * [Unshare a project with a group](#unshare-a-project-with-a-group) -* [Project Members](https://github.com/jdalrymple/node-gitlab-api/blob/master/docs/project-members.md) -* [Project Triggers](https://github.com/jdalrymple/node-gitlab-api/blob/master/docs/project-triggers.md) -* [Project Hooks](https://github.com/jdalrymple/node-gitlab-api/blob/master/docs/project-hooks.md) -* [Project Repository Files](https://github.com/jdalrymple/node-gitlab-api/blob/master/docs/project-repository-files.md) - -## Projects - -### Get all projects - -Get a list of visible projects for authenticated user. When accessed without authentication, only public projects are returned. - -```javascript -let projects = GitlabAPI.projects.all(); -``` - -**Parameters**: [Get all projects](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/projects.md#list-projects) - -**Extra Parameters** - -| Argument | Description | Type | Required | Default | -|---------------|--------------------------|----------|----------|-------------------| -| max_pages |Limits the amount of pages returned | Number | No | All pages | - - -### Get a single project - -Get a specific project. This endpoint can be accessed without authentication if -the project is publicly accessible. - -```javascript -// From a project ID -let projectA = GitlabAPI.projects.show(21); - -// From a projects url -let projectB = GitlabAPI.projects.show('diaspora/diaspora'); -``` - -**Parameters**: [Get a single project](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/projects.md#get-single-project) - - -### Create a project - -Creates a new project owned by the authenticated user. - -```javascript -let projectA = GitlabAPI.projects.create({ - // params -}); -``` -**Parameters**: [Create a project](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/projects.md#create-project) - - -### Create a project for user - -Creates a new project owned by the specified user. Available only for admins. - -```javascript -let projectA = GitlabAPI.projects.create({ - userId: 5, - // params -}); -``` -**Parameters**: [Create a project for user](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/projects.md#create-project-for-user) - - -### Edit a project - -Creates a new project owned by the specified user. Available only for admins. - -```javascript -let projectA = GitlabAPI.projects.edit(projectId, { - // params -}); -``` -**Parameters**: [Edit a project](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/projects.md#edit-project) - - -### Fork a project - -Forks a project into the user namespace of the authenticated user or the one provided. - -```javascript -let projectA = GitlabAPI.projects.fork(projectId, { - // params -}); -``` -**Parameters**: [Fork a project](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/projects.md#fork-project) - - -### Star a project - -Stars a given project. Returns status code `304` if the project is already starred. - -```javascript -let projectA = GitlabAPI.projects.star(projectId); -``` -**Parameters**: [Star a project](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/projects.md#star-a-project) - - -### Unstar a project - -Unstars a given project. Returns status code `304` if the project is not starred. - -```javascript -let projectA = GitlabAPI.projects.unstar(projectId); -``` -**Parameters**: [Unstar a project](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/projects.md#unstar-a-project) - - -### Remove a project - -Removes a project including all associated resources (issues, merge requests etc.) - -```javascript -GitlabAPI.projects.remove(projectId); -``` -**Parameters**: [Remove a project](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/projects.md#remove-project) - -### Search for a project - -Search for projects by name which are accessible to the authenticated user. This endpoint can be accessed without authentication if the project is publicly accessible. - -```javascript -GitlabAPI.projects.search(query); -``` -**Parameters**: [Search for a project](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/projects.md#search-for-projects-by-name) - -### Post the build status to a commit - -Search for projects by name which are accessible to the authenticated user. This endpoint can be accessed without authentication if the project is publicly accessible. - -```javascript -GitlabAPI.projects.search(query); -``` -**Parameters**: [Search for a project](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/projects.md#search-for-projects-by-name) - - -### Share a project with a group - -Allow to share project with group. - -```javascript -GitlabAPI.projects.share(projectId, groupId, groupAccess, { - // params -}); -``` -**Parameters**: [Share a project with a group](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/projects.md#share-project-with-group) - -### Unshare a project with a group - -Unshare the project from the group. - -```javascript -GitlabAPI.projects.unshare(projectId, groupId); -``` -**Parameters**: [Unshare a project with a group](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/projects.md#delete-a-shared-project-within-group) diff --git a/package-lock.json b/package-lock.json index cd9582dd..ec5fcc7a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "node-gitlab-api", - "version": "2.2.7", + "version": "3.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1911,7 +1911,7 @@ "dev": true, "optional": true, "requires": { - "nan": "2.8.0", + "nan": "2.10.0", "node-pre-gyp": "0.6.39" }, "dependencies": { @@ -3461,9 +3461,9 @@ "dev": true }, "nan": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", - "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", "dev": true, "optional": true }, diff --git a/package.json b/package.json index 85cd2e15..2e788484 100644 --- a/package.json +++ b/package.json @@ -1,15 +1,16 @@ { "name": "node-gitlab-api", - "version": "2.2.8", + "version": "3.0.0", "description": "Full NodeJS implementation of the GitLab API. Supports Promises, Async/Await.", "main": "dist/latest/index.js", "engines": { - "node": ">=8.0.0" + "node": ">=8.9.0" }, "scripts": { - "build:es6": "babel src --out-dir dist/latest --config-file=./.babelrc", - "build:es5": "babel src --out-dir dist/es5 --config-file=./.babelrc-es5", - "build": "npm run build:es6 && npm run build:es5", + "build:clean": "rimraf -rf dist && mkdirp -p dist", + "build:es6": "babel src -d dist/latest --config-file=./.babelrc", + "build:es5": "babel src -d dist/es5 --config-file=./.babelrc-es5", + "build": "npm run build:clean && npm run build:es6 && npm run build:es5", "prepublishOnly": "npm run build" }, "repository": { diff --git a/src/API.js b/src/API.js deleted file mode 100644 index 3f72ca7e..00000000 --- a/src/API.js +++ /dev/null @@ -1,86 +0,0 @@ -import Request from 'request-promise'; -import URLJoin from 'url-join'; -import { Groups, Projects, Issues, Runners, Users, MergeRequests, Version } from './Models'; - -function defaultRequest(url, endpoint, { - headers, - body, - qs, - formData, - resolveWithFullResponse = false, -}) { - const params = { - url: URLJoin(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 = URLJoin(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/BaseModel.js b/src/Models/BaseModel.js deleted file mode 100644 index 8c0598e6..00000000 --- a/src/Models/BaseModel.js +++ /dev/null @@ -1,51 +0,0 @@ -import LinkParser from 'parse-link-header'; - -async function getAllPages(client, endpoint, options, results = []) { - const response = await client.get(endpoint, options, true); - - if (!response.headers['x-page']) { - return response.body; - } - - const links = LinkParser(response.headers.link); - const limit = options.max_pages ? response.headers['x-page'] < options.max_pages : true; - const moreResults = results.concat(response.body); - - if (links.next && limit) { - return getAllPages(client, links.next.url.replace(client.url, ''), options, moreResults); - } - - return moreResults; -} - -class BaseModel { - constructor(APIClient) { - this.client = APIClient; - } - - get(endpoint, options = {}) { - if (!options.page) { - return getAllPages(this.client, endpoint, options); - } - - 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); - } -} - -export default BaseModel; 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..4ab99fe6 100644 --- a/src/index.js +++ b/src/index.js @@ -1,3 +1,77 @@ -import API from './API'; +import Pick from 'lodash.pick'; +import * as APIServices from './services'; +import { Bundler } from './infrastructure'; -module.exports = ({ url, token, oauthToken }) => new API({ url, token, oauthToken }); +// All seperatly +export * from './services'; + +// Groups +export const GroupsBundler = Bundler(Pick(APIServices, [ + 'Groups', + 'GroupAccessRequests', + 'GroupBadges', + 'GroupCustomAttributes', + 'GroupIssueBoards', + 'GroupMembers', + 'GroupMilestones', + 'GroupProjects', + 'GroupVariables', + 'Epics', + 'EpicIssues', + 'EpicNotes', + 'EpicDiscussions', +])); + +// Users +export const UsersBundler = Bundler(Pick(APIServices, [ + 'Users', + 'UserEmails', + 'UserImpersonationTokens', + 'UserKeys', + 'UserGPGKeys', +])); + +// Projects +export const ProjectsBundler = Bundler(Pick(APIServices, [ + 'Branches', + 'Commits', + 'DeployKeys', + 'Deployments', + 'Environments', + 'Issues', + 'IssueAwardEmojis', + 'IssueNotes', + 'IssueDiscussions', + 'Jobs', + 'Labels', + 'MergeRequests', + 'MergeRequestAwardEmojis', + 'MergeRequestNotes', + 'Pipelines', + 'PipelineSchedules', + 'PipelineScheduleVariables', + 'Projects', + 'ProjectAccessRequests', + 'ProjectBadges', + 'ProjectCustomAttributes', + 'ProjectImportExport', + 'ProjectIssueBoards', + 'ProjectHooks', + 'ProjectMembers', + 'ProjectMilestones', + 'ProjectSnippet', + 'ProjectSnippetNotes', + 'ProjectSnippetDiscussions', + 'ProjectSnippetAwardEmojis', + 'ProtectedBranches', + 'ProjectVariables', + 'Repositories', + 'RepositoryFiles', + 'Runners', + 'Services', + 'Tags', + 'Triggers', +])); + +// All initialized +export default Bundler(APIServices); diff --git a/src/infrastructure/BaseService.js b/src/infrastructure/BaseService.js new file mode 100644 index 00000000..cdbf78cc --- /dev/null +++ b/src/infrastructure/BaseService.js @@ -0,0 +1,18 @@ +import URLJoin from 'url-join'; + +class BaseModel { + constructor({ url = 'https://gitlab.com', token, oauthToken }) { + this.url = URLJoin(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'); + } + } +} + +export default BaseModel; diff --git a/src/infrastructure/Bundler.js b/src/infrastructure/Bundler.js new file mode 100644 index 00000000..8552f9df --- /dev/null +++ b/src/infrastructure/Bundler.js @@ -0,0 +1,13 @@ +function Bundler(...services) { + const combined = Object.assign({}, ...services); + + return class Bundle { + constructor(options) { + Object.entries(combined).forEach(([name, Service]) => { + this[name] = new Service(options); + }); + } + }; +} + +export default Bundler; diff --git a/src/infrastructure/RequestHelper.js b/src/infrastructure/RequestHelper.js new file mode 100644 index 00000000..5fee2a0e --- /dev/null +++ b/src/infrastructure/RequestHelper.js @@ -0,0 +1,72 @@ +import Request from 'request-promise'; +import Humps from 'humps'; +import LinkParser from 'parse-link-header'; +import URLJoin from 'url-join'; + +function defaultRequest( + url, + endpoint, + { headers, body, qs, formData, resolveWithFullResponse = false }, +) { + const params = { + url: URLJoin(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 async get(service, endpoint, options = {}) { + const response = await Request.get(defaultRequest(service.url, endpoint, { + headers: service.headers, + qs: options, + resolveWithFullResponse: true, + })); + + const links = LinkParser(response.headers.link); + const page = response.headers['x-page']; + const limit = options.maxPages ? page < options.maxPages : true; + let more = []; + + if (page && limit && links.next) { + more = await RequestHelper.get(service, links.next.url.replace(service.url, ''), options); + + return [...response.body, ...more]; + } + + return response.body; + } + + 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..c86864be --- /dev/null +++ b/src/infrastructure/index.js @@ -0,0 +1,3 @@ +export BaseService from './BaseService'; +export RequestHelper from './RequestHelper'; +export Bundler from './Bundler'; diff --git a/src/services/ApplicationSettings.js b/src/services/ApplicationSettings.js new file mode 100644 index 00000000..d284898d --- /dev/null +++ b/src/services/ApplicationSettings.js @@ -0,0 +1,13 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +class ApplicationSettings extends BaseService { + all() { + return RequestHelper.get(this, 'application/settings'); + } + + edit(options) { + return RequestHelper.post(this, 'application/settings', options); + } +} + +export default ApplicationSettings; diff --git a/src/services/Branches.js b/src/services/Branches.js new file mode 100644 index 00000000..f0ba0f07 --- /dev/null +++ b/src/services/Branches.js @@ -0,0 +1,48 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +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/BroadcastMessages.js b/src/services/BroadcastMessages.js new file mode 100644 index 00000000..9b48ae8a --- /dev/null +++ b/src/services/BroadcastMessages.js @@ -0,0 +1,31 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +class BroadcastMessages extends BaseService { + all(options) { + return RequestHelper.get(this, 'broadcast_messages', options); + } + + create(options) { + return RequestHelper.post(this, 'broadcast_messages', options); + } + + edit(broadcastMessageId, options) { + const bId = encodeURIComponent(broadcastMessageId); + + return RequestHelper.put(this, `broadcast_messages/${bId}`, options); + } + + remove(broadcastMessageId) { + const bId = encodeURIComponent(broadcastMessageId); + + return RequestHelper.delete(this, `broadcast_messages/${bId}`); + } + + show(broadcastMessageId, options) { + const bId = encodeURIComponent(broadcastMessageId); + + return RequestHelper.get(this, `broadcast_messages/${bId}`, options); + } +} + +export default BroadcastMessages; diff --git a/src/services/Commits.js b/src/services/Commits.js new file mode 100644 index 00000000..f0ea6f0f --- /dev/null +++ b/src/services/Commits.js @@ -0,0 +1,73 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +class Commits extends BaseService { + all(projectId, options) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/repository/commits`, options); + } + + cherryPick(projectId, sha, branch) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.post(this, `projects/${pId}/repository/commits/${sha}/cherry_pick`, { branch }); + } + + comments(projectId, sha) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/repository/commits/${sha}/comments`); + } + + create(projectId, branch, message, actions = [], options) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.post(this, `projects/${pId}/repository/commits`, { + branch, + commitMessage: message, + actions, + ...options, + }); + } + + createComment(projectId, sha, note, options) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.post(this, `projects/${pId}/repository/commits/${sha}/comments`, { + note, + ...options, + }); + } + + diff(projectId, sha) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/repository/commits/${sha}/diff`); + } + + editStatus(projectId, sha, options) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/repository/commits/${sha}/statuses`, options); + } + + references(projectId, sha) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/repository/commits/${sha}/refs`); + } + + show(projectId, sha) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/repository/commits/${sha}`); + } + + status(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..4236d2eb --- /dev/null +++ b/src/services/DeployKeys.js @@ -0,0 +1,23 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +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/Deployments.js b/src/services/Deployments.js new file mode 100644 index 00000000..08c5c878 --- /dev/null +++ b/src/services/Deployments.js @@ -0,0 +1,17 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +class Deployments extends BaseService { + all(projectId, options) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/deployments`, options); + } + + show(projectId, deploymentId) { + const [pId, dId] = [projectId, deploymentId].map(encodeURIComponent); + + return RequestHelper.post(this, `projects/${pId}/deployments/${dId}`); + } +} + +export default Deployments; diff --git a/src/services/Environments.js b/src/services/Environments.js new file mode 100644 index 00000000..b8e8a774 --- /dev/null +++ b/src/services/Environments.js @@ -0,0 +1,35 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +class Environments extends BaseService { + all(projectId, options) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/environments`, options); + } + + create(projectId, options) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.post(this, `projects/${pId}/environments`, options); + } + + edit(projectId, environmentId, options) { + const [pId, eId] = [projectId, environmentId].map(encodeURIComponent); + + return RequestHelper.put(this, `projects/${pId}/environments/${eId}`, options); + } + + remove(projectId, environmentId) { + const [pId, eId] = [projectId, environmentId].map(encodeURIComponent); + + return RequestHelper.delete(this, `projects/${pId}/environments/${eId}`); + } + + stop(projectId, environmentId) { + const [pId, eId] = [projectId, environmentId].map(encodeURIComponent); + + return RequestHelper.post(this, `projects/${pId}/environments/${eId}/stop`); + } +} + +export default Environments; diff --git a/src/services/EpicDiscussions.js b/src/services/EpicDiscussions.js new file mode 100644 index 00000000..eb96930d --- /dev/null +++ b/src/services/EpicDiscussions.js @@ -0,0 +1,9 @@ +import { ResourceDiscussions } from '../templates'; + +class EpicDiscussions extends ResourceDiscussions { + constructor(options) { + super('groups', 'epics', options); + } +} + +export default EpicDiscussions; diff --git a/src/services/EpicIssues.js b/src/services/EpicIssues.js new file mode 100644 index 00000000..d663b77d --- /dev/null +++ b/src/services/EpicIssues.js @@ -0,0 +1,29 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +class EpicIssues extends BaseService { + all(groupId, epicId) { + const [gId, eId] = [groupId, epicId].map(encodeURIComponent); + + return RequestHelper.get(this, `groups/${gId}/epics/${eId}/issues`); + } + + assign(groupId, epicId, issueId) { + const [gId, eId, iId] = [groupId, epicId, issueId].map(encodeURIComponent); + + return RequestHelper.put(this, `groups/${gId}/epics/${eId}/issues/${iId}`); + } + + edit(groupId, epicId, issueId, options) { + const [gId, eId, iId] = [groupId, epicId, issueId].map(encodeURIComponent); + + return RequestHelper.delete(this, `groups/${gId}/epics/${eId}/issues/${iId}`, options); + } + + remove(groupId, epicId, issueId) { + const [gId, eId, iId] = [groupId, epicId, issueId].map(encodeURIComponent); + + return RequestHelper.delete(this, `groups/${gId}/epics/${eId}/issues/${iId}`); + } +} + +export default EpicIssues; diff --git a/src/services/EpicNotes.js b/src/services/EpicNotes.js new file mode 100644 index 00000000..5b836e74 --- /dev/null +++ b/src/services/EpicNotes.js @@ -0,0 +1,9 @@ +import { ResourceNotes } from '../templates'; + +class EpicNotes extends ResourceNotes { + constructor(options) { + super('groups', 'epics', options); + } +} + +export default EpicNotes; diff --git a/src/services/Epics.js b/src/services/Epics.js new file mode 100644 index 00000000..9c292309 --- /dev/null +++ b/src/services/Epics.js @@ -0,0 +1,35 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +class Epics extends BaseService { + all(groupId) { + const gId = encodeURIComponent(groupId); + + return RequestHelper.get(this, `groups/${gId}/epics`); + } + + create(groupId, title, options) { + const gId = encodeURIComponent(groupId); + + return RequestHelper.post(this, `groups/${gId}/epics`, { title, ...options }); + } + + edit(groupId, epicId, options) { + const [gId, eId] = [groupId, epicId].map(encodeURIComponent); + + return RequestHelper.put(this, `groups/${gId}/epics/${eId}`, options); + } + + remove(groupId, epicId) { + const [gId, eId] = [groupId, epicId].map(encodeURIComponent); + + return RequestHelper.delete(this, `groups/${gId}/epics/${eId}`); + } + + show(groupId, epicId) { + const [gId, eId] = [groupId, epicId].map(encodeURIComponent); + + return RequestHelper.get(this, `groups/${gId}/epics/${eId}`); + } +} + +export default Epics; diff --git a/src/services/Events.js b/src/services/Events.js new file mode 100644 index 00000000..2f80c234 --- /dev/null +++ b/src/services/Events.js @@ -0,0 +1,46 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +const ACTION_TYPES = [ + 'created', + 'updated', + 'closed', + 'reopened', + 'pushed', + 'commented', + 'merged', + 'joined', + 'left', + 'destroyed', + 'expired', +]; + +const TARGET_TYPES = [ + 'issue', + 'milestone', + 'merge_request', + 'note', + 'project', + 'snippet', + 'user', +]; + +function validateEventOptions(action, target) { + if (!ACTION_TYPES.includes(action)) { + throw new Error(`This action is not supported. Pleased use one of following options: ${ACTION_TYPES}`); + } + + if (!TARGET_TYPES.includes(target)) { + throw new Error(`This target is not supported. Pleased use one of following options: ${TARGET_TYPES}`); + } +} + +class Events extends BaseService { + all(options) { + validateEventOptions(options.action, options.targetType); + + return RequestHelper.get(this, 'events', options); + } +} + +export default Events; +export { validateEventOptions }; diff --git a/src/services/FeatureFlags.js b/src/services/FeatureFlags.js new file mode 100644 index 00000000..6105fd91 --- /dev/null +++ b/src/services/FeatureFlags.js @@ -0,0 +1,15 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +class FeatureFlags extends BaseService { + all(options) { + return RequestHelper.get(this, 'features', options); + } + + set(name, options) { + const encodedName = encodeURIComponent(name); + + return RequestHelper.post(this, `features/${encodedName}`, options); + } +} + +export default FeatureFlags; diff --git a/src/services/GeoNodes.js b/src/services/GeoNodes.js new file mode 100644 index 00000000..1ac8fd0b --- /dev/null +++ b/src/services/GeoNodes.js @@ -0,0 +1,47 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +class GeoNodes extends BaseService { + all(options) { + return RequestHelper.get(this, 'geo_nodes', options); + } + + create(geonodeId, options) { + const gId = encodeURIComponent(geonodeId); + + return RequestHelper.post(this, `geo_nodes/${gId}`, options); + } + + edit(geonodeId, options) { + const gId = encodeURIComponent(geonodeId); + + return RequestHelper.put(this, `geo_nodes/${gId}`, options); + } + + failures(options) { + return RequestHelper.post(this, 'geo_nodes/current/failures', options); + } + + repair(geonodeId, options) { + const gId = encodeURIComponent(geonodeId); + + return RequestHelper.delete(this, `geo_nodes/${gId}`, options); + } + + show(geonodeId, options) { + const gId = encodeURIComponent(geonodeId); + + return RequestHelper.get(this, `geo_nodes/${gId}`, options); + } + + status(geonodeId, options) { + const gId = encodeURIComponent(geonodeId); + + return RequestHelper.get(this, `geo_nodes/${gId}/status`, options); + } + + statuses(options) { + return RequestHelper.get(this, 'geo_nodes/statuses', options); + } +} + +export default GeoNodes; diff --git a/src/services/GitLabCIYMLTemplates.js b/src/services/GitLabCIYMLTemplates.js new file mode 100644 index 00000000..29629042 --- /dev/null +++ b/src/services/GitLabCIYMLTemplates.js @@ -0,0 +1,9 @@ +import { ResourceTemplates } from '../templates'; + +class GitLabCIYMLTemplates extends ResourceTemplates { + constructor(options) { + super('gitlab_ci_ymls', options); + } +} + +export default GitLabCIYMLTemplates; diff --git a/src/services/GitignoreTemplates.js b/src/services/GitignoreTemplates.js new file mode 100644 index 00000000..2287f7e8 --- /dev/null +++ b/src/services/GitignoreTemplates.js @@ -0,0 +1,9 @@ +import { ResourceTemplates } from '../templates'; + +class GitignoreTemplates extends ResourceTemplates { + constructor(options) { + super('gitignores', options); + } +} + +export default GitignoreTemplates; diff --git a/src/services/GroupAccessRequests.js b/src/services/GroupAccessRequests.js new file mode 100644 index 00000000..b6a5327f --- /dev/null +++ b/src/services/GroupAccessRequests.js @@ -0,0 +1,9 @@ +import { ResourceAccessRequests } from '../templates'; + +class GroupAccessRequests extends ResourceAccessRequests { + constructor(options) { + super('groups', options); + } +} + +export default GroupAccessRequests; diff --git a/src/services/GroupBadges.js b/src/services/GroupBadges.js new file mode 100644 index 00000000..3ff390e9 --- /dev/null +++ b/src/services/GroupBadges.js @@ -0,0 +1,9 @@ +import { ResourceBadges } from '../templates'; + +class GroupBadges extends ResourceBadges { + constructor(options) { + super('groups', options); + } +} + +export default GroupBadges; diff --git a/src/services/GroupCustomAttributes.js b/src/services/GroupCustomAttributes.js new file mode 100644 index 00000000..6a9a05d5 --- /dev/null +++ b/src/services/GroupCustomAttributes.js @@ -0,0 +1,9 @@ +import { ResourceCustomAttributes } from '../templates'; + +class GroupCustomAttributes extends ResourceCustomAttributes { + constructor(options) { + super('groups', options); + } +} + +export default GroupCustomAttributes; diff --git a/src/services/GroupIssueBoards.js b/src/services/GroupIssueBoards.js new file mode 100644 index 00000000..88c6cd85 --- /dev/null +++ b/src/services/GroupIssueBoards.js @@ -0,0 +1,9 @@ +import { ResourceIssueBoards } from '../templates'; + +class GroupIssueBoards extends ResourceIssueBoards { + constructor(options) { + super('groups', options); + } +} + +export default GroupIssueBoards; diff --git a/src/services/GroupMembers.js b/src/services/GroupMembers.js new file mode 100644 index 00000000..a76c0919 --- /dev/null +++ b/src/services/GroupMembers.js @@ -0,0 +1,9 @@ +import { ResourceMembers } from '../templates'; + +class GroupMembers extends ResourceMembers { + constructor(options) { + super('groups', options); + } +} + +export default GroupMembers; diff --git a/src/services/GroupMilestones.js b/src/services/GroupMilestones.js new file mode 100644 index 00000000..b13306c1 --- /dev/null +++ b/src/services/GroupMilestones.js @@ -0,0 +1,9 @@ +import { ResourceMilestones } from '../templates'; + +class GroupMilestones extends ResourceMilestones { + constructor(options) { + super('groups', options); + } +} + +export default GroupMilestones; diff --git a/src/services/GroupProjects.js b/src/services/GroupProjects.js new file mode 100644 index 00000000..cf85ae94 --- /dev/null +++ b/src/services/GroupProjects.js @@ -0,0 +1,17 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +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/GroupVariables.js b/src/services/GroupVariables.js new file mode 100644 index 00000000..28f12466 --- /dev/null +++ b/src/services/GroupVariables.js @@ -0,0 +1,9 @@ +import { ResourceVariables } from '../templates'; + +class GroupVariables extends ResourceVariables { + constructor(options) { + super('groups', null, options); + } +} + +export default GroupVariables; diff --git a/src/services/Groups.js b/src/services/Groups.js new file mode 100644 index 00000000..fa451599 --- /dev/null +++ b/src/services/Groups.js @@ -0,0 +1,37 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +class Groups extends BaseService { + all(options) { + return RequestHelper.get(this, 'groups', options); + } + + 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, + }); + } + + show(groupId) { + const gId = encodeURIComponent(groupId); + + return RequestHelper.get(this, `groups/${gId}`); + } + + subgroups(groupId, options) { + const gId = encodeURIComponent(groupId); + + return RequestHelper.get(this, `groups/${gId}/subgroups`, options); + } +} + +export default Groups; diff --git a/src/services/IssueAwardEmojis.js b/src/services/IssueAwardEmojis.js new file mode 100644 index 00000000..02d237bb --- /dev/null +++ b/src/services/IssueAwardEmojis.js @@ -0,0 +1,9 @@ +import { ResourceAwardEmojis } from '../templates'; + +class IssueAwardEmojis extends ResourceAwardEmojis { + constructor(options) { + super('issues', options); + } +} + +export default IssueAwardEmojis; diff --git a/src/services/IssueDiscussions.js b/src/services/IssueDiscussions.js new file mode 100644 index 00000000..95f0aeb3 --- /dev/null +++ b/src/services/IssueDiscussions.js @@ -0,0 +1,9 @@ +import { ResourceDiscussions } from '../templates'; + +class IssueDiscussions extends ResourceDiscussions { + constructor(options) { + super('projects', 'issues', options); + } +} + +export default IssueDiscussions; diff --git a/src/services/IssueNotes.js b/src/services/IssueNotes.js new file mode 100644 index 00000000..6b59b040 --- /dev/null +++ b/src/services/IssueNotes.js @@ -0,0 +1,9 @@ +import { ResourceNotes } from '../templates'; + +class IssueNotes extends ResourceNotes { + constructor(options) { + super('projects', 'issues', options); + } +} + +export default IssueNotes; diff --git a/src/services/Issues.js b/src/services/Issues.js new file mode 100644 index 00000000..09fe1249 --- /dev/null +++ b/src/services/Issues.js @@ -0,0 +1,58 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +class Issues extends BaseService { + all({ projectId, ...options }) { + const url = projectId ? `projects/${encodeURIComponent(projectId)}/issues` : 'issues'; + + return RequestHelper.get(this, url, 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`, { + targetProjectId: targetpId, + targetIssueId: 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..378eaa8d --- /dev/null +++ b/src/services/Jobs.js @@ -0,0 +1,11 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +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/Keys.js b/src/services/Keys.js new file mode 100644 index 00000000..ece15fc6 --- /dev/null +++ b/src/services/Keys.js @@ -0,0 +1,11 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +class Keys extends BaseService { + show(keyId) { + const kId = encodeURIComponent(keyId); + + return RequestHelper.get(this, `keys/${kId}`); + } +} + +export default Keys; diff --git a/src/services/Labels.js b/src/services/Labels.js new file mode 100644 index 00000000..7eea6010 --- /dev/null +++ b/src/services/Labels.js @@ -0,0 +1,41 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +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`, { 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/Licence.js b/src/services/Licence.js new file mode 100644 index 00000000..d002d823 --- /dev/null +++ b/src/services/Licence.js @@ -0,0 +1,13 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +class Licence extends BaseService { + all() { + return RequestHelper.get(this, 'licence'); + } + + create() { + return RequestHelper.post(this, 'licence'); + } +} + +export default Licence; diff --git a/src/services/LicenceTemplates.js b/src/services/LicenceTemplates.js new file mode 100644 index 00000000..144cebf2 --- /dev/null +++ b/src/services/LicenceTemplates.js @@ -0,0 +1,9 @@ +import { ResourceTemplates } from '../templates'; + +class LicenceTemplates extends ResourceTemplates { + constructor(options) { + super('licences', options); + } +} + +export default LicenceTemplates; diff --git a/src/services/Lint.js b/src/services/Lint.js new file mode 100644 index 00000000..98cb6885 --- /dev/null +++ b/src/services/Lint.js @@ -0,0 +1,9 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +class Lint extends BaseService { + lint(content) { + return RequestHelper.post(this, 'lint', { content }); + } +} + +export default Lint; diff --git a/src/services/MergeRequestAwardEmojis.js b/src/services/MergeRequestAwardEmojis.js new file mode 100644 index 00000000..0ed72027 --- /dev/null +++ b/src/services/MergeRequestAwardEmojis.js @@ -0,0 +1,9 @@ +import { ResourceAwardEmojis } from '../templates'; + +class MergeRequestAwardEmojis extends ResourceAwardEmojis { + constructor(options) { + super('issues', options); + } +} + +export default MergeRequestAwardEmojis; diff --git a/src/services/MergeRequestNotes.js b/src/services/MergeRequestNotes.js new file mode 100644 index 00000000..44c68dd5 --- /dev/null +++ b/src/services/MergeRequestNotes.js @@ -0,0 +1,9 @@ +import { ResourceNotes } from '../templates'; + +class MergeRequestNotes extends ResourceNotes { + constructor(options) { + super('projects', 'mergerequests', options); + } +} + +export default MergeRequestNotes; diff --git a/src/services/MergeRequests.js b/src/services/MergeRequests.js new file mode 100644 index 00000000..ed62dd97 --- /dev/null +++ b/src/services/MergeRequests.js @@ -0,0 +1,162 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +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); + } + + approve(projectId, mergerequestId, { sha }) { + const [pId, mId] = [projectId, mergerequestId].map(encodeURIComponent); + + return RequestHelper.post(this, `projects/${pId}/merge_requests/${mId}/approve`, { sha }); + } + + approvals(projectId, { mergerequestId } = {}) { + const pId = encodeURIComponent(projectId); + const mergeRequest = mergerequestId ? `merge_requests/${encodeURIComponent(mergerequestId)}` : ''; + + return RequestHelper.get(this, `projects/${pId}/${mergeRequest}/approvals`); + } + + all({ projectId, ...options } = {}) { + const url = projectId ? `projects/${encodeURIComponent(projectId)}/merge_requests` : 'merge_requests'; + + return RequestHelper.get(this, url, 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`, { + id: pId, + sourceBranch, + targetBranch, + title, + ...options, + }); + } + + edit(projectId, mergerequestId, options) { + const [pId, mId] = [projectId, mergerequestId].map(encodeURIComponent); + + return RequestHelper.put(this, `projects/${pId}/merge_requests/${mId}`, options); + } + + editApprovals(projectId, { mergerequestId, ...options }) { + const pId = encodeURIComponent(projectId); + const mergeRequest = mergerequestId ? `merge_requests/${encodeURIComponent(mergerequestId)}` : ''; + + return RequestHelper.get(this, `projects/${pId}/${mergeRequest}approvals`, options); + } + + editApprovers(projectId, { mergerequestId, ...options }) { + const pId = encodeURIComponent(projectId); + const mergeRequest = mergerequestId ? `merge_requests/${encodeURIComponent(mergerequestId)}` : ''; + + return RequestHelper.get(this, `projects/${pId}/${mergeRequest}approvers`, 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`); + } + + version(projectId, mergerequestId, versionId) { + const [pId, mId, vId] = [projectId, mergerequestId, versionId].map(encodeURIComponent); + + return RequestHelper.get(this, `projects/${pId}/merge_requests/${mId}/versions/${vId}`); + } + + versions(projectId, mergerequestId) { + const [pId, mId] = [projectId, mergerequestId].map(encodeURIComponent); + + return RequestHelper.get(this, `projects/${pId}/merge_requests/${mId}/versions`); + } + + unapprove(projectId, mergerequestId) { + const [pId, mId] = [projectId, mergerequestId].map(encodeURIComponent); + + return RequestHelper.post(this, `projects/${pId}/merge_requests/${mId}/approve`); + } + + 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/Namespaces.js b/src/services/Namespaces.js new file mode 100644 index 00000000..a9d264f6 --- /dev/null +++ b/src/services/Namespaces.js @@ -0,0 +1,15 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +class Namespaces extends BaseService { + all(options) { + return RequestHelper.get(this, 'namespaces', options); + } + + show(namespaceId) { + const nId = encodeURIComponent(namespaceId); + + return RequestHelper.get(this, `namespaces/${nId}`); + } +} + +export default Namespaces; diff --git a/src/services/NotificationSettings.js b/src/services/NotificationSettings.js new file mode 100644 index 00000000..8d4c384d --- /dev/null +++ b/src/services/NotificationSettings.js @@ -0,0 +1,61 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +const LEVELS = { + DISABLED: 'disabled', + PARTICIPATING: 'participating', + WATCH: 'watch', + GLOBAL: 'global', + MENTION: 'mention', + CUSTOM: 'custom', +}; + +const EVENTS = { + NEW_NOTE: 'new_note', + NEW_ISSUE: 'new_issue', + REOPEM_ISSUE: 'reopen_issue', + CLOSE_ISSUE: 'close_issue', + REASSIGN_ISSUE: 'reassign_issue', + NEW_MERGE_REQUESTS: 'new_merge_request', + PUSH_TO_MERGE_REQUEST: 'push_to_merge_request', + REOPEN_MERGE_REQUESTS: 'reopen_merge_request', + CLOSE_MERGE_REQUEST: 'close_merge_request', + REASSIGN_MERGE_REQUEST: 'reassign_merge_request', + MERGE_MERGE_REQUEST: 'merge_merge_request', + FAILED_PIPELINE: 'failed_pipeline', + SUCCESS_PIPELINE: 'success_pipeline', +}; + +class NotificationSettings extends BaseService { + constructor(...args) { + super(...args); + + this.LEVELS = LEVELS; + this.EVENTS = EVENTS; + } + + all({ projectId, groupId } = {}) { + let url; + + if (projectId) { + url += `projects/${encodeURIComponent(projectId)}/`; + } else if (groupId) { + url += `groups/${encodeURIComponent(groupId)}/`; + } + + return RequestHelper.get(this, `${url}notification_settings`); + } + + edit(options, { projectId, groupId } = {}) { + let url; + + if (projectId) { + url += `projects/${encodeURIComponent(projectId)}/`; + } else if (groupId) { + url += `groups/${encodeURIComponent(groupId)}/`; + } + + return RequestHelper.put(this, `${url}notification_settings`, options); + } +} + +export default NotificationSettings; diff --git a/src/services/PagesDomains.js b/src/services/PagesDomains.js new file mode 100644 index 00000000..7aaa7989 --- /dev/null +++ b/src/services/PagesDomains.js @@ -0,0 +1,35 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +class PagesDomains extends BaseService { + all({ projectId } = {}) { + const url = projectId ? `projects/${encodeURIComponent(projectId)}/` : ''; + + return RequestHelper.get(this, `${url}page/domains`); + } + + create(projectId, domain, options) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.post(this, `projects/${pId}/pages/domains`, { domain, ...options }); + } + + edit(projectId, domain, options) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.put(this, `projects/${pId}/pages/domains/${domain}`, options); + } + + show(projectId, domain) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/pages/domains/${domain}`); + } + + remove(projectId, domain) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.delete(this, `projects/${pId}/pages/domains/${domain}`); + } +} + +export default PagesDomains; diff --git a/src/services/PipelineScheduleVariables.js b/src/services/PipelineScheduleVariables.js new file mode 100644 index 00000000..a05f6e3b --- /dev/null +++ b/src/services/PipelineScheduleVariables.js @@ -0,0 +1,9 @@ +import { ResourceVariables } from '../templates'; + +class PipelineScheduleVariables extends ResourceVariables { + constructor(options) { + super('projects', 'pipelines', options); + } +} + +export default PipelineScheduleVariables; diff --git a/src/services/PipelineSchedules.js b/src/services/PipelineSchedules.js new file mode 100644 index 00000000..e2b48cc2 --- /dev/null +++ b/src/services/PipelineSchedules.js @@ -0,0 +1,46 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +class PipelineSchedules extends BaseService { + all(projectId, options) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/pipeline_schedules`, options); + } + + create(projectId, description, ref, cron, options) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.post(this, `projects/${pId}/pipeline_schedules`, { + description, + ref, + cron, + ...options, + }); + } + + edit(projectId, scheduleId, options) { + const [pId, sId] = [projectId, scheduleId].map(encodeURIComponent); + + return RequestHelper.put(this, `projects/${pId}/pipeline_schedules/${sId}`, options); + } + + remove(projectId, scheduleId) { + const [pId, sId] = [projectId, scheduleId].map(encodeURIComponent); + + return RequestHelper.delete(this, `projects/${pId}/pipeline_schedules/${sId}`); + } + + show(projectId, scheduleId) { + const [pId, sId] = [projectId, scheduleId].map(encodeURIComponent); + + return RequestHelper.get(this, `projects/${pId}/pipeline_schedules/${sId}`); + } + + takeOwnership(projectId, scheduleId) { + const [pId, sId] = [projectId, scheduleId].map(encodeURIComponent); + + return RequestHelper.post(this, `projects/${pId}/pipeline_schedules/${sId}/take_ownership`); + } +} + +export default PipelineSchedules; diff --git a/src/services/Pipelines.js b/src/services/Pipelines.js new file mode 100644 index 00000000..86b08066 --- /dev/null +++ b/src/services/Pipelines.js @@ -0,0 +1,11 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +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..39c686ac --- /dev/null +++ b/src/services/ProjectAccessRequests.js @@ -0,0 +1,9 @@ +import { ResourceAccessRequests } from '../templates'; + +class ProjectAccessRequests extends ResourceAccessRequests { + constructor(options) { + super('projects', options); + } +} + +export default ProjectAccessRequests; diff --git a/src/services/ProjectBadges.js b/src/services/ProjectBadges.js new file mode 100644 index 00000000..db18dd5e --- /dev/null +++ b/src/services/ProjectBadges.js @@ -0,0 +1,9 @@ +import { ResourceBadges } from '../templates'; + +class ProjectBadges extends ResourceBadges { + constructor(options) { + super('projects', options); + } +} + +export default ProjectBadges; diff --git a/src/services/ProjectCustomAttributes.js b/src/services/ProjectCustomAttributes.js new file mode 100644 index 00000000..6f3bb339 --- /dev/null +++ b/src/services/ProjectCustomAttributes.js @@ -0,0 +1,9 @@ +import { ResourceCustomAttributes } from '../templates'; + +class ProjectCustomAttributes extends ResourceCustomAttributes { + constructor(options) { + super('projects', options); + } +} + +export default ProjectCustomAttributes; diff --git a/src/services/ProjectHooks.js b/src/services/ProjectHooks.js new file mode 100644 index 00000000..5fe4c5d0 --- /dev/null +++ b/src/services/ProjectHooks.js @@ -0,0 +1,35 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +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`, { url, ...options }); + } + + edit(projectId, hookId, url, options) { + const [pId, hId] = [projectId, hookId].map(encodeURIComponent); + + return RequestHelper.put(this, `projects/${pId}/hooks/${hId}`, { 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/ProjectImportExport.js b/src/services/ProjectImportExport.js new file mode 100644 index 00000000..33ba23f9 --- /dev/null +++ b/src/services/ProjectImportExport.js @@ -0,0 +1,33 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +class ProjectImportExport extends BaseService { + download(projectId) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/export/download`); + } + + exportStatus(projectId) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/export`); + } + + import(file, path, options) { + return RequestHelper.post(this, 'projects/import', { file, path, ...options }); + } + + importStatus(projectId) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/import`); + } + + schedule(projectId, options) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.post(this, `projects/${pId}/export`, options); + } +} + +export default ProjectImportExport; diff --git a/src/services/ProjectIssueBoards.js b/src/services/ProjectIssueBoards.js new file mode 100644 index 00000000..40a0728a --- /dev/null +++ b/src/services/ProjectIssueBoards.js @@ -0,0 +1,9 @@ +import { ResourceIssueBoards } from '../templates'; + +class ProjectIssueBoards extends ResourceIssueBoards { + constructor(options) { + super('products', options); + } +} + +export default ProjectIssueBoards; diff --git a/src/services/ProjectMembers.js b/src/services/ProjectMembers.js new file mode 100644 index 00000000..59c8acb5 --- /dev/null +++ b/src/services/ProjectMembers.js @@ -0,0 +1,9 @@ +import { ResourceMembers } from '../templates'; + +class ProjectMembers extends ResourceMembers { + constructor(options) { + super('projects', options); + } +} + +export default ProjectMembers; diff --git a/src/services/ProjectMilestones.js b/src/services/ProjectMilestones.js new file mode 100644 index 00000000..300687a3 --- /dev/null +++ b/src/services/ProjectMilestones.js @@ -0,0 +1,9 @@ +import { ResourceMilestones } from '../templates'; + +class ProjectMilestones extends ResourceMilestones { + constructor(options) { + super('projects', options); + } +} + +export default ProjectMilestones; diff --git a/src/services/ProjectSnippetAwardEmojis.js b/src/services/ProjectSnippetAwardEmojis.js new file mode 100644 index 00000000..c3be063e --- /dev/null +++ b/src/services/ProjectSnippetAwardEmojis.js @@ -0,0 +1,9 @@ +import { ResourceAwardEmojis } from '../templates'; + +class ProjectSnippetAwardEmojis extends ResourceAwardEmojis { + constructor(options) { + super('issues', options); + } +} + +export default ProjectSnippetAwardEmojis; diff --git a/src/services/ProjectSnippetDiscussions.js b/src/services/ProjectSnippetDiscussions.js new file mode 100644 index 00000000..ac6f074b --- /dev/null +++ b/src/services/ProjectSnippetDiscussions.js @@ -0,0 +1,9 @@ +import { ResourceDiscussions } from '../templates'; + +class ProjectSnippetDiscussions extends ResourceDiscussions { + constructor(options) { + super('projects', 'snippets', options); + } +} + +export default ProjectSnippetDiscussions; diff --git a/src/services/ProjectSnippetNotes.js b/src/services/ProjectSnippetNotes.js new file mode 100644 index 00000000..3d2feb0d --- /dev/null +++ b/src/services/ProjectSnippetNotes.js @@ -0,0 +1,9 @@ +import { ResourceNotes } from '../templates'; + +class ProjectSnippetNotes extends ResourceNotes { + constructor(options) { + super('projects', 'snippets', options); + } +} + +export default ProjectSnippetNotes; diff --git a/src/services/ProjectSnippets.js b/src/services/ProjectSnippets.js new file mode 100644 index 00000000..b393f96a --- /dev/null +++ b/src/services/ProjectSnippets.js @@ -0,0 +1,60 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +const VISIBILITY_LEVELS = { + PRIVATE: 'private', + INTERNAL: 'internal', + PUBLIC: 'public', +}; + +class ProjectSnippets extends BaseService { + all(projectId, options = {}) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/snippets`, options); + } + + content(projectId, snippetId) { + const [pId, sId] = [projectId, snippetId].map(encodeURIComponent); + + return RequestHelper.get(this, `projects/${pId}/snippets/${sId}/raw`); + } + + create(projectId, title, fileName, code, visibility, options = {}) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.post(this, `projects/${pId}/snippets`, { + title, + fileName, + code, + visibility, + ...options, + }); + } + + edit(projectId, options) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.put(this, `projects/${pId}/snippets`, options); + } + + remove(projectId) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.delete(this, `projects/${pId}/snippets`); + } + + show(projectId, snippetId) { + const [pId, sId] = [projectId, snippetId].map(encodeURIComponent); + + return RequestHelper.get(this, `projects/${pId}/snippets/${sId}`); + } + + userAgentDetails(projectId, snippetId) { + const [pId, sId] = [projectId, snippetId].map(encodeURIComponent); + + return RequestHelper.get(this, `projects/${pId}/snippets/${sId}/user_agent_detail`); + } +} + +export default ProjectSnippets; +export { VISIBILITY_LEVELS }; diff --git a/src/services/ProjectVariables.js b/src/services/ProjectVariables.js new file mode 100644 index 00000000..9fae5c64 --- /dev/null +++ b/src/services/ProjectVariables.js @@ -0,0 +1,9 @@ +import { ResourceVariables } from '../templates'; + +class ProjectVariables extends ResourceVariables { + constructor(options) { + super('projects', null, options); + } +} + +export default ProjectVariables; diff --git a/src/services/Projects.js b/src/services/Projects.js new file mode 100644 index 00000000..fb07323b --- /dev/null +++ b/src/services/Projects.js @@ -0,0 +1,112 @@ +import Fs from 'fs'; +import Path from 'path'; +import { BaseService, RequestHelper } from '../infrastructure'; +import { validateEventOptions } from './Events'; + +class Projects extends BaseService { + all(options) { + return RequestHelper.get(this, 'projects', options); + } + + create(options) { + const url = options.userId ? `projects/user/${encodeURIComponent(options.userId)}` : 'projects'; + + return RequestHelper.post(this, url, options); + } + + edit(projectId, options) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.put(this, `projects/${pId}`, options); + } + + events(projectId, options) { + validateEventOptions(options.action, options.targetType); + + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/events`, options); + } + + fork(projectId, options) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.post(this, `projects/${pId}/fork`, options); + } + + forks(projectId, options) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/forks`, 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'); + + return RequestHelper.post(this, `projects/${pId}/share`, { groupId, groupAccess, ...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}`, { 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..52dcc5dc --- /dev/null +++ b/src/services/ProtectedBranches.js @@ -0,0 +1,32 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +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`, { + name: branchName, + ...options, + }); + } + + 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..0f6f692d --- /dev/null +++ b/src/services/Repositories.js @@ -0,0 +1,46 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +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..2623932d --- /dev/null +++ b/src/services/RepositoryFiles.js @@ -0,0 +1,46 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +class RepositoryFiles extends BaseService { + create(projectId, filePath, branch, options) { + const [pId, path] = [projectId, filePath].map(encodeURIComponent); + + return RequestHelper.post(this, `projects/${pId}/repository/files/${path}`, { + branch, + ...options, + }); + } + + edit(projectId, filePath, branch, options) { + const [pId, path] = [projectId, filePath].map(encodeURIComponent); + + return RequestHelper.put(this, `projects/${pId}/repository/files/${path}`, { + branch, + ...options, + }); + } + + remove(projectId, filePath, branch, options) { + const [pId, path] = [projectId, filePath].map(encodeURIComponent); + + return RequestHelper.delete(this, `projects/${pId}/repository/files/${path}`, { + branch, + ...options, + }); + } + + 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..59ec7220 --- /dev/null +++ b/src/services/Runners.js @@ -0,0 +1,51 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +class Runners extends BaseService { + all({ projectId, ...options } = {}) { + const url = projectId ? `projects/${encodeURIComponent(projectId)}/runners` : 'runners/all'; + + return RequestHelper.get(this, url, options); + } + + allOwned(options) { + return RequestHelper.get(this, 'runners', options); + } + + edit(runnerId, attributes) { + const rId = encodeURIComponent(runnerId); + + return RequestHelper.put(this, `runners/${rId}`, attributes); + } + + enable(projectId, runnerId) { + const [pId, rId] = [projectId, runnerId].map(encodeURIComponent); + + return RequestHelper.post(this, `projects/${pId}/runners`, { runnerId: rId }); + } + + disable(projectId, runnerId) { + const [pId, rId] = [projectId, runnerId].map(encodeURIComponent); + + return RequestHelper.delete(this, `projects/${pId}/runners/${rId}`); + } + + jobs(runnerId) { + const rId = encodeURIComponent(runnerId); + + return RequestHelper.get(this, `runners/${rId}/jobs`); + } + + remove(runnerId) { + const rId = encodeURIComponent(runnerId); + + return RequestHelper.delete(this, `runners/${rId}`); + } + + show(runnerId) { + const rId = encodeURIComponent(runnerId); + + return RequestHelper.get(this, `runners/${rId}`); + } +} + +export default Runners; diff --git a/src/services/Search.js b/src/services/Search.js new file mode 100644 index 00000000..53757599 --- /dev/null +++ b/src/services/Search.js @@ -0,0 +1,17 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +class Search extends BaseService { + all(scope, search, { projectId, groupId } = {}) { + let url; + + if (projectId) { + url += `projects/${encodeURIComponent(projectId)}/`; + } else if (groupId) { + url += `groups/${encodeURIComponent(groupId)}/`; + } + + return RequestHelper.get(this, `${url}search`, { scope, search }); + } +} + +export default Search; diff --git a/src/services/Services.js b/src/services/Services.js new file mode 100644 index 00000000..c017647b --- /dev/null +++ b/src/services/Services.js @@ -0,0 +1,23 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +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/SidekiqMetrics.js b/src/services/SidekiqMetrics.js new file mode 100644 index 00000000..4393861c --- /dev/null +++ b/src/services/SidekiqMetrics.js @@ -0,0 +1,21 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +class SidekiqMetrics extends BaseService { + queueMetrics() { + return RequestHelper.get(this, 'sidekiq/queue_metrics'); + } + + processMetrics() { + return RequestHelper.get(this, 'sidekiq/process_metrics'); + } + + jobStats() { + return RequestHelper.get(this, 'sidekiq/job_stats'); + } + + compoundMetrics() { + return RequestHelper.get(this, 'sidekiq/compound_metrics'); + } +} + +export default SidekiqMetrics; diff --git a/src/services/SystemHooks.js b/src/services/SystemHooks.js new file mode 100644 index 00000000..7b0805a1 --- /dev/null +++ b/src/services/SystemHooks.js @@ -0,0 +1,25 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +class SystemHooks extends BaseService { + add(url, options) { + return RequestHelper.post(this, 'hooks', { url, ...options }); + } + + all(options) { + return RequestHelper.get(this, 'hooks', options); + } + + edit(hookId, url, options) { + const hId = encodeURIComponent(hookId); + + return RequestHelper.put(this, `hooks/${hId}`, { 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..20085d62 --- /dev/null +++ b/src/services/Tags.js @@ -0,0 +1,29 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +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, tId] = [projectId, tagName].map(encodeURIComponent); + + return RequestHelper.delete(this, `projects/${pId}/repository/tags/${tId}`); + } + + show(projectId, tagName) { + const [pId, tId] = [projectId, tagName].map(encodeURIComponent); + + return RequestHelper.get(this, `projects/${pId}/repository/tags/${tId}`); + } +} + +export default Tags; diff --git a/src/services/Todos.js b/src/services/Todos.js new file mode 100644 index 00000000..24499778 --- /dev/null +++ b/src/services/Todos.js @@ -0,0 +1,21 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +class Todos extends BaseService { + all(options) { + return RequestHelper.get(this, 'todos', options); + } + + create(projectId, mergerequestId) { + const [pId, mId] = [projectId, mergerequestId].map(encodeURIComponent); + + return RequestHelper.post(this, `projects/${pId}/merge_requests/${mId}/todo`); + } + + done({ todoId } = {}) { + const tId = encodeURIComponent(todoId); + + return RequestHelper.delete(this, `todos/${tId}/mark_as_done`); + } +} + +export default Todos; diff --git a/src/services/Triggers.js b/src/services/Triggers.js new file mode 100644 index 00000000..207c29b9 --- /dev/null +++ b/src/services/Triggers.js @@ -0,0 +1,35 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +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..109fb9aa --- /dev/null +++ b/src/services/UserCustomAttributes.js @@ -0,0 +1,9 @@ +import { ResourceCustomAttributes } from '../templates'; + +class UserCustomAttributes extends ResourceCustomAttributes { + constructor(options) { + super('users', options); + } +} + +export default UserCustomAttributes; diff --git a/src/services/UserEmails.js b/src/services/UserEmails.js new file mode 100644 index 00000000..602d11b6 --- /dev/null +++ b/src/services/UserEmails.js @@ -0,0 +1,29 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +const url = userId => (userId ? `users/${encodeURIComponent(userId)}/emails` : 'users/emails'); + +class UserEmails extends BaseService { + all({ userId } = {}) { + return RequestHelper.get(this, url(userId)); + } + + add(email, { userId } = {}) { + return RequestHelper.post(this, url(userId), { + email, + }); + } + + show(emailId) { + const eId = encodeURIComponent(emailId); + + return RequestHelper.get(this, `users/emails/${eId}`); + } + + remove(emailId, { userId } = {}) { + const eId = encodeURIComponent(emailId); + + return RequestHelper.delete(this, `${url(userId)}/${eId}`); + } +} + +export default UserEmails; diff --git a/src/services/UserGPGKeys.js b/src/services/UserGPGKeys.js new file mode 100644 index 00000000..8981162b --- /dev/null +++ b/src/services/UserGPGKeys.js @@ -0,0 +1,30 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +const url = userId => (userId ? `users/${encodeURIComponent(userId)}/gpg_keys` : 'users/gpg_keys'); + +class UserGPGKeys extends BaseService { + all({ userId } = {}) { + return RequestHelper.get(this, url(userId)); + } + + add(title, key, { userId } = {}) { + return RequestHelper.post(this, url(userId), { + title, + key, + }); + } + + show(keyId, { userId } = {}) { + const kId = encodeURIComponent(keyId); + + return RequestHelper.get(this, `${url(userId)}/${kId}`); + } + + remove(keyId, { userId } = {}) { + const kId = encodeURIComponent(keyId); + + return RequestHelper.delete(this, `${url(userId)}/${kId}`); + } +} + +export default UserGPGKeys; diff --git a/src/services/UserImpersonationTokens.js b/src/services/UserImpersonationTokens.js new file mode 100644 index 00000000..d2596c65 --- /dev/null +++ b/src/services/UserImpersonationTokens.js @@ -0,0 +1,33 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +class UserImpersonationTokens extends BaseService { + all(userId) { + const uId = encodeURIComponent(userId); + + return RequestHelper.get(this, `users/${uId}/impersonation_tokens`); + } + + add(userId, name, scopes, expiresAt) { + const uId = encodeURIComponent(userId); + + return RequestHelper.post(this, `users/${uId}/impersonation_tokens`, { + name, + expiresAt, + scopes, + }); + } + + show(userId, tokenId) { + const [uId, tId] = [userId, tokenId].map(encodeURIComponent); + + return RequestHelper.get(this, `users/${uId}/impersonation_tokens/${tId}`); + } + + revoke(userId, tokenId) { + const [uId, tId] = [userId, tokenId].map(encodeURIComponent); + + return RequestHelper.delete(this, `users/${uId}/impersonation_tokens/${tId}`); + } +} + +export default UserImpersonationTokens; diff --git a/src/services/UserKeys.js b/src/services/UserKeys.js new file mode 100644 index 00000000..2de0da90 --- /dev/null +++ b/src/services/UserKeys.js @@ -0,0 +1,30 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +const url = userId => (userId ? `users/${encodeURIComponent(userId)}/keys` : 'users/keys'); + +class UserKeys extends BaseService { + all({ userId }) { + return RequestHelper.get(this, url(userId)); + } + + create(title, key, { userId } = {}) { + return RequestHelper.post(this, url(userId), { + title, + key, + }); + } + + show(keyId) { + const kId = encodeURIComponent(keyId); + + return RequestHelper.get(this, `user/keys/${kId}`); + } + + remove(keyId, { userId } = {}) { + const kId = encodeURIComponent(keyId); + + return RequestHelper.delete(this, `${url(userId)}/${kId}`); + } +} + +export default UserKeys; diff --git a/src/services/Users.js b/src/services/Users.js new file mode 100644 index 00000000..86375892 --- /dev/null +++ b/src/services/Users.js @@ -0,0 +1,67 @@ +import { BaseService, RequestHelper } from '../infrastructure'; +import { validateEventOptions } from './Events'; + +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'); + } + + events(userId, options) { + validateEventOptions(options.action, options.targetType); + + const uId = encodeURIComponent(userId); + + return RequestHelper.get(this, `users/${uId}/events`, options); + } + + 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`); + } +} + +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/Wikis.js b/src/services/Wikis.js new file mode 100644 index 00000000..01b0b3d4 --- /dev/null +++ b/src/services/Wikis.js @@ -0,0 +1,35 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +class Wikis extends BaseService { + all(projectId, options) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/wikis`, options); + } + + create(projectId, options) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.post(this, `projects/${pId}/wikis`, options); + } + + edit(projectId, slug, options) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.put(this, `projects/${pId}/wikis/${slug}`, options); + } + + show(projectId, slug) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get(this, `projects/${pId}/wikis/${slug}`); + } + + remove(projectId, slug) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.delete(this, `projects/${pId}/wikis/${slug}`); + } +} + +export default Wikis; diff --git a/src/services/index.js b/src/services/index.js new file mode 100644 index 00000000..3c0230bc --- /dev/null +++ b/src/services/index.js @@ -0,0 +1,81 @@ +// Groups +export Groups from './Groups'; +export GroupAccessRequests from './GroupAccessRequests'; +export GroupBadges from './GroupBadges'; +export GroupCustomAttributes from './GroupCustomAttributes'; +export GroupIssueBoards from './GroupIssueBoards'; +export GroupMembers from './GroupMembers'; +export GroupMilestones from './GroupMilestones'; +export GroupProjects from './GroupProjects'; +export GroupVariables from './GroupVariables'; +export Epics from './Epics'; +export EpicIssues from './EpicIssues'; +export EpicNotes from './EpicNotes'; +export EpicDiscussions from './EpicDiscussions'; + +// Users +export Users from './Users'; +export UserEmails from './UserEmails'; +export UserImpersonationTokens from './UserImpersonationTokens'; +export UserKeys from './UserKeys'; +export UserGPGKeys from './UserGPGKeys'; + +// Projects +export Branches from './Branches'; +export Commits from './Commits'; +export Deployments from './Deployments'; +export DeployKeys from './DeployKeys'; +export Environments from './Environments'; +export Issues from './Issues'; +export IssueNotes from './IssueNotes'; +export IssueDiscussions from './IssueDiscussions'; +export IssueAwardEmojis from './IssueAwardEmojis'; +export Jobs from './Jobs'; +export Labels from './Labels'; +export MergeRequests from './MergeRequests'; +export MergeRequestAwardEmojis from './MergeRequestAwardEmojis'; +export MergeRequestNotes from './MergeRequestNotes'; +export Pipelines from './Pipelines'; +export PipelineSchedules from './PipelineSchedules'; +export PipelineScheduleVariables from './PipelineScheduleVariables'; +export Projects from './Projects'; +export ProjectAccessRequests from './ProjectAccessRequests'; +export ProjectCustomAttributes from './ProjectCustomAttributes'; +export ProjectImportExport from './ProjectImportExport'; +export ProjectIssueBoards from './ProjectIssueBoards'; +export ProjectHooks from './ProjectHooks'; +export ProjectMembers from './ProjectMembers'; +export ProjectMilestones from './ProjectMilestones'; +export ProjectSnippets from './ProjectSnippets'; +export ProjectSnippetNotes from './ProjectSnippetNotes'; +export ProjectSnippetDiscussions from './ProjectSnippetDiscussions'; +export ProjectSnippetAwardEmojis from './ProjectSnippetAwardEmojis'; +export ProtectedBranches from './ProtectedBranches'; +export ProjectVariables from './ProjectVariables'; +export Repositories from './Repositories'; +export RepositoryFiles from './RepositoryFiles'; +export Runners from './Runners'; +export Services from './Services'; +export Tags from './Tags'; +export Todos from './Todos'; +export Triggers from './Triggers'; + +// General +export ApplicationSettings from './ApplicationSettings'; +export BroadcastMessages from './BroadcastMessages'; +export Events from './Events'; +export FeatureFlags from './FeatureFlags'; +export GeoNodes from './GeoNodes'; +export GitignoreTemplates from './GitignoreTemplates'; +export GitLabCIYMLTemplates from './GitLabCIYMLTemplates'; +export Keys from './Keys'; +export Licence from './Licence'; +export LicenceTemplates from './LicenceTemplates'; +export Lint from './Lint'; +export Namespaces from './Namespaces'; +export NotificationSettings from './NotificationSettings'; +export PagesDomains from './PagesDomains'; +export Search from './Search'; +export SidekiqMetrics from './SidekiqMetrics'; +export SystemHooks from './SystemHooks'; +export Wikis from './Wikis'; diff --git a/src/templates/ResourceAccessRequests.js b/src/templates/ResourceAccessRequests.js new file mode 100644 index 00000000..752b8d80 --- /dev/null +++ b/src/templates/ResourceAccessRequests.js @@ -0,0 +1,47 @@ +import URLJoin from 'url-join'; +import { BaseService, RequestHelper } from '../infrastructure'; + +export const ACCESS_LEVELS = { + GUEST: 10, + REPORTER: 20, + DEVELOPER: 30, + MASTER: 40, + OWNER: 50, +}; + +class ResourceAccessRequests extends BaseService { + constructor(resourceType, ...args) { + super(...args); + + this.url = URLJoin(this.url, resourceType); + this.ACCESS_LEVELS = ACCESS_LEVELS; + } + + all(resourceId) { + const rId = encodeURIComponent(resourceId); + + return RequestHelper.get(this, `${rId}/access_requests`); + } + + request(resourceId) { + const rId = encodeURIComponent(resourceId); + + return RequestHelper.post(this, `${rId}/access_requests`); + } + + approve(resourceId, userId, { accessLevel = 30 }) { + const [rId, uId] = [resourceId, userId].map(encodeURIComponent); + + return RequestHelper.post(this, `${rId}/access_requests/${uId}/approve`, { + accessLevel, + }); + } + + deny(resourceId, userId) { + const [rId, uId] = [resourceId, userId].map(encodeURIComponent); + + return RequestHelper.delete(this, `${rId}/access_requests/${uId}`); + } +} + +export default ResourceAccessRequests; diff --git a/src/templates/ResourceAwardEmojis.js b/src/templates/ResourceAwardEmojis.js new file mode 100644 index 00000000..53bd78c8 --- /dev/null +++ b/src/templates/ResourceAwardEmojis.js @@ -0,0 +1,44 @@ +import URLJoin from 'url-join'; +import { BaseService, RequestHelper } from '../infrastructure'; + +function url(projectId, resourceType, resourceId, noteId) { + const [pId, rId] = [projectId, resourceId].map(encodeURIComponent); + let output = `${pId}/${resourceType}/${rId}/`; + + if (noteId) { + output += `notes/${encodeURIComponent(noteId)}/`; + } + + output += 'award_emoji'; + + return output; +} + +class ResourceAwardsEmojis extends BaseService { + constructor(resourceType, ...args) { + super(...args); + + this.url = URLJoin(this.url, 'projects'); + this.resourceType = resourceType; + } + + all(projectId, resourceId, options, noteId) { + return RequestHelper.get(this, url(projectId, this.resourceType, resourceId, noteId), options); + } + + award(projectId, resourceId, name, noteId) { + return RequestHelper.post(this, url(projectId, this.resourceType, resourceId, noteId), { + name, + }); + } + + remove(projectId, resourceId, awardId, noteId) { + return RequestHelper.delete(this, url(projectId, this.resourceType, resourceId, noteId)); + } + + show(projectId, resourceId, awardId, noteId) { + return RequestHelper.get(this, url(projectId, this.resourceType, resourceId, noteId)); + } +} + +export default ResourceAwardsEmojis; diff --git a/src/templates/ResourceBadges.js b/src/templates/ResourceBadges.js new file mode 100644 index 00000000..00993ca0 --- /dev/null +++ b/src/templates/ResourceBadges.js @@ -0,0 +1,48 @@ +import URLJoin from 'url-join'; +import { BaseService, RequestHelper } from '../infrastructure'; + +class ResourceBadges extends BaseService { + constructor(resourceType, ...args) { + super(...args); + + this.url = URLJoin(this.url, resourceType); + } + + add(resourceId, options) { + const rId = encodeURIComponent(resourceId); + + return RequestHelper.post(this, `${rId}/badges`, options); + } + + all(resourceId, options) { + const rId = encodeURIComponent(resourceId); + + return RequestHelper.get(this, `${rId}/badges`, options); + } + + edit(resourceId, badgeId, options) { + const [rId, bId] = [resourceId, badgeId].map(encodeURIComponent); + + return RequestHelper.put(this, `${rId}/badges/${bId}`, options); + } + + preview(resourceId, linkUrl, imageUrl) { + const rId = encodeURIComponent(resourceId); + + return RequestHelper.get(this, `${rId}/badges/render`, { linkUrl, imageUrl }); + } + + remove(resourceId, badgeId) { + const [rId, bId] = [resourceId, badgeId].map(encodeURIComponent); + + return RequestHelper.delete(this, `${rId}/badges/${bId}`); + } + + show(resourceId, badgeId) { + const [rId, bId] = [resourceId, badgeId].map(encodeURIComponent); + + return RequestHelper.get(this, `${rId}/badges/${bId}`); + } +} + +export default ResourceBadges; diff --git a/src/templates/ResourceCustomAttributes.js b/src/templates/ResourceCustomAttributes.js new file mode 100644 index 00000000..a23d5224 --- /dev/null +++ b/src/templates/ResourceCustomAttributes.js @@ -0,0 +1,38 @@ +import URLJoin from 'url-join'; +import { BaseService, RequestHelper } from '../infrastructure'; + +class ResourceCustomAttributes extends BaseService { + constructor(resourceType, ...args) { + super(...args); + + this.url = URLJoin(this.url, resourceType); + } + + all(resourceId) { + const rId = encodeURIComponent(resourceId); + + return RequestHelper.get(this, `${rId}/custom_attributes`); + } + + set(resourceId, customAttributeId, value) { + const [rId, cId] = [resourceId, customAttributeId].map(encodeURIComponent); + + return RequestHelper.put(this, `${rId}/custom_attributes/${cId}`, { + value, + }); + } + + remove(resourceId, customAttributeId) { + const [rId, cId] = [resourceId, customAttributeId].map(encodeURIComponent); + + return RequestHelper.delete(this, `${rId}/custom_attributes/${cId}`); + } + + show(resourceId, customAttributeId) { + const [rId, cId] = [resourceId, customAttributeId].map(encodeURIComponent); + + return RequestHelper.get(this, `${rId}/custom_attributes/${cId}`); + } +} + +export default ResourceCustomAttributes; diff --git a/src/templates/ResourceDiscussions.js b/src/templates/ResourceDiscussions.js new file mode 100644 index 00000000..069d2973 --- /dev/null +++ b/src/templates/ResourceDiscussions.js @@ -0,0 +1,53 @@ +import URLJoin from 'url-join'; +import { BaseService, RequestHelper } from '../infrastructure'; + +class ResourceDiscussions extends BaseService { + constructor(resourceType, resource2Type, ...args) { + super(...args); + + this.url = URLJoin(this.url, resourceType); + this.resource2Type = resource2Type; + } + + addNote(resourceId, resource2Id, discussiodId, noteId, options) { + if (!options.body) throw new Error('Missing required property: body'); + + const [rId, r2Id, dId, nId] = [resourceId, resource2Id, discussiodId, noteId].map(encodeURIComponent); + + return RequestHelper.put(this, `${rId}/${this.resource2Type}/${r2Id}/discussions/${dId}/notes/${nId}`, options); + } + + all(resourceId, resource2Id, options) { + const [rId, r2Id] = [resourceId, resource2Id].map(encodeURIComponent); + + return RequestHelper.get(this, `${rId}/${this.resource2Type}/${r2Id}/discussions`, 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, `${rId}/${this.resource2Type}/${r2Id}/discussions`, options); + } + + editNote(resourceId, resource2Id, discussiodId, noteId, body) { + const [rId, r2Id, dId, nId] = [resourceId, resource2Id, discussiodId, noteId].map(encodeURIComponent); + + return RequestHelper.put(this, `${rId}/${this.resource2Type}/${r2Id}/discussions/${dId}/notes/${nId}`, { body }); + } + + removeNote(resourceId, resource2Id, discussiodId, noteId) { + const [rId, r2Id, dId, nId] = [resourceId, resource2Id, discussiodId, noteId].map(encodeURIComponent); + + return RequestHelper.delete(this, `${rId}/${this.resource2Type}/${r2Id}/discussions/${dId}/notes/${nId}`); + } + + show(resourceId, resource2Id, discussiodId) { + const [rId, r2Id, dId] = [resourceId, resource2Id, discussiodId].map(encodeURIComponent); + + return RequestHelper.get(this, `${rId}/${this.resource2Type}/${r2Id}/discussions/${dId}`); + } +} + +export default ResourceDiscussions; diff --git a/src/templates/ResourceIssueBoards.js b/src/templates/ResourceIssueBoards.js new file mode 100644 index 00000000..af7234e8 --- /dev/null +++ b/src/templates/ResourceIssueBoards.js @@ -0,0 +1,72 @@ +import URLJoin from 'url-join'; +import { BaseService, RequestHelper } from '../infrastructure'; + +class ResourceIssueBoards extends BaseService { + constructor(resourceType, ...args) { + super(...args); + + this.url = URLJoin(this.url, resourceType); + } + + all(resourceId, options) { + const rId = encodeURIComponent(resourceId); + + return RequestHelper.get(this, `${rId}/boards`, options); + } + + create(resourceId, name) { + const rId = encodeURIComponent(resourceId); + + return RequestHelper.post(this, `${rId}/boards`, { name }); + } + + createList(resourceId, boardId, labelId) { + const [rId, bId] = [resourceId, boardId].map(encodeURIComponent); + + return RequestHelper.post(this, `${rId}/boards/${bId}/lists`, { labelId }); + } + + edit(resourceId, boardId, options) { + const [rId, bId] = [resourceId, boardId].map(encodeURIComponent); + + return RequestHelper.put(this, `${rId}/boards/${bId}`, options); + } + + editList(resourceId, boardId, listId, position) { + const [rId, bId, lId] = [resourceId, boardId, listId].map(encodeURIComponent); + + return RequestHelper.put(this, `${rId}/boards/${bId}/lists/${lId}`, { position }); + } + + lists(resourceId, boardId) { + const [rId, bId] = [resourceId, boardId].map(encodeURIComponent); + + return RequestHelper.get(this, `${rId}/boards/${bId}/lists`); + } + + remove(resourceId, boardId) { + const [rId, bId] = [resourceId, boardId].map(encodeURIComponent); + + return RequestHelper.delete(this, `${rId}/boards/${bId}`); + } + + removeList(resourceId, boardId, listId) { + const [rId, bId, lId] = [resourceId, boardId, listId].map(encodeURIComponent); + + return RequestHelper.delete(this, `${rId}/boards/${bId}/lists/${lId}`); + } + + show(resourceId, boardId) { + const [rId, bId] = [resourceId, boardId].map(encodeURIComponent); + + return RequestHelper.get(this, `${rId}/boards/${bId}`); + } + + showList(resourceId, boardId, listId) { + const [rId, bId, lId] = [resourceId, boardId, listId].map(encodeURIComponent); + + return RequestHelper.get(this, `${rId}/boards/${bId}/lists/${lId}`); + } +} + +export default ResourceIssueBoards; diff --git a/src/templates/ResourceMembers.js b/src/templates/ResourceMembers.js new file mode 100644 index 00000000..2b2ca6a5 --- /dev/null +++ b/src/templates/ResourceMembers.js @@ -0,0 +1,49 @@ +import URLJoin from 'url-join'; +import { BaseService, RequestHelper } from '../infrastructure'; + +class ResourceMembers extends BaseService { + constructor(resourceType, ...args) { + super(...args); + + this.url = URLJoin(this.url, resourceType); + } + + all(resourceId) { + const rId = encodeURIComponent(resourceId); + + return RequestHelper.get(this, `${rId}/members`); + } + + add(resourceId, userId, accessLevel, options) { + const [rId, uId] = [resourceId, userId].map(encodeURIComponent); + + return RequestHelper.post(this, `${rId}/members`, { + user_id: uId, + access_level: parseInt(accessLevel, 10), + ...options, + }); + } + + edit(resourceId, userId, accessLevel, options) { + const [rId, uId] = [resourceId, userId].map(encodeURIComponent); + + return RequestHelper.put(this, `${rId}/members/${uId}`, { + access_level: parseInt(accessLevel, 10), + ...options, + }); + } + + show(resourceId, userId) { + const [rId, uId] = [resourceId, userId].map(encodeURIComponent); + + return RequestHelper.get(this, `${rId}/members/${uId}`); + } + + remove(resourceId, userId) { + const [rId, uId] = [resourceId, userId].map(encodeURIComponent); + + return RequestHelper.delete(this, `${rId}/members/${uId}`); + } +} + +export default ResourceMembers; diff --git a/src/templates/ResourceMilestones.js b/src/templates/ResourceMilestones.js new file mode 100644 index 00000000..f908602f --- /dev/null +++ b/src/templates/ResourceMilestones.js @@ -0,0 +1,48 @@ +import URLJoin from 'url-join'; +import { BaseService, RequestHelper } from '../infrastructure'; + +class ResourceMilestones extends BaseService { + constructor(resourceType, ...args) { + super(...args); + + this.url = URLJoin(this.url, resourceType); + } + + all(resourceId, options) { + const rId = encodeURIComponent(resourceId); + + return RequestHelper.get(this, `${rId}/milestones`, options); + } + + create(resourceId, title, options) { + const rId = encodeURIComponent(resourceId); + + return RequestHelper.post(this, `${rId}/milestones`, options); + } + + edit(resourceId, milestoneId, options) { + const [rId, mId] = [resourceId, milestoneId].map(encodeURIComponent); + + return RequestHelper.put(this, `${rId}/milestones/${mId}`, options); + } + + issues(resourceId, milestoneId) { + const [rId, mId] = [resourceId, milestoneId].map(encodeURIComponent); + + return RequestHelper.get(this, `${rId}/milestones/${mId}/issues`); + } + + mergeRequests(resourceId, milestoneId) { + const [rId, mId] = [resourceId, milestoneId].map(encodeURIComponent); + + return RequestHelper.get(this, `${rId}/milestones/${mId}/merge_requests`); + } + + show(resourceId, milestoneId) { + const [rId, mId] = [resourceId, milestoneId].map(encodeURIComponent); + + return RequestHelper.get(this, `${rId}/milestones/${mId}`); + } +} + +export default ResourceMilestones; diff --git a/src/templates/ResourceNotes.js b/src/templates/ResourceNotes.js new file mode 100644 index 00000000..c905c5b4 --- /dev/null +++ b/src/templates/ResourceNotes.js @@ -0,0 +1,47 @@ +import URLJoin from 'url-join'; +import { BaseService, RequestHelper } from '../infrastructure'; + +class ResourceNotes extends BaseService { + constructor(resourceType, resource2Type, ...args) { + super(...args); + + this.url = URLJoin(this.url, resourceType); + this.resource2Type = resource2Type; + } + + all(resourceId, resource2Id, options) { + const [rId, r2Id] = [resourceId, resource2Id].map(encodeURIComponent); + + return RequestHelper.get(this, `${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, `${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, `${rId}/${this.resource2Type}/${r2Id}/notes/${nId}`, options); + } + + remove(resourceId, resource2Id, noteId) { + const [rId, r2Id, nId] = [resourceId, resource2Id, noteId].map(encodeURIComponent); + + return RequestHelper.delete(this, `${rId}/${this.resource2Type}/${r2Id}/notes/${nId}`); + } + + show(resourceId, resource2Id, noteId) { + const [rId, r2Id, nId] = [resourceId, resource2Id, noteId].map(encodeURIComponent); + + return RequestHelper.get(this, `${rId}/${this.resource2Type}/${r2Id}/notes/${nId}`); + } +} + +export default ResourceNotes; diff --git a/src/templates/ResourceTemplates.js b/src/templates/ResourceTemplates.js new file mode 100644 index 00000000..01b151c7 --- /dev/null +++ b/src/templates/ResourceTemplates.js @@ -0,0 +1,22 @@ +import URLJoin from 'url-join'; +import { BaseService, RequestHelper } from '../infrastructure'; + +class ResourceTemplates extends BaseService { + constructor(resourceType, ...args) { + super(...args); + + this.url = URLJoin(this.url, 'templates', resourceType); + } + + all(options) { + return RequestHelper.get(this, '', options); + } + + show(resourceId) { + const rId = encodeURIComponent(resourceId); + + return RequestHelper.post(this, `${rId}`); + } +} + +export default ResourceTemplates; diff --git a/src/templates/ResourceVariables.js b/src/templates/ResourceVariables.js new file mode 100644 index 00000000..274a0fc9 --- /dev/null +++ b/src/templates/ResourceVariables.js @@ -0,0 +1,69 @@ +import { BaseService, RequestHelper } from '../infrastructure'; + +const url = (resourceType, resourceId, resource2Type, resource2Id) => { + const [rId, r2Id] = [resourceId, resource2Id].map(encodeURIComponent); + + let output = `${resourceType}/${rId}/`; + + if (resource2Id) { + output += `${resource2Type}/${r2Id}/`; + } + + output += 'variables'; + + return output; +}; + +class ResourceVariables extends BaseService { + constructor(resourceType, resource2Type, ...args) { + super(...args); + + this.resourceType = resourceType; + this.resource2Type = resource2Type; + } + + all(resourceId, resource2Id) { + return RequestHelper.get( + this, + url(this.resourceType, resourceId, this.resource2Type, resource2Id), + ); + } + + create(resourceId, resource2Id, options) { + return RequestHelper.post( + this, + url(this.resourceType, resourceId, this.resource2Type, resource2Id), + options, + ); + } + + edit(resourceId, resource2Id, keyId, options) { + const kId = encodeURIComponent(keyId); + + return RequestHelper.put( + this, + `${url(this.resourceType, resourceId, this.resource2Type, resource2Id)}/${kId}`, + options, + ); + } + + show(resourceId, resource2Id, keyId) { + const kId = encodeURIComponent(keyId); + + return RequestHelper.get( + this, + `${url(this.resourceType, resourceId, this.resource2Type, resource2Id)}/${kId}`, + ); + } + + remove(resourceId, resource2Id, keyId) { + const kId = encodeURIComponent(keyId); + + return RequestHelper.delete( + this, + `${url(this.resourceType, resourceId, this.resource2Type, resource2Id)}/${kId}`, + ); + } +} + +export default ResourceVariables; diff --git a/src/templates/index.js b/src/templates/index.js new file mode 100644 index 00000000..b1f2ecc7 --- /dev/null +++ b/src/templates/index.js @@ -0,0 +1,11 @@ +export ResourceAccessRequests from './ResourceAccessRequests'; +export ResourceAwardEmojis from './ResourceAwardEmojis'; +export ResourceBadges from './ResourceBadges'; +export ResourceCustomAttributes from './ResourceCustomAttributes'; +export ResourceDiscussions from './ResourceDiscussions'; +export ResourceIssueBoards from './ResourceIssueBoards'; +export ResourceMembers from './ResourceMembers'; +export ResourceMilestones from './ResourceMilestones'; +export ResourceNotes from './ResourceNotes'; +export ResourceTemplates from './ResourceTemplates'; +export ResourceVariables from './ResourceVariables';