Skip to content

Commit

Permalink
Merge pull request #401 from AndreSoftwareDeveloper/master
Browse files Browse the repository at this point in the history
feat: Changing password
  • Loading branch information
aXenDeveloper authored Jul 10, 2024
2 parents 51422fe + f47afe3 commit 1da87da
Show file tree
Hide file tree
Showing 6 changed files with 104 additions and 5 deletions.
4 changes: 4 additions & 0 deletions packages/backend/src/core/members/members.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import { DeleteCoreMembersResolver } from './delete/delete.resolver';
import { DeleteCoreMembersService } from './delete/delete.service';
import { CreateKeyResetPasswordCoreMembersService } from './reset_password/create_key/create_key.service';
import { CreateKeyResetPasswordCoreMembersResolver } from './reset_password/create_key/create_key.resolver';
import { ChangePasswordCoreMembersResolver } from './reset_password/change_password/change_password.resolver';
import { ChangePasswordCoreMembersService } from './reset_password/change_password/change_password.service';

@Module({
providers: [
Expand All @@ -16,6 +18,8 @@ import { CreateKeyResetPasswordCoreMembersResolver } from './reset_password/crea
DeleteCoreMembersService,
CreateKeyResetPasswordCoreMembersService,
CreateKeyResetPasswordCoreMembersResolver,
ChangePasswordCoreMembersResolver,
ChangePasswordCoreMembersService,
],
imports: [AvatarCoreMembers],
})
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { Args, Mutation, Resolver } from '@nestjs/graphql';

import { ChangePasswordCoreMembersArgs } from './dto/change_password.args';
import { ChangePasswordCoreMembersService } from './change_password.service';

import { User } from '@/decorators/user.decorator';

@Resolver()
export class ChangePasswordCoreMembersResolver {
constructor(private readonly service: ChangePasswordCoreMembersService) {}

@Mutation(() => User)
async core_members__change_password(
@Args() args: ChangePasswordCoreMembersArgs,
): Promise<User> {
return this.service.change_password(args);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { eq } from 'drizzle-orm';

import { ChangePasswordCoreMembersArgs } from './dto/change_password.args';

import { DatabaseService } from '@/database';
import { User } from '@/decorators';
import { encryptPassword } from '@/core/sessions/encrypt_password';
import {
core_users,
core_users_pass_reset,
} from '@/templates/core/admin/database/schema/users';

@Injectable()
export class ChangePasswordCoreMembersService {
constructor(
private readonly databaseService: DatabaseService,
private readonly configService: ConfigService,
) {}

async change_password({
hashKey,
password,
}: ChangePasswordCoreMembersArgs): Promise<User> {
const keyData =
await this.databaseService.db.query.core_users_pass_reset.findFirst({
where: eq(core_users_pass_reset.key, hashKey),
});

const id = keyData.user_id;
const hashPassword = await encryptPassword(this.configService, password);

const update = await this.databaseService.db
.update(core_users)
.set({
password: hashPassword,
})
.where(eq(core_users.id, id))
.returning();

return {
...update[0],
avatar: null,
group: null,
};
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { IsStrongPassword } from 'class-validator';
import { ArgsType, Field } from '@nestjs/graphql';

@ArgsType()
export class ChangePasswordCoreMembersArgs {
@Field(() => String)
hashKey: string;

@IsStrongPassword({
minLength: 8,
minLowercase: 1,
minUppercase: 1,
minNumbers: 1,
minSymbols: 1,
})
@Field(() => String)
password: string;
}
14 changes: 14 additions & 0 deletions packages/backend/src/core/sessions/encrypt_password.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { ConfigService } from '@nestjs/config';
import { genSalt, hash } from 'bcrypt';

async function encryptPassword(
configService: ConfigService,
password: string,
): Promise<string> {
const passwordSalt = await genSalt(configService.getOrThrow('password_salt'));
const hashPassword = await hash(password, passwordSalt);

return hashPassword;
}

export { encryptPassword };
7 changes: 2 additions & 5 deletions packages/backend/src/core/sessions/sign_up/sign_up.service.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { Injectable } from '@nestjs/common';
import { genSalt, hash } from 'bcrypt';
import { count } from 'drizzle-orm';
import { ConfigService } from '@nestjs/config';
import { removeSpecialCharacters } from 'vitnode-shared';

import { SignUpCoreSessionsArgs } from './dto/sign_up.args';
import { SignUpCoreSessionsObj } from './dto/sign_up.obj';
import { AvatarColorService } from './helpers/avatar-color.service';
import { encryptPassword } from '../encrypt_password';

import { CaptchaCoreCaptchaSecurityService } from '@/core/admin/security/captcha/captcha.service';
import { DatabaseService } from '../../../database';
Expand Down Expand Up @@ -83,10 +83,7 @@ export class SignUpCoreSessionsService extends AvatarColorService {
});
}

const passwordSalt = await genSalt(
this.configService.getOrThrow('password_salt'),
);
const hashPassword = await hash(password, passwordSalt);
const hashPassword = await encryptPassword(this.configService, password);

const user = await this.databaseService.db
.insert(core_users)
Expand Down

0 comments on commit 1da87da

Please sign in to comment.