- 👀 About
- 🔧 Tech Stack
- 💡 Features
- 🔗 API
- 📺 Demo
- 📋 Requirements
- 🌍 Configuration
▶️ Run- 🧪 Run backend tests
- ⚡ Usage
- 💳 Example login data
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.
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
- 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.
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.
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 ispl(Polish). You can also seten(English).
Request Body:
{
"email": "user@example.com",
"password": "password123"
}Description:
Logs out currently logged in user, invalidating his session.
Description:
Checks whether the current user has an active authenticated session.
Description:
Retrieves currently set up opening hours on all days of the week from the database.
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 ispl(Polish). You can also seten(English).
Request Body:
{
"day_of_week": "TUESDAY",
"opening_time": "20:00",
"closing_time": "23:00"
}Description:
Retrieves all beverages, that are currently stored in the database.
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 ispl(Polish). You can also seten(English).
Request Body:
{
"new_beverage_name": "Lipton",
"new_beverage_capacity": 0.5,
"new_beverage_price": 6
}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 ispl(Polish). You can also seten(English).
Request Body:
{
"updated_beverage_name": "Lipton",
"updated_beverage_price": 6,
"updated_beverage_new_capacity": 0.33,
"updated_beverage_old_capacity": 0.5
}Description:
Removes existing beverage.
Authorization Requirements:
- Role:
MANAGER
Request Body:
{
"name": "Lipton",
"capacity": 0.33
}Description:
Retrieves all addons, that are currently stored in the database.
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 ispl(Polish). You can also seten(English).
Request Body:
{
"new_addon_name": "Zapiekanka",
"new_addon_price": 12
}Description:
Updates existing addon.
Authorization Requirements:
- Role:
MANAGER
Request Headers:
Accept-Language: Specifies preferred language for the response. Default ispl(Polish). You can also seten(English).
Request Body:
{
"updated_addon_name": "Zapiekanka",
"updated_addon_price": 12
}Description:
Removes existing addon.
Authorization Requirements:
- Role:
MANAGER
Request Body:
{
"name": "Zapiekanka"
}Description:
Retrieves all meals, that are currently stored in the database.
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 ispl(Polish). You can also seten(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"
}
]
}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 ispl(Polish). You can also seten(English).
Request Body:
{
"updated_meal_name": "Kebab",
"updated_meal_prices": {
"SMALL": 20,
"XL": 35
},
"updated_meal_ingredients": [
{
"name": "Pita",
"ingredient_type": "BREAD"
}
]
}Description:
Removes existing meal.
Authorization Requirements:
- Role:
MANAGER
Request Body:
{
"name": "Kebab"
}Description:
Retrieves all ingredients, that are currently stored in the database.
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 ispl(Polish). You can also seten(English).
Request Body:
{
"new_ingredient_name": "Cucumber",
"new_ingredient_type": "VEGETABLE"
}Description:
Removes existing ingredient.
Authorization Requirements:
- Role:
MANAGER
Request Body:
{
"name": "Cucumber"
}Description:
Retrieves all contacts, that are currently stored in the database.
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 ispl(Polish). You can also seten(English).
Request Body:
{
"contact_type": "TELEPHONE",
"new_value": "123456789"
}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
Description:
Retrieves all job offers, that are currently stored in the database. General response contain limited job offers properties (without job offer applications).
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 ispl(Polish). You can also seten(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"
}
]
}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 ispl(Polish). You can also seten(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
}Description:
Removes existing job offer.
Authorization Requirements:
- Role:
MANAGER
Request Body:
{
"position_name": "Cook"
}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 ispl(Polish). You can also seten(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
}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
- Type:
cv: The CV file in multipart/form-data format. Supported file formats: PDF, DOCX.- Type:
MultipartFile - Required: Yes
- Example: File named
cv.pdfuploaded as an attachment in the form.
- Type:
Description:
Download CV with specified ID.
Description:
Removes existing job application from job offer.
Authorization Requirements:
- Role:
MANAGER
Request Body:
{
"position_name": "Cook",
"application_id": 1
}Description:
Retrieves all meal promotions, that are currently stored in the database.
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 ispl(Polish). You can also seten(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"
]
}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 ispl(Polish). You can also seten(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"
]
}Description:
Removes existing meal promotion.
Authorization Requirements:
- Role:
MANAGER
Request Body:
{
"id": 1
}Description:
Retrieves all beverage promotions, that are currently stored in the database.
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 ispl(Polish). You can also seten(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]
}
}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 ispl(Polish). You can also seten(English).
Request Body:
{
"id": 1,
"updated_description": "All Fanta -40%!",
"updated_discount_percentage": 40,
"updated_beverages_with_capacities": {
"Fanta": [0.33]
}
}Description:
Removes existing beverage promotion.
Authorization Requirements:
- Role:
MANAGER
Request Body:
{
"id": 1
}Description:
Retrieves all addon promotions, that are currently stored in the database.
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 ispl(Polish). You can also seten(English).
Request Body:
{
"description": "Zapiekanka -60%!",
"discount_percentage": 60,
"addon_names": [
"Zapiekanka"
]
}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 ispl(Polish). You can also seten(English).
Request Body:
{
"id": 1,
"updated_description": "Zapiekanka -10%!",
"updated_discount_percentage": 10,
"updated_addon_names": [
"Zapiekanka"
]
}Description:
Removes existing addon promotion.
Authorization Requirements:
- Role:
MANAGER
Request Body:
{
"id": 1
}Description:
Retrieves all subscribers, that are signed up to newsletter.
Authorization Requirements:
- Role:
MANAGER
Description: Subscribe newsletter. Customer must specify first name, email and newsletter messages language
Request Headers:
Accept-Language: Specifies preferred language for the response. Default ispl(Polish). You can also seten(English).
Rate Limit without appropriate roles 1 request / 5 minutes
Request Body:
{
"first_name": "Wiktor",
"email": "example@example.com",
"messages_language":"POLISH"
}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 ispl(Polish). You can also seten(English).
Request Body:
{
"email": "example@example.com",
"otp": 123456
}Description:
Regenerates OTP code. OTP can be regenerated only at certain intervals.
Request Headers:
Accept-Language: Specifies preferred language for the response. Default ispl(Polish). You can also seten(English).
Request Body:
{
"email": "example@example.com"
}Description: Unsubscribe newsletter. Customer can sign out from newsletter at any time.
Request Headers:
Accept-Language: Specifies preferred language for the response. Default ispl(Polish). You can also seten(English).
Request Body:
{
"email": "example@example.com"
}Description:
Retrieves all discount codes.
Authorization Requirements:
- Role:
MANAGER
Description:
Retrieves specific discount code based on the code provided in the URL path.
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 ispl(Polish). You can also seten(English).
Request Body:
{
"code": "kodzik",
"discount_percentage": 20.00,
"expiration_date": "2025-12-01",
"remaining_uses": 2
}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 ispl(Polish). You can also seten(English).
Request Body:
{
"code": "kodzik",
"updated_code": "kodzik1"
"updated_discount_percentage": 20.00,
"updated_expiration_date": "2025-12-01",
"updated_remaining_uses": 2
}Description:
Removes existing discount code.
Authorization Requirements:
- Role:
MANAGER
Request Body:
{
"code": "kodzik"
}Description:
Retrieves all orders stored in database.
Authorization Requirements:
- Role:
MANAGERorEMPLOYEE
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 ispl(Polish). You can also seten(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
}
}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 ispl(Polish). You can also seten(English).
Request Body:
{
"id": 4,
"customer_phone": "123456789"
}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:
MANAGERorEMPLOYEE
Request Headers:
Accept-Language: Specifies preferred language for the response. Default ispl(Polish). You can also seten(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
}
}Description:
Removes existing order.
Authorization Requirements:
- Role:
MANAGERorEMPLOYEE
Request Body:
{
"id": 4
}Description:
Retrieves all employees stored in database.
Authorization Requirements:
- Role:
MANAGER
Description:
Retrieves current authenticated employee data.
Description: Add new employee.
Request Headers:
Accept-Language: Specifies preferred language for the response. Default ispl(Polish). You can also seten(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
}Description:
Updates existing employee.
Authorization Requirements:
- Role:
MANAGER
Request Headers:
Accept-Language: Specifies preferred language for the response. Default ispl(Polish). You can also seten(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"
}Description:
Updates current logged in employee's credentials. It is possible to update email or password.
Authorization Requirements:
- Role:
MANAGERorEMPLOYEE
Request Headers:
Accept-Language: Specifies preferred language for the response. Default ispl(Polish). You can also seten(English).
Request Body:
{
"updated_email": "nowy.email@example.com",
"password": "stareHaslo123",
"updated_password": "noweHaslo456"
}Description:
Removes existing employee.
Authorization Requirements:
- Role:
MANAGER
Request Body:
{
"email": "jan.kowalski@example.com"
}Description:
Retrieves all work schedule entries stored in database.
Authorization Requirements:
- Role:
MANAGERorEMPLOYEE
Description:
Retrieves current authenticated employee data.
Request Params:
startDate: Start date of the work schedule period.- Type:
LocalDate - Required: Yes
- Example:
2025-09-01
- Type:
endDate: End date of the work schedule period.- Type:
LocalDate - Required: Yes
- Example:
2025-09-30
- Type:
Authorization Requirements:
- Role:
MANAGERorEMPLOYEE
Description: Add new work schedule entry.
Request Headers:
Accept-Language: Specifies preferred language for the response. Default ispl(Polish). You can also seten(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"
}Description:
Removes existing work schedule entry.
Authorization Requirements:
- Role:
MANAGER
Request Body:
{
"id": 3
}- Java 21 (or higher)
- Docker
- ng
- npm
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:
- Navigate to
https://developer.tomtom.com/and log in to your account. Then create new Map Display API key and copy it. - Create
.envfile on the following path:/miesiany-miesiany-kebab/frontend/src/.env - Add previously copied API key to
.envfile
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.
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>
Clone the project
git clone git@github.com:P4ZD4N/miesiany-miesiany-kebab.gitNavigate to the frontend directory
cd /path/to/miesiany-miesiany-kebab/frontendInstall dependencies
npm installNavigate to the project directory
cd /path/to/miesiany-miesiany-kebabRun app
./start.shProject contains only backend tests (290 tests). To run all navigate to the backend directory
cd /path/to/miesiany-miesiany-kebab/backendRun tests
./mvnw testNavigate to the following URL in your web browser
http://localhost:4200
That's It! You can start using kebab app :)
-
Manager Login: manager@example.com Password: manager123
-
Employee 1 Login: employee1@example.com Password: employee123
-
Employee 2 Login: employee2@example.com Password: employee123
-
Employee 3 Login: employee3@example.com Password: employee123
-
Employee 4 Login: employee4@example.com Password: employee123



























