@@ -26,6 +26,7 @@ import { ErrorCodes, ApplicationError } from "@gitpod/gitpod-protocol/lib/messag
26
26
import { URL } from "url" ;
27
27
import { Authorizer } from "../authorization/authorizer" ;
28
28
import { TransactionalContext } from "@gitpod/gitpod-db/lib/typeorm/transactional-db-impl" ;
29
+ import { GitHubAppSupport } from "../github/github-app-support" ;
29
30
30
31
@injectable ( )
31
32
export class ProjectsService {
@@ -37,6 +38,7 @@ export class ProjectsService {
37
38
@inject ( IAnalyticsWriter ) private readonly analytics : IAnalyticsWriter ,
38
39
@inject ( WebhookEventDB ) private readonly webhookEventDB : WebhookEventDB ,
39
40
@inject ( Authorizer ) private readonly auth : Authorizer ,
41
+ @inject ( GitHubAppSupport ) private readonly githubAppSupport : GitHubAppSupport ,
40
42
) { }
41
43
42
44
async getProject ( userId : string , projectId : string ) : Promise < Project > {
@@ -194,6 +196,40 @@ export class ProjectsService {
194
196
return result ;
195
197
}
196
198
199
+ async canCreateProject ( currentUser : User , cloneURL : string ) {
200
+ try {
201
+ const parsedUrl = RepoURL . parseRepoUrl ( cloneURL ) ;
202
+ const hostContext = parsedUrl ?. host ? this . hostContextProvider . get ( parsedUrl ?. host ) : undefined ;
203
+ const authProvider = hostContext && hostContext . authProvider . info ;
204
+ const type = authProvider && authProvider . authProviderType ;
205
+ const host = authProvider ?. host ;
206
+ if ( ! type || ! host ) {
207
+ throw Error ( "Unknown host: " + parsedUrl ?. host ) ;
208
+ }
209
+ if (
210
+ type === "GitLab" ||
211
+ type === "Bitbucket" ||
212
+ type === "BitbucketServer" ||
213
+ ( type === "GitHub" && ( host !== "github.com" || ! this . config . githubApp ?. enabled ) )
214
+ ) {
215
+ const repositoryService = hostContext ?. services ?. repositoryService ;
216
+ if ( repositoryService ) {
217
+ return await repositoryService . canInstallAutomatedPrebuilds ( currentUser , cloneURL ) ;
218
+ }
219
+ }
220
+ if ( host === "github.com" && this . config . githubApp ?. enabled ) {
221
+ const availableRepositories = await this . githubAppSupport . getProviderRepositoriesForUser ( {
222
+ user : currentUser ,
223
+ provider : "github.com" ,
224
+ } ) ;
225
+ return availableRepositories . some ( ( r ) => r . cloneUrl === cloneURL ) ;
226
+ }
227
+ } catch ( error ) {
228
+ log . error ( "Failed to check precondition for creating a project." ) ;
229
+ }
230
+ return false ;
231
+ }
232
+
197
233
async createProject (
198
234
{ name, slug, cloneUrl, teamId, appInstallationId } : CreateProjectParams ,
199
235
installer : User ,
0 commit comments