Backend Complete: Interface Refactoring & Service Container Enhancements
Repository Interface Optimization: - Created IBaseRepository.ts and IPaginatedRepository.ts - Refactored all 7 repository interfaces to extend base interfaces - Eliminated ~200 lines of redundant code (70% reduction) - Improved type safety and maintainability Dependency Injection Improvements: - Added EmailService and GameTokenService to DIContainer - Updated CreateUserCommandHandler constructor for DI - Updated RequestPasswordResetCommandHandler constructor for DI - Enhanced testability and service consistency Environment Configuration: - Created comprehensive .env.example with 40+ variables - Organized into 12 logical sections (Database, Security, Email, etc.) - Added security guidelines and best practices - Documented all backend environment requirements Documentation: - Added comprehensive codebase review - Created refactoring summary report - Added frontend implementation guide Impact: Improved code quality, reduced maintenance overhead, enhanced developer experience
This commit is contained in:
@@ -0,0 +1,85 @@
|
||||
import { CreateChatCommand } from './ChatCommands';
|
||||
import { IChatRepository } from '../../../Domain/IRepository/IChatRepository';
|
||||
import { IUserRepository } from '../../../Domain/IRepository/IUserRepository';
|
||||
import { ChatType, ChatAggregate } from '../../../Domain/Chat/ChatAggregate';
|
||||
import { UserState } from '../../../Domain/User/UserAggregate';
|
||||
import { logAuth, logError } from '../../Services/Logger';
|
||||
|
||||
export class CreateChatCommandHandler {
|
||||
constructor(
|
||||
private chatRepository: IChatRepository,
|
||||
private userRepository: IUserRepository
|
||||
) {}
|
||||
|
||||
async execute(command: CreateChatCommand): Promise<ChatAggregate | null> {
|
||||
try {
|
||||
// Validate creator exists
|
||||
const creator = await this.userRepository.findById(command.createdBy);
|
||||
if (!creator) {
|
||||
throw new Error('Creator not found');
|
||||
}
|
||||
|
||||
// For group chats, check if creator is premium
|
||||
if (command.type === 'group' && creator.state !== UserState.VERIFIED_PREMIUM) {
|
||||
throw new Error('Premium subscription required to create groups');
|
||||
}
|
||||
|
||||
// Validate all target users exist
|
||||
const targetUsers = await Promise.all(
|
||||
command.userIds.map(id => this.userRepository.findById(id))
|
||||
);
|
||||
|
||||
if (targetUsers.some(user => !user)) {
|
||||
throw new Error('One or more target users not found');
|
||||
}
|
||||
|
||||
// For direct chats, check if already exists
|
||||
if (command.type === 'direct' && command.userIds.length === 1) {
|
||||
const existingChats = await this.chatRepository.findByUserId(command.createdBy);
|
||||
const existingDirectChat = existingChats.find(chat =>
|
||||
chat.type === ChatType.DIRECT &&
|
||||
chat.users.length === 2 &&
|
||||
chat.users.includes(command.userIds[0])
|
||||
);
|
||||
|
||||
if (existingDirectChat) {
|
||||
return existingDirectChat;
|
||||
}
|
||||
}
|
||||
|
||||
// For game chats, check if already exists
|
||||
if (command.type === 'game' && command.gameId) {
|
||||
const existingGameChat = await this.chatRepository.findByGameId(command.gameId);
|
||||
if (existingGameChat) {
|
||||
return existingGameChat;
|
||||
}
|
||||
}
|
||||
|
||||
// Create chat
|
||||
const chatData: Partial<ChatAggregate> = {
|
||||
type: command.type as any,
|
||||
name: command.name,
|
||||
gameId: command.gameId,
|
||||
createdBy: command.createdBy,
|
||||
users: [command.createdBy, ...command.userIds],
|
||||
messages: [],
|
||||
lastActivity: new Date()
|
||||
};
|
||||
|
||||
const chat = await this.chatRepository.create(chatData);
|
||||
|
||||
logAuth('Chat created successfully', command.createdBy, {
|
||||
chatId: chat.id,
|
||||
chatType: command.type,
|
||||
participantCount: chat.users.length,
|
||||
gameId: command.gameId
|
||||
});
|
||||
|
||||
return chat;
|
||||
|
||||
} catch (error) {
|
||||
logError('CreateChatCommandHandler error', error as Error);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user