{"id":18729502,"url":"https://github.com/dynonguyen/print-solution","last_synced_at":"2025-04-12T16:53:16.638Z","repository":{"id":174859582,"uuid":"612868879","full_name":"dynonguyen/print-solution","owner":"dynonguyen","description":"Print Solution - Hệ thống đặt in ấn online","archived":false,"fork":false,"pushed_at":"2023-06-15T06:39:38.000Z","size":8612,"stargazers_count":4,"open_issues_count":0,"forks_count":5,"subscribers_count":1,"default_branch":"develop","last_synced_at":"2025-03-26T11:21:17.019Z","etag":null,"topics":["docker","expressjs","graphql","microservices","mongodb","postgresql","reactjs","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dynonguyen.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2023-03-12T08:11:50.000Z","updated_at":"2025-03-16T14:04:39.000Z","dependencies_parsed_at":"2023-07-22T04:15:17.451Z","dependency_job_id":null,"html_url":"https://github.com/dynonguyen/print-solution","commit_stats":null,"previous_names":["tuannguyen2504/print-solution","dynonguyen/print-solution"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dynonguyen%2Fprint-solution","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dynonguyen%2Fprint-solution/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dynonguyen%2Fprint-solution/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dynonguyen%2Fprint-solution/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dynonguyen","download_url":"https://codeload.github.com/dynonguyen/print-solution/tar.gz/refs/heads/develop","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248601345,"owners_count":21131608,"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":["docker","expressjs","graphql","microservices","mongodb","postgresql","reactjs","typescript"],"created_at":"2024-11-07T14:27:23.754Z","updated_at":"2025-04-12T16:53:16.616Z","avatar_url":"https://github.com/dynonguyen.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv  align=\"center\"\u003e\n  \u003cimg src=\"https://res.cloudinary.com/dynonary/image/upload/v1678890436/print-solution/logo.png\" width=\"60px\" alt=\"Logo\" /\u003e\n\u003c/div\u003e\n\n\u003cbr /\u003e\n\u003ch1 align=\"center\"\u003ePrint Solution System\u003c/h1\u003e\n\n\u003e Print Solution System - Hệ thống quản lý đặt in ấn online hiệu quả, tiết kiệm.\n\n## ℹ️ Thông tin nhóm\n\n- 1612564 - Nguyễn Công Sơn\n- 1712149 - Trần Minh Tân\n- 18120410 - Phạm Quốc Khánh\n- 18120475 - Trần Đức Năng\n- 18120488 - Trần Phúc Nguyên\n- 18120622 - Lê Văn Trung (Nhóm trưởng)\n- 18120634 - Nguyễn Lê Anh Tuấn\n- 18120644 - Nguyễn Cát Tường\n\n## 📑 [Documentation](./docs/README.md)\n\n## 🔥 Prerequisites\n\n- `Nodejs \u003e= 16.8.0`\n- `npm \u003e= 8.0` or `yarn \u003e= 1.0`\n- `Docker`, `docker compose v2`, `Linux or WSL` (Nếu dùng Docker để chạy)\n\n## 🚀 Run via Docker\n\n```sh\n  # Copy .env\n  cd scripts\n  sh ./copy-env.sh\n  # Nếu lệnh trên chạy lỗi thì chạy lệnh dưới\n  chmod +x ./copy-env.sh\n  ./copy-env.sh\n```\n\n```sh\n\n  # Chạy môi trường dev\n  docker compose -p print-solution-dev -f ./docker-compose.dev.yml build --no-cache\n  docker compose -p print-solution-dev -f ./docker-compose.dev.yml up -d\n\n  # Generate graphql.tsx sau khi khởi tạo frontend\n  cd frontend\n  yarn graphql-codegen\n\n  # Shorthand\n  docker compose -p print-solution-dev down \u0026\u0026 cd scripts \u0026\u0026 sh ./copy-env.sh \u0026\u0026 cd .. \u0026\u0026 docker compose -p print-solution-dev -f ./docker-compose.dev.yml build --no-cache \u0026\u0026 docker compose -p print-solution-dev -f ./docker-compose.dev.yml up -d \u0026\u0026 cd frontend \u0026\u0026 yarn graphql-codegen \u0026\u0026 cd ..\n\n  # Chạy môi trường production\n  docker compose -p print-solution-prod build --no-cache\n  docker compose -p print-solution-prod up -d\n```\n\n\u003e Một vài lệnh hữu ích trong docker\n\n```sh\n  # Xem log\n  docker logs [service-name] --follow\n  # Delete all containers\n  docker compose -p print-solution-[dev|prod] down\n  # Stop all containers\n  docker compose -p print-solution-[dev|prod] stop\n  # Export all keycloak realms\n  docker exec -u root -it keycloak-dev bash -c \"/opt/keycloak/bin/kc.sh export --file /opt/keycloak/data/import/realms.json --users same_file\"\n  # Export a mongodb collection\n  docker exec -it mongodb-dev mongoexport --db \u003cdatabase_name\u003e --collection \u003ccollection_name\u003e --out /mongo-export/\u003cfilename.json\u003e\n```\n\n## 📃 Auto run via Shell Script\n\n\u003e 🐧 Bắt buộc dùng qua terminal của **`Linux, Unix, WSL`**\n\n```sh\n  cd scripts\n  # Chạy lệnh bên dưới nếu chưa install (re-install) package\n  chmod +x ./auto-run.sh\n  ./auto-run.sh\n\n  # Hoặc nếu đã install\n  chmod +x ./pm2-start.sh\n  ./pm2-start.sh\n```\n\n- Sau khi đã start các server, sử dụng **[`pm2`](https://pm2.keymetrics.io/docs/usage/quick-start/)** để quản lý trạng thái.\n\n```sh\n  pm2 list # Hiển thị danh sách các services\n  pm2 kill # Xóa tất cả services\n  pm2 stop all # Dừng tất cả service đang chạy\n  pm2 reset all # Reset tất cả\n  pm2 restart all # Restart all service sau khi stop\n  pm2 logs # Xem log tất cả services\n  pm2 [option] [service-name] # Áp dụng cho từng service\n```\n\n## ⚙️ Manually Run\n\n### 💫 Frontend\n\n**Run**\n\n```sh\n  cd frontend\n  cp .env.example .env # Thay đỗi value cần thiết (nếu có)\n  yarn install\n  yarn dev\n```\n\n[Open http://localhost:8080](http://localhost:8000)\n\n**Dependencies**\n\n```js\n    // React core\n    \"react\": \"^18.2.0\",\n    \"react-dom\": \"^18.2.0\",\n\n    // Kết nối graphQL, Apollo server\n    \"@apollo/client\": \"^3.7.10\",\n    \"graphql\": \"^16.6.0\",\n    \"@graphql-codegen/cli\": \"^3.2.2\",\n\n    // Kết nối REST API\n    \"axios\": \"^1.3.4\",\n\n    // UI Library components\n    \"@mui/material\": \"^5.11.13\",\n    \"@emotion/react\": \"^11.10.6\",\n    \"@emotion/styled\": \"^11.10.6\",\n    \"@cads-ui/core\": \"^1.12.11\",\n\n    // Icon packs\n    \"@iconify/react\": \"^4.1.0\",\n    \"@mui/icons-material\": \"^5.11.11\",\n\n    // State management redux, RTK query for caching REST API\n    \"@reduxjs/toolkit\": \"^1.9.3\",\n    \"react-redux\": \"^8.0.5\",\n    \"recoil\": \"^0.7.7\",\n\n    // Form management \u0026 validation\n    \"@hookform/resolvers\": \"^3.0.1\",\n    \"react-hook-form\": \"^7.43.9\",\n    \"react-hook-form\": \"^7.43.9\",\n\n    // Content editor\n    \"react-quill\": \"^2.0.0\",\n\n    // Format thời gian\n    \"moment\": \"^2.29.4\",\n\n    // SEO, tùy chỉnh head tag\n    \"react-helmet\": \"^6.1.0\",\n\n    // Async await wrapper for easy error handling\n    \"await-to-js\": \"^3.0.0\",\n\n    // Bundle tool\n    \"vite\": \"^4.1.0\"\n```\n\n### 🔐 Backend Services\n\n**Run**\n\n```sh\n  cd services/[service-name]\n  cp .env.example .env # Thay đỗi value cần thiết (nếu có)\n  yarn install\n  yarn dev\n```\n\n**Dependencies**\n\n```js\n  // Core framework for REST API\n  \"express\": \"^4.18.2\",\n  // Read cookie from client\n  \"cookie-parser\": \"^1.4.6\",\n  // Setup CORS\n  \"cors\": \"^2.8.5\",\n  // Read .env\n  \"dotenv\": \"^16.0.3\",\n  // Alias import path from ../../.. to ~/\n  \"module-alias\": \"^2.2.2\",\n  // Logger\n  \"morgan\": \"^1.10.0\",\n  // Apollo server for GraphQL server\n  \"@apollo/server\": \"^4.5.0\",\n  \"graphql\": \"^16.6.0\",\n  // Websocket for subscription graphql\n  \"ws\": \"^8.8.0\",\n  \"graphql-ws\": \"^5.9.0\",\n  // GraphQL with Typescript\n  \"type-graphql\": \"^2.0.0-beta.1\",\n  \"@graphql-tools/schema\": \"^9.0.17\",\n  \"class-validator\": \"^0.14.0\",\n  \"reflect-metadata\": \"^0.1.13\",\n  // Async await wrapper for easy error handling\n  \"await-to-js\": \"^3.0.0\",\n  // Format thời gian\n  \"moment\": \"^2.29.4\",\n  // Auto reload dev server\n  \"nodemon\": \"^2.0.21\",\n  \"ts-node-dev\": \"^2.0.0\",\n  \"tsc-alias\": \"^1.8.3\",\n  \"tsconfig-paths\": \"^4.1.2\"\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdynonguyen%2Fprint-solution","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdynonguyen%2Fprint-solution","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdynonguyen%2Fprint-solution/lists"}