{"id":20602485,"url":"https://github.com/carrilloapps/support-graphql","last_synced_at":"2026-04-10T12:05:25.902Z","repository":{"id":148297898,"uuid":"310851749","full_name":"carrilloapps/support-graphql","owner":"carrilloapps","description":"Esta es una API GraphQL para soporte de tickets y clientes de componentes electrónicos","archived":false,"fork":false,"pushed_at":"2023-03-28T23:05:32.000Z","size":56,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-06T16:37:07.276Z","etag":null,"topics":["docker-compose","golang","graphql","mongodb"],"latest_commit_sha":null,"homepage":"","language":"Go","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/carrilloapps.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":"2020-11-07T13:32:07.000Z","updated_at":"2023-10-12T18:47:12.000Z","dependencies_parsed_at":"2023-05-19T16:30:40.728Z","dependency_job_id":null,"html_url":"https://github.com/carrilloapps/support-graphql","commit_stats":null,"previous_names":["carrilloapps/support-graphql"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/carrilloapps/support-graphql","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/carrilloapps%2Fsupport-graphql","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/carrilloapps%2Fsupport-graphql/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/carrilloapps%2Fsupport-graphql/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/carrilloapps%2Fsupport-graphql/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/carrilloapps","download_url":"https://codeload.github.com/carrilloapps/support-graphql/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/carrilloapps%2Fsupport-graphql/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31641493,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-10T07:40:12.752Z","status":"ssl_error","status_checked_at":"2026-04-10T07:40:11.664Z","response_time":98,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["docker-compose","golang","graphql","mongodb"],"created_at":"2024-11-16T09:13:58.569Z","updated_at":"2026-04-10T12:05:25.886Z","avatar_url":"https://github.com/carrilloapps.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SupportGraphQL v1\n\n[![Go](https://github.com/JuniorCarrillo/support-graphql/workflows/Go/badge.svg)](https://github.com/JuniorCarrillo/support-graphql/actions?query=workflow:\"Go\")\n[![GitHub tag](https://img.shields.io/github/tag/JuniorCarrillo/support-graphql?include_prereleases=\u0026sort=semver\u0026color=blue)](https://github.com/JuniorCarrillo/support-graphql/releases/)\n[![Sourcegraph](https://sourcegraph.com/github.com/JuniorCarrillo/support-graphql/-/badge.svg?style=flat-square)](https://sourcegraph.com/github.com/JuniorCarrillo/support-graphql?badge)\n[![Go Report Card](https://goreportcard.com/badge/github.com/JuniorCarrillo/support-graphql?style=flat-square)](https://goreportcard.com/report/github.com/JuniorCarrillo/support-graphql)\n[![License](http://img.shields.io/badge/license-mit-blue.svg?style=flat-square)](https://raw.githubusercontent.com/JuniorCarrillo/support-graphql/master/LICENSE)\n[![JuniorCarrillo - support-graphql](https://img.shields.io/static/v1?label=JuniorCarrillo\u0026message=support-graphql\u0026color=blue\u0026logo=github)](https://github.com/JuniorCarrillo/support-graphql \"Go to GitHub repo\")\n[![stars - support-graphql](https://img.shields.io/github/stars/JuniorCarrillo/support-graphql?style=social)](https://github.com/JuniorCarrillo/support-graphql)\n[![forks - support-graphql](https://img.shields.io/github/forks/JuniorCarrillo/support-graphql?style=social)](https://github.com/JuniorCarrillo/support-graphql)\n[![OS - macOS](https://img.shields.io/badge/OS-macOS-blue?logo=apple\u0026logoColor=white)](https://www.apple.com/macos/ \"Go to Apple homepage\")\n[![OS - Linux](https://img.shields.io/badge/OS-Linux-blue?logo=linux\u0026logoColor=white)](https://www.linux.org/ \"Go to Linux homepage\")\n[![Made with Docker](https://img.shields.io/badge/Made_with-Docker-blue?logo=docker\u0026logoColor=white)](https://www.docker.com/ \"Go to Docker homepage\")\n[![Made with Go](https://img.shields.io/badge/Go-1-blue?logo=go\u0026logoColor=white)](https://golang.org \"Go to Go homepage\")\n[![Made with MongoDB](https://img.shields.io/badge/MongoDB-3-blue?logo=mongodb\u0026logoColor=white)](https://www.mongodb.com/ \"Go to MongoDB homepage\")\n\nEsta es una API GraphQL para el uso como Back End, el cual se encuentra desarrollado en Go y MongoDB Atlas en plataformas que requieran soporte de tickets, clientes y componentes electrónicos. Recomendado para tiendas de electrónicos que requieren soporte a clientes con implementación de CORS ajustable.\n\nEstá plataforma corre sobre el puerto `:8080` el cual es modificable añadiendo la variable del entorno `port` al OS que lo ejecute o modificando el archivo `server.go` en la raíz del sistema, así como la modificación de uso en modo CORS actualmente predefinido.\n\n### Estructura del sistema\n\nAquí se muestra la organización y componentes de estructurales, arquitectura y organización especifica del repositorio.\n\n#### Archivos del repositorio\n\nDentro de este repositorio se encuentran un total de 10 archivos y 4 directorios. Los cuales se muestran en el siguiente mapa estructural:\n\n```\n.\n|-- README.md\n|-- database\n|   |-- message.go\n|   |-- ticket.go\n|   |-- tv.go\n|   `-- user.go\n|-- go.mod\n|-- graph\n|   |-- generated\n|   |   `-- generated.go\n|   |-- model\n|   |   `-- models_gen.go\n|   |-- resolver.go\n|   |-- schema.graphqls\n|   `-- schema.resolvers.go\n`-- server.go\n```\n\n#### Librerías del sistema\n\nEstá plataforma fué desarrollada en `go 1.15` con una configuración `modules`, haciendo uso de los siguientes componentes o librerías:\n\n```\nrequire (\n\tgithub.com/99designs/gqlgen v0.13.0\n\tgithub.com/go-chi/chi v4.1.2+incompatible\n\tgithub.com/pkg/errors v0.9.1 // indirect\n\tgithub.com/rs/cors v1.7.0\n\tgithub.com/vektah/gqlparser v1.3.1 // indirect\n\tgithub.com/vektah/gqlparser/v2 v2.1.0\n\tgo.mongodb.org/mongo-driver v1.4.3\n\tgolang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897\n)\n```\n\n#### Schema de la API GraphQL\n\nDentro de la información se implementa el siguiente esquema de peticiones y mutaciones:\n\n```\n# Output\ntype Login {\n  _id:    ID!\n  status: Boolean!\n  message: String!\n  user:   User!\n}\n\ntype User {\n  _id: ID!\n  name: String!\n  address: String!\n  phone: String!\n  email: String!\n  role: String!\n}\n\ntype UserAuth {\n  _id: ID!\n  name: String!\n  address: String!\n  phone: String!\n  email: String!\n  role: String!\n  password: String!\n}\n\ntype Tv {\n  _id: ID!\n  type: String!\n  model: String!\n  brand: String!\n  serial: String!\n  owner: String!\n  user: User!\n}\n\ntype Tvs {\n  _id: ID!\n  type: String!\n  model: String!\n  brand: String!\n  serial: String!\n  owner: String!\n}\n\ntype Ticket {\n  _id: ID!\n  title: String!\n  status: String!\n  equipment: String!\n  technical: String!\n  timestamp: String!\n  description: String!\n  tv: Tv!\n}\n\ntype Tickets {\n  _id: ID!\n  title: String!\n  owner: String!\n  status: String!\n  technical: String!\n  equipment: String!\n  timestamp: String!\n  description: String!\n}\n\ntype Message {\n  _id: ID!\n  author: String!\n  ticket: String!\n  content: String!\n  timestamp: String!\n}\n\n# Input\ninput NewUser {\n  name: String!\n  address: String!\n  phone: String!\n  password: String!\n  email: String!\n  role: String!\n}\n\ninput NewTv {\n  type: String!\n  model: String!\n  brand: String!\n  serial: String!\n  owner: String!\n}\n\ninput NewTicket {\n  title: String!\n  owner: String!\n  status: String!\n  technical: String!\n  equipment: String!\n  description: String!\n  timestamp: String!\n}\n\ninput AddTicket {\n  title: String!\n  owner: String!\n  equipment: String!\n  description: String!\n}\n\ninput NewMessage {\n  author: String!\n  ticket: String!\n  content: String!\n  timestamp: String!\n}\n\ninput AddMessage {\n  author: String!\n  ticket: String!\n  content: String!\n}\n\n# Querys\ntype Query {\n  login(email: String!, password: String!): Login!\n  user(_id: String!): User!\n  users: [User!]!\n  usersBy(att: String!, val: String!): [User!]!\n  tv(_id: String!): Tv!\n  tvs: [Tvs!]!\n  tvsBy(att: String!, val: String!): [Tv!]!\n  ticket(_id: String!): Ticket!\n  tickets: [Tickets!]!\n  ticketsBy(att: String!, val: String!): [Tickets!]!\n  message(_id: String!): Message!\n  messages: [Message!]!\n  messagesBy(att: String!, val: String!): [Message!]!\n}\n\n# Mutations\ntype Mutation {\n  createUser(input: NewUser!): User!\n  createTv(input: NewTv!): Tv!\n  createTicket(input: AddTicket!): Ticket!\n  createMessage(input: AddMessage!): Message!\n  updateTicket(_id: String!, att: String!, val: String!): Ticket!\n}\n```\n\n## Interacciones disponibles\n\nLas interacciones realizadas en el sistema se pueden realizar por medio de Postman o desde la interface home de la API, en este caso todas las interacciones se realizan directamente desde el home de la API, con la intención de que sea más flexible y requiera menos herramientas su funcionamiento. El funcionamiento de este sistema posee las siguientes interacciones disponibles:\n\n### Mutations o mutaciones\n\nPara la carga o guardado y, actualización de información dentro del sistema en la plataforma:\n\n##### Carga o guardado de información\n\nEn estas mutaciones se encuentran las interacciones que ejecutan la creación de los elementos en la plataforma.\n\n---\n**NOTA**\nDentro de la creación del usuario la contraseña se encripta y se guarda de esa manera en la base de datos, luego de eso para realizar la autenticación se debe compara mediante un sistema de autenticación simple de usuario y correo electrónico.\n\n---\n```\nmutation AddUser {\n  createUser(\n    input: {\n      name: \"Junior Carrillo\"\n      address: \"Medellin\"\n      phone: \"3003328389\"\n      password: \"123456\"\n      email: \"soyjrcarrillo@gmail.com\"\n      role: \"user\"\n    }\n  ) {\n    _id\n    name\n  }\n}\n\nmutation AddTV {\n  createTv(\n    input: {\n      type: \"LCD\"\n      model: \"DEMO-1\"\n      brand: \"LG\"\n      serial: \"000-000-000-000\"\n      owner: \"5fa583653f3a3896431173cc\"\n    }\n  ) {\n    _id\n    serial\n    owner\n    user {\n      name\n      email\n    }\n  }\n}\n\nmutation AddTicket {\n  createTicket(\n    input: {\n      title: \"El tv se apaga luego de unos minutos\"\n      owner: \"5fa583653f3a3896431173cc\"\n      equipment: \"5fa5bf6c0b9407de5ba89f1c\"\n      description: \"Hola, me gustaría notificar una falla en mi equipo, tengo un problma que al encender tras unos minutos se apaga solo\"\n    }\n  ) {\n    _id\n    equipment\n    technical\n    timestamp\n    description\n    status\n    title\n    tv {\n      _id\n      model\n      serial\n    }\n  }\n}\n\nmutation AddMessage {\n  createMessage(\n    input: {\n      author: \"5fa583653f3a3896431173cc\"\n      ticket: \"5fa64d6042c421ac24bc1381\"\n      content: \"Hola, esto es una prueba\"\n    }\n  ) {\n    _id\n    author\n    ticket\n    content\n    timestamp\n  }\n}\n```\n##### Actualizar\n\nDentro del sistema solo se puede actualizar la información de los tickets, para lo cual se requiere enviar:\n\n- `_id`: Identificador del ticket, este se utiliza como identificación y puede ser usado para extraer toda la información relacionada con este ticket.\n- `att`: Atributo del campo que se requiere cambiar.\n- `val`: Valor del atributo que se desea cambiar o actualizar.\n\n```\nmutation Update {\n  updateTicket(\n    _id: \"5fa686d9e828d2235f06c6f6\"\n    att: \"status\"\n    val: \"Pendiente\"\n  ) {\n    _id\n    title\n  }\n}\n```\n\n### Querys o peticiones\n\nEn este punto se muestran las peticiones que se pueden realizar al sistema:\n\n##### Peticiones únicas\n\nLas peticiones únicas son las que se ejecutan directamente y solo esperan un resultado especifico, por ejemplo: solicitud de un usuario, ticket, televisor o mensaje.\n\n```\nquery User {\n  user(_id: \"5fa57bb09e60d49b64cc60fe\") {\n    _id\n    name\n    email\n    address\n    role\n  }\n}\n\nquery Tv {\n  tv(_id: \"5fa5bf6c0b9407de5ba89f1c\") {\n    _id\n    serial\n    brand\n    owner\n    user {\n      name\n    }\n  }\n}\n\nquery Ticket {\n  ticket(_id: \"5fa64d6042c421ac24bc1381\") {\n    _id\n    equipment\n    technical\n    timestamp\n    description\n    title\n    tv {\n      _id\n      model\n      serial\n    }\n  }\n}\n\nquery Message {\n  message(_id: \"5fa66b387c1f99c6895a0b69\") {\n    _id\n    author\n    ticket\n    content\n    timestamp\n  }\n}\n```\n\n##### Peticiones multiples\n\nEstas son peticiones que al ser ejecutadas, reciben dos o más elementos.\n\n```\nquery AllUsers {\n  users {\n    _id\n    name\n    email\n    address\n    role\n  }\n}\n\nquery UsersBy {\n  usersBy(att: \"role\", val: \"user\") {\n    _id\n    name\n    email\n    address\n    role\n  }\n}\n\nquery AllTvs {\n  tvs {\n    _id\n    type\n    model\n    brand\n    serial\n    owner\n  }\n}\n\nquery TvsBy {\n  tvsBy(att: \"type\", val: \"LCD\") {\n    _id\n    serial\n    brand\n  }\n}\n\nquery AllTickets {\n  tickets {\n    _id\n    title\n    description\n    equipment\n    technical\n    timestamp\n  }\n}\n\nquery TicketsBy {\n  ticketsBy(att: \"technical\", val: \"5fa62e9c07ec161f0fa3d39e\") {\n    _id\n    title\n    description\n    timestamp\n  }\n}\n\n\nquery AllMessages {\n  messages {\n    _id\n    author\n    ticket\n    content\n    timestamp\n  }\n}\n\nquery MessagesBy {\n  messagesBy(att: \"ticket\", val: \"5fa64d6042c421ac24bc1381\") {\n    _id\n    author\n    ticket\n    content\n    timestamp\n  }\n}\n```\n\n### Autenticación de usuarios\n\nPara el proceso de autenticación se debe realizar un query solicitando la información, para ello se envía `email` y `password`, en lo que se espera recibir un estatus de si el logueo es efectivo, la identificación del usuario, y su información general para el uso de restricciones en el Front End para diferentes roles. La estructura enviada debe ser similar a está:\n\n```\nquery Auth {\n  login(email: \"soyjrcarrillo@gmail.com\", password: \"12345\") {\n    _id\n    status\n    user {\n      email\n      address\n      role\n    }\n  }\n}\n```\n\n**RESPUESTA EN CASO DE ERROR**\nCuando la contraseña o el correo no son válidos, o no esta registrado en el sistema\n\n```\n{\n  \"data\": {\n    \"login\": {\n      \"_id\": \"N/A\",\n      \"status\": false,\n      \"message\": \"La contraseña o el correo electrónico no se encuentran asociados a ningún usuario o están errados\",\n      \"user\": {\n        \"email\": \"N/A\",\n        \"address\": \"N/A\",\n        \"role\": \"N/A\"\n      }\n    }\n  }\n}\n```\n\n**RESPUESTA EN CASO DE ÉXITO**\nCuando el usuario y la contraseña coinciden y están registrados en el sistema.\n\n```\n{\n  \"data\": {\n    \"login\": {\n      \"_id\": \"5fa583653f3a3896431173cc\",\n      \"status\": true,\n      \"message\": \"Bienvenido Junior Carrillo\",\n      \"user\": {\n        \"email\": \"soyjrcarrillo@gmail.com\",\n        \"address\": \"Medellin\",\n        \"role\": \"user\"\n      }\n    }\n  }\n}\n```\n\n## Organización de la base de datos\n\nEn este proyecto se utiliza MongoDB Atlas como ejemplo practico, de la manera en la que es implementado solo funciona de forma educativa, si requiere un despliegue en producción es necesario optimizar la seguridad guardando la `MONGODB_URI` como una variable de entorno en el sistema.\n\n#### Arquitectura de datos\n\n```\n|-- messages (Colección)\n|   |-- _id: Identificación de item\n|   |-- author: _id del autor del mensaje (String)\n|   |-- ticket: _id del ticket padre del mensaje (String)\n|   |-- content: contenido del mensaje (String)\n|   |-- timestamp: Timestamp en formato Unix (String)\n|-- tickets (Colección)\n|   |-- _id: Identificación de item\n|   |-- title: Título del ticket (String)\n|   |-- owner: _id del dueño del ticket (String)\n|   |-- status: nombre del estatus del ticket (String)\n|   |-- technical: _id del usuario tecnico encargado (String)\n|   |-- equipment: _id del televisor (String)\n|   |-- description: Descripción del ticket (String)\n|   |-- timestamp: Timestamp en formato Unix (String)\n|-- tvs (Colección)\n|   |-- _id: Identificación de item\n|   |-- type: Tipo de televisor cargado (String)\n|   |-- model: Modelo del televisor (String)\n|   |-- brand: Marca del televisor (String)\n|   |-- serial: Serial del televisor (String)\n|   |-- owner: _id del usuario dueño del televisor (String)\n|-- users (Colección)\n|   |-- _id: Identificación de item\n|   |-- name: Nombre del usuario (String)\n|   |-- address: Dirección del usuario (String)\n|   |-- phone: Nro. de teléfono del usuario (String)\n|   |-- password: Contraseña del usuario (String [Bajo codificación de autenticación en Go])\n|   |-- email: Correo electrónico del usuario (String)\n|   |-- role: Rol del usuario (String)\n```\n\n### Más información\n\nEsté proyecto fue enteramente desarrollado por Junior Carrillo bajo licencia MIT, es un aporte a la comunidad de Golang Venezuela. Puedes solicitar más información desde:\n\n- +57 300 3328389\n- soyjrcarrillo@gmail.com\n- [Telegram](https://t.me/imjrcarrillo)\n- [Facebook](https://fb.com/soyjrcarrillo)\n- [Twitter](https://twitter.com/soyjrcarrillo)\n- [Instagram](https://instagram.com/soyjrcarrillo)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcarrilloapps%2Fsupport-graphql","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcarrilloapps%2Fsupport-graphql","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcarrilloapps%2Fsupport-graphql/lists"}