Models - pacificnm/wiki-ai GitHub Wiki
โ Usage Notes
Each model should be saved in its own file in /server/models/ Example: document.model.js, user.model.js, etc. Be sure to initialize Mongoose and connect to your DB in server/index.js
๐ Document Model (document.model.js)
import mongoose from 'mongoose';
const documentSchema = new mongoose.Schema({
userId: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
title: { type: String, required: true },
description: { type: String },
tags: [String],
autoTags: [String],
summary: { type: String },
currentVersionId: { type: mongoose.Schema.Types.ObjectId, ref: 'Version' },
versionHistory: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Version' }],
categoryIds: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Category' }],
commentIds: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Comment' }],
attachmentPaths: [String],
createdAt: { type: Date, default: Date.now },
updatedAt: { type: Date, default: Date.now }
});
export default mongoose.model('Document', documentSchema);
๐งพ Version Model (version.model.js)
import mongoose from 'mongoose';
const versionSchema = new mongoose.Schema({
documentId: { type: mongoose.Schema.Types.ObjectId, ref: 'Document', required: true },
markdown: { type: String, required: true },
createdBy: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
reason: { type: String },
createdAt: { type: Date, default: Date.now }
});
export default mongoose.model('Version', versionSchema);
๐ Category Model (category.model.js)
import mongoose from 'mongoose';
const categorySchema = new mongoose.Schema({
name: { type: String, required: true },
slug: { type: String, required: true, unique: true },
description: { type: String },
parentId: { type: mongoose.Schema.Types.ObjectId, ref: 'Category' },
path: [{ type: String }],
depth: { type: Number, default: 0 }
});
export default mongoose.model('Category', categorySchema);
๐ฌ Comment Model (comment.model.js)
import mongoose from 'mongoose';
const commentSchema = new mongoose.Schema({
documentId: { type: mongoose.Schema.Types.ObjectId, ref: 'Document', required: true },
versionId: { type: mongoose.Schema.Types.ObjectId, ref: 'Version' },
userId: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
text: { type: String, required: true },
location: { type: String },
createdAt: { type: Date, default: Date.now }
});
export default mongoose.model('Comment', commentSchema);
๐ Attachment Model (attachment.model.js)
import mongoose from 'mongoose';
const attachmentSchema = new mongoose.Schema({
documentId: { type: mongoose.Schema.Types.ObjectId, ref: 'Document', required: true },
versionId: { type: mongoose.Schema.Types.ObjectId, ref: 'Version' },
uploadedBy: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
fileName: { type: String, required: true },
filePath: { type: String, required: true },
fileType: { type: String },
size: { type: Number },
createdAt: { type: Date, default: Date.now }
});
export default mongoose.model('Attachment', attachmentSchema);
๐ค User Model (user.model.js)
import mongoose from 'mongoose';
const userSchema = new mongoose.Schema({
firebaseUid: { type: String, required: true, unique: true },
displayName: { type: String },
email: { type: String, required: true, unique: true },
role: { type: String, enum: ['user', 'admin'], default: 'user' },
profileImage: { type: String },
createdAt: { type: Date, default: Date.now },
lastLogin: { type: Date }
});
module.exports = mongoose.model('User', userSchema);
๐ Log Model (log.model.js)
const mongoose = require('mongoose');
const logSchema = new mongoose.Schema({
level: { type: String, enum: ['info', 'warn', 'error', 'debug'], required: true },
message: { type: String, required: true },
context: { type: String },
userId: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
meta: { type: mongoose.Schema.Types.Mixed },
timestamp: { type: Date, default: Date.now }
});
module.exports = mongoose.model('Log', logSchema);
๐ง AI Suggestion Model (aiSuggestion.model.js)
const mongoose = require('mongoose');
const aiSuggestionSchema = new mongoose.Schema({
documentId: { type: mongoose.Schema.Types.ObjectId, ref: 'Document', required: true },
versionId: { type: mongoose.Schema.Types.ObjectId, ref: 'Version' },
type: { type: String, enum: ['tag', 'summary', 'title'], required: true },
suggestion: { type: mongoose.Schema.Types.Mixed, required: true },
modelUsed: { type: String },
promptUsed: { type: String },
createdBy: { type: String, enum: ['system', 'user'], default: 'system' },
createdAt: { type: Date, default: Date.now }
});
module.exports = mongoose.model('AiSuggestion', aiSuggestionSchema);
โ Audit Log Model (auditLog.model.js)
const mongoose = require('mongoose');
const auditLogSchema = new mongoose.Schema({
userId: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
action: { type: String, required: true },
targetType: { type: String, required: true },
targetId: { type: mongoose.Schema.Types.ObjectId },
changes: { type: mongoose.Schema.Types.Mixed },
createdAt: { type: Date, default: Date.now }
});
module.exports = mongoose.model('AuditLog', auditLogSchema);
๐งโ๐คโ๐ง Access Control Model (accessControl.model.js)
const mongoose = require('mongoose');
const accessControlSchema = new mongoose.Schema({
documentId: { type: mongoose.Schema.Types.ObjectId, ref: 'Document', required: true },
userId: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
permission: { type: String, enum: ['viewer', 'editor'], required: true },
grantedBy: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
createdAt: { type: Date, default: Date.now }
});
module.exports = mongoose.model('AccessControl', accessControlSchema);
โญ Favorite Model (favorite.model.js)
const mongoose = require('mongoose');
const favoriteSchema = new mongoose.Schema({
userId: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
documentId: { type: mongoose.Schema.Types.ObjectId, ref: 'Document', required: true },
createdAt: { type: Date, default: Date.now }
});
module.exports = mongoose.model('Favorite', favoriteSchema);