El blog ahora tiene cuentas de usuario, lo que significa que tiene datos de usuario, lo que significa que la ley de la UE y mi propia conciencia están de acuerdo en que la gente necesita dos botones: uno para descargar todo lo que tengo sobre ellos, y otro para hacer que todo desaparezca. Esta es la historia de construir ambos, y de por qué el botón de eliminar en realidad no elimina.
El botón de descarga fue la mitad fácil. Un solo endpoint que reúne todo lo relacionado con tu cuenta desde ambos servicios (los detalles de tu cuenta desde auth, tus comentarios, likes e informes desde blog) y te lo devuelve como un único archivo JSON. Listo, o eso pensé. La revisión de código detectó que lo había puesto detrás del inicio de sesión pero había olvidado el limitador de tasa, así que cualquiera con una cuenta podía machacar un endpoint bastante costoso. Una envoltura de middleware después, quedó realmente terminado.
El botón de eliminar fue donde se puso interesante. Mi primer instinto fue el obvio: eliminar la cuenta, eliminar los comentarios, listo. Pero eso rompe las conversaciones. Si escribiste un comentario y tres personas respondieron, eliminar tu comentario deja sus respuestas colgando en el aire, sin responder a nadie. El hilo deja de tener sentido para todos menos para ti.

Así que en su lugar el blog crea una cuenta compartida llamada anonymous en el primer arranque, y eliminar tu cuenta le transfiere todo lo que escribiste. Tu nombre desaparece, las palabras se quedan. El hilo de comentarios se sigue leyendo bien, solo que ahora dice anonymous donde antes estaba tu nombre de usuario:
-- name: AnonymizeComments :execrows
-- Reattributes a deleted user's comments to the shared anonymous account.
UPDATE comments
SET author_id = sqlc.arg(anonymous_id)::uuid, author_username = 'anonymous'
WHERE author_id = sqlc.arg(user_id)::uuid;Esa parte funcionó al primer intento. Los likes no. Un like es una fila que dice "este usuario le dio like a este comentario", y el par tiene que ser único. Si le diste like a un comentario que un usuario eliminado anteriormente también había marcado, ambos likes ahora quieren convertirse en "anonymous le dio like a este comentario", y la base de datos rechaza correctamente el duplicado. La solución es eliminar primero los likes en conflicto (el contador del comentario sigue siendo honesto, anonymous ya le dio like) y luego reasignar el resto.
El orden también importaba. El servicio de blog anonimiza primero, luego el servicio de auth elimina la cuenta. Si falla a mitad de camino, te quedas como un usuario cuyo contenido ya está anonimizado, lo cual es seguro y se puede simplemente reintentar. El otro orden podría eliminar tu cuenta y dejar tus comentarios huérfanos bajo un id de usuario que ya no existe.
Al final se añadieron dos protecciones: la cuenta anonymous no puede eliminarse a sí misma (eso sería un bug curioso), y el último administrador tampoco puede eliminarse a sí mismo, porque un blog donde nadie puede iniciar sesión en el panel de administración es un blog muy silencioso.
Probé todo el proceso con una cuenta desechable: me registré, comenté, descargué mis datos, pulsé eliminar. El comentario sigue ahí, firmado como anonymous, y el inicio de sesión dejó de funcionar. Exactamente lo que promete el botón, aunque no sea exactamente lo que dice.