TurboJet
Storage

Akses file tersimpan

Daftar, URL unduh ter-sign, URL publik, dan hapus lewat /api/storage.

Setelah unggah, objek tetap di bucket privat. Akses dikontrol di API: hanya pemilik yang bisa mendaftar, menandatangani, atau menghapus file READY miliknya.

Daftar file

GET /api/storage/

Memerlukan auth. Mengembalikan file pengguna saat ini berstatus READY.

URL unduh ter-sign

GET /api/storage/signed?path=users/{userId}/….pdf

Memakai getSignedUrl dari @repo/storage (kedaluwarsa default 15 menit). Siapa pun yang punya URL bisa mengambil objek sampai kedaluwarsa — jaga TTL pendek dan hanya kembalikan URL ke pemanggil yang berwenang.

const res = await fetch(
	`/api/storage/signed?path=${encodeURIComponent(filePath)}`,
	{ credentials: "include" },
);
const { url } = await res.json();
window.open(url, "_blank");

Anda juga bisa memanggil getSignedUrl dari kode server di @repo/storage saat membangun handler sendiri:

import { getSignedUrl } from "@repo/storage";

const { url } = await getSignedUrl({
	path: filePath,
	expiresIn: 60, // detik
});

URL publik

GET /api/storage/public?path=…

Memerlukan S3_PUBLIC_URL. Mengembalikan URL publik stabil (getPublicUrl) alih-alih tanda tangan berbatas waktu. Pakai hanya jika objek sengaja publik lewat r2.dev atau domain CDN kustom.

Lebih baik URL ter-sign

Untuk file pengguna privat, pakai /api/storage/signed. Biarkan S3_PUBLIC_URL kosong kecuali Anda butuh aset publik.

Hapus

DELETE /api/storage/:id

Menghapus objek di bucket (deleteObject) dan menandai baris Prisma DELETED. Hanya pemilik yang bisa menghapus.

Proxy redirect opsional

Jika Anda ingin path menghadap browser seperti /files/... alih-alih menyerahkan URL ter-sign ke client, Anda bisa menambah route Next.js yang memeriksa auth, memanggil getSignedUrl, lalu redirect. Pola itu tidak di-ship di repo ini — jaga pengecekan kepemilikan di handler dan pertimbangkan Cache-Control jika konten aman di-cache sebentar.

Terkait

Di halaman ini