Changeset 2518b3a


Ignore:
Timestamp:
05/02/25 00:37:10 (2 weeks ago)
Author:
Aleksandar Panovski <apano77@…>
Branches:
main
Children:
c44c5ed
Parents:
e15e8d9
Message:

Added menu tag

succesfull testing and implemnation

Files:
2 added
12 edited

Legend:

Unmodified
Added
Removed
  • my-react-app/src/components/ReservationConfirmation.js

    re15e8d9 r2518b3a  
    5656            rating: parseFloat(restaurant.rating) || null,
    5757            tableNumber: parseInt(table.id, 10),
    58             restaurant: restaurant,
     58            restaurantId: restaurant.restaurantId,
    5959            reservationDateTime: adjustedTimeSlot,
    6060            partySize: parseInt(partySize, 10),
     
    6262            specialRequests: specialRequests.trim(),
    6363            paymentStatus: 'Pending',
    64             preOrderedItems: preOrderedItems.map(item => `${item.itemName}:${item.quantity}:${item.price}`)
     64            preOrderedItems: preOrderedItems.map(item => ({
     65                name: item.itemName,
     66                quantity: item.quantity,
     67                price: item.price
     68            }))
    6569        };
     70        console.log(payload)
    6671
    6772
    6873        try {
    69             const response = await axios.post('http://localhost:8081/api/reservations', payload);
     74            console.log(payload)
     75            const response = await axios.post('http://localhost:8081/api/reservations', payload, {
     76                headers: {
     77                    'Content-Type': 'application/json'
     78                }
     79            });
    7080            console.log('Reservation created successfully:', response.data);
    7181            navigate("/reservations")
  • my-react-app/src/components/Reservations.js

    re15e8d9 r2518b3a  
    1 import React, { useState, useEffect } from 'react';
     1import React, {useState, useEffect, useContext} from 'react';
    22import axios from 'axios';
    33import 'bootstrap/dist/css/bootstrap.min.css';
    44import {useNavigate} from "react-router-dom";
    55import {jwtDecode} from "jwt-decode";
     6import {RestaurantContext} from "./RestaurantContext";
    67
    78
    89const Reservations = () => {
    910    const navigate = useNavigate();
    10 
     11    const { restaurants } = useContext(RestaurantContext);
    1112    const [reservations, setReservations] = useState([]);
    1213
     
    2425                const response = await axios.get(`http://localhost:8081/api/reservations/by/${userId}`);
    2526                setReservations(response.data);
    26                 console.log(response.data)
    2727            } catch (error) {
    2828                console.error('Error fetching reservations:', error);
     
    6363                                <div className="card-body">
    6464                                    <h5 className="card-title">Reservation ID: {reservation.reservationID}</h5>
    65                                     <p className="card-text">Restaurant: {reservation?.restaurant.name || "Not specified"}</p>
    66                                     <p className="card-text">Table Number: {reservation?.tableNumber || "Not specified"}</p>
     65                                    <p className="card-text">
     66                                        Restaurant: {
     67                                        restaurants.find(r => r.restaurantId === reservation.restaurantId)?.name || "Not specified"
     68                                    }
     69                                    </p>
     70
     71                                    <p className="card-text">Table
     72                                        Number: {reservation?.tableNumber || "Not specified"}</p>
    6773                                    <p className="card-text">
    6874                                        Reservation Date: {reservation.checkInTime ?
     
    9399                                            <h5 className="text-primary">Pre-Ordered Items:</h5>
    94100                                            <ul className="list-group mb-3">
    95                                                 {reservation.preOrderedItems.map((itemStr, index) => {
    96                                                     const parts = itemStr.split(':');
    97                                                     const name = parts[0];
    98                                                     const quantity = parseInt(parts[1], 10) || 0;
    99                                                     const price = parseFloat(parts[2]) || 0;
    100 
    101                                                     return (
    102                                                         <li key={index} className="list-group-item d-flex justify-content-between align-items-center">
    103                                                             <span><strong>{name}</strong> × {quantity}</span>
    104                                                             <span className="badge bg-success rounded-pill">${(price * quantity).toFixed(2)}</span>
    105                                                         </li>
    106                                                     );
    107                                                 })}
     101                                                {reservation.preOrderedItems.map((item, index) => (
     102                                                    <li key={index} className="list-group-item d-flex justify-content-between align-items-center">
     103                                                        <span><strong>{item.name}</strong> × {item.quantity}</span>
     104                                                        <span className="badge bg-success rounded-pill">${(item.price * item.quantity).toFixed(2)}</span>
     105                                                    </li>
     106                                                ))}
    108107                                            </ul>
    109108
    110109                                            <div className="alert alert-info text-center" role="alert">
    111                                                 <h5>Grand Total: ${reservation.preOrderedItems.reduce((acc, itemStr) => {
    112                                                     const parts = itemStr.split(':');
    113                                                     const quantity = parseInt(parts[1], 10) || 0;
    114                                                     const price = parseFloat(parts[2]) || 0;
    115                                                     return acc + (quantity * price);
    116                                                 }, 0).toFixed(2)}</h5>
     110                                                <h5>Grand Total: ${reservation.preOrderedItems.reduce((acc, item) => acc + (item.quantity * item.price), 0).toFixed(2)}</h5>
    117111                                            </div>
    118112                                        </div>
  • my-react-app/src/components/RestaurantContext.js

    re15e8d9 r2518b3a  
    88
    99    useEffect(() => {
     10        if (restaurants.length > 0) return;
    1011        const fetchRestaurants = async () => {
    1112            try {
    1213                const response = await axios.get('http://localhost:8081/api/restaurants');
     14                console.log("Fetched once", response.data);
    1315                setRestaurants(response.data);
    1416            } catch (error) {
     
    1618            }
    1719        };
    18 
    1920        fetchRestaurants();
    2021    }, []);
  • my-react-app/src/components/Restaurants.js

    re15e8d9 r2518b3a  
    2626    const navigate = useNavigate();
    2727    const restaurantContext = useContext(RestaurantContext);
     28    console.log(restaurantContext)
    2829
    2930    useEffect(() => {
  • src/main/java/com/example/rezevirajmasa/demo/dto/ReservationDTO.java

    re15e8d9 r2518b3a  
    11package com.example.rezevirajmasa.demo.dto;
    22
     3import com.example.rezevirajmasa.demo.model.PreorderedItem;
    34import com.example.rezevirajmasa.demo.model.Reservation;
    45import com.example.rezevirajmasa.demo.model.Restaurant;
     
    1516    private LocalDateTime reservationDateTime;
    1617    private LocalDateTime checkInTime;
    17     private Restaurant restaurant;
     18    private Long restaurantId;
    1819    private int partySize;
    1920    private String status;
    2021    private String specialRequests;
    2122    private String paymentStatus;
    22     private List<String> preOrderedItems;
    23 
     23    private List<PreorderedItem> preOrderedItems;
    2424
    2525    public ReservationDTO() {
    2626    }
    2727
    28     public ReservationDTO(Long reservationID, String userEmail, BigDecimal rating, Long tableNumber, LocalDateTime reservationDateTime, LocalDateTime checkInTime, Restaurant restaurant, int partySize, String status, String specialRequests, String paymentStatus, List<String> preOrderedItems) {
     28    public ReservationDTO(Long reservationID, String userEmail, BigDecimal rating, Long tableNumber, LocalDateTime reservationDateTime, LocalDateTime checkInTime, Long restaurantId, int partySize, String status, String specialRequests, String paymentStatus, List<PreorderedItem> preOrderedItems) {
    2929        this.reservationID = reservationID;
    3030        this.userEmail = userEmail;
     
    3333        this.reservationDateTime = reservationDateTime;
    3434        this.checkInTime = checkInTime;
    35         this.restaurant = restaurant;
     35        this.reservationID = restaurantId;
    3636        this.partySize = partySize;
    3737        this.status = status;
     
    4848        this.reservationDateTime = reservation.getReservationDateTime();
    4949        this.checkInTime = reservation.getCheckInTime();
    50         this.restaurant = reservation.getRestaurant();
     50        this.restaurantId = reservation.getRestaurant().getRestaurantId();
    5151        this.partySize = reservation.getPartySize();
    5252        this.status = reservation.getStatus();
     
    5454        this.paymentStatus = reservation.getPaymentStatus();
    5555        this.preOrderedItems = reservation.getPreOrderedItems();
    56     }
    57 
    58     public List<String> getPreOrderedItems() {
    59         return preOrderedItems;
    60     }
    61 
    62     public void setPreOrderedItems(List<String> preOrderedItems) {
    63         this.preOrderedItems = preOrderedItems;
    6456    }
    6557
     
    112104    }
    113105
    114     public Restaurant getRestaurant() {
    115         return restaurant;
     106    public Long getRestaurantId() {
     107        return restaurantId;
    116108    }
    117109
    118     public void setRestaurant(Restaurant restaurant) {
    119         this.restaurant = restaurant;
     110    public void setRestaurantId(Long restaurantId) {
     111        this.restaurantId = restaurantId;
    120112    }
    121113
     
    151143        this.paymentStatus = paymentStatus;
    152144    }
     145
     146    public List<PreorderedItem> getPreOrderedItems() {
     147        return preOrderedItems;
     148    }
     149
     150    public void setPreOrderedItems(List<PreorderedItem> preOrderedItems) {
     151        this.preOrderedItems = preOrderedItems;
     152    }
    153153}
  • src/main/java/com/example/rezevirajmasa/demo/model/Menu.java

    re15e8d9 r2518b3a  
    66
    77import java.math.BigDecimal;
     8import java.util.ArrayList;
     9import java.util.List;
    810
    911@Entity
     
    1315    @Id
    1416    @GeneratedValue(strategy = GenerationType.IDENTITY)
    15     @Column(name = "MenuID")
     17    @Column(name = "menu_id")
    1618    private Long menuID;
    1719
    1820    @ManyToOne
    19     @JoinColumn(name = "RestaurantID", nullable = false)
     21    @JoinColumn(name = "restaurant_id", nullable = false)
    2022    @JsonIgnore
    2123    private Restaurant restaurant;
    2224
    23     @Column(name = "ItemName", length = 100)
     25    @Column(name = "item_name", length = 100)
    2426    private String itemName;
    2527
    26     @Column(name = "Category", length = 50)
     28    @Column(name = "category", length = 50)
    2729    private String category;
    2830
    29     @Column(name = "Price", precision = 8, scale = 2)
     31    @Column(name = "price", precision = 8, scale = 2)
    3032    private BigDecimal price;
    3133
    32     @Column(name = "Description")
     34    @Column(name = "description")
    3335    private String description;
    3436
    35     @Column(name = "DietaryInformation", columnDefinition = "JSONB")
    36     private String dietaryInformation;
     37    @OneToMany(mappedBy = "menu", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
     38    private List<MenuTag> tags = new ArrayList<>();
    3739
    3840    public Menu() {
    3941    }
    4042
    41     public Menu(Restaurant restaurant, String itemName, String category, BigDecimal price, String description, String dietaryInformation) {
     43    public Menu(Long menuID, Restaurant restaurant, String itemName, String category, BigDecimal price, String description, List<MenuTag> tags) {
     44        this.menuID = menuID;
    4245        this.restaurant = restaurant;
    4346        this.itemName = itemName;
     
    4548        this.price = price;
    4649        this.description = description;
    47         this.dietaryInformation = dietaryInformation;
     50        this.tags = tags;
    4851    }
    4952}
  • src/main/java/com/example/rezevirajmasa/demo/model/Reservation.java

    re15e8d9 r2518b3a  
    2626    @ManyToOne
    2727    @JoinColumn(name = "UserID")
    28     @JsonManagedReference
     28    @JsonBackReference(value = "user-reservations")
    2929    private User user;
    3030
     
    5757    private LocalDateTime checkOutTime;
    5858
    59     @ElementCollection
    60     @CollectionTable(name = "reservation_preordered_items", joinColumns = @JoinColumn(name = "reservation_id"))
    61     @Column(name = "item")
    62     private List<String> preOrderedItems = new ArrayList<>();
     59//    @ElementCollection
     60//    @CollectionTable(name = "reservation_preordered_items", joinColumns = @JoinColumn(name = "reservation_id"))
     61//    @Column(name = "item")
     62//    private List<String> preOrderedItems = new ArrayList<>();
     63    @OneToMany(mappedBy = "reservation", cascade = CascadeType.ALL, orphanRemoval = true)
     64    private List<PreorderedItem> preOrderedItems = new ArrayList<>();
    6365
    6466    @Column(name = "PaymentStatus", length = 20, nullable = false, columnDefinition = "VARCHAR default 'Unpaid'")
  • src/main/java/com/example/rezevirajmasa/demo/model/Restaurant.java

    re15e8d9 r2518b3a  
    4141    private BigDecimal rating;
    4242
    43     @JsonIgnore
     43    @JsonManagedReference
    4444    @OneToMany(mappedBy = "restaurant", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    4545    private List<TableEntity> tablesList;
  • src/main/java/com/example/rezevirajmasa/demo/model/TableEntity.java

    re15e8d9 r2518b3a  
    2929
    3030    @JsonBackReference
    31     @ManyToOne(fetch = FetchType.EAGER)
     31    @ManyToOne(fetch = FetchType.LAZY)
    3232    @JoinColumn(name = "RestaurantID")
    3333    private Restaurant restaurant;
  • src/main/java/com/example/rezevirajmasa/demo/service/ReservationService.java

    re15e8d9 r2518b3a  
    1111
    1212public interface ReservationService {
    13     public Reservation makeReservationRest(ReservationDTO reservation, User user);
     13    public Reservation makeReservationRest(ReservationDTO reservation, User user, Restaurant restaurant);
    1414    public List<Reservation> listAll();
    1515    public Reservation updateReservation(Long reservationId, ReservationDTO reservationDTO, User user);
  • src/main/java/com/example/rezevirajmasa/demo/service/impl/ReservationImpl.java

    re15e8d9 r2518b3a  
    2626
    2727import javax.swing.text.html.Option;
     28import java.math.BigDecimal;
    2829import java.time.LocalDateTime;
    2930import java.time.LocalTime;
    3031import java.time.format.DateTimeFormatter;
     32import java.util.ArrayList;
    3133import java.util.List;
    3234import java.util.Optional;
     
    5557
    5658    @Override
    57     public Reservation makeReservationRest(ReservationDTO reservationDTO, User user) {
     59    public Reservation makeReservationRest(ReservationDTO reservationDTO, User user, Restaurant restaurant) {
    5860        Reservation reservation = new Reservation();
    5961
     
    9294            reservation.setPaymentStatus(reservationDTO.getPaymentStatus() != null ? reservationDTO.getPaymentStatus() : "Unpaid");
    9395            reservation.setUser(user);
    94             reservation.setPreOrderedItems(reservationDTO.getPreOrderedItems());
    95             reservation.setRestaurant(reservationDTO.getRestaurant());
     96
     97            List<PreorderedItem> preOrderedItems = new ArrayList<>();
     98
     99            for (PreorderedItem dtoItem : reservationDTO.getPreOrderedItems()) {
     100                PreorderedItem item = new PreorderedItem();
     101                item.setName(dtoItem.getName());
     102                item.setQuantity(dtoItem.getQuantity());
     103                item.setPrice(dtoItem.getPrice());
     104                item.setReservation(reservation);
     105
     106                preOrderedItems.add(item);
     107            }
     108
     109            reservation.setPreOrderedItems(preOrderedItems);
     110            reservation.setRestaurant(restaurant);
    96111            reservation.setCheckInTime(reservationDTO.getReservationDateTime().plusHours(1));
    97112            reservation.setReservationDateTime(LocalDateTime.now());
    98113            reservation.setCheckOutTime(reservationDTO.getReservationDateTime().plusHours(3));
    99             reservation.setRestaurant(reservationDTO.getRestaurant());
    100114
    101115            return reservationRepository.save(reservation);
  • src/main/java/com/example/rezevirajmasa/demo/web/rest/testController.java

    re15e8d9 r2518b3a  
    181181
    182182    @PostMapping("/api/reservations")
    183     public ResponseEntity<?> createReservation(@RequestBody ReservationDTO reservation) {
    184         User user = userService.findByMail(reservation.getUserEmail());
    185         Reservation savedReservation = reservationService.makeReservationRest(reservation, user);
     183    public ResponseEntity<?> createReservation(@RequestBody ReservationDTO reservation){
     184    User user = userService.findByMail(reservation.getUserEmail());
     185    Restaurant restaurant = restaurantService.findByIdRestaurant(reservation.getRestaurantId());
     186        Reservation savedReservation = reservationService.makeReservationRest(reservation, user, restaurant);
    186187
    187188        return new ResponseEntity<>(savedReservation, HttpStatus.CREATED);
     
    227228                                                       @PathVariable String email) {
    228229        User user = userService.findByMail(email);
    229 
     230        Restaurant restaurant = restaurantService.findByIdRestaurant(reservationDTO.getRestaurantId());
    230231        if (!reservationDTO.getReservationID().equals(reservationId)) {
    231232            return ResponseEntity.badRequest().build();
Note: See TracChangeset for help on using the changeset viewer.