Giter Site home page Giter Site logo

backend's People

Contributors

juneparkcode avatar koreanddinghwan avatar

Stargazers

 avatar  avatar  avatar

backend's Issues

VPC관련

VPC에 Manito vpc있던데, 따로 VPC생성해서 하나요?

  • no: test_server가 사용중인 기본 VPC사용하면될까요?
  • yes: Internet Gateway따로 필요한데, 생성해서 사용해도되나요

reservations POST 문의드려요 ㅠㅠㅠ

스크린샷 2023-07-24 오후 6 22 38 스크린샷 2023-07-24 오후 6 23 45 스크린샷 2023-07-24 오후 6 23 54

payload는 잘 보낸 것 같은데.. 음... isHide도 false인 친구한테 보냈는데 ㅠㅠㅠ 400에러가 나오네요! 이게 왜그런건지 참... 모르겠슴니다 ㅋㅋㅋ

[Feature] Reservation

예약프로세스

Untitled



상태 설명

REQUEST

멘티가 멘토링을 요청한 상태


ACCEPT

멘토가 멘토링을 수락한 상태

== 멘토링을 시작한 상태


CANCEL

  1. REQUEST상태에서 멘티가 멘토링 취소
  2. REQUEST상태에서 멘토가 멘토링 취소
  3. ACCEPT상태에서 멘토가 멘토링 취소

MENTEE_FEEDBACK

멘티가 피드백을 남긴 상태


DONE

멘토가 피드백을 남기고 멘토링이 종료된 상태.

CI/CD - S3 + Code Deploy + Github action

CI/CD

S3

  • Github action -> Build -> compress -> S3 Bucket
  • Connect with NAT

Code Deploy

  • Github action ---trigger code deploy--> Code deploy ---deploy--> EC2
  • Connect NAT (PROD) / NAT instance (DEV)

Github action

  • main branch
    • ON PUSH -> main server
  • develop branch -> dev server
    • ON PUSH -> dev server
  • Check build
    • main / develop -> check build

Search hashtag, nickname 검색관련 문의

@JuneParkCode
/search/mentor/{search_string}을 검색하게 되면 여기서
search_by_user_nickname, search_by_hashtag_name 이 있는데 이걸 제가 hashtag인지 nickname 검색인지 알 수 있는 방법은 있지만 여러 콜을 하고 판정하는데 비용이 생각보다 발생할 것 같습니다!
그래서 이걸 search/mentor/{search_string}일때 search_string으로 nickname, hashtag 에 해당하는 개체를 받을 수 있는지 궁금합니다 ㅎㅎ

[Fix] Reservation 프로세스에 CHECKED 추가

Description

  • 프론트엔드에서 Reservation 관련한 부분에서 수정사항이 있어 Mentee 의 확인 절차가 필요합니다.

Todo

  • Accept 이후에 멘티가 Accept 된 사실을 확인하는 절차가 필요합니다.
  • GET /reservations/:id/checked 추가

프론트엔드

  • 관련 이슈 해당 이슈에 등록해두겠습니다.

User Reservation APi 변경

/user/{:id}/reservations/*

  • 유저의 예약 상태를 가져옵니다.
  • 하위 api는 모두 pagination을 지원합니다.
  • 다음과 같은 목적으로 사용합니다.
    • 나의 모든 멘토링 조회
    • 멘토로서의 멘토링 조회
    • 멘티로서의 멘토링 조회
    • 위 두 분류에서 다시 아래 분류를 지원해야합니다.
      • 대기 중인 멘토링 조회 (REQUEST, ACCEPT)
      • 진행 중인 멘토링 조회 (MENTEE_CHECK, MENTEE_FEEDBACK)
      • 완료된 멘토링 조회 (DONE, CANCEL)
      • 각자 상태별 조회
      • 전체 상태 조회

논의 필요

  • 프론트 입장에서는 쿼리를 통해서 날리는게 편하긴 합니다.
  • 예를 들자면, 다음과 같습니다. 두 가지 방법 정도 있을 것 같네요.
    • 1. 상태별로 따로 파기
      • as_,mentee / as_mentor 사용해도 되고...
      • /user/id/reservations 경로를 앞으로 . 라고 하겠습니다.
      • .
        • pagination 관련 query만 받음
        • 전체 예약에 대해서 제공
      • ./requests
        • role: mentee | mentor
        • pagination 제공
      • ./in_progress or ./active
        • role: mentee | mentor
        • pagination 제공
    • ./done
      • role: mentee | mentor
      • pagination 제공
      • cancel, done 분리 가능
    • 2. . 에서 모두 제공
    • 범용적이기도 하고, 프론트에서 깔끔하긴 합니다.
      • query parameter (default)
        • take (20)
        • page (0)
        • role : mentee | mentor | all (all)
        • status query (all true)
          • request, accept, mentee_check, mentee_feedback, done, cancel
          • 이걸 좀 깔끔하게 하는 방법이 있을 것 같기도한데... 있는지 잘 모르겠네요.

[Infra] 배포 프로세스 재정립

Flow

  1. develop merge
  2. npm install
  3. npm run build
  4. code deploy 트리거

pre requisite

1. github action 예시

name: AWS S3 Upload and CodeBuild

on:
  push:
    branches:
      - develop

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Set up AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ap-northeast-2

      - name: Install dependencies and build
        uses: actions/setup-node@v3
        with:
          node-version: 18.16.1
      - run: npm install
      - run: npm run build


      - name: Deploy to AWS CodeDeploy
        run: |
          # Use AWS CLI or SDK to deploy to CodeDeploy
          # Update the commands to suit your deployment process

[BUG] Feedback Rating이 반영되지 않는 문제

Describe the bug

throw new UnauthorizedException('user is not mentee of this reservation');
await prisma.menteeFeedback.create({
data: {
reservationId: reservationId,
menteeId: reservation.menteeId,
mentorId: reservation.mentorId,
content: payload.content,
},
});
await prisma.user.update({
where: { id: reservation.menteeId },
data: {
mentoringCount: { increment: 1 },
},
});
return prisma.reservation.update({
where: { id: reservationId },
data: { status: ReservationStatus.MENTEE_FEEDBACK },
select: ReservationSelectQuery,
});
});
}
async completeReservationByMentor(
reservationId: number,
userId: number,
role: string,
payload: ReservationCompleteAsMentorPayloadDto,
) {
return this.prismaService.$transaction(async (prisma) => {
const reservation = await prisma.reservation.findUnique({
where: { id: reservationId },
});
if (!reservation || reservation.status !== ReservationStatus.ACCEPT)
throw new BadRequestException('invalid reservation for mentor_completion');
if (role !== UserRole.ADMIN && reservation.mentorId !== userId)
throw new UnauthorizedException('user is not mentor of this reservation');
await prisma.mentorFeedback.create({
data: {
reservationId: reservationId,
menteeId: reservation.menteeId,
mentorId: reservation.mentorId,
},
});
await prisma.mentorProfile.update({
where: { userId: reservation.mentorId },
data: {
mentoringCount: { increment: 1 },
},
});
return prisma.reservation.update({
where: { id: reservationId },
data: { status: ReservationStatus.DONE },
select: ReservationSelectQuery,

  • PATCH API에 Rating을 건냈음에도 rating이 반영되지 않음.

To Reproduce

  • PATCH reservations/id/mentee_completion

Expected behavior

  • id 가 변경되어야 함

Screenshots
image

Additional context

  • 코드 확인해보니 data 에 rating을 반영하지 않는 것 같습니다.

Hashtag관련 내용

현재는 만약 존재하는 hashtag면 409 already exists를 주고 있습니다!
여기서 필요하다고 생각되는 부분은 409보다는 200으로 있는 개체를 주시면 편할 것 같습니다!

{
  "id": 0,
  "name": "string"
}

reservation 에 대한 추가 api 구성

배경

  • 현재 API 의 경우 단순 CRUD 를 수행하고 있습니다. 그러나, reservation 등록, 수정, 취소의 경우 복잡한 transaction 이 요구되고 있어 별도의 api를 구성해야합니다.
  • 기존의 /reservations 에서 POST, PATCH 관련 요청은 ADMIN에 한하여 사용할 수 있도록 제한할 것입니다.
  • 기존의 /reservations 에서 수행할 수 있는 요청이나, 사용자 측에서의 요청을 세분화하고 정확하게 수행하는데 목적이 있습니다.

새로 만들 API

공통

  • 아래 API는 모두 예약에 관련되어 멘토, 멘티에게 알림을 수행합니다.
  • 알림의 경우 현재 첫 구현에서는 email 로 수행됩니다.
  • 따라서, 초기에 mailing list에 등록할 수 있도록 해야합니다.
  • 추후에는 mailing list 에 송부하는 것 외에도 web 상에서 알림을 수신할 수 있도록 해야합니다.
  • 반드시 예약에 관련된 사람 혹은 ADMIN만이 수행할 수있습니다.

노쇼

  • Front 에서 노쇼 상황 대처에 대한 가이드를 작성해둬야합니다.

등록

  • POST /reservations
    • 새로운 예약을 개설합니다.
    • 다음을 확인합니다.
      • 현재 상호 진행 중인 예약이 존재하는가?
        • REQUEST, ACCEPT 상태의 예약을 찾아봅니다.
    • 이후 예약의 상태는 REQUEST 가 됩니다.

취소

  • PATCH /reservations/{id}/cancel
    • REQUEST 상태의 예약을 취소합니다.
    • 예약 취소는 REQUEST 상황에서 멘티, 멘토 모두 신청할 수 있습니다.
    • 이후 예약 상태는 CANCEL이 됩니다.

예약 확인

  • PATCH /reservations/{id}/accept
    • 현재 REQUEST상태의 예약에 대해서 멘토가 확정을 합니다.
    • 예약 확인은 REQUEST 상태에서만 이루어질 수 있습니다.
    • 멘토만 해당 요청을 할 수 있습니다.
    • 이후 예약 상태는 ACCEPT 상태가 됩니다.

멘토링 종료 (멘토입장)

  • PATCH /reservations/{id}/mentor_completion
    • 멘토링 진행 이후 멘토가 해당 멘토링의 종료 처리를합니다.
    • 해당 요청은 멘토링에 관련된 멘토만 요청할 수 있습니다.
    • 요청이 가능한 상태는 멘토링이 수락된 상태인 ACCEPT 입니다.
    • API를 요청할때는 Feedback 을 작성해야하며, 이 관련 내용이 해당 요청의 body 에 포함됩니다.
    • 이후 예약의 상태는 PENDING 상태가 됩니다.

멘토링 종료 (멘티입장)

  • PATCH /reservations/{id}/mentee_completion
    • 멘티가 멘토링 종료 이후 멘토링에 대한 피드백과 함께 예약을 마무리합니다
    • 해당 요청은 멘토링에 관련된 멘티만 요청할 수 있습니다.
    • 요청이 가능한 상태는 멘토가 멘토링에 대한 피드백을 작성하고 멘티의 피드백을 기다리는 PENDING 입니다.
    • API를 요청할 때는 Feedback 을 작성해야하며, 이 관련 내용이 해당 요청의 body 에 포함됩니다.
    • 이후 예약의 상태는 COMPLETE가 됩니다.

[Bug] pm2 log쌓이는 문제

Description

  • 따로 사용중인 winston logger 이외에 pm2 log가 /root/.pm2 에 쌓이고있습니다.

해결방법

  1. 윈스톤 로거 사용중이므로 pm2의 log 기능 비활성화
  2. EFS에 따로 연동하기

2023.07.06 이슈

  1. 로그인 성공시 uId 같이 반환하게
  2. 멘토와 멘티의 상태를 보여 줄 필요가 있어서 User안에 reservation 컬럼이 필요하다고 생각(Mentore, Mentee도 나눠야함)
  3. User에 MenteeRate, MentorRate가 필요할 것 같습니다! 물론 나중에 기능추가 해야하지만 나중을 위해서 만들어둘 필요가 있다고 생각합니다! ( 추후에 한번더 이야기하시죠! )
  4. User에 이번달 멘토링 횟수, 총 멘토링 횟수 컬럼이 필요합니다.

reservation 관련 문의가 있습니다!

현재 reservation을 Post를 하면 나오는 개체를 결국 나중에 상태를 업데이트하는것 까지는 알겠는데... 음,,,
Enroll을 가져와야하는 상황에서 저에게 reservation의 id들을 가지고 있지 않아서..?
User에 해당하는 reservation들을 가져올 수 없는 상황입니다!
지금 GetAll 같은경우는 현재 ADMIN만 가능하고,,, 음... 어떻게 해야할지 모르겠습니다 ...하하하
User에 해당하는 reservation 정보는 REQUEST와 ACCEPT, PENDING 인데 이걸 Uid로 검색하면 reservation[]로 받을 수 있는 라우팅이 따로 있을까요? 아니면 새로 만들어야하는 상황인가요?

@JuneParkCode

/users/${id} Response관련 문의

스웨거에 나와있는 자료로 DTO를 만들어보면

interface UserDefaultDto {
  id: number;
  email: string;
  nickname: string;
  profileImage: string;
  isMentor: boolean;
  role: string; // default: 'USER'
  createdAt: string;
  updatedAt: string;
  mentorProfile: {
    id: number;
    shortDescription: string;
    description: string;
    isHide: boolean;
    mentoringCount: number;
    createdAt: string;
    updatedAt: string;
    hashtags: HashtagResponseDto[];
    categories: CategoriesResponseDto[];
  };
}

이렇게 나와야하는데 지금 Response를 보면

{
  "id": 1,
  "email": "[email protected]",
  "nickname": "Rachel Huel",
  "profileImage": "https://cloudflare-ipfs.com/ipfs/Qmd3W5DuhgHirLHGVixi6V76LhCkZUz6pnFt5AJBiyvHye/avatar/961.jpg",
  "role": false,
  "creataAt": "2007-01-04T02:32:12.350Z",
  "updateAt": "2091-10-15T15:48:50.850Z",
  "objectId": "1",
  "mettorProfile": [
    {
      "id": 87,
      "shortDescription": "Dolore corporis aperiam magnam eaque doloribus. Modi animi animi. Eligendi nam modi facilis voluptatum. Eaque exercitationem fugiat et illum quasi quidem autem vel maiores. Veniam est illo numquam accusamus fugiat eaque quibusdam sed ea. Fuga in blanditiis.",
      "description": "eveniet",
      "creatAt": "2018-12-02T01:52:19.178Z",
      "updateAt": "2087-03-12T16:20:23.735Z",
      "objId": "1",
      "userId": "1"
    }
  ]
}

이렇게 주는데 조금 많이 다르기도하고, 그리고 mentorProfile이여야하는데 mettorProfile로 오타도 있습니다! ㅎㅎㅎ

User-Profile 관계 변경

⭐️ 멘토 프로필 생성

  • 기존
    • 기본값 → 멘토가 아님
    • 멘토 생성 버튼 클릭 이후 멘토 프로필 관련 데이터 생성
  • 변경
    • 기본값 → 멘토 프로필 관련 데이터 존재
    • 프론트엔드에서 토글로 private/public (off/on) 지정
      • 기본값 → private
      • 토글이 on 되면 프로필 수정 가능 및 프로필 공개
      • private 상태여도 관련 데이터는 보존함
      • isHide column을 통해서 통제함.

상세 변경 사항

DB

  • 제거
    • User.isMentor
  • 기본값 변경
    • MentorProfile.isHide = false

API

  • auth
    • 유저 생성 과정
      • MentorProfile이 함께 자동으로 생성되도록 변경
  • MentorProfile
    • isHide ON/OFF 과정 변경
  • DTO
    • user 관련된 모든 DTO 에서 isMentor 제거

AWS 아키텍처 구축

TODO

Route 53

ELB

  • #22
  • test Auto Scaling Group 생성(min/max 1개로) #22
  • ELB -> test ASG 연결 #22
  • Route53=> SSL 적용 #22
  • CodeDeploy용 test s3 bucket 생성 #22
  • CodeDeploy IAM Role #22

RDS

Code Deploy

  • CI/CD 를 위한 Code Deploy

다른 할 일이 있으면 추가 부탁드립니다.

[Fix] 유저가 email 변경하지 못하도록 변경

Description

  • User 는 email 알림을 받아야함. 우선은 이메일 인증보다는 항상 확인하게 되는 intra 기본 email을 사용할 수 있도록 함.
  • 현재 Email 변경이 api 를 통해 가능하기 때문에 이를 제한.

Todo

  • PATCH /Users 변경

reservation 관련된 문의

{
    "id": 0,
    "mentorId": 0,
    "menteeId": 0,
    "categoryId": 0,
    "requestMessage": "string",
    "status": "REQUESTED",
    "createdAt": "2023-07-06T08:03:03.773Z",
    "updatedAt": "2023-07-06T08:03:03.773Z",
    "hashtags": [
      {
        "id": 0,
        "name": "string"
      }
    ]
  }

현재 받는 DTO 인거 같은데 일단 배열로 받는다는건 알겠지만,

Enroll Page 구성중에 Mentor state, Mentee state를 작업하려고 하는 중에

URL/reservation/을 하면 Mentor, Mentee 개체를 주거나,
URL/reservation/mentor, URL/reservation/mentee 같은게 필요할 것 같습니다!

만약에 받더라도 status가 "ACCEPT", "REQUEST"만 받을 수 있게 하면 될 것 같습니다!

그리고 CANCEL에 대한 API, REQUEST API, ACCEPT API 가 필요할 것 같습니다!

[Bug] dev 환경 프론트 배포시 login이 안되는 문제

Description

  • localhost:3000/signin? 으로 넘어갑니다.

Solution

  • dev.42manito.com 으로 redirection 할 수 있도록 변경

Comment

  • 이전에 언급했던 내용인데, localhost 환경에서 작업하는걸 고려했던걸로 기억합니다.
  • redirection 되는 부분이 저거 밖에 없어서, front에서 아마 직접 token 주입하여 해결할 수 있을 것으로 보입니다.
  • 따라서, 기본적으로 redirection 은 dev.42manito.com 으로 할 수 있도록 해주세요.

[Feature] AWS SES 연동

#AWS SES

TODO

  • @42manito.com 으로 메일링
  • Production Level 로 승격 필요
    • 실제 Frontend 페이지가 나오고 설정할 수 있을 것으로 보임.
  • 기본 200 mail / 24h 이기 때문에, 업그레이드 요청 필요
  • 메일 발신을 위해서 IAM 설정 필요
  • 메일 수신 가능해야함 (별도 문의 메일등 수신을 위함)

Plan

  • 우선은 node mailer + 공용 이메일 서비스 사용
  • 제품 나오면 샌드박스에서 나오도록 요청하고, SES 와 연동해야함.
    • 샌드박스 내에서 @student.42seoul.kr 으로 메일이 가지 않음. (*인증되지 않음)

token 인증이 필요한 API 선정

현재 코드는 거의 모든 API 에서 무제한 접근이 가능합니다.
JWT Token 인증 후 접근해야하는 API 선정이 필요합니다.

제안

  • PATCH, POST 처럼 변경하는 API들에 대해서 Guard 가 필요함.
  • 본인의 요청만 수행해야하는 API를 따로 분류하고 수정해야함.

[BUG]: mentor completion 이 안되는 문제

문제

  • async completeReservationByMentor(
    reservationId: number,
    userId: number,
    role: string,
    payload: ReservationCompleteAsMentorPayloadDto,
    ) {
    return this.prismaService.$transaction(async (prisma) => {
    const reservation = await prisma.reservation.findUnique({
    where: { id: reservationId },
    });
    if (!reservation || reservation.status !== ReservationStatus.ACCEPT)
    throw new BadRequestException('invalid reservation for mentor_completion');
    if (role !== UserRole.ADMIN && reservation.mentorId !== userId)
    throw new UnauthorizedException('user is not mentor of this reservation');
    await prisma.mentorFeedback.create({
    data: {
    reservationId: reservationId,
    menteeId: reservation.menteeId,
    mentorId: reservation.mentorId,

  • Line 251

정상 작동

  • ACCEPT 상태가 아닌, MENTEE_FEEDBACK 상태로 제한해야합니다.

Pagination 을 지원할 수 있는 API Response

@koreanddinghwan

프론트쪽 개발을 하다보니.. Pagination 을 하는데 현재 API 응답 방식에 문제가 있다는 걸 알게됐습니다.

take / page 를 통해서 백엔드에서는 알아서 response 를 해주고 있는데요.
응답을 받는 입장에서는 총 몇 페이지가 있는지 알 수가 없습니다.

그래서
< 1 2 3 4 5 >
이런 형태로 구현하는게 애매하더라구요.

다른 사이트의 response 를 살펴보니

content : {
  ...
}
page : {
  requestSize : 20,
  requestPage : 2,
  totalPage : 3,
  currentPage : 2,
  isLast: false
}

이런 식으로 response 가 오더라구요.

home 의 경우에는 무한스크롤로 해결할 수 있었으나, 예약 정보를 모아두는 페이지에서는 pagination 이 필요해보입니다.
(home 에서도 페이지로 할 수 있으면 좋을 것 같기도 하구요..)
전체적으로 적용을 해봐야할지... 아니면 일부분 ( Reservation 관련 부분) 만 적용을 해야할지 한번 이야기를 해봐야할 것 같습니다.

[Feature] profile description scheme 변경

Description

https://github.com/orgs/manito42/discussions/133#discussion-5638282 에서 언급된 API수정사항입니다.

  • profile description dto/scheme 변경

Todo

  • dto 수정
  • scheme 변경

**etc**

1.

dto의 minlength 0으로 변경.

  • dto에 description이 없는 경우, 무시
  • description이 undefined 인 경우, 무시
  • description이 null 인 경우, database상에 null로 업데이트.
  • description이 "" 인 경우, ""로 업데이트됩니다.

문제상황

제가 알기론, database에서 NULL의 사용을 지양해야하는 이유가, 값이 상태가 애매모호 하기때문으로 알고 있습니다.
저희의 경우에는 NULL이 초기상태인지/사용자가 입력 빈 상태를 원하는건지/NULL과 ""의 의미 차이가 모호하기 때문인 것 같습니다.

해결



2.

scheme의 default value를 ''로 변경.

문제

TEXT에 default value할당불가

Error: P3018

A migration failed to apply. New migrations cannot be applied before the error is recovered from. Read more about how to resolve migration issues in a production database: https://pris.ly/d/migrate-resolve

Migration name: 20230917160953_feature_change_profile_description_95

Database error code: 1101

Database error:
BLOB, TEXT, GEOMETRY or JSON column 'description' can't have a default value

Please check the query number 1 from the migration file.

관련 글

https://stackoverflow.com/questions/3466872/why-cant-a-text-column-have-a-default-value-in-mysql

해결

  • user login시, profile의 description value를 같이 insert

[Bug] 배포 과정에서 prisma migration 이 진행되지 않는 문제

문제

  • CodeDeploy 를 통한 배포 과정에서 migration이 실패함.

에러 구문

image

원인 분석

  • prisma/prisma#15881
  • codedeploy 에 소스 파일을 올리는 과정에서 s3 로 zip 파일을 압축 / 전송하는데, 압축 과정에서 symlink 가 일반 디렉터리 취급을 받음.
    • 위 문제는 azure / github-action 에서 보고된 문제
    • github action instance 를 통해서 압축이 진행되기 때문에 발생한 문제로 보임

해결 방안

  • zip 과정에서 symlink를 보존할 수 있도록 변경해야함.
  • AWS CLI 를 통해서 deploy push를 하고, 이 과정에서 zip 파일이 생성되므로 해당 과정을 변경해야함
    • source -> zip -> push
    • source-> push (option 변경)
    • 두 가지 안 중 하나로 변경해야함.
  • 1안의 경우 prisma/prisma#15881 (comment) 를 사용해야함
  • 2안의 경우 AWS CLI 옵션을 뒤져봐야할 듯함.

MentorProfile - user 1:1 관계로 변경

현재는 다중 프로필을 고려하여 1:n 구조를 가지고 있음. 이를 1:1 구조를 가지도록 변경하고 mentor profile 을 user 의 정규화된 데이터 테이블로 이용하도록 함.

  • 수정 필요
  • id parameter 를 받고 검색하는 경우, userId 를 기반으로 검색하도록 함.

[TODO] /home 에 카테고리 관련 쿼리 추가

Description

image
  • 여기서 쓸 쿼리가 필요합니다.
  • 카테고리별로 분류하여 멘토 리스트를 들고와야합니다.

Todo

  • ?categories={id} 로 요청을 하면 해당 카테고리에 해당되는 멘토 리스트를 가져옵니다.
  • id === 0 일 경우, 모두 가져옵니다. (이게 조금 애매한 것 같은데, 프론트에서는 이게 편합니다.)

[Feat] 이미지 서버 / 이미지 업로드 개발

Description

  • 프로필 사진을 변경하기 위한 이미지 업로드 기능을 개발합니다.

Todo

  • S3 Bucket 을 통한 이미지 업로드
  • 로그인된 유저에 대해서만 업로드 가능
  • 이미지 파일 크기 제한 (~5MB)
  • s3 이미지 주소 반환

Comment

  • 급하지는 않고, 여유 있을 때 기능 추가해두려고합니다.

[Feature] e-mail 알림

알람

e-mail

  • 이메일을 통한 알림 서비스
  • #34 에서 발생하는 알림에 대한 모듈 작성
  • nodemailer 를 사용하여, 필요한 메일 작성
  • mail form 작성 필요
    • 각 reservation 경우에 대해서 form 작성
    • 가입 시 이메일 확인 필요(?)

이벤트 모듈화

  • Event 기능을 활용하여 event 발생시 메일링을 할 수 있도록 함

유저 이메일 수정 관련

  • 유저는 이메일을 수정할 수 있어야함. 관련 api 작성 필요
  • 수정 시 확인 절차가 필요함. -> 수정 요청 -> 이메일을 통한 확인 -> 수정완료

Route 53 도메인 설정

TODO

Route 53

  • vercel 에 register 된 Domain AWS 로 네임서버 이전
  • api.42manito.com -> api 서버로 활용
  • 42manito.com -> 메인 프론트 페이지
  • api.dev.42manito.com -> 개발 API 서버
  • dev.42manito.com -> 개발 프론트

EC2

  • 개발용 / 배포용 구분

ELB (Application Load Balancer)구축

ELB

DEV / PRODUCTION

  • dev
  • production

Auto Scaling

  • Desire : 1
  • Min : 1
  • Max : 2
  • Template -> node 18.16 / Code deploy
  • private subnet

Network

  • Public Subnet
  • Target => Auto scaling group

CHECK

  • DONE

[Bug] query 의 page 비정상 작동

Description

  • GET /home?take=12&page=0 과
  • GET /home?take=12&page=1 이 담고 있는 리스트가 같은 것 같습니다.
    • *현재 랜덤하게 내보내어 정확히 확인은 안되나, 같은 프로필이 긁히는 것 같음.
  • 이게 조금 이상한게 take 1 상황에서는 다릅니다.
  • take 2 했을 때 결과도 이상한데, take 1 page 0, 1 에서 나오는 결과와 다릅니다.
  • 아무래도 UpdatedAt 이 같은 객체들이 많아서 발생하는 문제 같은데, 조금 더 깊게 파봐야할 것 같습니다.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.