diff --git a/.gitignore b/.gitignore
index 02c607c..3ef0b03 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,3 @@
node_modules
.env
-data
\ No newline at end of file
+*/*.db
\ No newline at end of file
diff --git a/RAM.kw b/RAM.kw
new file mode 100644
index 0000000..47f35ad
--- /dev/null
+++ b/RAM.kw
@@ -0,0 +1,165 @@
+M321R8GA0BB0-CQK | "Samsung" "64GB" "2Rx4" "4800" "RDIMM"| 1425
+HMCG94AGBQA181N | "Hynix" "64GB" "2Rx4" "5600" "RDIMM"| 1425
+MTC40F2046S1RC56BG1 | "Micron" "64GB" "2Rx4" "5600" "RDIMM"| 1325
+HMCG94AGBRA181N | "Hynix" "64GB" "2Rx4" "5600" "RDIMM"| 1425
+M321R8GA0EB2-CCP | "Samsung" "64GB" "2Rx4" "6400" "RDIMM"| 1570
+HMCG84MEBRA17N | "Hynix" "32GB" "1Rx4" "4800" "RDIMM"| 640
+M321R4GA3BB0-CQK | "Samsung" "32GB" "2Rx8" "4800" "RDIMM"| 985
+M321R4GA3BB6-CQK | "Samsung" "32GB" "2Rx8" "4800" "RDIMM"| 640
+MTC20F2085S1RC52BAW | "Micron" "32GB" "2Rx8" "5200" "RDIMM"| 570
+M321R4GA3PB0-CWM | "Samsung" "32GB" "2Rx8" "5600" "RDIMM"| 740
+HMCG88AGBRA191N-BB | "Hynix" "32GB" "2Rx8" "5600" "RDIMM"| 715
+HMCG88AGBRA190N | "Hynix" "32GB" "2Rx8" "5600" "RDIMM"| 715
+M321R4GA0EB2-CCP | "Samsung" "32GB" "1Rx4" "6400" "RDIMM"| 715
+M321R2GA3BB0-CQK | "Samsung" "16GB" "1Rx8" "4800" "RDIMM"| 315
+MTC10F1084S1RC48BA1 | "Micron" "16GB" "1Rx8" "4800" "RDIMM"| 285
+M386AAK40B40-CWD | "Samsung" "128GB" "2S4Rx4" "2666" "LRDIMM"| 530
+M393AAG40M3B-CYF | "Samsung" "128GB" "2S2Rx4" "2933" "LRDIMM"| 580
+HMABAGL7ABR4N-XN | "Hynix" "128GB" "4DRx4" "3200" "LRDIMM"| 470
+M386A8K40BM1-CRC | "Samsung" "64GB" "4DRx4" "2400" "LRDIMM"| 287.36
+M386A8K40BMB-CRC | "Samsung" "64GB" "4DRx4" "2400" "LRDIMM"| 287.36
+HMAA8GL7MMR4N-UH | "Hynix" "64GB" "4DRx4" "2400" "LRDIMM"| 284.9
+MTA72ASS8G72LZ-2G3 | "Micron" "64GB" "4DRx4" "2400" "LRDIMM"| 240
+M386A8K40DM2-CTD | "Samsung" "64GB" "4DRx4" "2666" "LRDIMM"| 428
+M386A8K40BM2-CTD | "Samsung" "64GB" "4DRx4" "2666" "LRDIMM"| 420.5
+M393A8K40B22-CWD | "Samsung" "64GB" "2S2Rx4" "2666" "LRDIMM"| 400
+M386A8K40CM2-CTD | "Samsung" "64GB" "4DRx4" "2666" "LRDIMM"| 428
+HMAA8GL7MMR4N-VK | "Hynix" "64GB" "4DRx4" "2666" "LRDIMM"| 334.3
+HMAA8GL7CPR4N-VK | "Hynix" "64GB" "4DRx4" "2666" "LRDIMM"| 334.3
+M386A8K40DM2-CVF | "Samsung" "64GB" "4DRx4" "2933" "LRDIMM"| 552.33
+HMAA8GL7CPR4N-WM | "Hynix" "64GB" "4DRx4" "2933" "LRDIMM"| 558
+MTA72ASS8G72LZ-2G9 | "Micron" "64GB" "4DRx4" "2933" "LRDIMM"| 539
+M393A8G40AB2-CVF | "Samsung" "64GB" "2Rx4" "2933" "RDIMM"| 605
+M393A8G40MB2-CVF | "Samsung" "64GB" "2Rx4" "2933" "RDIMM"| 512
+HMAA8GR7AJR4N-WM | "Hynix" "64GB" "2Rx4" "2933" "RDIMM"| 750.5
+HMAA8GR7MJR4N-WM | "Hynix" "64GB" "2Rx4" "2933" "RDIMM"| 536
+MTA36ASF8G72PZ-2G9 | "Micron" "64GB" "2Rx4" "2933" "RDIMM"| 595
+M393A8G40AB2-CWE | "Samsung" "64GB" "2Rx4" "3200" "RDIMM"| 872
+M393A8G40MB2-CWE | "Samsung" "64GB" "2Rx4" "3200" "RDIMM"| 760
+M393A8G40CB4-CWE | "Samsung" "64GB" "2Rx4" "3200" "RDIMM"| 740
+HMAA8GR7AJR4N-XN | "Hynix" "64GB" "2Rx4" "3200" "RDIMM"| 600
+HMAA8GR7CJR4N-XN | "Hynix" "64GB" "2Rx4" "3200" "RDIMM"| 836
+M386B4G70DM0-YH9 | "Samsung" "32GB" "4Rx4" "1333" "LRDIMM"| 28.37
+M386B4G70DM0-YK | "Samsung" "32GB" "4DRx4" "1600" "LRDIMM"| 28.37
+HMA84GL7AMR4N-TF | "Hynix" "32GB" "4DRx4" "2133" "LRDIMM"| 123.5
+MTA72ASS4G72LZ-2G1 | "Micron" "32GB" "4DRx4" "2133" "LRDIMM"| 92.59
+M386A4G40DM0-CPB | "Samsung" "32GB" "4DRx4" "2133" "LRDIMM"| 152
+M386A4G40DM1-CRC | "Samsung" "32GB" "4DRx4" "2400" "LRDIMM"| 156.75
+M393A4K40BB0-CPB | "Samsung" "32GB" "2Rx4" "2133" "RDIMM"| 207
+HMA84GR7MFR4N-TF | "Hynix" "32GB" "2Rx4" "2133" "RDIMM"| 174.17
+MTA36ASF4G72PZ-2G1 | "Micron" "32GB" "2Rx4" "2133" "RDIMM"| 133
+M386A4K40BB0-CRC | "Samsung" "32GB" "2Rx4" "2400" "LRDIMM"| 172.56
+M393A4K40BB1-CRC | "Samsung" "32GB" "2Rx4" "2400" "RDIMM"| 251
+M393A4K40CB1-CRC | "Samsung" "32GB" "2Rx4" "2400" "RDIMM"| 251
+HMA84GR7MFR4N-UH | "Hynix" "32GB" "2Rx4" "2400" "RDIMM"| 207
+HMA84GR7AFR4N-UH | "Hynix" "32GB" "2Rx4" "2400" "RDIMM"| 181.16
+HMA84GL7MFR4N-UH | "Hynix" "32GB" "2Rx4" "2400" "RDIMM"| 181.16
+MTA36ASF4G72PZ-2G3 | "Micron" "32GB" "2Rx4" "2400" "RDIMM"| 192.85
+M393A4K40BB2-CTD | "Samsung" "32GB" "2Rx4" "2666" "RDIMM"| 280
+M393A4K40CB2-CTD | "Samsung" "32GB" "2Rx4" "2666" "RDIMM"| 266
+HMA84GR7CJR4N-VK | "Hynix" "32GB" "2Rx4" "2666" "RDIMM"| 248
+HMA84GR7AFR4N-VK | "Hynix" "32GB" "2Rx4" "2666" "RDIMM"| 248
+HMA84GR7JJR4N-VK | "Hynix" "32GB" "2Rx4" "2666" "RDIMM"| 248
+MTA36ASF4G72PZ-2G6 | "Micron" "32GB" "2Rx4" "2666" "RDIMM"| 213
+MTA36ASF4G72LZ-2G6 | "Micron" "32GB" "2Rx4" "2666" "RDIMM"| 213
+M393A4K40DB2-CVF | "Samsung" "32GB" "2Rx4" "2933" "RDIMM"| 228
+M393A4K40CB2-CVF | "Samsung" "32GB" "2Rx4" "2933" "RDIMM"| 380
+HMA84GR7JJR4N-WM | "Hynix" "32GB" "2Rx4" "2933" "RDIMM"| 413
+HMA84GR7DJR4N-WM | "Hynix" "32GB" "2Rx4" "2933" "RDIMM"| 413
+HMA84GR7CJR4N-WM | "Hynix" "32GB" "2Rx4" "2933" "RDIMM"| 413
+MTA36ASF4G72PZ-2G9 | "Micron" "32GB" "2Rx4" "2933" "RDIMM"| 302.82
+M393A4G40BB3-CWE | "Samsung" "32GB" "1Rx4" "3200" "RDIMM"| 436.05
+M393A4K40EB3-CWE | "Samsung" "32GB" "2Rx4" "3200" "RDIMM"| 503
+M393A4K40DB3-CWE | "Samsung" "32GB" "2Rx4" "3200" "RDIMM"| 503
+HMA84GR7CJR4N-XN | "Hynix" "32GB" "2Rx4" "3200" "RDIMM"| 475
+HMA84GR7DJR4N-XN | "Hynix" "32GB" "2Rx4" "3200" "RDIMM"| 475
+MTA36ASF4G72PZ-3G2 | "Micron" "32GB" "2Rx4" "3200" "RDIMM"| 361
+M393A4G43AB3-CWE | "Samsung" "32GB" "2Rx8" "3200" "RDIMM"| 425
+HMAA4GR7CJR8N-XN | "Hynix" "32GB" "2Rx8" "3200" "RDIMM"| 362.32
+HMT42GR7BMR4C-G7 | "Hynix" "16GB" "4Rx4" "1066" "RDIMM"| 21.13
+MT36KSF2G72PZ-1G4 | "Micron" "16GB" "2Rx4" "1333" "RDIMM"| 16.88
+M393B2G70EB0-YK0 | "Samsung" "16GB" "2Rx4" "1600" "RDIMM"| 19.69
+M393B2G70DB0-YK0 | "Samsung" "16GB" "2Rx4" "1600" "RDIMM"| 19.69
+M393B2G70BH0-YK0 | "Samsung" "16GB" "2Rx4" "1600" "RDIMM"| 19.69
+MT36KSF2G72PZ-1G6 | "Micron" "16GB" "2Rx4" "1600" "RDIMM"| 21.4
+HMT42GR7BFR4A-PB | "Hynix" "16GB" "2Rx4" "1600" "RDIMM"| 19.69
+HMT42GR7MFR4C-PB | "Hynix" "16GB" "2Rx4" "1600" "RDIMM"| 18.99
+HMT42GR7AFR4C-RD | "Hynix" "16GB" "2Rx4" "1866" "RDIMM"| 17.02
+M393A2G40EB1-CPB | "Samsung" "16GB" "2Rx4" "2133" "RDIMM"| 110.4
+M393A2G40DB0-CPB | "Samsung" "16GB" "2Rx4" "2133" "RDIMM"| 110.4
+HMA42GR7AFR4N-TF | "Hynix" "16GB" "2Rx4" "2133" "RDIMM"| 97.7
+HMA42GR7MFR4N-TF | "Hynix" "16GB" "2Rx4" "2133" "RDIMM"| 60
+MTA36ASF2G72PZ-2G1 | "Micron" "16GB" "2Rx4" "2133" "RDIMM"| 64.4
+M393A2K40CB1-CRC | "Samsung" "16GB" "1Rx4" "2400" "RDIMM"| 10
+M393A2K40BB1-CRC | "Samsung" "16GB" "1Rx4" "2400" "RDIMM"| 110
+MTA18ASF2G72PZ-2G3 | "Micron" "16GB" "1Rx4" "2400" "RDIMM"| 95
+M393A2G40EB1-CRC | "Samsung" "16GB" "2Rx4" "2400" "RDIMM"| 110.2
+HMA42GR7AFR4N-UH | "Hynix" "16GB" "2Rx4" "2400" "RDIMM"| 108
+HMA42GR7BJR4N-UH | "Hynix" "16GB" "2Rx4" "2400" "RDIMM"| 108
+MTA36ASF2G72PZ-2G3 | "Micron" "16GB" "2Rx4" "2400" "RDIMM"| 85
+HMA82GR7AFR4N-VK | "Hynix" "16GB" "1Rx4" "2666" "RDIMM"| 110
+HMA82GR7CJR4N-VK | "Hynix" "16GB" "1Rx4" "2666" "RDIMM"| 110
+M393A2K43BB1-CTD | "Samsung" "16GB" "2Rx8" "2666" "RDIMM"| 114.29
+HMA82GR7AFR8N-VK | "Hynix" "16GB" "2Rx8" "2666" "RDIMM"| 107
+HMA82GR7CJR8N-VK | "Hynix" "16GB" "2Rx8" "2666" "RDIMM"| 107
+HMA82GR7JJR8N-VK | "Hynix" "16GB" "2Rx8" "2666" "RDIMM"| 107
+MTA18ASF2G72PDZ-2G6 | "Micron" "16GB" "2Rx8" "2666" "RDIMM"| 83.33
+M393A2K40CB2-CVF | "Samsung" "16GB" "1Rx4" "2933" "RDIMM"| 118.75
+M393A2K40DB2-CVF | "Samsung" "16GB" "1Rx4" "2933" "RDIMM"| 118.75
+M393A2K43DB2-CVF | "Samsung" "16GB" "2Rx8" "2933" "RDIMM"| 100.57
+HMA82GR7CJR8N-WM | "Hynix" "16GB" "2Rx8" "2933" "RDIMM"| 78.65
+HMA82GR7JJR8N-WM | "Hynix" "16GB" "2Rx8" "2933" "RDIMM"| 102.56
+M393A2K43DB3-CWE | "Samsung" "16GB" "2Rx8" "3200" "RDIMM"| 171
+HMA82GR7DJR8N-XN | "Hynix" "16GB" "2Rx8" "3200" "RDIMM"| 114.29
+HMA82GR7CJR8N-XN | "Hynix" "16GB" "2Rx8" "3200" "RDIMM"| 114.29
+MTA18ASF2G72PDZ-3G2 | "Micron" "16GB" "2Rx8" "3200" "RDIMM"| 85.47
+M393B1K70DH0-YH9 | "Samsung" "8GB" "2Rx4" "1333" "RDIMM"| 6.05
+M393B1K70CH0-CH9 | "Samsung" "8GB" "2Rx4" "1333" "RDIMM"| 6.05
+MTA18ASF1G72PZ-2G1 | "Micron" "8GB" "1Rx4" "2133" "RDIMM"| 23.98
+HMA41GR7AFR8N-TF | "Hynix" "8GB" "1Rx8" "2133" "RDIMM"| 30.24
+M393A1G40DB0-CPB | "Samsung" "8GB" "1Rx8" "2133" "RDIMM"| 45
+MTA18ASF1G72PZ-2G1 | "Micron" "8GB" "1Rx8" "2133" "RDIMM"| 23.91
+HMA41GR7AFR8N-TF | "Hynix" "8GB" "2Rx8" "2133" "RDIMM"| 28.13
+M393A1G43DB0-CPB | "Samsung" "8GB" "2Rx8" "2133" "RDIMM"| 28.13
+MTA18ASF1G72PZ-2G1 | "Micron" "8GB" "2Rx8" "2133" "RDIMM"| 23.91
+HMA41GR7AFR4N-UH | "Hynix" "8GB" "1Rx4" "2400" "RDIMM"| 28
+HMA81GR7MFR8N-UH | "Hynix" "8GB" "1Rx8" "2400" "RDIMM"| 30.24
+M393A1G40DB1-CRC | "Samsung" "8GB" "1Rx8" "2400" "RDIMM"| 30.24
+MTA9ASF1G72PZ-2G3 | "Micron" "8GB" "1Rx8" "2400" "RDIMM"| 30.24
+HMA41GR7AFR8N-UH | "Hynix" "8GB" "2Rx8" "2400" "RDIMM"| 39.6
+M393A1G40DB1-CRC | "Samsung" "8GB" "2Rx8" "2400" "RDIMM"| 28.13
+M393A1G43DB1-CRC | "Samsung" "8GB" "2Rx8" "2400" "RDIMM"| 39.6
+MTA18ASF1G72PDZ-2G3 | "Micron" "8GB" "2Rx8" "2400" "RDIMM"| 28.13
+HMA81GR7AFR8N-VK | "Hynix" "8GB" "1Rx8" "2666" "RDIMM"| 28.6
+MTA9ASF1G72PZ-2G6 | "Micron" "8GB" "1Rx8" "2666" "RDIMM"| 28.6
+HMA81GR7AFR8N-VK | "Hynix" "8GB" "2Rx8" "2666" "RDIMM"| 28.13
+MTA9ASF1G72PZ-2G6 | "Micron" "8GB" "2Rx8" "2666" "RDIMM"| 28.13
+HMA81GR7CJR8N-WM | "Hynix" "8GB" "1Rx8" "2933" "RDIMM"| 39.33
+HMA81GR7CJR8N-WM | "Hynix" "8GB" "2Rx8" "2933" "RDIMM"| 41.49
+M393A1K43DB1-CVF | "Samsung" "8GB" "2Rx8" "2933" "RDIMM"| 41.49
+MTA9ASF1G72PZ-2G9 | "Micron" "8GB" "2Rx8" "2933" "RDIMM"| 30.24
+HMA81GR7CJR8N-XN | "Hynix" "8GB" "1Rx8" "3200" "RDIMM"| 61.6
+MTA9ASF1G72PZ-3G2 | "Micron" "8GB" "1Rx8" "3200" "RDIMM"| 30.24
+HMA81GR7CJR8N-XN | "Hynix" "8GB" "2Rx8" "3200" "RDIMM"| 41.49
+"" | "Samsung" "32GB" "2Rx8" "2133" "UDIMM"| 127.5
+"" | "Samsung" "32GB" "2Rx8" "2400" "UDIMM"| 140
+M378A4G43MB1-CTD | "Samsung" "32GB" "2Rx8" "2666" "UDIMM"| 164
+M378A4G43AB2-CVF | "Samsung" "32GB" "2Rx8" "2933" "UDIMM"| 137.88
+M378A4G43AB2-CWE | "Samsung" "32GB" "2Rx8" "3200" "UDIMM"| 180
+HMAA4GU6AJR8N-XN | "Hynix" "32GB" "2Rx8" "3200" "UDIMM"| 242.25
+M378A2K43BB1-CPB | "Samsung" "16GB" "2Rx8" "2133" "UDIMM"| 56.5
+M378A2K43CB1-CRC | "Samsung" "16GB" "2Rx8" "2400" "UDIMM"| 110
+MTA18ASF2G72AZ-2G3 | "Micron" "16GB" "2Rx8" "2400" "UDIMM"| 90.25
+HMA82GU6JJR8N-VK | "Hynix" "16GB" "2Rx8" "2666" "UDIMM"| 90
+M378A2K43DB1-CVF | "Samsung" "16GB" "2Rx8" "2933" "UDIMM"| 56.5
+KVR32N22S8/16 | "Kingston" "16GB" "1RX8" "3200" "UDIMM"| 48.5
+M378A1K43BB1-CPB | "Samsung" "8GB" "1RX8" "2133" "UDIMM"| 25
+M378A1K43CB2-CRC | "Samsung" "8GB" "1RX8" "2400" "UDIMM"| 30
+M474A2K43BB1-CRC | "Samsung" "16GB" "2Rx8" "2400" "SODIMM"| 90
+HMAA2GS6CJR8N-XN | "Hynix" "16GB" "1Rx8" "3200" "SODIMM"| 72.67
+M474A2K43EB1-CWE | "Samsung" "16GB" "2Rx8" "3200" "SODIMM"| 80
+M471A4G43MB1-CTD | "Samsung" "32GB" "2Rx8" "2666" "SODIMM"| 125
+M471A4G43BB1-CWE | "Samsung" "32GB" "2Rx8" "3200" "SODIMM"| 139.4
+HMAA4GS6CJR8N | "Hynix" "32GB" "2Rx8" "3200" "SODIMM"| 123.55
+M425R2GA3BB0-CWM | "Samsung" "16GB" "1Rx8" "5600" "SODIMM"| 130.62
+M425R4GA3PB0-CWM | "Samsung" "32GB" "2Rx8" "5600" "SODIMM"| 246.73
\ No newline at end of file
diff --git a/db.js b/db.js
index 9d84466..e26db05 100644
--- a/db.js
+++ b/db.js
@@ -17,6 +17,7 @@ function initDb() {
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
price_ratio REAL DEFAULT 0.85,
+ common_keywords TEXT,
last_scan_time DATETIME,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
@@ -67,6 +68,16 @@ function initDb() {
// Migration: Add columns if they don't exist
try { db.exec("ALTER TABLE profiles ADD COLUMN last_scan_time DATETIME;"); } catch(e){}
+ try { db.exec("ALTER TABLE profiles ADD COLUMN common_keywords TEXT;"); } catch(e){}
+ // Migration: rename ignore_keywords to common_keywords if it exists
+ try {
+ const tableInfo = db.prepare("PRAGMA table_info(profiles)").all();
+ const hasIgnore = tableInfo.some(col => col.name === 'ignore_keywords');
+ const hasCommon = tableInfo.some(col => col.name === 'common_keywords');
+ if (hasIgnore && !hasCommon) {
+ db.exec("ALTER TABLE profiles RENAME COLUMN ignore_keywords TO common_keywords");
+ }
+ } catch(e){}
try { db.exec("ALTER TABLE items ADD COLUMN profile_id INTEGER;"); } catch(e){}
try { db.exec("ALTER TABLE items ADD COLUMN keyword_id INTEGER;"); } catch(e){}
}
@@ -77,9 +88,9 @@ const stmts = {
// Profiles
getProfiles: db.prepare('SELECT * FROM profiles ORDER BY name'),
getProfile: db.prepare('SELECT * FROM profiles WHERE id = ?'),
- insertProfile: db.prepare('INSERT INTO profiles (name, price_ratio) VALUES (?, ?)'),
+ insertProfile: db.prepare('INSERT INTO profiles (name, price_ratio, common_keywords) VALUES (?, ?, ?)'),
deleteProfile: db.prepare('DELETE FROM profiles WHERE id = ?'),
- updateProfile: db.prepare('UPDATE profiles SET name = ?, price_ratio = ? WHERE id = ?'),
+ updateProfile: db.prepare('UPDATE profiles SET name = ?, price_ratio = ?, common_keywords = ? WHERE id = ?'),
updateProfileScanTime: db.prepare('UPDATE profiles SET last_scan_time = CURRENT_TIMESTAMP WHERE id = ?'),
// Search Keywords
@@ -160,9 +171,9 @@ module.exports = {
// Profiles
getProfiles() { return stmts.getProfiles.all(); },
getProfile(id) { return stmts.getProfile.get(id); },
- addProfile(name, ratio) { return stmts.insertProfile.run(name, ratio); },
+ addProfile(name, ratio, commonKeywords) { return stmts.insertProfile.run(name, ratio, commonKeywords); },
deleteProfile(id) { return stmts.deleteProfile.run(id); },
- updateProfile(id, name, ratio) { return stmts.updateProfile.run(name, ratio, id); },
+ updateProfile(id, name, ratio, commonKeywords) { return stmts.updateProfile.run(name, ratio, commonKeywords, id); },
updateProfileScanTime(id) { return stmts.updateProfileScanTime.run(id); },
// Keywords
diff --git a/public/index.html b/public/index.html
index 8b33f25..3f756b1 100644
--- a/public/index.html
+++ b/public/index.html
@@ -250,7 +250,7 @@
Create New Profile
-
@@ -334,7 +338,8 @@
let currentProfileId = null;
let items = [];
let isScanning = false;
- const API_URL = "https://logs1.danielvu.com/ebay-price-check"
+ const API_URL = "http://localhost:4000"
+ // const API_URL = "https://logs1.danielvu.com/ebay-price-check"
const fmat = (v) => new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(v || 0);
async function init() {
@@ -484,6 +489,7 @@
editingProfileId = null;
document.getElementById('new-profile-name').value = '';
document.getElementById('new-profile-ratio').value = '0.85';
+ document.getElementById('new-profile-common').value = '';
document.getElementById('btn-save-profile').innerText = 'Add Profile';
document.getElementById('modal-profiles').classList.add('active');
renderProfileList();
@@ -495,24 +501,29 @@
${p.name} (Ratio: ${p.price_ratio})
+ ${p.common_keywords ? `Common: ${p.common_keywords}
` : ''}
Last scan: ${lastScan}
-
+
`;}).join('');
}
- function editProfile(id, name, ratio) {
+ function editProfile(id) {
+ const p = profiles.find(x => x.id === id);
+ if (!p) return;
editingProfileId = id;
- document.getElementById('new-profile-name').value = name;
- document.getElementById('new-profile-ratio').value = ratio;
+ document.getElementById('new-profile-name').value = p.name;
+ document.getElementById('new-profile-ratio').value = p.price_ratio;
+ document.getElementById('new-profile-common').value = p.common_keywords || '';
document.getElementById('btn-save-profile').innerText = 'Update Profile';
}
async function saveProfile() {
const name = document.getElementById('new-profile-name').value;
const ratio = document.getElementById('new-profile-ratio').value;
+ const common = document.getElementById('new-profile-common').value;
if (!name) return;
const method = editingProfileId ? 'PUT' : 'POST';
@@ -521,11 +532,16 @@
await fetch(url, {
method,
headers: {'Content-Type': 'application/json'},
- body: JSON.stringify({ name, price_ratio: parseFloat(ratio) })
+ body: JSON.stringify({
+ name,
+ price_ratio: parseFloat(ratio),
+ common_keywords: common
+ })
});
editingProfileId = null;
document.getElementById('new-profile-name').value = '';
+ document.getElementById('new-profile-common').value = '';
document.getElementById('btn-save-profile').innerText = 'Add Profile';
await fetchProfiles();
renderProfileList();
@@ -635,7 +651,7 @@
let keywords = kwPart.split(',').map(s => s.trim()).filter(Boolean);
return {
- part_number: (parts[0] === 'NONE' || parts[0] === '' || parts[0] === '""') ? '' : parts[0].replace(/"/g, ''),
+ part_number: (parts[0] === 'NONE' || parts[0] === '' || parts[0] === '""') ? '' : parts[0],
keywords,
target_price: parseFloat(parts[2].replace(/[$,]/g, ''))
};
diff --git a/scanner.js b/scanner.js
index 6acfc12..09c878b 100644
--- a/scanner.js
+++ b/scanner.js
@@ -211,7 +211,7 @@ async function searchEbay(token, keyword, site) {
const cap = CFG.maxItemsPerQuery;
const exactQuery = keyword.trim().split(/\s+/).map(w => {
if (w.startsWith('-')) return w; // Negative keyword
- return `"${w}"`;
+ return `${w}`;
}).join(' ');
const baseUrl = `https://${BASE_URL}/buy/browse/v1/item_summary/search`
@@ -376,8 +376,9 @@ async function processRow(token, row, rowIndex, totalRows, globalResultsMap, pro
for (const site of EBAY_SITES) {
for (const { label, query } of queries) {
- log(` [${rowIndex + 1}] [${site.id}] [${label}] Searching: "${query}"`);
- const items = await searchEbay(token, query, site);
+ const searchQuery = profile.common_keywords ? `${query} ${profile.common_keywords}` : query;
+ log(` [${rowIndex + 1}] [${site.id}] [${label}] Searching: "${searchQuery}"`);
+ const items = await searchEbay(token, searchQuery, site);
let skipped = 0, cnSkipped = 0, dbSkipped = 0;
for (const item of items) {
diff --git a/server.js b/server.js
index 33bcd70..60a419c 100644
--- a/server.js
+++ b/server.js
@@ -35,7 +35,7 @@ app.get('/api/profiles', (req, res) => {
let profiles = db.getProfiles();
if (profiles.length === 0) {
// Create a default profile if none exists
- db.addProfile('Default Profile', 0.85);
+ db.addProfile('Default Profile', 0.85, null);
profiles = db.getProfiles();
}
res.json(profiles);
@@ -46,8 +46,8 @@ app.get('/api/profiles', (req, res) => {
app.post('/api/profiles', (req, res) => {
try {
- const { name, price_ratio } = req.body;
- db.addProfile(name, price_ratio || 0.85);
+ const { name, price_ratio, common_keywords } = req.body;
+ db.addProfile(name, price_ratio || 0.85, common_keywords);
res.json({ success: true });
} catch (err) {
res.status(500).json({ error: err.message });
@@ -56,8 +56,8 @@ app.post('/api/profiles', (req, res) => {
app.put('/api/profiles/:id', (req, res) => {
try {
- const { name, price_ratio } = req.body;
- db.updateProfile(req.params.id, name, price_ratio);
+ const { name, price_ratio, common_keywords } = req.body;
+ db.updateProfile(req.params.id, name, price_ratio, common_keywords);
res.json({ success: true });
} catch (err) {
res.status(500).json({ error: err.message });
diff --git a/ssd.kw b/ssd.kw
new file mode 100644
index 0000000..c426a17
--- /dev/null
+++ b/ssd.kw
@@ -0,0 +1,50 @@
+"SSDSC2BX200" | "200GB" -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 14.00
+"SSDSC2BA200" | "200GB" -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 14.00
+"SSDSC2KB200G8" | "200GB" -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 14.00
+"MZ7KE256" | "256GB" -200GB -240GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 17.92
+"MZ76P256" | "256GB" -200GB -240GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 17.92
+"MZ7LN256" | "256GB" -200GB -240GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 17.92
+"CT256MX" | "256GB" -200GB -240GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 17.92
+"MZ77E500" | "512GB" -200GB -240GB -256GB -320GB -480GB -500GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 35.84
+"MZ76E500" | "512GB" -200GB -240GB -256GB -320GB -480GB -500GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 35.84
+"SSDSC2KB512G8" | "512GB" -200GB -240GB -256GB -320GB -480GB -500GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 35.84
+"CT500MX500" | "512GB" -200GB -240GB -256GB -320GB -480GB -500GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 35.84
+"SSDSC2BX800" | "800GB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 56.00
+"SSDSC2BA800" | "800GB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 56.00
+"MZ7LM800" | "800GB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 56.00
+"816576-001" | "800GB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 56.00
+"MZ7KH960" | "960GB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 67.20
+"MZ7LM960" | "960GB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 67.20
+"MTFDDAK960" | "960GB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 67.20
+"SSDSC2KB960G8" | "960GB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 67.20
+"MZ77E1T0" | "1TB" -200GB -240GB -250GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 70.00
+"WDS100T2B0A" | "1TB" -200GB -240GB -250GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 70.00
+"CT1000MX500" | "1TB" -200GB -240GB -250GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 70.00
+"SSDSC2KB010T8" | "1TB" -200GB -240GB -250GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 70.00
+"MZ77E2T0" | "2TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 140.00
+"CT2000MX500" | "2TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 140.00
+"WDS200T2B0A" | "2TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 140.00
+"MTFDDAK1T9" | "2TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 140.00
+"MZ77E4T0" | "4TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 280.00
+"WDS400T3B0A" | "4TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 280.00
+"P21514-001" | "4TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 280.00
+"SSDSC2KB038T7" | "4TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 280.00
+"MZ77Q8T0" | "8TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 560.00
+"MTFDDAK7T6TDC" | "8TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 560.00
+"WDS800T2B0A" | "8TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 560.00
+"MZ7KH1T9" | "1.92TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 134.40
+"SSDSC2KB019T8" | "1.92TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 134.40
+"816562-001" | "1.92TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 134.40
+"0MWGK7" | "1.92TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB -15.36TB | 134.40
+"MZ7KH3T8" | "3.84TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -6.4TB -7.68TB -15.36TB | 268.80
+"SSDSC2KB038T8" | "3.84TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -6.4TB -7.68TB -15.36TB | 268.80
+"MTFDDAK3T8TDT" | "3.84TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -6.4TB -7.68TB -15.36TB | 268.80
+"P19976-B21" | "3.84TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -6.4TB -7.68TB -15.36TB | 268.80
+"MZ7KH7T6" | "7.68TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -15.36TB | 537.60
+"SSDSC2KB076T8" | "7.68TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -15.36TB | 537.60
+"MTFDDAK7T6TDT" | "7.68TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -15.36TB | 537.60
+"P19980-B21" | "7.68TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -15.36TB | 537.60
+"MZILS15T" | "15.36TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB | 1075.20
+"MZILG15T" | "15.36TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB | 1075.20
+"WUS4BB015D7P3E3" | "15.36TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB | 1075.20
+"SSDSC2KB153T8" | "15.36TB" -200GB -240GB -256GB -320GB -480GB -500GB -512GB -800GB -960GB -1TB -2TB -3TB -4TB -5TB -6TB -8TB -10TB -12TB -16TB -1.6TB -1.8TB -1.92TB -3.2TB -3.8TB -3.84TB -6.4TB -7.68TB | 1075.20
\ No newline at end of file
diff --git a/truncate_items.js b/truncate_items.js
new file mode 100644
index 0000000..6b753a9
--- /dev/null
+++ b/truncate_items.js
@@ -0,0 +1,27 @@
+const Database = require('better-sqlite3');
+const path = require('path');
+const fs = require('fs');
+
+const dbPath = path.join(__dirname, 'data', 'ebay_items.db');
+
+if (!fs.existsSync(dbPath)) {
+ console.error(`Database not found at: ${dbPath}`);
+ process.exit(1);
+}
+
+const db = new Database(dbPath);
+
+try {
+ console.log('Truncating items table...');
+ const result = db.prepare('DELETE FROM items').run();
+ console.log(`Success! Deleted ${result.changes} items.`);
+
+ // Optional: vacuum the database to reclaim space
+ console.log('Vacuuming database...');
+ db.exec('VACUUM');
+ console.log('Vacuum complete.');
+} catch (err) {
+ console.error('Error truncating items table:', err.message);
+} finally {
+ db.close();
+}