respect user limits

This commit is contained in:
cirroskais 2024-07-06 00:49:08 -04:00
parent 4b56653181
commit d4e4b32783
No known key found for this signature in database
GPG key ID: 5FC73EBF2678E33D
9 changed files with 51 additions and 14 deletions

View file

@ -4,7 +4,7 @@
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "vite dev", "dev": "vite dev",
"build": "vite build", "build": "BODY_SIZE_LIMIT=10737418240 vite build",
"preview": "vite preview", "preview": "vite preview",
"lint": "prettier --check .", "lint": "prettier --check .",
"format": "prettier --write ." "format": "prettier --write ."

12
src/app.d.ts vendored
View file

@ -1,4 +1,12 @@
import type { User } from '@prisma/client'; import type { Role } from '@prisma/client';
export interface UserSafe {
id: number;
username: string;
email: string;
maxUploadMB: number;
role: Role;
}
declare global { declare global {
namespace App { namespace App {
@ -7,7 +15,7 @@ declare global {
message: string; message: string;
} }
interface Locals { interface Locals {
user: User; user: UserSafe;
} }
interface PageData {} interface PageData {}
// interface PageState {} // interface PageState {}

View file

@ -14,13 +14,15 @@ const PUBLIC_RESOURCES = [
/** @type {import('@sveltejs/kit').Handle} */ /** @type {import('@sveltejs/kit').Handle} */
export async function handle({ event, resolve }) { export async function handle({ event, resolve }) {
const { cookies, locals } = event; const { cookies, locals } = event;
const session = await getSession(cookies.get(COOKIE)); const session = await getSession(cookies.get(COOKIE) || '');
if (session && session.user) { if (session && session.user) {
locals.user = { locals.user = {
id: session.user.id, id: session.user.id,
username: session.user.username, username: session.user.username,
email: session.user.email email: session.user.email,
maxUploadMB: session.user.maxUploadMB,
role: session.user.role
}; };
} else { } else {
if (event.route.id) { if (event.route.id) {

View file

@ -1,7 +1,8 @@
<script lang="ts"> <script lang="ts">
import { bytesToHumanReadable } from '$lib/index'; import { bytesToHumanReadable } from '$lib/index';
import { fileProgress } from '$lib/stores'; import { fileProgress, user } from '$lib/stores';
import { CircleAlert, X } from 'lucide-svelte'; import { CircleAlert, X } from 'lucide-svelte';
import { get } from 'svelte/store';
import { fade } from 'svelte/transition'; import { fade } from 'svelte/transition';
export let file: File; export let file: File;
@ -41,12 +42,16 @@
{/if} {/if}
<div class="flex gap-0.5"> <div class="flex gap-0.5">
{#if file.size > 104857600} {#if file.size > get(user).maxUploadMB * 1048576}
<p class="font-bold text-red"> <p class="font-bold text-red">
<CircleAlert class="w-4 h-4"></CircleAlert> <CircleAlert class="w-4 h-4"></CircleAlert>
</p> </p>
{/if} {/if}
<p class="text-xs my-auto {file.size > 104857600 ? 'text-red font-bold' : 'text-overlay1'}"> <p
class="text-xs my-auto {file.size > get(user).maxUploadMB * 1048576
? 'text-red font-bold'
: 'text-overlay1'}"
>
{bytesToHumanReadable(file.size)} {bytesToHumanReadable(file.size)}
</p> </p>
</div> </div>

View file

@ -1,7 +1,8 @@
import { writable, type Writable } from 'svelte/store'; import { writable, type Writable } from 'svelte/store';
import type { UserSafe } from '../app';
export const darkMode = writable(); export const darkMode = writable();
export const user = writable(); export const user: Writable<UserSafe> = writable();
// too lazy to do types for this // too lazy to do types for this
export const fileProgress: Writable<{ [key: string]: any }> = writable({}); export const fileProgress: Writable<{ [key: string]: any }> = writable({});

View file

@ -67,8 +67,10 @@
<div class="w-[23rem] h-[calc(100vh-4.5rem)] flex mx-auto"> <div class="w-[23rem] h-[calc(100vh-4.5rem)] flex mx-auto">
<div class="flex flex-col gap-2 my-auto w-full"> <div class="flex flex-col gap-2 my-auto w-full">
<div> <div>
<h1 class="text-2xl font-bold">Welcome, {$page.data.user.username}.</h1> <h1 class="text-2xl font-bold">Welcome, {data.user.username}.</h1>
<p class="text-overlay1">Your max upload size is <span class="font-bold">100 MB</span>.</p> <p class="text-overlay1">
Your max upload size is <span class="font-bold">{data.user.maxUploadMB} MB</span>.
</p>
</div> </div>
<div class="flex flex-col gap-2 p-2 mx-auto w-full rounded-lg shadow-lg bg-crust"> <div class="flex flex-col gap-2 p-2 mx-auto w-full rounded-lg shadow-lg bg-crust">
{#key fileMap} {#key fileMap}

View file

@ -0,0 +1,10 @@
/** @type {import("@sveltejs/kit").ServerLoad} */
export function load({ locals, fetch }) {
const statistics = fetch('/api/statistics').then((response) => response.json());
return {
streamed: {
statistics
}
};
}

View file

@ -12,6 +12,8 @@
import LoginForm from '$lib/components/Forms/LoginForm.svelte'; import LoginForm from '$lib/components/Forms/LoginForm.svelte';
import RegisterForm from '$lib/components/Forms/RegisterForm.svelte'; import RegisterForm from '$lib/components/Forms/RegisterForm.svelte';
export let data;
let state = writable('/landing'); let state = writable('/landing');
if ($page.url.hash.replace('#', '') !== '') { if ($page.url.hash.replace('#', '') !== '') {
@ -31,7 +33,12 @@
<div class="flex flex-col space-y-1.5"> <div class="flex flex-col space-y-1.5">
<div class="text-text fill-text"> <div class="text-text fill-text">
<Logo /> <Logo />
<p>Currently hosting <strong>0</strong> files.</p> {#await data.streamed.statistics}
<p>Currently hosting <strong>...</strong> files.</p>
{:then stats}
<p>Currently hosting <strong>{stats.files}</strong> files.</p>
{/await}
<p class="italic">The best file uploader <strong>ever!!!</strong></p> <p class="italic">The best file uploader <strong>ever!!!</strong></p>
</div> </div>

View file

@ -14,9 +14,11 @@ export const POST = async ({ request, cookies }) => {
const data = await request.formData(); const data = await request.formData();
const file = data.get('file') as File; const file = data.get('file') as File;
let id = generateId(undefined, 10);
console.log(id); if (Math.floor(file.size / (1024 * 1024)) > user.maxUploadMB)
return error(413, { status: 413, message: 'Content Too Large' });
let id = generateId(undefined, 10);
const object = await minio const object = await minio
.putObject( .putObject(