126 lines
3.3 KiB
JavaScript
126 lines
3.3 KiB
JavaScript
'use strict';
|
|
|
|
const projectsService = require('./service');
|
|
const { UnauthorizedError } = require('../../shared/errors');
|
|
const { getAuthenticatedUserId } = require('../../utils/request-utils');
|
|
const { extractUidFromSlug } = require('../../utils/slug-utils');
|
|
const { logError } = require('../../services/logService');
|
|
|
|
/**
|
|
* Get authenticated user ID or throw UnauthorizedError.
|
|
*/
|
|
function requireUserId(req) {
|
|
const userId = getAuthenticatedUserId(req);
|
|
if (!userId) {
|
|
throw new UnauthorizedError('Authentication required');
|
|
}
|
|
return userId;
|
|
}
|
|
|
|
/**
|
|
* Projects controller - handles HTTP requests/responses.
|
|
*/
|
|
const projectsController = {
|
|
/**
|
|
* GET /api/projects
|
|
* List all projects for the current user.
|
|
*/
|
|
async list(req, res, next) {
|
|
try {
|
|
const userId = requireUserId(req);
|
|
const result = await projectsService.getAll(userId, req.query);
|
|
res.json(result);
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* GET /api/project/:uidSlug
|
|
* Get a single project by UID.
|
|
*/
|
|
async getOne(req, res, next) {
|
|
try {
|
|
const uid = extractUidFromSlug(req.params.uidSlug);
|
|
const project = await projectsService.getByUid(uid);
|
|
res.json(project);
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* POST /api/project
|
|
* Create a new project.
|
|
*/
|
|
async create(req, res, next) {
|
|
try {
|
|
const userId = requireUserId(req);
|
|
const project = await projectsService.create(userId, req.body);
|
|
res.status(201).json(project);
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* PATCH /api/project/:uid
|
|
* Update a project.
|
|
*/
|
|
async update(req, res, next) {
|
|
try {
|
|
const userId = requireUserId(req);
|
|
const project = await projectsService.update(
|
|
userId,
|
|
req.params.uid,
|
|
req.body
|
|
);
|
|
res.json(project);
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* DELETE /api/project/:uid
|
|
* Delete a project.
|
|
*/
|
|
async delete(req, res, next) {
|
|
try {
|
|
const userId = requireUserId(req);
|
|
const result = await projectsService.delete(userId, req.params.uid);
|
|
res.json(result);
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* POST /api/upload/project-image
|
|
* Upload a project image.
|
|
*/
|
|
async uploadImage(req, res, next) {
|
|
try {
|
|
if (!req.file) {
|
|
return res
|
|
.status(400)
|
|
.json({ error: 'No image file provided' });
|
|
}
|
|
const imageUrl = `/api/uploads/projects/${req.file.filename}`;
|
|
res.json({ imageUrl });
|
|
} catch (error) {
|
|
logError('Error uploading image:', error);
|
|
res.status(500).json({ error: 'Failed to upload image' });
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Get project UID if exists (for authorization middleware).
|
|
*/
|
|
async getProjectUidForAuth(req) {
|
|
const uid = extractUidFromSlug(req.params.uidSlug || req.params.uid);
|
|
return projectsService.getProjectUidIfExists(uid);
|
|
},
|
|
};
|
|
|
|
module.exports = projectsController;
|