Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[SPGO-12] implement register #3

Merged
merged 13 commits into from
Sep 20, 2023
10 changes: 0 additions & 10 deletions .env.example
Nitiwat-owen marked this conversation as resolved.
Show resolved Hide resolved

This file was deleted.

11 changes: 10 additions & 1 deletion src/auth/auth.controller.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
import { Controller } from '@nestjs/common';
import { GrpcMethod } from '@nestjs/microservices';
import { LoginRequest, LoginResponse } from '../proto/auth';
import {
LoginRequest,
LoginResponse,
RegisterRequest,
RegisterResponse,
} from '../proto/auth';
import { AuthService } from './auth.service';

@Controller()
Expand All @@ -11,4 +16,8 @@ export class AuthController {
login(request: LoginRequest): Promise<LoginResponse> {
return this.authService.Login(request);
}
@GrpcMethod('AuthService', 'Register')
registerUser(request: RegisterRequest): Promise<RegisterResponse> {
return this.authService.Register(request);
}
}
30 changes: 30 additions & 0 deletions src/auth/auth.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ import {
LoginResponse,
RefreshTokenRequest,
RefreshTokenResponse,
RegisterRequest,
RegisterResponse,
} from '../proto/auth';
import { UserRepository } from '../repository/user.repository';
import * as bcrypt from 'bcrypt';
Expand Down Expand Up @@ -97,4 +99,32 @@ export class AuthService implements AuthGRPCService {

return { accessToken, refreshToken };
}

async Register(request: RegisterRequest): Promise<RegisterResponse> {
try {
const existUser = this.userRepo.findUnique({
email: request.email,
});
if (existUser) {
throw new GrpcInternalException({
statusCode: 400,
message: 'Email Duplicate',
});
} else {
const hashedPassword = await bcrypt.hash(request.password, 12);
const newUser = {
firstName: request.firstName,
lastName: request.lastName,
email: request.email,
phoneNumber: request.phoneNumber,
role: request.role,
password: hashedPassword,
};
return await this.userRepo.create(newUser);
}
} catch (err) {
console.log(err);
throw err;
}
}
}
17 changes: 17 additions & 0 deletions src/proto/auth.proto
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,23 @@ package auth;
service AuthService {
rpc Login(LoginRequest) returns (LoginResponse) {}
rpc RefreshToken(RefreshTokenRequest) returns (RefreshTokenResponse) {}
rpc Register(ReisterRequest) returns (RegisterResponse) {}
Nitiwat-owen marked this conversation as resolved.
Show resolved Hide resolved
}

message RegisterRequest {
string firstName =1;
string lastName =2;
string email =3;
string phoneNumber =4;
string password =5;
string role =6 ;
}

message RegisterResponse {
string firstName =1;
string lastName =2;
string email =3;
string phoneNumber =4;
}

message Credential {
Expand Down
25 changes: 25 additions & 0 deletions src/proto/auth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -449,6 +449,7 @@ export const RefreshTokenResponse = {
export interface AuthService {
Login(request: LoginRequest): Promise<LoginResponse>;
RefreshToken(request: RefreshTokenRequest): Promise<RefreshTokenResponse>;
Register(request: RegisterRequest): Promise<RegisterResponse>;
}

export const AuthServiceServiceName = 'auth.AuthService';
Expand Down Expand Up @@ -476,6 +477,14 @@ export class AuthServiceClientImpl implements AuthService {
RefreshTokenResponse.decode(_m0.Reader.create(data)),
);
}

Register(request: RegisterRequest): Promise<RegisterResponse> {
const data = RegisterRequest.encode(request).finish();
const promise = this.rpc.request(this.service, 'RefreshToken', data);
return promise.then((data) =>
RefreshTokenResponse.decode(_m0.Reader.create(data)),
);
}
}

interface Rpc {
Expand Down Expand Up @@ -515,3 +524,19 @@ export type Exact<P, I extends P> = P extends Builtin
function isSet(value: any): boolean {
return value !== null && value !== undefined;
}

export interface RegisterRequest {
firstName: string;
lastName: string;
email: string;
phoneNumber: string;
password: string;
role: string;
}

export interface RegisterResponse {
firstName: string;
lastName: string;
email: string;
phoneNumber: string;
}
12 changes: 10 additions & 2 deletions src/repository/user.repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,22 @@ export class UserRepository {
constructor(private db: PrismaService) {}

async getUserByEmail(email: string): Promise<User> {
return this.db.user.findUniqueOrThrow({ where: { email: email } });
return await this.db.user.findUnique({ where: { email: email } });
}

async findUnique(where, select?, include?): Promise<User> {
return await this.db.user.findUnique({ where: where });
}
Nitiwat-owen marked this conversation as resolved.
Show resolved Hide resolved

async create(data): Promise<User> {
return await this.db.user.create({ data: data });
}
Nitiwat-owen marked this conversation as resolved.
Show resolved Hide resolved

async updateRefreshToken(
userId: string,
refreshToken: string,
): Promise<User> {
return this.db.user.update({
return await this.db.user.update({
where: { id: userId },
data: { refreshToken: refreshToken },
});
Expand Down