Controllers - pacificnm/wiki-ai GitHub Wiki

📁 Folder Structure for Controllers

controllers/
├── authController.js
├── documentController.js
├── versionController.js
├── commentController.js
├── tagController.js
├── categoryController.js
├── fileController.js
├── accessControlController.js
├── favoriteController.js

📄 controllers/documentController.js

import Document from '../models/Document.js';
import Version from '../models/Version.js';
import { documentSchema } from '../validators/documentValidator.js';

// Create a new document
export async function createDocument(req, res) {
  try {
    const validated = documentSchema.parse(req.body);

    const newDoc = await Document.create({
      ...validated,
      ownerId: req.user.uid,
    });

    res.status(201).json({ message: 'Document created', document: newDoc });
  } catch (err) {
    res.status(400).json({ error: err.message });
  }
}

// Get a single document
export async function getDocument(req, res) {
  try {
    const doc = await Document.findById(req.params.id).populate('tags categories');
    if (!doc) return res.status(404).json({ message: 'Document not found' });

    res.json(doc);
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
}

// Update a document
export async function updateDocument(req, res) {
  try {
    const validated = documentSchema.partial().parse(req.body);

    const updatedDoc = await Document.findByIdAndUpdate(
      req.params.id,
      { $set: validated },
      { new: true }
    );

    res.json({ message: 'Document updated', document: updatedDoc });
  } catch (err) {
    res.status(400).json({ error: err.message });
  }
}

// Delete a document
export async function deleteDocument(req, res) {
  try {
    await Document.findByIdAndDelete(req.params.id);
    res.json({ message: 'Document deleted' });
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
}

📄 controllers/versionController.js

import Version from '../models/Version.js';

// List all versions of a document
export async function listVersions(req, res) {
  try {
    const versions = await Version.find({ documentId: req.params.docId });
    res.json(versions);
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
}

// Restore a specific version
export async function restoreVersion(req, res) {
  try {
    const version = await Version.findById(req.params.versionId);
    if (!version) return res.status(404).json({ message: 'Version not found' });

    // Optional: Replace the document's content with this version
    // await Document.findByIdAndUpdate(version.documentId, { content: version.content });

    res.json({ message: 'Version retrieved', version });
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
}

module.exports = {
  listVersions,
  restoreVersion,
};