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`. // This file is automatically updated during development when running `dev.ts`.
import * as $_apps_layout from "./routes/(apps)/_layout.tsx"; 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_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_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_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_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_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_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_admin_courses from "./routes/(apps)/notes/partials/(admin)/courses.tsx";
import * as $_apps_notes_partials_index from "./routes/(apps)/notes/partials/index.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 $_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_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_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_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_EditStudents from "./routes/(apps)/students/(_islands)/EditStudents.tsx";
import * as $_apps_students_islands_UploadStudents from "./routes/(apps)/students/(_islands)/UploadStudents.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 = { const manifest = {
routes: { routes: {
"./routes/(apps)/_layout.tsx": $_apps_layout, "./routes/(apps)/_layout.tsx": $_apps_layout,
"./routes/(apps)/mobility/api/download.ts": $_apps_mobility_api_download,
"./routes/(apps)/mobility/api/insert-mobility.ts": "./routes/(apps)/mobility/api/insert-mobility.ts":
$_apps_mobility_api_insert_mobility, $_apps_mobility_api_insert_mobility,
"./routes/(apps)/mobility/index.tsx": $_apps_mobility_index, "./routes/(apps)/mobility/index.tsx": $_apps_mobility_index,
@@ -48,6 +50,7 @@ const manifest = {
$_apps_mobility_partials_index, $_apps_mobility_partials_index,
"./routes/(apps)/mobility/partials/overview.tsx": "./routes/(apps)/mobility/partials/overview.tsx":
$_apps_mobility_partials_overview, $_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/index.tsx": $_apps_notes_index,
"./routes/(apps)/notes/partials/(admin)/courses.tsx": "./routes/(apps)/notes/partials/(admin)/courses.tsx":
$_apps_notes_partials_admin_courses, $_apps_notes_partials_admin_courses,
@@ -80,8 +83,6 @@ const manifest = {
$_apps_mobility_islands_ConsultMobility, $_apps_mobility_islands_ConsultMobility,
"./routes/(apps)/mobility/(_islands)/EditMobility.tsx": "./routes/(apps)/mobility/(_islands)/EditMobility.tsx":
$_apps_mobility_islands_EditMobility, $_apps_mobility_islands_EditMobility,
"./routes/(apps)/mobility/(_islands)/ImportFile.tsx":
$_apps_mobility_islands_ImportFile,
"./routes/(apps)/students/(_islands)/ConsultStudents.tsx": "./routes/(apps)/students/(_islands)/ConsultStudents.tsx":
$_apps_students_islands_ConsultStudents, $_apps_students_islands_ConsultStudents,
"./routes/(apps)/students/(_islands)/EditStudents.tsx": "./routes/(apps)/students/(_islands)/EditStudents.tsx":
@@ -35,9 +35,9 @@ export default function ConsultMobility() {
destinationCountry: existingMobility?.destinationCountry || null, destinationCountry: existingMobility?.destinationCountry || null,
destinationName: existingMobility?.destinationName || null, destinationName: existingMobility?.destinationName || null,
mobilityStatus: existingMobility?.mobilityStatus || "N/A", mobilityStatus: existingMobility?.mobilityStatus || "N/A",
attestationFile: existingMobility?.attestationFile || null,
promotionId: student.promotionId, promotionId: student.promotionId,
promotionName: student.promotionName, promotionName: student.promotionName,
attestationFile: existingMobility?.attestationFile || null,
}; };
}); });
@@ -56,6 +56,16 @@ export default function ConsultMobility() {
? mobilityData ? mobilityData
: mobilityData.filter((entry) => entry.promotionId === selectedPromotion); : 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 ( return (
<section> <section>
<h2>Consult Mobility</h2> <h2>Consult Mobility</h2>
@@ -117,15 +127,13 @@ export default function ConsultMobility() {
<td>{entry.mobilityStatus}</td> <td>{entry.mobilityStatus}</td>
<td> <td>
{entry.attestationFile ? ( {entry.attestationFile ? (
<a <button
href={`/api/download/${entry.id}`} onClick={() => downloadFile(entry.id)}
target="_blank"
rel="noopener noreferrer"
> >
Download Download
</a> </button>
) : ( ) : (
"N/A" "No file"
)} )}
</td> </td>
</tr> </tr>
@@ -49,31 +49,7 @@ export default function EditMobility() {
setMobilityData((prev) => setMobilityData((prev) =>
prev.map((entry) => prev.map((entry) =>
entry.studentId === studentId entry.studentId === studentId ? { ...entry, attestationFile: file } : entry
? { ...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
) )
); );
}; };
@@ -105,8 +81,6 @@ export default function EditMobility() {
} }
}); });
console.log("EditMobility: FormData prepared:", formData);
const response = await fetch("/mobility/api/insert-mobility", { const response = await fetch("/mobility/api/insert-mobility", {
method: "POST", method: "POST",
body: formData, body: formData,
@@ -137,6 +111,10 @@ export default function EditMobility() {
students: filteredData.filter((entry) => entry.promotionId === promo.id), students: filteredData.filter((entry) => entry.promotionId === promo.id),
})); }));
const handleDownload = (id: number) => {
window.open(`/mobility/api/download/${id}`, "_blank");
};
return ( return (
<div> <div>
<h2>Edit Mobility</h2> <h2>Edit Mobility</h2>
@@ -192,7 +170,13 @@ export default function EditMobility() {
type="date" type="date"
value={entry.startDate || ""} value={entry.startDate || ""}
onChange={(e) => 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> </td>
@@ -201,7 +185,13 @@ export default function EditMobility() {
type="date" type="date"
value={entry.endDate || ""} value={entry.endDate || ""}
onChange={(e) => 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> </td>
@@ -211,10 +201,12 @@ export default function EditMobility() {
type="text" type="text"
value={entry.destinationCountry || ""} value={entry.destinationCountry || ""}
onChange={(e) => onChange={(e) =>
handleChange( setMobilityData((prev) =>
entry.studentId, prev.map((data) =>
"destinationCountry", data.studentId === entry.studentId
e.target.value ? { ...data, destinationCountry: e.target.value }
: data
)
) )
} }
/> />
@@ -224,7 +216,13 @@ export default function EditMobility() {
type="text" type="text"
value={entry.destinationName || ""} value={entry.destinationName || ""}
onChange={(e) => 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> </td>
@@ -232,7 +230,13 @@ export default function EditMobility() {
<select <select
value={entry.mobilityStatus} value={entry.mobilityStatus}
onChange={(e) => 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> <option value="N/A">N/A</option>
@@ -245,17 +249,21 @@ export default function EditMobility() {
<td> <td>
{entry.attestationFile ? ( {entry.attestationFile ? (
<> <>
<a <button onClick={() => handleDownload(entry.id!)}>
href={`/api/download/${entry.id}`} Download
target="_blank" </button>
rel="noopener noreferrer"
>
View Current File
</a>
<button <button
onClick={() => handleRemoveFile(entry.studentId)} onClick={() =>
setMobilityData((prev) =>
prev.map((data) =>
data.studentId === entry.studentId
? { ...data, attestationFile: null }
: data
)
)
}
> >
Remove Delete
</button> </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