190 lines
5.6 KiB
JavaScript
190 lines
5.6 KiB
JavaScript
import axios from "axios";
|
||
|
||
import config from "@/config.js";
|
||
|
||
const api_base = config.api;
|
||
|
||
const LoadingStatus = Object.freeze({
|
||
Loaded: { loading: false, error: false },
|
||
Loading: { loading: true, error: false },
|
||
Error: { loading: false, error: true },
|
||
});
|
||
|
||
const infobaseByName = (state) => (name) =>
|
||
state.infobases.find((infobase) => name === infobase.name);
|
||
|
||
function setInfobaseLock(state, { name, lock }) {
|
||
const locked = state.locked_bases.includes(name);
|
||
if (locked === lock) return;
|
||
if (lock) {
|
||
state.locked_bases.push(name);
|
||
} else {
|
||
const idx = state.locked_bases.findIndex((x) => name === x);
|
||
state.locked_bases.splice(idx, 1);
|
||
}
|
||
}
|
||
|
||
export default {
|
||
state: {
|
||
publicated: [],
|
||
available: [],
|
||
infobases: [],
|
||
error_message: "",
|
||
loading_error: false,
|
||
is_loading: false,
|
||
locked_bases: [],
|
||
},
|
||
mutations: {
|
||
setLoadingStatus(state, { loading, error }) {
|
||
state.is_loading = loading && !error;
|
||
state.loading_error = error;
|
||
},
|
||
setInfobases(state, infobases) {
|
||
state.infobases = infobases;
|
||
},
|
||
setErrorMessage(state, message) {
|
||
state.error_message = message;
|
||
},
|
||
setInfobaseLock(state, { name, lock }) {
|
||
setInfobaseLock(state, { name, lock });
|
||
},
|
||
lockInfobase(state, name) {
|
||
setInfobaseLock(state, { name, lock: true });
|
||
},
|
||
unlockInfobase(state, name) {
|
||
setInfobaseLock(state, { name, lock: false });
|
||
},
|
||
setInfobase(state, { name, infobase }) {
|
||
const idx = state.infobases.findIndex((x) => name === x.name);
|
||
if (-1 === idx) {
|
||
state.infobases.push(infobase);
|
||
} else {
|
||
if (null == infobase) {
|
||
state.infobases.splice(idx, 1);
|
||
setInfobaseLock(state, { name, lock: false });
|
||
} else {
|
||
infobase.publicated = true;
|
||
state.infobases[idx] = infobase;
|
||
}
|
||
}
|
||
},
|
||
setInfobaseURL(state, { name, url }) {
|
||
const infobase = infobaseByName(state)(name);
|
||
if (infobase === undefined) return;
|
||
infobase.url = url;
|
||
},
|
||
setInfobasePublication(state, { name, publicated }) {
|
||
const infobase = infobaseByName(state)(name);
|
||
if (infobase === undefined) return;
|
||
infobase.publicated = publicated;
|
||
},
|
||
},
|
||
actions: {
|
||
async fetchInfobases(ctx) {
|
||
ctx.commit("setLoadingStatus", LoadingStatus.Loading);
|
||
try {
|
||
const res = await axios.get(`${api_base}/infobases-all`);
|
||
if (!res) {
|
||
ctx.commit("setLoadingStatus", LoadingStatus.Error);
|
||
return;
|
||
}
|
||
const infobases = res.data;
|
||
if (!Array.isArray(infobases)) {
|
||
ctx.commit("setLoadingStatus", LoadingStatus.Error);
|
||
return;
|
||
}
|
||
ctx.commit("setInfobases", infobases);
|
||
ctx.commit("setLoadingStatus", LoadingStatus.Loaded);
|
||
} catch (err) {
|
||
ctx.commit("setLoadingStatus", LoadingStatus.Error);
|
||
}
|
||
},
|
||
async fetchInfobase(ctx, name) {
|
||
ctx.commit("lockInfobase", name);
|
||
try {
|
||
const res = await axios.get(`${api_base}/infobases-all`);
|
||
if (!res) {
|
||
return;
|
||
}
|
||
const infobase = res.data.find((i) => name === i.name);
|
||
ctx.commit("setInfobase", { name, infobase });
|
||
ctx.commit("unlockInfobase", name);
|
||
} catch (err) {
|
||
ctx.commit(
|
||
"setErrorMessage",
|
||
`Ошибка получения информации о базе: ${name}`
|
||
);
|
||
ctx.commit("setInfobase", { name, infobase: null });
|
||
} finally {
|
||
ctx.commit("unlockInfobase", name);
|
||
}
|
||
},
|
||
async updateInfobaseURL(ctx, { name, url }) {
|
||
const infobase = ctx.getters.getInfobaseByName(name);
|
||
const data = {
|
||
...infobase,
|
||
url,
|
||
};
|
||
|
||
ctx.commit("lockInfobase", name);
|
||
|
||
try {
|
||
await axios.post(`${api_base}/publications`, data);
|
||
ctx.commit("setInfobaseURL", { name, url });
|
||
ctx.commit("setErrorMessage", "");
|
||
} catch (err) {
|
||
ctx.commit("setErrorMessage", `Ошибка обновления URL для базы ${name}`);
|
||
} finally {
|
||
ctx.commit("unlockInfobase", name);
|
||
}
|
||
},
|
||
async addInfobasePublication(ctx, name) {
|
||
const infobase = ctx.getters.getInfobaseByName(name);
|
||
if (infobase.publicated) return;
|
||
|
||
ctx.commit("lockInfobase", name);
|
||
try {
|
||
await axios.put(`${api_base}/publications`, { id: name, name });
|
||
ctx.commit("setErrorMessage", "");
|
||
ctx.dispatch("fetchInfobase", name);
|
||
} catch (err) {
|
||
ctx.commit("setErrorMessage", `Ошибка публикации базы ${name}`);
|
||
ctx.commit("unlockInfobase", name);
|
||
}
|
||
},
|
||
async removeInfobasePublication(ctx, name) {
|
||
const infobase = ctx.getters.getInfobaseByName(name);
|
||
if (!infobase.publicated) return;
|
||
|
||
ctx.commit("lockInfobase", name);
|
||
try {
|
||
await axios.delete(`${api_base}/publications/${name}`);
|
||
ctx.commit("setErrorMessage", "");
|
||
ctx.dispatch("fetchInfobase", name);
|
||
} catch (err) {
|
||
ctx.commit("setErrorMessage", `Ошибка отмены публикации базы ${name}`);
|
||
ctx.commit("unlockInfobase", name);
|
||
}
|
||
},
|
||
},
|
||
getters: {
|
||
errorMessage(state) {
|
||
return state.error_message;
|
||
},
|
||
allInfobases(state) {
|
||
return state.infobases;
|
||
},
|
||
getLockedInfobases(state) {
|
||
return state.locked_bases;
|
||
},
|
||
isInfobaseLocked: (state) => (name) => state.locked_bases.includes(name),
|
||
getInfobaseByName: infobaseByName,
|
||
isLoading(state) {
|
||
return state.is_loading;
|
||
},
|
||
isLoadingError(state) {
|
||
return state.loading_error;
|
||
},
|
||
},
|
||
};
|