180 lines
5.3 KiB
JavaScript
180 lines
5.3 KiB
JavaScript
const prefix = document.getElementsByTagName("base")[0].href;
|
|
async function unknownResponse(resp) {
|
|
let json = await resp.json();
|
|
try {
|
|
return new Error(`${json["message"]} (${resp.status})`);
|
|
}
|
|
catch (error) {
|
|
return new Error(`Server sent unknown error: ${await resp.text()} (${resp.status})`);
|
|
}
|
|
}
|
|
function buildQuery(options) {
|
|
let query;
|
|
options.forEach(element => {
|
|
if (element[1] !== undefined) {
|
|
if (element[1] instanceof Date) {
|
|
element[1] = element[1].getSeconds();
|
|
}
|
|
else if (element[1] instanceof Array) {
|
|
element[1] = JSON.stringify(element[1]);
|
|
}
|
|
query.push(`${element[0]}=${element[1]}`);
|
|
}
|
|
});
|
|
return query.join("&");
|
|
}
|
|
async function login(username, password) {
|
|
let result = await fetch(`${prefix}/api/login`, {
|
|
method: "POST",
|
|
body: JSON.stringify({ "username": username, "password": password })
|
|
});
|
|
switch (result.status) {
|
|
case 200:
|
|
return;
|
|
case 401:
|
|
throw new Error("Wrong username and/or password");
|
|
default:
|
|
throw await unknownResponse(result);
|
|
}
|
|
}
|
|
async function authors(name, limit) {
|
|
let query = [["name", name], ["limit", limit]];
|
|
let result = await fetch(`${prefix}/api/authors?${buildQuery(query)}`);
|
|
if (result.status == 200) {
|
|
return await result.json();
|
|
}
|
|
else {
|
|
throw await unknownResponse(result);
|
|
}
|
|
}
|
|
async function tags(name, limit) {
|
|
let query = [["name", name], ["limit", limit]];
|
|
let result = await fetch(`${prefix}/api/tags?${buildQuery(query)}`);
|
|
if (result.status == 200) {
|
|
return await result.json();
|
|
}
|
|
else {
|
|
throw await unknownResponse(result);
|
|
}
|
|
}
|
|
async function recent(limit = 20) {
|
|
let query = [["limit", limit]];
|
|
let result = await fetch(`${prefix}/api/recent?limit=${buildQuery(query)}`);
|
|
if (result.status == 200) {
|
|
return await result.json();
|
|
}
|
|
else {
|
|
throw await unknownResponse(result);
|
|
}
|
|
}
|
|
async function search(q) {
|
|
let query = [["q", q.query], ["from", q.from], ["to", q.to], ["authors", q.authors], ["tags", q.tags], ["limit", q.limit]];
|
|
let result = await fetch(`${prefix}/api/search?${buildQuery(query)}`);
|
|
if (result.status == 200) {
|
|
return await result.json();
|
|
}
|
|
else {
|
|
throw unknownResponse(result);
|
|
}
|
|
}
|
|
async function uploadArticle(payload) {
|
|
let result = await fetch(`${prefix}/api/article`, {
|
|
method: "POST",
|
|
body: JSON.stringify(payload)
|
|
});
|
|
switch (result.status) {
|
|
case 201:
|
|
return await result.json();
|
|
case 401:
|
|
throw new Error("Not authorized");
|
|
case 409:
|
|
throw new Error("An article with the same title already exists");
|
|
default:
|
|
throw await unknownResponse(result);
|
|
}
|
|
}
|
|
async function editArticle(payload) {
|
|
let result = await fetch(`${prefix}/api/article`, {
|
|
method: "PATCH",
|
|
body: JSON.stringify(payload)
|
|
});
|
|
let json = await result.json();
|
|
switch (result.status) {
|
|
case 201:
|
|
return json;
|
|
case 401:
|
|
throw new Error("Not authorized");
|
|
case 404:
|
|
throw new Error("Could not find article");
|
|
case 409:
|
|
throw new Error("An article with the same title already exists");
|
|
default:
|
|
throw await unknownResponse(result);
|
|
}
|
|
}
|
|
async function deleteArticle(id) {
|
|
let result = await fetch(`${prefix}/api/article`, {
|
|
method: "DELETE",
|
|
body: JSON.stringify({ "id": id })
|
|
});
|
|
switch (result.status) {
|
|
case 200:
|
|
return;
|
|
case 401:
|
|
throw new Error("Not authorized");
|
|
case 404:
|
|
throw new Error("Could not find article");
|
|
default:
|
|
throw await unknownResponse(result);
|
|
}
|
|
}
|
|
async function getAssets(name, limit = 20) {
|
|
let query = [["q", name], ["limit", limit]];
|
|
let result = await fetch(`${prefix}/api/assets?${buildQuery(query)}`, {
|
|
method: "GET",
|
|
});
|
|
switch (result.status) {
|
|
case 200:
|
|
return await result.json();
|
|
case 401:
|
|
throw new Error("Not authorized");
|
|
default:
|
|
throw await unknownResponse(result);
|
|
}
|
|
}
|
|
async function addAsset(name, content) {
|
|
let result = await fetch(`${prefix}/api/assets`, {
|
|
method: "POST",
|
|
body: JSON.stringify({
|
|
"name": name,
|
|
"content": content,
|
|
})
|
|
});
|
|
switch (result.status) {
|
|
case 201:
|
|
return await result.json();
|
|
case 401:
|
|
throw new Error("Not authorized");
|
|
case 409:
|
|
throw new Error("An asset with the same name already exists");
|
|
default:
|
|
throw await unknownResponse(result);
|
|
}
|
|
}
|
|
async function deleteAsset(id) {
|
|
let result = await fetch(`${prefix}/api/assets`, {
|
|
method: "DELETE",
|
|
body: JSON.stringify({ "id": id })
|
|
});
|
|
switch (result.status) {
|
|
case 200:
|
|
return;
|
|
case 401:
|
|
throw new Error("Not authorized");
|
|
case 404:
|
|
throw new Error("An asset with this id does not exist");
|
|
default:
|
|
throw await unknownResponse(result);
|
|
}
|
|
}
|
|
//# sourceMappingURL=api.js.map
|