309 lines
9.1 KiB
TypeScript
309 lines
9.1 KiB
TypeScript
import { z } from "zod";
|
|
import type { PageableList, PageableParams } from "@/shared/model";
|
|
|
|
// 사용자 검색 파라미터
|
|
export interface UserSearchParams extends PageableParams {
|
|
keywordType?: string;
|
|
keyword?: string;
|
|
userStateCode?: string;
|
|
aprvYn?: string;
|
|
grpId?: string;
|
|
frDateYmd?: string;
|
|
toDateYmd?: string;
|
|
}
|
|
|
|
// 사용자 목록 응답 인터페이스
|
|
export interface UserListResponse {
|
|
userId: string;
|
|
userName: string;
|
|
email: string;
|
|
roleId: string;
|
|
roleName: string;
|
|
userStateCode: string;
|
|
userStateCodeName: string;
|
|
lastLoginDate: string;
|
|
loginFailCount: number;
|
|
userUnqId: string;
|
|
mphn: string;
|
|
telno: string;
|
|
aprvYn: string;
|
|
regDt: string;
|
|
laeSeCd: string;
|
|
laeSeNm: string;
|
|
ogdpSeCd: string;
|
|
ogdpSeNm: string;
|
|
instSeCd: string;
|
|
instSeNm: string;
|
|
aprvYmd: string;
|
|
}
|
|
|
|
// 사용자 상세 응답 인터페이스
|
|
export interface UserDetailResponse {
|
|
regDt: string;
|
|
mdfcnDt: string;
|
|
rgtr: string;
|
|
mdfr: string;
|
|
userUnqId: string;
|
|
userId: string;
|
|
userName: string;
|
|
email: string;
|
|
encryptedPassword: string;
|
|
refreshToken: string;
|
|
userStateCode: string;
|
|
lastLoginDate: string;
|
|
loginFailCount: number;
|
|
pswdHnt: string;
|
|
pswdAns: string;
|
|
mphn: string;
|
|
telno: string;
|
|
zip: string;
|
|
addr: string;
|
|
daddr: string;
|
|
laeSeCd: string;
|
|
ogdpSeCd: string;
|
|
aprvYn: string;
|
|
autzrId: string;
|
|
expryYmd: string;
|
|
lastPswdChgDt: string;
|
|
googleId: string;
|
|
kakaoId: string;
|
|
naverId: string;
|
|
isSocialUser: boolean;
|
|
hasPassword: boolean;
|
|
twoFactorEnabled: boolean;
|
|
adminRoleYn: string;
|
|
instSeCd: string;
|
|
aprvYmd: string;
|
|
enoCd: string;
|
|
laeSeNm: string;
|
|
ogdpSeNm: string;
|
|
instSeNm: string;
|
|
userStateNm: string;
|
|
pswdHntNm: string;
|
|
ecoNm: string;
|
|
}
|
|
|
|
// 사용자 상태 통계 응답 인터페이스
|
|
export interface UserSttsStatsResponse {
|
|
sttsCd: string;
|
|
sttsNm: string;
|
|
cnt: number;
|
|
}
|
|
|
|
// 사용자 수정 요청 스키마
|
|
export const userUpdateSchema = z.object({
|
|
userId: z.string().optional(),
|
|
userName: z.string(),
|
|
email: z.string().email().optional(),
|
|
password: z
|
|
.string()
|
|
.regex(/((?=.*[0-9])(?=.*[a-zA-Z])(?=.*\W)(?=\S+$).{8,20})|()/)
|
|
.optional(),
|
|
roleId: z.string().optional(),
|
|
userStateCode: z.string(),
|
|
pswdHnt: z.string().max(10),
|
|
pswdAns: z.string().max(100).optional(),
|
|
mphn: z.string().max(11).optional(),
|
|
telno: z.string().max(11).optional(),
|
|
zip: z.string().max(5).optional(),
|
|
addr: z.string().max(200).optional(),
|
|
daddr: z.string().max(200).optional(),
|
|
laeSeCd: z.string().max(10),
|
|
ogdpSeCd: z.string().max(10),
|
|
aprvYn: z.string(),
|
|
autzrId: z.string().uuid().optional(),
|
|
expryYmd: z.string().max(8),
|
|
instSeCd: z.string().optional(),
|
|
aprvYmd: z.string().max(8).optional(),
|
|
enoCd: z.string().optional(),
|
|
});
|
|
|
|
// 사용자 비밀번호 변경 스키마
|
|
export const userPasswordUpdateSchema = z.object({
|
|
password: z
|
|
.string()
|
|
.regex(/((?=.*[0-9])(?=.*[a-zA-Z])(?=.*\W)(?=\S+$).{8,20})|()/)
|
|
.optional()
|
|
.describe("기존 패스워드"),
|
|
provider: z.string().optional().describe("공급자(기본값:password)"),
|
|
token: z.string().optional(),
|
|
newPassword: z
|
|
.string()
|
|
.regex(/(?=.*[0-9])(?=.*[a-zA-Z])(?=.*\W)(?=\S+$).{8,20}/)
|
|
.describe("신규 패스워드"),
|
|
newPasswordConfirm: z
|
|
.string()
|
|
.regex(/(?=.*[0-9])(?=.*[a-zA-Z])(?=.*\W)(?=\S+$).{8,20}/)
|
|
.describe("신규 패스워드 확인"),
|
|
});
|
|
|
|
// 사용자 비밀번호 찾기 변경 스키마
|
|
export const userFindPasswordUpdateSchema = z.object({
|
|
tokenValue: z.string(),
|
|
password: z
|
|
.string()
|
|
.regex(/(?=.*[0-9])(?=.*[a-zA-Z])(?=.*\W)(?=\S+$).{8,20}/),
|
|
});
|
|
|
|
// 사용자 비밀번호 확인 스키마
|
|
export const userPasswordMatchSchema = z.object({
|
|
password: z
|
|
.string()
|
|
.regex(/(?=.*[0-9])(?=.*[a-zA-Z])(?=.*\W)(?=\S+$).{8,20}/),
|
|
});
|
|
|
|
// 사용자 회원정보 변경 스키마
|
|
export const userUpdateInfoSchema = z.object({
|
|
password: z
|
|
.string()
|
|
.regex(/((?=.*[0-9])(?=.*[a-zA-Z])(?=.*\W)(?=\S+$).{8,20})|()/)
|
|
.optional()
|
|
.describe("기존 패스워드"),
|
|
provider: z.string().optional().describe("공급자(기본값:password)"),
|
|
token: z.string().optional(),
|
|
userName: z.string(),
|
|
email: z.string().email().optional(),
|
|
});
|
|
|
|
// 사용자 저장 스키마
|
|
export const userSaveSchema = z.object({
|
|
userId: z.string().describe("사용자 ID"),
|
|
userName: z.string().describe("사용자명"),
|
|
email: z.string().email().optional().describe("이메일"),
|
|
password: z
|
|
.string()
|
|
.regex(/(?=.*[0-9])(?=.*[a-zA-Z])(?=.*\W)(?=\S+$).{8,20}/)
|
|
.describe("패스워드"),
|
|
pswdHnt: z.string().max(10).describe("비밀번호 힌트"),
|
|
pswdAns: z.string().max(100).optional().describe("비밀번호 답변"),
|
|
mphn: z.string().max(11).optional().describe("휴대폰 번호"),
|
|
telno: z.string().max(11).optional().describe("전화번호"),
|
|
zip: z.string().max(5).optional().describe("우편번호"),
|
|
addr: z.string().max(200).optional().describe("주소"),
|
|
daddr: z.string().max(200).optional().describe("상세 주소"),
|
|
laeSeCd: z.string().max(10).describe("법적 구분 코드"),
|
|
ogdpSeCd: z.string().max(10).describe("조직 구분 코드"),
|
|
expryYmd: z.string().max(8).describe("만료 일자(YYYYMMDD)"),
|
|
instSeCd: z.string().optional().describe("기관구분코드"),
|
|
enoCd: z.string().optional().describe("환경청코드"),
|
|
});
|
|
|
|
// 사용자 비밀번호 찾기 저장 스키마
|
|
export const userFindPasswordSaveSchema = z.object({
|
|
userName: z.string(),
|
|
emailAddr: z.string().email(),
|
|
mainUrl: z.string(),
|
|
changePasswordUrl: z.string(),
|
|
});
|
|
|
|
// 사용자 인증 요청 스키마
|
|
export const userVerifySchema = z.object({
|
|
password: z
|
|
.string()
|
|
.regex(/((?=.*[0-9])(?=.*[a-zA-Z])(?=.*\W)(?=\S+$).{8,20})|()/)
|
|
.optional()
|
|
.describe("기존 패스워드"),
|
|
provider: z.string().optional().describe("공급자(기본값:password)"),
|
|
token: z.string().optional(),
|
|
});
|
|
|
|
// 사용자 이메일 요청 스키마
|
|
export const userEmailSchema = z.object({
|
|
userId: z.string().optional(),
|
|
email: z.string().email(),
|
|
});
|
|
|
|
// 사용자 ID 요청 스키마
|
|
export const userIdSchema = z.object({
|
|
userId: z.string(),
|
|
});
|
|
|
|
// Zod 스키마 타입 정의
|
|
export type UserUpdateData = z.infer<typeof userUpdateSchema>;
|
|
export type UserPasswordUpdateData = z.infer<typeof userPasswordUpdateSchema>;
|
|
export type UserFindPasswordUpdateData = z.infer<
|
|
typeof userFindPasswordUpdateSchema
|
|
>;
|
|
export type UserPasswordMatchData = z.infer<typeof userPasswordMatchSchema>;
|
|
export type UserUpdateInfoData = z.infer<typeof userUpdateInfoSchema>;
|
|
export type UserSaveData = z.infer<typeof userSaveSchema>;
|
|
export type UserFindPasswordSaveData = z.infer<
|
|
typeof userFindPasswordSaveSchema
|
|
>;
|
|
export type UserVerifyData = z.infer<typeof userVerifySchema>;
|
|
export type UserEmailData = z.infer<typeof userEmailSchema>;
|
|
export type UserIdData = z.infer<typeof userIdSchema>;
|
|
|
|
// 페이지네이션 타입 정의
|
|
export type UserList = PageableList<UserListResponse>;
|
|
export type UserSttsStatsList = UserSttsStatsResponse[];
|
|
|
|
// 사용자 서비스 인터페이스
|
|
export interface UserService {
|
|
// 사용자 목록 조회
|
|
findPageUser: (params: UserSearchParams) => Promise<UserList>;
|
|
|
|
// 사용자 단건 조회
|
|
findByUserUnqId: (userUnqId: string) => Promise<UserDetailResponse>;
|
|
|
|
// 로그인한 사용자 정보 조회
|
|
findByUserUnqIdByLogin: () => Promise<UserDetailResponse>;
|
|
|
|
// 사용자 회원상태 통계 조회
|
|
selectUserSttsStats: () => Promise<UserSttsStatsList>;
|
|
|
|
// 사용자 저장
|
|
saveUser: (data: UserSaveData) => Promise<string>;
|
|
|
|
// 사용자 수정
|
|
updateUser: (userUnqId: string, data: UserUpdateData) => Promise<string>;
|
|
|
|
// 사용자 삭제
|
|
deleteUser: (userUnqId: string) => Promise<boolean>;
|
|
|
|
// 사용자 계정잠금 처리
|
|
lockUser: (userUnqId: string) => Promise<boolean>;
|
|
|
|
// 사용자 계정잠금 해제처리
|
|
unlockUser: (userUnqId: string) => Promise<boolean>;
|
|
|
|
// 리프레시 토큰 정보 재발급
|
|
refreshToken: () => Promise<void>;
|
|
|
|
// 사용자 비밀번호 변경
|
|
updatePassword: (data: UserPasswordUpdateData) => Promise<boolean>;
|
|
|
|
// 사용자 비밀번호 초기화(관리자용)
|
|
initializePassword: (
|
|
userUnqId: string,
|
|
data: UserPasswordUpdateData,
|
|
) => Promise<boolean>;
|
|
|
|
// 사용자 비밀번호 찾기 변경
|
|
changePassword: (data: UserFindPasswordUpdateData) => Promise<boolean>;
|
|
|
|
// 사용자 비밀번호 확인
|
|
matchPassword: (data: UserPasswordMatchData) => Promise<boolean>;
|
|
|
|
// 사용자 비밀번호 찾기
|
|
findPasswordUser: (data: UserFindPasswordSaveData) => Promise<boolean>;
|
|
|
|
// 사용자 비밀번호 찾기 유효성 확인
|
|
validPassword: (token: string) => Promise<boolean>;
|
|
|
|
// 사용자 회원정보 변경
|
|
updateInfo: (userUnqId: string, data: UserUpdateInfoData) => Promise<string>;
|
|
|
|
// 사용자 승인처리
|
|
applyUser: (userUnqId: string) => Promise<boolean>;
|
|
|
|
// 사용자 회원탈퇴
|
|
leaveUser: (data: UserVerifyData) => Promise<boolean>;
|
|
|
|
// 사용자 이메일 중복 체크
|
|
existsEmail: (data: UserEmailData) => Promise<boolean>;
|
|
|
|
// 사용자 아이디 중복 체크
|
|
existsUserId: (data: UserIdData) => Promise<boolean>;
|
|
}
|