The Bars Project is a Development Exercise and thus does not aim for applicability, at least not in the short term. However, I intend to develop it using the best I can implement in terms of scalability, clean programming, and best practices.
To follow project updates, please consult the project’s GitHub: https://github.com/rudsonalves/bares.git
The project will consist of three main components discussed below.
1. Kitchen and Waiters
- Objective: Facilitate communication between customers and the kitchen, and optimize waiter service.
- Features:
- Order Visualization: A clear interface that displays orders in real time.
- Order Status: Ability to mark orders as “in preparation”, “ready to serve”, etc.
- Notifications for Waiters: Alerts when orders are ready to be served.
- Order History: For performance analysis and planning.
2. App for Customers at Tables
- Objective: Provide an interactive and efficient experience for customers.
- Features:
- Digital Menu: Easy access to the menu with photos and descriptions.
- Customized Ordering: Option to add preferences and notes to orders.
- Integration with Payments: Ability to pay the bill through the app.
- Feedback and Ratings: Space for comments and ratings of dishes.
3. Server API
- Objective: To be the link between the kitchen and table apps, ensuring data consistency.
- Features:
- Real-Time Communication: Use WebSockets for instant updates.
- Security: Implement authentication and encryption.
- Scalability: Prepared to handle different volumes of orders.
Integrations: Possibility of integrating with existing management systems in the bar.
Improvements and Additional Ideas
Augmented Reality in the Menu: Use AR to display dishes in a more interactive way in the table app.Dish Suggestions: Artificial intelligence to suggest dishes based on previous preferences or popular items.Loyalty Program: Encourage customers to return to the bar with a points and rewards system.Chatbot for Inquiries: Virtual assistant to answer common questions and assist in the ordering process.
Suggested Technologies
- For the Apps (Kitchen and Table): Flutter could be a
great choice due to its ability to create beautiful and high-performance applications for Android and iOS with a single codebase. - For the API: Golang is an excellent choice for the
backend due to its performance and ease of maintenance. Moreover,
it offers good options for handling real-time communications and
scalability.
Project Review 1
The project scope was reduced to meet the needs of a more manageable development exercise. We will focus on implementing the API in Go and the applications in Flutter, simplifying the project without losing the essence of the original idea.
Simplified Project Structure
1. Go API
- Objective: Create a robust and efficient API to manage orders and communication between the applications.
- Basic Functions:
- Order Registration: Receive and store orders from customers.
- Status Update: Allow the kitchen to update the status of orders.
- Order Inquiry: Capability for the apps to check the current status of orders.
2. Flutter Applications
- Customer App (Table): Allow customers to view the menu, place orders, and track the status of their orders.
- Kitchen/Waiter App: View received orders, update the order status, and receive notifications of new orders.
Development
Go API
- Endpoints: Define clear endpoints for creating, updating, and querying orders.
- Database: Choose a suitable database to store orders (e.g., PostgreSQL, MySQL, etc.).
- Tests: Implement unit tests to ensure the API’s reliability.
Flutter Applications
- UI/UX: Develop intuitive and responsive interfaces.
- API Integration: Use packages like
http
to communicate with the API. - Application State: Manage the application state for efficient data updates (using
Provider
,Bloc
, orRiverpod
).
Final Considerations
- Focus on the MVP (Minimum Viable Product): Concentrate on the essential functionalities to get the system working on a basic level.
- Documentation: Maintain clear documentation for both the API and the applications.
- Iteration and Feedback: Test the system with mock users and refine based on feedback.
This simplified project still offers an excellent opportunity to explore full-stack development, covering both the backend with Go and the frontend with Flutter. It’s an effective way to practice important programming skills and system design principles.
Golang API
Let’s detail the API for the Bars Project, focusing on development with Go. The API will be the system’s heart, linking the customer and kitchen/waiter apps, managing orders, and ensuring information flows correctly between all parties.
API Structure
1. Route Definition
The API will have the following main routes:
- POST /orders: Receives new orders from customers.
- GET /orders/{id}: Allows querying a specific order.
- PUT /orders/{id}: Allows updating the status of a specific order (e.g., from “in preparation” to “ready”).
- GET /orders: Lists all orders, possibly with filters by status.
2. Data Modeling
The main data to be managed will be orders. Each order can have the following structure:
- ID: Unique identifier of the order.
- Items: List of ordered items, each with a name, quantity, and possible remarks.
- Status: Current status of the order (e.g., “received”, “in preparation”, “ready”, “delivered”).
- Timestamps: Timestamps for when the order was created and updated.
3. Authentication and Authorization (Optional for Initial Version)
- Implement authentication to ensure that only authorized users can place orders or change the status of orders.
- JWT (JSON Web Tokens) or OAuth could be used to manage sessions and permissions.
4. Database Communication
- Integrate a database to store orders and related information.
Implement an ORM (Object-Relational Mapping) like GORM for safer and more efficient interaction with the database.
Development and Tools
- Gin-Gonic for Routes and Middleware:
- Use the Gin-Gonic framework to facilitate route definition, request and response handling, and middleware integration for tasks like logging and error handling.
- Data Validation:
- Ensure that the data received in requests is correct and complete, using validation packages.
- Testing:
- Implement automated tests to ensure the API is functioning as expected. This includes unit tests for individual functions and integration tests for the complete order flow.
- API Documentation:
- Use tools like Swagger or Postman to document the routes, parameters, and responses of the API, making it easier for developers of client and kitchen applications to understand and use.
- Logging and Monitoring:
- Implement proper logging to track what’s happening in the application and integrate monitoring tools to observe the API’s health and performance in real time.
The proposed database schema considers the basic functionalities for managing orders, menu items, and users. The database will be structured in tables reflecting the system’s main components.
1. Users Table (Usuarios)
To manage users who can log into the app (managers, waiters).
Field | Type | Description |
---|---|---|
usuarioID | INT | Unique ID for the user |
nome | VARCHAR(255) | User’s name |
VARCHAR(255) | User’s email | |
senhaHash | VARCHAR(255) | Hash of the password for authentication |
papel | ENUM | Role (e.g., customer, waiter, manager) |
2. Menu Items Table (ItensMenu)
To store details of items available for ordering.
Field | Type | Description |
---|---|---|
itemID | INT | Unique ID for the menu item |
nome | VARCHAR(255) | Name of the item |
descricao | TEXT | Description of the item |
preco | DECIMAL(10,2) | Price of the item |
imagemURL | VARCHAR(255) | URL of the item’s image |
3. Orders Table (Pedidos)
To store orders placed by customers.
Field | Type | Description |
---|---|---|
pedidoID | INT | Unique ID for the order |
usuarioID | INT | ID of the user who placed the order |
dataHora | DATETIME | Date and time of the order |
status | ENUM | Status of the order (e.g., received, preparing, ready, delivered) |
4. Order Items Table (ItensPedido)
To link orders to menu items and store specific order information, such as the quantity of each item.
Field | Type | Description |
---|---|---|
itemPedidoID | INT | Unique ID for the order item |
pedidoID | INT | ID of the order |
itemID | INT | ID of the menu item |
quantidade | INT | Quantity of the ordered item |
observacoes | TEXT | Specific customer remarks |
Relationships:
- Usuarios ↔ Pedidos: A user can place multiple orders, but each order is made by a single user.
- Pedidos ↔ ItensPedido: An order can contain several items, and an item can appear in multiple orders.
- ItensMenu ↔ ItensPedido: A menu item can be part of several orders, and each order item refers to a menu item.
Indexing
- idx_usuario_id: add an index to the
UsuarioID
column in thePedidos
table. - idx_pedido_id: add an index to the
PedidoID
column in theItensPedido
table.
Final Considerations:
- Primary Keys: Each table should have a primary key (
usuarioID
,itemID
,pedidoID
,itemPedidoID
). - Foreign Keys: Use foreign keys to maintain referential integrity (e.g.,
usuarioID
inPedidos
refers tousuarioID
inUsuarios
;itemID
inItensPedido
refers toitemID
inItensMenu
;pedidoID
inItensPedido
refers topedidoID
inPedidos
). - Indexing: Consider adding indexes for columns that are frequently searched to improve performance.
With this design, you’ll have a robust and well-structured database ready to manage the users, orders, and menu items of your bar application.