Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions app/auth/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
auth_bp = Blueprint('auth_bp', __name__, url_prefix='/api/v1/auth')
auth_api = Api(auth_bp)

from . import external_users_connection
from . import external_users_registration
from . import login
from . import password_reset_confirm
Expand All @@ -15,6 +16,8 @@
from . import token_checker


auth_api.add_resource(external_users_connection.ExternalUserConnection,
'/external_user_connection/')
auth_api.add_resource(external_users_registration.ExternalUserRegistration,
'/external_user_registration/')
auth_api.add_resource(login.Login, '/login/')
Expand Down
90 changes: 90 additions & 0 deletions app/auth/external_users_connection.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
from flask import jsonify, make_response
from flask_apispec import doc, use_kwargs
from flask_apispec.views import MethodResource
from flask_jwt_extended import jwt_required
from flask_restful import Resource
from marshmallow import Schema, fields
from sqlalchemy.exc import SQLAlchemyError

from app import config
from app.database import db_session
from app.logger import app_logger as logger
from app.models import User


class UserConnectionSchema(Schema):
telegram_id = fields.Integer(required=True)
external_id = fields.Integer(required=True)


class ExternalUserConnection(Resource, MethodResource):

@doc(description='Set external_id to user by his telegram_id.'
'Requires "telegram_id" and "external_id" parameters.',
summary='Set external_id to user',
tags=['User Registration'],
responses={
200: {'description': 'external_id has been assigned to the user'},
400: {'description': 'The telegram_id can not be empty'},
},
params={
'telegram_id': {
'description': (
'Set external_id to a user with that telegram id'
),
'in': 'query',
'type': 'integer',
'required': True
},
'external_id': {
'description': (
'Set that external_id to user.'
),
'in': 'query',
'type': 'integer',
'required': True
},
'Authorization': config.PARAM_HEADER_AUTH,
}
)
@use_kwargs(UserConnectionSchema)
@jwt_required()
def post(self, **kwargs):
telegram_id = kwargs.get('telegram_id')
external_id = kwargs.get('external_id')

if not external_id or not telegram_id:
logger.info(
'Messages: The <telegram_id> and <external_id> '
'parameters have not been passed'
)
return make_response(
jsonify(
result=(
'Необходимо указать параметры '
'<telegram_id> and <external_id>.'
)
), 400
)

try:
user = User.query.filter_by(telegram_id=telegram_id).first()
user.external_id = external_id
db_session.commit()
except SQLAlchemyError as ex:
logger.error(f'Messages: Database commit error "{str(ex)}"')
db_session.rollback()
return make_response(
jsonify(message=f'Bad request: {str(ex)}'), 400
)

logger.info(
f'External user registration: The user with "{telegram_id}" '
f'was successfully assigned the external_id "{external_id}".'
)

return make_response(
jsonify(
result="Пользователю успешно присвоен external_id."
), 200
)
2 changes: 2 additions & 0 deletions app/auth/swagger_auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from app.auth.login import Login
from app.auth.password_reset import PasswordReset
from app.auth.registration import UserRegister
from app.auth.external_users_connection import ExternalUserConnection
from app.auth.external_users_registration import ExternalUserRegistration
from app.auth.token_checker import TokenChecker
from app.auth.send_registration_invite import SendRegistrationInvite
Expand All @@ -13,6 +14,7 @@
docs.register(UserRegister, blueprint='auth_bp')
docs.register(PasswordReset, blueprint='auth_bp')
docs.register(PasswordResetConfirm, blueprint='auth_bp')
docs.register(ExternalUserConnection, blueprint='auth_bp')
docs.register(ExternalUserRegistration, blueprint='auth_bp')
docs.register(SendRegistrationInvite, blueprint='auth_bp')
docs.register(TokenChecker, blueprint='auth_bp')