public MyRepositoriesController() { Get("/api/v1/me/external/repositories/get", _ => { var me = UserRepository.Find(CurrentRequest.UserId); var repos = GitHubRepositoriesUtils.GetUserRepositories(me); repos = repos.Concat( GitLabRepositoriesUtils.GetUserRepositories(me) ).ToArray(); return(HttpResponse.Item("repositories", new ExternalRepoTransformer().Many(repos))); }); }
// TODO: add support for GitLab public PublicImportController() { Post("/api/v1/repository/submit/post", _ => { var errors = ValidationProcessor.Process(Request, new IValidatorRule[] { new ShouldHaveParameters(new[] { "url" }), }); if (errors.Count > 0) { return(HttpResponse.Errors(errors)); } var url = GetRequestStr("url"); Uri parsedUrl; try { parsedUrl = new Uri(url); } catch (Exception e) { return(HttpResponse.Error(HttpStatusCode.UnprocessableEntity, "Invalid url")); } string host = parsedUrl.Host; if ( !(new[] { "github.com" }.Contains(host)) || parsedUrl.Segments.Length < 3 ) { return(HttpResponse.Error(HttpStatusCode.UnprocessableEntity, "Invalid hostname")); } RepoServiceType serviceType = host == "github.com" ? RepoServiceType.GitHub : RepoServiceType.GitLab; (DL.Model.Project.Project project, DL.Model.Repo.Repo repo)result = (null, null); if (serviceType == RepoServiceType.GitHub) { var githubClient = GitHubApi.Client(); Repository repo; try { repo = githubClient.Repository.Get( parsedUrl.Segments[1].Replace("/", ""), parsedUrl.Segments[2].Replace("/", "") ).Result; } catch (Exception e) { return(HttpResponse.Error(HttpStatusCode.NotFound, "GitHub repository does not exist")); } var existingRepo = RepoRepository.Find(repo.Id.ToString(), serviceType); if (existingRepo != null) { return(HttpResponse.Error(HttpStatusCode.UnprocessableEntity, "Project is already imported", new JObject() { ["project"] = new ProjectTransformer().Transform(existingRepo.Project()), })); } result = GitHubRepositoriesUtils.ImportProject(null, repo.Id.ToString()); } return(HttpResponse.Data(new JObject() { ["project"] = new ProjectTransformer().Transform(result.project), ["repository"] = new RepoTransformer().Transform(result.repo) })); });
public ImportRepoController() { Post("/api/v1/repository/import", _ => { var errors = ValidationProcessor.Process(Request, new IValidatorRule[] { new ShouldHaveParameters(new[] { "service_type", "origin_id" }), new ShouldBeCorrectEnumValue("service_type", typeof(RepoServiceType)) }, true); if (errors.Count > 0) { return(HttpResponse.Errors(errors)); } var originId = GetRequestStr("origin_id"); RepoServiceType serviceType = (RepoServiceType)GetRequestEnum("service_type", typeof(RepoServiceType)); var existingRepo = RepoRepository.Find(originId, serviceType); if (existingRepo != null) { return(HttpResponse.Error(HttpStatusCode.UnprocessableEntity, "Project is already imported", new JObject() { ["project"] = new ProjectTransformer().Transform(existingRepo.Project()), })); } if (serviceType == RepoServiceType.GitHub && !GitHubRepositoriesUtils.IfRepoExists(originId)) { return(HttpResponse.Error( HttpStatusCode.NotFound, "GitHub repository with this id does not exist" )); } if (serviceType == RepoServiceType.GitLab && !GitlabApi.IfRepoExists(originId)) { return(HttpResponse.Error( HttpStatusCode.NotFound, "GitLab repository with this id does not exist" )); } var me = UserRepository.Find(CurrentRequest.UserId); (ProjectModel project, DL.Model.Repo.Repo repo)result = (null, null); switch (serviceType) { case RepoServiceType.GitHub: result = GitHubRepositoriesUtils.ImportProject(me, originId); break; case RepoServiceType.GitLab: result = GitLabRepositoriesUtils.ImportProject(me, originId); break; } if (result.project == null || result.repo == null) { return(HttpResponse.Error(HttpStatusCode.BadRequest, "Cannot import target project")); } return(HttpResponse.Data(new JObject() { ["project"] = new ProjectTransformer().Transform(result.project), ["repository"] = new RepoTransformer().Transform(result.repo) })); });