Ejemplo n.º 1
0
def generate_token(user_id, email):
    login_expire_time = current_config('login_expire_time')

    token_data = {
        'user_id': user_id,
        'email': email,
        'expire': time.time() + login_expire_time
    }

    secret_key = current_config('secret_key')
    algorithm = current_config('algorithm')

    token = _jwt_encode(token_data, secret=secret_key, algorithm=algorithm)

    return token.decode()
Ejemplo n.º 2
0
def register_prov_user():
    '''ユーザの仮登録を行う
    Args:
        email:  学番メール
    Returns:
        200:    正常に登録が行われた
        400:    不正なメールアドレス
        500:    サーバエラー
    '''
    try:
        params = request.json

        email = params.get('email')

        # 仮登録を行う
        # トークンを返却
        # TODO 仮登録を連続で登録できないようにinterva_timeを設定する
        login_token = ProvisionalUser.post(email)

        mail = current_config('mail')

        # 確認メール送信
        send_confirm_mail(from_addr=mail.get('address'),
                          from_addr_pass=mail.get('pass'),
                          to_addr=email,
                          login_token=login_token)

        return make_response('', 200)
    except Exception as e:
        if str(e) == 'over email length':
            result = {'error_message': 'メールが長すぎます'}
            return make_response(jsonify(result), 400)

        return make_response('', 500)
Ejemplo n.º 3
0
def decode_token(token):
    secret_key = current_config('secret_key')

    token_data = _jwt_decode(token, secret=secret_key)

    if token_data is None:
        raise Exception('invalid token')
    else:
        return token_data
Ejemplo n.º 4
0
def create_database():
    '''データベース作成
    '''
    # データベース名取得
    db = current_config('db')

    dburl = create_dburl()
    dburl = dburl[:dburl.rfind('/')]

    engine = create_engine(dburl)
    conn = engine.connect()
    conn.execute('CREATE DATABASE %s CHARACTER SET %s;' %
                 (db.get('db'), db.get('charset')))
    conn.close()
Ejemplo n.º 5
0
def after_request(response):
    server_config = current_config().get('server')

    origin = server_config.get('access_control_allow_origin')

    response.headers['Access-Control-Allow-Origin'] = origin

    methods = server_config.get('access_control_allow_methods')
    response.headers['Access-Control-Allow-Methods'] = methods

    headers = server_config.get('access_control_allow_headers')
    response.headers['Access-Control-Allow-Headers'] = headers

    print(response.headers)

    return response
Ejemplo n.º 6
0
def run(port=None) -> None:
    '''サーバーの実行

    Args:
        port: サーバーのLISTENポート
              未指定の場合、コンフィグ(server.port)記載の値が使用される
    '''
    flask_server = init_server()

    config = current_config()
    dotenv_path = join(dirname(__file__), '.env')
    load_dotenv(dotenv_path)
    host = config.get('server').get('host')
    port = os.environ.get('PORT', 3333)
    print("host:", host)
    print("port:", port)

    flask_server.run(
        host=host,
        port=int(port),
        threaded=config.get('server').get('threaded'),
        debug=config.get('server_debug'),
    )
Ejemplo n.º 7
0
    def get_engine(cls, _type: str):
        config = current_config()
        dburl = config.get('dburl')
        failover = []

        # 接続情報を取得する
        # 以下の優先順で取得
        # 1. set_connection_infoでセットされた値
        # 2. configに記載の値
        connection_info = cls._connection_infos.get(
            _type, config.get('connection_info', {}).get(_type, []))
        for c in connection_info:
            failover.append({
                'user': c.get('user'),
                'password': c.get('password'),
                'host': c.get('host'),
                'database': c.get('database'),
            })

        return create_engine(
            dburl,
            connect_args={'failover': failover},
            echo=config.get('sql_debug'),
        )
Ejemplo n.º 8
0
def register():
    '''ユーザの本登録を行う
    Args:
        * login_token:  仮登録のトークン
        * password:     パスワード
        * nick_name:    ニックネーム
        profile:        プロファイル
        twitter_name:   ツイッターネーム
    Returns:
        201:    正常登録
        400:    仮登録ユーザが存在しない,トークンの有効期限切れ,トークンの不一致
            error_message:  エラーメッセージ(必要なエラーのみ)
        500:    サーバエラー

    * 必須
    '''
    try:
        params = request.json

        nick_name = params.get('nick_name')
        login_token = params.get('login_token')

        # login_tokenからemailを取得する
        prov_user = ProvisionalUser.get_by_login_token(login_token=login_token)

        # 仮登録ユーザが存在しない場合,400を返却
        if not prov_user:
            result = {'error_message': '仮登録を行なってください'}
            return make_response(jsonify(result), 400)

        email = prov_user.get('email')

        # emailが既に本登録されているか
        if User.is_exist_by_email(email):
            # ユーザが登録されている場合,400を返す
            result = {'error_message': 'このメールアドレスは既に使われています'}
            return make_response(jsonify(result), 400)

        # nick_nameが既に本登録されているか
        if User.is_exist_by_nick_name(nick_name):
            # ユーザが登録されている場合,400を返す
            result = {'error_message': 'このニックネームは既に使われています'}
            return make_response(jsonify(result), 400)

        # 仮登録作成時間と現在時間の差分を取得
        delta = datetime.now(JST) - prov_user['create_at']

        prov_expire_time = current_config('prov_expire_time')

        # 有効時間切れの場合,400を返却
        if delta.total_seconds() > prov_expire_time:
            result = {'error_message': 'リンクの有効期限切れです'}
            return make_response(jsonify(result), 400)

        # トークンが不一致の場合,400を返却
        if login_token != prov_user['login_token']:
            result = {'error_message': 'リンクの有効期限切れです'}
            return make_response(jsonify(result), 400)

        # paramsからlogin_token除去
        del params['login_token']

        # paramsにemail追加
        params.update({'email': email})

        # ユーザ本登録
        User.post(params)

        return make_response('', 201)
    except Exception as e:
        return make_response('', 500)
Ejemplo n.º 9
0
from datetime import datetime, timedelta, timezone
import unittest

from freezegun import freeze_time

from app.config import current_config
from app.models.thread import Thread
from tests.base import AbstractTest

ID_ASC = current_config().get('ID_ASC')
ID_DESC = current_config().get('ID_DESC')
SPEED_ASC = current_config().get('SPEED_ASC')
SPEED_DESC = current_config().get('SPEED_DESC')
NUM_COMMENT_ASC = current_config().get('NUM_COMMENT_ASC')
NUM_COMMENT_DESC = current_config().get('NUM_COMMENT_DESC')

JST = timezone(timedelta(hours=+9), 'JST')


class ThreadTest(AbstractTest):
    tables = ['user', 'category', 'thread', 'comment']
    test_tables = ['thread', 'comment']

    def test_get_all(self):
        '''すべてのthread取得
        '''
        self.load_fixtures()

        thread = Thread()

        actual = thread.get_all()
Ejemplo n.º 10
0
    def get_all_by_c_id(cls, category_id, sort_id, paging):
        '''category_idに紐づくthreadリスト取得
        '''
        with session_scope() as session:
            query = session.query(
                cls
            ).join(
                Category, Thread.category_id == Category.category_id
            ).filter(
                Category.category_id == category_id
            )

            # sort
            if sort_id == current_config().get('ID_ASC'):
                # ID昇順
                pass
            elif sort_id == current_config().get('ID_DESC'):
                # ID降順
                query = query.order_by(cls.thread_id.desc())
            elif sort_id == current_config().get('SPEED_DESC'):
                # 人気高い順
                query = query.order_by(cls.speed.desc())
            elif sort_id == current_config().get('SPEED_ASC'):
                # 人気低い順
                query = query.order_by(cls.speed.asc())
            elif sort_id == current_config().get('NUM_COMMENT_DESC'):
                # コメント数多い順
                query = query.order_by(cls.thread_id.desc())
            elif sort_id == current_config().get('NUM_COMMENT_ASC'):
                # コメント数少ない順
                query = query.order_by(cls.thread_id.asc())

            # paging
            # ex)
            # 1. offset=0, limit=10
            # 2. offset=10, limit=20

            # pagingバリデーション
            if paging <= 0:
                paging = 1

            offset = (paging - 1) * 10
            limit = 10

            query_range = query.offset(offset).limit(limit)

            rows = query_range.all()

            # threadが取得できなかった場合
            # 1. threadが1つ以上取得できる場合,最後のpagingのthreadリストを返却
            # 2. threadが0の場合,[]を返却
            if not rows:
                # category_idに紐づくすべてのthread取得
                rows = query.all()

                # それでもthreadが取得できない場合
                if not rows:
                    return []

                result = []

                count = len(rows)

                # threadリストを逆順にしてpaging区切りのthreadをまとめて返却
                for row in list(reversed(rows)):
                    if count == 0 or count % 10 == 0:
                        break

                    result.append(row_to_dict(row))

                    count = count - 1

                return result

            result = [row_to_dict(row) for row in rows]

            return result
Ejemplo n.º 11
0
parser.add_argument(
    '-e',
    '--env',
    help='実行環境',
    type=str,
    choices=[
        'develop',
        'staging',
        'production',
    ],
    default='develop',
)
parser.add_argument('-p', '--port', help='ポート', type=int, default=None)
args = parser.parse_known_args()[0]

# コンフィグの初期化、取得
init_config(env=args.env)
config = current_config()

# loggerのセットアップ
logging_type = 'server'
setup_logger(config=config.get('logging').get(logging_type),
             log_dir=config.get('log_dir'),
             debug=config.get('debug'))

if __name__ == '__main__':
    # サーバーの実行
    from app import server  # NOQA

    server.run(port=args.port)