예제 #1
0
    def on_post(self, req: falcon.Request, resp: falcon.Response):

        if req.content_length:
            data = json.load(req.bounded_stream.read().decode("utf-8"))

            if User.authenticate(data):
                resp.status_code = 200
            else:
                resp.status_code = 400
예제 #2
0
    def on_get(self, req: falcon.Request, resp: falcon.Response):

        if req.content_length:
            data = json.load(req.bounded_stream.read().decode("utf-8"))

            votes_dict = Post.get_votecount(data)

            if votes_dict is not None:
                resp.body = json.dumps(votes_dict)
                resp.status_code = 200
            else:
                resp.status_code = 400
예제 #3
0
    def on_post(self, req: falcon.Request, resp: falcon.Response):

        if req.content_length:
            data = json.load(req.bounded_stream.read().decode("utf-8"))

            if data["vote"] == "up":
                Post.downvote(data)
                resp.status_code = 200

            elif data["vote"] == "down":
                Post.upvote(data)
                resp.status_code = 200

            else:
                resp.status_code = 400
예제 #4
0
    def on_delete(self, req: falcon.Request, resp: falcon.Response):

        if req.content_length:
            data = json.load(req.bounded_stream.read().decode("utf-8"))

            User.delete_user(data)
            resp.status_code = 200
예제 #5
0
    def on_post(self, req: falcon.Request, resp: falcon.Response):

        if req.content_length:
            data = json.load(req.bounded_stream.read().decode("utf-8"))

            Post.add_to_DB(data)
            resp.status_code = 200
예제 #6
0
    def on_put_user(self, req: falcon.Request, resp: falcon.Response,
                    user_id: str):
        # parse inputs - get data
        try:
            path_data = schema.UserPathParamSchema().load({"user_id": user_id})
        except marshmallow.ValidationError as err:
            resp.media = {"error": dict(err.messages)}
            resp.status = falcon.HTTP_400
            return

        # parse inputs - json data
        try:
            body_data = schema.UserSchema().load(req.params)
        except marshmallow.ValidationError as err:
            resp.media = {"error": dict(err.messages)}
            resp.status = falcon.HTTP_400
            return

        # do business logic
        try:
            output = self.controller.update_user(path_data, body_data)
        except errors.ErrorWithStatus as err:
            output = {"error": str(err)}
            resp.status_code = err.status_code

        # format and return output
        resp.media = output
예제 #7
0
 def on_get(
     self,
     req: falcon.Request,
     resp: falcon.Response,
 ):
     """Support GET method."""
     key = req.get_param('key')
     try:
         resp.body = self.memcache_client.get(key)  # pylint: disable=no-member
         resp.status_code = falcon.HTTP_OK
     except ConnectionRefusedError:
         raise falcon.HTTPInternalServerError(
             code=1234,
             description='Unexpected error occurred while retrieving data.',
             title='Internal Server Error',
         )
예제 #8
0
 def on_post(
     self,
     req: falcon.Request,
     resp: falcon.Response,
 ):
     """Support POST method."""
     key: str = req.get_param('key')
     value: str = req.get_param('value')
     try:
         resp.body = str(self.redis_client.set(key, value))  # pylint: disable=no-member
         resp.status_code = falcon.HTTP_OK
     except redis.exceptions.RedisError:
         raise falcon.HTTPInternalServerError(
             code=1234,
             description='Unexpected error occurred while retrieving data.',
             title='Internal Server Error',
         )
예제 #9
0
    def on_get_users(self, req: falcon.Request, resp: falcon.Response):
        # parse inputs
        try:
            data = schema.UserQueryParamSchema().load(req.params)
        except marshmallow.ValidationError as err:
            resp.media = {"error": dict(err.messages)}
            resp.status = falcon.HTTP_400
            return

        # do business logic
        try:
            output = self.controller.get_users(data)
        except errors.ErrorWithStatus as err:
            output = {"error": str(err)}
            resp.status_code = err.status_code

        # format and return output
        resp.media = output
예제 #10
0
    def on_post(self,
                req: falcon.Request,
                resp: falcon.Response,
                rtype: str = None):
        """
        Handles POST requests.
        """
        # Check URL parameters
        if not rtype:
            raise falcon.HTTPBadRequest(
                title='Missing URL Parameters',
                description='Resource type identifier is required in the URL.')

        try:
            # Retrieve body parameters
            rname, rdata, ttl = req.media['rname'], req.media['rdata'], \
                                req.media.get('ttl', Config.get('default-record-ttl', 3600))

            # Validate record
            RecordValidator.validate(rname, rtype, rdata)

            # Create record entity
            record = Record(rname=rname, rtype=rtype, ttl=ttl, rdata=rdata)

            # Add and commit database transaction
            req.context.dbconn.add(record)
            req.context.dbconn.commit()

        except KeyError as e:
            raise falcon.HTTPBadRequest(
                title='Missing Body Parameters',
                description=f'Missing \'{str(e)}\' in the request body.')

        except (InvalidDNSRecord, InvalidDNSRecordType) as e:
            raise falcon.HTTPConflict(title='Conflict', description=str(e))

        except IntegrityError:

            # Rollback transaction
            req.context.dbconn.rollback()

            # Raise 409 conflict
            raise falcon.HTTPConflict(title='Conflict',
                                      description='Record already exists.')

        except SQLAlchemyError as e:

            # Rollback transaction
            req.context.dbconn.rollback()

            # Raise 500 internal server error
            raise falcon.HTTPInternalServerError(
                title='Internal Server Error',
                description=f'Message: {str(e)}')

        resp.status_code, resp.media = falcon.HTTP_201, {
            'rname': record.rname,
            'rtype': record.rtype,
            'rdata': record.rdata,
            'ttl': record.ttl,
        }
예제 #11
0
    def on_put(self,
               req: falcon.Request,
               resp: falcon.Response,
               rtype: str = None,
               rname: str = None):
        """
        Handles PUT requests.
        """
        # Check URL parameters
        if not rtype:
            raise falcon.HTTPBadRequest(
                title='Missing URL Parameters',
                description='Resource type identifier is required in the URL.')

        if not rname:
            raise falcon.HTTPBadRequest(
                title='Missing URL Parameters',
                description='Resource name identifier is required in the URL.')

        # Save update statement where parameters
        where = {'rtype': rtype, 'rname': rname}

        try:
            # Retrieve body parameters
            values = {
                p: req.media.get(p)
                for p in ('rname', 'rdata', 'ttl') if req.media.get(p)
            }

            # Validate record
            RecordValidator.validate(values.get('rname', rname), rtype,
                                     values['rdata'])

            # Add and commit database transaction
            updated = req.context.dbconn.query(Record).filter_by(
                **where).update(values, synchronize_session=False)
            req.context.dbconn.commit()

            # If no rows were updated, insert
            if updated == 0:

                # Add and commit database transaction
                req.context.dbconn.add(
                    Record(rname=values.get('rname', rname),
                           rtype=rtype,
                           rdata=values['rdata'],
                           ttl=values.get('ttl')))
                req.context.dbconn.commit()

        except KeyError as e:
            raise falcon.HTTPBadRequest(
                title='Missing Body Parameters',
                description=f'Missing \'{str(e)}\' in the request body.')

        except (InvalidDNSRecord, InvalidDNSRecordType) as e:
            raise falcon.HTTPConflict(title='Conflict', description=str(e))

        except IntegrityError:

            # Rollback transaction
            req.context.dbconn.rollback()

            # Raise 409 conflict
            raise falcon.HTTPConflict(title='Conflict',
                                      description='Record already exists.')

        except SQLAlchemyError as e:

            # Rollback transaction
            req.context.dbconn.rollback()

            # Raise 500 internal server error
            raise falcon.HTTPInternalServerError(
                title='Internal Server Error',
                description=f'Message: {str(e)}')

        resp.status_code, resp.media = falcon.HTTP_200, {
            'rname': values.get('rname', rname),
            'rtype': rtype,
            'rdata': values.get('rdata'),
        }