get-rabbithole / api

REST API to handle uploads and downloads.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

rabbithole

Stack: Node.js, Fastify, Prisma, Cloudflare R2

Requisitos

Requisitos Funcionais (RFs):

  • Deve ser possível realizar novos uploads;
  • Deve ser possível visualizar os últimos 5 uploads realizados;

Regras de Negócio (RNs):

  • Os uploads devem ser removidos automaticamente após 7 dias;
  • Só deve ser possível visualizar uploads não expirados;
  • Só deve ser possível realizar upload de arquivos seguros;
  • Só deve ser possível upload de arquivos até 1gb cada;

Requisitos Não Funcionais (RNFs):

  • Utilização do Cloudflare R2 para upload de arquivos;
  • O upload deve ser feito diretamente pelo front-end utilizando Presigned URLs;
  • Os links para compartilhamento devem ser assinados evitando acesso público;

Anotações importantes

Mime Types

const bannedMimeTypes = [
  '.exe', // (executáveis)
	'.dll', // (bibliotecas dinâmicas)
	'.bat', // (arquivos de lote)
	'.cmd', // (arquivos de comando)
	'.sh' , // (scripts shell)
	'.cgi', // (scripts CGI)
	'.jar', // (arquivos Java)
	'.app', // (aplicativos macOS)
];

Trechos de código

Conexão com Cloudflare (AWS SDK)

import { S3Client } from '@aws-sdk/client-s3'

export const r2 = new S3Client({
  region: 'auto',
  endpoint: env.CLOUDFLARE_ENDPOINT,
  credentials: {
    accessKeyId: env.CLOUDFLARE_ACCESS_KEY,
    secretAccessKey: env.CLOUDFLARE_SECRET_KEY,
  },
})

Upload no CloudFlare

const signedUrl = await getSignedUrl(
	r2,
	new PutObjectCommand({
		Bucket: 'bucket-name',
		Key: 'file.mp4',
		ContentType: 'video/mp4',
	}),
	{ expiresIn: 600 },
)
await axios.put(uploadURL, file, {
	headers: {
		'Content-Type': file.type,
	},
})

About

REST API to handle uploads and downloads.


Languages

Language:TypeScript 100.0%