- Base language : Typescript
- Framework : Nestjs
- Server : apollo
- ORM : typeorm
- DB : postgreSQL
- bcrypt : 비밀번호 해쉬 패키지
- joi : 환경 변수 검증을 위해 사용
- jsonwebtoken : jwt 생성 및 인증을 위해 사용
- class-transformer : 엔티티 유효성 검증
- class-validator : 엔티티 유효성 검증
- cross-env : 환경 변수 관리
npm i
cp .env.sample .env.dev
// env.sample
DB_HOST=localhost
DB_PORT=5432
DB_USERNAME=
DB_PASSWORD=
DB_NAME=
SECRET_KEY=
- 패키지 설치 후, cp 명령어로 env 파일 복사
- 먼저 postgreSQL DB를 생성하셔야 합니다.
DB_NAME
은 생성한 DB 이름,DB_USERNAME
은 관리자 이름,DB_PASSWORD
은 임의로 설정한 비밀번호입니다. 비밀번호는localhost
에서 실행할 경우, 아무 값이나 넣으셔도 무방합니다.- 현재 편의를 위해 임시 키 값을 넣어놨으므로,
.env.dev
에DB_NAME
DB_USERNAME
DB_PASSWORD
값만 넣어주면 됩니다. - 아래 명령어로 오류 없이 앱이 실행된다면 테이블은 자동으로 생성됩니다. (
User
테이블과Child
테이블)
npm run start:dev
- 접속 하신 로컬의 뒤에
/graphql
을 붙이면 플레이그라운드로 접속 가능합니다. - 플레이그라운드에서 쿼리와 뮤테이션 명세 확인 및 api 테스트가 가능합니다. 예시 :
https://hocalhost:3000/graphql
createAccountOfParent
createAccountOfSitter
login
뮤테이션 외에는token
이 필요하므로, 플레이그라운드 하단의HTTP HEADERS
에 로그인 실행 후 받아온 token 값을 넣어주어야 합니다. 토큰의 키값은 반드시jwt
여야만 합니다.- 예시
Child
테이블과OneToMany
관계
Name | Type | required | Constraint | Description |
---|---|---|---|---|
id | number | yes | Primary key | |
created_at | Date | yes | Not Null | |
updated_at | Date | yes | Not Null | |
member_number | number | yes | Unique, Not Null | 회원번호 자동생성 |
name | string | yes | Not Null | 회원 이름 |
birthday | Date | yes | Not Null | 생년원일 |
gender | enum | yes | Not Null | 성별 |
account_id | number | yes | Unique, Not Null | 회원가입 아이디 |
password | string | yes | Not Null | 비밀번호 |
string | yes | Not Null | 이메일 | |
roles | enum | yes | Not Null | 회원 역할 |
parent_description | string | 부모 역할만 생성가능 | ||
sitter_description | string | 시터 역할만 생성 가능 | ||
care_range | enum | 시터 역할만 생성 가능 |
User
테이블과ManyToOne
관계
Name | Type | required | Constraint | Description |
---|---|---|---|---|
id | number | yes | Primary key | |
created_at | Date | yes | Not Null | |
updated_at | Date | yes | Not Null | |
birthday | Date | yes | Not Null | 생년월일 |
gender | enum | yes | Not Null | 성별 |
parentId | number | yes | Not Null | User 와 릴레이션 |
me
- 리턴 타입 : 유저 엔티티의 모든 필드
- 로그인한 누구나 쿼리 요청 가능
userProfile
- 인풋 타입 : 유저 Id
- 리턴 타입 : 유저 엔티티의 필드와 성공 여부를 가진 객체
- 로그인한 누구나 쿼리 가능
createAccountOfParent
- 인풋 타입 :
User
엔티티의 필수 필드와child
엔티티 필드, 추가로 부모 역할을 위한parentDescription
필드 - 리턴 타입 : 성공 여부 객체
- 권한 검사 없이 뮤테이션 요청 가능
createAccountOfSitter
- 인풋 타입 :
User
엔티티의 필수 필드와 시터 역할을 위한careRange
와parentDescription
필드 - 리턴 타입 : 성공 여부 객체
- 권한 검사 없이 뮤테이션 요청 가능
login
- 인풋 타입 :
accountId
와password
- 리턴 타입 : 성공 여부 객체와
jwt
토큰 반환 - 권한 검사 없이 뮤테이션 요청 가능
updateProfile
- 인풋 타입 : 업데이트를 원하는 유저 객체의 필드,
http header
에 jwt 토큰 넣어주어야 함 - 리턴 타입 : 성공 여부 객체
jwt
토큰 기반 로그인된 유저는 누구나 요청 가능
changePassword
- 인풋 타입 : 변경할 패스워드,
http header
에 jwt 토큰 넣어주어야 함 - 리턴 타입 : 성공 여부 객체
- 비고 : 비밀번호는 생성과 업데이트 전에 비밀번호 정책 검사 후, 해쉬 함수를 적용
jwt
토큰 기반 로그인된 유저는 누구나 요청 가능
addParentRole
- 인풋 타입 : 부모 역할로서의 요청사항,
Child
엔티티 필드 - 리턴 타입 : 성공 여부 객체
- 비고 : 내부에서 실제
roles
필드에 들어있는 값을 확인해서 이미 모든 역할을 가지고 있다면 요청을 취소함 jwt
토큰 기반 로그인된 유저 중 오직Sitter
역할만 요청 가능
addSitterRole
- 인풋 타입 : 시터 역할로서의 자기 소개 및 케어 가능 범위
- 리턴 타입 : 성공 여부 객체
- 비고 : 내부에서 실제
roles
필드에 들어있는 값을 확인해서 이미 모든 역할을 가지고 있다면 요청을 취소함 jwt
토큰 기반 로그인된 유저 중 오직Parent
역할만 요청 가능
updateChildInfo
- 인풋 타입 : 변경하고자 하는
Child
엔티티 필드 - 리턴 타입 : 성공 여부 객체
- 비고 : 부모는 여러 아이를 가질 수 있지만, 현재 모든 아이의 정보를 한번에 변경하지 못함
jwt
토큰 기반 로그인된 유저 중 오직Parent
역할을 가지고 있는 유저만 요청 가능
User
엔티티와Child
엔티티의 릴레이션이 매끄럽지 못하여,User
엔티티를 통한Child
엔티티의 생성과 수정에 리팩토링이 필요함- 에러 처리는
error
객체를 반환하기 보다, 제어할 수 있는 부분은text
메시지로 처리하고자 했음