Atributos de Categoría con Traducciones y Claves Estándares
Resumen
El presente documento describe el diseño final del sistema de atributos, pensado tanto para programadores como para usuarios finales, integrando:
Claves estándares para programadores (ágil, único e inmutable).
Traducciones multilenguaje para los usuarios finales.
Un modelo flexible, escalable y alineado con las mejores prácticas de APIs modernas.
Problemática
En el diseño inicial, los atributos se gestionaban como “claves estándares” (é.g., “Color” o “Tamaño”) sin una separación clara entre su uso interno (por programadores) y su presentación a usuarios finales (multilenguaje). Esto causaba posibles inconsistencias y dificultaba su extensión.
Solución
Se introducen dos conceptos clave en el sistema:
identifier
:Una clave estándar, única y pensada para los programadores.
Ejemplo:
"color"
,"size"
.
name
:Una representación traducida y pensada para los usuarios finales.
Usa un sistema internacionalizado basado en
I18nField
.Ejemplo:
enUs: "Color"
esMx: "Color"
frFr: "Couleur"
Diseño Final del Modelo
Tipo Attr
El atributo es el elemento central y combina:
Clave única (
identifier
).Nombre traducible (
name
).Tipos y validaciones específicas.
type Attr {
id: ID!
identifier: String! # Clave estándar (ágil y única)
name: I18nField! # Nombre internacionalizado
type: AttrType! # Tipo del atributo (string, number, select, etc.)
validations: ValidationRules # Reglas de validación
scope: AttrScope! # GLOBAL o CATEGORY
categoryIds: [ID!]! # Categorías relacionadas (vacío si es GLOBAL)
}
Categorías y Elementos Relacionados
Categorías (Category
):
Integran identifier
y name
para definir el contexto de los atributos.
type Category {
id: ID!
identifier: String! # Clave estándar para programadores (ejemplo: "electronics")
name: I18nField! # Nombre internacionalizado para usuarios finales
type: CategoryType!
parentId: ID # Relación con la categoría padre
createdAt: Time!
updatedAt: Time!
}
Flujo de Datos
1. Definir un Atributo Global (Ejemplo: Color)
mutation {
createAttr(input: {
identifier: "color",
name: {
enUs: "Color",
esMx: "Color",
frFr: "Couleur"
},
type: SELECT,
validations: {
allowedValues: [
{ identifier: "blue", name: { enUs: "Blue", esMx: "Azul", frFr: "Bleu" } },
{ identifier: "red", name: { enUs: "Red", esMx: "Rojo", frFr: "Rouge" } }
]
},
scope: GLOBAL,
categoryIds: []
}) {
id
identifier
name {
enUs
esMx
}
}
}
2. Consultar una Categoría con Atributos
query {
category(id: "123") {
id
identifier
name {
enUs
esMx
}
attrs {
id
identifier
name {
enUs
esMx
}
type
validations {
allowedValues {
identifier
name {
enUs
esMx
}
}
}
}
}
}
Respuesta:
{
"data": {
"category": {
"id": "123",
"identifier": "electronics",
"name": {
"enUs": "Electronics",
"esMx": "Electrónicos"
},
"attrs": [
{
"id": "1",
"identifier": "color",
"name": {
"enUs": "Color",
"esMx": "Color"
},
"type": "SELECT",
"validations": {
"allowedValues": [
{
"identifier": "blue",
"name": {
"enUs": "Blue",
"esMx": "Azul"
}
},
{
"identifier": "red",
"name": {
"enUs": "Red",
"esMx": "Rojo"
}
}
]
}
}
]
}
}
}
Ventajas del Diseño
Claridad para Programadores:
identifier
proporciona un identificador único y consistente para la lógica interna.Evita ambigüedades en sistemas multilingüe.
Experiencia Multilenguaje:
name
asegura que los usuarios finales vean nombres y descripciones traducidos a su idioma.Los valores permitidos también son multilingüe.
Flexibilidad y Escalabilidad:
Fácil de agregar nuevos idiomas, valores o tipos de atributos.
Compatible con futuros casos de uso (atributos globales o específicos).
Estandarización:
Sigue las mejores prácticas de APIs modernas.
Usa una estructura coherente para programadores y usuarios finales.
Este diseño proporciona una base robusta, clara y escalable para manejar atributos, categorías y productos en un sistema multilingüe.