Skip to content

Commit

Permalink
errorRepository 제거하고 entity 로 이동
Browse files Browse the repository at this point in the history
  • Loading branch information
woohm402 committed May 17, 2024
1 parent 05db1c7 commit beae7d6
Show file tree
Hide file tree
Showing 10 changed files with 92 additions and 113 deletions.
2 changes: 1 addition & 1 deletion apps/snutt-webclient/e2e/mypage/change-password.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ test('비밀번호 변경 기능이 정상 동작한다 (기존 비밀번호 틀
),
page.getByTestId('mypage-change-password-submit').click(),
]);
await expect(page.getByTestId(testIds['오류 메세지'])).toHaveText('에러가 발생했습니다');
await expect(page.getByTestId(testIds['오류 메세지'])).toHaveText('오류가 발생했습니다');
});

test('비밀번호 변경 기능이 정상 동작한다 (정상 케이스)', async ({ page }) => {
Expand Down
7 changes: 2 additions & 5 deletions apps/snutt-webclient/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ import { implColorSnuttApiRepository } from '@/infrastructures/implColorSnuttApi
import { ErrorPage } from '@/pages/error';
import { Main } from '@/pages/main';
import { MyPage } from '@/pages/mypage';
import { getErrorRepository } from '@/repositories/errorRepository';
import { getFeedbackRepository } from '@/repositories/feedbackRepository';
import { getNotificationRepository } from '@/repositories/notificationRepository';
import { getSearchRepository } from '@/repositories/searchRepository';
Expand Down Expand Up @@ -54,7 +53,6 @@ export const App = () => {
const ENV = useGuardContext(envContext);

const errorService = getErrorService({
repositories: [getErrorRepository()],
errorCaptureClient: getTruffleClient({
enabled: ENV.NODE_ENV === 'production' && ENV.APP_ENV !== 'test',
app: { name: 'snutt-webclient-v2', phase: ENV.APP_ENV },
Expand Down Expand Up @@ -169,11 +167,10 @@ const getUnauthorizedServices = (ENV: { API_BASE_URL: string; API_KEY: string })
headers: { 'x-access-apikey': ENV.API_KEY },
});

const errorRepository = getErrorRepository();
const authRepository = implAuthSnuttApiRepository({ snuttApi: getSnuttApi(ENV) });
const feedbackRepository = getFeedbackRepository({ httpClient });
const userRepository = getUserRepository({ httpClient });
const authService = getAuthService({ authRepository, userRepository, errorRepository });
const authService = getAuthService({ authRepository, userRepository });
const feedbackService = getFeedbackService({ repositories: [feedbackRepository] });

return { authService, feedbackService };
Expand Down Expand Up @@ -212,7 +209,7 @@ const getAuthorizedServices = (
const timeMaskService = getTimeMaskService();
const hourMinuteService = getHourMinuteService();
const hourMinutePickerService = getHourMinutePickerService({ services: [hourMinuteService] });
const authService = getAuthService({ authRepository, userRepository, errorRepository: getErrorRepository() });
const authService = getAuthService({ authRepository, userRepository });
const semesterService = getSemesterService({ repositories: [semesterRepository] });

return {
Expand Down
71 changes: 71 additions & 0 deletions apps/snutt-webclient/src/entities/error.ts
Original file line number Diff line number Diff line change
@@ -1 +1,72 @@
export type CoreServerError = { errcode: number; message: string; ext: unknown };

export type ErrorTable = Record<number, string>;

const errors = [
{ code: 0, message: '서버 측의 오류입니다.' },
{ code: 4097, message: 'FB ID 혹은 FB TOKEN이 주어지지 않았습니다.' },
{ code: 4098, message: '연도 혹은 학기가 주어지지 않았습니다.' },
{
code: 4099,
message: '연도, 학기, 혹은 Timetable 이름이 주어지지 않았습니다.',
},
{ code: 4100, message: '강의 객체가 주어지지 않았습니다.' },
{ code: 4101, message: '강의 객체에 id 속성이 없습니다.' },
{
code: 4102,
message: 'Course number 혹은 lecture number는 수정할 수 없습니다.',
},
{ code: 4103, message: 'Timetable 이름이 주어지지 않았습니다.' },
{ code: 4104, message: 'Registration ID가 주어지지 않았습니다.' },
{ code: 4105, message: 'Timemask가 json과 맞지 않거나 올바르지 않습니다.' },
{
code: 4106,
message: 'Color 문자열이 올바른 hex 색상이 아닙니다. 올바른 색상 "#FFFFFF"',
},
{ code: 4107, message: '강의명을 입력해주세요' },
{ code: 8192, message: 'APIkey가 올바르지 않습니다.' },
{
code: 8193,
message: '로그인이 필요하지만 user token이 주어지지 않았습니다.',
},
{ code: 8194, message: '잘못된 user token입니다.' },
{ code: 8195, message: 'Admin 권한이 없습니다.' },
{ code: 8196, message: '찾을 수 없는 ID입니다.' },
{ code: 8197, message: '잘못된 password입니다.' },
{ code: 8198, message: '잘못된 페이스북 token입니다.' },
{ code: 8199, message: '(deprecated) 알 수 없는 app입니다.' },
{ code: 8201, message: '비밀번호 재설정을 다시 시도해주세요.' },
{ code: 8208, message: '만료된 인증코드입니다.' },
{ code: 8209, message: '잘못된 인증코드입니다.' },
{ code: 12288, message: '조건에 맞지 않는 ID입니다. (api 설명 참조)' },
{ code: 12289, message: '조건에 맞지 않는 password입니다. (api 설명 참조)' },
{ code: 12290, message: '이미 해당 ID가 존재합니다.' },
{ code: 12291, message: '이미 해당 이름의 타임테이블이 존재합니다.' },
{
code: 12292,
message: '이미 해당 course number와 lecture number의 강의가 존재합니다.',
},
{ code: 12293, message: '이미 ID와 password가 등록되어 있습니다.' },
{ code: 12294, message: '이미 연결된 페이스북 계정이 있습니다.' },
{ code: 12295, message: '등록된 ID와 password가 없습니다.' },
{ code: 12296, message: '연결된 페이스북 계정이 없습니다.' },
{ code: 12297, message: '이 FB ID는 다른 계정에 연결되어 있습니다.' },
{ code: 12298, message: '강의와 timetable의 학기가 맞지 않습니다.' },
{ code: 12299, message: '강의가 custom lecture가 아닙니다.' },
{ code: 12300, message: '강의 시간이 서로 겹칩니다.' },
{ code: 12301, message: '강의가 custom lecture입니다.' },
{ code: 12302, message: '유저에게 등록된 fcm key가 없습니다.' },
{ code: 12303, message: '올바른 이메일을 입력해주세요.' },
{ code: 16384, message: 'Tag를 찾을 수 없습니다.' },
{ code: 16385, message: 'Timetable을 찾을 수 없습니다.' },
{ code: 16386, message: 'Lecture를 찾을 수 없습니다.' },
{ code: 16387, message: '편람 상의 lecture를 찾을 수 없습니다.' },
{ code: 16388, message: '유저를 찾을 수 없습니다' },
{ code: 16389, message: '서버에서 색깔 테마를 찾을 수 없습니다' },
{ code: 16390, message: '등록된 이메일이 없습니다' },
];

export const getErrorMessage = ({ errcode }: { errcode: number }): string => {
const matchingError = errors.find((e) => e.code === errcode);
return matchingError ? matchingError.message : '오류가 발생했습니다';
};
9 changes: 4 additions & 5 deletions apps/snutt-webclient/src/pages/mypage/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import { Layout } from '@/components/layout';
import { envContext } from '@/contexts/EnvContext';
import { serviceContext } from '@/contexts/ServiceContext';
import { useTokenManageContext } from '@/contexts/TokenManageContext';
import type { CoreServerError } from '@/entities/error';
import { type CoreServerError, getErrorMessage } from '@/entities/error';
import { useGuardContext } from '@/hooks/useGuardContext';
import { queryKey } from '@/utils/query-key-factory';

Expand Down Expand Up @@ -123,27 +123,26 @@ const useMyInfo = () => {

const useAttachFacebook = () => {
const { saveToken } = useTokenManageContext();
const { errorService } = useGuardContext(serviceContext);
const { userService } = useGuardContext(serviceContext);

return useMutation({
mutationFn: (userInfo: ReactFacebookLoginInfo) => {
return userService.attachFacebookAccount({ fb_id: userInfo.id, fb_token: userInfo.accessToken });
},
onSuccess: ({ token }) => saveToken(token, false),
onError: (error) => alert(errorService.getErrorMessage((error as unknown as CoreServerError).errcode)),
onError: (error) => alert(getErrorMessage(error as unknown as CoreServerError)),
});
};

const useDetachFacebook = () => {
const { saveToken } = useTokenManageContext();
const { errorService } = useGuardContext(serviceContext);

const { userService } = useGuardContext(serviceContext);

return useMutation({
mutationFn: () => userService.detachFacebookAccount(),
onSuccess: ({ token }) => saveToken(token, false),
onError: (error) => alert(errorService.getErrorMessage((error as unknown as CoreServerError).errcode)),
onError: (error) => alert(getErrorMessage(error as unknown as CoreServerError)),
});
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { Button } from '@/components/button';
import { ErrorDialog } from '@/components/error-dialog';
import { serviceContext } from '@/contexts/ServiceContext';
import { useTokenManageContext } from '@/contexts/TokenManageContext';
import { getErrorMessage } from '@/entities/error';
import { useErrorDialog } from '@/hooks/useErrorDialog';
import { useGuardContext } from '@/hooks/useGuardContext';
import { get } from '@/utils/object/get';
Expand All @@ -15,7 +16,7 @@ export const MypageChangePassword = () => {
const [newPassword, setNewPassword] = useState('');
const [newPasswordConfirm, setNewPasswordConfirm] = useState('');
const { saveToken } = useTokenManageContext();
const { authService, errorService } = useGuardContext(serviceContext);
const { authService } = useGuardContext(serviceContext);

const { isOpen, message, onClose, open } = useErrorDialog();

Expand All @@ -42,7 +43,7 @@ export const MypageChangePassword = () => {
setNewPasswordConfirm('');
saveToken(token, false);
},
onError: (err) => open(errorService.getErrorMessage(get(err, ['errcode']) as number)),
onError: (err) => open(getErrorMessage({ errcode: get(err, ['errcode']) as number })),
},
);
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { Button } from '@/components/button';
import { ErrorDialog } from '@/components/error-dialog';
import { serviceContext } from '@/contexts/ServiceContext';
import { useTokenManageContext } from '@/contexts/TokenManageContext';
import { getErrorMessage } from '@/entities/error';
import { useErrorDialog } from '@/hooks/useErrorDialog';
import { useGuardContext } from '@/hooks/useGuardContext';
import { get } from '@/utils/object/get';
Expand All @@ -14,7 +15,7 @@ export const MypageRegisterId = () => {
const [id, setId] = useState('');
const [password, setPassword] = useState('');
const [passwordConfirm, setPasswordConfirm] = useState('');
const { authService, errorService } = useGuardContext(serviceContext);
const { authService } = useGuardContext(serviceContext);

const { isOpen, message, onClose, open } = useErrorDialog();

Expand All @@ -31,7 +32,7 @@ export const MypageRegisterId = () => {
return;
}

mutate({ id, password }, { onError: (err) => open(errorService.getErrorMessage(get(err, ['errcode']) as number)) });
mutate({ id, password }, { onError: (err) => open(getErrorMessage({ errcode: get(err, ['errcode']) as number })) });
};

return (
Expand Down
14 changes: 0 additions & 14 deletions apps/snutt-webclient/src/repositories/errorRepository.ts

This file was deleted.

15 changes: 7 additions & 8 deletions apps/snutt-webclient/src/usecases/authService.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { getErrorMessage } from '@/entities/error';
import { type ApiResponse, type UsecaseResponse } from '@/entities/response';
import { type ErrorRepository } from '@/repositories/errorRepository';
import { type UserRepository } from '@/repositories/userRepository';

export interface AuthService {
Expand Down Expand Up @@ -29,9 +29,8 @@ type Deps = {
resetPassword(body: { user_id: string; password: string }): ApiResponse<{ message: 'ok' }>;
};
userRepository: UserRepository;
errorRepository: ErrorRepository;
};
export const getAuthService = ({ authRepository, userRepository, errorRepository }: Deps): AuthService => {
export const getAuthService = ({ authRepository, userRepository }: Deps): AuthService => {
return {
isValidPassword: (password) =>
password.split('').some((item) => /[0-9]+/.test(item)) &&
Expand All @@ -45,23 +44,23 @@ export const getAuthService = ({ authRepository, userRepository, errorRepository
: authRepository.signInWithFacebook({ fb_id: params.fb_id, fb_token: params.fb_token }));

if (data.type === 'success') return { type: 'success', data: data.data };
else return { type: 'error', message: errorRepository.getErrorMessage(data) };
else return { type: 'error', message: getErrorMessage(data) };
},
signUp: async (params) => {
const data = await authRepository.signUpWithIdPassword(params);
if (data.type === 'success') return { type: 'success', data: data.data };
else return { type: 'error', message: errorRepository.getErrorMessage(data) };
else return { type: 'error', message: getErrorMessage(data) };
},
closeAccount: () => userRepository.deleteUser(),
findIdByEmail: async (body) => {
const data = await authRepository.findId(body);
if (data.type === 'success') return { type: 'success' };
else return { type: 'error', message: errorRepository.getErrorMessage(data) };
else return { type: 'error', message: getErrorMessage(data) };
},
passwordResetCheckEmail: async (body) => {
const data = await authRepository.passwordResetCheckEmail(body);
if (data.type === 'success') return { type: 'success', data: data.data };
else return { type: 'error', message: errorRepository.getErrorMessage(data) };
else return { type: 'error', message: getErrorMessage(data) };
},
sendPasswordResetVerificationEmail: async (body) => {
const data = await authRepository.sendPasswordResetVerificationEmail(body);
Expand All @@ -71,7 +70,7 @@ export const getAuthService = ({ authRepository, userRepository, errorRepository
verifyPasswordResetCode: async (body) => {
const data = await authRepository.verifyPasswordResetCode(body);
if (data.type === 'success') return { type: 'success' };
else return { type: 'error', message: errorRepository.getErrorMessage(data) };
else return { type: 'error', message: getErrorMessage(data) };
},
resetPassword: async (body) => {
const data = await authRepository.resetPassword(body);
Expand Down
12 changes: 1 addition & 11 deletions apps/snutt-webclient/src/usecases/errorService.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,9 @@
import type { ErrorRepository } from '@/repositories/errorRepository';

export interface ErrorService {
getErrorMessage: (errorCode: number, useDefaultMessage?: boolean) => string;
captureError: (error: Error) => void;
}

export const getErrorService = (args: {
repositories: [ErrorRepository];
errorCaptureClient: { capture: (message: Error) => void };
}): ErrorService => {
const [errorRepo] = args.repositories;

export const getErrorService = (args: { errorCaptureClient: { capture: (message: Error) => void } }): ErrorService => {
return {
getErrorMessage: (errorCode: number, useDefaultMessage = true) =>
errorRepo.getErrorMessage({ errcode: errorCode, useDefaultMessage }),
captureError: (error: Error) => args.errorCaptureClient.capture(error),
};
};
65 changes: 0 additions & 65 deletions apps/snutt-webclient/src/utils/errorTable.ts

This file was deleted.

0 comments on commit beae7d6

Please sign in to comment.