Changeset 591278c for database.js


Ignore:
Timestamp:
02/22/26 17:24:14 (7 months ago)
Author:
Klimentina Efremova <klimentina08642@…>
Branches:
finki-main, main
Children:
4dff800
Parents:
69f2a41
Message:

Fixed Product and Category adding

File:
1 edited

Legend:

Unmodified
Added
Removed
  • database.js

    r69f2a41 r591278c  
    2424database.run('PRAGMA foreign_keys = ON');
    2525
    26 // Helper function to ensure general category exists
     26// Helper function to ensure general category exists with ID 1
    2727function ensureGeneralCategory(callback) {
    28     database.get('SELECT category_id FROM category WHERE name = ?', ['General'], (err, row) => {
     28    // First check if category with ID 1 exists and is named 'General'
     29    database.get('SELECT category_id, name FROM category WHERE category_id = 1', [], (err, row) => {
    2930        if (err) {
    3031            callback(err);
    31         } else if (!row) {
     32        } else if (row && row.name === 'General') {
     33            // Category with ID 1 already exists and is General
     34            console.log('✅ General category exists with ID: 1');
     35            callback(null);
     36        } else if (row && row.name !== 'General') {
     37            // Category with ID 1 exists but has different name - update it
    3238            database.run(
    33                 'INSERT INTO category (name, description) VALUES (?, ?)',
     39                'UPDATE category SET name = ?, description = ? WHERE category_id = 1',
    3440                ['General', 'General products category'],
    3541                function(err) {
    36                     callback(err);
     42                    if (err) {
     43                        callback(err);
     44                    } else {
     45                        console.log('✅ Updated category ID 1 to General');
     46                        callback(null);
     47                    }
    3748                }
    3849            );
    3950        } else {
    40             callback(null);
     51            // No category with ID 1 exists, create it
     52            // First, check if we need to reset the autoincrement sequence
     53            database.run(
     54                'INSERT INTO category (category_id, name, description) VALUES (1, ?, ?)',
     55                ['General', 'General products category'],
     56                function(err) {
     57                    if (err) {
     58                        // If insert fails, try without specifying ID (let SQLite assign it)
     59                        database.run(
     60                            'INSERT INTO category (name, description) VALUES (?, ?)',
     61                            ['General', 'General products category'],
     62                            function(err) {
     63                                if (err) {
     64                                    callback(err);
     65                                } else {
     66                                    console.log('✅ Created General category with auto-assigned ID');
     67                                    callback(null);
     68                                }
     69                            }
     70                        );
     71                    } else {
     72                        console.log('✅ Created General category with ID: 1');
     73                        callback(null);
     74                    }
     75                }
     76            );
    4177        }
    4278    });
    … …  
    4581// Helper function to get the General category ID
    4682function getGeneralCategoryId(callback) {
    47     database.get('SELECT category_id FROM category WHERE name = ?', ['General'], (err, row) => {
     83    // First try to get category with ID 1 that is named 'General'
     84    database.get('SELECT category_id FROM category WHERE category_id = 1 AND name = ?', ['General'], (err, row) => {
    4885        if (err) {
    4986            callback(err, null);
    … …  
    5188            callback(null, row.category_id);
    5289        } else {
    53             // Create General category if it doesn't exist
    54             database.run(
    55                 'INSERT INTO category (name, description) VALUES (?, ?)',
    56                 ['General', 'General products category'],
    57                 function(err) {
    58                     if (err) {
    59                         callback(err, null);
    60                     } else {
    61                         callback(null, this.lastID);
    62                     }
    63                 }
    64             );
     90            // If not found with ID 1, try to find by name
     91            database.get('SELECT category_id FROM category WHERE name = ?', ['General'], (err, row) => {
     92                if (err) {
     93                    callback(err, null);
     94                } else if (row) {
     95                    callback(null, row.category_id);
     96                } else {
     97                    // Create General category if it doesn't exist
     98                    database.run(
     99                        'INSERT INTO category (name, description) VALUES (?, ?)',
     100                        ['General', 'General products category'],
     101                        function(err) {
     102                            if (err) {
     103                                callback(err, null);
     104                            } else {
     105                                const newId = this.lastID;
     106                                console.log(`✅ Created new General category with ID: ${newId}`);
     107                                callback(null, newId);
     108                            }
     109                        }
     110                    );
     111                }
     112            });
    65113        }
    66114    });
    … …  
    84132        database.all(
    85133            `SELECT r.* FROM roles r
    86              JOIN user_roles ur ON r.role_id = ur.role_id
    87              WHERE ur.user_id = ?`,
     134       JOIN user_roles ur ON r.role_id = ur.role_id
     135       WHERE ur.user_id = ?`,
    88136            [id],
    89137            (err, roles) => {
    … …  
    184232function getProducts(categoryId, searchTerm, callback) {
    185233    let query = `
    186         SELECT p.*, c.name as category_name, s.name as store_name
    187         FROM product p
    188         JOIN category c ON p.category_id = c.category_id
    189         JOIN store s ON p.store_id = s.store_id
    190         WHERE 1=1
    191     `;
     234    SELECT p.*, c.name as category_name, s.name as store_name
     235    FROM product p
     236    JOIN category c ON p.category_id = c.category_id
     237    JOIN store s ON p.store_id = s.store_id
     238    WHERE 1=1
     239  `;
    192240    const params = [];
    193241
    … …  
    214262    database.get(
    215263        `SELECT p.*, c.name as category_name, s.name as store_name
    216          FROM product p
    217          JOIN category c ON p.category_id = c.category_id
    218          JOIN store s ON p.store_id = s.store_id
    219          WHERE p.id = ?`,
     264     FROM product p
     265     JOIN category c ON p.category_id = c.category_id
     266     JOIN store s ON p.store_id = s.store_id
     267     WHERE p.id = ?`,
    220268        [id],
    221269        (err, row) => {
    … …  
    256304    database.get(
    257305        `SELECT p.*, c.name as category_name, s.name as store_name
    258          FROM product p
    259          JOIN category c ON p.category_id = c.category_id
    260          JOIN store s ON p.store_id = s.store_id
    261          WHERE p.code = ?`,
     306     FROM product p
     307     JOIN category c ON p.category_id = c.category_id
     308     JOIN store s ON p.store_id = s.store_id
     309     WHERE p.code = ?`,
    262310        [code],
    263311        (err, row) => {
    … …  
    317365        database.run(
    318366            `INSERT INTO product (
    319                 id, code, description, price, availability, weight, dimensions,
    320                 production_time, category_id, store_id, created_at
    321             ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, datetime('now'))`,
     367        id, code, description, price, availability, weight, dimensions,
     368        production_time, category_id, store_id, created_at
     369      ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, datetime('now'))`,
    322370            [
    323371                'PROD_' + Date.now().toString().slice(-8), // Generate a unique ID
    … …  
    341389                    database.run(
    342390                        `INSERT INTO "change" (date_and_time, product_code, changes)
    343                          VALUES (datetime('now'), ?, ?)`,
     391             VALUES (datetime('now'), ?, ?)`,
    344392                        [productData.code, 'Product created'],
    345393                        function(err) {
    … …  
    353401                    database.run(
    354402                        `INSERT INTO makes_change (personal_id, change_date_time, product_code)
    355                          VALUES (?, datetime('now'), ?)`,
     403             VALUES (?, datetime('now'), ?)`,
    356404                        [personalId, productData.code],
    357405                        function(err) {
    … …  
    367415                            database.run(
    368416                                `INSERT INTO image (product_code, image_url, is_primary)
    369                                  VALUES (?, ?, ?)`,
     417                 VALUES (?, ?, ?)`,
    370418                                [productData.code, imageUrl, index === 0 ? 1 : 0],
    371419                                function(err) {
    … …  
    409457        params.push(productData.description);
    410458    }
     459
    411460    if (productData.price !== undefined) {
    412461        updates.push('price = ?');
    413462        params.push(productData.price);
    414463    }
     464
    415465    if (productData.availability !== undefined) {
    416466        updates.push('availability = ?');
    417467        params.push(productData.availability);
    418468    }
     469
    419470    if (productData.weight !== undefined) {
    420471        updates.push('weight = ?');
    421472        params.push(productData.weight);
    422473    }
     474
    423475    if (productData.dimensions !== undefined) {
    424476        updates.push('dimensions = ?');
    425477        params.push(productData.dimensions);
    426478    }
     479
    427480    if (productData.production_time !== undefined) {
    428481        updates.push('production_time = ?');
    429482        params.push(productData.production_time);
    430483    }
     484
    431485    if (productData.category_id !== undefined) {
    432486        updates.push('category_id = ?');
    … …  
    452506                database.run(
    453507                    `INSERT INTO "change" (date_and_time, product_code, changes)
    454                      VALUES (datetime('now'), ?, ?)`,
     508           VALUES (datetime('now'), ?, ?)`,
    455509                    [productData.code, changesDesc],
    456510                    function(err) {
    … …  
    461515                        database.run(
    462516                            `INSERT INTO makes_change (personal_id, change_date_time, product_code)
    463                              VALUES (?, datetime('now'), ?)`,
     517               VALUES (?, datetime('now'), ?)`,
    464518                            [personalId, productData.code],
    465519                            function(err) {
    … …  
    520574        database.run(
    521575            `INSERT INTO "change" (date_and_time, product_code, changes)
    522              VALUES (datetime('now'), ?, ?)`,
     576       VALUES (datetime('now'), ?, ?)`,
    523577            [productCode, 'Product deleted'],
    524578            function(err) {
    … …  
    532586                database.run(
    533587                    `INSERT INTO makes_change (personal_id, change_date_time, product_code)
    534                      VALUES (?, datetime('now'), ?)`,
     588           VALUES (?, datetime('now'), ?)`,
    535589                    [personalId, productCode],
    536590                    function(err) {
    … …  
    571625    database.all(
    572626        `SELECT c1.*, c2.name as parent_name
    573          FROM category c1
    574          LEFT JOIN category c2 ON c1.parent_category_id = c2.category_id
    575          ORDER BY c1.name`,
     627     FROM category c1
     628     LEFT JOIN category c2 ON c1.parent_category_id = c2.category_id
     629     ORDER BY c1.name`,
    576630        [],
    577631        (err, rows) => {
    … …  
    610664    database.all(
    611665        `SELECT p.*, c.name as category_name
    612          FROM product p
    613          JOIN category c ON p.category_id = c.category_id
    614          WHERE p.store_id = ?
    615          ORDER BY p.code`,
     666     FROM product p
     667     JOIN category c ON p.category_id = c.category_id
     668     WHERE p.store_id = ?
     669     ORDER BY p.code`,
    616670        [storeId],
    617671        (err, rows) => {
    … …  
    628682    database.all(
    629683        `SELECT o.*, c.first_name, c.last_name
    630          FROM "order" o
    631          JOIN client c ON o.client_id = c.client_id
    632          WHERE o.store_id = ?
    633          ORDER BY o.order_date DESC`,
     684     FROM "order" o
     685     JOIN client c ON o.client_id = c.client_id
     686     WHERE o.store_id = ?
     687     ORDER BY o.order_date DESC`,
    634688        [storeId],
    635689        (err, rows) => {
    … …  
    649703                    database.all(
    650704                        `SELECT oi.*, p.description
    651                          FROM order_items oi
    652                          JOIN product p ON oi.product_code = p.code
    653                          WHERE oi.order_num = ?`,
     705             FROM order_items oi
     706             JOIN product p ON oi.product_code = p.code
     707             WHERE oi.order_num = ?`,
    654708                        [order.order_num],
    655709                        (err, items) => {
    … …  
    659713                                order.items = [];
    660714                            }
    661 
    662715                            completed++;
    663716                            if (completed === orders.length) {
    … …  
    675728    database.all(
    676729        `SELECT p.*, e.date_of_hire, perm.type as permission_type, perm.authorisation
    677          FROM personal p
    678          JOIN works_in_store w ON p.id = w.personal_id
    679          LEFT JOIN employees e ON p.id = e.employee_id
    680          LEFT JOIN permissions perm ON p.id = perm.personal_id
    681          WHERE w.store_id = ?`,
     730     FROM personal p
     731     JOIN works_in_store w ON p.id = w.personal_id
     732     LEFT JOIN employees e ON p.id = e.employee_id
     733     LEFT JOIN permissions perm ON p.id = perm.personal_id
     734     WHERE w.store_id = ?`,
    682735        [storeId],
    683736        (err, rows) => {
    … …  
    690743    database.all(
    691744        `SELECT * FROM report
    692          WHERE store_id = ?
    693          ORDER BY generated_at DESC`,
     745     WHERE store_id = ?
     746     ORDER BY generated_at DESC`,
    694747        [storeId],
    695748        (err, rows) => {
    … …  
    719772                    database.get(
    720773                        `SELECT SUM(oi.price * oi.quantity) as total_revenue
    721                          FROM order_items oi
    722                          JOIN "order" o ON oi.order_num = o.order_num
    723                          WHERE o.store_id = ?`,
     774             FROM order_items oi
     775             JOIN "order" o ON oi.order_num = o.order_num
     776             WHERE o.store_id = ?`,
    724777                        [storeId],
    725778                        (err, row) => {
    … …  
    729782                            database.get(
    730783                                `SELECT AVG(rating) as avg_rating
    731                                  FROM review r
    732                                  JOIN product p ON r.product_code = p.code
    733                                  WHERE p.store_id = ?`,
     784                 FROM review r
     785                 JOIN product p ON r.product_code = p.code
     786                 WHERE p.store_id = ?`,
    734787                                [storeId],
    735788                                (err, row) => {
    736789                                    stats.avg_rating = row && row.avg_rating ? row.avg_rating : 0;
    737 
    738790                                    callback(null, stats);
    739791                                }
    … …  
    757809        database.run(
    758810            `INSERT INTO "order" (order_num, client_id, order_date, quantity, payment_method,
    759                                  discount, delivery_address, store_id)
    760              VALUES (?, ?, datetime('now'), ?, ?, ?, ?, ?)`,
     811        discount, delivery_address, store_id)
     812       VALUES (?, ?, datetime('now'), ?, ?, ?, ?, ?)`,
    761813            [
    762814                orderData.order_num,
    … …  
    787839                    database.run(
    788840                        `INSERT INTO order_items (order_num, product_code, quantity, price)
    789                          VALUES (?, ?, ?, ?)`,
     841             VALUES (?, ?, ?, ?)`,
    790842                        [orderData.order_num, item.product_code, item.quantity, item.price],
    791843                        function(err) {
    … …  
    817869    database.all(
    818870        `SELECT o.*, s.name as store_name
    819          FROM "order" o
    820          JOIN store s ON o.store_id = s.store_id
    821          WHERE o.client_id = ?
    822          ORDER BY o.order_date DESC`,
     871     FROM "order" o
     872     JOIN store s ON o.store_id = s.store_id
     873     WHERE o.client_id = ?
     874     ORDER BY o.order_date DESC`,
    823875        [clientId],
    824876        (err, rows) => {
    … …  
    838890                    database.all(
    839891                        `SELECT oi.*, p.description
    840                          FROM order_items oi
    841                          JOIN product p ON oi.product_code = p.code
    842                          WHERE oi.order_num = ?`,
     892             FROM order_items oi
     893             JOIN product p ON oi.product_code = p.code
     894             WHERE oi.order_num = ?`,
    843895                        [order.order_num],
    844896                        (err, items) => {
    … …  
    848900                                order.items = [];
    849901                            }
    850 
    851902                            completed++;
    852903                            if (completed === orders.length) {
    … …  
    864915    database.all(
    865916        `SELECT o.*, c.first_name, c.last_name, s.name as store_name
    866          FROM "order" o
    867          JOIN client c ON o.client_id = c.client_id
    868          JOIN store s ON o.store_id = s.store_id
    869          ORDER BY o.order_date DESC`,
     917     FROM "order" o
     918     JOIN client c ON o.client_id = c.client_id
     919     JOIN store s ON o.store_id = s.store_id
     920     ORDER BY o.order_date DESC`,
    870921        [],
    871922        (err, rows) => {
    … …  
    879930    database.run(
    880931        `INSERT INTO review (review_id, client_id, product_code, rating, comment, review_date)
    881          VALUES (?, ?, ?, ?, ?, datetime('now'))`,
     932     VALUES (?, ?, ?, ?, ?, datetime('now'))`,
    882933        [
    883934            'REV' + Date.now().toString().slice(-8),
    … …  
    901952    database.run(
    902953        `INSERT INTO request (request_num, date_and_time, problem, client_id, store_id)
    903          VALUES (?, ?, ?, ?, ?)`,
     954     VALUES (?, ?, ?, ?, ?)`,
    904955        [
    905956            requestData.request_num,
    … …  
    923974    database.run(
    924975        `INSERT INTO refund (refund_id, order_num, amount, reason, request_date)
    925          VALUES (?, ?, ?, ?, datetime('now'))`,
     976     VALUES (?, ?, ?, ?, datetime('now'))`,
    926977        [
    927978            refundData.refund_id,
    … …  
    9511002    database.all(
    9521003        `SELECT o.*, c.first_name, c.last_name
    953          FROM "order" o
    954          JOIN client c ON o.client_id = c.client_id
    955          WHERE o.store_id = ? AND o.status = 'pending'
    956          ORDER BY o.order_date ASC`,
     1004     FROM "order" o
     1005     JOIN client c ON o.client_id = c.client_id
     1006     WHERE o.store_id = ? AND o.status = 'pending'
     1007     ORDER BY o.order_date ASC`,
    9571008        [storeId],
    9581009        (err, rows) => {
    … …  
    9641015            database.all(
    9651016                `SELECT r.*, c.first_name, c.last_name
    966                  FROM request r
    967                  JOIN client c ON r.client_id = c.client_id
    968                  WHERE r.store_id = ? AND r.status = 'pending'
    969                  ORDER BY r.date_and_time ASC`,
     1017         FROM request r
     1018         JOIN client c ON r.client_id = c.client_id
     1019         WHERE r.store_id = ? AND r.status = 'pending'
     1020         ORDER BY r.date_and_time ASC`,
    9701021                [storeId],
    9711022                (err, rows) => {
    … …  
    9771028                    database.all(
    9781029                        `SELECT rf.*, o.client_id, c.first_name, c.last_name
    979                          FROM refund rf
    980                          JOIN "order" o ON rf.order_num = o.order_num
    981                          JOIN client c ON o.client_id = c.client_id
    982                          WHERE o.store_id = ? AND rf.status = 'pending'
    983                          ORDER BY rf.request_date ASC`,
     1030             FROM refund rf
     1031             JOIN "order" o ON rf.order_num = o.order_num
     1032             JOIN client c ON o.client_id = c.client_id
     1033             WHERE o.store_id = ? AND rf.status = 'pending'
     1034             ORDER BY rf.request_date ASC`,
    9841035                        [storeId],
    9851036                        (err, rows) => {
    … …  
    10101061            database.get(
    10111062                `SELECT SUM(oi.price * oi.quantity) as total_spent
    1012                  FROM order_items oi
    1013                  JOIN "order" o ON oi.order_num = o.order_num
    1014                  WHERE o.client_id = ?`,
     1063         FROM order_items oi
     1064         JOIN "order" o ON oi.order_num = o.order_num
     1065         WHERE o.client_id = ?`,
    10151066                [clientId],
    10161067                (err, row) => {
    … …  
    10301081                                (err, row) => {
    10311082                                    stats.delivered_orders = row ? row.delivered_orders : 0;
    1032 
    10331083                                    callback(null, stats);
    10341084                                }
    … …  
    10491099    database.all(
    10501100        `SELECT client_id as id, first_name, last_name, email, 'client' as user_type
    1051          FROM client
    1052          ORDER BY client_id`,
     1101     FROM client
     1102     ORDER BY client_id`,
    10531103        [],
    10541104        (err, rows) => {
    … …  
    10601110            database.all(
    10611111                `SELECT p.id, p.first_name, p.last_name, p.email,
    1062                         CASE WHEN b.boss_id IS NOT NULL THEN 'store_owner'
    1063                              WHEN e.employee_id IS NOT NULL THEN 'store_employee'
    1064                              ELSE 'personal' END as user_type
    1065                  FROM personal p
    1066                  LEFT JOIN boss b ON p.id = b.boss_id
    1067                  LEFT JOIN employees e ON p.id = e.employee_id
    1068                  ORDER BY p.id`,
     1112          CASE WHEN b.boss_id IS NOT NULL THEN 'store_owner'
     1113               WHEN e.employee_id IS NOT NULL THEN 'store_employee'
     1114               ELSE 'personal' END as user_type
     1115         FROM personal p
     1116         LEFT JOIN boss b ON p.id = b.boss_id
     1117         LEFT JOIN employees e ON p.id = e.employee_id
     1118         ORDER BY p.id`,
    10691119                [],
    10701120                (err, rows) => {
    … …  
    10761126                    database.all(
    10771127                        `SELECT id, username, email, user_type
    1078                          FROM users
    1079                          ORDER BY id`,
     1128             FROM users
     1129             ORDER BY id`,
    10801130                        [],
    10811131                        (err, rows) => {
    … …  
    10961146    database.run(
    10971147        `INSERT INTO audit_log (user_id, action, resource_type, resource_id, details, ip_address)
    1098          VALUES (?, ?, ?, ?, ?, ?)`,
     1148     VALUES (?, ?, ?, ?, ?, ?)`,
    10991149        [userId, action, resourceType, resourceId, details, ipAddress],
    11001150        (err) => {
Note: See TracChangeset for help on using the changeset viewer.