Init download API (not working)

This commit is contained in:
Clayzxr
2025-01-27 16:47:12 +01:00
parent 793a43ef87
commit d79cd11b41
6 changed files with 114 additions and 54 deletions
+4 -3
View File
@@ -3,11 +3,13 @@
// This file is automatically updated during development when running `dev.ts`.
import * as $_apps_layout from "./routes/(apps)/_layout.tsx";
import * as $_apps_mobility_api_download from "./routes/(apps)/mobility/api/download.ts";
import * as $_apps_mobility_api_insert_mobility from "./routes/(apps)/mobility/api/insert-mobility.ts";
import * as $_apps_mobility_index from "./routes/(apps)/mobility/index.tsx";
import * as $_apps_mobility_partials_admin_edit_mobility from "./routes/(apps)/mobility/partials/(admin)/edit_mobility.tsx";
import * as $_apps_mobility_partials_index from "./routes/(apps)/mobility/partials/index.tsx";
import * as $_apps_mobility_partials_overview from "./routes/(apps)/mobility/partials/overview.tsx";
import * as $_apps_mobility_types_d from "./routes/(apps)/mobility/types.d.ts";
import * as $_apps_notes_index from "./routes/(apps)/notes/index.tsx";
import * as $_apps_notes_partials_admin_courses from "./routes/(apps)/notes/partials/(admin)/courses.tsx";
import * as $_apps_notes_partials_index from "./routes/(apps)/notes/partials/index.tsx";
@@ -30,7 +32,6 @@ import * as $_islands_AppNavigator from "./routes/(_islands)/AppNavigator.tsx";
import * as $_islands_Navbar from "./routes/(_islands)/Navbar.tsx";
import * as $_apps_mobility_islands_ConsultMobility from "./routes/(apps)/mobility/(_islands)/ConsultMobility.tsx";
import * as $_apps_mobility_islands_EditMobility from "./routes/(apps)/mobility/(_islands)/EditMobility.tsx";
import * as $_apps_mobility_islands_ImportFile from "./routes/(apps)/mobility/(_islands)/ImportFile.tsx";
import * as $_apps_students_islands_ConsultStudents from "./routes/(apps)/students/(_islands)/ConsultStudents.tsx";
import * as $_apps_students_islands_EditStudents from "./routes/(apps)/students/(_islands)/EditStudents.tsx";
import * as $_apps_students_islands_UploadStudents from "./routes/(apps)/students/(_islands)/UploadStudents.tsx";
@@ -39,6 +40,7 @@ import type { Manifest } from "$fresh/server.ts";
const manifest = {
routes: {
"./routes/(apps)/_layout.tsx": $_apps_layout,
"./routes/(apps)/mobility/api/download.ts": $_apps_mobility_api_download,
"./routes/(apps)/mobility/api/insert-mobility.ts":
$_apps_mobility_api_insert_mobility,
"./routes/(apps)/mobility/index.tsx": $_apps_mobility_index,
@@ -48,6 +50,7 @@ const manifest = {
$_apps_mobility_partials_index,
"./routes/(apps)/mobility/partials/overview.tsx":
$_apps_mobility_partials_overview,
"./routes/(apps)/mobility/types.d.ts": $_apps_mobility_types_d,
"./routes/(apps)/notes/index.tsx": $_apps_notes_index,
"./routes/(apps)/notes/partials/(admin)/courses.tsx":
$_apps_notes_partials_admin_courses,
@@ -80,8 +83,6 @@ const manifest = {
$_apps_mobility_islands_ConsultMobility,
"./routes/(apps)/mobility/(_islands)/EditMobility.tsx":
$_apps_mobility_islands_EditMobility,
"./routes/(apps)/mobility/(_islands)/ImportFile.tsx":
$_apps_mobility_islands_ImportFile,
"./routes/(apps)/students/(_islands)/ConsultStudents.tsx":
$_apps_students_islands_ConsultStudents,
"./routes/(apps)/students/(_islands)/EditStudents.tsx":
@@ -35,9 +35,9 @@ export default function ConsultMobility() {
destinationCountry: existingMobility?.destinationCountry || null,
destinationName: existingMobility?.destinationName || null,
mobilityStatus: existingMobility?.mobilityStatus || "N/A",
attestationFile: existingMobility?.attestationFile || null,
promotionId: student.promotionId,
promotionName: student.promotionName,
attestationFile: existingMobility?.attestationFile || null,
};
});
@@ -56,6 +56,16 @@ export default function ConsultMobility() {
? mobilityData
: mobilityData.filter((entry) => entry.promotionId === selectedPromotion);
const downloadFile = (id: number | null) => {
if (!id) {
alert("No file available for download.");
return;
}
const downloadUrl = `/mobility/api/download/${id}`;
window.open(downloadUrl, "_blank");
};
return (
<section>
<h2>Consult Mobility</h2>
@@ -117,15 +127,13 @@ export default function ConsultMobility() {
<td>{entry.mobilityStatus}</td>
<td>
{entry.attestationFile ? (
<a
href={`/api/download/${entry.id}`}
target="_blank"
rel="noopener noreferrer"
<button
onClick={() => downloadFile(entry.id)}
>
Download
</a>
</button>
) : (
"N/A"
"No file"
)}
</td>
</tr>
@@ -49,31 +49,7 @@ export default function EditMobility() {
setMobilityData((prev) =>
prev.map((entry) =>
entry.studentId === studentId
? { ...entry, attestationFile: file || null }
: entry
)
);
};
const handleRemoveFile = (studentId: string) => {
setMobilityData((prev) =>
prev.map((entry) =>
entry.studentId === studentId
? { ...entry, attestationFile: null }
: entry
)
);
};
const handleChange = (
studentId: string,
field: keyof MobilityData,
value: string | number | null
) => {
setMobilityData((prev) =>
prev.map((entry) =>
entry.studentId === studentId ? { ...entry, [field]: value } : entry
entry.studentId === studentId ? { ...entry, attestationFile: file } : entry
)
);
};
@@ -105,8 +81,6 @@ export default function EditMobility() {
}
});
console.log("EditMobility: FormData prepared:", formData);
const response = await fetch("/mobility/api/insert-mobility", {
method: "POST",
body: formData,
@@ -137,6 +111,10 @@ export default function EditMobility() {
students: filteredData.filter((entry) => entry.promotionId === promo.id),
}));
const handleDownload = (id: number) => {
window.open(`/mobility/api/download/${id}`, "_blank");
};
return (
<div>
<h2>Edit Mobility</h2>
@@ -192,7 +170,13 @@ export default function EditMobility() {
type="date"
value={entry.startDate || ""}
onChange={(e) =>
handleChange(entry.studentId, "startDate", e.target.value)
setMobilityData((prev) =>
prev.map((data) =>
data.studentId === entry.studentId
? { ...data, startDate: e.target.value }
: data
)
)
}
/>
</td>
@@ -201,7 +185,13 @@ export default function EditMobility() {
type="date"
value={entry.endDate || ""}
onChange={(e) =>
handleChange(entry.studentId, "endDate", e.target.value)
setMobilityData((prev) =>
prev.map((data) =>
data.studentId === entry.studentId
? { ...data, endDate: e.target.value }
: data
)
)
}
/>
</td>
@@ -211,10 +201,12 @@ export default function EditMobility() {
type="text"
value={entry.destinationCountry || ""}
onChange={(e) =>
handleChange(
entry.studentId,
"destinationCountry",
e.target.value
setMobilityData((prev) =>
prev.map((data) =>
data.studentId === entry.studentId
? { ...data, destinationCountry: e.target.value }
: data
)
)
}
/>
@@ -224,7 +216,13 @@ export default function EditMobility() {
type="text"
value={entry.destinationName || ""}
onChange={(e) =>
handleChange(entry.studentId, "destinationName", e.target.value)
setMobilityData((prev) =>
prev.map((data) =>
data.studentId === entry.studentId
? { ...data, destinationName: e.target.value }
: data
)
)
}
/>
</td>
@@ -232,7 +230,13 @@ export default function EditMobility() {
<select
value={entry.mobilityStatus}
onChange={(e) =>
handleChange(entry.studentId, "mobilityStatus", e.target.value)
setMobilityData((prev) =>
prev.map((data) =>
data.studentId === entry.studentId
? { ...data, mobilityStatus: e.target.value }
: data
)
)
}
>
<option value="N/A">N/A</option>
@@ -245,17 +249,21 @@ export default function EditMobility() {
<td>
{entry.attestationFile ? (
<>
<a
href={`/api/download/${entry.id}`}
target="_blank"
rel="noopener noreferrer"
>
View Current File
</a>
<button onClick={() => handleDownload(entry.id!)}>
Download
</button>
<button
onClick={() => handleRemoveFile(entry.studentId)}
onClick={() =>
setMobilityData((prev) =>
prev.map((data) =>
data.studentId === entry.studentId
? { ...data, attestationFile: null }
: data
)
)
}
>
Remove
Delete
</button>
</>
) : (
+43
View File
@@ -0,0 +1,43 @@
import { Handlers } from "$fresh/server.ts";
import connect from "$root/databases/connect.ts";
export const handler: Handlers = {
async GET(request) {
try {
console.log("API /mobility/api/download/:id GET called");
const url = new URL(request.url);
const id = url.pathname.split("/").pop();
if (!id) {
return new Response("Invalid request: Missing ID", { status: 400 });
}
console.log("Connecting to mobility database...");
using connection = connect("mobility");
console.log("Connected to databases.");
const query = connection.database.prepare(
`SELECT attestationFile FROM mobility WHERE id = ?`
);
const result = query.get(id);
if (!result || !result.attestationFile) {
return new Response("No file found for the given ID", { status: 404 });
}
const fileBuffer = result.attestationFile;
return new Response(fileBuffer, {
status: 200,
headers: {
"Content-Type": "application/pdf",
"Content-Disposition": `attachment; filename="attestation_${id}.pdf"`,
},
});
} catch (error) {
console.error("Error fetching file:", error);
return new Response("Failed to fetch file", { status: 500 });
}
},
};
View File