Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Docs: User Readme 통합 작성 #48

Merged
merged 8 commits into from
Nov 1, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
129 changes: 86 additions & 43 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,12 @@ project-root

#### 1. 게시물 목록 조회 : Feed에 나타나는 게시물 목록 조회 API

<<<<<<< HEAD
**Endpoint:** `GET /articles`
**Method:** `GET`
**Description:** Fetch a paginated list of articles.
**Query Parameters:** RequestPaginatedQueryDto (pagination parameters)
=======
**Endpoint:** `GET /articles`
**Method:** `GET`
**Description:** Fetch a paginated list of articles.
Expand All @@ -171,18 +177,36 @@ project-root
- `type`: SNS type (facebook, twiiter, threads, instagram)
- `hashtag`: 게시물이 가진 해쉬태그 중 하나

>>>>>>> 43d2270dc7482444d72ee2e6a1842233a9de4ef0
**Response:** `Page<GetArticleResDto>`

<br>

#### 2. 게시물 상세 조회 : 게시물 목록 클릭 시, 사용되는 게시물 상세 내용 조회 API

<<<<<<< HEAD
**Endpoint:** `POST /articles`
**Method:** `POST`
**Description:** Create a new article.
**Request Body:** `CreateArticleDto`
**Response:** The content ID of the created article as a string.
=======
**Endpoint:** `GET /articles/:contentId`
>>>>>>> 43d2270dc7482444d72ee2e6a1842233a9de4ef0

**Method:** `GET`

**Description:** 유저가 게시물을 클릭 시 view_count 가 1 증가하고 게시물의 모든 필드 값을 확인하는데 사용되는 API

<<<<<<< HEAD
**Endpoint:** `GET /articles/likes/:contentId`
**Method:** `GET`
**Description:** Send a like to an article by its content ID.
**Path Parameters:**

- `contentId`: The content ID of the article.
**Response:** The content ID of the liked article as a string.
=======
**Path Parameters:**

- `contentId`: 게시물의 Content ID.
Expand All @@ -203,24 +227,36 @@ project-root
| shareCount | number | 해당 게시물의 공유수 | 10 |

- response status 404 (해당 게시물이 존재하지 않을시)
>>>>>>> 43d2270dc7482444d72ee2e6a1842233a9de4ef0

<br>

#### 3. 게시물 좋아요 생성 : 게시물 목록 또는 상세에서 게시물 좋아요 클릭 시 사용되는 API

**Endpoint:** `GET /articles/:contentId`
**Method:** `GET`
**Description:** Fetch a specific article using its content ID.
**Endpoint:** `GET /articles/:contentId`
**Method:** `GET`
**Description:** Fetch a specific article using its content ID.
**Path Parameters:**

<<<<<<< HEAD
- `contentId`: The content ID of the article.
**Response:** `GetArticleDetailResDto`
=======
- `contentId`: The content ID of the article.
**Response:** `contentId`
>>>>>>> 43d2270dc7482444d72ee2e6a1842233a9de4ef0

<br>

#### 4. 게시물 공유 생성 : 게시물 목록 또는 상세에서 공유하기 클릭 시 사용되는 API

**Endpoint:** `POST /articles/share`
<<<<<<< HEAD
**Method:** `POST`
**Description:** Send a share notification for an article by its content ID.
**Request Body:** `CreateArticleShareDto`
**Response:** None (void).
=======

**Method:** `POST`

Expand Down Expand Up @@ -260,10 +296,28 @@ project-root

- response status 200, None(void)
- response status 400 (SNS 타입 잘못 입력 시)
>>>>>>> 43d2270dc7482444d72ee2e6a1842233a9de4ef0

---

### 게시물 통계(Statistics)
<<<<<<< HEAD

#### 1. 게시물 통계 데이터 조회

**Endpoint:** `GET /statistics/articles`
**Method:** `GET`
**Description:** 해시태그(hashtag)로 검색된 게시물의 시계열 통계 지표(게시물 생성, 조회, 좋아요, 공유 등의 수)를 조회 할 때 사용되는 API
**Query Parameters:** `GetArticleStatisticsDto`
| query | 속성 | default(미입력 시 값) | 설명 |예시|
| --- | --- | --- | --- |---|
| hashtags | string[] | sns의 계정태그 | 게시물 통계 검색을 희망하는 해시태그(string)입니다. 여러개의 해시태그를 검색하는 경우 공백(white space) 없이 컴마(,)로 구분합니다. <br> 해시태그를 보내지 않는 경우, 유저의 계정태그(accountTag)로 검색됩니다.'|'apple,mobile,WWDC'|
| periodType | string (열거형) | 필수 값 | 게시물 통계 검색 시 설정하는 조회 기간 유형입니다. 열거형으로 'date','hour'입니다. <br> 1시간 단위 검색은 hour이며 1일 단위 검색은 date입니다. ||
| startDate | date | 오늘로 부터 7일전 | periodType이 hour일 때, 조회 기간의 시작 "시간"이 되며, periodType이 date일 때, 조회 기간의 시작"일자"가 됩니다. <br> periodType이 date일 경우 시작 일자의 시간은 생략할 수 있습니다. ||
| endDate | date | 오늘 | periodType이 hour일 때, 조회 기간의 끝 "시간"이 되며, 최대 7일을 조회할 수 있습니다. periodType이 date일 때, 조회 기간의 끝 "일자"가 되며, 최대 30일을 조회할 수 있습니다. <br> periodType이 date일 경우 끝 일자의 시간은 생략할 수 있습니다.||
| value | enum | count |'어떤 통계 지표를 검색 할 지 선택하는 값 입니다. 게시물 수(count), 게시물 조회수(viewCount), 게시물 좋아요 수(likeCount), 게시물 공유 수(s hareCount)를 선택할 수 있습니다.||

=======

#### 1. 게시물 통계 데이터 조회

Expand All @@ -279,6 +333,7 @@ project-root
| endDate | date | 오늘 | periodType이 hour일 때, 조회 기간의 끝 "시간"이 되며, 최대 7일을 조회할 수 있습니다. periodType이 date일 때, 조회 기간의 끝 "일자"가 되며, 최대 30일을 조회할 수 있습니다. <br> periodType이 date일 경우 끝 일자의 시간은 생략할 수 있습니다.||
| value | enum | count |'어떤 통계 지표를 검색 할 지 선택하는 값 입니다. 게시물 수(count), 게시물 조회수(viewCount), 게시물 좋아요 수(likeCount), 게시물 공유 수(s hareCount)를 선택할 수 있습니다.||

>>>>>>> a42008441c0a1d67f5036d8e8bdf30b51e96e76f
**Response:** `GetArticleStatisticsResDto`
| field | 속성 | 설명 |예시|
| --- | --- | --- | --- |
Expand All @@ -300,62 +355,36 @@ project-root

#### 1. 사용자 회원가입 요청 : 사용자 회원가입 요청에 사용되는 API. 회원가입 요청 이후 6자리의 랜덤한 코드가 입력한 이메일로 발송됩니다.

**Endpoint:** `POST /register`
**Method:** `POST`
**Description:** Register a new user.
**Request Body:** `RegisterUserDto`
**Response:** None (void).
**Endpoint:** `POST auth/register`
**Method:** `POST`
**Description:** Register a new user.
**Request Body:** `RegisterUserDto`
**Response:** Status 200 code

<br>

#### 2. 사용자 가입 승인 : 사용자 회원 가입 요청을 승인하는 API. 회원 가입 요청자의 이메일로 전송된 코드와 사용자 정보를 검증하여 가입 승인 처리합니다.

**Endpoint:** `POST /verify`
**Method:** `POST`
**Description:** Verify a user's email with a code.
**Request Body:**
**Endpoint:** `POST auth/verify`
**Method:** `POST`
**Description:** Verify a user's email with a code.
**Response:** Status 200 code

- `email`: The user's email.
- `code`: The verification code.
**Response:** None (void).
- `code`: The verification code.

<br>

#### 3. 사용자 로그인 : 사용자가 계정, 비밀번호로 로그인 시 엑세스 토큰(JWT)을 발급하는 API

**Endpoint:** `POST /login`
**Method:** `POST`
**Description:** Authenticate and login a user.
**Request Body:** User credentials.
**Endpoint:** `POST auth/login`
**Method:** `POST`
**Description:** Authenticate and login a user.
**Request Body:** User credentials.
**Response:** HTTP 200 status code with an Authorization header containing the Bearer token.

<br>

## User Operations

### 1. Create User

**Endpoint:** `POST /`
**Method:** `POST`
**Description:** Create a new user.
**Request Body:**

- `email`: The user's email.
- `password`: The user's password.
- `service`: The service associated with the user.
- `userHashtag`: The user's hashtag.
**Response:** None (void).

<br>

### 2. Get User by Email

**Endpoint:** `GET /`
**Method:** `GET`
**Description:** Fetch a user using their email.
**Request Body:** `email` - The user's email.
**Response:** The email of the fetched user as a string.

---

## 🏁 마무리와 배운 점
Expand All @@ -370,6 +399,19 @@ project-root

- 개선할 점 : 처음 팀이 구성되고 바로 프로젝트에 들어가다보니 기능 구현을 위한 역할 분담은 되었지만 그외에 많은 것들이 팀장님 어께 위로 얹혀진 것 같아 미안했다 ㅠ. 이제 한 번 프로젝트를 해보았으니 프로젝트를 진행할 때 어떤 역할들이 필요하고 그것들을 각자 잘 분담하면 그 짐을 같이 나눠 짊어질 수 있을 것 같다. 그리고 개인적으로 요구사항 분석을 처음에 제대로 하지 못해, 많은 변경이 생겼다. 처음에는 통계 데이터를 저장할 도큐먼트가 필요 없을 것으로 생각했으나 실제 기능 구현을 위해 요구사항 분석을 해보니 필요했었다. 앞으로 요구사항을 처음에 확실히 분석하고 정리하면 이런 일은 없을 것 같다.

<<<<<<< HEAD
### 상운

- NestJS의 적응 과정 : 처음에는 NestJS의 구조화된 접근 방식이 Express의 자유도에 비해 불편하게 느껴졌다.단순한 개발을 넘어서 구조 자체를 이해하는 데에도 시간이 소요되었다. 그러나 프로젝트 구조에 익숙해지며 NestJS의 장점을 점차 느끼게 되었다. 특히 유지 보수의 관점에서 보면, 지나치게 높은 자유도는 오히려 관리의 어려움을 초래할 수 있다는 것을 깨달았다. 이 과정에서 Guard와 같은 NestJS Enhancers의 중요성에 대해 학습하게 되었다.

- 팀원 간의 커뮤니케이션 중요성 : 프로젝트를 진행하면서 커뮤니케이션의 중요성을 깊게 깨달았다. 단순한 말로의 전달은 상대방에게 100% 정확히 도달하지 않는 경우가 많았다. 그것보다는 그림이나 코드를 통한 소통은 훨씬 더 명확하고 효율적이라는 것을 느꼈다. 초기에는 빠르게 진행되는 것처럼 보이는 커뮤니케이션이 나중에 잘못된 이해로 인해 큰 시간과 비용을 소모할 수 있다는 것을 경험했다. 특히 이번 프로젝트에서는 Service 로직에 JWT 관련 코드를 구현했으나 완전히 반영되지 않는 문제점에 직면했다. 추가로, JWT 사용 전략의 차이로 인해 코드 충돌이 발생하여 그 해결에도 상당한 시간과 노력이 소요되었다.

### 호준

- 유저와 인증을 분리해서 개발해본 경험 : 인증은 이번 프로젝트 말고도 다른 프로젝트에서 매번 맡아 진행했고, Oauth2.0, Refresh Token, 세션인증방식 여러가지 해보았다고 자신했던 부분이지만, 정작 이번 프로젝트에서는 소통의 문제로 서로 어려운 길을 가게 되었다. NestJS의 Guard와 Strategy 개념은 나름, 익숙하게 잘 개발했던 것 같다. 다만, 협업하는 개발자와 소통의 부재로, 다른 JWT 전략을 구사하는 등. 이번 기회로, 코드를 개발을 잘하는 것보다 소통하며 개발해야겠다는 생각이 들게 되었던 경험이다.

- MongoDB의 정규화 / 비정규화 모델 : NoSQL로 대부분의 프로젝트를 개발했던 경험이 있지만, 팀원들과 소통할 때 비정규화, 정규화를 이 개념을 어떻게 설명해야할 지 몰라서 찾아보았다. 이 모델링의 개념을 실제로 프로젝트에서 어떤 개념인지 자세하게 모르고 모델링을 했었는데, 이번 기회에 짚고 넘어갈 수 있었다.
=======
### 연규

- 좋았던 점 : MongoDB를 사용해서 쿼리하고 페이지네이션을 해볼 수 있다는 점에서 좋았고,
Expand All @@ -378,3 +420,4 @@ project-root
- 알게된 점 : MongoDB에서 쿼리할 때 방법과 nest에서 pagination, query 파라미터 사용 방법에 대해 다시 알게 되었다. git 브랜치로 병합할 때 conflict를 해결하는 방법도 알게 되었다.

- 개선할 점 : 논의하는데 시간이 많이 들어가서 기능을 개발하는데 들어가는 물리적인 시간이 부족했던 것 같다. 효율적인 회의 프로세스로 개선해야할거같고 대화보다는 글이나 그림 정리해서 공유하는 것이 더 빠르게 서로를 이해할 수 있겠다는 생각이 들었다. 희의 전에 그림으로 요구사항을 분석하고 논의하는 것도 중요할 거 같다.
>>>>>>> 43d2270dc7482444d72ee2e6a1842233a9de4ef0
7 changes: 0 additions & 7 deletions src/user/user.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,6 @@ export class UserController {
return;
}

@Get()
async getUserByEmail(@Body('email') email: string) {
const existingUser = await this.userService.getUserByEmail(email);

return existingUser.email;
}

@UseGuards(JwtAuthGuard)
@Get('account-tags')
async getAllAccountTags(@GetUser() user: User): Promise<string[]> {
Expand Down