{"id":26822651,"url":"https://github.com/ch1py7/linktic","last_synced_at":"2025-03-30T08:20:08.368Z","repository":{"id":265600687,"uuid":"860693209","full_name":"Ch1py7/linktic","owner":"Ch1py7","description":null,"archived":false,"fork":false,"pushed_at":"2024-09-22T19:35:07.000Z","size":91,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-29T13:05:07.182Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://linktic-three.vercel.app/","language":"Svelte","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Ch1py7.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-09-21T00:14:09.000Z","updated_at":"2024-09-22T19:35:10.000Z","dependencies_parsed_at":"2024-11-30T04:26:41.216Z","dependency_job_id":"e31d8711-f304-4f43-8181-44949e7fcf09","html_url":"https://github.com/Ch1py7/linktic","commit_stats":null,"previous_names":["ch1py7/linktic"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ch1py7%2Flinktic","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ch1py7%2Flinktic/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ch1py7%2Flinktic/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ch1py7%2Flinktic/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Ch1py7","download_url":"https://codeload.github.com/Ch1py7/linktic/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246291560,"owners_count":20753896,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-03-30T08:20:06.721Z","updated_at":"2025-03-30T08:20:08.361Z","avatar_url":"https://github.com/Ch1py7.png","language":"Svelte","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Prueba Linktic\n\n## Descripción\nEste proyecto es una prueba técnica para Linktic y consiste en una aplicación web de e-commerce. Los administradores podrán visualizar, crear, editar y eliminar productos y usuarios, así como gestionar los envíos de las órdenes. Los usuarios comunes podrán registrarse sin intervención de un administrador, agregar productos al carrito y realizar compras.\n\n## Tecnologías\n- Frontend: Sveltekit, TailwindCSS\n- Backend: Node.js, Express.js\n- Base de datos: PostgreSQL (gestionado con Supabase)\n\n## Instalación\nPara este proyecto se utilizó el monorepo de pnpm. Por lo que para realizar una instalación simple, se debe tener instalado pnpm. Luego, se debe ejecutar el siguiente comando en la raíz del proyecto:\n```bash\npnpm install\n```\n\nEn caso de no tener pnpm instalado, entrar con la consola a la carpeta `apps/frontend` y `apps/backend` de forma individual y ejecutar el comando de instalación de tu gestor de paquetes preferido.\n\n## Ejecución\nPara ejecutar el proyecto de forma local, se debe ejecutar el siguiente comando en la raíz de los proyectos:\n```bash\ncd apps/backend\npnpm tscs\n```\n```bash\ncd apps/frontend\npnpm dev\n```\n\n## Demo\nPara visualizar una demo del proyecto, se puede acceder al siguiente enlace: [Demo](https://linktic-three.vercel.app/)\n\nSe han creado dos usuarios de prueba para facilitar la visualización de la aplicación:\n- Usuario administrador:\n  - Correo: admin@admin.com\n  - Contraseña: admin\n  - Role: admin\n- Usuario común:\n  - Correo: user@test.com\n  - Contraseña: user\n  - Role: user\n  \n## Documentación\nPara visualizar la documentación de la API, se ha creado la documentación de Postman en la carpeta `apps/backend/src/docs/postman.json`. Tambien se han añadido las queries de creación de la base de datos en la carpeta `apps/backend/src/docs/queries.sql`.\n\n## Notas\nEn este apartado detallare algunas notas adicionales sobre el proyecto, aclaraciones sobre decisiones tomadas y posibles mejoras.\n\n### Backend\n- En la documentacion de la prueba se pidio un CRUD para productos y tambien para listarlos. Para que sea mas simple y orientativo se decidio utilizar los metodos `PUT` para actualizar, `POST` al insertar, `DELETE` al eliminar y `GET` al recuperar datos. Cada uno de estos métodos está orientado a cumplir con las buenas prácticas de REST, facilitando una gestión eficiente y clara de los productos dentro del sistema. Además, se implementan medidas de validación para garantizar la integridad de los datos enviados y recibidos, así como una gestión adecuada de los errores para brindar retroalimentación útil a los usuarios y desarrolladores.\n\n- Para las solicitudes de eliminación, también se decidió utilizar la misma solicitud `PUT`, con un campo adicional llamado `enabled` en la entidad de productos. Esto se realizó de esta forma debido a que en muchas normativas, los datos no deben ser eliminados y se deben almacenar durante un tiempo determinado. Por lo que, en lugar de eliminar el producto, se deshabilita y se mantiene en la base de datos.\n\n- En las peticiones `DELETE`, se elimina completamente la información de la base de datos. Aunque esta práctica no es la más recomendada en un entorno de producción, donde generalmente es preferible marcar los registros como \"deshabilitados\" o \"eliminados\" mediante un campo (como un campo is_deleted o active), en este caso, se optó por la eliminación total debido a que es un entorno de pruebas y no se requiere conservar estos datos a largo plazo (La unica tabla con el campo is_delete en este entorno es productos).\n\n- Se reconoce que podrían haberse implementado validaciones más robustas, así como un mejor manejo de los tokens JWT para la autenticación y autorización de los usuarios y otras mejoras relacionadas con la seguridad. Si bien el proyecto priorizó una solución funcional por motivos de tiempo, se mantuvo el enfoque en la seguridad y la integridad de los datos mediante el uso de herramientas como express-validator para validar los tipos de datos y garantizar que las entradas fueran seguras.\n\n- Otra mejora que a implementar son los mensajes de error, aunque se intentaron cubrir todos los casos, algunos son muy básicos y no ofrecen suficiente información al frontend. Con más tiempo, se podrían hacer más descriptivos y agregar códigos de error personalizados para facilitar la identificación de problemas y su manejo por parte del cliente.\n\n### Frontend\n- Se ha intentado seguir una buena practica a nivel de manejo de estados en la aplicación. Pero debido al tiempo, no se ha podido ahondar en las mejores practicas de Sveltekit. Por lo que, se podrian realizar mejoras en la implementación de estados globales y locales.\n\n## Autenticacion\n- En la documentación de la prueba, se solicitaba la implementación de un sistema de autenticación. Se creó un panel simple para permitir el registro y acceso de usuarios, ya sea como administradores o usuarios comunes, utilizando un campo de roles dentro de la tabla de usuarios.\nSin embargo, esta implementación fue realizada de forma general y aún se pueden mejorar aspectos clave, como la validación de roles en el backend. Actualmente, no se restringe adecuadamente el acceso a ciertos endpoints según el rol del usuario, lo cual debería corregirse para garantizar que solo los administradores puedan acceder a endpoints específicos. Esto permitiría un control de acceso más seguro y acorde a las mejores prácticas.\n\n\n### Despliegue\n- Para el despliegue de la aplicación se ha utilizado Vercel para el frontend y Render para el backend. Se ha utilizado Vercel para el frontend debido a que es una plataforma que facilita el despliegue de aplicaciones Sveltekit. Por otro lado, se ha utilizado Render debido a que actualmente es una de las pocas plataformas que permite el despliegue de aplicaciones Node.js de forma gratuita y sencilla.\n\n\n## Autor\n- [Gerardo Garcia](https://github.com/Ch1py7)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fch1py7%2Flinktic","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fch1py7%2Flinktic","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fch1py7%2Flinktic/lists"}