Skip to content

P4ZD4N/miesiany-miesiany-kebab

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

500 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

💻 Miesiany Miesiany Kebab

📜 Table of Contents

  1. 👀 About
  2. 🔧 Tech Stack
  3. 💡 Features
  4. 🔗 API
  5. 📺 Demo
  6. 📋 Requirements
  7. 🌍 Configuration
  8. ▶️ Run
  9. 🧪 Run backend tests
  10. ⚡ Usage
  11. 💳 Example login data

👀 About

Fullstack application for business from gastronomic industry created with Spring on backend and Angular on frontend. Intended to serve as digital business card to reach more customers, encourage them to stay longer and to solve problems typical for this industry.

System provides convenient UI (RWD, multilingual pages, eye-catching colors, customizable by manager paragraphs) and all essential information in one place. Offers a set of marketing tools that enhance brand strength, customer engagement and support business growth - marketing slogans, discount codes, newsletter or gamification systems while placing orders. Ensures real impact on repeat visits and building better relationships with customers.

Another functionality that distinguishes the system is job board, where manager can add fully customizable job offer with information such as position name, list of Mandatory / Nice to have requirements, employment types or hourly wage gross. Guests can apply to each job offer by fulfilling form with attaching CV in PDF/DOC format. System share possibility to easy candidate selection or download CV attached by candidate.

Also implemented real-time panels with WebSockets to ensure instant data synchronization on views, which really needs it. Good example can be "Order Status Display" view for in-restaurant screens which show numbers of orders currently being prepared (in gray color) and ready (in green color). Tracking order view is also a view of this type.

Finally, it is worth mentioning some staff panels - for example work schedule panel which allow to manage shifts in selected month (document can be then displayed or downloaded in PDF format) or payments panel where manager can clearly check all necessary information about payments related to particular employee for any month.

🔧 Tech Stack

Backend: Java 21, Spring Boot 3, Spring Security, Spring Data, Hibernate, Thymeleaf, Lombok

Frontend: TypeScript 5, Angular 18, HTML, SCSS, Bootstrap

Testing: JUnit, Mockito

Databases: PostgreSQL, SQL

Build tools: Maven

DevOps: Docker, Bash

Formatting: Prettier (Frontend), Google Java Format (Backend)

Other tools used during development: Postman, pgAdmin 4

💡 Features

  • Session-based authentication system, taking into data security - implemented storing passwords encrypted with the bcrypt algorithm in database.
  • Well-tailored UI with eye-catching colors.
  • Responsive Web Design to improve accessibility of UI at all types of devices.
  • Multilingual pages (Polish or English).
  • Multilingual validation for all forms. Validation messages are sent by backend in appropriate language specified in request header.
  • Integration with TomTom Map API to add map with pointer making locating restaurant much easier to potential customers.
  • Bash script, which starts PostgreSQL database, backend and frontend with one command.
  • Possibility to follow application flow and diagnose potential issues by accessing informational, warning and error logs in console.
  • Possibility to display Home Page - "First contact section", which clients see firstly after navigating to root URL. Had to be designed in the best way from marketing perspective - there should be many information, that can encourage potential customer to place order. Contains marketing slogans, certificates, guarantees, acknowledgments and a map with pointer.
  • Possibility to display highlighted with proper color easy to customize by manager opening hours of restaurant on each day.
  • Possibility to display Menu of the restaurant divided to three sections: Meals, Addons and Beverages. Customer can learn about each menu item details like name, price, capacity or ingredients. Entire section is customizable by manager - can add, update and remove each type of item. Items in each section are sorted by name.
  • Possibility to display Contact details - phoone number, email address, nicknames at social media and map with location pointer. Contact data is customizable by manager.
  • Job board, which enable manager to add fully customizable job offers with information such as position name, description, list of Mandatory / Nice to have requirementslist of employment types or hourly wage gross. Website guests interested in work for restaurant can apply to each job offer by fulfilling form (with attaching a CV in PDF/DOC format). System also share possibility to display all candidates, which applied to job offer, remove those who do not fit the position or display/download CV attached by desired candidate.
  • Promotions for Meals, Beverages and Addons possible to see in proper view of website by all customers. If some menu position is already added to certain promotion, customers can see price change in menu section or while placing order. All promotions are customizable by manager - can add, update and delete promotions.
  • Multilingual promotions newsletter with email verification implemented with usage of Observer design pattern. Each customer has possibility to sign up to newsletter and choose preffered language of email messages (Polish or English). When some promotion is added, then email is sent to all verified subscribers. From technical perspective some methods related to feature are asynchronous to enhance application preformance. System offers possibility to unsubscribe newsletter at any time.
  • Discount codes with which customers can reduce price of order - each code has its expiration date and number of remaining uses. Automatically generated and sending to customers, who provide their email address during placing order process - either after every 10 orders or when the order total price exceeds 100 PLN. Manager can add, update and delete discount codes (allowing for manual distribution as well).
  • Possibility to place order by customers in easy and concise way - each menu position can be selected and added to order, then partially customized (by choosing size, meat, sauce, quantity or capacity). After adding item, customer may continue adding more items, proceed to the next step or come back later (all order details are saved in local storage). Next step is choosing preferred delivery method: pickup at the restaurant or home delivery. Depending on the choice dedicated panel is shown to collect the necessary information. Finally, customer has the option to leave additional comments and enter a discount code to receive a price reduction. Managers and employees can add, update and delete orders.
  • Real-time panels related to orders (order display, order management and track order) implemented with usage of WebSockets for instant data synchronization.
  • Track order panel, where customers can easily monitor status of their order in real time. Here they can find information such as order id (number of order displayed on the screen in restaurant), total price, delivery address (if home delivery method was selected), payment methods, ordered items details and current order status. Customers can access this panel for up to two hours after the last update to their order.
  • Real-time order status display for in-restaurant screen, which shows numbers of orders currently being prepared (in gray color) and those, that are ready (in green color). This provides clear information to customers waiting in the restaurant, improving communication and overall experience.
  • Work schedule panel which allows managers to assign shifts for all employees for a selected month and year. All employees can display and then download a printable PDF document that clearly displays the shift schedule.
  • Employee management panel where manager can add, update or remove employees.
  • Employee and manager panels which allow authenticated users to view their current contact information and employment details. Each panel includes an actions section with buttons that provide functions available to the particular account type (employee or manager). Both employees and managers can also update their email address and password.
  • Payments panel where manager can clearly check all necessary information about payments related to particular employee for any month: personal data, job, employment type, current hourly wage gross, hourly wage gross in chosen period, working hours in chosen period, student status and total payment amount.
  • Rate limiting applied to public API endpoints to protect system from excessive or malicious traffic.

📺 Demo

Demonstrates the authentication process for the manager role.

Displays the main landing page with visible much marketing slogans, restaurant's location map and language toggle function.

Shows view for checking opening hours, including a live demonstration of manager updating the schedule for specific day.

Presents menu view, detailing all available items for customer ordering.

Illustrates the complete user flow for signing up to the promotions newsletter.

Email containing One-Time Password (OTP) required to complete the newsletter sign-up.

Final email confirming successful subscription and welcoming the user to the community.

Demonstration of manager creating new promotion, followed by the automated notification sent to all newsletter subscribers.

Email message received by subscribers, detailing the recently added promotion.

Demonstration of a potential employee completing the job application form, including the CV attachment process.

Manager's interface for reviewing applicants, featuring the functionality to download the attached CVs for further assessment.

Displays dedicated page for restaurant contact details and social media accounts.

Complete placing order process with automatic redirection to live tracking order panel.

Email sent to the customer post-order, which provides link and instructions for accessing order tracking view.

Step where customer inputs required data to view live status updates for their order.

Track order panel showing the real-time updates as the manager changes the order status in the order management system.

Order management panel used by managers and employees to monitor and execute status updates for incoming and pending orders.

Dedicated display for in-restaurant screens for showing order statuses to waiting customers, demonstrating real-time synchronization with employees updates.

View of the manager dashboard, highlighting all available for this role modules and demonstration of email and password update functionality.

View of the standard employee panel, showcasing accessible panels.

Dedicated panel for creating, viewing and managing promotional discount codes.

Demonstrates the customer's successful use of a promotional code during the order process.

Employee management panel.

View for managing and inputting employee work schedule entries with feature for downloading created work schedule.

Displays payments view, which automatically determines employee compensation based on the recorded working hours from work schedule.

🔗 API

AuthenticationController

POST /api/v1/auth/login

Description:
Authenticates a user if the credentials are valid. Returns proper validation messages in specified in Accept-Language header language and error details, if any.

Request Headers:

  • Accept-Language: Specifies preferred language for the response. Default is pl (Polish). You can also set en (English).

Request Body:

{
  "email": "user@example.com",
  "password": "password123"
}

POST /api/v1/auth/logout

Description:
Logs out currently logged in user, invalidating his session.

GET /api/v1/auth/check-session

Description:
Checks whether the current user has an active authenticated session.


HoursController

GET /api/v1/hours/opening-hours

Description:
Retrieves currently set up opening hours on all days of the week from the database.

PUT /api/v1/hours/update-opening-hour

Description:
Updates the opening hours for a specific day of the week.

Authorization Requirements:

  • Role: MANAGER

Request Headers:

  • Accept-Language: Specifies preferred language for the response. Default is pl (Polish). You can also set en (English).

Request Body:

{
  "day_of_week":  "TUESDAY",
  "opening_time":  "20:00",
  "closing_time":  "23:00"
}

MenuController

GET /api/v1/menu/beverages

Description:
Retrieves all beverages, that are currently stored in the database.

POST /api/v1/menu/add-beverage

Description:
Add new beverage. It is possible to add new beverage with name of existing, but new beverage must have different capacity. For example, if db stores Coca-Cola with capacity 0.33L, you can add Coca-Cola with capacity 0.5L, but not with 0.33L.

Authorization Requirements:

  • Role: MANAGER

Request Headers:

  • Accept-Language: Specifies preferred language for the response. Default is pl (Polish). You can also set en (English).

Request Body:

{
  "new_beverage_name":  "Lipton",
  "new_beverage_capacity":  0.5,
  "new_beverage_price":  6
}

PUT /api/v1/menu/update-beverage

Description:
Updates existing beverage. If db already stores Coca-Cola with capacity 0.33L, you can't update Coca-Cola with capacity 0.5L to Coca-Cola with capacity 0.33L.

Authorization Requirements:

  • Role: MANAGER

Request Headers:

  • Accept-Language: Specifies preferred language for the response. Default is pl (Polish). You can also set en (English).

Request Body:

{
  "updated_beverage_name":  "Lipton",
  "updated_beverage_price":  6,
  "updated_beverage_new_capacity":  0.33,
  "updated_beverage_old_capacity": 0.5
}

DELETE /api/v1/menu/remove-beverage

Description:
Removes existing beverage.

Authorization Requirements:

  • Role: MANAGER

Request Body:

{
  "name":  "Lipton",
  "capacity":  0.33
}

GET /api/v1/menu/addons

Description:
Retrieves all addons, that are currently stored in the database.

POST /api/v1/menu/add-addon

Description:
Add new addon. It is not possible to add addon with the same name of existing. For example, if db already stores Zapiekanka, you can't add Zapiekanka second time.

Authorization Requirements:

  • Role: MANAGER

Request Headers:

  • Accept-Language: Specifies preferred language for the response. Default is pl (Polish). You can also set en (English).

Request Body:

{
  "new_addon_name":  "Zapiekanka",
  "new_addon_price":  12
}

PUT /api/v1/menu/update-addon

Description:
Updates existing addon.

Authorization Requirements:

  • Role: MANAGER

Request Headers:

  • Accept-Language: Specifies preferred language for the response. Default is pl (Polish). You can also set en (English).

Request Body:

{
  "updated_addon_name":  "Zapiekanka",
  "updated_addon_price":  12
}

DELETE /api/v1/menu/remove-addon

Description:
Removes existing addon.

Authorization Requirements:

  • Role: MANAGER

Request Body:

{
  "name":  "Zapiekanka"
}

GET /api/v1/menu/meals

Description:
Retrieves all meals, that are currently stored in the database.

POST /api/v1/menu/add-meal

Description:
Add new meal. It is not possible to add meal with the same name of existing. For example, if db already stores 'Pita Kebab', you can't add 'Pita Kebab' second time. You can specify prices as you want. Even just with SMALL and MEDIUM sizes or with SMALL and XL, but it is necessary to specify at least one size. You should also specify at least one ingredient, which must be already added in database. Ingredients, which are displayed as "Base Ingredients" on the website are of type: BREAD, VEGETABLE and OTHER.

Authorization Requirements:

  • Role: MANAGER

Request Headers:

  • Accept-Language: Specifies preferred language for the response. Default is pl (Polish). You can also set en (English).

Request Body:

{
  "new_meal_name":  "Kebab",
  "new_meal_prices":  {
    "SMALL":  20,
    "MEDIUM":  22,
    "LARGE":  25.5,
    "XL":  30
  },
  "new_meal_ingredients": [
    {
      "name":  "Tortilla",
      "ingredient_type":  "BREAD"
    },
    {
      "name":  "Tomato",
      "ingredient_type":  "VEGETABLE"
    }
  ]
}

PUT /api/v1/menu/update-meal

Description:
Updates existing meal. You can specify prices and ingredients as you want, but it is necessary to add at least one for both.

Authorization Requirements:

  • Role: MANAGER

Request Headers:

  • Accept-Language: Specifies preferred language for the response. Default is pl (Polish). You can also set en (English).

Request Body:

{
  "updated_meal_name":  "Kebab",
  "updated_meal_prices":  {
    "SMALL":  20,
    "XL":  35
  },
  "updated_meal_ingredients": [
    {
      "name":  "Pita",
      "ingredient_type":  "BREAD"
    }
  ]
}

DELETE /api/v1/menu/remove-meal

Description:
Removes existing meal.

Authorization Requirements:

  • Role: MANAGER

Request Body:

{
  "name":  "Kebab"
}

GET /api/v1/menu/ingredients

Description:
Retrieves all ingredients, that are currently stored in the database.

POST /api/v1/menu/add-ingredient

Description:
Add new ingredient. It is not possible to add ingredient with the same name as existing ingredient. It is possible to add ingredients of types: BREAD, MEAT, VEGETABLE, SAUCE and OTHER.

Authorization Requirements:

  • Role: MANAGER

Request Headers:

  • Accept-Language: Specifies preferred language for the response. Default is pl (Polish). You can also set en (English).

Request Body:

{
  "new_ingredient_name":  "Cucumber",
  "new_ingredient_type": "VEGETABLE"
}

DELETE /api/v1/menu/remove-ingredient

Description:
Removes existing ingredient.

Authorization Requirements:

  • Role: MANAGER

Request Body:

{
  "name":  "Cucumber"
}

ContactController

GET /api/v1/contact/contacts

Description:
Retrieves all contacts, that are currently stored in the database.

PUT /api/v1/contact/update-contact

Description:
Updates existing contact. You can update contacts of type EMAIL or TELEPHONE.

Authorization Requirements:

  • Role: MANAGER

Request Headers:

  • Accept-Language: Specifies preferred language for the response. Default is pl (Polish). You can also set en (English).

Request Body:

{
  "contact_type":  "TELEPHONE",
  "new_value":  "123456789"
}

JobsController

GET /api/v1/jobs/job-offers/manager

Description:
Retrieves all job offers, that are currently stored in the database. Response for manager contains all job offers properties including job offer applications.

Authorization Requirements:

  • Role: MANAGER

GET /api/v1/jobs/job-offers/general

Description:
Retrieves all job offers, that are currently stored in the database. General response contain limited job offers properties (without job offer applications).

POST /api/v1/jobs/add-job-offer

Description:
Add new job offer. It is not possible to add job offer with the same position name as existing job offer. You can add job offer without specyfing job employment types and job requirements.

Authorization Requirements:

  • Role: MANAGER

Request Headers:

  • Accept-Language: Specifies preferred language for the response. Default is pl (Polish). You can also set en (English).

Request Body:

{
  "position_name":  "Cook",
  "description": "Write something...",
  "hourly_wage": 30,
  "job_employment_types": [
    {
      "employment_type":  "PERMANENT"
    },
    {
      "employment_type":  "MANDATE_CONTRACT"
    }
  ],
  "job_requirements": [
    {
      "requirement_type":  "MANDATORY",
      "description":  ":)"
    },
    {
      "requirement_type":  "NICE_TO_HAVE",
      "description":  "nice to have"
    }
  ]
}

PUT /api/v1/jobs/update-job-offer

Description:
Updates existing job offer. You can update each property of job offer, but if you enter new position name same as different, existing job offer, it will not work.

Authorization Requirements:

  • Role: MANAGER

Request Headers:

  • Accept-Language: Specifies preferred language for the response. Default is pl (Polish). You can also set en (English).

Request Body:

{
  "position_name":  "Cook",
  "updated_position_name": "Coook",
  "updated_description": "Write something...",
  "updated_hourly_wage": 30,
  "updated_employment_types": [
    {
      "employment_type":  "PERMANENT"
    },
    {
      "employment_type":  "MANDATE_CONTRACT"
    }
  ],
  "updated_requirements": [
    {
      "requirement_type":  "MANDATORY",
      "description":  ":)"
    },
    {
      "requirement_type":  "NICE_TO_HAVE",
      "description":  "nice to have"
    }
  ],
  "is_active": false
}

DELETE /api/v1/jobs/remove-job-offer

Description:
Removes existing job offer.

Authorization Requirements:

  • Role: MANAGER

Request Body:

{
  "position_name":  "Cook"
}

POST /api/v1/jobs/add-job-offer-application

Description:
Add new job offer application. You can add job offer application without adding optional additional message.

Request Headers:

  • Accept-Language: Specifies preferred language for the response. Default is pl (Polish). You can also set en (English).

Rate Limit without appropriate roles 1 request / 5 minutes

Request Body:

{
  "position_name":  "Cook",
  "applicant_first_name": "Wiktor",
  "applicant_last_name": "Chudy",
  "applicant_email": "wiko700@gmail.com",
  "applicant_telephone": "123456789",
  "additional_message": "Write something...",
  "is_student": true
}

POST /api/v1/jobs/add-cv

Description:
Add CV to the job offer application.

Request Params:

  • applicationId: The ID of application, to which the CV is being attached. Must be a numeric value.
    • Type: Long
    • Required: Yes
    • Example: 12345
  • cv: The CV file in multipart/form-data format. Supported file formats: PDF, DOCX.
    • Type: MultipartFile
    • Required: Yes
    • Example: File named cv.pdf uploaded as an attachment in the form.

GET /api/v1/jobs/download-cv/{id}

Description:
Download CV with specified ID.

DELETE /api/v1/jobs/remove-job-application

Description:
Removes existing job application from job offer.

Authorization Requirements:

  • Role: MANAGER

Request Body:

{
  "position_name":  "Cook",
  "application_id": 1
}

PromotionsController

GET /api/v1/promotions/meal-promotions

Description:
Retrieves all meal promotions, that are currently stored in the database.

POST /api/v1/promotions/add-meal-promotion

Description: Add new meal promotion. You can add meal promotion without specifying meal names and sizes. Description and discount percentage are necessary fields.

Authorization Requirements:

  • Role: MANAGER

Request Headers:

  • Accept-Language: Specifies preferred language for the response. Default is pl (Polish). You can also set en (English).

Request Body:

{
  "description":  "All Large and XL -50%!",
  "discount_percentage": 50,
  "meal_names":  [
    "Pita Kebab Salads",
    "Pita Kebab Salads and Fries"
  ],
  "sizes": [
    "LARGE",
    "XL"
  ]
}

PUT /api/v1/promotions/update-meal-promotion

Description: Update existing meal promotion. You can update meal promotion without specifying any property except id. Id is necessary to identify proper promotion. If you won't update certain property, you shouldn't specify it in request.

Authorization Requirements:

  • Role: MANAGER

Request Headers:

  • Accept-Language: Specifies preferred language for the response. Default is pl (Polish). You can also set en (English).

Request Body:

{
  "id": 1,
  "updated_description": "All Large -40%!",
  "updated_discount_percentage": 40,
  "updated_meal_names":  [
    "Pita Kebab Salads",
    "Pita Kebab Salads and Fries"
  ],
  "updated_sizes": [
    "LARGE"
  ]
}

DELETE /api/v1/promotions/remove-meal-promotion

Description:
Removes existing meal promotion.

Authorization Requirements:

  • Role: MANAGER

Request Body:

{
  "id": 1
}

GET /api/v1/promotions/beverage-promotions

Description:
Retrieves all beverage promotions, that are currently stored in the database.

POST /api/v1/promotions/add-beverage-promotion

Description: Add new beverage promotion. You can add beverage promotion without specifying beverage names with their capacities. Description and discount percentage are necessary fields.

Authorization Requirements:

  • Role: MANAGER

Request Headers:

  • Accept-Language: Specifies preferred language for the response. Default is pl (Polish). You can also set en (English).

Request Body:

{
  "description": "All Coca-Cola -30%!",
  "discount_percentage": 30,
  "beverages_with_capacities": {
    "Coca-Cola": [0.33,  0.5],
    "Coca-Cola Zero": [0.33]
  }
}

PUT /api/v1/promotions/update-beverage-promotion

Description: Update existing beverage promotion. You can update meal promotion without specifying any property except id. Id is necessary to identify proper promotion. If you won't update certain property, you shouldn't specify it in request.

Authorization Requirements:

  • Role: MANAGER

Request Headers:

  • Accept-Language: Specifies preferred language for the response. Default is pl (Polish). You can also set en (English).

Request Body:

{
  "id": 1,
  "updated_description": "All Fanta -40%!",
  "updated_discount_percentage": 40,
  "updated_beverages_with_capacities": {
    "Fanta": [0.33]
  }
}

DELETE /api/v1/promotions/remove-beverage-promotion

Description:
Removes existing beverage promotion.

Authorization Requirements:

  • Role: MANAGER

Request Body:

{
  "id": 1
}

GET /api/v1/promotions/addon-promotions

Description:
Retrieves all addon promotions, that are currently stored in the database.

POST /api/v1/promotions/add-addon-promotion

Description: Add new addon promotion. You can add addon promotion without specifying addon names. Description and discount percentage are necessary fields.

Authorization Requirements:

  • Role: MANAGER

Request Headers:

  • Accept-Language: Specifies preferred language for the response. Default is pl (Polish). You can also set en (English).

Request Body:

{
  "description": "Zapiekanka -60%!",
  "discount_percentage": 60,
  "addon_names": [
    "Zapiekanka"
  ]
}

PUT /api/v1/promotions/update-addon-promotion

Description: Update existing addon promotion. You can update addon promotion without specifying any property except id. Id is necessary to identify proper promotion. If you won't update certain property, you shouldn't specify it in request.

Authorization Requirements:

  • Role: MANAGER

Request Headers:

  • Accept-Language: Specifies preferred language for the response. Default is pl (Polish). You can also set en (English).

Request Body:

{
  "id": 1,
  "updated_description": "Zapiekanka -10%!",
  "updated_discount_percentage": 10,
  "updated_addon_names": [
    "Zapiekanka"
  ]
}

DELETE /api/v1/promotions/remove-addon-promotion

Description:
Removes existing addon promotion.

Authorization Requirements:

  • Role: MANAGER

Request Body:

{
  "id": 1
}

NewsletterController

GET /api/v1/newsletter/subscribers

Description:
Retrieves all subscribers, that are signed up to newsletter.

Authorization Requirements:

  • Role: MANAGER

POST /api/v1/newsletter/subscribe

Description: Subscribe newsletter. Customer must specify first name, email and newsletter messages language

Request Headers:

  • Accept-Language: Specifies preferred language for the response. Default is pl (Polish). You can also set en (English).

Rate Limit without appropriate roles 1 request / 5 minutes

Request Body:

{
  "first_name": "Wiktor",
  "email": "example@example.com",
  "messages_language":"POLISH" 
}

PUT /api/v1/newsletter/verify-subscription

Description:
Verifies subscription with OTP code. Verification is mandatory, because email messages are sent only to verified subscribers.

Request Headers:

  • Accept-Language: Specifies preferred language for the response. Default is pl (Polish). You can also set en (English).

Request Body:

{
  "email": "example@example.com",
  "otp": 123456
}

PUT /api/v1/newsletter/regenerate-otp

Description:
Regenerates OTP code. OTP can be regenerated only at certain intervals.

Request Headers:

  • Accept-Language: Specifies preferred language for the response. Default is pl (Polish). You can also set en (English).

Request Body:

{
  "email": "example@example.com"
}

POST /api/v1/newsletter/unsubscribe

Description: Unsubscribe newsletter. Customer can sign out from newsletter at any time.

Request Headers:

  • Accept-Language: Specifies preferred language for the response. Default is pl (Polish). You can also set en (English).

Request Body:

{
  "email": "example@example.com"
}

DiscountCodesController

GET /api/v1/discount-codes/all

Description:
Retrieves all discount codes.

Authorization Requirements:

  • Role: MANAGER

GET /api/v1/discount-codes/{code}

Description:
Retrieves specific discount code based on the code provided in the URL path.

POST /api/v1/discount-codes/add-discount-code

Description: Add new discount code. It is not possible to add discount code with the same code as existing. For example, if db already stores discount code with code '123', you can't add 123 second time.

Authorization Requirements:

  • Role: MANAGER

Request Headers:

  • Accept-Language: Specifies preferred language for the response. Default is pl (Polish). You can also set en (English).

Request Body:

{
  "code": "kodzik",
  "discount_percentage": 20.00,
  "expiration_date": "2025-12-01",
  "remaining_uses": 2
}

PUT /api/v1/discount-codes/update-discount-code

Description:
Updates existing discount code. You can specify updated code, discount percentage, expiration date or remaining uses as you want, but it is necessary to enter name of existing code to identify it.

Authorization Requirements:

  • Role: MANAGER

Request Headers:

  • Accept-Language: Specifies preferred language for the response. Default is pl (Polish). You can also set en (English).

Request Body:

{
  "code": "kodzik",
  "updated_code": "kodzik1"
  "updated_discount_percentage": 20.00,
  "updated_expiration_date": "2025-12-01",
  "updated_remaining_uses": 2
}

DELETE /api/v1/discount-codes/remove-discount-code

Description:
Removes existing discount code.

Authorization Requirements:

  • Role: MANAGER

Request Body:

{
  "code": "kodzik"
}

OrdersController

GET /api/v1/orders/all

Description:
Retrieves all orders stored in database.

Authorization Requirements:

  • Role: MANAGER or EMPLOYEE

POST /api/v1/orders/add-order

Description: Add new order. Necessary fields are order type and order stastus, the rest is optional.

Request Headers:

  • Accept-Language: Specifies preferred language for the response. Default is pl (Polish). You can also set en (English).

Rate Limit without appropriate roles 1 request / 5 minutes

Request Body:

{
  "order_type": "ON_SITE",
  "order_status": "IN_PREPARATION",
  "customer_phone": "123456789",
  "customer_email": "example@example.com",
  "street": "Szkolna",
  "house_number": 1,
  "postal_code": "00-000",
  "city": "Warszawa",
  "additional_comments": "...",
  "meals": {
    "Pita Kebab Salads and Fries_Chicken_BBQ Sauce": {
      "SMALL": 2,
      "LARGE": 1
    }
  },
  "beverages": {
    "Coca-Cola": {
        "0.33": 1
    },
    "Fanta": {
        "0.33": 2
    }
  },
  "addons": {
    "Zapiekanka": 1
  }
}

POST /api/v1/orders/track-order

Description: Returns information about order. Both id and customer phone fields are necessary to get access to these information.

Request Headers:

  • Accept-Language: Specifies preferred language for the response. Default is pl (Polish). You can also set en (English).

Request Body:

{
    "id": 4,
    "customer_phone": "123456789"
}

PUT /api/v1/orders/update-order

Description:
Updates existing order. You can specify all fields as you want, but it is necessary to enter id of existing order to identify it.

Authorization Requirements:

  • Role: MANAGER or EMPLOYEE

Request Headers:

  • Accept-Language: Specifies preferred language for the response. Default is pl (Polish). You can also set en (English).

Request Body:

{
    "id": 4,
    "updated_order_type": "ON_SITE",
    "updated_order_status": "IN_PREPARATION",
    "updated_customer_phone": "123456789",
    "updated_customer_email": "example@example.com",
    "updated_street": "Szkolna",
    "updated_house_number": 1,
    "updated_postal_code": "00-000",
    "updated_city": "Warszawa",
    "updated_additional_comments": "...",
    "updated_meals": {
        "Pita Kebab Salads and Fries_Chicken_BBQ Sauce": {
        "SMALL": 2,
        "LARGE": 1
        }
    },
    "updated_beverages": {
        "Coca-Cola": {
            "0.33": 1
        },
        "Fanta": {
            "0.33": 2
        }
    },
    "updated_addons": {
        "Zapiekanka": 5
    }
}

DELETE /api/v1/orders/remove-order

Description:
Removes existing order.

Authorization Requirements:

  • Role: MANAGER or EMPLOYEE

Request Body:

{
  "id": 4
}

EmployeesController

GET /api/v1/employees/all

Description:
Retrieves all employees stored in database.

Authorization Requirements:

  • Role: MANAGER

GET /api/v1/employees/current

Description:
Retrieves current authenticated employee data.

POST /api/v1/employees/add-employee

Description: Add new employee.

Request Headers:

  • Accept-Language: Specifies preferred language for the response. Default is pl (Polish). You can also set en (English).

Authorization Requirements:

  • Role: MANAGER

Request Body:

{
  "first_name":  "Jan",
  "last_name":  "Kowalski",
  "email":  "jan.kowalski@example.com",
  "password":  "haslo123",
  "phone":  "123456789",
  "job":  "Cook",
  "hourly_wage":  35.50,
  "date_of_birth":  "1990-05-15",
  "employment_type":  "PERMANENT",
  "is_student": false
}

PUT /api/v1/employees/update-employee

Description:
Updates existing employee.

Authorization Requirements:

  • Role: MANAGER

Request Headers:

  • Accept-Language: Specifies preferred language for the response. Default is pl (Polish). You can also set en (English).

Request Body:

{
  "employee_email": "jan.kowalski@example.com",
  "updated_first_name": "Janusz",
  "updated_last_name": "Kowalski-Nowak",
  "updated_email": "janusz.nowak@example.com",
  "updated_password": "noweHaslo123",
  "updated_phone": "987654321",
  "updated_job": "Manager",
  "updated_hourly_wage": 35.75,
  "updated_date_of_birth": "1988-03-22",
  "updated_employment_type": "PERMANENT",
  "updated_student": false,
  "updated_active": true,
  "updated_hired_date": "2020-01-15"
}

PUT /api/v1/employees/update-credentials

Description:
Updates current logged in employee's credentials. It is possible to update email or password.

Authorization Requirements:

  • Role: MANAGER or EMPLOYEE

Request Headers:

  • Accept-Language: Specifies preferred language for the response. Default is pl (Polish). You can also set en (English).

Request Body:

{
  "updated_email": "nowy.email@example.com",
  "password": "stareHaslo123",
  "updated_password": "noweHaslo456"
}

DELETE /api/v1/employees/remove-employee

Description:
Removes existing employee.

Authorization Requirements:

  • Role: MANAGER

Request Body:

{
  "email": "jan.kowalski@example.com"
}

WorkScheduleController

GET /api/v1/work-schedule/all-entries

Description:
Retrieves all work schedule entries stored in database.

Authorization Requirements:

  • Role: MANAGER or EMPLOYEE

GET /api/v1/work-schedule/get-work-schedule-pdf

Description:
Retrieves current authenticated employee data.

Request Params:

  • startDate: Start date of the work schedule period.
    • Type: LocalDate
    • Required: Yes
    • Example: 2025-09-01
  • endDate: End date of the work schedule period.
    • Type: LocalDate
    • Required: Yes
    • Example: 2025-09-30

Authorization Requirements:

  • Role: MANAGER or EMPLOYEE

POST /api/v1/work-schedule/add-entry

Description: Add new work schedule entry.

Request Headers:

  • Accept-Language: Specifies preferred language for the response. Default is pl (Polish). You can also set en (English).

Authorization Requirements:

  • Role: MANAGER

Request Body:

{
  "employee_email": "jan.kowalski@example.com",
  "date": "2025-09-15",
  "start_time": "09:00",
  "end_time": "17:00"
}

DELETE /api/v1/work-schedule/remove-employee

Description:
Removes existing work schedule entry.

Authorization Requirements:

  • Role: MANAGER

Request Body:

{
  "id": 3
}

📋 Requirements

  • Java 21 (or higher)
  • Docker
  • ng
  • npm

🌍 Configuration

Frontend

To run this project and ensure, that app will work properly, you need to add the following line to your .env file. You need it to see the map with restaurant location on home page.

  • MAP_API_KEY=<YOUR_API_KEY>

Do it step by step:

  1. Navigate to https://developer.tomtom.com/ and log in to your account. Then create new Map Display API key and copy it.
  2. Create .env file on the following path: /miesiany-miesiany-kebab/frontend/src/.env
  3. Add previously copied API key to .env file

How to make name of whatever record saved in database multilingual? Just enter frontend/public/assets/i18n and add relevant name in both en.json and pl.json files. For example you would like to store addon with name Fries in English and Frytki in Polish. Then you should add "menu.addons.Fries" key in en.json and "menu.addons.Frytki" in pl.json.

Backend

You need to add the following lines to your application.properties file to make newsletter work properly.

  • spring.mail.host=<MAIL_HOST>
  • spring.mail.port=<MAIL_PORT>
  • spring.mail.username=<MAIL_USERNAME>
  • spring.mail.password=<APP_PASSWORD>

▶️ Run

Clone the project

git clone git@github.com:P4ZD4N/miesiany-miesiany-kebab.git

Navigate to the frontend directory

cd /path/to/miesiany-miesiany-kebab/frontend

Install dependencies

npm install

Navigate to the project directory

cd /path/to/miesiany-miesiany-kebab

Run app

./start.sh

🧪 Run backend tests

Project contains only backend tests (290 tests). To run all navigate to the backend directory

cd /path/to/miesiany-miesiany-kebab/backend

Run tests

./mvnw test

⚡ Usage

Navigate to the following URL in your web browser

http://localhost:4200

That's It! You can start using kebab app :)

💳 Example login data

  1. Manager Login: manager@example.com Password: manager123

  2. Employee 1 Login: employee1@example.com Password: employee123

  3. Employee 2 Login: employee2@example.com Password: employee123

  4. Employee 3 Login: employee3@example.com Password: employee123

  5. Employee 4 Login: employee4@example.com Password: employee123

About

Fullstack application for business from gastronomic industry created with Spring on backend and Angular on frontend. Intended to serve as digital business card to reach more customers, encourage them to stay longer and to solve problems typical for this industry.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages