diff --git a/src/types.ts b/src/types.ts index 2473338..d51bb38 100644 --- a/src/types.ts +++ b/src/types.ts @@ -53,7 +53,7 @@ export interface RepoManager { repo: Repo; initialize: () => Promise; getIssue: (id: string) => Promise; - replicateIssue?: (issue: Issue) => Promise; + replicateIssue: (issue: Issue) => Promise; getMergeRequest: (id: string) => Promise; } diff --git a/src/vendor/github/repomgr.ts b/src/vendor/github/repomgr.ts index 0c1251e..0a9e9cc 100644 --- a/src/vendor/github/repomgr.ts +++ b/src/vendor/github/repomgr.ts @@ -18,10 +18,12 @@ import { } from '../../types'; import GitHubVendorManager from './vendormgr'; import assert from 'assert'; +import { GHMutation, GHMutationCreateIssueArgs } from './api-types'; export default class GitHubRepoManager implements RepoManager { vendorMgr: GitHubVendorManager; repo: Repo; + repoId: string; constructor(vendorMgr: GitHubVendorManager, repoPath: string) { this.vendorMgr = vendorMgr; @@ -39,6 +41,7 @@ export default class GitHubRepoManager implements RepoManager { }, name: repoName, }; + this.repoId = ''; } public async initialize() { @@ -46,6 +49,7 @@ export default class GitHubRepoManager implements RepoManager { ` query Query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { + id name owner { login @@ -61,6 +65,7 @@ export default class GitHubRepoManager implements RepoManager { ); assert(meta.repository); assert(meta.repository.owner); + this.repoId = meta.repository.id; this.repo.name = meta.repository.name; this.repo.owner.username = meta.repository.owner.login; // @ts-ignore graphql-codegen ignores built-in graphql values @@ -106,6 +111,40 @@ export default class GitHubRepoManager implements RepoManager { }; } + public async replicateIssue(issue: Issue) { + const resp = await this.vendorMgr._doRequest( + ` + mutation ($input: CreateIssueInput!) { + createIssue(input: $input) { + issue { + number + title + body + closed + } + } + } + `, + { + input: { + repositoryId: this.repoId, + title: issue.title, + body: issue.content, + }, + }, + ); + assert(resp.createIssue, 'creating issue failed'); + assert(resp.createIssue.issue, 'creating issue failed'); + const replicated = resp.createIssue.issue; + return { + id: replicated.number.toString(), + content: replicated.body, + title: replicated.title, + repo: this.repo, + state: replicated.closed ? ISSUE_STATE.CLOSED : ISSUE_STATE.OPEN, + }; + } + public async getMergeRequest(number: string): Promise { const resp = await this.vendorMgr._doRequest( ` diff --git a/src/vendor/github/vendormgr.ts b/src/vendor/github/vendormgr.ts index c875765..0971a37 100644 --- a/src/vendor/github/vendormgr.ts +++ b/src/vendor/github/vendormgr.ts @@ -47,13 +47,13 @@ export default class GitHubVendorManager implements VendorManager } /** internal and for RepoManager */ - public async _doRequest(query: string, variables: any) { + public async _doRequest(query: string, variables: D) { return got .post(this.gqlEndpoint, { body: JSON.stringify({ query, variables }), headers: { Authorization: `Bearer ${this.config.token}` }, }) .then((res) => JSON.parse(res.body)) - .then((res) => res.data) as Promise; + .then((res) => res.data) as Promise; } }