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