diff --git a/cbd420(1).sql b/cbd420(1).sql index 760d1b9..229bd16 100644 --- a/cbd420(1).sql +++ b/cbd420(1).sql @@ -3,7 +3,7 @@ -- https://www.phpmyadmin.net/ -- -- Host: localhost:3306 --- Generation Time: Dec 20, 2025 at 05:20 PM +-- Generation Time: Dec 21, 2025 at 09:44 AM -- Server version: 10.11.14-MariaDB-0+deb12u2 -- PHP Version: 8.2.29 @@ -31,7 +31,22 @@ CREATE TABLE `buyers` ( `id` int(11) NOT NULL, `username` varchar(255) NOT NULL, `password` varchar(255) NOT NULL, - `email` varchar(255) NOT NULL + `email` varchar(255) NOT NULL, + `created_at` datetime NOT NULL DEFAULT current_timestamp() +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `buyer_data` +-- + +CREATE TABLE `buyer_data` ( + `id` int(11) NOT NULL, + `buyer_id` int(11) NOT NULL, + `fullname` text NOT NULL, + `address` text NOT NULL, + `phone` varchar(15) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- -------------------------------------------------------- @@ -61,7 +76,8 @@ CREATE TABLE `drops` ( `unit` varchar(12) NOT NULL DEFAULT 'g', `image_url` varchar(255) DEFAULT NULL, `ppu` int(11) NOT NULL DEFAULT 1, - `created_at` datetime NOT NULL DEFAULT current_timestamp() + `created_at` datetime NOT NULL DEFAULT current_timestamp(), + `start_time` datetime DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- -------------------------------------------------------- @@ -76,10 +92,24 @@ CREATE TABLE `pending_orders` ( `order_id` varchar(255) NOT NULL, `drop_id` int(11) NOT NULL, `buyer_id` int(11) NOT NULL, + `buyer_data_id` int(11) NOT NULL, `size` int(11) NOT NULL, `price_amount` decimal(10,2) NOT NULL, `price_currency` varchar(10) NOT NULL DEFAULT 'chf', - `created_at` datetime NOT NULL DEFAULT current_timestamp() + `created_at` datetime NOT NULL DEFAULT current_timestamp(), + `expires_at` datetime NOT NULL DEFAULT (current_timestamp() + interval 10 minute) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `referrals` +-- + +CREATE TABLE `referrals` ( + `id` int(11) NOT NULL, + `referrer` int(11) NOT NULL, + `referree` int(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- -------------------------------------------------------- @@ -92,6 +122,7 @@ CREATE TABLE `sales` ( `id` int(11) NOT NULL, `drop_id` int(11) NOT NULL, `buyer_id` int(11) NOT NULL, + `buyer_data_id` int(11) NOT NULL, `size` int(11) NOT NULL DEFAULT 1, `payment_id` text NOT NULL DEFAULT '', `created_at` datetime NOT NULL DEFAULT current_timestamp() @@ -107,6 +138,12 @@ CREATE TABLE `sales` ( ALTER TABLE `buyers` ADD PRIMARY KEY (`id`); +-- +-- Indexes for table `buyer_data` +-- +ALTER TABLE `buyer_data` + ADD PRIMARY KEY (`id`); + -- -- Indexes for table `deliveries` -- @@ -128,7 +165,17 @@ ALTER TABLE `pending_orders` ADD UNIQUE KEY `payment_id` (`payment_id`), ADD UNIQUE KEY `order_id` (`order_id`), ADD KEY `drop_id` (`drop_id`), - ADD KEY `buyer_id` (`buyer_id`); + ADD KEY `buyer_id` (`buyer_id`), + ADD KEY `idx_expires_at` (`expires_at`), + ADD KEY `buyer_data_id` (`buyer_data_id`); + +-- +-- Indexes for table `referrals` +-- +ALTER TABLE `referrals` + ADD PRIMARY KEY (`id`), + ADD KEY `referree` (`referree`), + ADD KEY `referrer` (`referrer`); -- -- Indexes for table `sales` @@ -136,7 +183,8 @@ ALTER TABLE `pending_orders` ALTER TABLE `sales` ADD PRIMARY KEY (`id`), ADD KEY `drop_id` (`drop_id`), - ADD KEY `buyer_id` (`buyer_id`); + ADD KEY `buyer_id` (`buyer_id`), + ADD KEY `buyer_data_id` (`buyer_data_id`); -- -- AUTO_INCREMENT for dumped tables @@ -148,6 +196,12 @@ ALTER TABLE `sales` ALTER TABLE `buyers` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; +-- +-- AUTO_INCREMENT for table `buyer_data` +-- +ALTER TABLE `buyer_data` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; + -- -- AUTO_INCREMENT for table `deliveries` -- @@ -166,6 +220,12 @@ ALTER TABLE `drops` ALTER TABLE `pending_orders` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; +-- +-- AUTO_INCREMENT for table `referrals` +-- +ALTER TABLE `referrals` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; + -- -- AUTO_INCREMENT for table `sales` -- @@ -187,14 +247,23 @@ ALTER TABLE `deliveries` -- ALTER TABLE `pending_orders` ADD CONSTRAINT `pending_orders_ibfk_1` FOREIGN KEY (`drop_id`) REFERENCES `drops` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - ADD CONSTRAINT `pending_orders_ibfk_2` FOREIGN KEY (`buyer_id`) REFERENCES `buyers` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; + ADD CONSTRAINT `pending_orders_ibfk_2` FOREIGN KEY (`buyer_id`) REFERENCES `buyers` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + ADD CONSTRAINT `pending_orders_ibfk_3` FOREIGN KEY (`buyer_data_id`) REFERENCES `buyer_data` (`id`); + +-- +-- Constraints for table `referrals` +-- +ALTER TABLE `referrals` + ADD CONSTRAINT `referrals_ibfk_1` FOREIGN KEY (`referree`) REFERENCES `buyers` (`id`), + ADD CONSTRAINT `referrals_ibfk_2` FOREIGN KEY (`referrer`) REFERENCES `buyers` (`id`); -- -- Constraints for table `sales` -- ALTER TABLE `sales` ADD CONSTRAINT `sales_ibfk_1` FOREIGN KEY (`drop_id`) REFERENCES `drops` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - ADD CONSTRAINT `sales_ibfk_2` FOREIGN KEY (`buyer_id`) REFERENCES `buyers` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; + ADD CONSTRAINT `sales_ibfk_2` FOREIGN KEY (`buyer_id`) REFERENCES `buyers` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + ADD CONSTRAINT `sales_ibfk_3` FOREIGN KEY (`buyer_data_id`) REFERENCES `buyer_data` (`id`); COMMIT; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; diff --git a/src/database/paymentService.ts b/src/database/paymentService.ts index a034d94..f64c3a1 100644 --- a/src/database/paymentService.ts +++ b/src/database/paymentService.ts @@ -215,10 +215,11 @@ export async function deletePendingOrderByOrderId(orderId: string): Promise { try { const [result] = await pool.execute( - 'INSERT INTO sales (drop_id, buyer_id, size, payment_id, created_at) VALUES (?, ?, ?, ?, NOW())', + 'INSERT INTO sales (drop_id, buyer_id, buyer_data_id, size, payment_id, created_at) VALUES (?, ?, ?, ?, ?, NOW())', [ pendingOrder.drop_id, pendingOrder.buyer_id, + pendingOrder.buyer_data_id, pendingOrder.size, paymentId ] @@ -352,6 +353,9 @@ export async function movePaymentToSalesWithInventoryCheck( if (pendingOrder.buyer_id === undefined || pendingOrder.buyer_id === null) { throw new Error(`Pending order missing buyer_id for id: ${pendingOrderId}`); } + if (pendingOrder.buyer_data_id === undefined || pendingOrder.buyer_data_id === null) { + throw new Error(`Pending order missing buyer_data_id for id: ${pendingOrderId}`); + } if (pendingOrder.size === undefined || pendingOrder.size === null) { throw new Error(`Pending order missing size for id: ${pendingOrderId}`); } @@ -361,10 +365,11 @@ export async function movePaymentToSalesWithInventoryCheck( // Create sale record (Step 5 from guide) const [insertResult] = await connection.execute( - 'INSERT INTO sales (drop_id, buyer_id, size, payment_id, created_at) VALUES (?, ?, ?, ?, NOW())', + 'INSERT INTO sales (drop_id, buyer_id, buyer_data_id, size, payment_id, created_at) VALUES (?, ?, ?, ?, ?, NOW())', [ pendingOrder.drop_id, pendingOrder.buyer_id, + pendingOrder.buyer_data_id, pendingOrder.size, paymentId ] diff --git a/src/database/types.ts b/src/database/types.ts index d29e0e9..4456462 100644 --- a/src/database/types.ts +++ b/src/database/types.ts @@ -8,6 +8,7 @@ export interface PendingOrder { order_id: string; drop_id: number; buyer_id: number; + buyer_data_id: number; size: number; price_amount: number; price_currency: string; @@ -19,6 +20,7 @@ export interface Sale { id: number; drop_id: number; buyer_id: number; + buyer_data_id: number; size: number; payment_id: string; created_at: Date;