diff --git a/app/[locale]/dashboard/actions.ts b/app/[locale]/dashboard/actions.ts index 6aa4751..2cc2caf 100644 --- a/app/[locale]/dashboard/actions.ts +++ b/app/[locale]/dashboard/actions.ts @@ -335,12 +335,14 @@ export async function uploadFiles( // fichiers sous format JSON pour pouvoir les envoyer // à travers le réseau vers les composants clients. // Source : https://github.com/vercel/next.js/issues/47447 + const path = `${ process.env.__NEXT_ROUTER_BASEPATH }/d/${ fileId }`; + return JSON.stringify( { uuid: fileId, name: parse( file.name ).name, size: file.size, type: file.type, - path: `${ process.env.__NEXT_ROUTER_BASEPATH }/d/${ fileId }`, + path, versions: ( await prisma.version.findMany( { where: { @@ -352,8 +354,9 @@ export async function uploadFiles( } ) ).map( ( version ) => ( { uuid: version.id, - size: version.size, - date: version.createdAt.toLocaleString() + size: Number( version.size ), + date: version.createdAt.toLocaleString(), + path: `${ path }?v=${ version.id }` } ) ) } ); } ); diff --git a/app/[locale]/dashboard/components/file-history.tsx b/app/[locale]/dashboard/components/file-history.tsx index 46ccdfe..1dbb7b5 100644 --- a/app/[locale]/dashboard/components/file-history.tsx +++ b/app/[locale]/dashboard/components/file-history.tsx @@ -1,6 +1,12 @@ // // Composant de restauration des versions précédentes d'un fichier. // + +"use client"; + +import { formatSize } from "@/utilities/react-table"; +import type { Table, Row } from "@tanstack/react-table"; +import type { FileAttributes } from "@/interfaces/File"; import { Ban, Check, History, ArrowUpRight } from "lucide-react"; import { Separator } from "../../components/ui/separator"; @@ -16,40 +22,51 @@ import { AlertDialog, AlertDialogTrigger, AlertDialogDescription } from "../../components/ui/alert-dialog"; -const tags = Array.from( { length: 9 } ).map( - ( _, i, a ) => `Version du ${ a.length - i }/08/2023 - ${ i + 1 }0h${ i + 1 }0` -); - -export default function FileHistory() +export default function FileHistory( { + table, + row +}: { + table: Table; + row: Row; +} ) { + // Déclaration des constantes. + const files = table.options.meta?.files ?? []; + const file = files.filter( ( value ) => value.uuid === row.id )[ 0 ]; + const { versions } = file; + // Affichage du rendu HTML du composant. return ( + {/* Aucune version précédente */} + {!versions && ( +

+ Aucune révision précédente n‘est disponible pour ce + fichier. +

+ )} + {/* Liste des révisions */} diff --git a/app/[locale]/dashboard/page.tsx b/app/[locale]/dashboard/page.tsx index f9ff7e7..e8e25ac 100644 --- a/app/[locale]/dashboard/page.tsx +++ b/app/[locale]/dashboard/page.tsx @@ -81,23 +81,25 @@ async function getFiles(): Promise // Dans le cas contraire, on récupère les informations du fichier // avant de les retourner. const latest = result[ 0 ]; + const path = `${ process.env.__NEXT_ROUTER_BASEPATH }/d/${ latest.file.id }`; const info = parse( latest.file.name ); const stats = await stat( join( userStorage, object, latest.id + info.ext ) ); return { - uuid: latest.id, + uuid: latest.file.id, name: info.name, type: mime.getType( latest.file.name ) ?? "application/octet-stream", size: stats.size, date: stats.birthtime.toISOString(), - path: `${ process.env.__NEXT_ROUTER_BASEPATH }/d/${ latest.id }`, + path, status: latest.file.status ?? "public", versions: result.map( ( version ) => ( { id: version.id, - size: version.size, - date: version.createdAt.toLocaleString() + size: Number( version.size ), + date: version.createdAt.toLocaleString(), + path: `${ path }?v=${ version.id }` } ) ) } as FileAttributes; } ); diff --git a/app/api/file/[id]/route.ts b/app/api/file/[id]/route.ts index 4a732b5..cef374c 100644 --- a/app/api/file/[id]/route.ts +++ b/app/api/file/[id]/route.ts @@ -35,8 +35,7 @@ export async function GET( // On tente de récupérer l'identifiant unique de la version // à partir des paramètres de l'URL ou via la dernière version // du fichier fournie par la base de données. - const identifier = - request.nextUrl.searchParams.get( "version" ) ?? version.id; + const identifier = request.nextUrl.searchParams.get( "v" ) ?? version.id; const { file } = version; const url = new URL( `${ process.env.__NEXT_ROUTER_BASEPATH }/files/${ file.userId }/${ diff --git a/interfaces/File.ts b/interfaces/File.ts index 262d07c..5d52193 100644 --- a/interfaces/File.ts +++ b/interfaces/File.ts @@ -29,9 +29,12 @@ export interface FileAttributes { id: string; // Poids de la version en octets. - size: string; + size: number; // Date de création de la version. date: string; + + // Chemin d'accès à la version. + path: string; }[]; } \ No newline at end of file diff --git a/middleware.ts b/middleware.ts index 14f0db9..6c0a842 100644 --- a/middleware.ts +++ b/middleware.ts @@ -26,7 +26,7 @@ export default async function middleware( request: NextRequest ) // du fichier à partir de son identifiant. const data = await fetch( new URL( - `${ process.env.__NEXT_ROUTER_BASEPATH }/api/file/${ identifier }`, + `${ process.env.__NEXT_ROUTER_BASEPATH }/api/file/${ identifier }/${ request.nextUrl.search }`, request.url ), { headers: request.headers }