{"id":39561263,"url":"https://github.com/calvitoria/easy-menu","last_synced_at":"2026-01-18T07:08:03.522Z","repository":{"id":329332998,"uuid":"1115371311","full_name":"calvitoria/easy-menu","owner":"calvitoria","description":"Rails app for Restaurants management. ","archived":false,"fork":false,"pushed_at":"2025-12-19T02:09:22.000Z","size":226,"stargazers_count":0,"open_issues_count":4,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-12-21T22:02:53.102Z","etag":null,"topics":["fullstack-development","rails","ruby-on-rails"],"latest_commit_sha":null,"homepage":"","language":"HTML","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/calvitoria.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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-12T18:57:36.000Z","updated_at":"2025-12-18T20:53:08.000Z","dependencies_parsed_at":"2025-12-21T22:03:10.552Z","dependency_job_id":null,"html_url":"https://github.com/calvitoria/easy-menu","commit_stats":null,"previous_names":["calvitoria/easy-menu"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/calvitoria/easy-menu","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/calvitoria%2Feasy-menu","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/calvitoria%2Feasy-menu/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/calvitoria%2Feasy-menu/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/calvitoria%2Feasy-menu/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/calvitoria","download_url":"https://codeload.github.com/calvitoria/easy-menu/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/calvitoria%2Feasy-menu/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28532671,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T00:39:45.795Z","status":"online","status_checked_at":"2026-01-18T02:00:07.578Z","response_time":98,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["fullstack-development","rails","ruby-on-rails"],"created_at":"2026-01-18T07:08:01.832Z","updated_at":"2026-01-18T07:08:03.517Z","avatar_url":"https://github.com/calvitoria.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# EasyMenu - Menu Management API\n\n![Ruby](https://img.shields.io/badge/Ruby-3.4.7-red?style=for-the-badge\u0026logo=ruby)\n![Rails](https://img.shields.io/badge/Rails-8.1.1-cc0000?style=for-the-badge\u0026logo=rubyonrails)\n![Docker](https://img.shields.io/badge/Docker-ready-2496ED?style=for-the-badge\u0026logo=docker)\n![Tests](https://img.shields.io/badge/Test%20Coverage-92.4%25-brightgreen?style=for-the-badge\u0026logo=minitest)\n\n**EasyMenu** is a Ruby on Rails application for managing restaurants, menus, and menu items. It combines a clean REST-style API with server-rendered HTML using Hotwire, and is designed to run smoothly both locally and inside Docker.\n\n## 🎬 Project Demo Video\n\nhttps://github.com/user-attachments/assets/16b57c75-d81d-4c70-8e45-ea7d813744b8\n\n## 📋 Table of Contents\n\n- [Technology Stack](#technology-stack)\n- [Project Structure](#project-structure)\n- [Data Model](#data-model)\n- [Getting Started](#getting-started)\n  - [Prerequisites](#prerequisites)\n- [Installation \u0026 build](#installation)\n  - [Installation without docker](#without-docker)\n  - [Installation with docker](#with-docker)\n- [Testing](#testing)\n- [Linting](#linting)\n- [API Endpoints](#api-endpoints)\n  - [1. Restaurants](#1-restaurants)\n  - [2. Menus](#2-menus)\n  - [3. Menu Items](#3-menu-items)\n  - [4. Menu Item Management](#4-menu-item-management)\n  - [5. Data Import](#5-data-import)\n\n## Technology Stack\n\n- **Backend**: Ruby on Rails 8.1\n- **Database**: SQLite (development)\n- **Background Jobs**: SolidQueue\n- **Frontend**: Hotwire (Turbo + Stimulus)\n- **Styling**: Tailwind CSS\n- **Testing**: Minitest\n- **Linting**: RuboCop\n- **Containerization**: Docker \u0026 Docker Compose\n\n## Project Structure\n\n\n```\napp/\n├── controllers/           # Request handling \u0026 orchestration\n│ └── concerns/\n├── models/                # Domain models\n├── services/              # Business logic \u0026 workflows\n├── views/                 # Server-rendered UI (Hotwire)\nconfig/                    # Application configuration\ndb/                        # Schema, migrations, seeds\ndocs/                      # Documentation\ntest/                      # Test suite\n```\n\n---\n\n## Data Model\n\nThe data model consists of four main resources:\n\n-   **Restaurant**: The top-level resource. Each restaurant has its own set of menus.\n-   **Menu**: Belongs to a `Restaurant` and can contain multiple `MenuItems`.\n-   **MenuItem**: Can be associated with multiple `Menus`, forming a many-to-many relationship through the `MenuItemMenu` join table.\n-   **ImportAuditLog**: Records the status and details of data import operations.\n-   **MenuItemMenu**: join table for the many-to-many relationship.\n\n---\n\n## Getting Started\nYou can run EasyMenu with or without Docker. Docker is recommended for a consistent development environment.\n\n### Prerequisites\n\n**Without Docker**\n\n-   Ruby `3.4.7` (as specified in `.ruby-version`)\n-   Bundler\n-   SQLite3\nor\n-   Node.js \u0026 npm\n\n**With Docker**\n- Docker\n- Docker Compose\n\n## Installation\n\n1.  Clone the repository:\n\n    ```bash\n    git clone https://github.com/calvitoria/easy-menu\n    cd easy-menu\n    ```\n\n### without Docker\n\n1.  Install the dependencies:\n\n    ```bash\n    bundle install\n    ```\n\n### Database Setup (without Docker)\n\n1.  Create the database:\n\n    ```bash\n    rails db:create\n    ```\n\n2.  Run the migrations:\n\n    ```bash\n    rails db:migrate\n    ```\n\n3.  Seed the database (optional):\n\n    ```bash\n    rails db:seed\n    ```\n  \n  \u003e or you can run `rails db:create db:migrate db:seed`\n\n### Running the Application (without Docker)\n\nStart the Rails server:\n\n```bash\nrails server\n```\n\nThe API will be available at `http://localhost:3000`.\n\n---\n\n### With Docker\n\nTo run the application using Docker Compose:\n\n1.  **Build the Docker image:**\n\n    ```bash\n    docker-compose build\n    ```\n\n2.  **Start the application:**\n    This will also run database migrations (`db:prepare`) and seed the database (`db:seed`) automatically.\n\n    ```bash\n    docker-compose up\n    ```\n\n  Your application should now be accessible at `http://localhost:3000`.\n\n### Accessing the Bash Shell in the Container\n\nTo get a bash shell inside the running `web` service container:\n\n```bash\ndocker-compose exec web bash\n```\n\n---\n\n## Testing\n\nRun the test suite:\n\n```bash\nrails test\n```\n\nwhen running the test suit, the coverage report is generated. You can find it under /coverage/index.htm\n\u003cimg width=\"1920\" height=\"937\" alt=\"image\" src=\"https://github.com/user-attachments/assets/86765c69-6dc4-48b9-8ccf-da7f60d16dc1\" /\u003e\n\n\n---\n\n## Linting\n\nThis project uses RuboCop for linting. To check the code for style violations, run:\n\n```bash\nrubocop\n```\n\n---\n\n## API Endpoints\n\nThe routes are structured hierarchically to reflect the data model:\n\n### 1. Restaurants\n\n-   `GET /restaurants`: List all restaurants.\n-   `POST /restaurants`: Create a new restaurant.\n-   `GET /restaurants/:id`: Show a specific restaurant.\n-   `PATCH/PUT /restaurants/:id`: Update a specific restaurant.\n-   `DELETE /restaurants/:id`: Delete a specific restaurant.\n\n### 2. Menus\n\n-   `GET /restaurants/:restaurant_id/menus`: List all menus for a specific restaurant.\n-   `POST /restaurants/:restaurant_id/menus`: Create a new menu for a specific restaurant.\n-   `GET /menus/:id`: Show a specific menu.\n-   `PATCH/PUT /menus/:id`: Update a specific menu.\n-   `DELETE /menus/:id`: Delete a specific menu.\n\n### 3. Menu Items\n\n-   `GET /menu_items`: List all menu items.\n-   `POST /menu_items`: Create a new menu item and optionally assign it to one or more menus.\n-   `GET /menus/:menu_id/menu_items`: List all menu items for a specific menu.\n-   `POST /menus/:menu_id/menu_items`: Create a new menu item and assign it to the specified menu.\n-   `GET /menu_items/:id`: Show a specific menu item.\n-   `PATCH/PUT /menu_items/:id`: Update a specific menu item.\n-   `DELETE /menu_items/:id`: Delete a specific menu item.\n\n### 4. Menu Item Management\n\n-   `POST /menus/:id/add_menu_item`: Add an existing menu item to a menu.\n-   `DELETE /menus/:id/remove_menu_item`: Remove a menu item from a menu.\n\n### 5. Data Import\n\nThe API provides an endpoint to import restaurant, menu, and menu item data from a JSON file. This is particularly useful for bulk initial data loading.\n\n-   `POST /imports/restaurants`: Imports data from a JSON file.\n-   `GET /imports`: List all import audit logs.\n-   `GET /imports/:id`: Show a specific import audit log.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcalvitoria%2Feasy-menu","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcalvitoria%2Feasy-menu","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcalvitoria%2Feasy-menu/lists"}