Sistemato profilo
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user