From: PhiTux Date: Fri, 24 Jan 2025 22:26:36 +0000 (+0100) Subject: file upload/deletion X-Git-Url: http://git.99rst.org/?a=commitdiff_plain;h=d61989cc6880df4fd6fa8517e5a660ee7793c608;p=DailyTxT.git file upload/deletion --- diff --git a/backend/server/routers/logs.py b/backend/server/routers/logs.py index e272015..2c8558f 100644 --- a/backend/server/routers/logs.py +++ b/backend/server/routers/logs.py @@ -91,9 +91,14 @@ async def getLog(date: str, cookie = Depends(users.isLoggedIn)): for dayLog in content["days"]: if dayLog["day"] == day: enc_key = security.get_enc_key(cookie["user_id"], cookie["derived_key"]) - text = security.decrypt_text(dayLog["text"], enc_key) - date_written = security.decrypt_text(dayLog["date_written"], enc_key) - return {"text": text, "date_written": date_written} + if "text" in dayLog.keys(): + text = security.decrypt_text(dayLog["text"], enc_key) + date_written = security.decrypt_text(dayLog["date_written"], enc_key) + if "files" in dayLog.keys(): + for file in dayLog["files"]: + file["filename"] = security.decrypt_text(file["enc_filename"], enc_key) + file["type"] = security.decrypt_text(file["enc_type"], enc_key) + return {"text": text, "date_written": date_written, "files": dayLog.get("files", [])} return {"text": "", "date_written": ""} @@ -242,18 +247,71 @@ async def uploadFile(day: Annotated[int, Form()], month: Annotated[int, Form()], # save file in log content:dict = fileHandling.getDay(cookie["user_id"], year, month) + + enc_filename = security.encrypt_text(file.filename, enc_key) + enc_type = security.encrypt_text(file.headers.get("content-type"), enc_key) + new_file = {"enc_filename": enc_filename, "uuid_filename": uuid,"size": file.size, "enc_type": enc_type} + if "days" not in content.keys(): content["days"] = [] - content["days"].append({"day": day, "files": [uuid]}) -########### + content["days"].append({"day": day, "files": [new_file]}) + else: + found = False + for dayLog in content["days"]: + if dayLog["day"] == day: + if "files" not in dayLog.keys(): + dayLog["files"] = [] + dayLog["files"].append(new_file) + found = True + break + if not found: + content["days"].append({"day": day, "files": [new_file]}) + + if not fileHandling.writeDay(cookie["user_id"], year, month, content): + fileHandling.removeFile(cookie["user_id"], uuid) + return {"success": False} - print(file.size) - print(file.filename) - print(uuid) - print(file.headers.get("content-type")) - print(day, month, year) + return {"success": True} - # wait 3 s - time.sleep(3) - return {"success": True} \ No newline at end of file +""" +@router.get("/getFiles") +async def getFiles(day: int, month: int, year: int, cookie = Depends(users.isLoggedIn)): + content:dict = fileHandling.getDay(cookie["user_id"], year, month) + if "days" not in content.keys(): + return [] + + enc_key = security.get_enc_key(cookie["user_id"], cookie["derived_key"]) + for dayLog in content["days"]: + if "day" in dayLog.keys() and dayLog["day"] == day: + if "files" in dayLog.keys(): + for file in dayLog["files"]: + file["filename"] = security.decrypt_text(file["enc_filename"], enc_key) + file["type"] = security.decrypt_text(file["enc_type"], enc_key) + + return dayLog["files"] + + return [] +""" + +@router.get("/deleteFile") +async def deleteFile(uuid: str, day: int, month: int, year: int, cookie = Depends(users.isLoggedIn)): + content:dict = fileHandling.getDay(cookie["user_id"], year, month) + if "days" not in content.keys(): + raise HTTPException(status_code=500, detail="Day not found - json error") + + for dayLog in content["days"]: + if dayLog["day"] != day: + continue + if not "files" in dayLog.keys(): + break + for file in dayLog["files"]: + if file["uuid_filename"] == uuid: + if not fileHandling.removeFile(cookie["user_id"], uuid): + raise HTTPException(status_code=500, detail="Failed to delete file") + dayLog["files"].remove(file) + if not fileHandling.writeDay(cookie["user_id"], year, month, content): + raise HTTPException(status_code=500, detail="Failed to write changes of deleted file!") + return {"success": True} + + raise HTTPException(status_code=500, detail="Failed to delete file - not found in log") \ No newline at end of file diff --git a/backend/server/utils/fileHandling.py b/backend/server/utils/fileHandling.py index 207880b..0ca7a4c 100644 --- a/backend/server/utils/fileHandling.py +++ b/backend/server/utils/fileHandling.py @@ -73,7 +73,7 @@ def get_months(user_id, year): if entry.is_file() and entry.name.endswith(".json"): yield entry.name.split(".")[0] -def writeFile(str, user_id, uuid): +def writeFile(file, user_id, uuid): try: os.makedirs(os.path.join(settings.data_path, str(user_id), 'files'), exist_ok=True) f = open(os.path.join(settings.data_path, str(user_id), 'files', uuid), "w") @@ -82,7 +82,7 @@ def writeFile(str, user_id, uuid): return False else: with f: - f.write(str) + f.write(file) return True def removeFile(user_id, uuid): diff --git a/frontend/src/lib/Datepicker.svelte b/frontend/src/lib/Datepicker.svelte index 2613ed1..b2dbaf7 100644 --- a/frontend/src/lib/Datepicker.svelte +++ b/frontend/src/lib/Datepicker.svelte @@ -244,6 +244,7 @@ border-radius: 50%; margin: 2px auto; user-select: none; + --dot-color: rgb(250, 199, 58); } .day:hover { background: #f0f0f0; @@ -257,7 +258,7 @@ content: ''; width: 6px; height: 6px; - background-color: var(--color); + background-color: var(--dot-color); border-radius: 50%; position: absolute; bottom: 2px; @@ -316,12 +317,12 @@ .day.mark-dot:not(.selected)::after { content: ''; - width: 6px; - height: 6px; - background-color: var(--color); + width: 7px; + height: 7px; + background-color: var(--dot-color); border-radius: 50%; position: absolute; - bottom: 2px; + bottom: 1px; } .year-input { diff --git a/frontend/src/routes/write/+page.svelte b/frontend/src/routes/write/+page.svelte index eca3ea8..f903fa1 100644 --- a/frontend/src/routes/write/+page.svelte +++ b/frontend/src/routes/write/+page.svelte @@ -11,9 +11,10 @@ import '../../../node_modules/tiny-markdown-editor/dist/tiny-mde.css'; import { API_URL } from '$lib/APIurl.js'; import DatepickerLogic from '$lib/DatepickerLogic.svelte'; - import { faCloudArrowUp } from '@fortawesome/free-solid-svg-icons'; + import { faCloudArrowUp, faTrash } from '@fortawesome/free-solid-svg-icons'; import Fa from 'svelte-fa'; import { v4 as uuidv4 } from 'uuid'; + import { slide } from 'svelte/transition'; axios.interceptors.request.use((config) => { config.withCredentials = true; @@ -121,6 +122,8 @@ let currentLog = $state(''); let savedLog = $state(''); + let filesOfDay = $state([]); + let logDateWritten = $state(''); let timeout; @@ -152,6 +155,7 @@ }); currentLog = response.data.text; + filesOfDay = response.data.files; savedLog = currentLog; tinyMDE.setContent(currentLog); @@ -295,15 +299,64 @@ ...config }) .then((response) => { - console.log(response); + // append to filesOfDay + filesOfDay = [...filesOfDay, { filename: f.name, size: f.size, uuid_filename: uuid }]; }) .catch((error) => { console.error(error); + // toast + const toast = new bootstrap.Toast(document.getElementById('toastErrorSavingFile')); + toast.show(); }) .finally(() => { uploadingFiles = uploadingFiles.filter((file) => file.uuid !== uuid); }); } + + function formatBytes(bytes) { + if (!+bytes) return '0 Bytes'; + + const k = 1024; + const dm = 2; + const sizes = ['Bytes', 'KB', 'MB', 'GB']; + + const i = Math.floor(Math.log(bytes) / Math.log(k)); + + return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`; + } + + function downloadFile(uuid) { + console.log(uuid); + } + + let confirmDelete = $state({ uuid: '', filename: '' }); + function askDeleteFile(uuid, filename) { + confirmDelete = { uuid: uuid, filename: filename }; + + const modal = new bootstrap.Modal(document.getElementById('modalConfirmDeleteFile')); + modal.show(); + } + + function deleteFile(uuid) { + axios + .get(API_URL + '/logs/deleteFile', { + params: { + uuid: uuid, + year: $selectedDate.getFullYear(), + month: $selectedDate.getMonth() + 1, + day: $selectedDate.getDate() + } + }) + .then((response) => { + filesOfDay = filesOfDay.filter((file) => file.uuid_filename !== uuid); + }) + .catch((error) => { + console.error(error); + // toast + const toast = new bootstrap.Toast(document.getElementById('toastErrorDeletingFile')); + toast.show(); + }); + } @@ -361,12 +414,30 @@ + +