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)
                }));
            });
Beispiel #3
0
        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)
                }));
            });