| 1 | import pg from 'pg';
|
|---|
| 2 |
|
|---|
| 3 | const dataSQL = `
|
|---|
| 4 | TRUNCATE TABLE
|
|---|
| 5 | suggestions,
|
|---|
| 6 | cooler_cpu_sockets,
|
|---|
| 7 | case_mobo_form_factors,
|
|---|
| 8 | case_ps_form_factors,
|
|---|
| 9 | case_storage_form_factors,
|
|---|
| 10 | build_component,
|
|---|
| 11 | favorite_build,
|
|---|
| 12 | rating_build,
|
|---|
| 13 | review,
|
|---|
| 14 | build,
|
|---|
| 15 | admins,
|
|---|
| 16 | users,
|
|---|
| 17 | network_card,
|
|---|
| 18 | network_adapter,
|
|---|
| 19 | cables,
|
|---|
| 20 | sound_card,
|
|---|
| 21 | optical_drive,
|
|---|
| 22 | memory_card,
|
|---|
| 23 | storage,
|
|---|
| 24 | motherboard,
|
|---|
| 25 | cooler,
|
|---|
| 26 | pc_case,
|
|---|
| 27 | power_supply,
|
|---|
| 28 | memory,
|
|---|
| 29 | gpu,
|
|---|
| 30 | cpu,
|
|---|
| 31 | components
|
|---|
| 32 | RESTART IDENTITY CASCADE;
|
|---|
| 33 |
|
|---|
| 34 | INSERT INTO users (username, password, email) VALUES
|
|---|
| 35 | ('tome', 'tg', 'tome.gjorgiev@gmail.com'),
|
|---|
| 36 | ('mihail', 'mn', 'mihail.naumov@gmail.com'),
|
|---|
| 37 | ('stefan', 'sv', 'stefan.velkovski@gmail.com'),
|
|---|
| 38 | ('admin', 'admin', 'admin@gmail.com'),
|
|---|
| 39 | ('pc_wizard', 'pw', 'wizard@gmail.com'),
|
|---|
| 40 | ('budget_king', 'bk', 'budget@gmail.com'),
|
|---|
| 41 | ('rgb_lover', 'rgb', 'rgblover@gmail.com'),
|
|---|
| 42 | ('streamer_pro', 'sp', 'streamer@gmail.com'),
|
|---|
| 43 | ('office_guy', 'og', 'office@gmail.com'),
|
|---|
| 44 | ('linux_fan', 'lf', 'linux@gmail.com'),
|
|---|
| 45 | ('first_timer', 'ft', 'noob@gmail.com');
|
|---|
| 46 |
|
|---|
| 47 | INSERT INTO admins (user_id) VALUES (4);
|
|---|
| 48 |
|
|---|
| 49 | INSERT INTO components (name, brand, price, type, img_url) VALUES
|
|---|
| 50 | ('Ryzen 5 5600X', 'AMD', 199.99, 'cpu', 'https://static.hardwaredb.net/badges/ryzen-5-5600.png'),
|
|---|
| 51 | ('RTX 3060', 'NVIDIA', 329.99, 'gpu', 'https://static.hardwaredb.net/badges/geforce-rtx-3060.png'),
|
|---|
| 52 | ('16GB DDR4 Kit', 'Corsair', 79.99, 'memory', 'https://cwsmgmt.corsair.com/press/CORSAIRLogo2020_stack_W.png'),
|
|---|
| 53 | ('650W PSU', 'EVGA', 89.99, 'power_supply', 'https://cdn.brandfetch.io/iddPf9bbl3/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
|
|---|
| 54 | ('Mid Tower Case', 'NZXT', 119.99, 'case', 'https://nzxt.com/cdn/shop/files/h5-elite-hero-black.png?v=1744789660&width=2000'),
|
|---|
| 55 | ('Air Cooler', 'Noctua', 69.99, 'cooler', 'https://cdn.brandfetch.io/idSeoCDyH9/w/400/h/400/theme/dark/icon.png?c=1dxbfHSJFAPEGdCLU4o5B'),
|
|---|
| 56 | ('B550 Motherboard', 'ASUS', 149.99, 'motherboard', 'https://cdn.brandfetch.io/idGnlhbTXH/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
|
|---|
| 57 | ('1TB NVMe SSD', 'Samsung', 129.99, 'storage', 'https://cdn.brandfetch.io/iduaw_nOnR/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
|
|---|
| 58 | ('Sound Card', 'Creative', 59.99, 'sound_card', NULL),
|
|---|
| 59 | ('Network Card', 'Intel', 39.99, 'network_card', 'https://cdn.brandfetch.io/idTGhLyv09/w/400/h/400/theme/dark/icon.png?c=1dxbfHSJFAPEGdCLU4o5B'),
|
|---|
| 60 | ('Network Adapter', 'TP-Link', 29.99, 'network_adapter', 'https://cdn.brandfetch.io/idfUqCiOVX/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
|
|---|
| 61 | ('Optical Drive', 'LG', 19.99, 'optical_drive', 'https://cdn.brandfetch.io/idEI6u48uh/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
|
|---|
| 62 | ('Memory Card', 'SanDisk', 15.99, 'memory_card', 'https://cdn.brandfetch.io/idM3tf3Iq8/w/800/h/800/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
|
|---|
| 63 | ('Cables Pack', 'Corsair', 9.99, 'cables', 'https://cwsmgmt.corsair.com/press/CORSAIRLogo2020_stack_W.png'),
|
|---|
| 64 | ('Ryzen 5 7600', 'AMD', 229.00, 'cpu', 'https://static.hardwaredb.net/badges/ryzen-5-7600.png'),
|
|---|
| 65 | ('Ryzen 7 7800X3D', 'AMD', 399.00, 'cpu', 'https://static.hardwaredb.net/badges/ryzen-7-7800x3d.png'),
|
|---|
| 66 | ('Ryzen 9 7950X', 'AMD', 599.00, 'cpu', 'https://static.hardwaredb.net/badges/ryzen-9-7950x.png'),
|
|---|
| 67 | ('Core i3-13100F', 'Intel', 119.99, 'cpu', 'https://static.hardwaredb.net/badges/core-i3-13100.png'),
|
|---|
| 68 | ('Core i5-13600K', 'Intel', 319.99, 'cpu', 'https://static.hardwaredb.net/badges/core-i5-13600k.png'),
|
|---|
| 69 | ('Core i7-14700K', 'Intel', 409.99, 'cpu', 'https://static.hardwaredb.net/badges/core-i7-14700k.png'),
|
|---|
| 70 | ('Core i9-14900KS', 'Intel', 689.99, 'cpu', 'https://static.hardwaredb.net/badges/core-i9-14900ks.png'),
|
|---|
| 71 | ('Radeon RX 6600', 'PowerColor', 199.99, 'gpu', 'https://static.hardwaredb.net/badges/radeon-rx-6600.png'),
|
|---|
| 72 | ('Radeon RX 7600', 'Sapphire', 269.99, 'gpu', 'https://static.hardwaredb.net/badges/radeon-rx-7600.png'),
|
|---|
| 73 | ('Radeon RX 7800 XT', 'XFX', 499.99, 'gpu', 'https://static.hardwaredb.net/badges/radeon-rx-7800-xt.png'),
|
|---|
| 74 | ('Radeon RX 7900 XTX', 'Sapphire', 999.99, 'gpu', 'https://static.hardwaredb.net/badges/radeon-rx-7900-xtx.png'),
|
|---|
| 75 | ('GeForce RTX 3050', 'MSI', 229.99, 'gpu', 'https://static.hardwaredb.net/badges/geforce-rtx-3050.png'),
|
|---|
| 76 | ('GeForce RTX 4060', 'Zotac', 299.99, 'gpu', 'https://static.hardwaredb.net/badges/geforce-rtx-4060.png'),
|
|---|
| 77 | ('GeForce RTX 4070 Super', 'ASUS', 599.99, 'gpu', 'https://static.hardwaredb.net/badges/geforce-rtx-4070-super.png'),
|
|---|
| 78 | ('GeForce RTX 4080 Super', 'Gigabyte', 999.99, 'gpu', 'https://static.hardwaredb.net/badges/geforce-rtx-4080-super.png'),
|
|---|
| 79 | ('GeForce RTX 4090', 'NVIDIA', 1599.99, 'gpu', 'https://static.hardwaredb.net/badges/geforce-rtx-4090.png'),
|
|---|
| 80 | ('B650M DS3H', 'Gigabyte', 149.99, 'motherboard', 'https://images.seeklogo.com/logo-png/39/1/gigabyte-logo-png_seeklogo-398170.png'),
|
|---|
| 81 | ('X670E AORUS Master', 'Gigabyte', 459.99, 'motherboard', 'https://images.seeklogo.com/logo-png/39/1/gigabyte-logo-png_seeklogo-398170.png'),
|
|---|
| 82 | ('B760M Bomber WiFi', 'MSI', 129.99, 'motherboard', 'https://images.seeklogo.com/logo-png/30/1/msi-logo-png_seeklogo-304877.png'),
|
|---|
| 83 | ('Z790 Maximus Hero', 'ASUS', 599.99, 'motherboard', 'https://cdn.brandfetch.io/idGnlhbTXH/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
|
|---|
| 84 | ('Vengeance LPX 16GB', 'Corsair', 39.99, 'memory', 'https://cwsmgmt.corsair.com/press/CORSAIRLogo2020_stack_W.png'),
|
|---|
| 85 | ('Ripjaws V 32GB', 'G.Skill', 69.99, 'memory', 'https://cdn.brandfetch.io/id8HgeVn1l/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
|
|---|
| 86 | ('Trident Z5 RGB 32GB', 'G.Skill', 114.99, 'memory', 'https://cdn.brandfetch.io/id8HgeVn1l/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
|
|---|
| 87 | ('Dominator Platinum 64GB', 'Corsair', 289.99, 'memory', 'https://cwsmgmt.corsair.com/press/CORSAIRLogo2020_stack_W.png'),
|
|---|
| 88 | ('Crucial P3 1TB', 'Crucial', 64.99, 'storage', 'https://cdn.brandfetch.io/idcQwroMOv/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
|
|---|
| 89 | ('WD Black SN850X 2TB', 'Western Digital', 159.99, 'storage', 'https://cdn.brandfetch.io/id6bAnMJ1y/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
|
|---|
| 90 | ('Samsung 990 Pro 4TB', 'Samsung', 349.99, 'storage', 'https://cdn.brandfetch.io/iduaw_nOnR/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
|
|---|
| 91 | ('H5 Flow', 'NZXT', 94.99, 'case', 'https://nzxt.com/cdn/shop/files/h5-flow-rgb-h5-flow-rgb-primary-lg.png?v=1744863470&width=2000'),
|
|---|
| 92 | ('4000D Airflow', 'Corsair', 104.99, 'case', 'https://assets.corsair.com/image/upload/c_pad,q_auto,h_1024,w_1024,f_auto/products/Cases/base-4000d-airflow-config/Gallery/4000D_AF_BLACK_01.webp'),
|
|---|
| 93 | ('O11 Dynamic Evo', 'Lian Li', 159.99, 'case', 'https://www.pbtech.co.nz/imgprod/C/H/CHALAN2074__1.jpg?h=2971221114'),
|
|---|
| 94 | ('Versa H18', 'Thermaltake', 49.99, 'case', 'https://cdn.mwave.com.au/images/400/AC11503_2.jpg'),
|
|---|
| 95 | ('Smart 500W', 'Thermaltake', 39.99, 'power_supply', 'https://cdn.brandfetch.io/idkwuFYTlH/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
|
|---|
| 96 | ('RM750e', 'Corsair', 99.99, 'power_supply', 'https://cwsmgmt.corsair.com/press/CORSAIRLogo2020_stack_W.png'),
|
|---|
| 97 | ('SuperNOVA 1000 GT', 'EVGA', 169.99, 'power_supply', 'https://cdn.brandfetch.io/iddPf9bbl3/w/400/h/400/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B'),
|
|---|
| 98 | ('Peerless Assassin 120 SE', 'Thermalright', 33.90, 'cooler', 'https://cdn.brandfetch.io/id2Wov4r9a/w/339/h/339/theme/dark/icon.png?c=1dxbfHSJFAPEGdCLU4o5B'),
|
|---|
| 99 | ('Kraken Elite 360', 'NZXT', 279.99, 'cooler', 'https://cdn.brandfetch.io/id6LxRitGO/w/1080/h/1080/theme/dark/icon.jpeg?c=1dxbfHSJFAPEGdCLU4o5B');
|
|---|
| 100 |
|
|---|
| 101 | INSERT INTO cpu (component_id, socket, cores, threads, base_clock, boost_clock, tdp) VALUES
|
|---|
| 102 | (1, 'AM4', 6, 12, 3.7, 4.6, 65),
|
|---|
| 103 | ((SELECT id FROM components WHERE name='Ryzen 5 7600'), 'AM5', 6, 12, 3.8, 5.1, 65),
|
|---|
| 104 | ((SELECT id FROM components WHERE name='Ryzen 7 7800X3D'), 'AM5', 8, 16, 4.2, 5.0, 120),
|
|---|
| 105 | ((SELECT id FROM components WHERE name='Ryzen 9 7950X'), 'AM5', 16, 32, 4.5, 5.7, 170),
|
|---|
| 106 | ((SELECT id FROM components WHERE name='Core i3-13100F'), 'LGA1700', 4, 8, 3.4, 4.5, 58),
|
|---|
| 107 | ((SELECT id FROM components WHERE name='Core i5-13600K'), 'LGA1700', 14, 20, 3.5, 5.1, 125),
|
|---|
| 108 | ((SELECT id FROM components WHERE name='Core i7-14700K'), 'LGA1700', 20, 28, 3.4, 5.6, 125),
|
|---|
| 109 | ((SELECT id FROM components WHERE name='Core i9-14900KS'), 'LGA1700', 24, 32, 3.2, 6.2, 150);
|
|---|
| 110 |
|
|---|
| 111 | INSERT INTO gpu (component_id, vram, tdp, base_clock, boost_clock, chipset, length) VALUES
|
|---|
| 112 | (2, 12, 170, 1.32, 1.78, 'RTX 3060', 242),
|
|---|
| 113 | ((SELECT id FROM components WHERE name='Radeon RX 6600'), 8, 132, 2.0, 2.4, 'RX 6600', 200),
|
|---|
| 114 | ((SELECT id FROM components WHERE name='Radeon RX 7600'), 8, 165, 2.2, 2.6, 'RX 7600', 240),
|
|---|
| 115 | ((SELECT id FROM components WHERE name='Radeon RX 7800 XT'), 16, 263, 2.1, 2.4, 'RX 7800 XT', 280),
|
|---|
| 116 | ((SELECT id FROM components WHERE name='Radeon RX 7900 XTX'), 24, 355, 2.3, 2.5, 'RX 7900 XTX', 320),
|
|---|
| 117 | ((SELECT id FROM components WHERE name='GeForce RTX 3050'), 8, 130, 1.5, 1.7, 'RTX 3050', 200),
|
|---|
| 118 | ((SELECT id FROM components WHERE name='GeForce RTX 4060'), 8, 115, 1.8, 2.4, 'RTX 4060', 220),
|
|---|
| 119 | ((SELECT id FROM components WHERE name='GeForce RTX 4070 Super'), 12, 220, 1.9, 2.5, 'RTX 4070 S', 260),
|
|---|
| 120 | ((SELECT id FROM components WHERE name='GeForce RTX 4080 Super'), 16, 320, 2.2, 2.5, 'RTX 4080 S', 300),
|
|---|
| 121 | ((SELECT id FROM components WHERE name='GeForce RTX 4090'), 24, 450, 2.2, 2.5, 'RTX 4090', 340);
|
|---|
| 122 |
|
|---|
| 123 | INSERT INTO motherboard (component_id, socket, chipset, form_factor, ram_type, num_ram_slots, max_ram_capacity, pci_express_slots) VALUES
|
|---|
| 124 | (7, 'AM4', 'B550', 'ATX', 'DDR4', 4, 128, 3),
|
|---|
| 125 | ((SELECT id FROM components WHERE name='B650M DS3H'), 'AM5', 'B650', 'Micro-ATX', 'DDR5', 4, 128, 2),
|
|---|
| 126 | ((SELECT id FROM components WHERE name='X670E AORUS Master'), 'AM5', 'X670E', 'ATX', 'DDR5', 4, 192, 3),
|
|---|
| 127 | ((SELECT id FROM components WHERE name='B760M Bomber WiFi'), 'LGA1700', 'B760', 'Micro-ATX', 'DDR4', 2, 64, 1),
|
|---|
| 128 | ((SELECT id FROM components WHERE name='Z790 Maximus Hero'), 'LGA1700', 'Z790', 'ATX', 'DDR5', 4, 192, 3);
|
|---|
| 129 |
|
|---|
| 130 | INSERT INTO memory (component_id, type, speed, capacity, modules) VALUES
|
|---|
| 131 | (3, 'DDR4', 3200, 16, 2),
|
|---|
| 132 | ((SELECT id FROM components WHERE name='Vengeance LPX 16GB'), 'DDR4', 3200, 16, 2),
|
|---|
| 133 | ((SELECT id FROM components WHERE name='Ripjaws V 32GB'), 'DDR4', 3600, 32, 2),
|
|---|
| 134 | ((SELECT id FROM components WHERE name='Trident Z5 RGB 32GB'), 'DDR5', 6000, 32, 2),
|
|---|
| 135 | ((SELECT id FROM components WHERE name='Dominator Platinum 64GB'), 'DDR5', 6400, 64, 2);
|
|---|
| 136 |
|
|---|
| 137 | INSERT INTO storage (component_id, type, capacity, form_factor) VALUES
|
|---|
| 138 | (8, 'NVMe', 1000, 'M.2'),
|
|---|
| 139 | ((SELECT id FROM components WHERE name='Crucial P3 1TB'), 'NVMe', 1000, 'M.2'),
|
|---|
| 140 | ((SELECT id FROM components WHERE name='WD Black SN850X 2TB'), 'NVMe', 2000, 'M.2'),
|
|---|
| 141 | ((SELECT id FROM components WHERE name='Samsung 990 Pro 4TB'), 'NVMe', 4000, 'M.2');
|
|---|
| 142 |
|
|---|
| 143 | INSERT INTO pc_case (component_id, cooler_max_height, gpu_max_length) VALUES
|
|---|
| 144 | (5, 165, 300),
|
|---|
| 145 | ((SELECT id FROM components WHERE name='H5 Flow'), 165, 365),
|
|---|
| 146 | ((SELECT id FROM components WHERE name='4000D Airflow'), 170, 360),
|
|---|
| 147 | ((SELECT id FROM components WHERE name='O11 Dynamic Evo'), 167, 422),
|
|---|
| 148 | ((SELECT id FROM components WHERE name='Versa H18'), 155, 350);
|
|---|
| 149 |
|
|---|
| 150 | INSERT INTO case_mobo_form_factors (case_id, form_factor) VALUES
|
|---|
| 151 | (5, 'ATX'), (5, 'Micro-ATX');
|
|---|
| 152 |
|
|---|
| 153 | INSERT INTO case_mobo_form_factors (case_id, form_factor) VALUES
|
|---|
| 154 | ((SELECT id FROM components WHERE name = 'H5 Flow'), 'ATX'),
|
|---|
| 155 | ((SELECT id FROM components WHERE name = 'H5 Flow'), 'Micro-ATX'),
|
|---|
| 156 | ((SELECT id FROM components WHERE name = '4000D Airflow'), 'ATX'),
|
|---|
| 157 | ((SELECT id FROM components WHERE name = '4000D Airflow'), 'Micro-ATX'),
|
|---|
| 158 | ((SELECT id FROM components WHERE name = 'O11 Dynamic Evo'), 'ATX'),
|
|---|
| 159 | ((SELECT id FROM components WHERE name = 'O11 Dynamic Evo'), 'Micro-ATX'),
|
|---|
| 160 | ((SELECT id FROM components WHERE name = 'Versa H18'), 'Micro-ATX');
|
|---|
| 161 |
|
|---|
| 162 | INSERT INTO case_storage_form_factors (case_id, form_factor, num_slots) VALUES
|
|---|
| 163 | (5, 'M.2', 2),
|
|---|
| 164 | ((SELECT id FROM components WHERE name = 'H5 Flow'), 'M.2', 3),
|
|---|
| 165 | ((SELECT id FROM components WHERE name = '4000D Airflow'), 'M.2', 3),
|
|---|
| 166 | ((SELECT id FROM components WHERE name = 'O11 Dynamic Evo'), 'M.2', 4),
|
|---|
| 167 | ((SELECT id FROM components WHERE name = 'Versa H18'), 'M.2', 2);
|
|---|
| 168 |
|
|---|
| 169 | INSERT INTO power_supply (component_id, type, wattage, form_factor) VALUES
|
|---|
| 170 | (4, 'Modular', 650, 'ATX'),
|
|---|
| 171 | ((SELECT id FROM components WHERE name='Smart 500W'), 'Non-Modular', 500, 'ATX'),
|
|---|
| 172 | ((SELECT id FROM components WHERE name='RM750e'), 'Fully Modular', 750, 'ATX'),
|
|---|
| 173 | ((SELECT id FROM components WHERE name='SuperNOVA 1000 GT'), 'Fully Modular', 1000, 'ATX');
|
|---|
| 174 |
|
|---|
| 175 | INSERT INTO cooler (component_id, type, height, max_tdp_supported) VALUES
|
|---|
| 176 | (6, 'Air', 158, 150),
|
|---|
| 177 | ((SELECT id FROM components WHERE name='Peerless Assassin 120 SE'), 'Air', 155, 245),
|
|---|
| 178 | ((SELECT id FROM components WHERE name='Kraken Elite 360'), 'Liquid', 55, 300);
|
|---|
| 179 |
|
|---|
| 180 | INSERT INTO cooler_cpu_sockets (cooler_id, socket) VALUES
|
|---|
| 181 | (6, 'AM4'), (6, 'AM5');
|
|---|
| 182 |
|
|---|
| 183 | INSERT INTO cooler_cpu_sockets (cooler_id, socket) VALUES
|
|---|
| 184 | ((SELECT id FROM components WHERE name = 'Peerless Assassin 120 SE'), 'AM4'),
|
|---|
| 185 | ((SELECT id FROM components WHERE name = 'Peerless Assassin 120 SE'), 'AM5'),
|
|---|
| 186 | ((SELECT id FROM components WHERE name = 'Peerless Assassin 120 SE'), 'LGA1700');
|
|---|
| 187 |
|
|---|
| 188 | INSERT INTO cooler_cpu_sockets (cooler_id, socket) VALUES
|
|---|
| 189 | ((SELECT id FROM components WHERE name = 'Kraken Elite 360'), 'AM4'),
|
|---|
| 190 | ((SELECT id FROM components WHERE name = 'Kraken Elite 360'), 'AM5'),
|
|---|
| 191 | ((SELECT id FROM components WHERE name = 'Kraken Elite 360'), 'LGA1700');
|
|---|
| 192 |
|
|---|
| 193 | INSERT INTO case_ps_form_factors (case_id, form_factor) VALUES
|
|---|
| 194 | (5, 'ATX'),
|
|---|
| 195 | ((SELECT id FROM components WHERE name = 'H5 Flow'), 'ATX'),
|
|---|
| 196 | ((SELECT id FROM components WHERE name = '4000D Airflow'), 'ATX'),
|
|---|
| 197 | ((SELECT id FROM components WHERE name = 'O11 Dynamic Evo'), 'ATX'),
|
|---|
| 198 | ((SELECT id FROM components WHERE name = 'Versa H18'), 'ATX');
|
|---|
| 199 |
|
|---|
| 200 | INSERT INTO sound_card (component_id, sample_rate, bit_depth, chipset, interface, channel) VALUES (9, 192000, 24, 'SoundCore', 'PCIe', '7.1');
|
|---|
| 201 | INSERT INTO network_card (component_id, num_ports, speed, interface) VALUES (10, 2, 1000, 'PCIe');
|
|---|
| 202 | INSERT INTO network_adapter (component_id, wifi_version, interface, num_antennas) VALUES (11, 'WiFi 6', 'PCIe', 3);
|
|---|
| 203 | INSERT INTO optical_drive (component_id, form_factor, type, interface, write_speed, read_speed) VALUES (12, '5.25"', 'DVD-RW', 'SATA', 16, 16);
|
|---|
| 204 | INSERT INTO memory_card (component_id, num_slots, interface) VALUES (13, 1, '2.5');
|
|---|
| 205 | INSERT INTO cables (component_id, length_cm, type) VALUES (14, 50, 'SATA');
|
|---|
| 206 |
|
|---|
| 207 | INSERT INTO build (user_id, name, created_at, description, total_price, is_approved) VALUES
|
|---|
| 208 | (1, 'Gaming Build', CURRENT_DATE, 'Mid-range gaming PC', 1139.92, TRUE);
|
|---|
| 209 | INSERT INTO build_component (build_id, component_id) VALUES
|
|---|
| 210 | (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8);
|
|---|
| 211 |
|
|---|
| 212 | INSERT INTO build (user_id, name, created_at, description, total_price, is_approved) VALUES
|
|---|
| 213 | ((SELECT id FROM users WHERE username='budget_king'), 'Console Killer 2025', '2024-12-01', 'Cheap entry level gaming PC', 580.00, TRUE);
|
|---|
| 214 | INSERT INTO build_component (build_id, component_id) VALUES
|
|---|
| 215 | ((SELECT id FROM build WHERE name='Console Killer 2025'), (SELECT id FROM components WHERE name='Core i3-13100F')),
|
|---|
| 216 | ((SELECT id FROM build WHERE name='Console Killer 2025'), (SELECT id FROM components WHERE name='Radeon RX 6600')),
|
|---|
| 217 | ((SELECT id FROM build WHERE name='Console Killer 2025'), (SELECT id FROM components WHERE name='B760M Bomber WiFi')),
|
|---|
| 218 | ((SELECT id FROM build WHERE name='Console Killer 2025'), (SELECT id FROM components WHERE name='Vengeance LPX 16GB')),
|
|---|
| 219 | ((SELECT id FROM build WHERE name='Console Killer 2025'), (SELECT id FROM components WHERE name='Crucial P3 1TB')),
|
|---|
| 220 | ((SELECT id FROM build WHERE name='Console Killer 2025'), (SELECT id FROM components WHERE name='Smart 500W')),
|
|---|
| 221 | ((SELECT id FROM build WHERE name='Console Killer 2025'), (SELECT id FROM components WHERE name='Versa H18'));
|
|---|
| 222 |
|
|---|
| 223 | INSERT INTO build (user_id, name, created_at, description, total_price, is_approved) VALUES
|
|---|
| 224 | ((SELECT id FROM users WHERE username='streamer_pro'), 'Pro Streaming Rig', '2025-01-15', 'Handles OBS and 1440p gaming flawlessly', 2150.00, TRUE);
|
|---|
| 225 | INSERT INTO build_component (build_id, component_id) VALUES
|
|---|
| 226 | ((SELECT id FROM build WHERE name='Pro Streaming Rig'), (SELECT id FROM components WHERE name='Core i7-14700K')),
|
|---|
| 227 | ((SELECT id FROM build WHERE name='Pro Streaming Rig'), (SELECT id FROM components WHERE name='GeForce RTX 4080 Super')),
|
|---|
| 228 | ((SELECT id FROM build WHERE name='Pro Streaming Rig'), (SELECT id FROM components WHERE name='Z790 Maximus Hero')),
|
|---|
| 229 | ((SELECT id FROM build WHERE name='Pro Streaming Rig'), (SELECT id FROM components WHERE name='Trident Z5 RGB 32GB')),
|
|---|
| 230 | ((SELECT id FROM build WHERE name='Pro Streaming Rig'), (SELECT id FROM components WHERE name='WD Black SN850X 2TB')),
|
|---|
| 231 | ((SELECT id FROM build WHERE name='Pro Streaming Rig'), (SELECT id FROM components WHERE name='SuperNOVA 1000 GT')),
|
|---|
| 232 | ((SELECT id FROM build WHERE name='Pro Streaming Rig'), (SELECT id FROM components WHERE name='H5 Flow')),
|
|---|
| 233 | ((SELECT id FROM build WHERE name='Pro Streaming Rig'), (SELECT id FROM components WHERE name='Kraken Elite 360'));
|
|---|
| 234 |
|
|---|
| 235 | INSERT INTO build (user_id, name, created_at, description, total_price, is_approved) VALUES
|
|---|
| 236 | ((SELECT id FROM users WHERE username='pc_wizard'), 'Team Red Value King', '2025-02-10', 'Pure rasterization performance', 1450.00, TRUE);
|
|---|
| 237 | INSERT INTO build_component (build_id, component_id) VALUES
|
|---|
| 238 | ((SELECT id FROM build WHERE name='Team Red Value King'), (SELECT id FROM components WHERE name='Ryzen 7 7800X3D')),
|
|---|
| 239 | ((SELECT id FROM build WHERE name='Team Red Value King'), (SELECT id FROM components WHERE name='Radeon RX 7800 XT')),
|
|---|
| 240 | ((SELECT id FROM build WHERE name='Team Red Value King'), (SELECT id FROM components WHERE name='B650M DS3H')),
|
|---|
| 241 | ((SELECT id FROM build WHERE name='Team Red Value King'), (SELECT id FROM components WHERE name='Trident Z5 RGB 32GB')),
|
|---|
| 242 | ((SELECT id FROM build WHERE name='Team Red Value King'), (SELECT id FROM components WHERE name='Crucial P3 1TB')),
|
|---|
| 243 | ((SELECT id FROM build WHERE name='Team Red Value King'), (SELECT id FROM components WHERE name='RM750e')),
|
|---|
| 244 | ((SELECT id FROM build WHERE name='Team Red Value King'), (SELECT id FROM components WHERE name='4000D Airflow')),
|
|---|
| 245 | ((SELECT id FROM build WHERE name='Team Red Value King'), (SELECT id FROM components WHERE name='Peerless Assassin 120 SE'));
|
|---|
| 246 |
|
|---|
| 247 | INSERT INTO build (user_id, name, created_at, description, total_price, is_approved) VALUES
|
|---|
| 248 | ((SELECT id FROM users WHERE username='rgb_lover'), 'God Tier 4090 Build', '2025-03-01', 'Money is no object. 4K 144Hz Ultra.', 4200.00, TRUE);
|
|---|
| 249 | INSERT INTO build_component (build_id, component_id) VALUES
|
|---|
| 250 | ((SELECT id FROM build WHERE name='God Tier 4090 Build'), (SELECT id FROM components WHERE name='Core i9-14900KS')),
|
|---|
| 251 | ((SELECT id FROM build WHERE name='God Tier 4090 Build'), (SELECT id FROM components WHERE name='GeForce RTX 4090')),
|
|---|
| 252 | ((SELECT id FROM build WHERE name='God Tier 4090 Build'), (SELECT id FROM components WHERE name='Z790 Maximus Hero')),
|
|---|
| 253 | ((SELECT id FROM build WHERE name='God Tier 4090 Build'), (SELECT id FROM components WHERE name='Dominator Platinum 64GB')),
|
|---|
| 254 | ((SELECT id FROM build WHERE name='God Tier 4090 Build'), (SELECT id FROM components WHERE name='Samsung 990 Pro 4TB')),
|
|---|
| 255 | ((SELECT id FROM build WHERE name='God Tier 4090 Build'), (SELECT id FROM components WHERE name='SuperNOVA 1000 GT')),
|
|---|
| 256 | ((SELECT id FROM build WHERE name='God Tier 4090 Build'), (SELECT id FROM components WHERE name='O11 Dynamic Evo')),
|
|---|
| 257 | ((SELECT id FROM build WHERE name='God Tier 4090 Build'), (SELECT id FROM components WHERE name='Kraken Elite 360'));
|
|---|
| 258 |
|
|---|
| 259 | INSERT INTO build (user_id, name, created_at, description, total_price, is_approved) VALUES
|
|---|
| 260 | ((SELECT id FROM users WHERE username='first_timer'), 'Snow White Build', '2024-11-20', 'First time building, went for looks', 1199.00, TRUE);
|
|---|
| 261 | INSERT INTO build_component (build_id, component_id) VALUES
|
|---|
| 262 | ((SELECT id FROM build WHERE name='Snow White Build'), (SELECT id FROM components WHERE name='Ryzen 5 7600')),
|
|---|
| 263 | ((SELECT id FROM build WHERE name='Snow White Build'), (SELECT id FROM components WHERE name='GeForce RTX 4070 Super')),
|
|---|
| 264 | ((SELECT id FROM build WHERE name='Snow White Build'), (SELECT id FROM components WHERE name='B650M DS3H')),
|
|---|
| 265 | ((SELECT id FROM build WHERE name='Snow White Build'), (SELECT id FROM components WHERE name='Trident Z5 RGB 32GB')),
|
|---|
| 266 | ((SELECT id FROM build WHERE name='Snow White Build'), (SELECT id FROM components WHERE name='Crucial P3 1TB')),
|
|---|
| 267 | ((SELECT id FROM build WHERE name='Snow White Build'), (SELECT id FROM components WHERE name='RM750e')),
|
|---|
| 268 | ((SELECT id FROM build WHERE name='Snow White Build'), (SELECT id FROM components WHERE name='H5 Flow'));
|
|---|
| 269 |
|
|---|
| 270 | INSERT INTO build (user_id, name, created_at, description, total_price, is_approved) VALUES
|
|---|
| 271 | ((SELECT id FROM users WHERE username='linux_fan'), 'Arch Linux Dev Box', '2024-10-15', 'Compilation beast, no Nvidia drivers needed', 920.00, TRUE);
|
|---|
| 272 | INSERT INTO build_component (build_id, component_id) VALUES
|
|---|
| 273 | ((SELECT id FROM build WHERE name='Arch Linux Dev Box'), (SELECT id FROM components WHERE name='Core i5-13600K')),
|
|---|
| 274 | ((SELECT id FROM build WHERE name='Arch Linux Dev Box'), (SELECT id FROM components WHERE name='Radeon RX 7600')),
|
|---|
| 275 | ((SELECT id FROM build WHERE name='Arch Linux Dev Box'), (SELECT id FROM components WHERE name='B760M Bomber WiFi')),
|
|---|
| 276 | ((SELECT id FROM build WHERE name='Arch Linux Dev Box'), (SELECT id FROM components WHERE name='Ripjaws V 32GB')),
|
|---|
| 277 | ((SELECT id FROM build WHERE name='Arch Linux Dev Box'), (SELECT id FROM components WHERE name='Crucial P3 1TB')),
|
|---|
| 278 | ((SELECT id FROM build WHERE name='Arch Linux Dev Box'), (SELECT id FROM components WHERE name='RM750e')),
|
|---|
| 279 | ((SELECT id FROM build WHERE name='Arch Linux Dev Box'), (SELECT id FROM components WHERE name='Versa H18'));
|
|---|
| 280 |
|
|---|
| 281 | INSERT INTO build (user_id, name, created_at, description, total_price, is_approved) VALUES
|
|---|
| 282 | ((SELECT id FROM users WHERE username='office_guy'), '1080p Gamer', '2025-01-05', 'Just for Fortnite and Apex', 810.00, TRUE);
|
|---|
| 283 | INSERT INTO build_component (build_id, component_id) VALUES
|
|---|
| 284 | ((SELECT id FROM build WHERE name='1080p Gamer'), (SELECT id FROM components WHERE name='Core i3-13100F')),
|
|---|
| 285 | ((SELECT id FROM build WHERE name='1080p Gamer'), (SELECT id FROM components WHERE name='GeForce RTX 4060')),
|
|---|
| 286 | ((SELECT id FROM build WHERE name='1080p Gamer'), (SELECT id FROM components WHERE name='B760M Bomber WiFi')),
|
|---|
| 287 | ((SELECT id FROM build WHERE name='1080p Gamer'), (SELECT id FROM components WHERE name='Vengeance LPX 16GB')),
|
|---|
| 288 | ((SELECT id FROM build WHERE name='1080p Gamer'), (SELECT id FROM components WHERE name='Crucial P3 1TB')),
|
|---|
| 289 | ((SELECT id FROM build WHERE name='1080p Gamer'), (SELECT id FROM components WHERE name='Smart 500W')),
|
|---|
| 290 | ((SELECT id FROM build WHERE name='1080p Gamer'), (SELECT id FROM components WHERE name='Versa H18'));
|
|---|
| 291 |
|
|---|
| 292 | INSERT INTO build (user_id, name, created_at, description, total_price, is_approved) VALUES
|
|---|
| 293 | ((SELECT id FROM users WHERE username='pc_wizard'), 'Silent Night', '2024-12-25', 'Zero RPM fan mode build', 2450.00, TRUE);
|
|---|
| 294 | INSERT INTO build_component (build_id, component_id) VALUES
|
|---|
| 295 | ((SELECT id FROM build WHERE name='Silent Night'), (SELECT id FROM components WHERE name='Core i7-14700K')),
|
|---|
| 296 | ((SELECT id FROM build WHERE name='Silent Night'), (SELECT id FROM components WHERE name='GeForce RTX 4080 Super')),
|
|---|
| 297 | ((SELECT id FROM build WHERE name='Silent Night'), (SELECT id FROM components WHERE name='Z790 Maximus Hero')),
|
|---|
| 298 | ((SELECT id FROM build WHERE name='Silent Night'), (SELECT id FROM components WHERE name='Trident Z5 RGB 32GB')),
|
|---|
| 299 | ((SELECT id FROM build WHERE name='Silent Night'), (SELECT id FROM components WHERE name='WD Black SN850X 2TB')),
|
|---|
| 300 | ((SELECT id FROM build WHERE name='Silent Night'), (SELECT id FROM components WHERE name='SuperNOVA 1000 GT')),
|
|---|
| 301 | ((SELECT id FROM build WHERE name='Silent Night'), (SELECT id FROM components WHERE name='4000D Airflow')),
|
|---|
| 302 | ((SELECT id FROM build WHERE name='Silent Night'), (SELECT id FROM components WHERE name='Peerless Assassin 120 SE'));
|
|---|
| 303 |
|
|---|
| 304 | INSERT INTO build (user_id, name, created_at, description, total_price, is_approved) VALUES
|
|---|
| 305 | ((SELECT id FROM users WHERE username='rgb_lover'), 'Radeon Ultimate', '2025-03-10', '4K Gaming without Nvidia tax', 2850.00, TRUE);
|
|---|
| 306 | INSERT INTO build_component (build_id, component_id) VALUES
|
|---|
| 307 | ((SELECT id FROM build WHERE name='Radeon Ultimate'), (SELECT id FROM components WHERE name='Ryzen 9 7950X')),
|
|---|
| 308 | ((SELECT id FROM build WHERE name='Radeon Ultimate'), (SELECT id FROM components WHERE name='Radeon RX 7900 XTX')),
|
|---|
| 309 | ((SELECT id FROM build WHERE name='Radeon Ultimate'), (SELECT id FROM components WHERE name='X670E AORUS Master')),
|
|---|
| 310 | ((SELECT id FROM build WHERE name='Radeon Ultimate'), (SELECT id FROM components WHERE name='Dominator Platinum 64GB')),
|
|---|
| 311 | ((SELECT id FROM build WHERE name='Radeon Ultimate'), (SELECT id FROM components WHERE name='Samsung 990 Pro 4TB')),
|
|---|
| 312 | ((SELECT id FROM build WHERE name='Radeon Ultimate'), (SELECT id FROM components WHERE name='SuperNOVA 1000 GT')),
|
|---|
| 313 | ((SELECT id FROM build WHERE name='Radeon Ultimate'), (SELECT id FROM components WHERE name='O11 Dynamic Evo')),
|
|---|
| 314 | ((SELECT id FROM build WHERE name='Radeon Ultimate'), (SELECT id FROM components WHERE name='Kraken Elite 360'));
|
|---|
| 315 |
|
|---|
| 316 | INSERT INTO rating_build (build_id, user_id, value) VALUES (1, 2, 5);
|
|---|
| 317 | INSERT INTO review (build_id, user_id, content, created_at) VALUES (1, 2, 'Still runs everything in 2025!', CURRENT_DATE);
|
|---|
| 318 |
|
|---|
| 319 | INSERT INTO rating_build (build_id, user_id, value) VALUES
|
|---|
| 320 | ((SELECT id FROM build WHERE name='Console Killer 2025'), (SELECT id FROM users WHERE username='rgb_lover'), 3),
|
|---|
| 321 | ((SELECT id FROM build WHERE name='Console Killer 2025'), (SELECT id FROM users WHERE username='pc_wizard'), 4);
|
|---|
| 322 | INSERT INTO review (build_id, user_id, content, created_at) VALUES
|
|---|
| 323 | ((SELECT id FROM build WHERE name='Console Killer 2025'), (SELECT id FROM users WHERE username='rgb_lover'), 'No RGB, 3 stars.', '2024-12-05');
|
|---|
| 324 |
|
|---|
| 325 | INSERT INTO rating_build (build_id, user_id, value) VALUES
|
|---|
| 326 | ((SELECT id FROM build WHERE name='Pro Streaming Rig'), (SELECT id FROM users WHERE username='pc_wizard'), 5);
|
|---|
| 327 |
|
|---|
| 328 | INSERT INTO rating_build (build_id, user_id, value) VALUES
|
|---|
| 329 | ((SELECT id FROM build WHERE name='Team Red Value King'), (SELECT id FROM users WHERE username='budget_king'), 5),
|
|---|
| 330 | ((SELECT id FROM build WHERE name='Team Red Value King'), (SELECT id FROM users WHERE username='first_timer'), 4);
|
|---|
| 331 | INSERT INTO review (build_id, user_id, content, created_at) VALUES
|
|---|
| 332 | ((SELECT id FROM build WHERE name='Team Red Value King'), (SELECT id FROM users WHERE username='budget_king'), 'Best FPS per dollar.', '2025-02-12');
|
|---|
| 333 |
|
|---|
| 334 | INSERT INTO rating_build (build_id, user_id, value) VALUES
|
|---|
| 335 | ((SELECT id FROM build WHERE name='God Tier 4090 Build'), (SELECT id FROM users WHERE username='streamer_pro'), 5),
|
|---|
| 336 | ((SELECT id FROM build WHERE name='God Tier 4090 Build'), (SELECT id FROM users WHERE username='budget_king'), 2);
|
|---|
| 337 | INSERT INTO review (build_id, user_id, content, created_at) VALUES
|
|---|
| 338 | ((SELECT id FROM build WHERE name='God Tier 4090 Build'), (SELECT id FROM users WHERE username='budget_king'), 'Waaaaay too much money.', '2025-03-05');
|
|---|
| 339 |
|
|---|
| 340 | INSERT INTO rating_build (build_id, user_id, value) VALUES
|
|---|
| 341 | ((SELECT id FROM build WHERE name='Snow White Build'), (SELECT id FROM users WHERE username='rgb_lover'), 5),
|
|---|
| 342 | ((SELECT id FROM build WHERE name='Snow White Build'), (SELECT id FROM users WHERE username='office_guy'), 4);
|
|---|
| 343 |
|
|---|
| 344 | INSERT INTO rating_build (build_id, user_id, value) VALUES
|
|---|
| 345 | ((SELECT id FROM build WHERE name='Arch Linux Dev Box'), (SELECT id FROM users WHERE username='linux_fan'), 5),
|
|---|
| 346 | ((SELECT id FROM build WHERE name='Arch Linux Dev Box'), (SELECT id FROM users WHERE username='first_timer'), 1);
|
|---|
| 347 | INSERT INTO review (build_id, user_id, content, created_at) VALUES
|
|---|
| 348 | ((SELECT id FROM build WHERE name='Arch Linux Dev Box'), (SELECT id FROM users WHERE username='first_timer'), 'Could not install Windows easily.', '2024-10-20');
|
|---|
| 349 |
|
|---|
| 350 | INSERT INTO rating_build (build_id, user_id, value) VALUES
|
|---|
| 351 | ((SELECT id FROM build WHERE name='1080p Gamer'), (SELECT id FROM users WHERE username='streamer_pro'), 2),
|
|---|
| 352 | ((SELECT id FROM build WHERE name='1080p Gamer'), (SELECT id FROM users WHERE username='budget_king'), 3);
|
|---|
| 353 | INSERT INTO review (build_id, user_id, content, created_at) VALUES
|
|---|
| 354 | ((SELECT id FROM build WHERE name='1080p Gamer'), (SELECT id FROM users WHERE username='streamer_pro'), 'Stutters in Warzone.', '2025-01-10');
|
|---|
| 355 |
|
|---|
| 356 | INSERT INTO rating_build (build_id, user_id, value) VALUES
|
|---|
| 357 | ((SELECT id FROM build WHERE name='Silent Night'), (SELECT id FROM users WHERE username='rgb_lover'), 2),
|
|---|
| 358 | ((SELECT id FROM build WHERE name='Silent Night'), (SELECT id FROM users WHERE username='office_guy'), 5);
|
|---|
| 359 |
|
|---|
| 360 | INSERT INTO rating_build (build_id, user_id, value) VALUES
|
|---|
| 361 | ((SELECT id FROM build WHERE name='Radeon Ultimate'), (SELECT id FROM users WHERE username='pc_wizard'), 5),
|
|---|
| 362 | ((SELECT id FROM build WHERE name='Radeon Ultimate'), (SELECT id FROM users WHERE username='linux_fan'), 5);
|
|---|
| 363 |
|
|---|
| 364 | INSERT INTO suggestions (user_id, admin_id, link, admin_comment, description, status, component_type) VALUES
|
|---|
| 365 | (1, 4, 'https://www.nvidia.com/en-us/geforce/graphics-cards/40-series/rtx-4070-family/', NULL, 'Consider adding RTX 4070', 'pending', 'gpu');
|
|---|
| 366 | `
|
|---|
| 367 |
|
|---|
| 368 | const triggerSQL = `
|
|---|
| 369 | CREATE OR REPLACE FUNCTION update_build_total_price()
|
|---|
| 370 | RETURNS TRIGGER
|
|---|
| 371 | LANGUAGE plpgsql AS $$
|
|---|
| 372 | DECLARE
|
|---|
| 373 | target_build_id INT;
|
|---|
| 374 | BEGIN
|
|---|
| 375 | IF (TG_OP = 'DELETE') THEN
|
|---|
| 376 | target_build_id := OLD.build_id;
|
|---|
| 377 | ELSE
|
|---|
| 378 | target_build_id := NEW.build_id;
|
|---|
| 379 | END IF;
|
|---|
| 380 |
|
|---|
| 381 | UPDATE "build"
|
|---|
| 382 | SET "total_price" = (
|
|---|
| 383 | SELECT COALESCE(SUM(c.price * bc.num_components), 0)
|
|---|
| 384 | FROM "build_component" bc
|
|---|
| 385 | JOIN "components" c ON bc.component_id = c.id
|
|---|
| 386 | WHERE bc.build_id = target_build_id
|
|---|
| 387 | )
|
|---|
| 388 | WHERE id = target_build_id;
|
|---|
| 389 |
|
|---|
| 390 | RETURN NULL;
|
|---|
| 391 | END;
|
|---|
| 392 | $$;
|
|---|
| 393 |
|
|---|
| 394 | DROP TRIGGER IF EXISTS trigger_auto_update_price ON "build_component";
|
|---|
| 395 | CREATE TRIGGER trigger_auto_update_price
|
|---|
| 396 | AFTER INSERT OR UPDATE OR DELETE ON "build_component"
|
|---|
| 397 | FOR EACH ROW
|
|---|
| 398 | EXECUTE FUNCTION update_build_total_price();
|
|---|
| 399 |
|
|---|
| 400 |
|
|---|
| 401 |
|
|---|
| 402 | CREATE OR REPLACE FUNCTION check_review_validity()
|
|---|
| 403 | RETURNS TRIGGER
|
|---|
| 404 | LANGUAGE plpgsql AS $$
|
|---|
| 405 | DECLARE
|
|---|
| 406 | build_owner_id INT;
|
|---|
| 407 | BEGIN
|
|---|
| 408 | SELECT user_id INTO build_owner_id FROM "build" WHERE id = NEW.build_id;
|
|---|
| 409 |
|
|---|
| 410 | IF NEW.user_id = build_owner_id THEN
|
|---|
| 411 | RAISE EXCEPTION 'Cannot review own builds.';
|
|---|
| 412 | END IF;
|
|---|
| 413 |
|
|---|
| 414 | RETURN NEW;
|
|---|
| 415 | END;
|
|---|
| 416 | $$;
|
|---|
| 417 |
|
|---|
| 418 | DROP TRIGGER IF EXISTS trigger_check_self_review ON "review";
|
|---|
| 419 | CREATE TRIGGER trigger_check_self_review
|
|---|
| 420 | BEFORE INSERT ON "review"
|
|---|
| 421 | FOR EACH ROW
|
|---|
| 422 | EXECUTE FUNCTION check_review_validity();
|
|---|
| 423 |
|
|---|
| 424 |
|
|---|
| 425 |
|
|---|
| 426 | CREATE OR REPLACE FUNCTION check_rating_validity()
|
|---|
| 427 | RETURNS TRIGGER
|
|---|
| 428 | LANGUAGE plpgsql AS $$
|
|---|
| 429 | DECLARE
|
|---|
| 430 | build_owner_id INT;
|
|---|
| 431 | BEGIN
|
|---|
| 432 | SELECT user_id INTO build_owner_id FROM "build" WHERE id = NEW.build_id;
|
|---|
| 433 |
|
|---|
| 434 | IF NEW.user_id = build_owner_id THEN
|
|---|
| 435 | RAISE EXCEPTION 'Cannot rate own builds.';
|
|---|
| 436 | END IF;
|
|---|
| 437 |
|
|---|
| 438 | RETURN NEW;
|
|---|
| 439 | END;
|
|---|
| 440 | $$;
|
|---|
| 441 |
|
|---|
| 442 | DROP TRIGGER IF EXISTS trigger_check_self_rating ON "rating_build";
|
|---|
| 443 | CREATE TRIGGER trigger_check_self_rating
|
|---|
| 444 | BEFORE INSERT ON "rating_build"
|
|---|
| 445 | FOR EACH ROW
|
|---|
| 446 | EXECUTE FUNCTION check_rating_validity();
|
|---|
| 447 | `
|
|---|
| 448 |
|
|---|
| 449 | const functionSQL = `
|
|---|
| 450 | CREATE OR REPLACE FUNCTION get_report_top_components()
|
|---|
| 451 | RETURNS TABLE (
|
|---|
| 452 | type TEXT,
|
|---|
| 453 | brand TEXT,
|
|---|
| 454 | name TEXT,
|
|---|
| 455 | usage_count BIGINT,
|
|---|
| 456 | avg_build_rating NUMERIC
|
|---|
| 457 | )
|
|---|
| 458 | LANGUAGE sql
|
|---|
| 459 | AS $$
|
|---|
| 460 | SELECT
|
|---|
| 461 | c.type,
|
|---|
| 462 | c.brand,
|
|---|
| 463 | c.name,
|
|---|
| 464 | COUNT(bc.component_id) AS usage_count,
|
|---|
| 465 | AVG(rb.value) AS avg_build_rating
|
|---|
| 466 | FROM components c
|
|---|
| 467 | JOIN build_component bc ON c.id = bc.component_id
|
|---|
| 468 | JOIN build b ON bc.build_id = b.id
|
|---|
| 469 | JOIN rating_build rb ON b.id = rb.build_id
|
|---|
| 470 | WHERE b.created_at >= CURRENT_DATE - INTERVAL '1 year'
|
|---|
| 471 | GROUP BY c.type, c.brand, c.name
|
|---|
| 472 | HAVING AVG(rb.value) >= 4.5
|
|---|
| 473 | ORDER BY usage_count DESC, avg_build_rating DESC
|
|---|
| 474 | LIMIT 15;
|
|---|
| 475 | $$;
|
|---|
| 476 |
|
|---|
| 477 |
|
|---|
| 478 |
|
|---|
| 479 | CREATE OR REPLACE FUNCTION get_report_user_reputation_leaderboard()
|
|---|
| 480 | RETURNS TABLE (
|
|---|
| 481 | username TEXT,
|
|---|
| 482 | email TEXT,
|
|---|
| 483 | approved_builds_count BIGINT,
|
|---|
| 484 | total_favorites_received BIGINT,
|
|---|
| 485 | avg_rating_received NUMERIC,
|
|---|
| 486 | reputation_score NUMERIC
|
|---|
| 487 | )
|
|---|
| 488 | LANGUAGE sql
|
|---|
| 489 | AS $$
|
|---|
| 490 | WITH build_stats AS (
|
|---|
| 491 | SELECT
|
|---|
| 492 | b.id AS build_id,
|
|---|
| 493 | b.user_id,
|
|---|
| 494 | COUNT(DISTINCT fb.user_id) AS favorites_count,
|
|---|
| 495 | AVG(rb.value) AS avg_rating
|
|---|
| 496 | FROM build b
|
|---|
| 497 | LEFT JOIN favorite_build fb ON b.id = fb.build_id
|
|---|
| 498 | LEFT JOIN rating_build rb ON b.id = rb.build_id
|
|---|
| 499 | WHERE b.is_approved = TRUE
|
|---|
| 500 | GROUP BY b.id, b.user_id
|
|---|
| 501 | ),
|
|---|
| 502 | user_stats AS (
|
|---|
| 503 | SELECT
|
|---|
| 504 | user_id,
|
|---|
| 505 | COUNT(build_id) AS approved_builds_count,
|
|---|
| 506 | COALESCE(SUM(favorites_count), 0) AS total_favorites_received,
|
|---|
| 507 | AVG(avg_rating) AS avg_rating_received
|
|---|
| 508 | FROM build_stats
|
|---|
| 509 | GROUP BY user_id
|
|---|
| 510 | )
|
|---|
| 511 | SELECT
|
|---|
| 512 | u.username,
|
|---|
| 513 | u.email,
|
|---|
| 514 | us.approved_builds_count,
|
|---|
| 515 | us.total_favorites_received,
|
|---|
| 516 | ROUND(CAST(COALESCE(us.avg_rating_received, 0) AS numeric), 2) AS avg_rating_received,
|
|---|
| 517 | (
|
|---|
| 518 | (us.approved_builds_count * 10) +
|
|---|
| 519 | (us.total_favorites_received * 5) +
|
|---|
| 520 | (COALESCE(us.avg_rating_received, 0) * 20)
|
|---|
| 521 | ) AS reputation_score
|
|---|
| 522 | FROM user_stats us
|
|---|
| 523 | JOIN users u ON u.id = us.user_id
|
|---|
| 524 | ORDER BY reputation_score DESC
|
|---|
| 525 | LIMIT 10;
|
|---|
| 526 | $$;
|
|---|
| 527 |
|
|---|
| 528 |
|
|---|
| 529 |
|
|---|
| 530 | CREATE OR REPLACE FUNCTION get_report_price_to_performance()
|
|---|
| 531 | RETURNS TABLE (
|
|---|
| 532 | build_name TEXT,
|
|---|
| 533 | cpu_model TEXT,
|
|---|
| 534 | gpu_model TEXT,
|
|---|
| 535 | total_price NUMERIC,
|
|---|
| 536 | performance_score NUMERIC,
|
|---|
| 537 | price_to_performance_index NUMERIC
|
|---|
| 538 | )
|
|---|
| 539 | LANGUAGE sql
|
|---|
| 540 | AS $$
|
|---|
| 541 | WITH cpu_per_build AS (
|
|---|
| 542 | SELECT
|
|---|
| 543 | b.id AS build_id,
|
|---|
| 544 | c.name AS cpu_model,
|
|---|
| 545 | cpu.cores,
|
|---|
| 546 | cpu.base_clock
|
|---|
| 547 | FROM build b
|
|---|
| 548 | JOIN build_component bc ON b.id = bc.build_id
|
|---|
| 549 | JOIN components c ON bc.component_id = c.id
|
|---|
| 550 | JOIN cpu ON c.id = cpu.component_id
|
|---|
| 551 | WHERE LOWER(c.type) = LOWER('CPU')
|
|---|
| 552 | ),
|
|---|
| 553 | gpu_per_build AS (
|
|---|
| 554 | SELECT
|
|---|
| 555 | b.id AS build_id,
|
|---|
| 556 | c.name AS gpu_model,
|
|---|
| 557 | gpu.vram
|
|---|
| 558 | FROM build b
|
|---|
| 559 | JOIN build_component bc ON b.id = bc.build_id
|
|---|
| 560 | JOIN components c ON bc.component_id = c.id
|
|---|
| 561 | JOIN gpu ON c.id = gpu.component_id
|
|---|
| 562 | WHERE LOWER(c.type) = LOWER('GPU')
|
|---|
| 563 | )
|
|---|
| 564 | SELECT
|
|---|
| 565 | b.name AS build_name,
|
|---|
| 566 | cpu.cpu_model,
|
|---|
| 567 | gpu.gpu_model,
|
|---|
| 568 | b.total_price,
|
|---|
| 569 | (cpu.cores * cpu.base_clock + gpu.vram * 100) AS performance_score,
|
|---|
| 570 | ROUND(
|
|---|
| 571 | CAST(
|
|---|
| 572 | (cpu.cores * cpu.base_clock + gpu.vram * 100) / NULLIF(b.total_price, 0)
|
|---|
| 573 | AS numeric),
|
|---|
| 574 | 4
|
|---|
| 575 | ) AS price_to_performance_index
|
|---|
| 576 | FROM build b
|
|---|
| 577 | JOIN cpu_per_build cpu ON b.id = cpu.build_id
|
|---|
| 578 | JOIN gpu_per_build gpu ON b.id = gpu.build_id
|
|---|
| 579 | WHERE b.total_price > 0
|
|---|
| 580 | ORDER BY price_to_performance_index DESC
|
|---|
| 581 | LIMIT 20;
|
|---|
| 582 | $$;
|
|---|
| 583 |
|
|---|
| 584 |
|
|---|
| 585 |
|
|---|
| 586 | CREATE OR REPLACE FUNCTION get_report_budget_tier_popularity()
|
|---|
| 587 | RETURNS TABLE (
|
|---|
| 588 | price_tier TEXT,
|
|---|
| 589 | builds_count BIGINT,
|
|---|
| 590 | avg_favorites NUMERIC,
|
|---|
| 591 | avg_rating NUMERIC,
|
|---|
| 592 | unique_builders BIGINT,
|
|---|
| 593 | engagement_score NUMERIC
|
|---|
| 594 | )
|
|---|
| 595 | LANGUAGE sql
|
|---|
| 596 | AS $$
|
|---|
| 597 | WITH price_tier_builds AS (
|
|---|
| 598 | SELECT
|
|---|
| 599 | b.id AS build_id,
|
|---|
| 600 | b.user_id,
|
|---|
| 601 | b.total_price,
|
|---|
| 602 | CASE
|
|---|
| 603 | WHEN b.total_price < 500 THEN 'Budget'
|
|---|
| 604 | WHEN b.total_price < 1000 THEN 'Mid-Range'
|
|---|
| 605 | WHEN b.total_price < 2000 THEN 'High-End'
|
|---|
| 606 | ELSE 'Enthusiast'
|
|---|
| 607 | END AS price_tier
|
|---|
| 608 | FROM build b
|
|---|
| 609 | WHERE b.is_approved = TRUE
|
|---|
| 610 | AND b.created_at >= CURRENT_DATE - INTERVAL '6 months'
|
|---|
| 611 | ),
|
|---|
| 612 | favorites AS (
|
|---|
| 613 | SELECT
|
|---|
| 614 | build_id,
|
|---|
| 615 | COUNT(DISTINCT user_id) AS favorites_count
|
|---|
| 616 | FROM favorite_build
|
|---|
| 617 | GROUP BY build_id
|
|---|
| 618 | ),
|
|---|
| 619 | engagement_stats AS (
|
|---|
| 620 | SELECT
|
|---|
| 621 | ptb.price_tier,
|
|---|
| 622 | COUNT(DISTINCT ptb.build_id) AS builds_count,
|
|---|
| 623 | AVG(COALESCE(f.favorites_count, 0)) AS avg_favorites,
|
|---|
| 624 | AVG(rb.value) AS avg_rating,
|
|---|
| 625 | COUNT(DISTINCT ptb.user_id) AS unique_builders
|
|---|
| 626 | FROM price_tier_builds ptb
|
|---|
| 627 | LEFT JOIN rating_build rb ON ptb.build_id = rb.build_id
|
|---|
| 628 | LEFT JOIN favorites f ON ptb.build_id = f.build_id
|
|---|
| 629 | GROUP BY ptb.price_tier
|
|---|
| 630 | )
|
|---|
| 631 | SELECT
|
|---|
| 632 | price_tier,
|
|---|
| 633 | builds_count,
|
|---|
| 634 | ROUND(CAST(avg_favorites AS numeric), 1) AS avg_favorites,
|
|---|
| 635 | ROUND(CAST(COALESCE(avg_rating, 0) AS numeric), 2) AS avg_rating,
|
|---|
| 636 | unique_builders,
|
|---|
| 637 | ROUND(
|
|---|
| 638 | CAST(
|
|---|
| 639 | (builds_count * 2) +
|
|---|
| 640 | (avg_favorites * 3) +
|
|---|
| 641 | (COALESCE(avg_rating, 0) * 10) +
|
|---|
| 642 | (unique_builders * 1.5)
|
|---|
| 643 | AS numeric),
|
|---|
| 644 | 2
|
|---|
| 645 | ) AS engagement_score
|
|---|
| 646 | FROM engagement_stats
|
|---|
| 647 | ORDER BY engagement_score DESC
|
|---|
| 648 | LIMIT 15;
|
|---|
| 649 | $$;
|
|---|
| 650 |
|
|---|
| 651 |
|
|---|
| 652 |
|
|---|
| 653 | CREATE OR REPLACE FUNCTION get_report_compatibility()
|
|---|
| 654 | RETURNS TABLE (
|
|---|
| 655 | cpu_combo TEXT,
|
|---|
| 656 | motherboard_chipset TEXT,
|
|---|
| 657 | total_builds BIGINT,
|
|---|
| 658 | avg_satisfaction NUMERIC,
|
|---|
| 659 | success_rate NUMERIC
|
|---|
| 660 | )
|
|---|
| 661 | LANGUAGE sql
|
|---|
| 662 | AS $$
|
|---|
| 663 | WITH cpu_mobo_pairs AS (
|
|---|
| 664 | SELECT
|
|---|
| 665 | cpu_comp.brand AS cpu_brand,
|
|---|
| 666 | cpu_comp.name AS cpu_model,
|
|---|
| 667 | mobo.chipset AS motherboard_chipset,
|
|---|
| 668 | b.id AS build_id,
|
|---|
| 669 | b.user_id,
|
|---|
| 670 | b.created_at
|
|---|
| 671 | FROM build b
|
|---|
| 672 | JOIN build_component bc_cpu ON b.id = bc_cpu.build_id
|
|---|
| 673 | JOIN components cpu_comp ON bc_cpu.component_id = cpu_comp.id
|
|---|
| 674 | JOIN cpu ON cpu.component_id = cpu_comp.id
|
|---|
| 675 | JOIN build_component bc_mobo ON b.id = bc_mobo.build_id
|
|---|
| 676 | JOIN components mobo_comp ON bc_mobo.component_id = mobo_comp.id
|
|---|
| 677 | JOIN motherboard mobo ON mobo.component_id = mobo_comp.id
|
|---|
| 678 | WHERE b.is_approved = TRUE
|
|---|
| 679 | ),
|
|---|
| 680 | recent_activity AS (
|
|---|
| 681 | SELECT DISTINCT build_id
|
|---|
| 682 | FROM review
|
|---|
| 683 | WHERE created_at >= CURRENT_DATE - INTERVAL '3 months'
|
|---|
| 684 | ),
|
|---|
| 685 | pair_metrics AS (
|
|---|
| 686 | SELECT
|
|---|
| 687 | cmp.cpu_brand,
|
|---|
| 688 | cmp.cpu_model,
|
|---|
| 689 | cmp.motherboard_chipset,
|
|---|
| 690 | COUNT(DISTINCT cmp.build_id) AS total_builds,
|
|---|
| 691 | AVG(COALESCE(rb.value, 0)) AS avg_satisfaction,
|
|---|
| 692 | COUNT(DISTINCT ra.build_id) AS active_builds
|
|---|
| 693 | FROM cpu_mobo_pairs cmp
|
|---|
| 694 | LEFT JOIN rating_build rb ON cmp.build_id = rb.build_id
|
|---|
| 695 | LEFT JOIN recent_activity ra ON cmp.build_id = ra.build_id
|
|---|
| 696 | GROUP BY
|
|---|
| 697 | cmp.cpu_brand,
|
|---|
| 698 | cmp.cpu_model,
|
|---|
| 699 | cmp.motherboard_chipset
|
|---|
| 700 | HAVING COUNT(DISTINCT cmp.build_id) >= 2
|
|---|
| 701 | )
|
|---|
| 702 | SELECT
|
|---|
| 703 | CONCAT(cpu_brand, ' ', cpu_model) AS cpu_combo,
|
|---|
| 704 | motherboard_chipset,
|
|---|
| 705 | total_builds,
|
|---|
| 706 | ROUND(CAST(avg_satisfaction AS numeric), 2) AS avg_satisfaction,
|
|---|
| 707 | ROUND(
|
|---|
| 708 | CAST(
|
|---|
| 709 | (avg_satisfaction / 5.0) * 0.6 +
|
|---|
| 710 | (CAST(active_builds AS DECIMAL) / total_builds) * 0.4
|
|---|
| 711 | AS numeric),
|
|---|
| 712 | 3
|
|---|
| 713 | ) AS success_rate
|
|---|
| 714 | FROM pair_metrics
|
|---|
| 715 | ORDER BY success_rate DESC, total_builds DESC
|
|---|
| 716 | LIMIT 15;
|
|---|
| 717 | $$;
|
|---|
| 718 |
|
|---|
| 719 |
|
|---|
| 720 |
|
|---|
| 721 | CREATE OR REPLACE FUNCTION get_report_storage_optimization()
|
|---|
| 722 | RETURNS TABLE (
|
|---|
| 723 | config_type TEXT,
|
|---|
| 724 | ssd_brand TEXT,
|
|---|
| 725 | builds_count BIGINT,
|
|---|
| 726 | avg_storage_cost NUMERIC,
|
|---|
| 727 | avg_total_capacity_gb NUMERIC,
|
|---|
| 728 | avg_build_rating NUMERIC,
|
|---|
| 729 | storage_cost_pct NUMERIC,
|
|---|
| 730 | optimization_score NUMERIC
|
|---|
| 731 | )
|
|---|
| 732 | LANGUAGE sql
|
|---|
| 733 | AS $$
|
|---|
| 734 | WITH storage_configs AS (
|
|---|
| 735 | SELECT
|
|---|
| 736 | b.id AS build_id,
|
|---|
| 737 | b.total_price,
|
|---|
| 738 |
|
|---|
| 739 | ssd_comp.brand AS ssd_brand,
|
|---|
| 740 | ssd_storage.capacity AS ssd_capacity,
|
|---|
| 741 | ssd_comp.price AS ssd_price,
|
|---|
| 742 |
|
|---|
| 743 | hdd_storage.capacity AS hdd_capacity,
|
|---|
| 744 | hdd_comp.price AS hdd_price,
|
|---|
| 745 |
|
|---|
| 746 | CASE
|
|---|
| 747 | WHEN hdd_storage.capacity IS NULL THEN 'SSD-Only'
|
|---|
| 748 | WHEN ssd_storage.capacity < 512 THEN 'SSD-Boot-HDD-Storage'
|
|---|
| 749 | ELSE 'SSD-Primary-HDD-Archive'
|
|---|
| 750 | END AS config_type
|
|---|
| 751 | FROM build b
|
|---|
| 752 | JOIN build_component bc_ssd ON b.id = bc_ssd.build_id
|
|---|
| 753 | JOIN components ssd_comp ON bc_ssd.component_id = ssd_comp.id
|
|---|
| 754 | JOIN storage ssd_storage ON ssd_storage.component_id = ssd_comp.id
|
|---|
| 755 |
|
|---|
| 756 | LEFT JOIN build_component bc_hdd ON b.id = bc_hdd.build_id
|
|---|
| 757 | LEFT JOIN components hdd_comp ON bc_hdd.component_id = hdd_comp.id
|
|---|
| 758 | LEFT JOIN storage hdd_storage ON hdd_storage.component_id = hdd_comp.id
|
|---|
| 759 |
|
|---|
| 760 | WHERE ssd_comp.type = 'storage'
|
|---|
| 761 | AND b.is_approved = TRUE
|
|---|
| 762 | AND b.created_at >= CURRENT_DATE - INTERVAL '1 year'
|
|---|
| 763 |
|
|---|
| 764 | AND (
|
|---|
| 765 | ssd_storage.type ILIKE '%nvme%'
|
|---|
| 766 | OR ssd_storage.type ILIKE '%ssd%'
|
|---|
| 767 | OR ssd_storage.type ILIKE '%m.2%'
|
|---|
| 768 | OR ssd_storage.form_factor ILIKE '%m.2%'
|
|---|
| 769 | )
|
|---|
| 770 | AND (
|
|---|
| 771 | hdd_storage.component_id IS NULL
|
|---|
| 772 | OR hdd_storage.type ILIKE '%hdd%'
|
|---|
| 773 | OR hdd_storage.form_factor ILIKE '%3.5%'
|
|---|
| 774 | )
|
|---|
| 775 | ),
|
|---|
| 776 | config_performance AS (
|
|---|
| 777 | SELECT
|
|---|
| 778 | sc.config_type,
|
|---|
| 779 | sc.ssd_brand,
|
|---|
| 780 | COUNT(sc.build_id) AS builds_count,
|
|---|
| 781 | AVG(sc.ssd_price + COALESCE(sc.hdd_price, 0)) AS avg_storage_cost,
|
|---|
| 782 | AVG(sc.ssd_capacity + COALESCE(sc.hdd_capacity, 0)) AS avg_total_capacity,
|
|---|
| 783 | AVG(rb.value) AS avg_build_rating,
|
|---|
| 784 | AVG((sc.ssd_price + COALESCE(sc.hdd_price, 0)) / NULLIF(sc.total_price, 0)) AS storage_cost_ratio
|
|---|
| 785 | FROM storage_configs sc
|
|---|
| 786 | LEFT JOIN rating_build rb ON sc.build_id = rb.build_id
|
|---|
| 787 | GROUP BY sc.config_type, sc.ssd_brand
|
|---|
| 788 | HAVING COUNT(sc.build_id) >= 2
|
|---|
| 789 | )
|
|---|
| 790 | SELECT
|
|---|
| 791 | config_type,
|
|---|
| 792 | ssd_brand,
|
|---|
| 793 | builds_count,
|
|---|
| 794 | ROUND(CAST(avg_storage_cost AS numeric), 2) AS avg_storage_cost,
|
|---|
| 795 | ROUND(CAST(avg_total_capacity AS numeric), 0) AS avg_total_capacity_gb,
|
|---|
| 796 | ROUND(CAST(COALESCE(avg_build_rating, 0) AS numeric), 2) AS avg_build_rating,
|
|---|
| 797 | ROUND(CAST(COALESCE(storage_cost_ratio, 0) * 100 AS numeric), 1) AS storage_cost_pct,
|
|---|
| 798 | ROUND(
|
|---|
| 799 | CAST(
|
|---|
| 800 | (COALESCE(avg_build_rating, 0) / 5.0 * 40) +
|
|---|
| 801 | (avg_total_capacity / NULLIF(avg_storage_cost, 0) * 0.5) +
|
|---|
| 802 | ((1 - COALESCE(storage_cost_ratio, 0)) * 30) +
|
|---|
| 803 | (LN(CAST(builds_count + 1 AS numeric)) * 5)
|
|---|
| 804 | AS numeric),
|
|---|
| 805 | 2
|
|---|
| 806 | ) AS optimization_score
|
|---|
| 807 | FROM config_performance
|
|---|
| 808 | ORDER BY optimization_score DESC, builds_count DESC
|
|---|
| 809 | LIMIT 15;
|
|---|
| 810 | $$;
|
|---|
| 811 | `
|
|---|
| 812 |
|
|---|
| 813 | async function seed() {
|
|---|
| 814 | if (!process.env.DATABASE_URL) {
|
|---|
| 815 | throw new Error('DATABASE_URL environment variable not set');
|
|---|
| 816 | }
|
|---|
| 817 |
|
|---|
| 818 | const client = new pg.Client({
|
|---|
| 819 | connectionString: process.env.DATABASE_URL,
|
|---|
| 820 | });
|
|---|
| 821 |
|
|---|
| 822 | try {
|
|---|
| 823 | await client.connect();
|
|---|
| 824 |
|
|---|
| 825 | console.log('Checking if database needs seeding...');
|
|---|
| 826 |
|
|---|
| 827 | const result = await client.query('SELECT COUNT(*) as count FROM users');
|
|---|
| 828 | const count = parseInt(result.rows[0].count);
|
|---|
| 829 |
|
|---|
| 830 | if (count === 0) {
|
|---|
| 831 | console.log('Seeding initial data...');
|
|---|
| 832 | await client.query(dataSQL);
|
|---|
| 833 | console.log('Data seeded successfully.');
|
|---|
| 834 | } else {
|
|---|
| 835 | console.log('Database already contains data, skipping data seed.');
|
|---|
| 836 | }
|
|---|
| 837 |
|
|---|
| 838 | console.log('Applying Database Triggers...');
|
|---|
| 839 | await client.query(triggerSQL);
|
|---|
| 840 |
|
|---|
| 841 | console.log('Applying Database Functions...');
|
|---|
| 842 | await client.query(functionSQL);
|
|---|
| 843 |
|
|---|
| 844 | console.log('Database seeded successfully...');
|
|---|
| 845 | } catch (error) {
|
|---|
| 846 | console.error('Seed failed:', error);
|
|---|
| 847 | throw error;
|
|---|
| 848 | } finally {
|
|---|
| 849 | await client.end();
|
|---|
| 850 | }
|
|---|
| 851 | }
|
|---|
| 852 |
|
|---|
| 853 | seed().catch((err) => {
|
|---|
| 854 | console.error(err);
|
|---|
| 855 | process.exit(1);
|
|---|
| 856 | }); |
|---|