Mejorando la Configuración de Perfil en TuTiendaWeb: Unicidad de Slugs y Validaciones Robustas
IntroducciónNuestro proyecto, TuTiendaWeb, se enfoca en proporcionar a los comerciantes una plataforma intuitiva para crear y gestionar sus tiendas online. Una parte fundamental de esta experiencia es la configuración del perfil de la tienda, que incluye información básica, detalles de contacto y ajustes generales. Recientemente, hemos trabajado en fortalecer y refinar este proceso, prestando especial atención a la unicidad de los identificadores de tienda (slugs) y a la robustez de las validaciones de negocio.
El DesafíoAnteriormente, la gestión de la configuración del perfil de la tienda presentaba varios puntos a mejorar. La actualización de la información se manejaba de forma genérica, lo que podía llevar a validaciones incompletas o a una lógica compleja para discernir qué partes del perfil se estaban modificando. Además, un reto clave era asegurar la unicidad de los slugs de las tiendas de manera consistente, incluso frente a variaciones de mayúsculas y minúsculas, y proporcionar retroalimentación precisa sobre la disponibilidad de un slug a los usuarios en tiempo real.
La SoluciónImplementamos un profile.server-service dedicado que permite la actualización del perfil de la tienda por secciones (como basicInfo, contact o settings). Esta modularidad simplifica la lógica de negocio y mejora la claridad del código. Central a esta solución es la función checkSlugAvailability, que verifica si un slug propuesto ya está en uso, asegurando que la comprobación sea case-insensitive. Esto previene conflictos donde 'mitienda' y 'MiTienda' se tratarían como diferentes pero en realidad representan el mismo identificador.
Además, se integraron validaciones de negocio exhaustivas directamente en el servicio, rechazando peticiones que no cumplen con los criterios de integridad de datos antes de que lleguen a la base de datos. Esto garantiza que solo los datos válidos persistan en nuestro almacenamiento de datos, optimizando el rendimiento y la fiabilidad.
import { db } from './firebase-admin'; // Asume inicialización de Firebase Admin SDK
import { FieldValue } from 'firebase-admin/firestore';
interface StoreProfile {
id: string;
name: string;
slug: string;
// ... otras propiedades de perfil
}
export async function checkSlugAvailability(slug: string): Promise<boolean> {
const normalizedSlug = slug.toLowerCase();
const storesRef = db.collection('stores');
const querySnapshot = await storesRef
.where('normalizedSlug', '==', normalizedSlug)
.limit(1)
.get();
return querySnapshot.empty;
}
export async function updateStoreProfile(storeId: string, updates: Partial<StoreProfile>): Promise<void> {
const storeRef = db.collection('stores').doc(storeId);
const currentProfile = (await storeRef.get()).data() as StoreProfile | undefined;
if (!currentProfile) {
throw new Error('Tienda no encontrada.');
}
if (updates.slug && updates.slug.toLowerCase() !== currentProfile.slug.toLowerCase()) {
const isAvailable = await checkSlugAvailability(updates.slug);
if (!isAvailable) {
throw new Error(`El slug '${updates.slug}' ya está en uso.`);
}
// Guardar también un slug normalizado para búsquedas eficientes
await storeRef.update({
...updates,
slug: updates.slug, // Mantener el casing original del usuario
normalizedSlug: updates.slug.toLowerCase(),
updatedAt: FieldValue.serverTimestamp()
});
} else {
await storeRef.update({
...updates,
updatedAt: FieldValue.serverTimestamp()
});
}
// Más validaciones de negocio aquí para otros campos
// if (updates.name && updates.name.length < 3) { throw new Error('Nombre muy corto'); }
}
Decisiones Clave
- Actualizaciones Seccionales: Permiten a los usuarios actualizar solo las partes relevantes de su perfil sin afectar ni requerir la revalidación de datos no relacionados. Esto mejora la experiencia de usuario y reduce la carga en el servidor.
- Unicidad de Slug Case-Insensitive: Fundamental para evitar que los usuarios creen slugs visualmente distintos pero funcionalmente idénticos, lo que podría generar confusión o problemas de enrutamiento. Almacenar un
normalizedSlugen Firestore facilita esta búsqueda. - Validaciones Tempranas: Integrar validaciones de negocio directamente en el servicio previene la persistencia de datos inválidos y ofrece una retroalimentación más rápida y precisa a los usuarios.
ResultadosLa implementación de estas mejoras ha llevado a un sistema de configuración de perfil de tienda más robusto y fiable en TuTiendaWeb. Los propietarios de tiendas ahora disfrutan de una experiencia de actualización más fluida y con menos errores, con una confirmación inmediata sobre la disponibilidad del slug deseado. Para el equipo de desarrollo, ha resultado en una base de código más limpia y mantenible, con responsabilidades claras para cada sección del servicio y validaciones bien definidas.
Lecciones AprendidasLa lección principal aquí es la importancia de anticipar y gestionar la integridad de los datos desde las primeras etapas del desarrollo. No subestimes el valor de las validaciones de negocio y de una estrategia clara para la unicidad de identificadores, especialmente cuando se trata de datos críticos como los slugs de tiendas. Una inversión temprana en estas áreas reduce significativamente los problemas de datos y mejora la experiencia del usuario a largo plazo. Siempre define reglas claras para los datos críticos y valídalas en el punto de entrada al sistema.
Generated with Gitvlg.com