Exemplo n.º 1
0
class MessageHandler(tornado.web.RequestHandler):
	"""
	ClassName MessageHandler
	It inherits RequestHandler class which routes incoming requests to handler
	This class is responsible for handling request related to Message Fetching activity
	"""
	def set_default_headers(self):
		"""
		Method set_default_headers()
		To set default CORS Headers
		"""
		self.set_header("Access-Control-Allow-Origin", "*")
		self.set_header("Access-Control-Allow-Headers", "x-requested-with, access-token")
		self.set_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')
		self.set_header("Content-Type", "application/json")

	def initialize(self):
		self.db_manager = DBManager('mongo')

	@tornado.web.asynchronous ## For Non Blocking IO
	def get(self, method):
		"""
		Method get()
		To get user list OR by ID
		"""
		channel_name = self.get_argument("name", '')
		channels = self.db_manager.retrieve(collection='channel', filter_by={'channel_name':channel_name})
		if not len(channels):
			data = {
				'message' : 'Channel Not Found !',
			}
			result = transformer.response_transform(data, status_code=404, message_type='error', message='Not Found. Failed to respond', service_code='API_FAIL_010', hint='Channel name should be registered first')
			self.set_status(404)
		else:
			messages = self.db_manager.retrieve(collection='channel_message__'+channels[0]['channel_name'], filter_by={})
			result = transformer.response_transform([message for message in messages])
			self.set_status(200)
		self.write(json.dumps(result)) ## As it accepts only bytes, unicode, and dict objects
		self.finish()

	def options(self):
		"""
		Method options()
		For Option Call
		It doesnot contains any body
		"""
		self.set_status(204)
		self.finish()
Exemplo n.º 2
0
class ChannelDataHandler(object):

	def __init__(self):
		self.db_manager = DBManager('mongo')
		self.channel_users = {}

	def attach_client_to_channel(self, channel_id, client_id):
		client_channel = self.db_manager.retrieve(collection='channel_client', filter_by={'channel_id':channel_id, 'client_id':client_id})
		if not len(client_channel):
			data = {
				'_id' : str(utility.generate_uuid()),
				'id' : str(utility.generate_uuid()),
				'channel_id' : channel_id,
				'client_id' : client_id,
				'created_at' : str(utility.get_date_time()),
				'updated_at' : str(utility.get_date_time()),
			}
			self.db_manager.create(collection='channel_client', data=data)
		return channel_id, client_id

	def set_client_channel_connection(self, client_id, channel_id, ws_connection):
		if channel_id not in self.channel_users:
			self.channel_users[channel_id] = {}
		if client_id not in self.channel_users[channel_id]:
			self.channel_users[channel_id][client_id] = ws_connection
			self.send_pong_on_join(client_id, channel_id)
		
	def send_pong_on_join(self, client_id, channel_id):
		return self.send_message(client_id, channel_id, 'join', 'Joined the Channel')

	def send_pong_on_leave(self, client_id, channel_id):
		return self.send_message(client_id, channel_id, 'leave', 'Left the Channel')

	def send_message(self, client_id, channel_id, message_type, payload):
		user = self.db_manager.retrieve(collection='users', filter_by={'id':client_id})[0]
		channel = self.db_manager.retrieve(collection='channel', filter_by={'id':channel_id})[0]
		data = transformer.message_transform(user=user, channel=channel, message_type=message_type, payload=payload)

		message = json.loads(data)
		message['_id'] = str(utility.generate_uuid())
		message['id'] = str(utility.generate_uuid())
		message['created_at'] = str(utility.get_date_time())
		message['updated_at'] = str(utility.get_date_time())
		self.db_manager.create(collection='channel_message__'+channel['channel_name'], data=message)
		
		for client in self.channel_users[channel_id]:
			self.channel_users[channel_id][client].write_message(data)

	def remove_client_channel_connection(self, client_id, channel_id):
		if channel_id in self.channel_users and client_id in self.channel_users[channel_id]:
			del self.channel_users[channel_id][client_id]
		return self.send_pong_on_leave(client_id, channel_id)
Exemplo n.º 3
0
	def __init__(self):
		self.db_manager = DBManager('mongo')
		self.channel_users = {}
Exemplo n.º 4
0
class ChannelHandler(tornado.web.RequestHandler):
	"""
	ClassName ChannelHandler
	This class is used for creating/deleting channel and adding/removing client connection
	"""
	
	def set_default_headers(self):
		self.set_header("Access-Control-Allow-Origin", "*")
		self.set_header("Access-Control-Allow-Headers", "*")
		self.set_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')
		self.set_header("Content-Type", "application/json")
	
	def initialize(self):
		self.db_manager = DBManager('mongo')
	
	@tornado.web.asynchronous
	def get(self, method):
		"""
		Method get()
		To get channel list OR by ID
		"""
		channel_name = self.get_argument("channel", None)
		if channel_name is None:
			channels = self.db_manager.list(collection='channel')[::-1]
		else:
			channels = self.db_manager.retrieve(collection='channel', filter_by={'channel_name':channel_name})
		result = transformer.response_transform([transformer.channel_transform(channel) for channel in channels])
		self.write(json.dumps(result)) ## As it accepts only bytes, unicode, and dict objects
		self.set_status(200)
		self.finish()

	@tornado.web.asynchronous
	def post(self, method):
		"""
		Method post()
		To register a channel
		"""
		data = json.loads(self.request.body)
		channel_name = data['name'] if 'name' in data else ''
		if channel_name == '' or len(channel_name) < 5:
			data = {
				'message' : 'Please Provide Valid Channel Name !',
			}
			result = transformer.response_transform(data, status_code=400, message_type='error', message='Bad Request. Failed to respond', service_code='API_FAIL_001', hint='Channel name should be more than 4 words')
			self.set_status(400)
		else:
			channels = self.db_manager.retrieve(collection='channel', filter_by={'channel_name':slugify(channel_name, max_length=30, word_boundary=True, save_order=True)})
			if len(channels):
				data = {
					'message' : 'Channel Name Already Exists !',
				}
				result = transformer.response_transform(data, status_code=409, message_type='error', message='Duplicate Entry. Failed to respond', service_code='API_FAIL_002', hint='Try with different channel name')
				self.set_status(409)
			else:
				data = {
					'_id' : str(utility.generate_uuid()),
					'id' : str(utility.generate_uuid()),
					'channel_name' : slugify(channel_name, max_length=30, word_boundary=True, save_order=True),
					'created_at' : str(utility.get_date_time()),
					'updated_at' : str(utility.get_date_time()),
				}
				channel = self.db_manager.create(collection='channel', data=data)
				if channel:
					del data['_id']
					result = transformer.response_transform(data, status_code=201, service_code='API_SUCCESS_001', hint='Channel Added Successfully')
					self.set_status(201)
				else:
					data = {
						'message' : 'Failed To Register Channel. Try Again !',
					}
					result = transformer.response_transform(data, status_code=500, message_type='error', message='Something Went Wrong', service_code='API_FAIL_003', hint='We messed up !')
					self.set_status(500)
		self.write(json.dumps(result))
		self.finish()

	def options(self, method=None):
		"""
		Method options()
		For Option Call
		It doesnot contains any body
		"""
		self.set_status(204)
		self.finish()
Exemplo n.º 5
0
	def initialize(self):
		self.db_manager = DBManager('mongo')
Exemplo n.º 6
0
class UserHandler(tornado.web.RequestHandler):
    """
	ClassName UserHandler
	It inherits RequestHandler class which routes incoming requests to handler
	This class is responsible for handling request related to User CRUD activity
	"""
    def set_default_headers(self):
        """
		Method set_default_headers()
		To set default CORS Headers
		"""
        self.set_header("Access-Control-Allow-Origin", "*")
        self.set_header("Access-Control-Allow-Headers", "*")
        self.set_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')
        self.set_header("Content-Type", "application/json")

    def initialize(self):
        self.db_manager = DBManager('mongo')

    @tornado.web.asynchronous  ## For Non Blocking IO
    def get(self, method):
        """
		Method get()
		To get user list OR by ID
		"""
        username = self.get_argument("username", None)
        if username is None:
            users = self.db_manager.list(collection='users')[::-1]
        else:
            users = self.db_manager.retrieve(collection='users',
                                             filter_by={'username': username})

        result = transformer.response_transform(
            [transformer.user_transform(user) for user in users])
        self.set_status(200)
        self.write(json.dumps(
            result))  ## As it accepts only bytes, unicode, and dict objects
        self.finish()

    @tornado.web.asynchronous  ## For Non Blocking IO
    def post(self, method):
        """
		Method post()
		To add a user to db record
		"""
        data = json.loads(self.request.body)
        username = data['username'] if 'username' in data else ''
        display_name = data['display_name'] if 'display_name' in data else ''

        if username == '' or display_name == '':
            data = {
                'message': 'Please Provide Valid Username and Display Name !',
            }
            result = transformer.response_transform(
                data,
                status_code=400,
                message_type='error',
                message='Bad Request. Failed to respond',
                service_code='API_FAIL_004',
                hint='Username and Display Name is Required')
            self.set_status(400)
        else:
            users = self.db_manager.retrieve(collection='users',
                                             filter_by={
                                                 'username':
                                                 slugify(username,
                                                         max_length=30,
                                                         word_boundary=True,
                                                         save_order=True)
                                             })
            if len(users):
                data = {
                    'message': 'Username Already Taken !',
                }
                result = transformer.response_transform(
                    data,
                    status_code=409,
                    message_type='error',
                    message='Duplicate Entry. Failed to respond',
                    service_code='API_FAIL_002',
                    hint='Try with different username')
                self.set_status(409)
            else:
                data = {
                    '_id':
                    str(utility.generate_uuid()),
                    'id':
                    str(utility.generate_uuid()),
                    'username':
                    slugify(username,
                            max_length=30,
                            word_boundary=True,
                            save_order=True),
                    'display_name':
                    display_name,
                    'created_at':
                    str(utility.get_date_time()),
                    'updated_at':
                    str(utility.get_date_time()),
                }
                user = self.db_manager.create(collection='users', data=data)
                if user:
                    del data['_id']
                    result = transformer.response_transform(
                        data,
                        status_code=201,
                        service_code='API_SUCCESS_003',
                        hint='User Added Successfully')
                    self.set_status(201)
                else:
                    data = {
                        'message': 'Failed To Register User. Try Again !',
                    }
                    result = transformer.response_transform(
                        data,
                        status_code=500,
                        message_type='error',
                        message='Something Went Wrong',
                        service_code='API_FAIL_006',
                        hint='We messed up !')
                    self.set_status(500)
        self.write(json.dumps(result))
        self.finish()

    def options(self, method=None):
        """
		Method options()
		For Option Call
		It doesnot contains any body
		"""
        self.set_status(204)
        self.finish()
Exemplo n.º 7
0
class MainHandler(tornado.web.RequestHandler):
	"""
	ClassName MainHandler
	It inherits RequestHandler class which routes incoming requests to handlers
	In this hadler, methods gets called on the basis of request type
	"""
	
	def set_default_headers(self):
		"""
		Method set_default_headers()
		To set default CORS Headers
		"""
		self.set_header("Access-Control-Allow-Origin", "*")
		self.set_header("Access-Control-Allow-Headers", "x-requested-with, access-token")
		self.set_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')
		self.set_header("Content-Type", "text/html; charset=UTF-8")

	def initialize(self):
		self.db_manager = DBManager('mongo')
		self.channel_data_handler = ChannelDataHandler()

	@tornado.web.asynchronous ## For Non Blocking IO
	def get(self):
		"""
		Method get()
		@param self
		Gets called on GET request method call
		"""
		channel_name = self.get_argument("channel", None)
		username = self.get_argument("username", None)

		if not channel_name or not username: ## If Channel Or User Not Provided, Render To Home Page
			self.render("../templates/index.html")
		else:
			channel = self.db_manager.retrieve(collection='channel', filter_by={'channel_name':channel_name})
			user = self.db_manager.retrieve(collection='users', filter_by={'username':username})
			if not len(channel) or not len(user):
				data = {
					'message' : 'Channel Or User Not Found !',
				}
				result = transformer.response_transform(data, status_code=404, message_type='error', message='Not Found. Failed to respond', service_code='API_FAIL_009', hint='Channel Or Username is Not Registered. Please Register First')
				self.set_status(404) ## For Setting Up HTTP Status Code
				self.write(json.dumps(result)) ## As it accepts only bytes, unicode, and dict objects
				self.finish()
			else:
				channel_id, client_id = self.channel_data_handler.attach_client_to_channel(channel[0]['id'], user[0]['id'])
				data = {
					'channel_id' : channel_id,
					'client_id' : client_id
				}
				result = transformer.response_transform(data, status_code=200, message_type='success', message='Successfully Responded', service_code='API_SUCCESS_014', hint='Channel and Client Found')
				self.set_header("Content-Type", "application/json")
				self.set_status(200) ## For Setting Up HTTP Status Code
				self.write(json.dumps(result)) ## As it accepts only bytes, unicode, and dict objects
				self.finish()
				# self.render("../templates/chat.html", client_id=client_id, channel_id=channel_id)

	@tornado.web.asynchronous ## For Non Blocking IO
	def post(self):
		self.set_header("Content-Type", "text/plain")
		self.write("You wrote " + self.get_body_argument("message"))
		self.finish()
Exemplo n.º 8
0
	def initialize(self):
		self.db_manager = DBManager('mongo')
		self.channel_data_handler = ChannelDataHandler()