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 : Readme 게시물 통계 조회 관련 내용 추가 #43

Merged
merged 2 commits into from
Oct 31, 2023
Merged
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
55 changes: 42 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,20 +47,28 @@ Get Your Feeds는 소셜 미디어 통합 Feed 서비스입니다.

### 2️⃣ 통계(Statistics)

| 필드 | 속성 | 설명 | 예시 값 |
| ---- | ---- | ---- | ------- |
| | | | |
| 필드 | 속성 | 설명 | 예시 값 |
| ------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
| contentId | string | 게시물이 속한 SNS에서 관리하는 고유 게시물 인식 값입니다. | |
| snsType | enum | SNS 채널 이름입니다. <br> 가능한 값은 "facebook", "twitter", "instagram", "threads" 입니다. | |
| hashtags | string[] | 게시물이 가지고 있는 해시태그(string)의 배열입니다. | ['apple','mobile','WWDC'] |
| viewCountByDate | enum[] | 게시물의 일자별 조회수를 담고있는 배열입니다. 일자별 게시물 조회 수를 집계할 때 사용합니다. enum의 타입은 {count:number, measurementDate:Date}[] 입니다. | [{count: 10, measurementDate:2023-01-01T00:00:01.991Z }, {count: 65, measurementDate:2023-01-02T00:00:01.991Z }] |
| likeCountByDate | enum[] | 게시물의 일자별 좋아요 수를 담고있는 배열입니다. 일자별 게시물 좋아요 수를 집계할 때 사용합니다. enum의 타입은 {count:number, measurementDate:Date}[] 입니다. | [{count: 10, measurementDate:2023-01-01T00:00:01.991Z }, {count: 65, measurementDate:2023-01-02T00:00:01.991Z }] |
| shareCountByDate | enum[] | 게시물의 일자별 공유 수를 담고있는 배열입니다. 일자별 게시물 공유 수를 집계할 때 사용합니다. enum의 타입은 {count:number, measurementDate:Date}[] 입니다. | [{count: 10, measurementDate:2023-01-01T00:00:01.991Z }, {count: 65, measurementDate:2023-01-02T00:00:01.991Z }] |
| articleCreationDate | Date | 게시물이 생성된 시간입니다. 기간별 게시물 생성 수를 집계할 때 사용합니다. | [{count: 10, measurementDate:2023-01-01T00:00:01.991Z }, {count: 65, measurementDate:2023-01-02T00:00:01.991Z }] |

- hashtags와 measurementDate로 일정 기간동안의 게시물 조회 수, 좋아요 수, 공유 수 read와 write(create, update)가 자주 진행되므로 복합 인덱스를 생성하였습니다.
- hashtags와 articleCreationDate로 일정 기간동안의 게시물 생성 수로 read가 자주 진행되고 지속해서 write(create)되는 많은 양의 도큐먼트를 빠르게 조회하기 위해 복합 인덱스를 생성하였습니다.

<br>

### 3️⃣ 사용자(User)

| 필드 | 속성 | 설명 | 예시 값 |
|------------------|-------------------------------------------------|------------------------|----------------------------------------------|
| email | `unique: true` | 사용자의 이메일 주소 | "[email protected]" |
| password | | 사용자의 비밀번호 | "SecureP@ssw0rd1" |
| connectedServices| `Array of { service: String, accountTag: String }` | 연결된 소셜 미디어 서비스들 | [{ service: "twitter", accountTag: "@user" }] |

| 필드 | 속성 | 설명 | 예시 값 |
| ----------------- | -------------------------------------------------- | --------------------------- | --------------------------------------------- |
| email | `unique: true` | 사용자의 이메일 주소 | "[email protected]" |
| password | | 사용자의 비밀번호 | "SecureP@ssw0rd1" |
| connectedServices | `Array of { service: String, accountTag: String }` | 연결된 소셜 미디어 서비스들 | [{ service: "twitter", accountTag: "@user" }] |

<br>

Expand Down Expand Up @@ -204,15 +212,36 @@ project-root

---

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

#### 1. 게시물 통계 데이터 조회 : 해시태그(hashtag)로 검색된 게시물의 시계열 통계 지표(게시물 생성, 조회, 좋아요, 공유 등의 수)를 조회 할 때 사용되는 API
#### 1. 게시물 통계 데이터 조회

**Endpoint:** `GET /articles`
**Endpoint:** `GET /statistics/articles`
**Method:** `GET`
**Description:** Retrieve statistics for articles over a specific period.
**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)를 선택할 수 있습니다.||

**Response:** `GetArticleStatisticsResDto`
| field | 속성 | 설명 |예시|
| --- | --- | --- | --- |
|isExistData|boolean|요청한 데이터가 해당 기간에 존재하는지에 대한 유무입니다.||
|data|IGetArticleStatisticsData[]|요청한 데이터의 값 배열입니다.|[ { date: '2023-09-15T00:00:00.000Z', likeCount: 8 },{ date: '2023-09-15T08:00:00.000Z', likeCount: 1 },{ date: '2023-09-15T12:00:00.000Z', likeCount: 2 }]|

<details>
<summary>Request/Response Flow</summary>
<div>
- 요청 dto(GetArticleStatisticsDto)에서 query가 요구사항에 부합하는 값을 보냈는지를 검증합니다.
- 하나의 api로 다양한 쿼리가 가능하도록 쿼리 필드의 값에 따라 쿼리가 자동 생성되는 OperatorFactory를 레포지토리 레이어에 함수로 작성하였습니다. OperatorFactory 함수에서 만들어진 operator로 mongoose의 aggregate(집계)메소드가 실행되며 통계 데이터를 데이터베이스에서 조회합니다.
- 응답 dto(GetArticleStatisticsResDto)에서, 데이터베이스에서 조회된 값을 클라이언트가 값을 조회하기 쉽도록 가공합니다.

<br>

---

Expand Down