+
Produktliste ({filteredProdukte.length} Ergebnisse)
+ {filteredProdukte.map(p => (
+
{p.produkt}
Marke: {p.marke}
Herkunft: {p.herkunftsland}
- {p.labels.map(label => (
- {label}
+ {p.labels.map((label, i) => (
+ {label}
))}
{p.controversy?.length > 0 && (
- {p.controversy.map(c => (
- {c}
+ {p.controversy.map((c, i) => (
+ {c}
))}
)}
@@ -62,35 +139,51 @@ export default function SearchPage() {
+ .filters, .product-list {
+ margin-bottom: 2rem;
+ }
+
+ .product-item {
+ border: 1px solid #ddd;
+ padding: 15px;
+ border-radius: 6px;
+ margin-bottom: 1rem;
+ }
+
+ .label {
+ background: #dff0d8;
+ color: #3c763d;
+ padding: 2px 6px;
+ margin-right: 5px;
+ border-radius: 4px;
+ font-size: 0.9em;
+ }
+
+ .controversy {
+ background: #f2dede;
+ color: #a94442;
+ padding: 2px 6px;
+ margin-right: 5px;
+ border-radius: 4px;
+ font-size: 0.9em;
+ }
+ form {
+ display: flex;
+ gap: 0.5rem;
+ align-items: center;
+ }
+ button {
+ padding: 4px 12px;
+ border-radius: 4px;
+ border: 1px solid #4caf50;
+ background: #4caf50;
+ color: white;
+ cursor: pointer;
+ }
+ button:hover {
+ background: #388e3c;
+ }
+ `}
);
-}
+}
\ No newline at end of file
diff --git a/scripts/SaveProduct.ts b/scripts/SaveProduct.ts
new file mode 100644
index 0000000..05a0b26
--- /dev/null
+++ b/scripts/SaveProduct.ts
@@ -0,0 +1,34 @@
+// scripts/SaveProduct.ts
+
+import mongoose from 'mongoose';
+import Product from '../models/Product';
+
+const mongodbURI =
+ process.env.MONGODB_URI ||
+ (process.env.NODE_ENV === 'test'
+ ? 'mongodb://localhost:27017/myapp'
+ : 'mongodb://localhost:27017/myapp');
+
+main().catch(err => console.log(err));
+async function main() {
+ try {
+ await mongoose.connect(mongodbURI);
+
+ const newProduct = new Product({
+ id: 11,
+ produkt: 'Kakao',
+ marke: 'Alnatura',
+ labels: ['Fairtrade', 'EU Bio'],
+ controversy: ['Regenwaldrodung'],
+ herkunftsland: 'Peru'
+ });
+
+ const savedProduct = await newProduct.save();
+ console.log('Saved Product:', savedProduct);
+ } catch (err) {
+ console.error('Error:', err);
+ } finally {
+ await mongoose.disconnect();
+ console.log('Disconnected from MongoDB');
+ }
+}
\ No newline at end of file
diff --git a/scripts/SearchProducts.ts b/scripts/SearchProducts.ts
new file mode 100644
index 0000000..f732669
--- /dev/null
+++ b/scripts/SearchProducts.ts
@@ -0,0 +1,41 @@
+// scripts/SearchProducts.ts
+
+import mongoose from 'mongoose';
+import Product from '../models/Product';
+
+const mongodbURI =
+ process.env.MONGODB_URI ||
+ (process.env.NODE_ENV === 'test'
+ ? 'mongodb://localhost:27017/myapp'
+ : 'mongodb://localhost:27017/myapp');
+
+main().catch(err => console.log(err));
+async function main() {
+ try {
+ await mongoose.connect(mongodbURI);
+
+ // Example search/filter criteria
+ const searchTerm = 'kaffee'; // partial match on produkt
+ const markeFilter = 'Starbucks'; // exact match
+ const landFilter = 'Kolumbien'; // exact match
+ const labelsFilter = ['Fairtrade', 'Klimaneutral']; // match any label
+ const controversyFilter = ['Kinderarbeit']; // match any controversy
+
+ // Build dynamic query
+ const query: any = {};
+ if (searchTerm) query.produkt = { $regex: searchTerm, $options: 'i' };
+ if (markeFilter) query.marke = markeFilter;
+ if (landFilter) query.herkunftsland = landFilter;
+ if (labelsFilter.length) query.labels = { $in: labelsFilter };
+ if (controversyFilter.length) query.controversy = { $in: controversyFilter };
+
+ const products = await Product.find(query);
+
+ console.log('Filtered Products:', products);
+ } catch (err) {
+ console.error('Error:', err);
+ } finally {
+ await mongoose.disconnect();
+ console.log('Disconnected from MongoDB');
+ }
+}
\ No newline at end of file
diff --git a/seed/seed.js b/seed/seed.js
new file mode 100644
index 0000000..38bb48b
--- /dev/null
+++ b/seed/seed.js
@@ -0,0 +1,118 @@
+
+// MongoDB seed script
+db = db.getSiblingDB('myapp');
+
+// Drop existing collection if it exists
+db.products.drop();
+
+// Insert the product data
+db.products.insertMany([
+ {
+ id: 1,
+ produkt: "Kaffee",
+ marke: "Starbucks",
+ labels: ["Fairtrade", "EU Bio", "Klimaneutral"],
+ controversy: ["Entwaldung", "Kinderarbeit"],
+ herkunftsland: "Kolumbien",
+ createdAt: new Date(),
+ updatedAt: new Date()
+ },
+ {
+ id: 2,
+ produkt: "Schokolade (Tafel)",
+ marke: "Lindt",
+ labels: ["Fairtrade", "EU Bio"],
+ controversy: ["Palmölindustrie"],
+ herkunftsland: "Elfenbeinküste",
+ createdAt: new Date(),
+ updatedAt: new Date()
+ },
+ {
+ id: 3,
+ produkt: "T-Shirt (Baumwolle)",
+ marke: "H&M",
+ labels: ["EU Bio", "recycling-Material"],
+ controversy: ["Textilindustrie"],
+ herkunftsland: "Bangladesch",
+ createdAt: new Date(),
+ updatedAt: new Date()
+ },
+ {
+ id: 4,
+ produkt: "Smartphone",
+ marke: "Samsung",
+ labels: ["Klimaneutral"],
+ controversy: ["E-Schrott", "Kinderarbeit", "Seltene Erden"],
+ herkunftsland: "China",
+ createdAt: new Date(),
+ updatedAt: new Date()
+ },
+ {
+ id: 5,
+ produkt: "Mineralwasser (1 l)",
+ marke: "Gerolsteiner",
+ labels: ["Klimaneutral", "recycling-Material"],
+ controversy: ["Wasserprivatisierung"],
+ herkunftsland: "Deutschland",
+ createdAt: new Date(),
+ updatedAt: new Date()
+ },
+ {
+ id: 6,
+ produkt: "Sneaker",
+ marke: "Nike",
+ labels: ["recycling-Material"],
+ controversy: ["Textilindustrie", "Arbeitsbedingungen"],
+ herkunftsland: "Vietnam",
+ createdAt: new Date(),
+ updatedAt: new Date()
+ },
+ {
+ id: 7,
+ produkt: "Olivenöl",
+ marke: "Gaea",
+ labels: ["EU Bio"],
+ controversy: ["Monokultur", "Landraub"],
+ herkunftsland: "Griechenland",
+ createdAt: new Date(),
+ updatedAt: new Date()
+ },
+ {
+ id: 8,
+ produkt: "Laptop-Ladegerät",
+ marke: "Dell",
+ labels: ["Klimaneutral"],
+ controversy: ["E-Schrott"],
+ herkunftsland: "China",
+ createdAt: new Date(),
+ updatedAt: new Date()
+ },
+ {
+ id: 9,
+ produkt: "Duschgel",
+ marke: "Yves Rocher",
+ labels: ["EU Bio", "Klimaneutral"],
+ controversy: ["Palmölindustrie"],
+ herkunftsland: "Frankreich",
+ createdAt: new Date(),
+ updatedAt: new Date()
+ },
+ {
+ id: 10,
+ produkt: "Papier (A4, 500 Blatt)",
+ marke: "Xerox",
+ labels: ["EU Bio", "recycling-Material"],
+ controversy: ["Abholzung"],
+ herkunftsland: "Schweden",
+ createdAt: new Date(),
+ updatedAt: new Date()
+ }
+]);
+
+// Create some useful indexes
+db.products.createIndex({ "marke": 1 });
+db.products.createIndex({ "labels": 1 });
+db.products.createIndex({ "herkunftsland": 1 });
+
+print("Seed data inserted successfully!");
+print("Inserted " + db.products.countDocuments() + " products");
\ No newline at end of file
diff --git a/tsconfig.json b/tsconfig.json
index 87ef6d7..2b14058 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,5 +1,6 @@
{
"compilerOptions": {
+ "baseUrl": ".",
"target": "esnext",
"module": "esnext",
"jsx": "preserve",