Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
ideaController.js 2.97 KiB
const Idea = require('../models/idea');
const mongoose = require('mongoose');


// Helper function for validating required fields
const validateFields = (fields, res) => {
  for (const field of fields) {
    if (!field.value) {
      return res.status(400).json({ msg: `Please provide ${field.name}` });
    }
  }
};

// ✅ Submit a new idea
exports.submitIdea = async (req, res) => {
  try {
    const { name, title, description, domain, budget, projectStage, location } = req.body;
    const email = req.user.email;
    const userId = req.user.id;
    const file = req.file ? req.file.filename : null;

    // Validate input fields
    const validationResponse = validateFields([
      { value: email, name: 'email' },
      { value: name, name: 'name' },
      { value: title, name: 'title' },
      { value: description, name: 'description' },
      { value: domain, name: 'domain' },
      { value: budget, name: 'budget' },
      { value: projectStage, name: 'projectStage' },
      { value: location, name: 'location' },
      { value: file, name: 'file' }
    ], res);

    if (validationResponse) return validationResponse;

    const idea = new Idea({
      email,
      name,
      userId,
      title,
      description,
      domain,
      budget,
      projectStage,
      location,
      file
    });

    await idea.save();

    return res.status(201).json({
      msg: 'Idea submitted successfully',
      idea
    });

  } catch (error) {
    console.error('Error submitting idea:', error.message);
    return res.status(500).json({ msg: 'Server error' });
  }
};

// ✅ Get all ideas (admin use or for listing)
exports.getIdeas = async (req, res) => {
  try {
    const filter = {};
    if (req.query.email) {
      // Security check - verify requesting user matches the email filter
      if (req.user.email !== req.query.email) {
        return res.status(403).json({ msg: 'Unauthorized access' });
      }
      filter.email = req.query.email;
    }

    const ideas = await Idea.find(filter).sort({ createdAt: -1 });
    res.json(ideas);
  } catch (error) {
    console.error('Error getting ideas:', error.message);
    return res.status(500).json({ msg: 'Server error' });
  }
};

// ✅ Get posts by a specific user
exports.getUserPosts = async (req, res) => {
  try {
    const objectId = new mongoose.Types.ObjectId(req.params.userId);
    const posts = await Idea.find({ userId: objectId }).sort({ createdAt: -1 });
    res.json(posts);
  } catch (err) {
    console.error('Error fetching user posts:', err.message);
    res.status(500).json({ msg: "Failed to fetch user's posts" });
  }
};

// ✅ Get posts liked by a user
exports.getLikedPosts = async (req, res) => {
  try {
    const objectId = new mongoose.Types.ObjectId(req.params.userId);
    const likedPosts = await Idea.find({ likedBy: objectId }).sort({ createdAt: -1 });
    res.json(likedPosts);
  } catch (err) {
    console.error('Error fetching liked posts:', err.message);
    res.status(500).json({ msg: 'Failed to fetch liked posts' });
  }
};