From 9491da2950a668cbafbcba5b79597209091905ed Mon Sep 17 00:00:00 2001 From: Theis Gaedigk Date: Thu, 30 Oct 2025 18:35:11 +0100 Subject: [PATCH] edited scheme --- backend/scheme.sql | 100 --------------------- backend/scheme.xlsx | Bin 0 -> 12058 bytes backend/schemeV2.mock_data.sql | 89 ++++++++++++++++++ backend/schemeV2.sql | 159 +++++++++++---------------------- docker-compose.yml | 15 ++++ 5 files changed, 157 insertions(+), 206 deletions(-) delete mode 100644 backend/scheme.sql create mode 100644 backend/scheme.xlsx create mode 100644 backend/schemeV2.mock_data.sql 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 0000000000000000000000000000000000000000..3186469856fb516dcbb69c6f16e879a3a89baf77 GIT binary patch literal 12058 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 K^3@DKKK(!KC_4iH literal 0 HcmV?d00001 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: