128 lines
3.2 KiB
JavaScript
128 lines
3.2 KiB
JavaScript
'use strict';
|
|
|
|
const notesService = require('./service');
|
|
const { UnauthorizedError } = require('../../shared/errors');
|
|
const { getAuthenticatedUserId } = require('../../utils/request-utils');
|
|
const { extractUidFromSlug } = require('../../utils/slug-utils');
|
|
|
|
/**
|
|
* Get authenticated user ID or throw UnauthorizedError.
|
|
*/
|
|
function requireUserId(req) {
|
|
const userId = getAuthenticatedUserId(req);
|
|
if (!userId) {
|
|
throw new UnauthorizedError('Authentication required');
|
|
}
|
|
return userId;
|
|
}
|
|
|
|
/**
|
|
* Notes controller - handles HTTP requests/responses.
|
|
*/
|
|
const notesController = {
|
|
/**
|
|
* GET /api/notes
|
|
* List all notes for the current user.
|
|
*/
|
|
async list(req, res, next) {
|
|
try {
|
|
const userId = requireUserId(req);
|
|
const notes = await notesService.getAll(userId, {
|
|
orderBy: req.query.order_by,
|
|
tagFilter: req.query.tag,
|
|
});
|
|
res.json(notes);
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* GET /api/note/:uidSlug
|
|
* Get a single note by UID.
|
|
*/
|
|
async getOne(req, res, next) {
|
|
try {
|
|
const uid = extractUidFromSlug(req.params.uidSlug);
|
|
const note = await notesService.getByUid(uid);
|
|
res.json(note);
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* POST /api/note
|
|
* Create a new note.
|
|
*/
|
|
async create(req, res, next) {
|
|
try {
|
|
const userId = requireUserId(req);
|
|
const { title, content, project_uid, project_id, tags, color } =
|
|
req.body;
|
|
|
|
const note = await notesService.create(userId, {
|
|
title,
|
|
content,
|
|
project_uid,
|
|
project_id,
|
|
tags,
|
|
color,
|
|
});
|
|
|
|
res.status(201).json(note);
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* PATCH /api/note/:uid
|
|
* Update a note.
|
|
*/
|
|
async update(req, res, next) {
|
|
try {
|
|
const userId = requireUserId(req);
|
|
const { uid } = req.params;
|
|
const { title, content, project_uid, project_id, tags, color } =
|
|
req.body;
|
|
|
|
const note = await notesService.update(userId, uid, {
|
|
title,
|
|
content,
|
|
project_uid,
|
|
project_id,
|
|
tags,
|
|
color,
|
|
});
|
|
|
|
res.json(note);
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* DELETE /api/note/:uid
|
|
* Delete a note.
|
|
*/
|
|
async delete(req, res, next) {
|
|
try {
|
|
const { uid } = req.params;
|
|
const result = await notesService.delete(uid);
|
|
res.json(result);
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Get note UID if exists (for authorization middleware).
|
|
*/
|
|
async getNoteUidForAuth(req) {
|
|
const uid = extractUidFromSlug(req.params.uidSlug || req.params.uid);
|
|
return notesService.getNoteUidIfExists(uid);
|
|
},
|
|
};
|
|
|
|
module.exports = notesController;
|