settings file and screen
This commit is contained in:
1
webapp/.gitignore
vendored
1
webapp/.gitignore
vendored
@@ -17,6 +17,7 @@ Thumbs.db
|
||||
.env.*
|
||||
!.env.example
|
||||
!.env.test
|
||||
settings.json
|
||||
|
||||
# Vite
|
||||
vite.config.js.timestamp-*
|
||||
|
||||
@@ -7,6 +7,7 @@ COPY . .
|
||||
RUN npm install && npm run build
|
||||
|
||||
ENV DATABASE_URL=file:/data/local.db
|
||||
ENV SETTINGS_PATH=/data/settings.json
|
||||
ENV BODY_SIZE_LIMIT=100M
|
||||
ENV NODE_TLS_REJECT_UNAUTHORIZED=0
|
||||
|
||||
|
||||
19
webapp/src/lib/server/settings.js
Normal file
19
webapp/src/lib/server/settings.js
Normal file
@@ -0,0 +1,19 @@
|
||||
import { env } from "$env/dynamic/private";
|
||||
import fs from "fs";
|
||||
|
||||
export function readSettings() {
|
||||
if (fs.existsSync(env.SETTINGS_PATH)) {
|
||||
const rawFileData = fs.readFileSync(env.SETTINGS_PATH, 'utf-8');
|
||||
const fileData = JSON.parse(rawFileData);
|
||||
return fileData;
|
||||
} else {
|
||||
const fileData = {TAM3_REMOTE: env.TAM3_REMOTE || "", TAM3_REMOTE_KEY: env.TAM3_REMOTE_KEY || ""};
|
||||
fs.writeFileSync(env.SETTINGS_PATH, JSON.stringify(fileData, null, 2));
|
||||
return fileData;
|
||||
}
|
||||
}
|
||||
|
||||
export function writeSettings(settingsObj) {
|
||||
fs.writeFileSync(env.SETTINGS_PATH, JSON.stringify(settingsObj, null, 2));
|
||||
return "File written successfully."
|
||||
}
|
||||
@@ -74,6 +74,7 @@
|
||||
<div class="flex-row">
|
||||
<a href="/prefixes" target="_blank" class="styled">Prefix Editor</a>
|
||||
<a href="/backuprestore" target="_blank" class="styled">Backup/Restore</a>
|
||||
<a href="/settings" target="_blank" class="styled">Settings</a>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { env } from "$env/dynamic/private";
|
||||
import { readSettings } from "$lib/server/settings";
|
||||
|
||||
export async function GET() {
|
||||
const env = readSettings();
|
||||
if (env.TAM3_REMOTE) {
|
||||
const res = await fetch(`${env.TAM3_REMOTE}/api/?api_key=${env.TAM3_REMOTE_KEY}`);
|
||||
if (!res.ok) {
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
import { env } from "$env/dynamic/private";
|
||||
import { readSettings } from "$lib/server/settings";
|
||||
import { db } from "$lib/server/db";
|
||||
import { prefixes, tickets, baskets } from "$lib/server/db/schema";
|
||||
import { sql } from "drizzle-orm";
|
||||
import { chunkArray } from "$lib/server/chunkArray";
|
||||
|
||||
export async function GET() {
|
||||
const env = readSettings();
|
||||
if (env.TAM3_REMOTE) {
|
||||
const res = await fetch(`${env.TAM3_REMOTE}/api/backuprestore/?api_key=${env.TAM3_REMOTE_KEY}`);
|
||||
if (!res.ok) {
|
||||
@@ -21,6 +22,7 @@ export async function GET() {
|
||||
}
|
||||
|
||||
export async function POST({ request }) {
|
||||
const env = readSettings();
|
||||
const req = await request.json();
|
||||
for (let prefixChunk of chunkArray(req.prefixes, 300)) {
|
||||
await db.insert(prefixes).values(prefixChunk).onConflictDoUpdate({target: prefixes.name, set: {color: sql`excluded.color`, weight: sql`excluded.weight`}});
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
import { env } from "$env/dynamic/private";
|
||||
import { readSettings } from "$lib/server/settings";
|
||||
import { db } from "$lib/server/db";
|
||||
import { sql } from "drizzle-orm";
|
||||
import { baskets } from "$lib/server/db/schema";
|
||||
import { chunkArray } from "$lib/server/chunkArray";
|
||||
|
||||
export async function GET() {
|
||||
const env = readSettings();
|
||||
if (env.TAM3_REMOTE) {
|
||||
const res = await fetch(`${env.TAM3_REMOTE}/api/baskets/?api_key=${env.TAM3_REMOTE_KEY}`);
|
||||
if (!res.ok) {
|
||||
@@ -27,19 +28,20 @@ export async function GET() {
|
||||
}
|
||||
|
||||
export async function POST({ request }) {
|
||||
const i_baskets = await request.json();
|
||||
for (let basketChunk of chunkArray(i_baskets, 300)) {
|
||||
await db.insert(baskets).values(basketChunk)
|
||||
.onConflictDoUpdate({target: [baskets.prefix, baskets.b_id], set: {description: sql`excluded.description`, donors: sql`excluded.donors`, winning_ticket: sql`excluded.winning_ticket`}})
|
||||
const env = readSettings();
|
||||
const i_baskets = await request.json();
|
||||
for (let basketChunk of chunkArray(i_baskets, 300)) {
|
||||
await db.insert(baskets).values(basketChunk)
|
||||
.onConflictDoUpdate({target: [baskets.prefix, baskets.b_id], set: {description: sql`excluded.description`, donors: sql`excluded.donors`, winning_ticket: sql`excluded.winning_ticket`}})
|
||||
};
|
||||
if (env.TAM3_REMOTE) {
|
||||
const res = await fetch(`${env.TAM3_REMOTE}/api/baskets/?api_key=${env.TAM3_REMOTE_KEY}`, {
|
||||
body: JSON.stringify([...i_baskets]), method: 'POST', headers: {'Content-Type': 'application/json'}
|
||||
});
|
||||
if (!res.ok) {
|
||||
return new Response(JSON.stringify({details: "Issue posting baskets to remote."}), {status: res.status, statusText: res.statusText})
|
||||
};
|
||||
if (env.TAM3_REMOTE) {
|
||||
const res = await fetch(`${env.TAM3_REMOTE}/api/baskets/?api_key=${env.TAM3_REMOTE_KEY}`, {
|
||||
body: JSON.stringify([...i_baskets]), method: 'POST', headers: {'Content-Type': 'application/json'}
|
||||
});
|
||||
if (!res.ok) {
|
||||
return new Response(JSON.stringify({details: "Issue posting baskets to remote."}), {status: res.status, statusText: res.statusText})
|
||||
};
|
||||
const data = await res.json();
|
||||
};
|
||||
return new Response(JSON.stringify({details: "Posted baskets successfully."}), {status: 200, statusText: "Posted baskets successfully."})
|
||||
const data = await res.json();
|
||||
};
|
||||
return new Response(JSON.stringify({details: "Posted baskets successfully."}), {status: 200, statusText: "Posted baskets successfully."})
|
||||
}
|
||||
@@ -1,9 +1,10 @@
|
||||
import { env } from "$env/dynamic/private";
|
||||
import { readSettings } from "$lib/server/settings";
|
||||
import { db } from "$lib/server/db";
|
||||
import { baskets } from "$lib/server/db/schema";
|
||||
import { eq, and } from "drizzle-orm";
|
||||
|
||||
export async function GET({ params }) {
|
||||
const env = readSettings();
|
||||
let n_b_from = parseInt(params.b_from), n_b_to = parseInt(params.b_to);
|
||||
if (env.TAM3_REMOTE) {
|
||||
const res = await fetch(`${env.TAM3_REMOTE}/api/baskets/${params.prefix}/${n_b_from}/${n_b_to}/?api_key=${env.TAM3_REMOTE_KEY}`);
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
import { env } from "$env/dynamic/private";
|
||||
import { readSettings } from "$lib/server/settings";
|
||||
import { db } from "$lib/server/db";
|
||||
import { sql } from "drizzle-orm";
|
||||
import { baskets, combined } from "$lib/server/db/schema";
|
||||
import { chunkArray } from "$lib/server/chunkArray";
|
||||
|
||||
export async function GET() {
|
||||
const env = readSettings();
|
||||
if (env.TAM3_REMOTE) {
|
||||
const res = await fetch(`${env.TAM3_REMOTE}/api/combined/?api_key=${env.TAM3_REMOTE_KEY}`);
|
||||
if (!res.ok) {
|
||||
@@ -22,6 +23,7 @@ export async function GET() {
|
||||
}
|
||||
|
||||
export async function POST({ request }) {
|
||||
const env = readSettings();
|
||||
const r_data = await request.json()
|
||||
for (let winnerChunk of chunkArray(r_data, 300)) {
|
||||
await db.insert(baskets).values(winnerChunk)
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
import { env } from "process";
|
||||
import { readSettings } from "$lib/server/settings";
|
||||
import { db } from "$lib/server/db";
|
||||
import { combined } from "$lib/server/db/schema";
|
||||
import { eq, and } from "drizzle-orm";
|
||||
|
||||
export async function GET({ params }) {
|
||||
const env = readSettings();
|
||||
const n_b_from = parseInt(params.b_from), n_b_to = parseInt(params.b_to);
|
||||
if (env.TAM3_REMOTE) {
|
||||
const res = await fetch(`${env.TAM3_REMOTE}/api/combined/${params.prefix}/${n_b_from}/${n_b_to}/?api_key=${env.TAM3_REMOTE_KEY}`);
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
import { env } from "$env/dynamic/private";
|
||||
import { readSettings } from "$lib/server/settings";
|
||||
import { db } from "$lib/server/db";
|
||||
import { combined } from "$lib/server/db/schema";
|
||||
import { eq, and } from "drizzle-orm";
|
||||
|
||||
export async function GET({ params }) {
|
||||
const env = readSettings();
|
||||
if (env.TAM3_REMOTE) {
|
||||
const res = await fetch(`${env.TAM3_REMOTE}/api/combined/${params.prefix}/${params.b_id}/?api_key=${env.TAM3_REMOTE_KEY}`);
|
||||
if (!res.ok) {
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
import { env } from "$env/dynamic/private";
|
||||
import { readSettings } from "$lib/server/settings";
|
||||
import { db } from "$lib/server/db";
|
||||
import { counts } from "$lib/server/db/schema";
|
||||
|
||||
export async function GET() {
|
||||
const env = readSettings();
|
||||
if (env.TAM3_REMOTE) {
|
||||
const res = await fetch(`${env.TAM3_REMOTE}/api/counts/?api_key=${env.TAM3_REMOTE_KEY}`);
|
||||
if (!res.ok) {
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
import { readSettings } from "$lib/server/settings";
|
||||
import { db } from "$lib/server/db";
|
||||
import { prefixes } from "$lib/server/db/schema";
|
||||
import { env } from "$env/dynamic/private";
|
||||
|
||||
export async function GET() {
|
||||
const env = readSettings();
|
||||
if (env.TAM3_REMOTE) {
|
||||
const res = await fetch(`${env.TAM3_REMOTE}/api/prefixes/?api_key=${env.TAM3_REMOTE_KEY}`);
|
||||
if (!res.ok) {
|
||||
@@ -17,6 +18,7 @@ export async function GET() {
|
||||
}
|
||||
|
||||
export async function POST({ request }) {
|
||||
const env = readSettings();
|
||||
const { name, color, weight } = await request.json();
|
||||
await db.insert(prefixes).values({name: name, color: color, weight: weight}).onConflictDoUpdate({target: prefixes.name, set: {color: color, weight: weight}});
|
||||
if (env.TAM3_REMOTE) {
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
import { readSettings } from "$lib/server/settings";
|
||||
import { db } from "$lib/server/db";
|
||||
import { eq } from "drizzle-orm";
|
||||
import { prefixes } from "$lib/server/db/schema";
|
||||
import { env } from "$env/dynamic/private";
|
||||
|
||||
export async function GET({ params }) {
|
||||
const env = readSettings();
|
||||
let { name } = params;
|
||||
if (env.TAM3_REMOTE) {
|
||||
const res = await fetch(`${env.TAM3_REMOTE}/api/prefixes/${name}/?api_key=${env.TAM3_REMOTE_KEY}`);
|
||||
@@ -23,6 +24,7 @@ export async function GET({ params }) {
|
||||
};
|
||||
|
||||
export async function DELETE({ params }) {
|
||||
const env = readSettings();
|
||||
let { name } = params;
|
||||
await db.delete(prefixes).where(eq(prefixes.name, name))
|
||||
if (env.TAM3_REMOTE) {
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
import { env } from "$env/dynamic/private";
|
||||
import { readSettings } from "$lib/server/settings";
|
||||
import { db } from "$lib/server/db";
|
||||
import { report } from "$lib/server/db/schema";
|
||||
import { eq } from "drizzle-orm";
|
||||
|
||||
export async function GET({ params }) {
|
||||
const env = readSettings();
|
||||
if (env.TAM3_REMOTE) {
|
||||
const res = await fetch(`${env.TAM3_REMOTE}/api/reports/bybasket/${params.prefix}/?api_key=${env.TAM3_REMOTE_KEY}`);
|
||||
if (!res.ok) {
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
import { env } from "$env/dynamic/private";
|
||||
import { readSettings } from "$lib/server/settings";
|
||||
import { db } from "$lib/server/db";
|
||||
import { report } from "$lib/server/db/schema";
|
||||
import { eq } from "drizzle-orm";
|
||||
|
||||
export async function GET({ params }) {
|
||||
const env = readSettings();
|
||||
if (env.TAM3_REMOTE) {
|
||||
const res = await fetch(`${env.TAM3_REMOTE}/api/reports/byname/${params.prefix}/?api_key=${env.TAM3_REMOTE_KEY}`);
|
||||
if (!res.ok) {
|
||||
|
||||
11
webapp/src/routes/api/settings/+server.js
Normal file
11
webapp/src/routes/api/settings/+server.js
Normal file
@@ -0,0 +1,11 @@
|
||||
import { readSettings, writeSettings } from "$lib/server/settings";
|
||||
|
||||
export async function GET() {
|
||||
return new Response(JSON.stringify(readSettings()), {status: 200, statusText: "Settings returned successfully"});
|
||||
}
|
||||
|
||||
export async function POST({ request }) {
|
||||
const params = await request.json();
|
||||
await writeSettings(params);
|
||||
return new Response(JSON.stringify({detail: "Settings saved successfully."}), {status: 200, statusText: "Settings saved successfully."})
|
||||
}
|
||||
@@ -1,10 +1,11 @@
|
||||
import { readSettings } from "$lib/server/settings";
|
||||
import { db } from "$lib/server/db";
|
||||
import { sql } from "drizzle-orm";
|
||||
import { tickets } from "$lib/server/db/schema";
|
||||
import { env } from "$env/dynamic/private";
|
||||
import { chunkArray } from "$lib/server/chunkArray";
|
||||
|
||||
export async function GET() {
|
||||
const env = readSettings();
|
||||
if (env.TAM3_REMOTE) {
|
||||
const res = await fetch(`${env.TAM3_REMOTE}/api/tickets/?api_key=${env.TAM3_REMOTE_KEY}`);
|
||||
if (!res.ok) {
|
||||
@@ -31,6 +32,7 @@ export async function GET() {
|
||||
};
|
||||
|
||||
export async function POST({ request }) {
|
||||
const env = readSettings();
|
||||
const i_tickets = await request.json();
|
||||
for (let ticketChunk of chunkArray(i_tickets, 300)) {
|
||||
await db.insert(tickets).values(ticketChunk)
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
import { readSettings } from "$lib/server/settings";
|
||||
import { db } from "$lib/server/db";
|
||||
import { tickets } from "$lib/server/db/schema";
|
||||
import { env } from "$env/dynamic/private";
|
||||
import { eq, and } from "drizzle-orm";
|
||||
|
||||
export async function GET({ params }) {
|
||||
const env = readSettings();
|
||||
let n_t_from = parseInt(params.t_from), n_t_to = parseInt(params.t_to);
|
||||
if (env.TAM3_REMOTE) {
|
||||
const res = await fetch(`${env.TAM3_REMOTE}/api/tickets/${params.prefix}/${n_t_from}/${n_t_to}/?api_key=${env.TAM3_REMOTE_KEY}`);
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
import { env } from "$env/dynamic/private";
|
||||
import { readSettings } from "$lib/server/settings";
|
||||
import { db } from "$lib/server/db";
|
||||
import { tickets } from "$lib/server/db/schema";
|
||||
import { eq, and } from "drizzle-orm";
|
||||
|
||||
export async function GET({ params }) {
|
||||
const env = readSettings();
|
||||
if (env.TAM3_REMOTE) {
|
||||
const res = await fetch(`${env.TAM3_REMOTE}/api/tickets/${params.prefix}/${params.t_id}/?api_key=${env.TAM3_REMOTE_KEY}`);
|
||||
if (!res.ok) {
|
||||
|
||||
5
webapp/src/routes/settings/+page.js
Normal file
5
webapp/src/routes/settings/+page.js
Normal file
@@ -0,0 +1,5 @@
|
||||
export async function load({ fetch }) {
|
||||
const res = await fetch('/api/settings');
|
||||
const settingsData = await res.json();
|
||||
return {settings: settingsData};
|
||||
}
|
||||
53
webapp/src/routes/settings/+page.svelte
Normal file
53
webapp/src/routes/settings/+page.svelte
Normal file
@@ -0,0 +1,53 @@
|
||||
<script>
|
||||
import { browser } from '$app/environment';
|
||||
const { data } = $props();
|
||||
|
||||
let stagingSettings = $state({...data.settings});
|
||||
let status = $state("")
|
||||
|
||||
async function saveChanges() {
|
||||
const res = await fetch('/api/settings', {method: 'POST', body: JSON.stringify(stagingSettings), headers: {'Content-Type': 'application/json'}});
|
||||
if (res.ok) {
|
||||
status = "Changes saved successfully";
|
||||
setTimeout(() => {status = ""}, 5000);
|
||||
} else {
|
||||
status = "Error saving changes, check config file path, make sure folder exists";
|
||||
setTimeout(() => {status = ""}, 5000);
|
||||
}
|
||||
}
|
||||
|
||||
function cancelChanges() {
|
||||
stagingSettings = {...data.settings};
|
||||
}
|
||||
|
||||
if (browser) {
|
||||
document.title = "TAM3 - Settings"
|
||||
}
|
||||
</script>
|
||||
|
||||
<h1>Settings</h1>
|
||||
|
||||
<div>
|
||||
<h2>Remote Server</h2>
|
||||
<div><strong>Address:</strong></div>
|
||||
<div><em>For example: https://ip_or_hostname:8443</em></div>
|
||||
<div><input type="text" bind:value={stagingSettings.TAM3_REMOTE}></div>
|
||||
<div><strong>API Key:</strong></div>
|
||||
<div class="flex-row">
|
||||
<input type="password" bind:value={stagingSettings.TAM3_REMOTE_KEY}>
|
||||
<button class="styled" onclick={() => {stagingSettings.TAM3_REMOTE_KEY = ""}}>Clear</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<br />
|
||||
|
||||
<div class="flex-row">
|
||||
<button class="styled" onclick={saveChanges}>Save</button>
|
||||
<button class="styled" onclick={cancelChanges}>Cancel</button>
|
||||
</div>
|
||||
|
||||
<br />
|
||||
|
||||
<div class="status">
|
||||
<div>{status}</div>
|
||||
</div>
|
||||
Reference in New Issue
Block a user