Skip to content

Commit

Permalink
Fixed user quota validation when uploading files and avatars
Browse files Browse the repository at this point in the history
  • Loading branch information
FlorianLeChat committed Jan 3, 2024
1 parent 9bde590 commit d6133d7
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 6 deletions.
2 changes: 1 addition & 1 deletion .env
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# NextJS parameters
NEXT_PUBLIC_ENV=development
NEXT_PUBLIC_TIMEZONE=Europe/Paris
NEXT_PUBLIC_MAX_FILE_SIZE=104857600 # 1024 * 1024 * 100 = 100MB (bytes)
NEXT_PUBLIC_MAX_QUOTA=104857600 # 1024 * 1024 * 100 = 100MB (bytes)
NEXT_PUBLIC_MAX_AVATAR_SIZE=5242880 # 1024 * 1024 * 5 = 5MB (bytes)
NEXT_PUBLIC_ACCEPTED_FILE_TYPES=image/*, video/*, audio/* # https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/accept
NEXT_PUBLIC_ACCEPTED_AVATAR_TYPES=image/jpeg, image/jpg, image/png, image/webp
Expand Down
32 changes: 30 additions & 2 deletions app/[locale]/dashboard/actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -131,9 +131,23 @@ export async function uploadFiles(

await mkdir( userFolder, { recursive: true } );

// On sort après chaque fichier téléversé de la mémoire.
result.data.upload.forEach( async ( file: File ) =>
// On récupère après le quota actuel et maximal de l'utilisateur.
const maxQuota = Number( process.env.NEXT_PUBLIC_MAX_QUOTA );
let currentQuota = ( await getUserQuota() ).value;

// On vérifie si le quota de l'utilisateur n'est pas dépassé pour
// chaque fichier à téléverser.
result.data.upload.every( async ( file ) =>
{
// Si le quota de l'utilisateur est dépassé, on indique
// que le téléversement a été interrompu.
currentQuota += file.size;

if ( currentQuota > maxQuota )
{
return false;
}

// On insère le nom du fichier et son statut dans la base de
// données afin de générer un identifiant unique.
const identifier = (
Expand All @@ -155,7 +169,21 @@ export async function uploadFiles(
),
new Uint8Array( await file.arrayBuffer() )
);

// On indique par ailleurs que le téléversement s'est bien
// passé.
return true;
} );

if ( currentQuota > maxQuota )
{
// Si un dépassement de quota a été détecté, on affiche un
// message d'erreur dans le formulaire.
return {
success: false,
reason: "form.errors.quota_exceeded"
};
}
}
catch ( error )
{
Expand Down
7 changes: 5 additions & 2 deletions app/[locale]/settings/components/profile.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import { useFormState } from "react-dom";
import type { Session } from "next-auth";
import { useState, useEffect } from "react";

import { formatSize } from "@/utilities/react-table";
import { Input } from "../../components/ui/input";
import { Button } from "../../components/ui/button";
import { useToast } from "../../components/ui/use-toast";
Expand All @@ -31,6 +32,7 @@ import { updateProfile } from "../profile/actions";
export default function Profile( { session }: { session: Session } )
{
// Déclaration des constantes.
const maxAvatarSize = Number( process.env.NEXT_PUBLIC_MAX_AVATAR_SIZE ?? 0 );
const { toast } = useToast();
const formState = {
success: true,
Expand Down Expand Up @@ -209,8 +211,9 @@ export default function Profile( { session }: { session: Session } )
Vous pouvez mettre à jour l‘avatar utilisé
pour votre compte utilisateur.{" "}
<strong>
Les avatars ne doivent pas dépasser 5 Mo et
doivent être au format PNG, JPEG ou WEBP.
Les avatars ne doivent pas dépasser{" "}
{formatSize( maxAvatarSize )} et doivent être
au format PNG, JPEG ou WEBP.
</strong>
</FormDescription>

Expand Down
2 changes: 1 addition & 1 deletion schemas/file-upload.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import { z } from "zod";

// Taille maximale d'un fichier.
const MAX_FILE_SIZE = Number( process.env.NEXT_PUBLIC_MAX_FILE_SIZE ?? "0" );
const MAX_FILE_SIZE = Number( process.env.NEXT_PUBLIC_MAX_QUOTA ?? "0" );

// Types de fichiers acceptés.
const ACCEPTED_FILE_TYPES =
Expand Down

0 comments on commit d6133d7

Please sign in to comment.