First part of backend rework

- Added the base data structure for the new database
- Added the new routes for the new database
- Reworked the users endpoints
This commit is contained in:
2024-02-26 10:20:29 +01:00
parent 902bab14c7
commit 0ddbc437b9
40 changed files with 1237 additions and 1911 deletions

View File

@@ -10,128 +10,28 @@ GRANT ALL PRIVILEGES ON airjet.* TO 'hsp-gdh'@'%';
USE `hsp-gdh`;
CREATE TABLE pilots (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
first_name VARCHAR(255) NOT NULL,
last_name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL,
phone VARCHAR(20) NOT NULL,
license_number VARCHAR(255) NOT NULL,
license_expiry DATE NOT NULL,
salary DECIMAL(10, 2) NOT NULL DEFAULT 0.0,
status VARCHAR(255) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;
CREATE TABLE airplanes (
CREATE TABLE roles (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
type VARCHAR(255) NOT NULL,
manufacturer VARCHAR(255) NOT NULL,
capacity INT NOT NULL,
status VARCHAR(255) NOT NULL,
location VARCHAR(255),
PRIMARY KEY (id)
) ENGINE=InnoDB;
CREATE TABLE airlines (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
code VARCHAR(2) NOT NULL,
logo VARCHAR(255),
PRIMARY KEY (id)
) ENGINE=InnoDB;
CREATE TABLE airports (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
code VARCHAR(3) NOT NULL,
city VARCHAR(255) NOT NULL,
country VARCHAR(255) NOT NULL,
latitude FLOAT NOT NULL,
longitude FLOAT NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;
CREATE TABLE flights (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
airline_id INT UNSIGNED NOT NULL,
pilot_id INT UNSIGNED NOT NULL,
flight_no VARCHAR(10) NOT NULL,
origin_id INT UNSIGNED NOT NULL,
destination_id INT UNSIGNED NOT NULL,
departure_time DATETIME NOT NULL,
arrival_time DATETIME NOT NULL,
duration_minutes INT NOT NULL,
price_economy DECIMAL(10,2) NOT NULL,
price_business DECIMAL(10,2) NOT NULL,
price_first_class DECIMAL(10,2) NOT NULL,
status VARCHAR(255) NOT NULL,
user_bitfield INT UNSIGNED NOT NULL,
role_bitfield INT UNSIGNED NOT NULL,
verification_code_bitfield INT UNSIGNED NOT NULL,
ban_bitfield INT UNSIGNED NOT NULL,
patient_bitfield INT UNSIGNED NOT NULL,
doctor_bitfield INT UNSIGNED NOT NULL,
service_bitfield INT UNSIGNED NOT NULL,
company_bitfield INT UNSIGNED NOT NULL,
hospital_bitfield INT UNSIGNED NOT NULL,
room_bitfield INT UNSIGNED NOT NULL,
appointment_bitfield INT UNSIGNED NOT NULL,
PRIMARY KEY (id),
CONSTRAINT fl_airline_id
FOREIGN KEY (airline_id)
REFERENCES airlines(id)
ON DELETE RESTRICT
ON UPDATE CASCADE,
CONSTRAINT fl_pilot_id
FOREIGN KEY (pilot_id)
REFERENCES pilots(id)
ON DELETE RESTRICT
ON UPDATE CASCADE,
CONSTRAINT fl_origin_id
FOREIGN KEY (origin_id)
REFERENCES airports(id)
ON DELETE RESTRICT
ON UPDATE CASCADE,
CONSTRAINT fl_destination_id
FOREIGN KEY (destination_id)
REFERENCES airports(id)
ON DELETE RESTRICT
ON UPDATE CASCADE
UNIQUE INDEX r_name_idx (name)
) ENGINE=InnoDB;
CREATE TABLE user_types (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
PRIMARY KEY (id),
UNIQUE INDEX ut_name_idx (name)
) ENGINE=InnoDB;
INSERT INTO user_types (name) VALUES ('unverified'), ('customer'), ('support'), ('pilote'), ('staff'), ('admin');
CREATE TABLE permissions (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
PRIMARY KEY (id),
UNIQUE INDEX p_name_idx (name)
) ENGINE=InnoDB;
INSERT INTO permissions (name) VALUES
('view_users'), ('add_users'), ('edit_users'), ('delete_users'),
('view_flights'), ('add_flights'), ('edit_flights'), ('delete_flights'),
('view_airlines'), ('add_airlines'), ('edit_airlines'), ('delete_airlines'),
('view_airplanes'), ('add_airplanes'), ('edit_airplanes'), ('delete_airplanes'),
('view_airports'), ('add_airports'), ('edit_airports'), ('delete_airports'),
('view_seats'), ('add_seats'), ('edit_seats'), ('delete_seats'),
('view_pilots'), ('add_pilots'), ('edit_pilots'), ('delete_pilots');
CREATE TABLE user_type_permissions (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
user_type_id INT UNSIGNED NOT NULL,
permission_id INT UNSIGNED NOT NULL,
PRIMARY KEY (id),
CONSTRAINT utp_user_type_id
FOREIGN KEY (user_type_id)
REFERENCES user_types(id)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT utp_permission_id
FOREIGN KEY (permission_id)
REFERENCES permissions(id)
ON DELETE CASCADE
ON UPDATE CASCADE,
UNIQUE INDEX utp_user_type_permission_idx (user_type_id, permission_id)
) ENGINE=InnoDB;
INSERT INTO roles (name, user_bitfield, role_bitfield, verification_code_bitfield, ban_bitfield, patient_bitfield, doctor_bitfield, service_bitfield, company_bitfield, hospital_bitfield, room_bitfield, appointment_bitfield) VALUES
('Admin', 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7),
('Doctor', 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0),
('Patient', 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0);
CREATE TABLE users (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
@@ -140,19 +40,31 @@ CREATE TABLE users (
username VARCHAR(64) NOT NULL,
password VARCHAR(255) NOT NULL,
email VARCHAR(128) NOT NULL,
email_verified BOOLEAN NOT NULL DEFAULT FALSE,
phone VARCHAR(32) DEFAULT 'None',
user_type_id INT UNSIGNED NOT NULL,
is_banned BOOLEAN NOT NULL DEFAULT 0,
phone_verified BOOLEAN NOT NULL DEFAULT FALSE,
PRIMARY KEY (id),
CONSTRAINT u_user_type_id
FOREIGN KEY (user_type_id)
REFERENCES user_types(id)
ON DELETE RESTRICT
ON UPDATE CASCADE,
INDEX ur_user_type_idx (user_type_id)
) ENGINE=InnoDB;
CREATE TABLE user_email_verifications (
CREATE TABLE user_roles (
user_id INT UNSIGNED NOT NULL,
role_id INT UNSIGNED NOT NULL,
PRIMARY KEY (user_id, role_id),
CONSTRAINT ur_user_id
FOREIGN KEY (user_id)
REFERENCES users(id)
ON DELETE RESTRICT
ON UPDATE CASCADE,
INDEX ur_user_id_idx (user_id),
CONSTRAINT ur_role_id
FOREIGN KEY (role_id)
REFERENCES roles(id)
ON DELETE RESTRICT
ON UPDATE CASCADE,
INDEX ur_role_id_idx (role_id)
) ENGINE=InnoDB;
CREATE TABLE verification_codes (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
user_id INT UNSIGNED NOT NULL,
verification_code VARCHAR(255),
@@ -167,108 +79,169 @@ CREATE TABLE user_email_verifications (
INDEX mv_user_id_idx (user_id)
) ENGINE=InnoDB;
CREATE TABLE seats (
CREATE TABLE bans (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
user_id INT UNSIGNED,
flight_id INT UNSIGNED NOT NULL,
place_no INT UNSIGNED NOT NULL,
class VARCHAR(32) NOT NULL,
bought_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
user_id INT UNSIGNED NOT NULL,
reason TEXT NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
CONSTRAINT ps_user_id
CONSTRAINT bn_user_id
FOREIGN KEY (user_id)
REFERENCES users(id)
ON DELETE RESTRICT
ON UPDATE CASCADE,
CONSTRAINT ps_flight_id
FOREIGN KEY (flight_id)
REFERENCES flights(id)
ON DELETE RESTRICT
ON UPDATE CASCADE,
INDEX ps_user_id_idx (user_id),
INDEX ps_flight_id_idx (flight_id)
INDEX bn_user_id_idx (user_id)
) ENGINE=InnoDB;
INSERT INTO pilots (id, first_name, last_name, email, phone, license_number, license_expiry, salary, status) VALUES
(1, 'John', 'Doe', 'john.doe@example.com', '555-1234', '1234-5678', '2025-06-30', 75000.00, 'Active'),
(2, 'Jane', 'Smith', 'jane.smith@example.com', '555-5678', '9876-5432', '2024-12-31', 80000.00, 'Active'),
(3, 'Bob', 'Johnson', 'bob.johnson@example.com', '555-7890', '3456-7890', '2023-09-30', 70000.00, 'Inactive'),
(4, 'Alice', 'Lee', 'alice.lee@example.com', '555-2345', '5678-1234', '2024-03-31', 85000.00, 'Active'),
(5, 'David', 'Nguyen', 'david.nguyen@example.com', '555-5678', '1234-5678', '2023-12-31', 75000.00, 'Active'),
(6, 'Maria', 'Garcia', 'maria.garcia@example.com', '555-7890', '9876-5432', '2024-06-30', 70000.00, 'Active'),
(7, 'Mohammed', 'Ali', 'mohammed.ali@example.com', '555-2345', '3456-7890', '2025-09-30', 85000.00, 'Inactive'),
(8, 'Sofia', 'Martinez', 'sofia.martinez@example.com', '555-3456', '5678-1234', '2022-03-31', 80000.00, 'Active');
CREATE TABLE doctors (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
user_id INT UNSIGNED NOT NULL,
email VARCHAR(255) NOT NULL,
phone VARCHAR(20) NOT NULL,
speciality VARCHAR(255) NOT NULL,
status VARCHAR(255) NOT NULL,
PRIMARY KEY (id),
CONSTRAINT dt_user_id
FOREIGN KEY (user_id)
REFERENCES users(id)
ON DELETE RESTRICT
ON UPDATE CASCADE,
INDEX dt_user_id_idx (user_id)
) ENGINE=InnoDB;
INSERT INTO airplanes (id, name, type, manufacturer, capacity, status, location) VALUES
(1, 'Boeing 747', 'Jet', 'Boeing', 660, 'Active', 'Los Angeles'),
(2, 'Airbus A320', 'Jet', 'Airbus', 180, 'Active', 'New York'),
(3, 'Embraer E175', 'Jet', 'Embraer', 78, 'Inactive', 'Miami'),
(4, 'Boeing 737', 'Jet', 'Boeing', 160, 'Active', 'Chicago'),
(5, 'Airbus A330', 'Jet', 'Airbus', 440, 'Active', 'Paris'),
(6, 'Bombardier CRJ900', 'Jet', 'Bombardier', 88, 'Active', 'Montreal'),
(7, 'Boeing 777', 'Jet', 'Boeing', 396, 'Inactive', 'London'),
(8, 'Airbus A380', 'Jet', 'Airbus', 853, 'Active', 'Dubai'),
(9, 'Embraer E190', 'Jet', 'Embraer', 114, 'Active', 'Buenos Aires'),
(10, 'Boeing 787', 'Jet', 'Boeing', 335, 'Active', 'Tokyo'),
(11, 'Boeing 747-8', 'Jet', 'Boeing', 605, 'Active', 'Hong Kong'),
(12, 'Airbus A350', 'Jet', 'Airbus', 440, 'Active', 'Dublin'),
(13, 'Embraer E195', 'Jet', 'Embraer', 124, 'Inactive', 'Rio de Janeiro'),
(14, 'Boeing 737 MAX', 'Jet', 'Boeing', 230, 'Active', 'Seattle'),
(15, 'Airbus A321', 'Jet', 'Airbus', 236, 'Active', 'Shanghai');
CREATE TABLE patients (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
user_id INT UNSIGNED NOT NULL,
date_of_birth DATE NOT NULL,
gender ENUM('M', 'F', 'O') NOT NULL,
address VARCHAR(255) NOT NULL,
social_security_number VARCHAR(128) NOT NULL,
insurance_number VARCHAR(128) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;
INSERT INTO airlines (id, name, code, logo) VALUES
(1, 'Delta Air Lines', 'DL', 'https://www.delta.com/content/dam/delta-com/brand-icons/Delta_Icon_blue_72.png'),
(2, 'American Airlines', 'AA', 'https://www.aa.com/content/dam/aa-com/logo-web/aa-logo-blue-and-red-horz.png'),
(3, 'United Airlines', 'UA', 'https://www.united.com/web/en-US/content/images/global/header/header-united-logo.png'),
(4, 'Southwest Airlines', 'WN', 'https://www.southwest.com/etc/designs/southwest/v2/images/swa-logo--mod.svg'),
(5, 'Alaska Airlines', 'AS', 'https://www.alaskaair.com/content/dam/alaskaair/logo/2016/alaska-airlines-horiz-white-blue-1x.png'),
(6, 'JetBlue Airways', 'B6', 'https://www.jetblue.com/etc/designs/jetblue/clientlibs/dist/images/svg/jetblue-logo.svg'),
(7, 'Spirit Airlines', 'NK', 'https://www.spirit.com/images/spirit-logo.png'),
(8, 'Frontier Airlines', 'F9', 'https://www.flyfrontier.com/etc/designs/frontier-airlines/clientlibs/dist/images/f9-logo-horz.svg'),
(9, 'Air France', 'AF', 'https://www.airfrance.com/etc/designs/airfrance/clientlibs/dist/images/global/logo/airfrance-logo-blue.svg'),
(10, 'Transavia France', 'TO', 'https://www.transavia.com/content/dam/airlines/tv/fra/fr/common/img/logo.svg'),
(11, 'EasyJet France', 'U2', 'https://www.easyjet.com/etc/designs/easyjet/clientlibs/dist/images/logo.svg'),
(12, 'Corsair International', 'SS', 'https://www.corsair.fr/etc/designs/corsair/clientlibs/dist/images/logo.svg'),
(13, 'XL Airways France', 'SE', 'https://www.xl.com/assets/images/XL-logo.png'),
(14, 'Aigle Azur', 'ZI', 'https://www.aigle-azur.com/site/sites/all/themes/aigle-azur/images/logo-aigle-azur-160x80.png');
CREATE TABLE services (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
description TEXT NOT NULL,
price DECIMAL(10, 2) NOT NULL,
status VARCHAR(255) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;
INSERT INTO airports (id, name, code, city, country, latitude, longitude) VALUES
(1, 'John F. Kennedy International Airport', 'JFK', 'New York', 'United States', 40.6413, -73.7781),
(2, 'Los Angeles International Airport', 'LAX', 'Los Angeles', 'United States', 33.9416, -118.4085),
(3, 'London Heathrow Airport', 'LHR', 'London', 'United Kingdom', 51.4700, -0.4543),
(4, 'Paris-Charles de Gaulle Airport', 'CDG', 'Paris', 'France', 49.0097, 2.5479),
(5, 'Tokyo Haneda Airport', 'HND', 'Tokyo', 'Japan', 35.5532, 139.7818),
(6, 'Dubai International Airport', 'DXB', 'Dubai', 'United Arab Emirates', 25.2528, 55.3644),
(7, 'Sydney Kingsford Smith Airport', 'SYD', 'Sydney', 'Australia', -33.9461, 151.1772),
(8, 'São Paulo-Guarulhos International Airport', 'GRU', 'São Paulo', 'Brazil', -23.4356, -46.4731),
(9, 'Jomo Kenyatta International Airport', 'NBO', 'Nairobi', 'Kenya', -1.3192, 36.9258),
(10, 'Cairo International Airport', 'CAI', 'Cairo', 'Egypt', 30.1111, 31.4139),
(11, 'Paris Orly Airport', 'ORY', 'Paris', 'France', 48.7262, 2.3650),
(12, 'Nice Côte d''Azur Airport', 'NCE', 'Nice', 'France', 43.6584, 7.2157),
(13, 'Marseille Provence Airport', 'MRS', 'Marseille', 'France', 43.4393, 5.2214),
(14, 'Lyon-Saint-Exupéry Airport', 'LYS', 'Lyon', 'France', 45.7216, 5.0790),
(15, 'Bordeaux-Mérignac Airport', 'BOD', 'Bordeaux', 'France', 44.8283, -0.7156),
(16, 'Toulouse-Blagnac Airport', 'TLS', 'Toulouse', 'France', 43.6356, 1.3678),
(17, 'Nantes Atlantique Airport', 'NTE', 'Nantes', 'France', 47.1567, -1.6114),
(18, 'Strasbourg Airport', 'SXB', 'Strasbourg', 'France', 48.5442, 7.6277),
(19, 'Lille Airport', 'LIL', 'Lille', 'France', 50.5633, 3.0897),
(20, 'Brest Bretagne Airport', 'BES', 'Brest', 'France', 48.4472, -4.4228),
(21, 'Vienna International Airport', 'VIE', 'Vienna', 'Austria', 48.1197, 16.5667),
(22, 'Zürich Airport', 'ZRH', 'Zürich', 'Switzerland', 47.4502, 8.5618),
(23, 'Amsterdam Airport Schiphol', 'AMS', 'Amsterdam', 'Netherlands', 52.3081, 4.7642),
(24, 'Frankfurt Airport', 'FRA', 'Frankfurt', 'Germany', 50.0379, 8.5622),
(25, 'Barcelona-El Prat Airport', 'BCN', 'Barcelona', 'Spain', 41.2974, 2.0833),
(26, 'Adolfo Suárez Madrid-Barajas Airport', 'MAD', 'Madrid', 'Spain', 40.4936, -3.5668),
(27, 'Leonardo da Vinci-Fiumicino Airport', 'FCO', 'Rome', 'Italy', 41.8003, 12.2388),
(28, 'Stockholm Arlanda Airport', 'ARN', 'Stockholm', 'Sweden', 59.6519, 17.9186);
CREATE TABLE service_doctors (
service_id INT UNSIGNED NOT NULL,
doctor_id INT UNSIGNED NOT NULL,
PRIMARY KEY (service_id, doctor_id),
CONSTRAINT sd_service_id
FOREIGN KEY (service_id)
REFERENCES services(id)
ON DELETE RESTRICT
ON UPDATE CASCADE,
INDEX sd_service_id_idx (service_id),
CONSTRAINT sd_doctor_id
FOREIGN KEY (doctor_id)
REFERENCES doctors(id)
ON DELETE RESTRICT
ON UPDATE CASCADE,
INDEX sd_doctor_id_idx (doctor_id)
) ENGINE=InnoDB;
INSERT INTO flights (id, airline_id, pilot_id, flight_no, origin_id, destination_id, departure_time, arrival_time, duration_minutes, price_economy, price_business, price_first_class, status) VALUES
(1, 1, 1, 'BA123', 1, 2, '2023-03-15 08:00:00', '2023-03-15 10:00:00', 120, 100, 200, 300, 'scheduled'),
(2, 2, 2, 'AF456', 2, 3, '2023-03-16 14:00:00', '2023-03-16 16:30:00', 150, 80, 150, 250, 'scheduled'),
(3, 3, 3, 'LH789', 4, 5, '2023-03-17 09:30:00', '2023-03-17 12:00:00', 150, 90, 170, 280, 'scheduled'),
(4, 1, 4, 'BA345', 2, 5, '2023-03-18 07:00:00', '2023-03-18 10:00:00', 180, 120, 240, 400, 'scheduled'),
(5, 4, 5, 'EZY678', 3, 1, '2023-03-19 11:00:00', '2023-03-19 13:00:00', 120, 60, 120, 200, 'scheduled'),
(6, 2, 6, 'AF901', 5, 6, '2023-03-20 16:30:00', '2023-03-20 19:00:00', 150, 100, 200, 350, 'scheduled');
CREATE TABLE companies (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
code VARCHAR(2) NOT NULL,
logo VARCHAR(255),
PRIMARY KEY (id)
) ENGINE=InnoDB;
INSERT INTO `user_type_permissions` (`user_type_id`, `permission_id`) VALUES
('6', '1'),('6', '2'),('6', '3'),('6', '4'),('6', '5'),('6', '6'),('6', '7'),('6', '8'),('6', '9'),('6', '10'),('6', '11'),('6', '12'),('6', '13'),('6', '14'),('6', '15'),('6', '16'),('6', '17'),('6', '18'),('6', '19'),('6', '20'),('6', '21'),('6', '22'),('6', '23'),('6', '24'),('6', '25'),('6', '26'),('6', '27'),('6', '28');
CREATE TABLE hospitals (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
company_id INT UNSIGNED NOT NULL,
name VARCHAR(255) NOT NULL,
code VARCHAR(3) NOT NULL,
country VARCHAR(255) NOT NULL,
region VARCHAR(255) NOT NULL,
city VARCHAR(255) NOT NULL,
address VARCHAR(255) NOT NULL,
PRIMARY KEY (id),
CONSTRAINT hs_company_id
FOREIGN KEY (company_id)
REFERENCES companies(id)
ON DELETE RESTRICT
ON UPDATE CASCADE,
INDEX hs_company_id_idx (company_id)
) ENGINE=InnoDB;
CREATE TABLE rooms (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
hospital_id INT UNSIGNED NOT NULL,
name VARCHAR(255) NOT NULL,
PRIMARY KEY (id)
CONSTRAINT ch_hospital_id
FOREIGN KEY (hospital_id)
REFERENCES hospitals(id)
ON DELETE RESTRICT
ON UPDATE CASCADE,
) ENGINE=InnoDB;
CREATE TABLE hospital_doctors (
hospital_id INT UNSIGNED NOT NULL,
doctor_id INT UNSIGNED NOT NULL,
PRIMARY KEY (hospital_id, doctor_id),
CONSTRAINT hd_hospital_id
FOREIGN KEY (hospital_id)
REFERENCES hospitals(id)
ON DELETE RESTRICT
ON UPDATE CASCADE,
INDEX hd_hospital_id_idx (hospital_id),
CONSTRAINT hd_doctor_id
FOREIGN KEY (doctor_id)
REFERENCES doctors(id)
ON DELETE RESTRICT
ON UPDATE CASCADE,
INDEX hd_doctor_id_idx (doctor_id)
) ENGINE=InnoDB;
CREATE TABLE appointments (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
patient_id INT UNSIGNED NOT NULL,
doctor_id INT UNSIGNED NOT NULL,
service_id INT UNSIGNED NOT NULL,
hospital_id INT UNSIGNED DEFAULT NULL,
room_id INT UNSIGNED DEFAULT NULL,
date DATE NOT NULL,
time TIME NOT NULL,
status VARCHAR(255) NOT NULL,
PRIMARY KEY (id)
CONSTRAINT ap_patient_id
FOREIGN KEY (patient_id)
REFERENCES patients(id)
ON DELETE RESTRICT
ON UPDATE CASCADE,
INDEX ap_patient_id_idx (patient_id),
CONSTRAINT ap_doctor_id
FOREIGN KEY (doctor_id)
REFERENCES doctors(id)
ON DELETE RESTRICT
ON UPDATE CASCADE,
INDEX ap_doctor_id_idx (doctor_id),
CONSTRAINT ap_service_id
FOREIGN KEY (service_id)
REFERENCES services(id)
ON DELETE RESTRICT
ON UPDATE CASCADE,
INDEX ap_service_id_idx (service_id),
CONSTRAINT ap_hospital_id
FOREIGN KEY (hospital_id)
REFERENCES hospitals(id)
ON DELETE RESTRICT
ON UPDATE CASCADE,
INDEX ap_hospital_id_idx (hospital_id),
CONSTRAINT ap_room_id
FOREIGN KEY (room_id)
REFERENCES rooms(id)
ON DELETE RESTRICT
ON UPDATE CASCADE,
INDEX ap_room_id_idx (room_id)
) ENGINE=InnoDB;