{"id":28951185,"url":"https://github.com/arthurvbs/canadel","last_synced_at":"2026-05-05T04:07:40.165Z","repository":{"id":300109229,"uuid":"1003354357","full_name":"ArthurVBS/Canadel","owner":"ArthurVBS","description":"🪑 A Canadel product manager","archived":false,"fork":false,"pushed_at":"2025-06-19T23:17:44.000Z","size":523,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-06-19T23:26:17.622Z","etag":null,"topics":["crud","gradlew","h2","java","junit","spring","typescript","vitest","vue","web"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"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/ArthurVBS.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,"zenodo":null}},"created_at":"2025-06-17T02:56:59.000Z","updated_at":"2025-06-19T23:17:42.000Z","dependencies_parsed_at":"2025-06-19T23:36:37.363Z","dependency_job_id":null,"html_url":"https://github.com/ArthurVBS/Canadel","commit_stats":null,"previous_names":["arthurvbs/canadel"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ArthurVBS/Canadel","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ArthurVBS%2FCanadel","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ArthurVBS%2FCanadel/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ArthurVBS%2FCanadel/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ArthurVBS%2FCanadel/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ArthurVBS","download_url":"https://codeload.github.com/ArthurVBS/Canadel/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ArthurVBS%2FCanadel/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261491898,"owners_count":23166679,"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":["crud","gradlew","h2","java","junit","spring","typescript","vitest","vue","web"],"created_at":"2025-06-23T14:09:06.865Z","updated_at":"2026-05-05T04:07:40.103Z","avatar_url":"https://github.com/ArthurVBS.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003eCanadel\u003c/h1\u003e\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"https://img.shields.io/badge/GitHub-000?style=social\u0026logoColor=469BD2\u0026logo=github\"\u003e\u0026nbsp;\n\u003cimg src=\"https://img.shields.io/badge/Docker-000?style=social\u0026logoColor=469BD2\u0026logo=docker\"\u003e\u0026nbsp;\n\u003cimg src=\"https://img.shields.io/badge/TypeScript-000?style=social\u0026logoColor=469BD2\u0026logo=typescript\"\u003e\u0026nbsp;\n\u003cimg src=\"https://img.shields.io/badge/Vue-000?style=social\u0026logoColor=469BD2\u0026logo=vue.js\"\u003e\u0026nbsp;\n\u003cimg src=\"https://img.shields.io/badge/Java-000?style=social\u0026logoColor=469BD2\u0026logo=openjdk\"\u003e\n\u003cimg src=\"https://img.shields.io/badge/Spring-000?style=social\u0026logoColor=469BD2\u0026logo=spring\"\u003e\u0026nbsp;\n\u003cimg src=\"https://img.shields.io/badge/C%23-000?style=social\u0026logoColor=469BD2\u0026logo=c#\"\u003e\u0026nbsp;\n\u003cimg src=\"https://img.shields.io/badge/.NET-000?style=social\u0026logoColor=469BD2\u0026logo=dotnet\"\u003e\u0026nbsp;\n\u003c/div\u003e\n\n## ✨ About the project:\n\n- 🪑 The project is a **Product Manager for Canadel.inc**.\n- 🧪 The project has unit tests for backend and frontend and allow the developer see its coverage.\n- 🧹 The project has linters for backend and frontend to validate the quality of the code and format it.\n- 🐳 The project uses CI-CD to validate the Merge Requests with pipelines in the GitHub actions.\n- 🧑‍💻 The project was two approaches:\n  - Java 17 + Spring in the backend and Typescript + Vue 3 in the frontend.\n  - C# + .NET 8 in the backend and Typescript + Vue 3 in the frontend.\n\n## 💻 Project status:\n\n- Finished project ✔️\n\n## 🛠 Technologies:\n\n- Backend:\n  - Java Ecosystem\n    - **Java**\n    - **Spring**\n    - **Gradlew**\n    - Spotless\n    - Lombok\n    - H2 Database\n    - Jacoco Reporter\n  - C# Ecosystem\n    - **C#**\n    - **.NET**\n    - Xunit\n    - SQLite\n- Frontend:\n  - **TypeScript**\n  - **Vue**\n  - **Yarn** or NPM\n  - Node\n  - CSS\n  - Vuetify\n  - Vuex\n  - Vite\n  - Vitest\n- General:\n  - **Docker Compose**\n  - Makefile\n\n## 📝 Features:\n\n- The application is a CRUD product manager:\n  - Allow user create a product with name, description and its price.\n  - Allow user read all products data: ID, name, description, price and createdAt.\n  - Allow user read a specific product data based in its ID. (Backend endpoint only).\n  - Allow user update a product by its ID with name, description and its price.\n  - Allow user delete a product by its ID.\n- The application validates the CRUD in both connection parts (frontend and backend).\n  - Do not allow to create or to update with empty name, empty description or zero price.\n  - Do not allow to read by id, to update by id or to delete by id using an invalid ID.\n- The application is accessible for the most used screen sizes:\n  - Allow user access the application by web.\n  - Allow user access the application by mobile.\n- The application stores the data in a database.\n- The application holds the information in frontend using state.\n\n## ⚙️ Prerequisites:\n\n### 🏃‍♂️‍➡️ Run\n\n- General:\n  - Docker Compose\n  - Makefile\n\n### 🧑‍💻 Develop\n\n- Backend:\n  - Java Ecosystem\n    - Java 17\n    - Gradle 8\n  - C# Ecosystem\n    - C#\n    - .NET 8\n- Frontend:\n  - Node 20\n  - Yarn\n- General:\n  - Makefile\n  - Docker Compose\n\n## 🚀 How to run the application?\n\n### 🏃‍♂️‍➡️ Run\n\n- Download the ZIP or Clone the application on your machine;\n  - Open one CMD terminal in the root of the project folder,\n  - Run `make run-docker-compose-dotnet` or `make run-docker-compose-java`,\n  - Access the application through `http://localhost:5173`.\n\n### 💻 Develop\n\n- Clone the application on your machine;\n  - Open two CMD terminal in the root of the project folder,\n  - The first terminal access one of the backend folders: ,\n    - To use Java Ecosystem: `cd backend-java`\n      - Install gradle modules: `./gradlew`,\n      - Finally, start a localhost: `./gradlew bootRun`,\n      - The available endpoint: `http://localhost:12000`.\n    - To use C# Ecosystem: `cd backend-dotnet`\n      - Install modules: `dotnet build`,\n      - Finally, start a localhost: `dotnet run --project ./Canadel/Canadel.csproj`,\n      - The available endpoint: `http://localhost:12000`.\n  - The second terminal access the frontend folder: `cd frontend`,\n    - Install node modules: `yarn` or `npm install`,\n    - Finally, start a localhost: `yarn dev` or `npm run dev`,\n    - The available endpoint: `http://localhost:5173`.\n  - Access the application through `http://localhost:5173`.\n\n## 🧪 How to run the tests?\n\n### 🏃‍♂️‍➡️Just Run\n\n- Backend:\n  - Open the CMD terminal,\n  - Access the backend folder,\n    - To use Java Ecosystem: `cd backend-java`\n      - Install gradle modules: `./gradlew`,\n      - Finally run the tests: `./gradlew test`.\n    - To use C# Ecosystem: `cd backend-dotnet`\n      - Build project: `dotnet build`,\n      - Finally run the tests: `dotnet test`.\n- Frontend:\n  - Open the CMD terminal,\n  - Access the frontend folder: `cd frontend`,\n  - Install node modules: `yarn` or `npm install`,\n  - Finally, run the test: `yarn test` or `npm run test`.\n\n### 📊 Run with Coverage\n\n- Backend\n  - Open the CMD terminal,\n  - Access the backend folder `cd backend`\n    - To use Java Ecosystem: `cd backend-java`\n      - Install gradle modules: `./gradlew`\n      - Finally run the tests with coverage: `./gradlew test jacocoTestCoverageVerification`,\n      - Open the `backend-java/build/reports/jacoco/test/html/index.html` file in browser.\n    - To use C# Ecosystem: `cd backend-dotnet`\n      - Build project: `dotnet build`,\n      - Install globally the report generator tool: `dotnet tool install -g dotnet-reportgenerator-globaltool`\n      - Run the tests with the coverage result: `dotnet test --collect:\"XPlat Code Coverage\"`\n      - Convert the coverage to html: `reportgenerator -reports:\"Canadel.Tests/TestResults/**/coverage.cobertura.xml\" -targetdir:\"coverage-report\" -reporttypes:Html`\n        - `or`\n      - Convert the coverage to html: `reportgenerator.exe -reports:\"Canadel.Tests\\TestResults\\**\\coverage.cobertura.xml\" -targetdir:\"coverage-report\" -reporttypes:Html`\n      - Open the `backend-dotnet/coverage-report/index.html` file in browser.\n- Frontend\n  - Open the CMD terminal,\n  - Access the frontend folder: `cd frontend`\n  - Install node modules: `yarn` or `npm install`,\n  - Run the test with coverage: `yarn test:coverage` or `npm run test:coverage`,\n  - Open the `frontend/coverage/index.html` file in browser.\n\n\u003ch2 align=\"center\"\u003e👨🏽‍💻 Author\u003c/h2\u003e\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg width=\"100px;\" src=\"https://avatars.githubusercontent.com/u/84406367?v=4\" alt=\"Author's photo\"/\u003e\n\u003cbr\u003e\u003cspan\u003eMade by \u003ca href=\"https://github.com/ArthurVBS\" target=\"_blank\" rel=\"external\"\u003eArthur V.B.S.\u003c/a\u003e✌🏽\u003c/span\u003e\n\u003c/div\u003e\n\n\u003ch6 align=\"center\"\u003eMade with \u003ca href=\"https://github.com/ArthurVBS/ReadmeGenerator\" target=\"_blank\" rel=\"external\"\u003eArthurVBS's Readme Generator\u003c/a\u003e\u003c/h6\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farthurvbs%2Fcanadel","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Farthurvbs%2Fcanadel","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farthurvbs%2Fcanadel/lists"}