diff --git a/backend/scheme.sql b/backend/scheme.sql deleted file mode 100644 index 400bc31..0000000 --- a/backend/scheme.sql +++ /dev/null @@ -1,100 +0,0 @@ --- All necessary tables for the borrowing system - --- IMPORTANT: You need mySQL version 8.0 or newer! - -CREATE TABLE `users` ( - `id` int NOT NULL AUTO_INCREMENT, - `username` varchar(100) NOT NULL, - `password` varchar(255) NOT NULL, - `role` int DEFAULT NULL, - `entry_created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - UNIQUE KEY `username` (`username`) -); - -CREATE TABLE `admins` ( - `id` int NOT NULL AUTO_INCREMENT, - `username` varchar(100) NOT NULL, - `password` varchar(255) NOT NULL, - `first_name` varchar(255) NOT NULL, - `last_name` varchar(255) NOT NULL, - `entry_created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - UNIQUE KEY `username` (`username`) -); - -CREATE TABLE `loans` ( - `id` int NOT NULL AUTO_INCREMENT, - `username` varchar(100) NOT NULL, - `loan_code` int NOT NULL, - `start_date` timestamp NOT NULL, - `end_date` timestamp NOT NULL, - `take_date` timestamp NULL DEFAULT NULL, - `returned_date` timestamp NULL DEFAULT NULL, - `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, - `loaned_items_id` json NOT NULL DEFAULT ('[]'), - `loaned_items_name` json NOT NULL DEFAULT ('[]'), - `deleted` bool NOT NULL DEFAULT false, - PRIMARY KEY (`id`), - UNIQUE KEY `loan_code` (`loan_code`) -); - -CREATE TABLE `items` ( - `id` int NOT NULL AUTO_INCREMENT, - `item_name` varchar(255) NOT NULL, - `can_borrow_role` INT NOT NULL, - `inSafe` tinyint(1) NOT NULL DEFAULT '1', - `entry_created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - UNIQUE KEY `item_name` (`item_name`) -); - -CREATE TABLE `lockers` ( - `id` int NOT NULL AUTO_INCREMENT, - `item` varchar(255) NOT NULL, - `locker_number` int NOT NULL, - `entry_created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - UNIQUE KEY `item` (`item`), - UNIQUE KEY `locker_number` (`locker_number`) -); - -CREATE TABLE `apiKeys` ( - `id` int NOT NULL AUTO_INCREMENT, - `apiKey` int NOT NULL UNIQUE, - `user` VARCHAR(255) NOT NULL, - `entry_created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`) -); - -INSERT INTO `items` (`item_name`, `can_borrow_role`, `inSafe`) VALUES -('DJI 1er Mikro', 4, 1), -('DJI 2er Mikro 1', 4, 1), -('DJI 2er Mikro 2', 4, 1), -('Rode Richt Mikrofon', 2, 1), -('Kamera Stativ', 1, 0), -('SONY Kamera - inkl. Akkus und Objektiv', 1, 1), -('MacBook inkl. Adapter', 2, 0), -('SD Karten', 3, 0), -('Kameragimbal', 1, 0), -('ATEM MINI PRO', 1, 1), -('Handygimbal', 4, 0), -('Kameralüfter', 1, 1), -('Kleine Kamera 1 - inkl. Objektiv', 2, 1), -('Kleine Kamera 2 - inkl. Objektiv', 2, 1); - -INSERT INTO `lockers` (`item`, `locker_number`) VALUES -('DJI 1er Mikro', 1), -('DJI 2er Mikro 1', 2), -('DJI 2er Mikro 2', 3), -('Rode Richt Mikrofon', 4), -('Kamera Stativ', 5), -('SONY Kamera - inkl. Akkus und Objektiv', 6), -('MacBook inkl. Adapter', 7), -('SD Karten', 8), -('Kameragimbal', 9), -('ATEM MINI PRO', 10), -('Handygimbal', 11), -('Kameralüfter', 12), -('Kleine Kamera 1 - inkl. Objektiv', 13), -('Kleine Kamera 2 - inkl. Objektiv', 14); \ No newline at end of file diff --git a/backend/scheme.xlsx b/backend/scheme.xlsx new file mode 100644 index 0000000..3186469 Binary files /dev/null and b/backend/scheme.xlsx differ diff --git a/backend/schemeV2.mock_data.sql b/backend/schemeV2.mock_data.sql new file mode 100644 index 0000000..a1abace --- /dev/null +++ b/backend/schemeV2.mock_data.sql @@ -0,0 +1,89 @@ +USE borrow_system_new; + +-- Optional: keep insert order predictable +SET time_zone = '+00:00'; + +-- Users +INSERT INTO users (username, password, first_name, last_name, role, is_admin) +VALUES + ('alice', 'password123', 'Alice', 'Andersen', 1, false), + ('bob', 'password123', 'Bob', 'Berg', 2, false), + ('carol', 'password123', 'Carol', 'Christie', 2, false), + ('dave', 'password123', 'Dave', 'Dawson', 1, false), + ('eve', 'password123', 'Eve', 'Evans', 1, false), + ('admin', 'password123', 'Admin', 'User', 3, true); + +-- Items +INSERT INTO items (item_name, can_borrow_role, in_safe, last_borrowed_person, currently_borrowing) +VALUES + ('Canon EOS 90D Camera', 1, false, 'bob', 'alice'), + ('Rode NT1 Microphone', 1, true, 'dave', NULL), + ('MacBook Pro 13', 2, false, 'bob', 'carol'), + ('Tripod Manfrotto', 1, false, 'carol', 'alice'), + ('LED Panel Aputure', 1, true, NULL, NULL), + ('Zoom H6 Recorder', 1, true, 'dave', NULL), + ('Wacom Intuos Tablet', 1, true, NULL, NULL), + ('DJI Ronin-S Gimbal', 2, true, NULL, NULL), + ('Sony A7 III Body', 2, false, 'carol', 'eve'), + ('Sigma 24-70mm Lens', 2, false, 'carol', 'eve'); + +-- Capture item IDs for JSON arrays +SET @id_canon = (SELECT id FROM items WHERE item_name='Canon EOS 90D Camera'); +SET @id_rode = (SELECT id FROM items WHERE item_name='Rode NT1 Microphone'); +SET @id_mac13 = (SELECT id FROM items WHERE item_name='MacBook Pro 13'); +SET @id_tripod = (SELECT id FROM items WHERE item_name='Tripod Manfrotto'); +SET @id_led = (SELECT id FROM items WHERE item_name='LED Panel Aputure'); +SET @id_zoom = (SELECT id FROM items WHERE item_name='Zoom H6 Recorder'); +SET @id_tablet = (SELECT id FROM items WHERE item_name='Wacom Intuos Tablet'); +SET @id_ronin = (SELECT id FROM items WHERE item_name='DJI Ronin-S Gimbal'); +SET @id_sony = (SELECT id FROM items WHERE item_name='Sony A7 III Body'); +SET @id_sigma = (SELECT id FROM items WHERE item_name='Sigma 24-70mm Lens'); + +-- Loans +INSERT INTO loans ( + username, loan_code, start_date, end_date, take_date, returned_date, loaned_items_id, loaned_items_name, deleted +) VALUES + -- Ongoing loan: Alice has Canon + Tripod + ('alice', 100001, '2025-10-01 09:00:00', '2025-10-08 17:00:00', '2025-10-01 09:15:00', NULL, + JSON_ARRAY(@id_canon, @id_tripod), + JSON_ARRAY('Canon EOS 90D Camera','Tripod Manfrotto'), + false + ), + -- Ongoing loan: Carol has MacBook Pro 13 + ('carol', 100002, '2025-10-03 10:00:00', '2025-10-10 16:00:00', '2025-10-03 10:05:00', NULL, + JSON_ARRAY(@id_mac13), + JSON_ARRAY('MacBook Pro 13'), + false + ), + -- Returned loan: Dave had Zoom + Rode + ('dave', 100003, '2025-09-10 08:30:00', '2025-09-12 16:00:00', '2025-09-10 08:45:00', '2025-09-12 15:40:00', + JSON_ARRAY(@id_zoom, @id_rode), + JSON_ARRAY('Zoom H6 Recorder','Rode NT1 Microphone'), + false + ), + -- Cancelled/deleted booking (never taken): Bob reserved Tablet + ('bob', 100004, '2025-10-05 09:00:00', '2025-10-06 09:00:00', NULL, NULL, + JSON_ARRAY(@id_tablet), + JSON_ARRAY('Wacom Intuos Tablet'), + true + ), + -- Ongoing loan, likely overdue: Eve has Sony + Sigma + ('eve', 100005, '2025-10-15 11:00:00', '2025-10-20 12:00:00', '2025-10-15 11:10:00', NULL, + JSON_ARRAY(@id_sony, @id_sigma), + JSON_ARRAY('Sony A7 III Body','Sigma 24-70mm Lens'), + false + ), + -- Completed single-day loan: Bob used LED panel + ('bob', 100006, '2025-09-20 13:00:00', '2025-09-20 18:00:00', '2025-09-20 13:05:00', '2025-09-20 17:30:00', + JSON_ARRAY(@id_led), + JSON_ARRAY('LED Panel Aputure'), + false + ); + +-- API keys +INSERT INTO apiKeys (api_key, username) +VALUES + (71002123, 'alice'), + (71002124, 'bob'), + (71002125, 'carol'), + (99999999, 'admin'); \ No newline at end of file diff --git a/backend/schemeV2.sql b/backend/schemeV2.sql index d5999b2..31c26bd 100644 --- a/backend/schemeV2.sql +++ b/backend/schemeV2.sql @@ -1,110 +1,57 @@ --- All necessary tables for the borrowing system +use borrow_system_new; --- IMPORTANT: You need mySQL version 8.0 or newer! +CREATE TABLE users ( + id int NOT NULL AUTO_INCREMENT, + username varchar(100) NOT NULL UNIQUE, + password varchar(255) NOT NULL, + first_name varchar(255) NOT NULL, + last_name varchar(255) NOT NULL, + role int NOT NULL, + is_admin bool NOT NULL DEFAULT false, + entry_created_at timestamp NULL DEFAULT CURRENT_TIMESTAMP, + entry_updated_at timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (id) +) ENGINE=InnoDB; -CREATE TABLE `users` ( - `id` int NOT NULL AUTO_INCREMENT, - `username` varchar(100) NOT NULL, - `password` varchar(255) NOT NULL, - `role` int DEFAULT NULL, - `entry_created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - UNIQUE KEY `username` (`username`) +CREATE TABLE loans ( + id int NOT NULL AUTO_INCREMENT, + username varchar(100) NOT NULL, + loan_code int NOT NULL UNIQUE, + start_date timestamp NOT NULL, + end_date timestamp NOT NULL, + take_date timestamp NULL DEFAULT NULL, + returned_date timestamp NULL DEFAULT NULL, + created_at timestamp NULL DEFAULT CURRENT_TIMESTAMP, + loaned_items_id json NOT NULL DEFAULT ('[]'), + loaned_items_name json NOT NULL DEFAULT ('[]'), + deleted bool NOT NULL DEFAULT false, + PRIMARY KEY (id), + CONSTRAINT fk_loans_username + FOREIGN KEY (username) REFERENCES users(username) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB; + +CREATE TABLE items ( + id int NOT NULL AUTO_INCREMENT, + item_name varchar(255) NOT NULL UNIQUE, + can_borrow_role INT NOT NULL, + in_safe bool NOT NULL DEFAULT true, + entry_created_at timestamp NULL DEFAULT CURRENT_TIMESTAMP, + entry_updated_at timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + last_borrowed_person varchar(255) DEFAULT NULL, + currently_borrowing varchar(255) DEFAULT NULL, + PRIMARY KEY (id) ); -CREATE TABLE `users` ( - id int NOT NULL AUTO_INCREMENT, - username varchar(100) NOT NULL UNIQUE, - password varchar(255) NOT NULL, - role int NOT NULL, - entry_created_at timestamp NULL DEFAULT CURRENT_TIMESTAMP, - isAdmin boolean NOT NULL DEFAULT false, - PRIMARY KEY (id) -) - -CREATE TABLE `admins` ( - `id` int NOT NULL AUTO_INCREMENT, - `username` varchar(100) NOT NULL, - `password` varchar(255) NOT NULL, - `first_name` varchar(255) NOT NULL, - `last_name` varchar(255) NOT NULL, - `entry_created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - UNIQUE KEY `username` (`username`) -); - -CREATE TABLE `loans` ( - `id` int NOT NULL AUTO_INCREMENT, - `username` varchar(100) NOT NULL, - `loan_code` int NOT NULL, - `start_date` timestamp NOT NULL, - `end_date` timestamp NOT NULL, - `take_date` timestamp NULL DEFAULT NULL, - `returned_date` timestamp NULL DEFAULT NULL, - `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, - `loaned_items_id` json NOT NULL DEFAULT ('[]'), - `loaned_items_name` json NOT NULL DEFAULT ('[]'), - `deleted` bool NOT NULL DEFAULT false, - PRIMARY KEY (`id`), - UNIQUE KEY `loan_code` (`loan_code`) -); - -CREATE TABLE `items` ( - `id` int NOT NULL AUTO_INCREMENT, - `item_name` varchar(255) NOT NULL, - `can_borrow_role` INT NOT NULL, - `inSafe` tinyint(1) NOT NULL DEFAULT '1', - `entry_created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - UNIQUE KEY `item_name` (`item_name`) -); - -CREATE TABLE `lockers` ( - `id` int NOT NULL AUTO_INCREMENT, - `item` varchar(255) NOT NULL, - `locker_number` int NOT NULL, - `entry_created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`), - UNIQUE KEY `item` (`item`), - UNIQUE KEY `locker_number` (`locker_number`) -); - -CREATE TABLE `apiKeys` ( - `id` int NOT NULL AUTO_INCREMENT, - `apiKey` int NOT NULL UNIQUE, - `user` VARCHAR(255) NOT NULL, - `entry_created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`id`) -); - -INSERT INTO `items` (`item_name`, `can_borrow_role`, `inSafe`) VALUES -('DJI 1er Mikro', 4, 1), -('DJI 2er Mikro 1', 4, 1), -('DJI 2er Mikro 2', 4, 1), -('Rode Richt Mikrofon', 2, 1), -('Kamera Stativ', 1, 0), -('SONY Kamera - inkl. Akkus und Objektiv', 1, 1), -('MacBook inkl. Adapter', 2, 0), -('SD Karten', 3, 0), -('Kameragimbal', 1, 0), -('ATEM MINI PRO', 1, 1), -('Handygimbal', 4, 0), -('Kameralüfter', 1, 1), -('Kleine Kamera 1 - inkl. Objektiv', 2, 1), -('Kleine Kamera 2 - inkl. Objektiv', 2, 1); - -INSERT INTO `lockers` (`item`, `locker_number`) VALUES -('DJI 1er Mikro', 1), -('DJI 2er Mikro 1', 2), -('DJI 2er Mikro 2', 3), -('Rode Richt Mikrofon', 4), -('Kamera Stativ', 5), -('SONY Kamera - inkl. Akkus und Objektiv', 6), -('MacBook inkl. Adapter', 7), -('SD Karten', 8), -('Kameragimbal', 9), -('ATEM MINI PRO', 10), -('Handygimbal', 11), -('Kameralüfter', 12), -('Kleine Kamera 1 - inkl. Objektiv', 13), -('Kleine Kamera 2 - inkl. Objektiv', 14); \ No newline at end of file +CREATE TABLE apiKeys ( + id int NOT NULL AUTO_INCREMENT, + api_key int NOT NULL UNIQUE, + username VARCHAR(100) NOT NULL, + entry_created_at timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (id), + CONSTRAINT fk_apikeys_username + FOREIGN KEY (username) REFERENCES users(username) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB; \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 6d6cd5d..099af68 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -53,5 +53,20 @@ services: ports: - "3309:3306" + mysql-new: + container_name: borrow_system-mysql-new + image: mysql:8.0 + restart: unless-stopped + environment: + MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} + MYSQL_DATABASE: borrow_system_new + TZ: Europe/Berlin + volumes: + - mysql-data-new:/var/lib/mysql + - ./mysql-timezone.cnf:/etc/mysql/conf.d/timezone.cnf:ro + ports: + - "3310:3306" + volumes: mysql-data: + mysql-data-new: