Sistemato profilo

This commit is contained in:
Lorenzo Sanesi
2026-04-04 02:40:34 +02:00
parent 162e0de62a
commit aa5ca9bbe3
10 changed files with 454 additions and 28 deletions
@@ -25,7 +25,7 @@ class GroupsController {
async createGroup(req, res, next) {
try {
const group = await this.groupsService.createGroup(req.body);
const group = await this.groupsService.createGroup(req.body, req.userId);
return ResponseHandler.created(res, group, 'Group created successfully');
} catch (error) {
next(error);
@@ -14,6 +14,19 @@ class UsersController {
}
}
async searchUsers(req, res, next) {
try {
const { q } = req.query;
if (!q || !q.trim()) {
return ResponseHandler.badRequest(res, 'Query parameter "q" is required');
}
const users = await this.usersService.searchUsers(q.trim(), req.userId);
return ResponseHandler.success(res, users, 'Users found');
} catch (error) {
next(error);
}
}
async updateCurrentUser(req, res, next) {
try {
const user = await this.usersService.updateUserProfile(req.userId, req.body);
@@ -1,3 +1,4 @@
const { Op } = require('sequelize');
const { NotFoundError, DatabaseError } = require('../../shared/errors');
class UsersRepository {
@@ -6,6 +7,23 @@ class UsersRepository {
this.User = sequelize.models.User;
}
async search(query, excludeUserId) {
try {
return await this.User.findAll({
where: {
id: { [Op.ne]: excludeUserId },
[Op.or]: [
{ name: { [Op.iLike]: `%${query}%` } },
{ email: { [Op.iLike]: `%${query}%` } },
],
},
limit: 20,
});
} catch (error) {
throw new DatabaseError('Failed to search users', error);
}
}
async findAll(options = {}) {
try {
return await this.User.findAll(options);
+2
View File
@@ -8,8 +8,10 @@ module.exports = ({ usersController }) => {
const controller = {
getCurrentUser: (req, res, next) => usersController.getCurrentUser(req, res, next),
updateCurrentUser: (req, res, next) => usersController.updateCurrentUser(req, res, next),
searchUsers: (req, res, next) => usersController.searchUsers(req, res, next),
};
router.get('/search', controller.searchUsers);
router.get('/current', controller.getCurrentUser);
router.put('/current', validate(updateUserSchema), controller.updateCurrentUser);
+6 -5
View File
@@ -14,23 +14,24 @@ class GroupsService {
return await this.groupsRepository.findById(groupId, true);
}
async createGroup(groupData) {
async createGroup(groupData, creatorId) {
const { name, members } = groupData;
if (!name || name.trim() === '') {
throw new ValidationError('Group name is required');
}
if (!members || !Array.isArray(members) || members.length === 0) {
throw new ValidationError('At least one member is required');
const memberList = Array.isArray(members) ? [...members] : [];
if (!memberList.includes(creatorId)) {
memberList.push(creatorId);
}
for (const userId of members) {
for (const userId of memberList) {
await this.usersRepository.findById(userId);
}
const group = await this.groupsRepository.create({ name });
return await this.groupsRepository.addMembers(group.id, members);
return await this.groupsRepository.addMembers(group.id, memberList);
}
async updateGroup(groupId, updateData) {
+4
View File
@@ -13,6 +13,10 @@ class UsersService {
return await this.usersRepository.findById(id);
}
async searchUsers(query, excludeUserId) {
return await this.usersRepository.search(query, excludeUserId);
}
async updateUserProfile(id, updateData) {
const { name, email, avatarUrl } = updateData;