Implement geo backend, TS client, frontend, and CI tests.
Add a Go HTTP API with Ed25519 auth and invitation onboarding, user-scoped GeoJSON Point management, a Bun-tested @noble/ed25519 TypeScript client, static Vue/Vuetify frontend integration, and a Gitea CI workflow running both Go and Bun test suites. Made-with: Cursor
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Momswap Geo Console</title>
|
||||
<link href="https://cdn.jsdelivr.net/npm/vuetify@3.7.7/dist/vuetify.min.css" rel="stylesheet" />
|
||||
<style>
|
||||
body {
|
||||
background: linear-gradient(135deg, #0f172a 0%, #1e293b 100%);
|
||||
}
|
||||
.glass {
|
||||
backdrop-filter: blur(8px);
|
||||
background: rgba(15, 23, 42, 0.7);
|
||||
border: 1px solid rgba(148, 163, 184, 0.2);
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="app">
|
||||
<v-app theme="dark">
|
||||
<v-container class="py-8">
|
||||
<v-row>
|
||||
<v-col cols="12">
|
||||
<v-card class="glass rounded-xl pa-6">
|
||||
<v-card-title class="text-h4 mb-2">Momswap Geo Backend Console</v-card-title>
|
||||
<v-card-subtitle>Ed25519 auth, invitation onboarding, and user-scoped feature collections</v-card-subtitle>
|
||||
</v-card>
|
||||
</v-col>
|
||||
</v-row>
|
||||
|
||||
<v-row>
|
||||
<v-col cols="12" md="6">
|
||||
<v-card class="glass rounded-xl pa-4">
|
||||
<v-card-title>Connection & Identity</v-card-title>
|
||||
<v-text-field v-model="apiBase" label="API Base URL"></v-text-field>
|
||||
<v-btn color="primary" @click="rebuildClient">Apply API URL</v-btn>
|
||||
<v-divider class="my-4"></v-divider>
|
||||
<v-btn color="secondary" @click="ensureKeys">Ensure Keys in localStorage</v-btn>
|
||||
<v-textarea v-model="state.publicKey" class="mt-3" label="Public Key" rows="2"></v-textarea>
|
||||
<v-textarea v-model="state.privateKey" label="Private Key (local only)" rows="2"></v-textarea>
|
||||
<v-btn color="success" class="mt-2" @click="login">Login</v-btn>
|
||||
</v-card>
|
||||
</v-col>
|
||||
|
||||
<v-col cols="12" md="6">
|
||||
<v-card class="glass rounded-xl pa-4">
|
||||
<v-card-title>Collections</v-card-title>
|
||||
<v-text-field v-model="state.newCollectionName" label="New collection name"></v-text-field>
|
||||
<v-btn color="primary" @click="createCollection">Create Collection</v-btn>
|
||||
<v-btn class="ml-2" @click="listCollections">Refresh</v-btn>
|
||||
<v-list class="mt-4">
|
||||
<v-list-item v-for="item in state.collections" :key="item.id">
|
||||
<v-list-item-title>{{ item.name }}</v-list-item-title>
|
||||
<v-list-item-subtitle>{{ item.id }}</v-list-item-subtitle>
|
||||
</v-list-item>
|
||||
</v-list>
|
||||
</v-card>
|
||||
</v-col>
|
||||
</v-row>
|
||||
|
||||
<v-row>
|
||||
<v-col cols="12">
|
||||
<v-alert type="info" variant="tonal">{{ state.status }}</v-alert>
|
||||
</v-col>
|
||||
</v-row>
|
||||
</v-container>
|
||||
</v-app>
|
||||
</div>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/vue@3.5.13/dist/vue.global.prod.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/vuetify@3.7.7/dist/vuetify.min.js"></script>
|
||||
<script type="module" src="./app.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user