/** * ResearchInquiry Model * Academic research collaboration inquiries */ const { ObjectId } = require('mongodb'); const { getCollection } = require('../utils/db.util'); class ResearchInquiry { /** * Create a new research inquiry */ static async create(data) { const collection = await getCollection('research_inquiries'); const inquiry = { contact: { name: data.contact.name, email: data.contact.email, institution: data.contact.institution }, research: { research_question: data.research.research_question, methodology: data.research.methodology, context: data.research.context, needs: data.research.needs || [], // Array of collaboration needs other_needs: data.research.other_needs, timeline: data.research.timeline }, status: data.status || 'new', // new/reviewed/responded/closed assigned_to: data.assigned_to, response: { sent_at: data.response?.sent_at, content: data.response?.content, responder: data.response?.responder }, created_at: new Date() }; const result = await collection.insertOne(inquiry); return { ...inquiry, _id: result.insertedId }; } /** * Find inquiry by ID */ static async findById(id) { const collection = await getCollection('research_inquiries'); return await collection.findOne({ _id: new ObjectId(id) }); } /** * Find inquiries by status */ static async findByStatus(status, options = {}) { const collection = await getCollection('research_inquiries'); const { limit = 20, skip = 0 } = options; return await collection .find({ status }) .sort({ created_at: -1 }) .skip(skip) .limit(limit) .toArray(); } /** * Find all inquiries with pagination */ static async findAll(options = {}) { const collection = await getCollection('research_inquiries'); const { limit = 20, skip = 0 } = options; return await collection .find({}) .sort({ created_at: -1 }) .skip(skip) .limit(limit) .toArray(); } /** * Update inquiry */ static async update(id, updates) { const collection = await getCollection('research_inquiries'); const result = await collection.updateOne( { _id: new ObjectId(id) }, { $set: updates } ); return result.modifiedCount > 0; } /** * Assign inquiry to user */ static async assign(id, userId) { const collection = await getCollection('research_inquiries'); const result = await collection.updateOne( { _id: new ObjectId(id) }, { $set: { assigned_to: new ObjectId(userId), status: 'reviewed' } } ); return result.modifiedCount > 0; } /** * Mark as responded */ static async respond(id, responseData) { const collection = await getCollection('research_inquiries'); const result = await collection.updateOne( { _id: new ObjectId(id) }, { $set: { status: 'responded', 'response.sent_at': new Date(), 'response.content': responseData.content, 'response.responder': responseData.responder } } ); return result.modifiedCount > 0; } /** * Count by status */ static async countByStatus(status) { const collection = await getCollection('research_inquiries'); return await collection.countDocuments({ status }); } /** * Count all inquiries */ static async countAll() { const collection = await getCollection('research_inquiries'); return await collection.countDocuments({}); } /** * Delete inquiry */ static async delete(id) { const collection = await getCollection('research_inquiries'); const result = await collection.deleteOne({ _id: new ObjectId(id) }); return result.deletedCount > 0; } } module.exports = ResearchInquiry;