Skip to content

Commit

Permalink
refactoring of the gitlab integration. closes issue #29
Browse files Browse the repository at this point in the history
  • Loading branch information
feserm committed Mar 4, 2024
1 parent aef21fc commit 0aa8d60
Show file tree
Hide file tree
Showing 4 changed files with 213 additions and 196 deletions.
52 changes: 3 additions & 49 deletions src/App.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -25,57 +25,11 @@ import { appstate } from '@/stores/appstate';
import { partialview } from '@/stores/partialview';
import { isaObj, isaStr } from '@/stores/isa.js';
import ManualExplanation from '@/components/ManualExplanation.svelte';
import { CLIENT_ID, CLIENT_SECRET, base_url, gitlab_repsonse } from '@/stores/gitlab-api.js';
import { init } from '@/stores/gitlab-api.js';
import { onMount } from 'svelte';
onMount(async () => {
const urlParams = new URLSearchParams(window.location.search);
const code = urlParams.get('code');
if (code) {
$isaObj = JSON.parse(localStorage.getItem('isaobj'));
localStorage.removeItem('isaobj');
fetch("/data/gitlab.json")
.then((res) => res.json())
.then((data) => {
CLIENT_ID.set(data['client-id'])
CLIENT_SECRET.set(data['client-secret'])
let queryObj = {
client_id: $CLIENT_ID,
client_secret: $CLIENT_SECRET,
code: code,
grant_type: 'authorization_code',
redirect_uri: window.origin
}
let queryString = Object.keys(queryObj).map(key => key + '=' + queryObj[key]).join('&');
fetch(`${base_url}/oauth/token?${queryString}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
}
})
.then(
response => response.json()
)
.then(
data => {
$gitlab_repsonse=data;
}
)
.catch(
error => console.error('Error:', error)
);
$appstate=appstate.GUI;
})
.catch((_) => {
console.error("gitlab client configuration not available");
CLIENT_ID.set("")
CLIENT_SECRET.set("")
})
}
onMount(async ()=>{
init()
});
let showJson = false;
Expand Down
152 changes: 152 additions & 0 deletions src/components/gitlab/Gitlab.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
<script>
import { base_url, gitlab_repsonse } from "@/stores/gitlab-api";
import { isaObj } from "@/stores/isa";
import { ArcInvestigation_fromJsonString } from "@nfdi4plants/arctrl/ISA/ISA.Json/Investigation";
import { ARC } from "@nfdi4plants/arctrl";
import { Xlsx } from "@fslab/fsspreadsheet";
import { DataFrame } from "dataframe-js";
function publish() {
// @ts-ignore
$isaObj.filename='isa.investigation.xlsx';
// @ts-ignore
for (let study of $isaObj.studies) {
study.filename = `${study.title}/isa.study.xlsx`;
for (let assay of study.assays) {
assay.filename = `${study.title}/isa.assay.xlsx`;
}
study = study;
}
toArc();
}
async function toArc() {
const investigation = ArcInvestigation_fromJsonString(JSON.stringify($isaObj, null, 2));
let arc = new ARC(investigation);
arc.UpdateFileSystem();
let contracts = arc.GetWriteContracts();
fulfillWriteContracts(contracts);
}
async function fulfillWriteContracts(contracts) {
let namespace;
let project;
await fetch(`${base_url}/api/v4/user`, {
method: 'GET',
headers: {
'Accept': 'application/json',
'Authorization': `Bearer ${$gitlab_repsonse.access_token}`,
'Content-Type': 'application/json'}
}).then((resp) => {
return resp.json();
}).then(async (userinfo) => {
await fetch(`${base_url}/api/v4/namespaces?search=${userinfo.username}`, {
method: 'GET',
headers: {
'Accept': 'application/json',
'Authorization': `Bearer ${$gitlab_repsonse.access_token}`,
'Content-Type': 'application/json'
}
}).then(async (resp) => {
namespace = await resp.json();
});
});
await fetch(`${base_url}/api/v4/projects`, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Authorization': `Bearer ${$gitlab_repsonse.access_token}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
// @ts-ignore
"name": $isaObj.title,
// @ts-ignore
"namespace_id": namespace[0].id,
"initialize_with_readme": false,
"visibility": "private"
})
}).then(async (resp) => {
project = await resp.json();
})
let payload = {
"branch": "main",
"commit_message": "Initial commit",
"actions": []
}
for (const contract of contracts) {
if (contract.Operation = "CREATE") {
if (contract.DTO == undefined) {
} else if (contract.DTOType == "ISA_Assay" || contract.DTOType == "ISA_Study" || contract.DTOType == "ISA_Investigation") {
let xlsxBytes = await Xlsx.toBytes(contract.DTO);
let base64String = btoa(String.fromCharCode.apply(null, xlsxBytes));
payload.actions.push({
"action": "create",
"file_path": contract.Path,
"content": base64String,
"encoding": "base64",
})
} else if (contract.DTOType == "PlainText") {
payload.actions.push({
"action": "create",
"file_path": contract.Path,
"content": contract.DTO,
"encoding": "text",
})
} else {
console.log("Warning: The given contract is not a correct ARC write contract: ", contract)
}
}
}
// @ts-ignore
for (let study of $isaObj.studies) {
for (let assay of study.assays) {
for (let file of assay.dataFiles) {
let df = new TextEncoder().encode(new DataFrame(JSON.parse(file.comments[0].value)).toCSV(true));
payload.actions.push({
"action": "create",
"file_path": `assays/${study.title}/datasets/${file.name}`,
"content": btoa(String.fromCharCode.apply(null, df)),
"encoding": "base64",
})
}
}
}
// @ts-ignore
await fetch(`${base_url}/api/v4/projects/${project.id}/repository/commits`, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Authorization': `Bearer ${$gitlab_repsonse.access_token}`,
'Content-Type': 'application/json'
},
body: JSON.stringify(payload)
}).then(async (resp) => {
console.log(await resp.json());
});
}
</script>

<section>
<div class="align-right">
<button class="btn" on:click={publish}>Publish on DataHub</button>
</div>
</section>

<style>
.align-right {
display: flex;
align-items: flex-end;
justify-content: flex-end;
}
</style>

151 changes: 5 additions & 146 deletions src/components/gui/Gui.svelte
Original file line number Diff line number Diff line change
@@ -1,154 +1,13 @@
<script>
import { base_url, gitlab_repsonse } from "@/stores/gitlab-api";
import Investigation from "./Investigation.svelte";
import { isaObj } from "@/stores/isa";
import { ArcInvestigation_fromJsonString } from "@nfdi4plants/arctrl/ISA/ISA.Json/Investigation";
import { ARC } from "@nfdi4plants/arctrl";
import { Xlsx } from "@fslab/fsspreadsheet";
import { DataFrame } from "dataframe-js";
function publish() {
console.log("Publishing on DataHub");
// @ts-ignore
$isaObj.filename='isa.investigation.xlsx';
// @ts-ignore
for (let study of $isaObj.studies) {
study.filename = `${study.title}/isa.study.xlsx`;
for (let assay of study.assays) {
assay.filename = `${study.title}/isa.assay.xlsx`;
}
study = study;
}
toArc();
}
async function toArc() {
const investigation = ArcInvestigation_fromJsonString(JSON.stringify($isaObj, null, 2));
let arc = new ARC(investigation);
arc.UpdateFileSystem();
let contracts = arc.GetWriteContracts();
fulfillWriteContracts(contracts);
}
async function fulfillWriteContracts(contracts) {
let namespace;
let project;
await fetch(`${base_url}/api/v4/user`, {
method: 'GET',
headers: {
'Accept': 'application/json',
'Authorization': `Bearer ${$gitlab_repsonse.access_token}`,
'Content-Type': 'application/json'}
}).then((resp) => {
return resp.json();
}).then(async (userinfo) => {
await fetch(`${base_url}/api/v4/namespaces?search=${userinfo.username}`, {
method: 'GET',
headers: {
'Accept': 'application/json',
'Authorization': `Bearer ${$gitlab_repsonse.access_token}`,
'Content-Type': 'application/json'
}
}).then(async (resp) => {
namespace = await resp.json();
});
});
import Gitlab from '../gitlab/Gitlab.svelte';
await fetch(`${base_url}/api/v4/projects`, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Authorization': `Bearer ${$gitlab_repsonse.access_token}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
// @ts-ignore
"name": $isaObj.title,
// @ts-ignore
"namespace_id": namespace[0].id,
"initialize_with_readme": false,
"visibility": "private"
})
}).then(async (resp) => {
project = await resp.json();
})
let payload = {
"branch": "main",
"commit_message": "Initial commit",
"actions": []
}
for (const contract of contracts) {
if (contract.Operation = "CREATE") {
if (contract.DTO == undefined) {
} else if (contract.DTOType == "ISA_Assay" || contract.DTOType == "ISA_Study" || contract.DTOType == "ISA_Investigation") {
let xlsxBytes = await Xlsx.toBytes(contract.DTO);
let base64String = btoa(String.fromCharCode.apply(null, xlsxBytes));
payload.actions.push({
"action": "create",
"file_path": contract.Path,
"content": base64String,
"encoding": "base64",
})
} else if (contract.DTOType == "PlainText") {
payload.actions.push({
"action": "create",
"file_path": contract.Path,
"content": contract.DTO,
"encoding": "text",
})
} else {
console.log("Warning: The given contract is not a correct ARC write contract: ", contract)
}
}
}
// @ts-ignore
for (let study of $isaObj.studies) {
for (let assay of study.assays) {
for (let file of assay.dataFiles) {
let df = new TextEncoder().encode(new DataFrame(JSON.parse(file.comments[0].value)).toCSV(true));
payload.actions.push({
"action": "create",
"file_path": `assays/${study.title}/datasets/${file.name}`,
"content": btoa(String.fromCharCode.apply(null, df)),
"encoding": "base64",
})
}
}
}
import { gitlab_repsonse } from "@/stores/gitlab-api";
import Investigation from "./Investigation.svelte";
// @ts-ignore
await fetch(`${base_url}/api/v4/projects/${project.id}/repository/commits`, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Authorization': `Bearer ${$gitlab_repsonse.access_token}`,
'Content-Type': 'application/json'
},
body: JSON.stringify(payload)
}).then(async (resp) => {
console.log(await resp.json());
});
}
</script>

<Investigation />

{#if $gitlab_repsonse.access_token}
<div class="align-right">
<button class="btn" on:click={publish}>Publish on DataHub</button>
</div>
{/if}

<style>
.align-right {
display: flex;
justify-content: flex-end;
}
</style>
<Gitlab/>
{/if}
Loading

0 comments on commit 0aa8d60

Please sign in to comment.