adds upload cron && fixes date formatting
This commit is contained in:
5
.gitignore
vendored
5
.gitignore
vendored
@@ -7,5 +7,10 @@ search/meilisearch
|
||||
search/data.ms
|
||||
search/dumps
|
||||
|
||||
web/uploads/*
|
||||
web/cookie.txt
|
||||
|
||||
run.sh
|
||||
build*.sh
|
||||
|
||||
data/
|
||||
@@ -53,6 +53,10 @@ services:
|
||||
BODY_SIZE_LIMIT: Infinity
|
||||
PUBLIC_POCKETBASE_URL: http://db:8090
|
||||
PUBLIC_DISABLE_SIGNUP: false
|
||||
UPLOAD_USER: Flomp
|
||||
UPLOAD_PASSWORD: 12345678
|
||||
volumes:
|
||||
- ./data/uploads:/app/uploads
|
||||
ports:
|
||||
- "3000:3000"
|
||||
networks:
|
||||
|
||||
@@ -6,8 +6,15 @@ RUN npm ci --omit=dev
|
||||
EXPOSE 3000
|
||||
ENV NODE_ENV=production
|
||||
|
||||
COPY ./cron.sh /etc/periodic/15min/cron
|
||||
RUN chmod +x /etc/periodic/15min/cron
|
||||
RUN mkdir /app/uploads
|
||||
RUN apk add curl
|
||||
|
||||
ENV PUBLIC_POCKETBASE_URL=http://127.0.0.1:8090
|
||||
ENV MEILI_URL=http://127.0.0.1:7700
|
||||
ENV PUBLIC_DISABLE_SIGNUP=false
|
||||
ENV UPLOAD_USER=
|
||||
ENV UPLOAD_PASSWORD=
|
||||
|
||||
CMD [ "node", "build" ]
|
||||
CMD crond && node build
|
||||
58
web/cron.sh
Normal file
58
web/cron.sh
Normal file
@@ -0,0 +1,58 @@
|
||||
#!/bin/ash
|
||||
|
||||
# API endpoint URL
|
||||
API_URL="http://localhost:3000/api/v1"
|
||||
|
||||
# Folder containing files to upload
|
||||
UPLOAD_FOLDER="/app/uploads"
|
||||
|
||||
# Credentials for login
|
||||
USERNAME=$UPLOAD_USER
|
||||
PASSWORD=$UPLOAD_PASSWORD
|
||||
|
||||
login() {
|
||||
local username="$1"
|
||||
local password="$2"
|
||||
|
||||
response=$(curl -c cookie.txt --location --request POST "$API_URL/auth/login" --header 'Content-Type: application/json' --data-raw "{\"username\": \"$username\", \"password\": \"$password\"}")
|
||||
|
||||
# Check if login was successful (look for "200 OK" in response headers)
|
||||
if [ $? -eq 0 ] && [ "$(echo "$response" | grep -c "token")" -eq 1 ]; then
|
||||
echo "Login successful. Cookie obtained."
|
||||
else
|
||||
echo "Login failed. Unable to obtain cookie."
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to upload file and delete if successful
|
||||
upload_and_delete() {
|
||||
local file="$1"
|
||||
|
||||
ls $file
|
||||
|
||||
# API call to upload file
|
||||
response=$(curl -b cookie.txt --location --request PUT "$API_URL/trail/upload" --header 'Content-Type: application/gpx+xml' --data-binary "@$file")
|
||||
|
||||
# Check if API call was successful (status code 200)
|
||||
if [ $? -eq 0 ] && [ "$(echo "$response" | grep -c "author")" -eq 1 ]; then
|
||||
echo "File $file uploaded successfully."
|
||||
# Delete the file
|
||||
rm "$file"
|
||||
echo "File $file deleted."
|
||||
else
|
||||
echo $response
|
||||
echo "Failed to upload file $file."
|
||||
fi
|
||||
}
|
||||
|
||||
# Login to obtain cookie
|
||||
login "$USERNAME" "$PASSWORD"
|
||||
|
||||
# Iterate over each file in the folder
|
||||
for file in "$UPLOAD_FOLDER"/*; do
|
||||
# Check if file exists and is a regular file
|
||||
if [ -f "$file" ]; then
|
||||
upload_and_delete "$file"
|
||||
fi
|
||||
done
|
||||
10
web/package-lock.json
generated
10
web/package-lock.json
generated
@@ -15,7 +15,6 @@
|
||||
"@types/leaflet.awesome-markers": "^2.0.28",
|
||||
"@types/three": "^0.161.2",
|
||||
"crypto-random-string": "^5.0.0",
|
||||
"date-fns": "^3.3.1",
|
||||
"jsdom": "^24.0.0",
|
||||
"leaflet": "^1.9.4",
|
||||
"leaflet-gpx": "^1.7.0",
|
||||
@@ -1757,15 +1756,6 @@
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/date-fns": {
|
||||
"version": "3.3.1",
|
||||
"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.3.1.tgz",
|
||||
"integrity": "sha512-y8e109LYGgoQDveiEBD3DYXKba1jWf5BA8YU1FL5Tvm0BTdEfy54WLCwnuYWZNnzzvALy/QQ4Hov+Q9RVRv+Zw==",
|
||||
"funding": {
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/kossnocorp"
|
||||
}
|
||||
},
|
||||
"node_modules/debug": {
|
||||
"version": "4.3.4",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
|
||||
|
||||
@@ -40,7 +40,6 @@
|
||||
"@types/leaflet.awesome-markers": "^2.0.28",
|
||||
"@types/three": "^0.161.2",
|
||||
"crypto-random-string": "^5.0.0",
|
||||
"date-fns": "^3.3.1",
|
||||
"jsdom": "^24.0.0",
|
||||
"leaflet": "^1.9.4",
|
||||
"leaflet-gpx": "^1.7.0",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<script lang="ts">
|
||||
import type { SummitLog } from "$lib/models/summit_log";
|
||||
import { format, parse } from "date-fns";
|
||||
import { parse } from "date-fns";
|
||||
import { _ } from "svelte-i18n";
|
||||
import Dropdown, { type DropdownItem } from "../base/dropdown.svelte";
|
||||
|
||||
|
||||
@@ -6,11 +6,10 @@
|
||||
import { createForm } from "$lib/vendor/svelte-form-lib/index";
|
||||
import { util } from "$lib/vendor/svelte-form-lib/util";
|
||||
import { _ } from "svelte-i18n";
|
||||
import { date, object, string } from "yup";
|
||||
import Datepicker from "../base/datepicker.svelte";
|
||||
import Modal from "../base/modal.svelte";
|
||||
import TextField from "../base/text_field.svelte";
|
||||
import { date, object, string } from "yup";
|
||||
import { parse } from "date-fns";
|
||||
export let openModal: (() => void) | undefined = undefined;
|
||||
export let closeModal: (() => void) | undefined = undefined;
|
||||
|
||||
@@ -18,13 +17,7 @@
|
||||
|
||||
const summitLogSchema = object<SummitLog>({
|
||||
id: string().optional(),
|
||||
date: date()
|
||||
.transform((value, originalValue, context) => {
|
||||
if (context.isType(value)) return value;
|
||||
return parse(originalValue, "dd.MM.yyyy", new Date());
|
||||
})
|
||||
.required("Required")
|
||||
.typeError($_("invalid-date")),
|
||||
date: date().required("Required").typeError($_("invalid-date")),
|
||||
text: string().optional(),
|
||||
});
|
||||
|
||||
@@ -37,6 +30,7 @@
|
||||
},
|
||||
});
|
||||
$: form.set(util.cloneDeep($summitLog));
|
||||
$: console.log($summitLog);
|
||||
</script>
|
||||
|
||||
<Modal
|
||||
|
||||
@@ -2,7 +2,7 @@ import { SummitLog } from "$lib/models/summit_log";
|
||||
import { ClientResponseError } from "pocketbase";
|
||||
import { writable, type Writable } from "svelte/store";
|
||||
|
||||
export const summitLog: Writable<SummitLog> = writable(new SummitLog(new Date().toISOString()));
|
||||
export const summitLog: Writable<SummitLog> = writable(new SummitLog(new Date().toISOString().substring(0, 10)));
|
||||
|
||||
export async function summit_logs_create(summitLog: SummitLog) {
|
||||
const r = await fetch('/api/v1/summit-log', {
|
||||
|
||||
@@ -167,7 +167,7 @@ export async function trails_search_bounding_box(northEast: LatLng, southWest: L
|
||||
|
||||
export async function trails_show(id: string, loadGPX?: boolean, f: (url: RequestInfo | URL, config?: RequestInit) => Promise<Response> = fetch) {
|
||||
const r = await f(`/api/v1/trail/${id}?` + new URLSearchParams({
|
||||
expand: "category,waypoints,summit_logs,lists_via_trails",
|
||||
expand: "category,waypoints,summit_logs",
|
||||
}), {
|
||||
method: 'GET',
|
||||
})
|
||||
|
||||
@@ -40,7 +40,6 @@
|
||||
import "$lib/vendor/leaflet-elevation/src/index.css";
|
||||
import { createForm } from "$lib/vendor/svelte-form-lib";
|
||||
import cryptoRandomString from "crypto-random-string";
|
||||
import { format } from "date-fns";
|
||||
import type { GPX, Icon, LeafletEvent, Map } from "leaflet";
|
||||
import "leaflet.awesome-markers/dist/leaflet.awesome-markers.css";
|
||||
import "leaflet/dist/leaflet.css";
|
||||
@@ -384,14 +383,8 @@
|
||||
savedWaypoint.marker = marker;
|
||||
}
|
||||
|
||||
function beforeSummitLogModalOpen() {
|
||||
summitLog.set(new SummitLog(format(new Date(), "yyyy-MM-dd")));
|
||||
openSummitLogModal();
|
||||
}
|
||||
|
||||
function saveSummitLog(e: CustomEvent<SummitLog>) {
|
||||
const savedSummitLog = e.detail;
|
||||
savedSummitLog.date = format(savedSummitLog.date, "yyyy-MM-dd");
|
||||
let editedSummitLogIndex = $form.expand.summit_logs.findIndex(
|
||||
(s) => s.id == savedSummitLog.id,
|
||||
);
|
||||
@@ -413,7 +406,6 @@
|
||||
e: CustomEvent<{ text: string; value: string }>,
|
||||
) {
|
||||
if (e.detail.value === "edit") {
|
||||
currentSummitLog.date = format(currentSummitLog.date, "yyyy-MM-dd");
|
||||
summitLog.set(currentSummitLog);
|
||||
openSummitLogModal();
|
||||
} else if (e.detail.value === "delete") {
|
||||
@@ -618,7 +610,7 @@
|
||||
<button
|
||||
class="btn-secondary"
|
||||
type="button"
|
||||
on:click={beforeSummitLogModalOpen}
|
||||
on:click={openSummitLogModal}
|
||||
><i class="fa fa-plus mr-2"></i>{$_("add-entry")}</button
|
||||
>
|
||||
{#if $lists.length}
|
||||
|
||||
Reference in New Issue
Block a user