172 lines
4.9 KiB
TypeScript
172 lines
4.9 KiB
TypeScript
import { Request, Response } from 'express';
|
|
import { UserNote, IUserNote } from '../models/UserNote';
|
|
import { AuthenticatedRequest } from '../types/auth';
|
|
|
|
export class UserNoteController {
|
|
// Get notes for a specific RUT
|
|
static async getNotesByRut(req: AuthenticatedRequest, res: Response) {
|
|
try {
|
|
const { rut } = req.params;
|
|
const tenantId = req.tenantId;
|
|
|
|
if (!tenantId) {
|
|
return res.status(400).json({ error: 'Tenant ID is required' });
|
|
}
|
|
|
|
const notes = await UserNote.find({ rut, tenantId })
|
|
.populate('userId', 'firstName lastName email')
|
|
.sort({ createdAt: -1 });
|
|
|
|
res.json(notes);
|
|
} catch (error) {
|
|
console.error('Error fetching notes by RUT:', error);
|
|
res.status(500).json({ error: 'Failed to fetch notes' });
|
|
}
|
|
}
|
|
|
|
// Create a new note
|
|
static async createNote(req: AuthenticatedRequest, res: Response) {
|
|
try {
|
|
const { rut, note, tags = [] } = req.body;
|
|
const userId = req.user?.id;
|
|
const tenantId = req.tenantId;
|
|
|
|
if (!userId || !tenantId) {
|
|
return res.status(400).json({ error: 'User ID and Tenant ID are required' });
|
|
}
|
|
|
|
if (!rut || !note) {
|
|
return res.status(400).json({ error: 'RUT and note are required' });
|
|
}
|
|
|
|
if (note.length > 2000) {
|
|
return res.status(400).json({ error: 'Note cannot exceed 2000 characters' });
|
|
}
|
|
|
|
if (tags.length > 10) {
|
|
return res.status(400).json({ error: 'Cannot have more than 10 tags' });
|
|
}
|
|
|
|
const newNote = new UserNote({
|
|
userId,
|
|
tenantId,
|
|
rut: rut.trim(),
|
|
note: note.trim(),
|
|
tags: tags.map((tag: string) => tag.trim()).filter((tag: string) => tag.length > 0)
|
|
});
|
|
|
|
await newNote.save();
|
|
|
|
// Populate user info before returning
|
|
await newNote.populate('userId', 'firstName lastName email');
|
|
|
|
res.status(201).json(newNote);
|
|
} catch (error) {
|
|
console.error('Error creating note:', error);
|
|
res.status(500).json({ error: 'Failed to create note' });
|
|
}
|
|
}
|
|
|
|
// Update a note
|
|
static async updateNote(req: AuthenticatedRequest, res: Response) {
|
|
try {
|
|
const { id } = req.params;
|
|
const { note, tags = [] } = req.body;
|
|
const userId = req.user?.id;
|
|
const tenantId = req.tenantId;
|
|
|
|
if (!note) {
|
|
return res.status(400).json({ error: 'Note is required' });
|
|
}
|
|
|
|
if (note.length > 2000) {
|
|
return res.status(400).json({ error: 'Note cannot exceed 2000 characters' });
|
|
}
|
|
|
|
if (tags.length > 10) {
|
|
return res.status(400).json({ error: 'Cannot have more than 10 tags' });
|
|
}
|
|
|
|
const existingNote = await UserNote.findOne({
|
|
_id: id,
|
|
userId,
|
|
tenantId
|
|
});
|
|
|
|
if (!existingNote) {
|
|
return res.status(404).json({ error: 'Note not found or unauthorized' });
|
|
}
|
|
|
|
existingNote.note = note.trim();
|
|
existingNote.tags = tags.map((tag: string) => tag.trim()).filter((tag: string) => tag.length > 0);
|
|
await existingNote.save();
|
|
|
|
// Populate user info before returning
|
|
await existingNote.populate('userId', 'firstName lastName email');
|
|
|
|
res.json(existingNote);
|
|
} catch (error) {
|
|
console.error('Error updating note:', error);
|
|
res.status(500).json({ error: 'Failed to update note' });
|
|
}
|
|
}
|
|
|
|
// Delete a note
|
|
static async deleteNote(req: AuthenticatedRequest, res: Response) {
|
|
try {
|
|
const { id } = req.params;
|
|
const userId = req.user?.id;
|
|
const tenantId = req.tenantId;
|
|
|
|
const deletedNote = await UserNote.findOneAndDelete({
|
|
_id: id,
|
|
userId,
|
|
tenantId
|
|
});
|
|
|
|
if (!deletedNote) {
|
|
return res.status(404).json({ error: 'Note not found or unauthorized' });
|
|
}
|
|
|
|
res.json({ message: 'Note deleted successfully' });
|
|
} catch (error) {
|
|
console.error('Error deleting note:', error);
|
|
res.status(500).json({ error: 'Failed to delete note' });
|
|
}
|
|
}
|
|
|
|
// Get all notes by user
|
|
static async getNotesByUser(req: AuthenticatedRequest, res: Response) {
|
|
try {
|
|
const userId = req.user?.id;
|
|
const tenantId = req.tenantId;
|
|
const { page = 1, limit = 10 } = req.query;
|
|
|
|
if (!userId || !tenantId) {
|
|
return res.status(400).json({ error: 'User ID and Tenant ID are required' });
|
|
}
|
|
|
|
const skip = (Number(page) - 1) * Number(limit);
|
|
|
|
const notes = await UserNote.find({ userId, tenantId })
|
|
.sort({ createdAt: -1 })
|
|
.skip(skip)
|
|
.limit(Number(limit));
|
|
|
|
const total = await UserNote.countDocuments({ userId, tenantId });
|
|
|
|
res.json({
|
|
notes,
|
|
pagination: {
|
|
page: Number(page),
|
|
limit: Number(limit),
|
|
total,
|
|
pages: Math.ceil(total / Number(limit))
|
|
}
|
|
});
|
|
} catch (error) {
|
|
console.error('Error fetching user notes:', error);
|
|
res.status(500).json({ error: 'Failed to fetch user notes' });
|
|
}
|
|
}
|
|
} |