El servidor Compartir y enlaces
Compartir y enlaces
En esta página
Roles
Lector, comentarista o editor, en una entrada y lo que tiene dentro. Aparece en su Compartido conmigo, no en sus Mis archivos, que son solo suyos; al lado, cuántos son nuevos desde la última vez que miró. Para un solo drive de todo un equipo, dale al servidor top: 'everyone'.
Enlaces
Cualquiera que tenga uno puede mirar y descargar, sin iniciar sesión, durante un día, una semana o un mes, o hasta que se quite.
- Con contraseña: se pide antes de mostrar nada, se envía como
x-link-passworden cada petición, se guarda solo como la hace scrypt, y tras cada intento fallido se espera un momento. - De una descarga: se gasta al descargar un archivo o un .zip de él, no al mirar; sigue funcionando un cuarto de hora después, para los archivos de esa descarga.
// The page a link goes to: app/shared/page.tsx
'use client';
import { SharedLink } from '@rebofiles/react';
import { useSearchParams } from 'next/navigation';
export default function Shared() {
return <SharedLink base="/api/files" token={useSearchParams().get('link') ?? ''} />;
}
// And in the drive, where its links point:
<FileDrive base="/api/files" linkAddress={(token) => `${origin}/shared?link=${token}`} />Por un tiempo
Compartido con alguien por un día, una semana, un mes o tres: pasado ese tiempo no le da nada, como si se hubiera quitado, y ya no está en su Compartido conmigo.
await client.share(folder.id, 'auditor', 'viewer', 30); // for thirty days, then nothing
await client.share(folder.id, 'auditor', 'editor'); // another role: the same end
await client.share(folder.id, 'auditor', 'editor', null); // for goodEl diálogo y los detalles dicen hasta cuándo; uno terminado lo dice, para compartirlo de nuevo o quitarlo.
Solicitudes de archivos
Solicitar archivos, en el menú de una carpeta (y junto a su nombre al estar en ella): un enlace que recibe archivos, “Solo enviar archivos”, sin mostrar nada de lo que hay, o “Ver y añadir archivos”. Hecho, se copia, para abrirlo o enviarlo; quien lo abre sin sesión dice quién es, si quiere, y envía.
// A request for files: whoever opens it sends them, and sees nothing of what is there.
const { token } = await client.createLink(folder.id, 7, {
uploads: 'only', // or 'also': they see the folder, and may add to it
request: {
title: 'Northwind',
message: 'Send what is missing, please.',
askName: true,
email: 'carla@northwind.com', // for your app to remind her, and send a receipt
items: [{ id: 'contract', label: 'Signed contract' }, { id: 'id', label: 'ID' }],
closeWhenDone: true, // closed once both came
accept: ['application/pdf', 'image/*'],
maxSize: 25 * 1024 * 1024,
perSender: true, // Northwind papers / Carla Ruiz / …
rename: '{item} - {name}', // "Signed contract - Carla Ruiz.pdf"
fields: { client: 'northwind' }, // found by your CRM with withField
},
});
createDriveHandler({
...options,
onReceived: ({ entry, from, item, request, got }) => mail(request?.email, `Received: ${item}`),
onReview: ({ entry, status, reason, from }) => status === 'rejected' && tellToSendAgain(from, reason),
});
// A cron of yours: GET /admin/requests gives every request open, whom it was sent to and what is missing.- Quien envía ve cada documento pedido en su propio lugar, con “Elegir archivo” y “Tomar foto”: las fotos de un documento van como un solo PDF. Puede deshacer lo que envió durante diez minutos, y se lleva un comprobante.
- Lo que llega es del dueño de la carpeta, cuenta en su espacio y dice quién lo envió y qué documento es. Al dueño se le avisa en la campana, lo encuentra todo en Recibidos, y lo acepta o lo devuelve con un motivo.
- La carpeta muestra sus solicitudes abiertas sobre sus archivos: qué llegó de cada una, qué falta, hasta cuándo.
- Sube como cualquier archivo, por partes directo al almacenamiento, retomado tras un corte y revisado como cualquiera; el enlace no puede hacer nada más. Su vencimiento y su contraseña valen como en cualquier enlace.
- La página del enlace lleva el nombre de tu empresa (Ajustes → company) y el color de marca del drive, para que quien envía sepa a quién.
Plantillas, recordatorios, revisión y vencimientos
Lo que hace una solicitud además de recibir archivos. Cada cosa está activa salvo que el drive o el servidor digan false, y los recordatorios solo con una forma de enviarlos.
import { createDriveHandler, mailReminders, resend } from '@rebofiles/server';
createDriveHandler({
...options,
// Whom a request was sent to, reminded every `remind` days of what is missing, and with "Remind now".
reminders: mailReminders({
mail: resend({ apiKey: process.env.RESEND_KEY!, from: 'Acme <files@acme.com>' }), // or (mail) => yourSmtp(mail)
url: (token) => `https://files.acme.com/?link=${token}`,
}),
// Told 15 days before a file's field `expires`, in the bell and here; `false` for none.
expiring: { days: 15, onExpiring: ({ entry, expires }) => log(entry.name, expires) },
// What is written in what came, against its document's words and patterns: the core's, yours, or false.
// check: async ({ entry, item, text }) => ({ missing: [], fields: await readWithYourService(text) }),
});
await client.createLink(folder.id, 30, {
uploads: 'only',
request: {
email: 'carla@northwind.com',
remind: 3,
items: [
{ id: 'id', label: 'ID', words: ['INE', 'passport'], expires: true },
{ id: 'tax', label: 'Tax certificate', find: { rfc: '\\b([A-Z&Ñ]{3,4}\\d{6}[A-Z0-9]{3})\\b' } },
],
},
});
// Templates, for everyone of the drive: saved from the dialog, or given as the defaults.
createDriveHandler({ ...options, settings: { requestTemplates: [{ id: 'supplier', name: 'Supplier sign-up', request }] } });- Plantillas: “Empezar de una plantilla” arriba del diálogo de una solicitud, y “Guardar como plantilla” para quien puede configurar el drive (lo que pide y cómo, no a quién). Ajustes → Apariencia las lista, para quitar una. requestTemplates: false de la pantalla para ninguna.
- Un código QR de la dirección, en la página de una solicitud hecha, para mostrarlo a un teléfono o descargarlo como PNG; qr: false para ninguno.
- Recordatorios: a quien se le envió la solicitud, cada 2, 3 o 7 días mientras falte algo y esté abierta, y al momento con “Recordar ahora”. Sin los reminders del servidor, el diálogo no los ofrece.
- Revisión: las palabras que debe decir un documento y los campos que buscar en él, contra lo escrito en lo que llegó (su texto, o el OCR de una imagen). Lo que no dice ninguna se marca “No dice …” en Recibidos; una foto borrosa se pide otra vez antes de enviarse (checkBlur: false de la página del enlace para no).
- Vencimientos: un documento puede pedir hasta cuándo vale. A su dueño se le avisa en la campana quince días antes; Recibidos y los detalles muestran los días que quedan, y “Pedir de nuevo” hace una solicitud de ese solo documento.
Cuando un enlace falla
This link does not work any more.
Se quitó, caducó, se usó, lo que leía fue a la papelera, o su dirección cambió por el camino: cuál de ellas, un enlace no se lo dice a quien lo tiene.
This link asks for its password. · That is not the password.
La página del enlace la pide primero, y la envía en cada petición.
Avisar a la gente
Actividad y notificaciones: onShare se llama con cada compartición, para enviar un correo o un aviso de tu aplicación.