From 92529e2b6c44f5f2ff230ebc5feef2e70c4a633e Mon Sep 17 00:00:00 2001 From: tusharshah21 Date: Sun, 6 Jul 2025 16:41:14 +0530 Subject: [PATCH] Enhance schema for sellers, buyers, and admin analytics --- src/models/Donation.js | 18 ++++++++++++++++++ src/models/ImpactMetric.js | 17 +++++++++++++++++ src/models/Project.js | 24 ++++++++++++++++++++++++ src/models/Purchase.js | 24 ++++++++++++++++++++++++ src/models/ResellListing.js | 23 +++++++++++++++++++++++ src/models/Stake.js | 26 ++++++++++++++++++++++++++ 6 files changed, 132 insertions(+) create mode 100644 src/models/Donation.js create mode 100644 src/models/ImpactMetric.js create mode 100644 src/models/Project.js create mode 100644 src/models/Purchase.js create mode 100644 src/models/ResellListing.js create mode 100644 src/models/Stake.js diff --git a/src/models/Donation.js b/src/models/Donation.js new file mode 100644 index 0000000..b9df282 --- /dev/null +++ b/src/models/Donation.js @@ -0,0 +1,18 @@ +const mongoose = require("mongoose"); + +const DonationSchema = new mongoose.Schema( + { + donor_address: { type: String, required: true, lowercase: true }, + project_id: { + type: mongoose.Schema.Types.ObjectId, + ref: "Project", + required: true, + }, + amount: { type: Number, required: true }, + transaction_hash: { type: String, required: true }, + created_at: { type: Date, default: Date.now }, + }, + { timestamps: { createdAt: "created_at" } } +); + +module.exports = mongoose.model("Donation", DonationSchema); diff --git a/src/models/ImpactMetric.js b/src/models/ImpactMetric.js new file mode 100644 index 0000000..7e3b8d8 --- /dev/null +++ b/src/models/ImpactMetric.js @@ -0,0 +1,17 @@ +const mongoose = require("mongoose"); + +const ImpactMetricSchema = new mongoose.Schema( + { + project_id: { + type: mongoose.Schema.Types.ObjectId, + ref: "Project", + required: true, + }, + metric_type: { type: String, required: true }, // e.g., 'CO2_saved', 'trees_planted' + value: { type: Number, required: true }, + recorded_at: { type: Date, default: Date.now }, + }, + { timestamps: false } +); + +module.exports = mongoose.model("ImpactMetric", ImpactMetricSchema); diff --git a/src/models/Project.js b/src/models/Project.js new file mode 100644 index 0000000..011a0f0 --- /dev/null +++ b/src/models/Project.js @@ -0,0 +1,24 @@ +const mongoose = require("mongoose"); + +const ProjectSchema = new mongoose.Schema( + { + title: { type: String, required: true }, + description: String, + category: String, + funding_goal: { type: Number, required: true }, + current_funding: { type: Number, default: 0 }, + impact_value: { type: Number, default: 0 }, + image_url: String, + seller_address: { type: String, required: true, lowercase: true }, // wallet address of seller + organization_id: { + type: mongoose.Schema.Types.ObjectId, + ref: "Organization", + }, + date_listed: { type: Date, default: Date.now }, + created_at: { type: Date, default: Date.now }, + updated_at: { type: Date, default: Date.now }, + }, + { timestamps: { createdAt: "created_at", updatedAt: "updated_at" } } +); + +module.exports = mongoose.model("Project", ProjectSchema); diff --git a/src/models/Purchase.js b/src/models/Purchase.js new file mode 100644 index 0000000..3b882cf --- /dev/null +++ b/src/models/Purchase.js @@ -0,0 +1,24 @@ +const mongoose = require("mongoose"); + +const PurchaseSchema = new mongoose.Schema( + { + buyer_address: { type: String, required: true, lowercase: true }, + project_id: { + type: mongoose.Schema.Types.ObjectId, + ref: "Project", + required: true, + }, + price: { type: Number, required: true }, + status: { + type: String, + enum: ["pending", "completed", "cancelled"], + default: "pending", + }, + transaction_hash: { type: String, required: true }, + created_at: { type: Date, default: Date.now }, + updated_at: { type: Date, default: Date.now }, + }, + { timestamps: { createdAt: "created_at", updatedAt: "updated_at" } } +); + +module.exports = mongoose.model("Purchase", PurchaseSchema); diff --git a/src/models/ResellListing.js b/src/models/ResellListing.js new file mode 100644 index 0000000..8cfe847 --- /dev/null +++ b/src/models/ResellListing.js @@ -0,0 +1,23 @@ +const mongoose = require("mongoose"); + +const ResellListingSchema = new mongoose.Schema( + { + purchase_id: { + type: mongoose.Schema.Types.ObjectId, + ref: "Purchase", + required: true, + }, + price: { type: Number, required: true }, + status: { + type: String, + enum: ["listed", "sold", "cancelled"], + default: "listed", + }, + transaction_hash: { type: String }, + created_at: { type: Date, default: Date.now }, + updated_at: { type: Date, default: Date.now }, + }, + { timestamps: { createdAt: "created_at", updatedAt: "updated_at" } } +); + +module.exports = mongoose.model("ResellListing", ResellListingSchema); diff --git a/src/models/Stake.js b/src/models/Stake.js new file mode 100644 index 0000000..83a9301 --- /dev/null +++ b/src/models/Stake.js @@ -0,0 +1,26 @@ +const mongoose = require("mongoose"); + +const StakeSchema = new mongoose.Schema( + { + purchase_id: { + type: mongoose.Schema.Types.ObjectId, + ref: "Purchase", + required: true, + }, + voting_power: { type: Number, required: true }, + apr: { type: Number, required: true }, + lock_end_date: { type: Date, required: true }, + status: { + type: String, + enum: ["locked", "unlocked", "withdrawn"], + default: "locked", + }, + rewards_earned: { type: Number, default: 0 }, + transaction_hash: { type: String }, + created_at: { type: Date, default: Date.now }, + updated_at: { type: Date, default: Date.now }, + }, + { timestamps: { createdAt: "created_at", updatedAt: "updated_at" } } +); + +module.exports = mongoose.model("Stake", StakeSchema);