feature/get-places-api #2
@ -0,0 +1,10 @@
|
|||||||
|
import { AdminData } from '../../usecase/phonenumberAuthUsecase';
|
||||||
|
|
||||||
|
export type PhonenumberAuthDTOReturnType = {
|
||||||
|
username: string;
|
||||||
|
};
|
||||||
|
const phonenumberAuthDTO = (adminData: AdminData): PhonenumberAuthDTOReturnType => ({
|
||||||
|
username: adminData.phonenumber,
|
||||||
|
});
|
||||||
|
|
||||||
|
export default phonenumberAuthDTO;
|
@ -0,0 +1,5 @@
|
|||||||
|
import { AdminData } from '../../usecase/phonenumberAuthUsecase';
|
||||||
|
|
||||||
|
export default interface IPhoneNumberAuthRepo {
|
||||||
|
execute(adminData: AdminData): Promise<string>;
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
import { AdminData } from '../../usecase/phonenumberAuthUsecase';
|
||||||
|
import phonenumberAuthDTO, { PhonenumberAuthDTOReturnType } from '../dto/phonenumberDto';
|
||||||
|
import IPhoneNumberAuthRepo from './IPhoneNumberAuthRepo';
|
||||||
|
|
||||||
|
export type RepoHttpHandler = (dtoData: PhonenumberAuthDTOReturnType) => Promise<string>;
|
||||||
|
export default class PhoneNumberAuthRepo implements IPhoneNumberAuthRepo {
|
||||||
|
private httpHandler: RepoHttpHandler;
|
||||||
|
|
||||||
|
constructor(httpHandler: RepoHttpHandler) {
|
||||||
|
this.httpHandler = httpHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
async execute(adminData: AdminData): Promise<string> {
|
||||||
|
// make dto
|
||||||
|
const data = phonenumberAuthDTO(adminData);
|
||||||
|
// call http handler
|
||||||
|
const response = await this.httpHandler(data);
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,3 @@
|
|||||||
|
import phonenumberAuthInfra from './infra/phonenumberAuthInfra';
|
||||||
|
|
||||||
|
export default phonenumberAuthInfra;
|
@ -0,0 +1,21 @@
|
|||||||
|
import PhoneNumberAuthRepo, { RepoHttpHandler } from '../data/repository/phonenumberAuthRepo';
|
||||||
|
import PhonenumberAuthUsecase from '../usecase/phonenumberAuthUsecase';
|
||||||
|
|
||||||
|
export interface IPhonenumberAuthInfra {
|
||||||
|
httpHandler: RepoHttpHandler;
|
||||||
|
wrongPhoneNumberMessage: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const phonenumberAuthInfra = async (
|
||||||
|
httpHandler: RepoHttpHandler,
|
||||||
|
wrongPhoneNumberMessage: string,
|
||||||
|
): Promise<PhonenumberAuthUsecase> => {
|
||||||
|
// prepare repo
|
||||||
|
const repository = new PhoneNumberAuthRepo(httpHandler);
|
||||||
|
// prepare usecase
|
||||||
|
const usecase = new PhonenumberAuthUsecase(repository, wrongPhoneNumberMessage);
|
||||||
|
// return main method
|
||||||
|
return usecase;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default phonenumberAuthInfra;
|
@ -0,0 +1,5 @@
|
|||||||
|
import { IPhonenumberAuthInfra } from './infra/phonenumberAuthInfra';
|
||||||
|
import PhonenumberAuthUsecase from './usecase/phonenumberAuthUsecase';
|
||||||
|
|
||||||
|
export type IPhonenumberAuthPort = IPhonenumberAuthInfra;
|
||||||
|
export type PhonenumberReturnTypePort = Promise<PhonenumberAuthUsecase>;
|
@ -0,0 +1 @@
|
|||||||
|
export default class PhonenumberException extends Error {}
|
@ -0,0 +1,36 @@
|
|||||||
|
import IPhoneNumberAuthRepo from '../data/repository/IPhoneNumberAuthRepo';
|
||||||
|
import PhonenumberException from './exception';
|
||||||
|
|
||||||
|
export type AdminData = {
|
||||||
|
phonenumber: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
interface IPhoneNumberAuthUsecase {
|
||||||
|
execute(adminData: AdminData): Promise<string>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default class PhonenumberAuthUsecase implements IPhoneNumberAuthUsecase {
|
||||||
|
private repository: IPhoneNumberAuthRepo;
|
||||||
|
|
||||||
|
private wrongPhoneNumberMessage: string;
|
||||||
|
|
||||||
|
constructor(repository: IPhoneNumberAuthRepo, wrongPhoneNumberMessage: string) {
|
||||||
|
this.repository = repository;
|
||||||
|
this.wrongPhoneNumberMessage = wrongPhoneNumberMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
async execute(adminData: AdminData): Promise<string> {
|
||||||
|
// check phone number regex
|
||||||
|
const isPhoenumberValid = this.isPhoneNumberValid(adminData.phonenumber);
|
||||||
|
if (!isPhoenumberValid) throw new PhonenumberException(this.wrongPhoneNumberMessage);
|
||||||
|
|
||||||
|
const response = await this.repository.execute(adminData);
|
||||||
|
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
private isPhoneNumberValid(phonenumber: string) {
|
||||||
|
const regex = /\(?([0-9]{3})\)?([ .-]?)([0-9]{3})\2([0-9]{4})/;
|
||||||
|
return regex.test(phonenumber);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
export default abstract class AdminUser {
|
||||||
|
abstract phonenumber: string;
|
||||||
|
|
||||||
|
abstract accessToken: string;
|
||||||
|
|
||||||
|
abstract refreshToken: string;
|
||||||
|
|
||||||
|
abstract expiresIn: number;
|
||||||
|
|
||||||
|
abstract refreshExpiresIn: number;
|
||||||
|
|
||||||
|
abstract tokenType: 'Bearer';
|
||||||
|
}
|
@ -20,7 +20,7 @@ export default function OtpCodeView(props: IOtpCodeView) {
|
|||||||
tabIndex={i + 1}
|
tabIndex={i + 1}
|
||||||
ref={(el: HTMLInputElement) => (otpChar.current[i] = el)}
|
ref={(el: HTMLInputElement) => (otpChar.current[i] = el)}
|
||||||
key={`otp_char_${i}`}
|
key={`otp_char_${i}`}
|
||||||
className='font-bold inline-block w-5 bg-transparent text-center focus:outline-none'
|
className='font-bold text-base inline-block w-5 md:w-10 bg-transparent text-center focus:outline-none'
|
||||||
maxLength={1}
|
maxLength={1}
|
||||||
defaultValue='_'
|
defaultValue='_'
|
||||||
placeholder='_'
|
placeholder='_'
|
||||||
|
Loading…
x
Reference in New Issue
Block a user