-
+
+
+
+ Produkt-Konfiguration
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+ Pflege: Latest setzen
+
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
Assets
+
+
+
+
+
+
-
- Maintenance: Set Latest
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+ Manifest (Produkt-spezifisch)
+ GET /v1/manifest?product=...
+
+
-
- Manifest
- ETag-aware GET /v1/manifest
-
-
+
+ Neues Produkt anlegen
+
+
+
+
+
+
+
-
-
\ No newline at end of file
+ async function makeDefault(){
+ const p = product(); if(!p){ alert('Kein Produkt gewählt'); return }
+ const payload = { DefaultProduct: p };
+ const r = await api('/v1/config', { method:'POST', headers:{ 'Content-Type':'application/json', ...tokenHeader() }, body: JSON.stringify(payload) });
+ const txt = await r.text(); log(txt); await loadProducts();
+ }
+
+ async function createProduct(){
+ const name = $('#newProdName').value.trim(); if(!name){ alert('Produkt-Name fehlt'); return }
+ const payload = { product: name, default_branch: $('#newProdBranch').value.trim(), default_channel: $('#newProdChannel').value };
+ const r = await api('/v1/products', { method:'POST', headers:{ 'Content-Type':'application/json', ...tokenHeader() }, body: JSON.stringify(payload) });
+ const txt = await r.text(); log(txt);
+ await loadProducts();
+ $('#product').value = name; localStorage.setItem('product', name);
+ await Promise.all([loadValues(), loadManifest()]);
+ }
+
+ async function publish(){
+ const p = product(); if(!p){ alert('Kein Produkt gewählt'); return }
+ const assets = Array.from(document.querySelectorAll('.asset-row')).map(row=>{
+ const [url,sha,size,sig] = row.querySelectorAll('input');
+ const a={ url:url.value.trim(), sha256:sha.value.trim() };
+ if(size.value.trim()) a.size_bytes = parseInt(size.value.trim(),10);
+ if(sig.value.trim()) a.signature_url = sig.value.trim();
+ return a;
+ }).filter(a=>a.url && a.sha256);
+
+ const payload = {
+ branch: $('#branch').value.trim() || $('#defBranch').value.trim(),
+ channel: $('#channel').value,
+ arch: $('#arch').value,
+ bit: $('#bit').value,
+ os: $('#os').value,
+ release: {
+ version: $('#version').value.trim(),
+ build: $('#build').value.trim(),
+ released_at: $('#releasedAt').value.trim(),
+ notes_url: $('#notesUrl').value.trim(),
+ assets
+ }
+ };
+
+ const r = await api('/v1/publish?product='+encodeURIComponent(p), { method:'POST', headers:{ 'Content-Type':'application/json', ...tokenHeader() }, body: JSON.stringify(payload) });
+ const txt = await r.text(); log(txt); await loadManifest();
+ }
+
+ async function loadLatest(){
+ const p = product(); if(!p){ alert('Kein Produkt gewählt'); return }
+ const params = new URLSearchParams({
+ product: p,
+ branch: $('#branch').value.trim() || $('#defBranch').value.trim(),
+ channel: $('#channel').value,
+ arch: $('#arch').value,
+ bit: $('#bit').value,
+ os: $('#os').value
+ });
+ const r = await api('/v1/latest?'+params.toString());
+ if(!r.ok){ log('not found'); return; }
+ const j = await r.json();
+ $('#version').value = j.release.version || '';
+ $('#build').value = j.release.build || '';
+ $('#releasedAt').value = (j.release.released_at||'');
+ $('#notesUrl').value = j.release.notes_url || '';
+ $('#assets').innerHTML='';
+ (j.release.assets||[]).forEach(a=>addAssetRow({ url:a.url, sha256:a.sha256, size_bytes:a.size_bytes||'', signature_url:a.signature_url||'' }));
+ if((j.release.assets||[]).length===0) addAssetRow();
+ }
+
+ // init
+ (function(){
+ $('#token').value = localStorage.getItem('apiToken')||'';
+ $('#token').addEventListener('input', e=> localStorage.setItem('apiToken', e.target.value));
+ $('#product').addEventListener('change', async e=>{ localStorage.setItem('product', e.target.value); await Promise.all([loadValues(), loadManifest()]); });
+ $('#addAsset').addEventListener('click', e=>{ e.preventDefault(); addAssetRow(); });
+ $('#publish').addEventListener('click', e=>{ e.preventDefault(); publish(); });
+ $('#loadLatest').addEventListener('click', e=>{ e.preventDefault(); loadLatest(); });
+ $('#saveProductCfg').addEventListener('click', e=>{ e.preventDefault(); saveProductCfg(); });
+ $('#saveVendorCfg').addEventListener('click', e=>{ e.preventDefault(); saveVendorCfg(); });
+ $('#makeDefault').addEventListener('click', e=>{ e.preventDefault(); makeDefault(); });
+ $('#createProduct').addEventListener('click', e=>{ e.preventDefault(); createProduct(); });
+ addAssetRow(); loadProducts();
+ })();
+
+
+