recoder-code
Version:
🚀 AI-powered development platform - Chat with 32+ models, build projects, automate workflows. Free models included!
161 lines • 5.68 kB
JavaScript
"use strict";
/**
* User Service for managing user operations
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.UserService = void 0;
const User_1 = require("../entities/User");
const database_1 = require("../database");
const bcryptjs_1 = __importDefault(require("bcryptjs"));
class UserService {
constructor() {
this.userRepository = database_1.AppDataSource.getRepository(User_1.User);
}
async findById(id) {
return this.userRepository.findOne({ where: { id } });
}
async findByUsername(username) {
return this.userRepository.findOne({ where: { username } });
}
async findByEmail(email) {
return this.userRepository.findOne({ where: { email } });
}
async create(userData) {
const user = this.userRepository.create(userData);
return this.userRepository.save(user);
}
async update(id, updates) {
await this.userRepository.update(id, updates);
return this.findById(id);
}
async validatePassword(user, password) {
return bcryptjs_1.default.compare(password, user.password_hash);
}
async hashPassword(password) {
return bcryptjs_1.default.hash(password, 10);
}
async authenticate(email, password) {
const user = await this.findByEmail(email);
if (!user) {
return { success: false };
}
const isValid = await this.validatePassword(user, password);
if (!isValid) {
return { success: false };
}
return { success: true, user };
}
async updateUser(id, updates) {
try {
const user = await this.update(id, updates);
if (!user) {
return { success: false, error: 'User not found' };
}
return { success: true, user };
}
catch (error) {
return { success: false, error: 'Failed to update user' };
}
}
async verifyEmail(token) {
try {
const user = await this.userRepository.findOne({ where: { verification_token: token } });
if (!user) {
return { success: false, error: 'Invalid verification token' };
}
if (user.verification_expires && user.verification_expires < new Date()) {
return { success: false, error: 'Verification token expired' };
}
user.verifyEmail();
await this.userRepository.save(user);
return { success: true, user };
}
catch (error) {
return { success: false, error: 'Failed to verify email' };
}
}
async requestPasswordReset(email) {
try {
const user = await this.findByEmail(email);
if (!user) {
// Don't reveal if email exists or not
return { success: true };
}
const token = user.generateResetToken();
await this.userRepository.save(user);
// In a real implementation, you would send an email here
// await emailService.sendPasswordResetEmail(user.email, token);
return { success: true };
}
catch (error) {
return { success: false, error: 'Failed to process password reset request' };
}
}
async resetPassword(token, newPassword) {
try {
const user = await this.userRepository.findOne({ where: { reset_token: token } });
if (!user) {
return { success: false, error: 'Invalid reset token' };
}
if (user.reset_expires && user.reset_expires < new Date()) {
return { success: false, error: 'Reset token expired' };
}
const hashedPassword = await this.hashPassword(newPassword);
user.password_hash = hashedPassword;
user.clearResetToken();
await this.userRepository.save(user);
return { success: true, user };
}
catch (error) {
return { success: false, error: 'Failed to reset password' };
}
}
async getUserPackages(userId) {
try {
const user = await this.userRepository.findOne({
where: { id: userId },
relations: ['packages']
});
return user?.packages || [];
}
catch (error) {
return [];
}
}
async getUserStats(userId) {
try {
const user = await this.findById(userId);
if (!user) {
return null;
}
return {
packagesPublished: user.stats?.packages_published || 0,
totalDownloads: user.stats?.total_downloads || 0,
followers: user.stats?.followers || 0,
following: user.stats?.following || 0,
packagesMaintained: user.stats?.packages_maintained || 0
};
}
catch (error) {
return null;
}
}
async deleteUser(userId) {
try {
const user = await this.findById(userId);
if (!user) {
return { success: false, error: 'User not found' };
}
await this.userRepository.remove(user);
return { success: true };
}
catch (error) {
return { success: false, error: 'Failed to delete user' };
}
}
}
exports.UserService = UserService;
//# sourceMappingURL=UserService.js.map