diff --git a/src/controllers/sellerController.js b/src/controllers/sellerController.js new file mode 100644 index 0000000..d416389 --- /dev/null +++ b/src/controllers/sellerController.js @@ -0,0 +1,49 @@ +const Project = require('../models/Project'); +const Transaction = require('../models/Transaction'); +const User = require('../models/User'); + + +exports.getSellerProjects = async (req, res, next) => { + try { + const sellerId = req.user.id; + const projects = await Project.find({ seller: sellerId }); + res.status(200).json({ success: true, count: projects.length, data: projects }); + } catch (err) { + next(err); + } +}; + + +exports.getSellerSoldProjects = async (req, res, next) => { + try { + const sellerId = req.user.id; + + const soldProjects = await Transaction.find({ seller: sellerId, type: 'project_sale' }).populate('project'); + res.status(200).json({ success: true, count: soldProjects.length, data: soldProjects }); + } catch (err) { + next(err); + } +}; + + +exports.getSellerActivity = async (req, res, next) => { + try { + const sellerId = req.user.id; + + const [projects, soldProjects, transactions] = await Promise.all([ + Project.find({ seller: sellerId }), + Transaction.find({ seller: sellerId, type: 'project_sale' }).populate('project'), + Transaction.find({ seller: sellerId }) + ]); + res.status(200).json({ + success: true, + data: { + createdProjects: projects, + soldProjects: soldProjects, + transactions: transactions + } + }); + } catch (err) { + next(err); + } +}; diff --git a/src/models/Project.js b/src/models/Project.js new file mode 100644 index 0000000..a7d5de6 --- /dev/null +++ b/src/models/Project.js @@ -0,0 +1,33 @@ +const mongoose = require('mongoose'); + +const ProjectSchema = new mongoose.Schema({ + name: { + type: String, + required: true, + }, + description: String, + seller: { + type: mongoose.Schema.ObjectId, + ref: 'User', + required: true, + }, + status: { + type: String, + enum: ['active', 'sold', 'inactive'], + default: 'active', + }, + price: { + type: Number, + required: true, + }, + createdAt: { + type: Date, + default: Date.now, + }, + soldAt: Date, + metadata: mongoose.Schema.Types.Mixed, +}, { + timestamps: true, +}); + +module.exports = mongoose.model('Project', ProjectSchema); diff --git a/src/models/Transaction.js b/src/models/Transaction.js index a16c81b..b5adcc8 100644 --- a/src/models/Transaction.js +++ b/src/models/Transaction.js @@ -51,9 +51,19 @@ const TransactionSchema = new mongoose.Schema({ }, type: { type: String, - enum: ['transfer', 'contract_interaction', 'token_transfer', 'nft_transfer'], + enum: ['transfer', 'contract_interaction', 'token_transfer', 'nft_transfer', 'project_sale'], default: 'transfer', }, + + // Add seller and project fields for project sale tracking + seller: { + type: mongoose.Schema.ObjectId, + ref: 'User', + }, + project: { + type: mongoose.Schema.ObjectId, + ref: 'Project', + }, tokenAddress: { type: String, lowercase: true, diff --git a/src/routes/index.js b/src/routes/index.js index 10df6cc..d3266b4 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -7,6 +7,7 @@ const userRoutes = require('./users'); const walletRoutes = require('./wallets'); const transactionRoutes = require('./transactions'); const web3Routes = require('./web3'); +const sellerRoutes = require('./seller'); // API version and info router.get('/', (req, res) => { @@ -20,6 +21,7 @@ router.get('/', (req, res) => { wallets: '/api/wallets', transactions: '/api/transactions', web3: '/api/web3', + seller: '/api/seller', }, documentation: '/api/docs', }); @@ -31,5 +33,6 @@ router.use('/users', userRoutes); router.use('/wallets', walletRoutes); router.use('/transactions', transactionRoutes); router.use('/web3', web3Routes); +router.use('/seller', sellerRoutes); module.exports = router; \ No newline at end of file diff --git a/src/routes/seller.js b/src/routes/seller.js new file mode 100644 index 0000000..2820afa --- /dev/null +++ b/src/routes/seller.js @@ -0,0 +1,21 @@ +const express = require('express'); +const router = express.Router(); +const { protect, authorize } = require('../middleware/auth'); +const { + getSellerProjects, + getSellerSoldProjects, + getSellerActivity +} = require('../controllers/sellerController'); + + +router.use(protect); +router.use(authorize('user')); + + +router.get('/projects', getSellerProjects); + +router.get('/sold-projects', getSellerSoldProjects); + +router.get('/activity', getSellerActivity); + +module.exports = router;