{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":455791126,"defaultBranch":"develop","name":"backend","ownerLogin":"jiphyeonjeon-42","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2022-02-05T06:10:38.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/87406753?v=4","public":true,"private":false,"isOrgOwned":true},"refInfo":{"name":"","listCacheKey":"v0:1712546641.0","currentOid":""},"activityList":{"items":[{"before":"4d0ed15ea7d9bdb0d4d9649df7e9047ee5065460","after":"3a74c5152d9777745d23d84bfc0a326045927742","ref":"refs/heads/main","pushedAt":"2024-04-27T06:44:34.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"nyj001012","name":"yena","path":"/nyj001012","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/50291995?s=80&v=4"},"commit":{"message":"ci: 2024-04-28 배포 (#824)\n\n* ci: 타입오류 메시지 상대경로 명시적으로 해소 (#643)\r\n\r\n참고: https://github.com/actions/runner/issues/659\r\n\r\n* feat: v2 book api (#746)\r\n\r\n* refactor: v1 api와 다른 부분 수정\r\n\r\n* refactor: books API schema default sort value 추가 및 callSign 오타 수정\r\n\r\n* refactor: status: zod.enum -> zod.nativeEnum 변경\r\n\r\nz.enum으로 했을때 number 반환값에 대한 처리가 되지 않아 enumStatus 생성 후 nativeEnum으로 변경하였습니다.\r\n\r\n* feat: books//:id v2 구현\r\n\r\n* feat: books/search v2 구현\r\n\r\n* feat: book/update v2 구현\r\n\r\n* feat: books/info/:id v2 구현\r\n\r\n* refactor: BookNotFoundError import 오타 수정\r\n\r\n* feat: books/info/sorted v2 구현\r\n\r\n* feat: books/info/tag v2 구현\r\n\r\nbook_info.id 로 distinct가 되지 않는 오류가 있어요\r\n\r\n* refactor: 의미에 맞는 변수명으로 수정 및 코드 간략화\r\n\r\nCo-authored-by: scarf \r\n\r\n* refactor: book_info 중복 select 부분 처리\r\n\r\nCo-authored-by: scarf \r\n\r\n* feat: books/donator v2 구현\r\n\r\nv1 구현 시 얘기했었던 기부자가 유저가 아니더라도 수정될 수 있도록 수정 & email은 더이상 관리하지 않기 때문에 변수명에서 제거\r\n\r\n* refactor: 대출 가능 여부 boolean 반환값으로 수정\r\n\r\nkysely 사용중 select가 없을 경우 sql syntax 에러로 해당 부분 수정 및 boolean 값 반환되도록 수정\r\n\r\n* feat: [get] books/create v2 구현\r\n\r\naxios.get 동작 중 발생하는 에러(catch 영역)에 대한 처리를 어떻게 해야할지 모르겠어요\r\n\r\n* fix: 임시로 타입 오류 무시\r\n\r\n---------\r\n\r\nCo-authored-by: scarf \r\n\r\n* style: prettier 적용 (#761)\r\n\r\n* build: prettier 설정\r\n\r\n* style: prettier 적용\r\n\r\n---------\r\n\r\nCo-authored-by: nocontribute <>\r\n\r\n* [fix] backend dockerfile error (#764)\r\n\r\nCo-authored-by: kylee \r\n\r\n* fix: `positiveInt` -> `nonNegativeInt` (#766)\r\n\r\n* refactor: v2 라우트 정리 적용 (#771)\r\n\r\n* refactor: `/stock` 제거\r\n\r\nhttps://github.com/jiphyeonjeon-42/backend/discussions/767#discussioncomment-6986111\r\n\r\n* refactor: contracts에서 500번대 오류 제거\r\n\r\n백엔드에서 복구 불가능한 오류일 시 반환하기 때문에, 프론트엔드에서 따로 처리하는 것이 좋을 것 같습니다.\r\n\r\n* refactor: `/history` -> `/lendings`\r\n\r\nhttps://github.com/jiphyeonjeon-42/backend/discussions/767#discussioncomment-6986282\r\n\r\nCo-authored-by: jwoo <74581396+Jiwon-Woo@users.noreply.github.com>\r\n\r\n* refactor: `/users ` 정리\r\n\r\nhttps://github.com/jiphyeonjeon-42/backend/discussions/767#discussioncomment-6986194\r\n\r\nCo-authored-by: honeyl3ee \r\n\r\n* refactor: `/tag` 서비스 임시 제거\r\n\r\n고도화를 하기 위해서는 내부 구현을 바꾸어야 하는 문제가 있어 우선순위를 낮추었습니다.\r\n\r\n주석처리를 할까 고민했으나 제거 이전 커밋(15654412a5f9da964ad1f653d5650bdec8afd9fb)으로 체크아웃시 전체 코드를 확인 가능하기 때문에 복잡도 감소를 위해 코드를 제거하였습니다.\r\n\r\n* refactor: `/books` 경로 정리\r\n\r\nhttps://github.com/jiphyeonjeon-42/backend/discussions/767#discussioncomment-6986195\r\nhttps://github.com/jiphyeonjeon-42/backend/discussions/767#discussioncomment-6986483\r\n\r\nCo-authored-by: Jeong Jihwan <47599349+JeongJiHwan@users.noreply.github.com>\r\nCo-authored-by: jwoo <74581396+Jiwon-Woo@users.noreply.github.com>\r\n\r\n* feat: swagger에서 1줄 요약 표시\r\n\r\n---------\r\n\r\nCo-authored-by: jwoo <74581396+Jiwon-Woo@users.noreply.github.com>\r\nCo-authored-by: honeyl3ee \r\nCo-authored-by: Jeong Jihwan <47599349+JeongJiHwan@users.noreply.github.com>\r\n\r\n* feat: add mydata service\r\n\r\n토큰에서 id 정보 찾아서 유저 정보 반환하는 controller\r\n\r\n* feat: 유저 search 할 때 id 가 undefined 인 경우 핸들링\r\n\r\n* feat: add swagger && /me endpoint && apply authValidate\r\n\r\n* fix: searchUsersById 타입을 이전과 같이 리턴하도록 변경\r\n\r\nsearchUsersById 서비스 함수의 종속성이 생각보다 많음.controller 에서 items 의 length 를 확인하도록\r\n\r\n* fix: add librarian validate in search endpoint\r\n\r\n* feat: 로그인한 유저만 본인 정보를 찾을 수 있도록 middleware 에서 권한 체크\r\n\r\n* chore: console.log 제거\r\n\r\n* User API 경로 정리 (#777)\r\n\r\n* refactor: 400번대 에러 반환 제거\r\n\r\n* refactor: overDueDay 반환 값에서 제거\r\n\r\n* fix(cursus): Access-Control-Allow-Origin 설정 (#790)\r\n\r\n* chore: dependencies 업데이트 (#796)\r\n\r\n* chore(deps): contracts의 pnpm-lock 업데이트\r\n\r\n* chore(deps): @mapbox/npm-pre-gyp 설치\r\n\r\n* chore(deps): npm-pre-gyp 설치\r\n\r\n* Revert \"chore(deps): npm-pre-gyp 설치\"\r\n\r\nThis reverts commit 8922c387\r\n\r\n* chore(deps): package.json과 pnpm-lock.yaml 동기화\r\n\r\n* fix: users/me 유저권한 all 로 변경\r\n\r\n* fix: 반납 3일 전 알림이 여러 번 전송됨 (#801)\r\n\r\n* fix(notification): 3일 전 반납 알림을 중복 사용한 부분 삭제\r\n\r\n- 3일 전 반납 알림을 보내는 함수가 notifyReturningReminder(), notifyOverdueManager() 인데, 후자가 유연한 동작을 지원하므로 전자 함수의 동작을 제거함\r\n\r\n* fix(notification): 슬랙 연체 알림 보내는 함수 스케줄러에 추가\r\n\r\n* Update backend/src/v1/notifications/notifications.service.ts\r\n\r\nCo-authored-by: Ji-Hyuck, Min <45284810+jimin52@users.noreply.github.com>\r\n\r\n* refactor: console.log 제거\r\n\r\n---------\r\n\r\nCo-authored-by: Ji-Hyuck, Min <45284810+jimin52@users.noreply.github.com>\r\n\r\n* fix: `dev/v2` 경로 복구 (#808)\r\n\r\n* security: 보안 취약점 해결 (#818)\r\n\r\n* feat(utils): rate limit 모듈 추가\r\n\r\n- R, CUD에 해당하는 rate limit 모듈 추가\r\n\r\n* refactor(cursus): rate limit 모듈 import해서 사용하도록 변경\r\n\r\n* feat: getRateLimiter 적용\r\n\r\n* feat(books): 유효한 ISBN인지 검사하는 로직 추가\r\n\r\n* feat(tags): tags router에 rate limit 추가\r\n\r\n* feat(routes): router에서 authValidate를 미들웨어로 쓰는 곳에 rate limiter 추가\r\n\r\n* feat(auth): /get/me에 rate limiter 추가\r\n\r\n* feat(users): 유저 생성 후 created 문장 출력 시, db에 저장된 email 값을 사용\r\n\r\n* build: csrf 방지를 위한 lusca 패키지 추가\r\n\r\n* feat(app): csrf 방지 로직 추가\r\n\r\n* feat(app): csrf 방지 옵션 수정\r\n\r\n* build: express-session 패키지 추가\r\n\r\n* feat(app): lusca 상태 유지를 위한 세션 추가\r\n\r\n* feat(app): cookie에도 secret 추가\r\n\r\n* feat(app): session에서 cookie 설정 및 lusca에서 부가적인 설정 제거\r\n\r\n* fix(auth): /get/me시, id가 null이면 400 status code 반환 (#816)\r\n\r\n- /get/me 시, id가 null이면 400 status code, errorCode.NO_USER 반환\r\n- catch 로직 수정\r\n\r\n* fix: 이미지 빌드 에러 수정 (#820)\r\n\r\n* feat: 파이썬 가상환경 설치 추가 및 가상환경에서 pip 동작\r\n\r\n* feat: server_name 변경 및 루트일 때 인덱스 페이지 지정\r\n\r\n* feat: docker-compose에서 443 포트 개방 및 letsencrypt 자동화 스크립트 추가\r\n\r\n* feat: scripts/letsencrypt.sh 볼륨 연결\r\n\r\n* fix: lusca 설정 수정\r\n\r\n* chore: 불필요한 command 제거\r\n\r\n* feat(letsencrypt 볼륨 연결):\r\n\r\n* chore: lusca 제거\r\n\r\n* fix(users): search에서 authvalidate의 roleset을 service로 변경\r\n\r\n* fix: 스케줄러에 의한 예약 만료 및 재할당 코드 (#814)\r\n\r\n* fix: 스케줄러에 의한 예약 만료 및 재할당 코드\r\n\r\nscheduler.ts\r\n- midnightScheduler에서 예약만료처리 코드를 삭제했습니다.\r\n- 예약만료처리와 함께 재할당하고, 이에 따른 슬랙메시지를 바로 전송하기 위해 morningScheduler에서 모두 처리합니다.\r\n- 슬랙메시지 전송은 낮이 바람직하고, 일련의 처리를 굳이 새벽과 아침에 나누어 작동해야할 필요성을 크게 느끼지 못했습니다.\r\n\r\nnotification.service.ts\r\n- notifyReservationOverdue, notifyReservation 코드는 하나로 통합하였습니다. 기존 코드의 역할을 동일하게 수행합니다.\r\n- 쿼리 구현부 코드는 모두 reservations.service.ts 에 새롭게 작성된 함수로 대체하였습니다.\r\n- 쿼리 실행 과정에서 오류 발생시 에러를 던집니다.\r\n- 슬랙 메시지 전송 과정에서 오류 발생시엔 로그만 남깁니다.\r\n\r\nreservations.service.ts\r\n- 총 3개의 함수가 추가되었습니다.\r\n- handleReservationOverdueAndAssignReservationToNextWaitingUser는 트랜잭션을 설정하고, 슬랙 메시지 전송을 위해 수행 결과를 반환합니다.\r\n- handleReservationOverdue는 예약 만료 처리를 한 뒤, 해당 예약 정보를 반환합니다.\r\n- assignReservationToNextWaitingUser는 만료된 예약정보를 받아 다음 예약자에게 할당합니다.\r\n\r\nhandleReservationOverdueAndAssignReservationToNextWaitingUser()\r\n- 예약 만료 처리와 다음 예약자에게 할당하는 것이 하나의 트랜잭션안에서 수행되도록 설정합니다.\r\n- 사이드 이펙트 방지를 위해 로직을 처리하는 동안 lending에 ROCK을 설정합니다.\r\n\r\nhandleReservationOverdue()\r\n- 기존 코드의 논리적 오류를 수정했습니다.\r\n- 예약 만료 처리해야할 데이터 조회 로직을 수정했습니다. status가 3이 아니라, 0이면서 && 책이 할당되었으면서 && 만료일이 지난 예약을 찾습니다.\r\n- 이제 이곳에서 정상적으로 예약만료 처리과정에서 status = 3을 부여합니다.\r\n\r\nassignReservationToNextWaitingUser()\r\n- 기존 코드의 논리적 오류를 수정했습니다.\r\n- handleReservationOverdue()를 통해 예약 만료된 책 정보를 1개씩 입력받습니다.\r\n- 해당 책에 대해서 다음 예약자가 존재하면 할당합니다.\r\n\r\n* fix: Promise.allSetteld로 변경\r\n\r\n* chore(reservations): reservation_id 대신 reservation.id 사용\r\n\r\n* feat(reservations): LOCK 제거\r\n\r\n* feat(reservations): SQL문 분리 및 서브쿼리 수정\r\n\r\n* feat(reservations): 누락된 트랜잭션 커밋 추가\r\n\r\n* chore(reservations): 오타 수정\r\n\r\n---------\r\n\r\nCo-authored-by: yena <50291995+nyj001012@users.noreply.github.com>\r\n\r\n* cd: nginx 설정 파일에 ssl 설정 추가 (#823)\r\n\r\n* feat(nginx): nginx 설정 파일에 ssl 설정 추가\r\n\r\n- http, https 디렉티브 분리\r\n- certbot 인증서 설정 추가\r\n\r\n* feat: host 비교 조건문 수정\r\n\r\n* User API 경로 정리 (#777)\r\n\r\n* refactor: 400번대 에러 반환 제거\r\n\r\n* refactor: overDueDay 반환 값에서 제거\r\n\r\n* Revert \"User API 경로 정리 (#777)\"\r\n\r\nThis reverts commit 9adc70102816e2253f72715551036d008a4cfd25.\r\n\r\n---------\r\n\r\nCo-authored-by: scarf \r\nCo-authored-by: Jeong Jihwan <47599349+JeongJiHwan@users.noreply.github.com>\r\nCo-authored-by: gilee \r\nCo-authored-by: kylee \r\nCo-authored-by: jwoo <74581396+Jiwon-Woo@users.noreply.github.com>\r\nCo-authored-by: honeyl3ee \r\nCo-authored-by: jimin \r\nCo-authored-by: Ji-Hyuck, Min <45284810+jimin52@users.noreply.github.com>\r\nCo-authored-by: jhj9109 <36416495+jhj9109@users.noreply.github.com>","shortMessageHtmlLink":"ci: 2024-04-28 배포 (#824)"}},{"before":"5202b94c51e6e65bbd705c2857788861b3dc2da2","after":"a941c9197f7e75a95c30f29007db0df18858ab18","ref":"refs/heads/gh-pages","pushedAt":"2024-04-27T05:05:37.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"github-actions[bot]","name":null,"path":"/apps/github-actions","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/15368?s=80&v=4"},"commit":{"message":"Deployed 803a034 with MkDocs version: 1.5.2","shortMessageHtmlLink":"Deployed 803a034 with MkDocs version: 1.5.2"}},{"before":"9060a4858313f3f6647eb3d337efae406d21aa00","after":"803a034824749ada9d5b4a9316870b4f04eb2689","ref":"refs/heads/develop","pushedAt":"2024-04-27T05:05:15.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"nyj001012","name":"yena","path":"/nyj001012","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/50291995?s=80&v=4"},"commit":{"message":"Merge branch 'main' into develop","shortMessageHtmlLink":"Merge branch 'main' into develop"}},{"before":"8b57fdbfd13d1c028fce05e02b1ce4d6e4013f7a","after":"5202b94c51e6e65bbd705c2857788861b3dc2da2","ref":"refs/heads/gh-pages","pushedAt":"2024-04-27T04:55:07.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"github-actions[bot]","name":null,"path":"/apps/github-actions","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/15368?s=80&v=4"},"commit":{"message":"Deployed 9060a48 with MkDocs version: 1.5.2","shortMessageHtmlLink":"Deployed 9060a48 with MkDocs version: 1.5.2"}},{"before":"9adc70102816e2253f72715551036d008a4cfd25","after":"9060a4858313f3f6647eb3d337efae406d21aa00","ref":"refs/heads/develop","pushedAt":"2024-04-27T04:54:46.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nyj001012","name":"yena","path":"/nyj001012","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/50291995?s=80&v=4"},"commit":{"message":"Revert \"User API 경로 정리 (#777)\"\n\nThis reverts commit 9adc70102816e2253f72715551036d008a4cfd25.","shortMessageHtmlLink":"Revert \"User API 경로 정리 (#777)\""}},{"before":"fa52f5bf1712dd414f7ec7c57055a552b5b0acdb","after":"8b57fdbfd13d1c028fce05e02b1ce4d6e4013f7a","ref":"refs/heads/gh-pages","pushedAt":"2024-04-27T04:49:01.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"github-actions[bot]","name":null,"path":"/apps/github-actions","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/15368?s=80&v=4"},"commit":{"message":"Deployed 9adc701 with MkDocs version: 1.5.2","shortMessageHtmlLink":"Deployed 9adc701 with MkDocs version: 1.5.2"}},{"before":"2cc10c66f30544b3012ffccdffaeebb80b79708c","after":"9adc70102816e2253f72715551036d008a4cfd25","ref":"refs/heads/develop","pushedAt":"2024-04-27T04:48:41.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nyj001012","name":"yena","path":"/nyj001012","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/50291995?s=80&v=4"},"commit":{"message":"User API 경로 정리 (#777)\n\n* refactor: 400번대 에러 반환 제거\n\n* refactor: overDueDay 반환 값에서 제거","shortMessageHtmlLink":"User API 경로 정리 (#777)"}},{"before":"f1440c75a86ae1dc16ecdc1b2d46ea2ea067017c","after":"fa52f5bf1712dd414f7ec7c57055a552b5b0acdb","ref":"refs/heads/gh-pages","pushedAt":"2024-04-27T04:14:27.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"github-actions[bot]","name":null,"path":"/apps/github-actions","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/15368?s=80&v=4"},"commit":{"message":"Deployed 2cc10c6 with MkDocs version: 1.5.2","shortMessageHtmlLink":"Deployed 2cc10c6 with MkDocs version: 1.5.2"}},{"before":"ec7035ef1421f698833b395ed27f25739930e0e6","after":"f1440c75a86ae1dc16ecdc1b2d46ea2ea067017c","ref":"refs/heads/gh-pages","pushedAt":"2024-04-27T04:14:11.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"github-actions[bot]","name":null,"path":"/apps/github-actions","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/15368?s=80&v=4"},"commit":{"message":"Deployed 3026751 with MkDocs version: 1.5.2","shortMessageHtmlLink":"Deployed 3026751 with MkDocs version: 1.5.2"}},{"before":"3026751786bd26b15cab9e96ef05358ecc1b6485","after":"2cc10c66f30544b3012ffccdffaeebb80b79708c","ref":"refs/heads/develop","pushedAt":"2024-04-27T04:14:08.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"nyj001012","name":"yena","path":"/nyj001012","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/50291995?s=80&v=4"},"commit":{"message":"cd: nginx 설정 파일에 ssl 설정 추가 (#823)\n\n* feat(nginx): nginx 설정 파일에 ssl 설정 추가\r\n\r\n- http, https 디렉티브 분리\r\n- certbot 인증서 설정 추가\r\n\r\n* feat: host 비교 조건문 수정","shortMessageHtmlLink":"cd: nginx 설정 파일에 ssl 설정 추가 (#823)"}},{"before":"066d8685f832ce3bba4fcc8b70661235b5934e10","after":"3026751786bd26b15cab9e96ef05358ecc1b6485","ref":"refs/heads/develop","pushedAt":"2024-04-27T04:13:42.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"nyj001012","name":"yena","path":"/nyj001012","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/50291995?s=80&v=4"},"commit":{"message":"fix: 스케줄러에 의한 예약 만료 및 재할당 코드 (#814)\n\n* fix: 스케줄러에 의한 예약 만료 및 재할당 코드\r\n\r\nscheduler.ts\r\n- midnightScheduler에서 예약만료처리 코드를 삭제했습니다.\r\n- 예약만료처리와 함께 재할당하고, 이에 따른 슬랙메시지를 바로 전송하기 위해 morningScheduler에서 모두 처리합니다.\r\n- 슬랙메시지 전송은 낮이 바람직하고, 일련의 처리를 굳이 새벽과 아침에 나누어 작동해야할 필요성을 크게 느끼지 못했습니다.\r\n\r\nnotification.service.ts\r\n- notifyReservationOverdue, notifyReservation 코드는 하나로 통합하였습니다. 기존 코드의 역할을 동일하게 수행합니다.\r\n- 쿼리 구현부 코드는 모두 reservations.service.ts 에 새롭게 작성된 함수로 대체하였습니다.\r\n- 쿼리 실행 과정에서 오류 발생시 에러를 던집니다.\r\n- 슬랙 메시지 전송 과정에서 오류 발생시엔 로그만 남깁니다.\r\n\r\nreservations.service.ts\r\n- 총 3개의 함수가 추가되었습니다.\r\n- handleReservationOverdueAndAssignReservationToNextWaitingUser는 트랜잭션을 설정하고, 슬랙 메시지 전송을 위해 수행 결과를 반환합니다.\r\n- handleReservationOverdue는 예약 만료 처리를 한 뒤, 해당 예약 정보를 반환합니다.\r\n- assignReservationToNextWaitingUser는 만료된 예약정보를 받아 다음 예약자에게 할당합니다.\r\n\r\nhandleReservationOverdueAndAssignReservationToNextWaitingUser()\r\n- 예약 만료 처리와 다음 예약자에게 할당하는 것이 하나의 트랜잭션안에서 수행되도록 설정합니다.\r\n- 사이드 이펙트 방지를 위해 로직을 처리하는 동안 lending에 ROCK을 설정합니다.\r\n\r\nhandleReservationOverdue()\r\n- 기존 코드의 논리적 오류를 수정했습니다.\r\n- 예약 만료 처리해야할 데이터 조회 로직을 수정했습니다. status가 3이 아니라, 0이면서 && 책이 할당되었으면서 && 만료일이 지난 예약을 찾습니다.\r\n- 이제 이곳에서 정상적으로 예약만료 처리과정에서 status = 3을 부여합니다.\r\n\r\nassignReservationToNextWaitingUser()\r\n- 기존 코드의 논리적 오류를 수정했습니다.\r\n- handleReservationOverdue()를 통해 예약 만료된 책 정보를 1개씩 입력받습니다.\r\n- 해당 책에 대해서 다음 예약자가 존재하면 할당합니다.\r\n\r\n* fix: Promise.allSetteld로 변경\r\n\r\n* chore(reservations): reservation_id 대신 reservation.id 사용\r\n\r\n* feat(reservations): LOCK 제거\r\n\r\n* feat(reservations): SQL문 분리 및 서브쿼리 수정\r\n\r\n* feat(reservations): 누락된 트랜잭션 커밋 추가\r\n\r\n* chore(reservations): 오타 수정\r\n\r\n---------\r\n\r\nCo-authored-by: yena <50291995+nyj001012@users.noreply.github.com>","shortMessageHtmlLink":"fix: 스케줄러에 의한 예약 만료 및 재할당 코드 (#814)"}},{"before":"5300b5b2504f3280e527a05f672b8390c1bc1c49","after":"85987198363a05f7bde3f4da54251c7de8838fd4","ref":"refs/heads/822-nginx-설정파일-ssl-설정-추가","pushedAt":"2024-04-27T04:11:48.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nyj001012","name":"yena","path":"/nyj001012","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/50291995?s=80&v=4"},"commit":{"message":"feat: host 비교 조건문 수정","shortMessageHtmlLink":"feat: host 비교 조건문 수정"}},{"before":"066d8685f832ce3bba4fcc8b70661235b5934e10","after":null,"ref":"refs/heads/810-에약-만료일이-지났을-때-자동으로-취소가-안-됨","pushedAt":"2024-04-08T03:24:01.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"nyj001012","name":"yena","path":"/nyj001012","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/50291995?s=80&v=4"}},{"before":null,"after":"066d8685f832ce3bba4fcc8b70661235b5934e10","ref":"refs/heads/810-에약-만료일이-지났을-때-자동으로-취소가-안-됨","pushedAt":"2024-04-08T03:23:15.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"nyj001012","name":"yena","path":"/nyj001012","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/50291995?s=80&v=4"},"commit":{"message":"Merge branch 'main' into develop","shortMessageHtmlLink":"Merge branch 'main' into develop"}},{"before":"27abb0cbfa34a22e37658c8acf864ddf565293ba","after":"5300b5b2504f3280e527a05f672b8390c1bc1c49","ref":"refs/heads/822-nginx-설정파일-ssl-설정-추가","pushedAt":"2024-03-03T05:32:03.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"nyj001012","name":"yena","path":"/nyj001012","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/50291995?s=80&v=4"},"commit":{"message":"feat(nginx): nginx 설정 파일에 ssl 설정 추가\n\n- http, https 디렉티브 분리\n- certbot 인증서 설정 추가","shortMessageHtmlLink":"feat(nginx): nginx 설정 파일에 ssl 설정 추가"}},{"before":"066d8685f832ce3bba4fcc8b70661235b5934e10","after":"27abb0cbfa34a22e37658c8acf864ddf565293ba","ref":"refs/heads/822-nginx-설정파일-ssl-설정-추가","pushedAt":"2024-03-03T05:28:20.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nyj001012","name":"yena","path":"/nyj001012","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/50291995?s=80&v=4"},"commit":{"message":"cd(nginx): nginx 설정 파일에 ssl 설정 추가\n\n- http, https 디렉티브 분리\n- certbot 인증서 설정 추가","shortMessageHtmlLink":"cd(nginx): nginx 설정 파일에 ssl 설정 추가"}},{"before":null,"after":"066d8685f832ce3bba4fcc8b70661235b5934e10","ref":"refs/heads/822-nginx-설정파일-ssl-설정-추가","pushedAt":"2024-03-03T05:24:24.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"nyj001012","name":"yena","path":"/nyj001012","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/50291995?s=80&v=4"},"commit":{"message":"Merge branch 'main' into develop","shortMessageHtmlLink":"Merge branch 'main' into develop"}},{"before":"a0af0e7ec583068a9f97aa3df96c085be783796d","after":"4d0ed15ea7d9bdb0d4d9649df7e9047ee5065460","ref":"refs/heads/main","pushedAt":"2024-03-02T06:35:17.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"nyj001012","name":"yena","path":"/nyj001012","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/50291995?s=80&v=4"},"commit":{"message":"ci: 2024-03-03 배포 (#821)\n\n* ci: 타입오류 메시지 상대경로 명시적으로 해소 (#643)\r\n\r\n참고: https://github.com/actions/runner/issues/659\r\n\r\n* feat: v2 book api (#746)\r\n\r\n* refactor: v1 api와 다른 부분 수정\r\n\r\n* refactor: books API schema default sort value 추가 및 callSign 오타 수정\r\n\r\n* refactor: status: zod.enum -> zod.nativeEnum 변경\r\n\r\nz.enum으로 했을때 number 반환값에 대한 처리가 되지 않아 enumStatus 생성 후 nativeEnum으로 변경하였습니다.\r\n\r\n* feat: books//:id v2 구현\r\n\r\n* feat: books/search v2 구현\r\n\r\n* feat: book/update v2 구현\r\n\r\n* feat: books/info/:id v2 구현\r\n\r\n* refactor: BookNotFoundError import 오타 수정\r\n\r\n* feat: books/info/sorted v2 구현\r\n\r\n* feat: books/info/tag v2 구현\r\n\r\nbook_info.id 로 distinct가 되지 않는 오류가 있어요\r\n\r\n* refactor: 의미에 맞는 변수명으로 수정 및 코드 간략화\r\n\r\nCo-authored-by: scarf \r\n\r\n* refactor: book_info 중복 select 부분 처리\r\n\r\nCo-authored-by: scarf \r\n\r\n* feat: books/donator v2 구현\r\n\r\nv1 구현 시 얘기했었던 기부자가 유저가 아니더라도 수정될 수 있도록 수정 & email은 더이상 관리하지 않기 때문에 변수명에서 제거\r\n\r\n* refactor: 대출 가능 여부 boolean 반환값으로 수정\r\n\r\nkysely 사용중 select가 없을 경우 sql syntax 에러로 해당 부분 수정 및 boolean 값 반환되도록 수정\r\n\r\n* feat: [get] books/create v2 구현\r\n\r\naxios.get 동작 중 발생하는 에러(catch 영역)에 대한 처리를 어떻게 해야할지 모르겠어요\r\n\r\n* fix: 임시로 타입 오류 무시\r\n\r\n---------\r\n\r\nCo-authored-by: scarf \r\n\r\n* style: prettier 적용 (#761)\r\n\r\n* build: prettier 설정\r\n\r\n* style: prettier 적용\r\n\r\n---------\r\n\r\nCo-authored-by: nocontribute <>\r\n\r\n* [fix] backend dockerfile error (#764)\r\n\r\nCo-authored-by: kylee \r\n\r\n* fix: `positiveInt` -> `nonNegativeInt` (#766)\r\n\r\n* refactor: v2 라우트 정리 적용 (#771)\r\n\r\n* refactor: `/stock` 제거\r\n\r\nhttps://github.com/jiphyeonjeon-42/backend/discussions/767#discussioncomment-6986111\r\n\r\n* refactor: contracts에서 500번대 오류 제거\r\n\r\n백엔드에서 복구 불가능한 오류일 시 반환하기 때문에, 프론트엔드에서 따로 처리하는 것이 좋을 것 같습니다.\r\n\r\n* refactor: `/history` -> `/lendings`\r\n\r\nhttps://github.com/jiphyeonjeon-42/backend/discussions/767#discussioncomment-6986282\r\n\r\nCo-authored-by: jwoo <74581396+Jiwon-Woo@users.noreply.github.com>\r\n\r\n* refactor: `/users ` 정리\r\n\r\nhttps://github.com/jiphyeonjeon-42/backend/discussions/767#discussioncomment-6986194\r\n\r\nCo-authored-by: honeyl3ee \r\n\r\n* refactor: `/tag` 서비스 임시 제거\r\n\r\n고도화를 하기 위해서는 내부 구현을 바꾸어야 하는 문제가 있어 우선순위를 낮추었습니다.\r\n\r\n주석처리를 할까 고민했으나 제거 이전 커밋(15654412a5f9da964ad1f653d5650bdec8afd9fb)으로 체크아웃시 전체 코드를 확인 가능하기 때문에 복잡도 감소를 위해 코드를 제거하였습니다.\r\n\r\n* refactor: `/books` 경로 정리\r\n\r\nhttps://github.com/jiphyeonjeon-42/backend/discussions/767#discussioncomment-6986195\r\nhttps://github.com/jiphyeonjeon-42/backend/discussions/767#discussioncomment-6986483\r\n\r\nCo-authored-by: Jeong Jihwan <47599349+JeongJiHwan@users.noreply.github.com>\r\nCo-authored-by: jwoo <74581396+Jiwon-Woo@users.noreply.github.com>\r\n\r\n* feat: swagger에서 1줄 요약 표시\r\n\r\n---------\r\n\r\nCo-authored-by: jwoo <74581396+Jiwon-Woo@users.noreply.github.com>\r\nCo-authored-by: honeyl3ee \r\nCo-authored-by: Jeong Jihwan <47599349+JeongJiHwan@users.noreply.github.com>\r\n\r\n* feat: add mydata service\r\n\r\n토큰에서 id 정보 찾아서 유저 정보 반환하는 controller\r\n\r\n* feat: 유저 search 할 때 id 가 undefined 인 경우 핸들링\r\n\r\n* feat: add swagger && /me endpoint && apply authValidate\r\n\r\n* fix: searchUsersById 타입을 이전과 같이 리턴하도록 변경\r\n\r\nsearchUsersById 서비스 함수의 종속성이 생각보다 많음.controller 에서 items 의 length 를 확인하도록\r\n\r\n* fix: add librarian validate in search endpoint\r\n\r\n* feat: 로그인한 유저만 본인 정보를 찾을 수 있도록 middleware 에서 권한 체크\r\n\r\n* chore: console.log 제거\r\n\r\n* User API 경로 정리 (#777)\r\n\r\n* refactor: 400번대 에러 반환 제거\r\n\r\n* refactor: overDueDay 반환 값에서 제거\r\n\r\n* fix(cursus): Access-Control-Allow-Origin 설정 (#790)\r\n\r\n* chore: dependencies 업데이트 (#796)\r\n\r\n* chore(deps): contracts의 pnpm-lock 업데이트\r\n\r\n* chore(deps): @mapbox/npm-pre-gyp 설치\r\n\r\n* chore(deps): npm-pre-gyp 설치\r\n\r\n* Revert \"chore(deps): npm-pre-gyp 설치\"\r\n\r\nThis reverts commit 8922c387\r\n\r\n* chore(deps): package.json과 pnpm-lock.yaml 동기화\r\n\r\n* fix: users/me 유저권한 all 로 변경\r\n\r\n* fix: 반납 3일 전 알림이 여러 번 전송됨 (#801)\r\n\r\n* fix(notification): 3일 전 반납 알림을 중복 사용한 부분 삭제\r\n\r\n- 3일 전 반납 알림을 보내는 함수가 notifyReturningReminder(), notifyOverdueManager() 인데, 후자가 유연한 동작을 지원하므로 전자 함수의 동작을 제거함\r\n\r\n* fix(notification): 슬랙 연체 알림 보내는 함수 스케줄러에 추가\r\n\r\n* Update backend/src/v1/notifications/notifications.service.ts\r\n\r\nCo-authored-by: Ji-Hyuck, Min <45284810+jimin52@users.noreply.github.com>\r\n\r\n* refactor: console.log 제거\r\n\r\n---------\r\n\r\nCo-authored-by: Ji-Hyuck, Min <45284810+jimin52@users.noreply.github.com>\r\n\r\n* fix: `dev/v2` 경로 복구 (#808)\r\n\r\n* security: 보안 취약점 해결 (#818)\r\n\r\n* feat(utils): rate limit 모듈 추가\r\n\r\n- R, CUD에 해당하는 rate limit 모듈 추가\r\n\r\n* refactor(cursus): rate limit 모듈 import해서 사용하도록 변경\r\n\r\n* feat: getRateLimiter 적용\r\n\r\n* feat(books): 유효한 ISBN인지 검사하는 로직 추가\r\n\r\n* feat(tags): tags router에 rate limit 추가\r\n\r\n* feat(routes): router에서 authValidate를 미들웨어로 쓰는 곳에 rate limiter 추가\r\n\r\n* feat(auth): /get/me에 rate limiter 추가\r\n\r\n* feat(users): 유저 생성 후 created 문장 출력 시, db에 저장된 email 값을 사용\r\n\r\n* build: csrf 방지를 위한 lusca 패키지 추가\r\n\r\n* feat(app): csrf 방지 로직 추가\r\n\r\n* feat(app): csrf 방지 옵션 수정\r\n\r\n* build: express-session 패키지 추가\r\n\r\n* feat(app): lusca 상태 유지를 위한 세션 추가\r\n\r\n* feat(app): cookie에도 secret 추가\r\n\r\n* feat(app): session에서 cookie 설정 및 lusca에서 부가적인 설정 제거\r\n\r\n* fix(auth): /get/me시, id가 null이면 400 status code 반환 (#816)\r\n\r\n- /get/me 시, id가 null이면 400 status code, errorCode.NO_USER 반환\r\n- catch 로직 수정\r\n\r\n* fix: 이미지 빌드 에러 수정 (#820)\r\n\r\n* feat: 파이썬 가상환경 설치 추가 및 가상환경에서 pip 동작\r\n\r\n* feat: server_name 변경 및 루트일 때 인덱스 페이지 지정\r\n\r\n* feat: docker-compose에서 443 포트 개방 및 letsencrypt 자동화 스크립트 추가\r\n\r\n* feat: scripts/letsencrypt.sh 볼륨 연결\r\n\r\n* fix: lusca 설정 수정\r\n\r\n* chore: 불필요한 command 제거\r\n\r\n* feat(letsencrypt 볼륨 연결):\r\n\r\n* chore: lusca 제거\r\n\r\n* fix(users): search에서 authvalidate의 roleset을 service로 변경\r\n\r\n---------\r\n\r\nCo-authored-by: scarf \r\nCo-authored-by: Jeong Jihwan <47599349+JeongJiHwan@users.noreply.github.com>\r\nCo-authored-by: gilee \r\nCo-authored-by: kylee \r\nCo-authored-by: jwoo <74581396+Jiwon-Woo@users.noreply.github.com>\r\nCo-authored-by: honeyl3ee \r\nCo-authored-by: jimin \r\nCo-authored-by: Ji-Hyuck, Min <45284810+jimin52@users.noreply.github.com>","shortMessageHtmlLink":"ci: 2024-03-03 배포 (#821)"}},{"before":"c20a89b61f9cd115a4b2a1715554206ad982765f","after":"ec7035ef1421f698833b395ed27f25739930e0e6","ref":"refs/heads/gh-pages","pushedAt":"2024-03-02T04:34:29.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"github-actions[bot]","name":null,"path":"/apps/github-actions","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/15368?s=80&v=4"},"commit":{"message":"Deployed 066d868 with MkDocs version: 1.5.2","shortMessageHtmlLink":"Deployed 066d868 with MkDocs version: 1.5.2"}},{"before":"7e6ccb34dd8718154311f1fbfd3d892e238a93fb","after":"066d8685f832ce3bba4fcc8b70661235b5934e10","ref":"refs/heads/develop","pushedAt":"2024-03-02T04:34:02.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"nyj001012","name":"yena","path":"/nyj001012","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/50291995?s=80&v=4"},"commit":{"message":"Merge branch 'main' into develop","shortMessageHtmlLink":"Merge branch 'main' into develop"}},{"before":"58172186cac514db6d48ed130a3c4d7472d5572e","after":"c20a89b61f9cd115a4b2a1715554206ad982765f","ref":"refs/heads/gh-pages","pushedAt":"2024-02-24T03:40:42.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"github-actions[bot]","name":null,"path":"/apps/github-actions","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/15368?s=80&v=4"},"commit":{"message":"Deployed 7e6ccb3 with MkDocs version: 1.5.2","shortMessageHtmlLink":"Deployed 7e6ccb3 with MkDocs version: 1.5.2"}},{"before":"440121577c92fef10445af647144a0e34d74f841","after":null,"ref":"refs/heads/819-이미지-빌드-에러-수정","pushedAt":"2024-02-24T03:40:17.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"nyj001012","name":"yena","path":"/nyj001012","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/50291995?s=80&v=4"}},{"before":"59c4eec9bdc5a763cce916f6c494a37c0ab27fe3","after":"7e6ccb34dd8718154311f1fbfd3d892e238a93fb","ref":"refs/heads/develop","pushedAt":"2024-02-24T03:40:13.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"nyj001012","name":"yena","path":"/nyj001012","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/50291995?s=80&v=4"},"commit":{"message":"fix: 이미지 빌드 에러 수정 (#820)\n\n* feat: 파이썬 가상환경 설치 추가 및 가상환경에서 pip 동작\r\n\r\n* feat: server_name 변경 및 루트일 때 인덱스 페이지 지정\r\n\r\n* feat: docker-compose에서 443 포트 개방 및 letsencrypt 자동화 스크립트 추가\r\n\r\n* feat: scripts/letsencrypt.sh 볼륨 연결\r\n\r\n* fix: lusca 설정 수정\r\n\r\n* chore: 불필요한 command 제거\r\n\r\n* feat(letsencrypt 볼륨 연결):\r\n\r\n* chore: lusca 제거\r\n\r\n* fix(users): search에서 authvalidate의 roleset을 service로 변경","shortMessageHtmlLink":"fix: 이미지 빌드 에러 수정 (#820)"}},{"before":"c046951db7bba682e83e7ae7a811eb950a53a789","after":"440121577c92fef10445af647144a0e34d74f841","ref":"refs/heads/819-이미지-빌드-에러-수정","pushedAt":"2024-02-13T11:33:17.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nyj001012","name":"yena","path":"/nyj001012","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/50291995?s=80&v=4"},"commit":{"message":"fix(users): search에서 authvalidate의 roleset을 service로 변경","shortMessageHtmlLink":"fix(users): search에서 authvalidate의 roleset을 service로 변경"}},{"before":"6bd1de312d1702adb6ec2e2706c1d4dc3b7a3c46","after":"c046951db7bba682e83e7ae7a811eb950a53a789","ref":"refs/heads/819-이미지-빌드-에러-수정","pushedAt":"2024-01-31T09:24:55.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nyj001012","name":"yena","path":"/nyj001012","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/50291995?s=80&v=4"},"commit":{"message":"chore: lusca 제거","shortMessageHtmlLink":"chore: lusca 제거"}},{"before":"ec7f5af6d56b08d31a84cdae926430c709e92561","after":"6bd1de312d1702adb6ec2e2706c1d4dc3b7a3c46","ref":"refs/heads/819-이미지-빌드-에러-수정","pushedAt":"2024-01-31T09:21:37.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nyj001012","name":"yena","path":"/nyj001012","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/50291995?s=80&v=4"},"commit":{"message":"feat(letsencrypt 볼륨 연결):","shortMessageHtmlLink":"feat(letsencrypt 볼륨 연결):"}},{"before":"402d212715daac840103f88a9dcb897ff6e5a39e","after":"ec7f5af6d56b08d31a84cdae926430c709e92561","ref":"refs/heads/819-이미지-빌드-에러-수정","pushedAt":"2024-01-31T09:20:17.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nyj001012","name":"yena","path":"/nyj001012","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/50291995?s=80&v=4"},"commit":{"message":"chore: 불필요한 command 제거","shortMessageHtmlLink":"chore: 불필요한 command 제거"}},{"before":"05cf50de2a65d0e2ad45c8fa9ccb5e98e9793fe3","after":"402d212715daac840103f88a9dcb897ff6e5a39e","ref":"refs/heads/819-이미지-빌드-에러-수정","pushedAt":"2024-01-31T09:16:27.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nyj001012","name":"yena","path":"/nyj001012","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/50291995?s=80&v=4"},"commit":{"message":"fix: lusca 설정 수정","shortMessageHtmlLink":"fix: lusca 설정 수정"}},{"before":"63845aa8d5b2a576dc25c56b3f2235856c7bc5ec","after":"05cf50de2a65d0e2ad45c8fa9ccb5e98e9793fe3","ref":"refs/heads/819-이미지-빌드-에러-수정","pushedAt":"2024-01-30T10:25:49.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"nyj001012","name":"yena","path":"/nyj001012","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/50291995?s=80&v=4"},"commit":{"message":"feat: scripts/letsencrypt.sh 볼륨 연결","shortMessageHtmlLink":"feat: scripts/letsencrypt.sh 볼륨 연결"}},{"before":"647c2ff8de90b51f7272497d62331713ff5f07f3","after":"63845aa8d5b2a576dc25c56b3f2235856c7bc5ec","ref":"refs/heads/819-이미지-빌드-에러-수정","pushedAt":"2024-01-30T10:23:44.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"nyj001012","name":"yena","path":"/nyj001012","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/50291995?s=80&v=4"},"commit":{"message":"feat: docker-compose에서 443 포트 개방 및 letsencrypt 자동화 스크립트 추가","shortMessageHtmlLink":"feat: docker-compose에서 443 포트 개방 및 letsencrypt 자동화 스크립트 추가"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"djE6ks8AAAAEO7cNEwA","startCursor":null,"endCursor":null}},"title":"Activity · jiphyeonjeon-42/backend"}