diff --git a/README.md b/README.md index 0d9dee8..d87ce92 100644 --- a/README.md +++ b/README.md @@ -30,19 +30,19 @@ - Install and launch [Cloud SQL Proxy](https://cloud.google.com/sql/docs/mysql/sql-proxy) ```sh - cloud_sql_proxy -dir=/tmp/cloudsql -instances=yori_instance_name=tcp:3306 + ./cloud_sql_proxy -dir=/tmp/cloudsql -instances=yori_instance_name=tcp:3306 ``` - Launch server ```sh - env FLASK_APP=main.py DB_USER=username DB_PASS=password DB_NAME=database_name CLOUD_SQL_CONNECTION_NAME=yori_instance_name flask run + env FLASK_APP=main.py DB_USER=username DB_PASS=password CLOUD_SQL_CONNECTION_NAME=yori_instance_name flask run ``` or if you want to enable network access to local server (especially when you are developing yori-view) ```sh - env FLASK_APP=main.py DB_USER=username DB_PASS=password DB_NAME=database_name CLOUD_SQL_CONNECTION_NAME=yori_instance_name flask run --host=0.0.0.0 + env FLASK_APP=main.py DB_USER=username DB_PASS=password CLOUD_SQL_CONNECTION_NAME=yori_instance_name flask run --host=0.0.0.0 ``` If setting environments bothers you, write them in your dotfiles. diff --git a/apis/__init__.py b/apis/__init__.py new file mode 100644 index 0000000..27e5ad3 --- /dev/null +++ b/apis/__init__.py @@ -0,0 +1,13 @@ +from flask_restplus import Api +from .photo import api as photo +from .member import api as member + +api = Api( + title='Yori API', + version='1.0', + description='API Documentation', + # All API metadatas +) + +api.add_namespace(photo) +api.add_namespace(member) diff --git a/apis/member.py b/apis/member.py new file mode 100644 index 0000000..43a40eb --- /dev/null +++ b/apis/member.py @@ -0,0 +1,31 @@ +from flask import jsonify +from flask_restplus import Namespace, Resource, fields + +api = Namespace('member', description='Members related operations') + +member = api.model('member', { + 'member_name_en': fields.String(required=True, description='英語'), + 'member_name': fields.String(required=True, description='名前'), + 'member_name_gana': fields.String(required=True, description='ひらがな'), + 'member_gen': fields.Integer(required=True, description='期'), + 'member_graduated': fields.Boolean(required=True, description='卒業'), + 'group_id': fields.String(required=True, description='group id') +}) + +MEMBERS = [ + { + 'member_name_en': 'imaizumi_yui', + 'member_name': '今泉佑唯', + 'member_name_gana': 'いまいずみ_ゆい', + 'member_gen': 1, + 'member_graduated': True, + 'group_id': 'keyakizaka' + } +] + +@api.route('/') +class MemberList(Resource): + @api.doc('get_members') + @api.marshal_list_with(member) + def get(self): + return MEMBERS diff --git a/apis/photo.py b/apis/photo.py new file mode 100644 index 0000000..3546e6c --- /dev/null +++ b/apis/photo.py @@ -0,0 +1,31 @@ +from flask import jsonify +from flask_restplus import Namespace, Resource, fields + +api = Namespace('photo', description='Photos related operations') + +photo = api.model('photo', { + 'photo_group': fields.String(required=True, description='グループ'), + 'photo_member': fields.String(required=True, description='名前'), + 'photo_costume': fields.String(required=True, description='服'), + 'photo_type': fields.String(required=True, description='距離'), + 'photo_number': fields.Integer(required=True, description='数'), + 'photo_folder': fields.String(required=True, description='フォルダ') +}) + +PHOTOS = [ + { + "photo_group": "乃木坂46", + "photo_member": "樋口日奈", + "photo_costume": "2019 summer concert 1", + "photo_type": "ヨリ", + "photo_number": 1, + "photo_folder": "all" + } +] + +@api.route('/') +class MemberList(Resource): + @api.doc('get_photos') + @api.marshal_list_with(photo) + def get(self): + return PHOTOS diff --git a/app.yaml b/app.yaml index 90e0509..efac932 100644 --- a/app.yaml +++ b/app.yaml @@ -7,4 +7,4 @@ env_variables: CLOUD_SQL_CONNECTION_NAME: your-connection-name DB_USER: USER DB_PASS: PASSWORD - DB_NAME: DATABASE + DB_NAME: yori_database diff --git a/main.py b/main.py index ba89b7f..ff4bf11 100644 --- a/main.py +++ b/main.py @@ -1,13 +1,13 @@ import datetime import logging import os -import json from flask import Flask from flask_cors import CORS import sqlalchemy import requests +from apis import api def onGAE(): return os.getenv('GAE_ENV', '').startswith('standard') @@ -15,6 +15,7 @@ def onGAE(): app = Flask(__name__) CORS(app) +api.init_app(app) app.config['JSON_AS_ASCII'] = False db_user = os.environ.get('DB_USER') @@ -51,7 +52,6 @@ def onGAE(): db = sqlalchemy.create_engine(connection_string) - # TODO: # We should create a package and move this into __init__.py of that package def notify(): @@ -65,15 +65,6 @@ def notify(): logger.info(message) requests.post(slack_webhook_url, json={'text': message}) - -# TODO: -# We should create a package and move this into that package -@app.route('/photo', methods=['GET']) -def index(): - result = db.execute('select * from photos') - return json.dumps([dict(data) for data in result]) - - # TODO: # We should create a package and move this into __init__.py of that package if onGAE(): diff --git a/requirements.txt b/requirements.txt index 2937db3..1bdc445 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,6 @@ Flask==1.0.2 flask-cors>=3.0.8 +flask_restplus==0.12.1 SQLAlchemy>=1.3.0 PyMySQL==0.9.3 google-cloud-logging>=1.8.0