11import { Endpoints } from '@octokit/types'
2+ import { ux } from '@oclif/core'
3+
24import octokitClient from './clients/octokit-client'
35type listReposResponse = Endpoints [ 'GET /orgs/{org}/repos' ] [ 'response' ] ;
46type getEnvironmentsResponse = Endpoints [ 'GET /repos/{owner}/{repo}/environments' ] [ 'response' ] ;
@@ -16,6 +18,9 @@ type removeCollaboratorParams=Endpoints['DELETE /repos/{owner}/{repo}/collaborat
1618type addCollaboratorResponse = Endpoints [ 'PUT /repos/{owner}/{repo}/collaborators/{username}' ] [ 'response' ] ;
1719type addCollaboratorParams = Endpoints [ 'PUT /repos/{owner}/{repo}/collaborators/{username}' ] [ 'parameters' ] ;
1820type removeEnvironmentResponse = Endpoints [ 'DELETE /repos/{owner}/{repo}/environments/{environment_name}' ] [ 'response' ] ;
21+ type getPublicKeyResponse = Endpoints [ 'GET /repositories/{repository_id}/environments/{environment_name}/secrets/public-key' ] [ 'response' ] ;
22+ type updateSecretResponse = Endpoints [ 'PUT /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}' ] [ 'response' ] ;
23+ type removeSecretResponse = Endpoints [ 'DELETE /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}' ] [ 'response' ] ;
1924export default {
2025 async setEnvironmentVariable ( { owner, repo, name, environment_name, value} :{ owner :string , repo :string , name :string , environment_name :string , value : string } ) :Promise < postVariableResponse > {
2126 const octokit = await octokitClient ( { org : owner } )
@@ -144,7 +149,6 @@ export default {
144149 } ,
145150 } )
146151 } ,
147-
148152 async protectBranch ( { owner, repo, branch, countReviewers} :{ owner :string , repo :string , branch :string , countReviewers :number } ,
149153 ) :Promise < protectBranchResponse > {
150154 const octokit = await octokitClient ( { org : owner } )
@@ -202,4 +206,84 @@ export default {
202206 } ,
203207 } )
204208 } ,
209+ async getPublicKey ( { owner, repo, environment} :{ owner :string , repo :string , environment ?:string } ) :Promise < getPublicKeyResponse > {
210+ const octokit = await octokitClient ( { org : owner } )
211+ if ( environment ) {
212+ const { data : { environments} } = await this . getEnvironments ( { organization : owner , repository : repo } )
213+ if ( ! environments ?. find ( env => env . name === environment ) ) {
214+ const confirm = await ux . confirm ( 'The environment does not exist. Would you like to create it? (yes/no)' )
215+ if ( confirm ) {
216+ await this . defineEnvironment ( { owner, repo, environment_name : environment } )
217+ } else {
218+ throw new Error ( `Environment ${ environment } does not exist` )
219+ }
220+ }
221+
222+ const repoId = await this . getRepositoryId ( { owner, repo} )
223+ return octokit . request ( 'GET /repositories/{repository_id}/environments/{environment_name}/secrets/public-key' , {
224+ repository_id : repoId ,
225+ environment_name : environment ,
226+ } )
227+ }
228+
229+ return octokit . request ( 'GET /repos/{owner}/{repo}/actions/secrets/public-key' , {
230+ owner,
231+ repo,
232+ } )
233+ } ,
234+ async updateSecret ( { owner, repo, secret_name, encrypted_value, key_id, environment} :{ owner :string , repo :string , secret_name :string , encrypted_value :string , key_id :string , environment ?:string } ) :Promise < updateSecretResponse > {
235+ const octokit = await octokitClient ( { org : owner } )
236+
237+ if ( environment ) {
238+ const repoId = await this . getRepositoryId ( { owner, repo} )
239+
240+ return octokit . request ( 'PUT /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}' , {
241+ repository_id : repoId ,
242+ environment_name : environment ,
243+ secret_name,
244+ encrypted_value,
245+ key_id,
246+ headers : {
247+ 'X-GitHub-Api-Version' : '2022-11-28' ,
248+ } ,
249+ } )
250+ }
251+
252+ return octokit . request ( 'PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}' , {
253+ owner,
254+ repo,
255+ secret_name,
256+ encrypted_value,
257+ key_id,
258+ headers : {
259+ 'X-GitHub-Api-Version' : '2022-11-28' ,
260+ } ,
261+ } )
262+ } ,
263+ async removeSecret ( { owner, repo, secret_name, environment} :{ owner :string , repo :string , secret_name :string , environment ?:string } ) :Promise < removeSecretResponse > {
264+ const octokit = await octokitClient ( { org : owner } )
265+
266+ if ( environment ) {
267+ const repoId = await this . getRepositoryId ( { owner, repo} )
268+
269+ return octokit . request ( 'DELETE /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}' , {
270+ repository_id : repoId ,
271+ environment_name : environment ,
272+ secret_name,
273+ headers : {
274+ 'X-GitHub-Api-Version' : '2022-11-28' ,
275+ } ,
276+ } )
277+ }
278+
279+ return octokit . request ( 'DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}' , {
280+ owner,
281+ repo,
282+ secret_name,
283+ headers : {
284+ 'X-GitHub-Api-Version' : '2022-11-28' ,
285+ } ,
286+ } )
287+ } ,
288+
205289}
0 commit comments