api-portfolio/src/messages/messages.service.ts
Заид Омар Медхат | Zaid Omar Medhat e980536871
Some checks failed
Deploy Production / deploy (push) Failing after 5s
init
2026-01-27 14:26:01 +05:00

107 lines
3.0 KiB
TypeScript

import { Injectable, NotFoundException } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Message } from './entities';
import { CreateMessageDto, MessagesQueryDto } from './dto';
@Injectable()
export class MessagesService {
constructor(
@InjectRepository(Message)
private messagesRepository: Repository<Message>,
) {}
async create(createMessageDto: CreateMessageDto): Promise<Message> {
const message = this.messagesRepository.create({
name: createMessageDto.name,
email: createMessageDto.email,
subject: createMessageDto.subject,
message: createMessageDto.message,
isRead: false,
});
return this.messagesRepository.save(message);
}
async findAll(
query: MessagesQueryDto,
): Promise<{ messages: Message[]; total: number; page: number; limit: number; unreadCount: number }> {
const { page = 1, limit = 10, isRead } = query;
const queryBuilder = this.messagesRepository.createQueryBuilder('message');
// Filter by read status if specified
if (isRead !== undefined) {
queryBuilder.andWhere('message.isRead = :isRead', { isRead });
}
// Sort by createdAt (newest first)
queryBuilder.orderBy('message.createdAt', 'DESC');
// Get total count
const total = await queryBuilder.getCount();
// Pagination
queryBuilder.skip((page - 1) * limit).take(limit);
const messages = await queryBuilder.getMany();
// Get unread count
const unreadCount = await this.messagesRepository.count({
where: { isRead: false },
});
return {
messages,
total,
page,
limit,
unreadCount,
};
}
async findOne(id: string): Promise<Message> {
const message = await this.messagesRepository.findOne({ where: { id } });
if (!message) {
throw new NotFoundException(`Message with ID ${id} not found`);
}
// Mark as read when fetched by ID
if (!message.isRead) {
message.isRead = true;
await this.messagesRepository.save(message);
}
return message;
}
async markAsRead(id: string): Promise<Message> {
const message = await this.findOneWithoutMarkingRead(id);
message.isRead = true;
return this.messagesRepository.save(message);
}
async markAsUnread(id: string): Promise<Message> {
const message = await this.findOneWithoutMarkingRead(id);
message.isRead = false;
return this.messagesRepository.save(message);
}
async remove(id: string): Promise<void> {
const message = await this.findOneWithoutMarkingRead(id);
await this.messagesRepository.remove(message);
}
async getUnreadCount(): Promise<number> {
return this.messagesRepository.count({ where: { isRead: false } });
}
private async findOneWithoutMarkingRead(id: string): Promise<Message> {
const message = await this.messagesRepository.findOne({ where: { id } });
if (!message) {
throw new NotFoundException(`Message with ID ${id} not found`);
}
return message;
}
}