From 9f8755676d6ceff10d5e860d27c64264e6963a6c Mon Sep 17 00:00:00 2001 From: Rodrigo Pombo Date: Tue, 19 Feb 2019 17:03:58 -0300 Subject: [PATCH] Prepare GitLab integration --- src/app-helpers.js | 2 +- src/git-providers/gitlab-provider.js | 127 +++++++++++++++++++++++++++ src/git-providers/providers.js | 8 +- 3 files changed, 135 insertions(+), 2 deletions(-) create mode 100644 src/git-providers/gitlab-provider.js diff --git a/src/app-helpers.js b/src/app-helpers.js index 36f9262..ac39301 100644 --- a/src/app-helpers.js +++ b/src/app-helpers.js @@ -48,7 +48,7 @@ export function Error({ error, gitProvider }) { {gitProvider.isLoggedIn && !gitProvider.isLoggedIn() && (

Is it from a private repo? Sign in with GitHub:

- +
)} diff --git a/src/git-providers/gitlab-provider.js b/src/git-providers/gitlab-provider.js new file mode 100644 index 0000000..73a29b0 --- /dev/null +++ b/src/git-providers/gitlab-provider.js @@ -0,0 +1,127 @@ +import netlify from "netlify-auth-providers"; +import { Base64 } from "js-base64"; +const TOKEN_KEY = "gitlab-token"; + +function getHeaders() { + const token = window.localStorage.getItem(TOKEN_KEY); + return token ? { "PRIVATE-TOKEN": `${token}` } : {}; +} + +function isLoggedIn() { + return !!window.localStorage.getItem(TOKEN_KEY); +} + +// async function getContent(repo, sha, path) { +// const contentResponse = await fetch( +// `https://gitlab.com/api/v4/projects/${encodeURIComponent( +// repo +// )}/repository/commits?path=${encodeURIComponent(path)}&ref_name=${sha}`, +// { headers: getHeaders() } +// ); + +// if (!contentResponse.ok) { +// throw contentResponse; +// } +// const contentJson = await contentResponse.json(); +// const content = Base64.decode(contentJson.content); +// return { content, url: contentJson.html_url }; +// } + +function getUrlParams() { + const [ + , + owner, + reponame, + action, + sha, + ...paths + ] = window.location.pathname.split("/"); + + if (action !== "commits" && action !== "blob") { + return []; + } + + return [owner + "/" + reponame, sha, "/" + paths.join("/")]; +} + +function getPath() { + const [, , path] = getUrlParams(); + return path; +} + +function showLanding() { + const [repo, ,] = getUrlParams(); + return !repo; +} + +const cache = {}; + +async function getCommits(path, last) { + const [repo, sha] = getUrlParams(); + + if (!cache[path]) { + const commitsResponse = await fetch( + `https://gitlab.com/api/v4/projects/${encodeURIComponent( + "6509971" //TODO fix + )}/repository/commits?path=${encodeURIComponent(path)}&ref_name=${sha}`, + { headers: getHeaders() } + ); + if (!commitsResponse.ok) { + throw commitsResponse; + } + const commitsJson = await commitsResponse.json(); + + cache[path] = commitsJson.map(commit => ({ + sha: commit.id, + date: new Date(commit.authored_date), + author: { + login: commit.author_name + }, + // commitUrl: commit.html_url, + message: commit.title, + content: "foo" + })); + } + + const commits = cache[path].slice(0, last); + + // await Promise.all( + // commits.map(async commit => { + // if (!commit.content) { + // const info = await getContent(repo, commit.sha, path); + // commit.content = info.content; + // commit.fileUrl = info.url; + // } + // }) + // ); + + return commits; +} + +function logIn() { + console.log("login"); + // return new Promise((resolve, reject) => { + var authenticator = new netlify({ + site_id: "ccf3a0e2-ac06-4f37-9b17-df1dd41fb1a6" + }); + authenticator.authenticate({ provider: "gitlab", scope: "api" }, function( + err, + data + ) { + if (err) { + console.error(err); + return; + } + window.localStorage.setItem(TOKEN_KEY, data.token); + window.location.reload(false); + }); + // }); +} + +export default { + showLanding, + getPath, + getCommits, + logIn, + isLoggedIn +}; diff --git a/src/git-providers/providers.js b/src/git-providers/providers.js index 6db07d3..f18a4de 100644 --- a/src/git-providers/providers.js +++ b/src/git-providers/providers.js @@ -1,6 +1,7 @@ import cliProvider from "./cli-provider"; import githubProvider from "./github-provider"; import vscodeProvider from "./vscode-provider"; +import gitlabProvider from "./gitlab-provider"; export default function getGitProvider() { switch (process.env.REACT_APP_GIT_PROVIDER) { @@ -8,7 +9,12 @@ export default function getGitProvider() { return cliProvider; case "vscode": return vscodeProvider; - default: + default: { + const [cloud] = window.location.host.split("."); + if (cloud === "gitlab") { + return gitlabProvider; + } return githubProvider; + } } }