반응형
치매센터 관리자, 지역별 담당자용 어플리케이션 만들기!
db모델링
데이터베이스 모델링은 이런식으로 했다.
- province_id가 null이면 대표관리자인걸 알수 있지만 is_admin 컬럼을 하나 더 추가했다. -> province_id가 없는걸로만 admin을 판단하면 담당자가 아직 지역 배정이 안됐을경우 admin권한을 가져버리는걸 막기위해!
- hospitals에는 전국치매센터표준데이터 이 데이터들이 들어가는데 주소데이터를 파싱해서 시/도(특별시 광역시나 도)별로 분류할 수 있도록 province_id를 넣어서 지역 테이블과 연결시켰다.
- 그리고 types에는 센터의 종류(데이터에서 '치매센터유형'에 해당하는것)를 넣었다.
내 기능
- 데이터를 조회해서 엑셀파일로 다운받을 수 있는 기능을 만들어야함
- 지역관리자는 소속지역의 데이터만 조회할 수 있고, 대표관리자는 모든 데이터 조회 가능이다.
📍 데이터조회
처음에 토큰에 넘어오는 id값으로 admin인지, 어디지역 관리자인지 알아내는 코드와 sql문을 작성하려고 했는데,
토큰에 is_admin과 province_id를 넣으면 id만 받아서 관리자인지, 어느지역 담당자인지 확인할 필요도 없고 토큰발급때만 user테이블에 조회가 들어가니까 데이터베이스 접근 횟수도 줄일 수 있어서 토큰에 id, is_admin, province_id를 담기로 했다.
엑셀 컬럼명이 원래 데이터 필드명이랑 같아야 한다는 조건이 있어서 영어로 넣어놓은 컬럼명을 다시 한국말로 볼수있게 바꿨다..
그리고 admin은 모든 데이터 조회가 가능하고 나머지는 본인 지역만 조회가 가능해서 admin일때, 아닐때를 나눠서 where절만 추가하는것으로 바꿨다.
// models/hospitalDao.js
const getHospitalData = async (provinceId) => {
let query = `SELECT
h.name AS 치매센터명,
t.name AS 치매센터유형,
h.street_address AS 소재지도로명주소,
h.address AS 소재지지번주소,
h.latitude AS 위도,
h.longitude AS 경도,
h.establishment AS 설립연월,
h.area AS 건축물면적,
h.facility AS 부대시설정보,
h.doctor AS 의사인원수,
h.nurse AS 간호사인원수,
h.social_worker AS 사회복지사인원수,
h.extra_people AS 기타인원현황,
h.operator AS 운영기관명,
h.representative AS 운영기관대표자명,
h.operator_contact AS 운영기관전화번호,
h.trust AS 운영위탁일자,
h.data AS 주요치매관리프로그램소개,
h.management_contact AS 관리기관전화번호,
h.management AS 관리기관명,
h.standard_date AS 데이터기준일자,
p.name AS 제공기관명
FROM hospitals AS h
JOIN types AS t ON t.id=h.type_id
JOIN provinces AS p ON p.id=h.province_id`;
if (provinceId) {
query += ` WHERE province_id = ${provinceId}`;
}
query += ";"
return await myDataSource.query(query);
};
예외처리
is_admin=0이고 province_id=null일경우는 빈 배열로 결과가 나와서 따로 예외처리를 할까말까 하다가
클라이언트입장에서 아무것도 없는데 200이 뜨면 뭐가 잘못됐는지 모르기때문에 예외처리를 해줬다.
그리고 admin인데 관리지역이 있을때도 예외처리를 해줬다.
// services/hospitalService.js
const getHospitalDataService = async (isAdmin, provinceId) => {
if (isAdmin && provinceId) {
throw new ErrorCreator("admin cannot have province_id", 400);
}
if (!isAdmin && !provinceId) {
throw new ErrorCreator("province_id not provided", 400);
}
return await hospitalDao.getHospitalData(provinceId);
};
반응형
'wecode' 카테고리의 다른 글
프리온보딩 | 2차과제 - 3: auth미들웨어, Swagger (0) | 2022.10.10 |
---|---|
프리온보딩 | 2차과제 - 2: 엑셀다운로드, 검색기능 (0) | 2022.10.09 |
프리온보딩 | 1차과제 - 3 (1) | 2022.10.06 |
프리온보딩 | 1차과제 - 2 (0) | 2022.10.06 |
프리온보딩 | 1차과제 - 1 (0) | 2022.10.05 |