BE_2차_5일차_12.02

송철진·2022년 12월 2일
0

2nd Project

목록 보기
1/4

데일리 스탠드업 미팅

TIL


인증서버가 전해준 유저정보ID가 users테이블의 social_id컬럼에 저장될 것!
jwt생성 ( 페이로드{ sub : social_id }, 시크릿키 ) => accessToken

ex) 클: 상품 정보 등록 요청
클라이언트가 accessToken과 상품정보를 전달하면
서버는 routes레이어 - accessToken을 검증하는 미들웨어 필요!

상점 정보 조회 시,
-> accessToken으로 불러온 users.id와 req.params = :userId 가
일치하면 res.body = { isMyShop : true }
불일치하면 res.body = { isMyShop : false }


스펠링 수정 요청: contenets -> contents
ALTER TABLE reviews CHANGE contenets contents varchar(500) DEFAULT NULL;

상점 정보 불러올 때 필요한 것:

  • path파라미터로 해당상점(userId)에 접속하면
  • 조건(userId)이 일치하는 정보를 모두 get해오고
    • users.id, users.nickname, users.user_image, users.created_at(...으로 오픈일 계산?)
    • AVG(reviews.rating), COUNT(reviews.id)
    • COUNT(p.id)
    • COUNT(select * FROM (users, products, orders, order_status)을 조인 WHERE order_status_id.name="판매완료")
    • SELECT COUNT(*) FROM users u INNER JOIN likes l ON u.id = l.user_id WHERE u.id = ?
    • 팔로워 수: SELECT COUNT(*) FROM follow WHERE followee = ?
    • 팔로잉 수: SELECT COUNT(*) FROM follow WHERE follower = ?
  • Token으로 불러온 req.user.Id와 req.user.nickname : 리뷰쓰는 사람의 정보
  • userId와 req.user.Id의 일치 여부 true, false

이번주 구현한 API 정리

상품 정보 UPDATE

깃 PR: https://github.com/wecode-bootcamp-korea/39-2nd-VVolt-Market-backend/pull/4

  • API 호출 시 필요한 값들에 대한 유효성 검사
  • 글로벌 에러핸들링 적용
  • 본래 accessToken을 받으면 토큰 검증 미들웨어로 로그인한 사용자의 userId를 불러오는 과정이 필요하지만, 해당 부분을 주석처리하고 임의의 userId = 1로 테스트를 진행.
  • AWS S3 및 유닛테스트는 미적용

상품 정보 POST

깃 PR: https://github.com/wecode-bootcamp-korea/39-2nd-VVolt-Market-backend/pull/5

  • API 호출 시 필요한 값들에 대한 유효성 검사
  • routes에서 controller 모듈의 메소드 호출
  • controllers에서 req.body로 받은 값들에 대한 유효성 검사, service 모듈의 메소드 호출, 호출 성공 시 응답
  • services에서 dao 모듈의 메소드 호출
  • models에서 products테이블에 insert 후 id 를 받아 product_images테이블에 이미지url을 insert
  • 본래 토큰 검증 미들웨어를 거치는 과정이 필요하지만 해당 부분을 주석 처리하고 임시로 userId = 1을 설정하여 테스트를 진행
  • 유닛테스트와 AWS S3는 미적용

유저 정보 UPDATE

깃 PR: https://github.com/wecode-bootcamp-korea/39-2nd-VVolt-Market-backend/pull/6

  • API 호출 시 필요한 값들에 대한 유효성 검사
    • 유저정보를 일괄 수정하는 방식이 아니라, 한 종류의 데이터마다 API를 호출 : 어떤 데이터도 들어오지 않았을 때만 KEY_ERROR 처리
    • 유저 소개글(description)은 빈문자열("")로 설정할 수 있어야 하므로, undefined일 때 KEY_ERROR 처리
  • service 에서
    • 유저 닉네임 중복 시 중복 에러 반환
    • 수정할 유저 정보를 Bulk update하는 함수 선언
      • 유저 정보가 string type일 때 따옴표('')로 wrapping .... ex) SET address = "주소", latitude = 34.111, longitude = 127.111
  • 본래 토큰 검증 미들웨어를 통과하면 userId를 받아야 하나, 해당 부분을 주석처리하고 임의의 userId=1을 설정 후 테스트 진행
  • 유닛테스트 및 AWS S3 미구현

유저 정보 GET

깃 PR: https://github.com/wecode-bootcamp-korea/39-2nd-VVolt-Market-backend/pull/7

  • path 파라미터로 상점id( userId )를 넣어 GET 요청을 받으면
  • controller에서
    • accessToken으로 불러온 로그인 사용자id와 상점id( userId )를 비교해 일치하면 true, 불일치하면 false를 res.body로 반환
      • 로그인 사용자가 본인 상점 페이지 접속 시 찜 리스트 보기와 개인정보 수정 권한이 있는 페이지로 이동하기 위함
    • accessToken으로 불러온 로그인 사용자의 userId, 상점명, 프로필사진을 res.body로 반환
      • 로그인 사용자가 상점 리뷰를 작성하기 위함
  • service에서
    '상점오픈일 n일전'으로 표시되어야 하나, 정보 표현의 확장성을 고려해 D+Day 함수를 만들지 않고, FrontEnd에서 수정하도록 날짜 데이터( created_at )를 그대로 전달
  • 본래 토큰 검증 미들웨어를 거쳐 로그인한 사용자의 req.user 정보를 불러오는 과정이 필요하나, 해당 부분이 구현되지 않아 주석처리하고 임의의 유저 정보(user)를 하드코딩하여 테스트를 진행
  • 유닛테스트 및 AWS S3 미구현

어려운 점 : join을 사용해서 1번의 select, 1번의 WHERE문으로 구현해보려고 했으나 마땅한 방법이 떠오르지 않아 조금 무식하게 서브쿼리를 연달아 작성해서 구현했다. 답은 나왔는데 이렇게 해도 괜찮은 건지 싶다.

  • o.order_status_id = 2는 table에 id=2, name='판매완료' 일 때만 사용가능하므로 DB에 넣을 데이터를 통일할 때 주의할 부분!
        SELECT
            u.id as sellerId,
            u.nickname as sellerName,
            u.user_image as sellerImg,
            u.description as sellerIntro,
            u.created_at as sellerOpenDay,
            (SELECT AVG(r.rating)       
            FROM products p 
            INNER JOIN reviews r ON p.id = r.product_id
            WHERE p.user_id = ?) as starAVG,
            (SELECT COUNT(r.id)            
            FROM products p 
            INNER JOIN reviews r ON p.id = r.product_id
            WHERE p.user_id = ?) as reviewNum,
            (SELECT COUNT(*)            
            FROM users u 
            INNER JOIN products p ON u.id = p.user_id
            WHERE u.id = ?) as onSaleNum,
            (SELECT COUNT(*)            
            FROM users u 
            INNER JOIN products p ON u.id = p.user_id
            INNER JOIN orders o ON o.product_id = p.id
            WHERE u.id = ? AND o.order_status_id = 2) as soldOutNum,
            (SELECT COUNT(*)            
            FROM users u 
            INNER JOIN likes l ON l.user_id = u.id
            WHERE u.id = ?) as likeNum,
            (SELECT COUNT(*)            
            from follow 
            WHERE follower = ?) as followingNum,
            (SELECT COUNT(*)            
            from follow 
            WHERE followee = ?) as followNum         
        FROM users u
        WHERE u.id = ?;
        `
        ,[ userId, userId, userId, userId, userId, userId, userId, userId, ]

profile
검색하고 기록하며 학습하는 백엔드 개발자

0개의 댓글