４０代おっさん面会予約アプリを作ってみる

## 本記事について

この記事はプログラミング初学者の私が学んでいく中でわからない単語や概要を分かりやすくまとめたものです。
もし不正などありましたらコメントにてお知らせいただければ幸いです。

## FastAPIでモデルを用意

```python
import datetime # 日付
from fastapi import FastAPI
from pydantic import BaseModel, Field

class Booking(BaseModel):
    booking_id: int # 予約ID
    user_id: int # ユーザーID usersテーブルと紐づけ
    room_id: int # 面会室ID roomsテーブルと紐づけ
    booked_num: int # 予約人数 面会室の定員まで
    start_datetime: datetime.datetime # 開始時刻
    end_datetime: datetime.datetime # 終了時刻

class User(BaseModel):
    user_id: int # ユーザーID
    username: str = Field(max_length=12) # ユーザー名（12字文字まで）

class Room(BaseModel):
    room_id: int # 面会室ID
    room_name: str = Field(max_length=12) # 面会室名（12文字まで）
    capacity: int # 定員　各面会室ごとに定める

app = FastAPI()
@app.get("/")
async def index():
    return{"message": "Success"}

@app.post("/users")
async def users(users: User): # Userの型のみで受け取る
    return {"users": users}

@app.post("/rooms")
async def rooms(rooms: Room): # Roomの型のみで受け取る
    return {"rooms": rooms}

@app.post("/bookings")
async def bookings(bookings: Booking): # Bookingの型のみで受け取る
    return {"bookings": bookings}
```

### APIテスト用の画面を作成

#### モデルから帰って来てるデータのテスト（ユーザー用）

```python
import streamlit as st
import random # ランダム値がほしいので
import requests
import json

st.title('APIテスト画面(ユーザー)')

with st.form(key='user'):
    user_id: int = random.randint(0, 10) # 0~10のランダムな整数が生成　一旦の仮置き
    username: str = st.text_input('ユーザー名', max_chars=12) # 12字しか入力できなくなる。
    data = {
        'user_id': user_id,
        'username': username
    }
    submit_button = st.form_submit_button(label='送信') # form専用のボタン

if submit_button: # ボタンが押されたされる処理
    st.write('## 送信データ') # デバック用
    st.json(data) # どんなデータが入っているか確認
    st.write('## レスポンス結果')
    url = 'http://127.0.0.1:8000/users'
    res = requests.post(
        url,
        data=json.dumps(data)
    )
    st.write(res.status_code) # レスポンスのステータスコード
    st.json(res.json())
```

メモ！

```python
data = {
        'user_id': user_id,
        'username': username
    }
```

`'username'`の部分のコードが違っていてえら目にあいました＞＜
スペル間違いは気を付けよう！

#### モデルから帰って来てるデータのテスト（面会室用）

```python
import streamlit as st
import random # ランダム値がほしいので
import requests
import json

#  サイドバーを作って各ページを用意
page = st.sidebar.selectbox('ページを選択してください', ['ユーザー', '面会室'])

if page == 'ユーザー':

# 上を参照

elif page == '面会室':
    st.title('APIテスト画面(面会室)')

    with st.form(key='room'):
        room_id: int = random.randint(0, 10) # 0~10のランダムな整数が生成　一旦の仮置き
        room_name: str = st.text_input('面会室名', max_chars=12) # 12字しか入力できなくなる。
        capacity: int = st.number_input('定員', step=1) # 定員　１刻みで入力
        data = {
            'room_id': room_id,
            'room_name': room_name,
            'capacity': capacity
        }
        submit_button = st.form_submit_button(label='送信') # form専用のボタン

    if submit_button: # ボタンが押されたされる処理
        st.write('## 送信データ') # デバック用
        st.json(data) # どんなデータが入っているか確認
        st.write('## レスポンス結果')
        url = 'http://127.0.0.1:8000/rooms'
        res = requests.post(
            url,
            data=json.dumps(data)
        )
        st.write(res.status_code) # レスポンスのステータスコード
        st.json(res.json())
```

#### モデルから帰って来てるデータのテスト（予約用）

```python
import streamlit as st
import random # ランダム値がほしいので
import datetime # 時刻を扱うため
import requests
import json

#  サイドバーを作って各ページを用意
page = st.sidebar.selectbox('ページを選択してください', ['ユーザー', '面会室', '面会予約'])

if page == 'ユーザー':

# 上を参照

elif page == '面会室':
    
# 上を参照

elif page == '面会予約':
    st.title('APIテスト画面(予約)')

    with st.form(key='booking'):
        booking_id: int = random.randint(0, 10) # 0~10のランダムな整数が生成　一旦の仮置き
        user_id: int = random.randint(0, 10) # 実際のアプリは紐づけを行うがテストの為
        room_id: int = random.randint(0, 10) # 実際のアプリは紐づけを行うがテストの為
        booked_num: int = st.number_input('予約人数', step=1) # 予約人数　１刻みで入力
        date = st.date_input('日付: ', min_value=datetime.date.today()) # 最小値（min）に今日（today）の日付を設定
        start_time = st.time_input('面会開始時刻: ', value=datetime.time(hour=9, minute=0))
        end_time = st.time_input('面会終了時刻: ', value=datetime.time(hour=20, minute=0))
        data = {
            'booking_id': booking_id,
            'user_id': user_id,
            'room_id': room_id,
            'booked_num': booked_num,
            'start_datetime': datetime.datetime( 
                year=date.year,
                month=date.month,
                day=date.day,
                hour=start_time.hour,
                minute=start_time.minute
            ).isoformat(), # str型でないとダメなため
            'end_datetime': datetime.datetime( 
                year=date.year,
                month=date.month,
                day=date.day,
                hour=end_time.hour,
                minute=end_time.minute
            ).isoformat()
            
        }
        submit_button = st.form_submit_button(label='送信') # form専用のボタン

    if submit_button: # ボタンが押されたされる処理
        st.write('## 送信データ') # デバック用
        st.json(data) # どんなデータが入っているか確認
        st.write('## レスポンス結果')
        url = 'http://127.0.0.1:8000/bookings'
        res = requests.post(
            url,
            data=json.dumps(data)
        )
        st.write(res.status_code) # レスポンスのステータスコード
        st.json(res.json())
```

## 参考

https://www.udemy.com/course/python-fastapi