QAapp-PBLで使うためのAPIサーバーのプログラムです。
下記のコマンドを実行してください。
# リポジトリをクローンする
git clone https://github.com/itc-s22020/QAapi-PBL.git
# ディレクトリに移動
cd QAapi-PBL
IntelliJ IDEAとかWebstormを使う場合は、プロジェクトを選ぶ画面の右上にある「VCSから取得」みたいなボタンからクローンすればOKです。
下記のコマンドを実行してください。
npm i
package.json
があるディレクトリに.env
ファイルを作成してください。
作成したら下記の内容を貼り付け、環境に合わせて書き換えてください。
DATABASE_URL="postgresql://postgres:pass@localhost:5432/postgres?schema=public"
SECRET="推測されないランダムな文字列"
下記のコマンドを実行してください。
# dockerディレクトリに移動
cd docker
# コンテナを起動する
docker compose up -d
docker/docker-compose.yml
の設定は次のようになっています。
項目 | 内容 |
---|---|
データベース | PostgreSQL |
ユーザー名 | postgres |
パスワード | pass |
ポート | 5432 |
prisma/schema.prisma
に書いてあるデータベースの設定をDBサーバーに反映させて、prisma/seed.js
を実行して初期データを作成します。
下記のコマンドを実行してください。
npx prisma migrate dev
実行後に何か出ますが、何も入れずにEnterでOKです。
次のマークがあるものは認証(アクセストークン)が必要です
/api/user/login
にログインリクエストを送ると、アクセストークンがクッキーに保管されます。
クッキーを送信する設定でリクエストを送ると認証できます。
fetch(`${API_HOST}/api/user/check`, {credentials: 'include'})
.then((r) => r.json())
.then((d) => {
console.log(`${d.user}としてログインしています`)
})
axios.get(`${API_HOST}/api/user/check`, {withCredentials: true})
.then((r) => r.data)
.then((d) => {
console.log(`${d.user}としてログインしています`)
})
ログインリクエストを送る例です。
const data = {
user_id: 'yamato1987',
password: 'pass'
}
fetch(`${API_HOST}/api/user/login`, {
method: 'post',
body: JSON.stringify(data),
headers: {
'Content-Type': 'application/json'
},
credentials: 'include'
})
.then((r) => r.json())
.then((d) => console.log(`ログイン成功 ${d}`))
const data = {
user_id: 'yamato1987',
password: 'pass'
}
axios.post(`${API_HOST}/api/user/login`, data, {withCredentials: true})
.then((r) => r.data)
.then((d) => console.log(`ログイン成功 ${d}`))
カテゴリ一覧を返します。
カテゴリを新規登録します。
{
"name": "料理"
}
カテゴリを削除します。
{
"id": 1
}
カテゴリ名を編集します。
{
"id": 1,
"name": "勉強"
}
ユーザーを登録します。
{
"user_id": "yamato1987",
"password": "pass",
"name": "山田 大和",
"age": 34,
"mail": "[email protected]",
"gender": 0
}
ユーザーIDとパスワードを入れて、正しければ認証に必要なトークンを発行します。
{
"user_id": "yamato1987",
"password": "pass"
}
ログアウトします。
具体的には、クッキーからアクセストークンを削除します。
ログインしていればステータスコード200を返します。
そうでなければステータスコード403を返します。
管理者権限があればステータスコード200を返します。
そうでなければステータスコード403を返します。
ユーザーの情報を返します。
{
"user_id": "admin",
"name": "Administrator",
"age": 20,
"gender": 0,
"like": 0,
"admin": true
}
ユーザーを情報をいいね数の多い順で返します。
質問一覧を返します。 回答はベストアンサーのみ返します。
質問は日付が新しい順でソートされます。
次のクエリパラメータが使用できます。
パラメータ | 説明 |
---|---|
query | 検索キーワード 複数指定する場合はスペースで区切る |
user_id | 投稿者のユーザーID |
c_id | カテゴリ |
カテゴリID10
番の中で「クレヨンしんちゃん」か「映画」を含む質問を返します。
/api/question?query=クレヨンしんちゃん+映画&c_id=10
質問を投稿します。
{
"c_id": 11,
"title": "インド旅行について教えてください!",
"q_text": "インドに行くのが初めてなので、観光スポットやおすすめの場所、注意すべきことなど、インド旅行に関するアドバイスを教えていただきたいです。"
}
質問を削除します。この質問に対する回答も全て削除します。
{
"id": 1
}
q_id
に該当する質問を返します。 回答は全ての回答を返します。
回答は日付が古い順、いいねが多い順でソートされます。
質問のベストアンサーを設定します。質問の投稿者のみ設定できます。
{
"q_id": 1,
"a_id": 3
}
質問にいいねします。
{
"id": 1
}
質問へのいいねを解除します。
{
"id": 1
}
質問へいいねしているかどうかを返します。
{
"id": 1
}
{
"liked": true
}
回答を投稿します。
{
"q_id": 1,
"a_text": "タージマハルは必見です!日の出や日没の時間帯に訪れると美しい景色を楽しめます。"
}
回答を削除します。投稿した本人か、その質問の投稿者のみ削除できます。
{
"id": 1
}
回答にいいねします。
{
"id": 1
}
回答へのいいねを解除します。
{
"id": 1
}
回答へいいねしているかどうかを返します。
{
"id": 1
}
{
"liked": true
}
ユーザーアイコンを返します。