From 05452b46b8005daaa5788d01e01527a371985ce5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E1=84=8C=E1=85=B5=E1=84=8E=E1=85=A1=E1=86=AB=E1=84=80?=
=?UTF-8?q?=E1=85=B2?=
Date: Mon, 6 Mar 2023 00:27:02 +0900
Subject: [PATCH] =?UTF-8?q?docs:=20Readme=20=EC=97=85=EB=8D=B0=EC=9D=B4?=
=?UTF-8?q?=ED=8A=B8,=20settings=20default=EA=B0=92=20=EC=88=98=EC=A0=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.env_sample | 5 +-
README.md | 133 +++++++++++++++++++++++++++--------------------
conf/settings.py | 24 +++++++--
3 files changed, 97 insertions(+), 65 deletions(-)
diff --git a/.env_sample b/.env_sample
index ee112d9..eaf5bd3 100644
--- a/.env_sample
+++ b/.env_sample
@@ -8,8 +8,7 @@ DB_USERNAME="root"
DB_PASSWORD="root"
SLACK_TOKEN=""
-SLACK_CHANNEL=""
-BOT_NAME=""
+BOT_NAME="heymojiBOT"
ERROR_CHANNEL=""
SPECIAL_EMOJI="trophy" # ๐
@@ -24,5 +23,5 @@ ALLOWED_EMOJI_TYPES='[
{"emoji": "๐๏ธ", "emoji_names": ["trophy", "ํธ๋กํผ"]}
]'
-RANK_URL=""
+RANK_URL="http://127.0.0.1:8080/"
DEFAULT_AVATAR_URL=""
diff --git a/README.md b/README.md
index 924cbed..b2acade 100644
--- a/README.md
+++ b/README.md
@@ -2,9 +2,16 @@
+
+
+
# Hey + Emoji = Heymoji
+
### ๊ฐ๋ฐ์์ ํ๋ง๋ ๐จ๐ปโ๐ป
-๋งํฌ๋์ธ์์ ๋งคํ ๋ฉค๋ฒ๋ค์ด ์๋ก ํ ๋งํ ๋ฅผ ์ฃผ๋ ์ด์ ๋? ๋ผ๋ ๊ธ์ ์ฝ๊ณ , ์ฌ๋ ์ด๋ชจ์ง(Emoji)๋ก ๋ฉค๋ฒ๋ค์๊ฒ ``์นญ์ฐฌ``์ด๋ ``๋ฆฌ์คํ`` ํ ์ ์๋ ๋ฌธํ๊ฐ ์๊ธด๋ค๋ฉด ์ฌ๋ฐ๊ธฐ๋ ํ๊ณ ๊ณ ๋ง์๋ ํํํ ์ ์์ ๊ฒ ๊ฐ์์ต๋๋ค.
+
+๋งํฌ๋์ธ์์
+๋งคํ ๋ฉค๋ฒ๋ค์ด ์๋ก ํ ๋งํ ๋ฅผ ์ฃผ๋ ์ด์ ๋? ๋ผ๋ ๊ธ์ ์ฝ๊ณ , ์ฌ๋ ์ด๋ชจ์ง(Emoji)๋ก ๋ฉค๋ฒ๋ค์๊ฒ ``์นญ์ฐฌ``์ด๋ ``๋ฆฌ์คํ`` ํ ์ ์๋ ๋ฌธํ๊ฐ ์๊ธด๋ค๋ฉด ์ฌ๋ฐ๊ธฐ๋ ํ๊ณ ๊ณ ๋ง์๋ ํํํ ์ ์์ ๊ฒ
+๊ฐ์์ต๋๋ค.
๊ทธ๋์ ์ด๋ฐ ์ฌ๋ฏธ๋ ๊ธฐ๋ฅ์ ์คํ์์ค๋ก ๊ณต๊ฐํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค๊ณ ์๊ฐํด์ ํ ์ด ํ๋ก์ ํธ๋ก ๋ง๋ค์ด ๋ณด์์ต๋๋ค.
(๊ทผ๋ฐ Nodejs๋ก ๋ง๋ค์ด์ง๊ฒ ์ด๋ฏธ ์์๋ค์ heyburrito)
@@ -13,19 +20,22 @@ FastAPI์ ๊ตฌ์กฐ๋ ํ๋ก์ ํธ ๊ด๋ จ๋ ์ถ๊ฐ๊ธฐ๋ฅ, ๊ฐ์ ์ฌํญ `PR`์
-## ๐ ๊ฐ์
+## ๐ ๊ฐ์
+
-`Heymoji` API์๋ฒ๋ `Python 3.10`, `FastAPI` ๋ก ๊ฐ๋ฐ๋์์ต๋๋ค.
+`Heymoji` API์๋ฒ๋ `Python 3.10`, `FastAPI` ๋ก ๊ฐ๋ฐ๋์์ต๋๋ค.
๊ทธ ์ธ ๋ฒ์ ์์ ํจํค์ง ๋ฐ ๋์์ ๋ํ ํธํ์ ๋ณด์ฅํ์ง ์์ต๋๋ค. (๊ทผ๋ฐ ๊ฑฐ์ ๋ค ๋ ๊ฑฐ์์ python3.7 ์ด์์ด๋ฉด...์๋ง๋~๐ )
ํ๋ก ํธ์๋๋ `vuejs`๋ฅผ ์ฌ์ฉํด์ ๊ฐ๋จํ ๋ง๋ค์ด ๋ดค์ต๋๋ค!
-## ๐ ํ๋ก์ ํธ ๊ตฌ์กฐ
-์ฒ์ `Heymoji`๋ฅผ ๊ฐ๋ฐํ ๋๋ DDD ๊ตฌ์กฐ๊ฐ ์๋์์ต๋๋ค.
-DDD์ ๋ํ ์คํฐ๋๋ฅผ ์ํด ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ์ผ๋ฉฐ https://github.com/Ermlab/python-ddd ๋ฅผ ์ฐธ๊ณ ํ์์ต๋๋ค.
+## ๐ ํ๋ก์ ํธ ๊ตฌ์กฐ
+
+์ฒ์ `Heymoji`๋ฅผ ๊ฐ๋ฐํ ๋๋ DDD ๊ตฌ์กฐ๊ฐ ์๋์์ต๋๋ค.
+DDD์ ๋ํ ์คํฐ๋๋ฅผ ์ํด ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ์ผ๋ฉฐ https://github.com/Ermlab/python-ddd ๋ฅผ ์ฐธ๊ณ ํ์์ต๋๋ค.
๋ค์ ๋ณต์กํ ์ ์์ผ๋ ์ถํ ์ ์ง๋ณด์์ ์ฌ๋ฌ ์ํ๋ณ๊ฒฝ์ด ์ผ์ด๋๋ ๊ฒฝ์ฐ DDD๊ฐ ์ข ๋ ์ ์ฐํ ๊ฑฐ๋ผ๊ณ ์๊ฐํ์ต๋๋ค๐
+
```
โโโ apps
| โโ api
@@ -59,76 +69,91 @@ DDD์ ๋ํ ์คํฐ๋๋ฅผ ์ํด ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ์ผ๋ฉฐ https://github.com/E
-## ๐พ ์ธํ
+## ๐พ ์ธํ
+
`.env_sample`์ ์ฐธ๊ณ ํด์ `.env`ํ์ผ์ ์์ฑํฉ๋๋ค.
์ํ์๋ ์ธํ
์ผ๋ก ํ๊ฒฝ๋ณ์๋ค์ ์ธํ
ํฉ๋๋ค.
DB๋ `MySQL`์ ์ฌ์ฉํ๋ฉฐ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํด `aiomysql`๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํจ๊ป ์ฌ์ฉํฉ๋๋ค.
๋ค๋ฅธ DB ์ฌ์ฉํ๋ ค๋ฉด `config` ์ค์ ์ด ์กฐ๊ธ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค.
-| ์ด๋ฆ |์ค๋ช
|
-|---------------------|----|
-| ENV |๋ฐฐํฌํ๊ฒฝ ์ ์|
-| REACTION_LIST |์นํ
๋ฆฌ์ก์
์ผ๋ก ํ์ฉ๋ ์ด๋ชจ์ง(reaction)๋ค์ ์ ์ํฉ๋๋ค.|
-| ALLOWED_EMOJI_TYPES |ํธ๋ค๋งํ ์ด๋ชจ์ง๋ค์ ์ ์ํฉ๋๋ค.|
-| DAY_MAX_REACTION |ํ๋ฃจ ์ต๋ ์ฌ์ฉํ ์ ์๋ Reaction ๊ฐ์ (optinal)|
-| SLACK_TOKEN |์ฌ๋ ํ ํฐ|
-| BOT_NAME |์ฌ๋๋ด ์ด๋ฆ|
-| ERROR_CHANNEL |์ฌ๋ ์๋ฌ ๋ฆฌํฌํ
์ฑ๋|
-| DB_HOST |DB ํธ์คํธ|
-| DB_PORT |DB ํฌํธ|
-| DATABASE |DB ์ด๋ฆ|
-| DB_USERNAME |DB ์ ์ ์ ์ ๋ค์|
-| DB_PASSWORD |DB ํจ์ค์๋|
-| DEFAULT_AVATAR_URL |๊ธฐ๋ณธ ํ๋กํ ์ด๋ฏธ์ง URL|
+| ์ด๋ฆ | ์ค๋ช
|
+|-----------------------------------|-------------------------------------|
+| ENV | ๋ฐฐํฌํ๊ฒฝ ์ ์ |
+| ALLOW_ORIGINS | CORS๋ฅผ ํ์ฉํ ORIGIN ๋ฆฌ์คํธ |
+| DB_HOST | DB ํธ์คํธ |
+| DB_PORT | DB ํฌํธ |
+| DATABASE | DB ์ด๋ฆ |
+| DB_USERNAME | DB ์ ์ ์ ์ ๋ค์ |
+| DB_PASSWORD | DB ํจ์ค์๋ |
+| SLACK_TOKEN | ์ฌ๋ ํ ํฐ |
+| BOT_NAME | ์ฌ๋๋ด ์ด๋ฆ |
+| ERROR_CHANNEL | ์ฌ๋ ์๋ฌ ๋ฆฌํฌํ
์ฑ๋ |
+| SPECIAL_EMOJI | ํน๋ณํ ์๋ฏธ๋ฅผ ๊ฐ์ง ์ด๋ชจ์ง |
+| LIMIT_GIVE_COUNT_OF_SPECIAL_EMOJI | ํ๋ฃจ์ ๋จ๊ธธ์ ์๋ SPECIAL_EMOJI ์ต๋ ๊ฐ์ |
+| ALLOWED_REACTION_LIST | ์นํ
๋ฆฌ์ก์
์ผ๋ก ํ์ฉ๋ ์ด๋ชจ์ง(reaction)๋ค์ ์ ์ํฉ๋๋ค. |
+| ALLOWED_EMOJI_TYPES | ํธ๋ค๋งํ ์ด๋ชจ์ง๋ค์ ์ ์ํฉ๋๋ค. |
+| RANK_URL | ๋ญํน ์นํ์ด์ง URK |
+| DEFAULT_AVATAR_URL | ๊ธฐ๋ณธ ํ๋กํ ์ด๋ฏธ์ง URL |
-## ๐ณ Docker-Compose ์คํ
+## ๐ณ Docker-Compose ์คํ
+
`.env_sample`์ ์ฐธ๊ณ ํ์ฌ`.env`ํ์ผ์ ์์ฑํ ๋ค `docker-compose up -d` ๋ฅผ ์คํํฉ๋๋ค.
api, web, db ์ปจํ
์ด๋๊ฐ ๋ชจ๋ ์คํ ๋ ํ http://127.0.0.1:8080 ์ ์ ์ํ์ฌ ๋์์ ํ์ธํฉ๋๋ค.
โ๏ธ์ฃผ์: ์ปจํ
์ด๋๊ฐ ๋จ๊ณ ํจํค์ง ์ค์น์ ์๊ฐ์ด ๊ฑธ๋ฆด์ ์์ด์ ์ ํ๋ฆฌ์ผ์ด์
์คํ๊น์ง ๋ช๋ถ์ด ์์ ๋ ์ ์์ต๋๋ค.
-`docker-comopse` ์คํ ์ ์ README ํ๋จ์ ์๋ Slack Bot ์ค์ ์ ๋จผ์ ๋ณด์๊ณ `SlackToken` ๊ฐ์ ํ๊ฒฝ๋ณ์๋ฅผ ๋จผ์ ์ฃผ์
ํด์ฃผ์ธ์!
+`docker-comopse` ์คํ ์ ์ README ํ๋จ์ ์๋
+Slack Bot ์ค์ ์ ๋จผ์ ๋ณด์๊ณ `SlackToken` ๊ฐ์ ํ๊ฒฝ๋ณ์๋ฅผ ๋จผ์ ์ฃผ์
ํด์ฃผ์ธ์!
-## ๐ก ๋ก์ปฌ ์คํ
+## ๐ก ๋ก์ปฌ ์คํ
+
```
pip install -r requirements
```
+
`root๊ฒฝ๋ก`(/heymoji) ์ ๊ฐ์ uvicorn์ผ๋ก ์๋ฒ๋ฅผ ์คํ์ํต๋๋ค.
๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์คํํ๊ธฐ ์ํด์๋ `&`๋ฅผ ๋ง์ง๋ง์ ๋ถ์ฌ์ฃผ์ธ์.
+
```
uvicorn app.main:app --port 8080
```
+
๋ง์ฝ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ๋๊ณ ์๋ ํ๋ก์ธ์ค๋ฅผ ์ ๊ฑฐํ๊ณ ์ถ์ ๊ฒฝ์ฐ
+
```
1. ps aux | grep uvicorn
2. kill -9 {PID}
```
+
์๋ชป๋ ํ๋ก์ธ์ค kill์ ์ฃผ์ํ์ธ์!
-## ๐ API ๋ฌธ์ ๋ฐ ํ
์คํธ
-``HOST_URL/docs``๋ก ์ ์ํ๋ฉด ``Swagger``๋ก ๋ง๋ค์ด์ง web ํ์ด์ง๋ฅผ ํ์ธํ ์ ์์ต๋๋ค. (FastAPI๋ swagger, redoc ์ง์)
-
+## ๐ API ๋ฌธ์ ๋ฐ ํ
์คํธ
+
+``HOST_URL/docs``๋ก ์ ์ํ๋ฉด ``Swagger``๋ก ๋ง๋ค์ด์ง web ํ์ด์ง๋ฅผ ํ์ธํ ์ ์์ต๋๋ค. (FastAPI๋ swagger, redoc ์ง์)
+
+
+
-## ๐พ ์ฌ๋ ๋งจ์
๋ช
๋ น์ด
-|์ด๋ฆ|์ค๋ช
|
-|----|----|
-|help|์ปค๋ฉ๋ ๊ด๋ จ help|
-|create_user|user ์์ฑ|
-|update_user|user ์ ๋ณด ์
๋ฐ์ดํธ|
-|show_user|์ ์ is_display = True (๋
ธ์ถ)|
-|hide_user|์ ์ is_display = False (์จ๊น)|
-|show_best_member|ํด๋น์ ๋ฒ ์คํธ ๋ฉค๋ฒ ์ถ์ถ|
+## ๐พ ์ฌ๋ ๋งจ์
๋ช
๋ น์ด
+| ์ด๋ฆ | ์ค๋ช
|
+|------------------|----------------------------|
+| help | ์ปค๋ฉ๋ ๊ด๋ จ help |
+| create_user | user ์์ฑ |
+| update_user | user ์ ๋ณด ์
๋ฐ์ดํธ |
+| show_user | ์ ์ is_display = True (๋
ธ์ถ) |
+| hide_user | ์ ์ is_display = False (์จ๊น) |
+| show_best_member | ํด๋น์ ๋ฒ ์คํธ ๋ฉค๋ฒ ์ถ์ถ |
```
๐ฅณ ๋ฉค๋ฒ ๋ฑ๋ก
@@ -148,14 +173,21 @@ uvicorn app.main:app --port 8080
๐ ์ ์ ๋ณด์ด๊ธฐ
@EmojiBot --show_user --slack_id=์ฌ๋ID
```
+### ๐ show_best_member ์์
+
+
### ๐ Postman ์ผ๋ก ์ ์ ๋ฑ๋ก ์์
-
+
+
+
+
+## ๐งโโ๏ธ ํ๋ก์ธ์ค Live ์ฒดํฌ (์ ํ)
-## ๐งโโ๏ธ ํ๋ก์ธ์ค Live ์ฒดํฌ (์ ํ)
shell script๋ก ๊ฐ๋จํ๊ฒ Live ์ฒดํฌ๋ฅผ ์งํ ํ ์ ์์ต๋๋ค! ํฌ๋ก ํญ์ 1๋ถ๋ง๋ค ์คํํ๋๋ก ๋ฑ๋ก.
๋ก๊น
๋ ์ถ๊ฐํ๋ฉด ์ข์ต๋๋ค.
+
```
#! /bin/bash
PYTHON_PATH=/{{ path }}/venv/bin/python
@@ -168,24 +200,10 @@ if [ "$checker" == "0" ]; then
cd $SCRIPT_PATH && `uvicorn main:app --port 8080 &`
fi
```
-
-## ~๐๐ปโ ๋ฐฐ์น ์คํฌ๋ฆฝํธ ํฌ๋ก ํญ ๋ฑ๋ก~
-~๋ฉค๋ฒ๋น ํ๋ฃจ์ ํ์ฉ๋ ``DAY_MAX_REACTION`` ๋งํผ ์ด๋ชจ์ง(Emoji)๋ฅผ ๋ค๋ฅธ ๋ฉค๋ฒ์๊ฒ ์ค ์ ์๋๋ก ํ์ต๋๋ค.~
-~๋งค์ผ ์์ ์ ๋ค์ ``DAY_MAX_REACTION``๋งํผ ์นด์ดํธ๋ฅผ ๋ฆฌ์
ํ๋ ๋ฐฐ์น ์คํฌ๋ฆฝํธ๋ฅผ ``ํฌ๋ก ํญ``์ ๋ฑ๋กํฉ๋๋ค.~
-~์ ๋ ``์์คํฌ๋ฆฝํธ``๋ฅผ ๋ง๋ค์ด์ ``ํฌ๋ก ํญ``์ ๋ฑ๋กํ์ต๋๋ค.~
-```
-#!/bin/bash
-
-PYTHON_PATH=/{{ path }}/venv/bin/python
-SCRIPT_PATH=/{{ path }}/heymoji/scripts/update_emoji_count.py
-
-source '{{ path }}/venv/bin/activate'
-
-$PYTHON_PATH $SCRIPT_PATH
-```
-# ๐ค Slack Bot ์ค์
+# ๐ค Slack Bot ์ค์
+
https://api.slack.com/apps ์ ์ ์ํ์ฌ create app ๋ฒํผ์ ํด๋ฆญํ ํ,
@@ -194,7 +212,7 @@ https://api.slack.com/apps ์ ์ ์ํ์ฌ create app ๋ฒํผ์ ํด๋ฆญํ ํ,
`Basic Information` ํญ์ ํด๋ฆญํ ํ๋จ์์ app์ ``ํ๋กํ ์ด๋ฏธ์ง``๋ฅผ ์ถ๊ฐํ๊ณ Save ํด์ค๋๋ค.
-์ด๊ฑด ์ํด๋ ๋์ง๋ง ํ๋๊ฒ ์ข์์. ์๋ํ๋ฉด ๋ฉ์๊ฑฐ๋ ์๐
+์ด๊ฑด ์ํด๋ ๋์ง๋ง ํ๋๊ฒ ์ข์์. ์๋ํ๋ฉด ๋ฉ์๊ฑฐ๋ ์๐
@@ -210,7 +228,8 @@ https://api.slack.com/apps ์ ์ ์ํ์ฌ create app ๋ฒํผ์ ํด๋ฆญํ ํ,
-๋ก์ปฌ์์ ํ
์คํธ ํ๊ธฐ ์ํด ngrok์ ์ฌ์ฉํ์๋ฉด ํธํฉ๋๋ค.์ค์ prod ํ๊ฒฝ์์๋ `Nginx + uvicorn`์ผ๋ก ์คํํ๋ฉด ๋์!
+๋ก์ปฌ์์ ํ
์คํธ ํ๊ธฐ ์ํด ngrok์ ์ฌ์ฉํ์๋ฉด ํธํฉ๋๋ค.์ค์ prod
+ํ๊ฒฝ์์๋ `Nginx + uvicorn`์ผ๋ก ์คํํ๋ฉด ๋์!
Nginx Config ์์ `proxy_pass` ๋ง uvicorn์ผ๋ก ์คํํ ๋ก์ปฌ ์๋ฒ๋ก ์ฐ๊ฒฐํด์ฃผ๋ฉด ๋ฉ๋๋ค!
diff --git a/conf/settings.py b/conf/settings.py
index a5020c9..80a54f3 100644
--- a/conf/settings.py
+++ b/conf/settings.py
@@ -21,13 +21,27 @@ class BaseConfig(BaseSettings):
DB_PASSWORD: str = Field(env="DB_PASSWORD", default="root")
DATABASE: str = Field(env="DATABASE", default="heymoji")
+ SLACK_TOKEN: str = Field(env="SLACK_TOKEN", default="")
+ ERROR_CHANNEL: str = Field(env="ERROR_CHANNEL", default="")
+ BOT_NAME: str = Field(env="BOT_NAME", default="heymojiBOT")
+
SPECIAL_EMOJI: Optional[str] = Field(env="SPECIAL_EMOJI", default="trophy")
LIMIT_GIVE_COUNT_OF_SPECIAL_EMOJI: int = Field(env="LIMIT_GIVE_COUNT_OF_SPECIAL_EMOJI", default=5)
- ALLOWED_REACTION_LIST: list = Field(env="ALLOWED_REACTION_LIST", default=['heart'])
- SLACK_TOKEN: str = Field(env="SLACK_TOKEN")
- ERROR_CHANNEL: str = Field(env="ERROR_CHANNEL")
- BOT_NAME: str = Field(env="BOT_NAME")
- ALLOWED_EMOJI_TYPES: list = Field(env="ALLOWED_EMOJI_TYPES", default=[])
+ ALLOWED_REACTION_LIST: list = Field(
+ env="ALLOWED_REACTION_LIST",
+ default=["pray", "heart", "eye_shaking", "+1", "๊ธฐ๋", "๊ธฐ์จ", "kkkk", "trophy", "ํธ๋กํผ"]
+ )
+ ALLOWED_EMOJI_TYPES: list = Field(
+ env="ALLOWED_EMOJI_TYPES",
+ default=[
+ {"emoji": "โค๏ธ", "emoji_names": ["heart"]},
+ {"emoji": "๐คฃ", "emoji_names": ["kkkk", "๊ธฐ์จ"]},
+ {"emoji": "๐๏ธ", "emoji_names": ["pray", "๊ธฐ๋"]},
+ {"emoji": "๐", "emoji_names": ["+1"]},
+ {"emoji": "๐๏ธ", "emoji_names": ["eye_shaking"]},
+ {"emoji": "๐๏ธ", "emoji_names": ["trophy", "ํธ๋กํผ"]}
+ ]
+ )
RANK_URL: str = Field(env="RANK_URL", default="")
DEFAULT_AVATAR_URL: str = Field(