diff --git a/server/api/index.js b/server/api/index.js index 295e6ce..89eab7f 100644 --- a/server/api/index.js +++ b/server/api/index.js @@ -82,6 +82,34 @@ export async function getTimetable(req, res) { }); } +// Edit timetable API endpoint (/api/timetable) +// Updates a remote timetable with the requested data +export async function putTimetable(req, res) { + const timetableId = parseInt(req.query.id); + const data = req.body.data; + if ( + !(await hasPermission(req.locals.session, "timetable.update", timetableId)) + ) { + res.status(401).send({ + success: false, + error: "missing_permission", + message: "You don't have permission to update this timetable!", + }); + return; + } + + await prisma.timetable.update({ + where: { + id: timetableId, + }, + data: { + data, + title: req.body.title, + }, + }); + res.status(201).send(); +} + // Helper function for converting a date string // (eg. "2022-06-02" or "1654128000000") to a // unix timestamp diff --git a/server/index.js b/server/index.js index 525eb64..a606b57 100644 --- a/server/index.js +++ b/server/index.js @@ -8,6 +8,7 @@ import { getSubstitutions, getHistory, getClasses, + putTimetable, getInfo, putKey, deleteKey, @@ -63,6 +64,7 @@ app.get("/api/info", getInfo); app.put("/api/key", putKey); app.delete("/api/key", deleteKey); app.get("/api/timetable", getTimetable); +app.put("/api/timetable", putTimetable); app.get("/api/substitutions", getSubstitutions); app.get("/api/history", getHistory); app.get("/api/classes", getClasses); diff --git a/src/components/settings/timetable-card.vue b/src/components/settings/timetable-card.vue index 8ccf196..c07a858 100644 --- a/src/components/settings/timetable-card.vue +++ b/src/components/settings/timetable-card.vue @@ -7,11 +7,12 @@ import { TrashIcon, AlertCircleIcon, CopyIcon, + UploadCloudIcon, } from "lucide-vue-next"; import { DownloadIcon } from "lucide-vue-next"; -defineProps(["timetable", "editable", "selected"]); -defineEmits(["click", "edit", "delete", "copy", "export"]); +defineProps(["timetable", "editable", "remote", "selected"]); +defineEmits(["click", "edit", "delete", "copy", "export", "upload"]); const deleteConfirm = ref(false); @@ -38,7 +39,8 @@ watch(deleteConfirm, (value) => {