Files
backend/web/app.js
Andriy Oblivantsev c2aa716ed8
CI / test (push) Successful in 5s
Switch local API port to 8122 and keep DB internal.
Update runtime defaults, compose mappings, frontend defaults, and developer docs to use port 8122 while keeping PostGIS reachable only via the internal compose network.

Made-with: Cursor
2026-03-01 12:12:44 +00:00

82 lines
2.1 KiB
JavaScript

import { createApiClient } from "./api.js";
const { createApp, ref, reactive, onMounted } = Vue;
createApp({
setup() {
const apiBase = ref(localStorage.getItem("geo_api_base") || "http://localhost:8122");
const state = reactive({
publicKey: "",
privateKey: "",
accessToken: "",
collections: [],
newCollectionName: "",
status: "Ready",
});
let client = createApiClient(apiBase.value);
const rebuildClient = () => {
client = createApiClient(apiBase.value);
localStorage.setItem("geo_api_base", apiBase.value);
state.status = `API base set to ${apiBase.value}`;
};
const ensureKeys = async () => {
try {
const keys = await client.ensureKeysInStorage();
state.publicKey = keys.publicKey;
state.privateKey = keys.privateKey;
state.status = "Keys loaded from localStorage.";
} catch (err) {
state.status = err.message;
}
};
const login = async () => {
try {
state.accessToken = await client.loginWithSignature(state.publicKey, state.privateKey);
client.setAccessToken(state.accessToken);
state.status = "Authenticated.";
} catch (err) {
state.status = err.message;
}
};
const listCollections = async () => {
try {
client.setAccessToken(state.accessToken);
const data = await client.listCollections();
state.collections = data.collections || [];
} catch (err) {
state.status = err.message;
}
};
const createCollection = async () => {
try {
client.setAccessToken(state.accessToken);
await client.createCollection(state.newCollectionName);
state.newCollectionName = "";
await listCollections();
} catch (err) {
state.status = err.message;
}
};
onMounted(async () => {
await ensureKeys();
});
return {
apiBase,
state,
rebuildClient,
ensureKeys,
login,
listCollections,
createCollection,
};
},
}).use(Vuetify.createVuetify()).mount("#app");