Atributos de Categoría con Traducciones y Claves Estándares

·

3 min read

Resumen

El presente documento describe el diseño final del sistema de atributos, pensado tanto para programadores como para usuarios finales, integrando:

  1. Claves estándares para programadores (ágil, único e inmutable).

  2. Traducciones multilenguaje para los usuarios finales.

  3. 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:

  1. identifier:

    • Una clave estándar, única y pensada para los programadores.

    • Ejemplo: "color", "size".

  2. 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

  1. Claridad para Programadores:

    • identifier proporciona un identificador único y consistente para la lógica interna.

    • Evita ambigüedades en sistemas multilingüe.

  2. Experiencia Multilenguaje:

    • name asegura que los usuarios finales vean nombres y descripciones traducidos a su idioma.

    • Los valores permitidos también son multilingüe.

  3. 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).

  4. 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.