--- title: 'Creación de Proyecto con Loopback' disqus: hackmd --- LoopBack 4 === [Referencia](https://loopback.io/doc/en/lb4/) [Modules](https://github.com/strongloop/loopback) --- LoopBack es un galardonado framework Node.js y TypeScript de código abierto, altamente extensible y basado en Express. Permite crear rápidamente API y microservicios compuestos a partir de sistemas backend como bases de datos y servicios SOAP o REST. Loopback se compone de: * Una biblioteca de módulos Node.js. * Generadores Yeoman para aplicaciones. * SDK de cliente para iOS, Android y clientes web. Herramienta de linea de comandos * loopback-cli : `lb4` ## Contenido [TOC] ## Prerrequisito 1. Nodej.js, versión 14 o superior Intalacion del CLI del lookback --- ```shell npm i -g @loopback/cli@2.21.1 ``` > ## Módulos ![](https://hackmd.io/_uploads/r10vh_Jvn.png) Creación de la aplicación --- Para la creación del proyect nos apoyamos en el CLI del loopback El comando utilizado es el siguiente: ```shell lb4 app --applicationName=ejemplo --docker --private ``` > --applicationName : utilizado para configurar de la clase principal de la aplicación > --docker : utilizado para la generacion del archivo Dockerfile > --private : utlizado para marcar el proyecto como privado ![](https://hackmd.io/_uploads/ry0KLYyP2.png) En este imagen se puede visualizar la salida del comando lb4 y nos permite habilitar reglas a utilizar en el proyecto. En este punto seleccionamos la primera opción `(*) Habilitar eslint` y luego oprimimos la tecla **enter** habilitando todas las reglas para el proyecto. El proyecto tendrá la siguiente estructura ```shell public/ index.html src/ __tests__/ README.md acceptance/ home-page.acceptance.ts ping.controller.acceptance.ts test-helper.ts controllers/ index.ts README.md ping.controller.ts datasources/ README.md models/ README.md repositories/ README.md application.ts index.ts migrate.ts sequence.ts node_modules/ *** LICENSE Dockerfile README.md package.json tsconfig.json .eslintrc.js .prettierrc .mocharc.json ``` Flujo de interacción entre capas --- ```sequence Controller->Service: obtención de listado Note right of Service: identificacion de recurso Service-->Datasource: solicitud de recurso Datasource->Service: retorna listado de recurso solicitado Note left of REST Service: datasource-juggler Datasource->REST Service: HttpRequest ``` ## Creación de Modelo Un modelo describe objetos del dominio empresarial y define una lista de propiedades con nombre, tipo y otras restricciones. Para la representación de los modelos se puede utilizar clases especificas o interfaces. Para la creación del model es necesario estar dentro del directorio raiz del proyecto. El comando utilizado para la generación del modelo es: ```shell= lb4 model <nombre> ``` El comando te permite agregar propiedades, tipo y reglas por cada propiedad definida. ![](https://hackmd.io/_uploads/B1b5jc1Dn.png) Tipos de modelos: * Entity * Un objeto de dominio que tiene una identidad (ID). Su igualdad se basa en la identidad. Por ejemplo, Cliente puede ser modelado como una Entity porque cada cliente tiene un único id de cliente. Dos instancias de Cliente con el mismo id de cliente son iguales ya que se refieren al mismo cliente. Por ejemplo, así es como se puede modelar un Cliente ```javascript= import {Entity, model, property} from '@loopback/repository'; @model() export class Customer extends Entity { @property({id: true}) id: string; @property() name: string; @property() email: string; constructor(data?: Partial<Appointment>) { super(data); } } ``` * Model * Objeto de dominio que no tiene identidad (ID). Su igualdad se basa en el valor estructural. Por ejemplo, Address puede modelarse como un Modelo porque dos direcciones. son iguales si tienen los mismos valores de número de calle, nombre de calle, ciudad y código postal. Por ejemplo, así es como se puede modelar una Dirección: ```javascript= import {Model, model, property} from '@loopback/repository'; @model() export class Address extends Model { @property() streetNum: number; @property() streetName: string; @property() city: string; @property() zipCode: string; constructor(data?: Partial<Address>) { super(data); } ``` > Alternativamente se puede optar por la creación de una interfaz para el intercambio de datos o transformacion de los datos para envió del desde el bff al cliente, ejemplo: ```javascript= export interface MensajeDetail { codigo: number; mensaje: string; } ``` > *Observaciones: para la validación de estructura de datos es conveniente utilizar un modelo con clases y no una interfaz. Así el framework realizar el proceso de validación por nosotros*