def create_bot(cls, bot_data): admin = Authenticator.authenticate_team(bot_data.authentication, UserRoles.is_admin) try: new_client = UserDatabaseClient.add_client() new_bot = Bot( bot_id=new_client.id, name=bot_data.name, callback=bot_data.callback, token=Authenticator.generate(new_client.id) ) BotDatabaseClient.add_bot(new_bot) team_bot = TeamUser( user_id=new_client.id, team_id=admin.team_id, role=TeamRoles.BOT.value ) TeamDatabaseClient.add_team_user(team_bot) DatabaseClient.commit() cls.logger().info(f"Bot #{new_bot.id} created in team {admin.team_id} with callback url {new_bot.callback} " f"by admin {admin.id}.") return SuccessfulUserMessageResponse("Bot created.", UserResponseStatus.OK.value) except IntegrityError as exc: DatabaseClient.rollback() if BotDatabaseClient.get_bot_by_name(bot_data.name) is not None: cls.logger().info(f"Failing to create bot {bot_data.name}. Name already in use.", exc) return BadRequestUserMessageResponse("Name already in use for other bot.", UserResponseStatus.ALREADY_REGISTERED.value) else: cls.logger().info(f"Failing to create bot {bot_data.name}.") return UnsuccessfulClientResponse("Couldn't create bot.")
def create_channel(cls, creation_data): user = Authenticator.authenticate_team(creation_data.authentication) try: new_client = UserDatabaseClient.add_client() new_channel = Channel( channel_id=new_client.id, team_id=user.team_id, creator=user.id, name=creation_data.name, visibility=creation_data.visibility, description=creation_data.description, welcome_message=creation_data.welcome_message ) ChannelDatabaseClient.add_channel(new_channel) new_channel_user = ChannelUser(user_id=user.id, channel_id=new_channel.channel_id) ChannelDatabaseClient.add_channel_user(new_channel_user) new_chat = Chat(user_id=user.id, chat_id=new_channel.channel_id, team_id=new_channel.team_id) MessageDatabaseClient.add_chat(new_chat) DatabaseClient.commit() channel = ChannelDatabaseClient.get_channel_by_id(new_channel.channel_id) cls.logger().info(f"Channel #{new_channel.channel_id} created in team {new_channel.team_id}.") cls.logger().info(f"User #{user.id} assigned as channel #{new_channel.channel_id} creator.") except IntegrityError: DatabaseClient.rollback() if ChannelDatabaseClient.get_channel_by_name(creation_data.name) is not None: cls.logger().info(f"Failing to create channel {creation_data.name}. Name already in use.") return BadRequestChannelMessageResponse(f"Channel name {creation_data.name} already in use.", TeamResponseStatus.ALREADY_REGISTERED.value) else: cls.logger().error(f"Failing to create channel {creation_data.name}.") return UnsuccessfulChannelMessageResponse("Couldn't create channel.") else: return SuccessfulChannelResponse(channel, TeamResponseStatus.CREATED.value)
def create_user(cls, user_data): if UserDatabaseClient.get_user_by_username( user_data.username) is not None: cls.logger().info( f"Failing to create user #{user_data.username}. Username already in use." ) return BadRequestUserMessageResponse( "Username already in use for other user.", UserResponseStatus.ALREADY_REGISTERED.value) try: new_client = UserDatabaseClient.add_client() new_user = User(user_id=new_client.id, username=user_data.username, email=user_data.email, password=hashing.hash(user_data.password), first_name=user_data.first_name, last_name=user_data.last_name, profile_pic=user_data.profile_pic, role=user_data.role or UserRoles.USER.value, token=Authenticator.generate( new_client.id, user_data.password)) UserDatabaseClient.add_user(new_user) DatabaseClient.commit() cls.logger().info(f"User #{new_client.id} created.") headers = {"auth_token": new_user.token} return SuccessfulUserResponse(new_user, headers) except IntegrityError as exc: DatabaseClient.rollback() if UserDatabaseClient.get_user_by_email( user_data.email) is not None: cls.logger().info( f"Failing to create user {user_data.username}. Email already in use.", exc) return BadRequestUserMessageResponse( "Email already in use for other user.", UserResponseStatus.ALREADY_REGISTERED.value) else: cls.logger().info( f"Failing to create user #{user_data.username}.") return UnsuccessfulClientResponse("Couldn't create user.") except: DatabaseClient.rollback() cls.logger().info(f"Failing to create user #{user_data.username}.") return UnsuccessfulClientResponse("Couldn't create user.")
def _login_facebook_user(cls, user_data): try: facebook_user = FacebookService.get_user_from_facebook(user_data) user = UserDatabaseClient.get_user_by_facebook_id( facebook_user.facebook_id) if user is not None: cls.logger().info( f"Logging in Facebook user with Facebook ID #{facebook_user.facebook_id}." ) cls.logger().debug(f"Generating token for user {user.id}") user.token = Authenticator.generate(user.id) user.online = True UserDatabaseClient.update_user(user) DatabaseClient.commit() cls.logger().info(f"User #{user.id} logged in.") headers = {"auth_token": user.token} return SuccessfulUserResponse(user, headers) else: cls.logger().info( f"Creating new Facebook user with Facebook ID #{facebook_user.facebook_id}." ) new_client = UserDatabaseClient.add_client() new_user = User(user_id=new_client.id, facebook_id=facebook_user.facebook_id, username=facebook_user.username, email=facebook_user.email, first_name=facebook_user.first_name, last_name=facebook_user.last_name, profile_pic=facebook_user.profile_pic, role=UserRoles.USER.value, token=Authenticator.generate(new_client.id)) UserDatabaseClient.add_user(new_user) DatabaseClient.commit() cls.logger().info(f"User #{new_client.id} logged in.") headers = {"auth_token": new_user.token} return SuccessfulUserResponse(new_user, headers) except FacebookWrongTokenError: cls.logger().info( f"Failing to logging in user with Facebook token #{user_data.facebook_token}." ) return UnsuccessfulClientResponse("Couldn't perform login.")