Example #1
0
    def test_create_user_on_metamask_login(self, session):
        user = User(id=2,
                    address='0xC257274276a4E539741Ca11b590B9447B26A8051',
                    username='******',
                    blockchain_id=1)

        user.save()

        retrieved = User.get_by_id(user.id)
        assert retrieved == user
Example #2
0
    def test_uploaded_at_defaults_to_datetime(self, session):
        user = User(id=2,
                    address='0xC257274276a4E539741Ca11b590B9447B26A8051',
                    username='******',
                    blockchain_id=1)

        user.save()

        assert bool(user.created_at)
        assert isinstance(user.created_at, dt.datetime)
Example #3
0
    def put(self):
        current_user = get_jwt_identity()

        user = User.get_user_from_jwt_token(current_user)

        if not user:
            return {'Error': 'Invalid token'}, 404

        request_json = request.get_json()
        review_id = request_json.get('review_id')
        review = Review.get_by_id(review_id)

        if not review:
            return {'Error': 'Review not found.'}, 404

        # TODO: add review vote submission page
        try:
            review_like = ReviewLike(dapp_id=review.dapp_id,
                                     user_id=user.id,
                                     review_id=review_id,
                                     helpful=1)
            review_like.save()

            review_like_schema = ReviewLikeSchema()
            serialized = review_like_schema.dump(review_like).data

            return serialized, 200

        except Exception as e:
            print('ERROR!!!: {}'.format(e))
            return {'Error': 'Cannot like review twice.'}, 404
Example #4
0
    def post(self):
        current_user = get_jwt_identity()
        user = User.get_user_from_jwt_token(current_user)

        if not user:
            return {'Error': 'Invalid token'}, 400

        request_json = request.get_json()
        dapp_id = request_json.get('dapp_id')
        rating = request_json.get('rating')
        title = request_json.get('title')
        review = request_json.get('review')
        feature = request_json.get('feature')

        if not dapp_id or not rating or not title or not review:
            return {'Error': 'Required field is empty.'}, 400

        if feature and not all([1 if x in Config.RATING_TYPES else 0 for x in feature.keys()]):
            return {'Error': 'Invalid featured rating fields.'}, 400

        dapp = Dapp.get_by_id(dapp_id)

        try:
            celery.send_task('add_review_with_metrics', (user.address, dapp.address, user.id, request_json))
            return {'state': 1, 'message': 'Review submitted successfully.', 'result': ''}, 200
        except Exception as e:
            print('EXCEPTION!!!: {}'.format(e))
            return {'state': 0, 'message': 'Failed to submit review.', 'result': ''}, 500
Example #5
0
    def put(self):
        current_user = get_jwt_identity()

        user = User.get_user_from_jwt_token(current_user)

        if not user:
            return {'Error': 'Invalid token'}, 404

        request_json = request.get_json()
        review_id = request_json.get('review_id')
        review = Review.get_by_id(review_id)

        if not review:
            return {'Error': 'Review not found.'}, 404

        try:
            review_like = (ReviewLike.query.filter_by(dapp_id=review.dapp_id,
                                                      user_id=user.id,
                                                      review_id=review_id)
                           .first())
            review_like.delete()

            return {'message': 'Review vote removed successfully.'}, 200

        except Exception as e:
            print('ERROR!!!: {}'.format(e))
            return {'Error': 'Cannot delete review vote.'}, 400
Example #6
0
def initialize(db):
    """
    Initialize data to testing session to satisfy foreign key constraints.
    """
    blockchain = Blockchain(name='Bitcoin', symbol='BTC')

    block_interval = BlockInterval(blockchain_id=1,
                                   time_start=0,
                                   time_stop=100,
                                   block_start=10,
                                   block_stop=20)

    user = User(address='0xb9D5ef5c0Cb313118da2960aE0F988Fe98699a31',
                username='******',
                blockchain_id=1,
                s3_id='7f1badea-9922-490c-bac8-fe06fdfa55a4')

    category = Category(name='Game')

    dapp = Dapp(name='CryptoKitties',
                url='cryptokitties.co',
                address=['0xb1690c08e213a35ed9bab7b318de14420fb57d8c'],
                author=['Brown Estate'],
                email='*****@*****.**',
                logo_path='tmp.png',
                screenshot=['tmp1.png', 'tmp2.png'],
                tagline='Dapp tagline',
                description='Long descrption here.',
                category_id=1,
                blockchain_id=1,
                user_id=1,
                s3_id='0f0bedea-9922-490c-bac8-fe06fdfa55a4')

    review1 = Review(dapp_id=1,
                     user_id=1,
                     rating=1,
                     title='Best Dapp Ever',
                     review='Long review here.')

    review2 = Review(dapp_id=1,
                     user_id=1,
                     rating=1,
                     title='Worst Dapp Ever',
                     review='Very Long review here.')

    review_of_the_day = DailyItem(item_name='review_of_the_day', item_id=1)

    dapp_of_the_day = DailyItem(item_name='dapp_of_the_day', item_id=1)

    db.session.add(blockchain)
    db.session.add(block_interval)
    db.session.add(user)
    db.session.add(category)
    db.session.add(dapp)
    db.session.add(review1)
    db.session.add(review2)
    db.session.add(review_of_the_day)
    db.session.add(dapp_of_the_day)
    db.session.commit()
Example #7
0
    def delete(review_id):
        current_user = get_jwt_identity()

        user = User.get_user_from_jwt_token(current_user)

        if not user:
            return {'Error': 'Invalid token'}, 404

        review = Review.get_by_id(review_id)

        if not review:
            return {'Error': 'Review does not exist.'}, 404

        if user.id != review.user_id:
            return {'Error': 'You do not own this review.'}, 401

        ReviewLike.query.filter_by(review_id=review_id).delete()
        Review.query.filter_by(id=review_id).delete()
        db.session.commit()

        return True, 200
Example #8
0
    def put(review_id):
        current_user = get_jwt_identity()

        user = User.get_user_from_jwt_token(current_user)

        if not user:
            return {'Error': 'Invalid token'}, 404

        request_json = request.get_json()
        rating = request_json.get('rating')
        review_text = request_json.get('review')
        feature = request_json.get('feature')
        title = request_json.get('title')

        review = Review.get_by_id(review_id)

        if not review:
            return {'Error': 'Review does not exist.'}, 404

        if rating:
            review.rating = rating

        if review_text:
            review.review = review_text

        if feature:
            review.feature = feature

        if title:
            review.title = title

        db.session.commit()

        review_schema = ReviewSchema()
        serialized = review_schema.dump(review).data

        return serialized, 200
Example #9
0
    def post():
        try:
            request_json = request.get_json()
            if not validate_request(request_json, [
                    'name', 'url', 'address', 'user_address', 'blockchain',
                    'category', 'author', 'email', 'logo', 'screenshots',
                    'tagline', 'description'
            ]):
                return {'Error': 'Missing required field.'}, 400

            logo = request_json.get('logo')
            screenshots = request_json.get('screenshots')
            logo_base64_string = logo.get('image')
            logo_file_type = logo.get('file_type')
            address = request_json.get('address')

            # Validate logo
            logo_file_type = logo_file_type.lower() if logo_file_type else None
            logo_error = valdate_image_type(logo_base64_string, logo_file_type)
            if logo_error:
                return {'Logo Error': logo_error}, 400

            # Validate max number of screenshots
            if len(screenshots) > 5:
                return {
                    'Error': 'Max number of screenshots allowed is 5.'
                }, 400

            # Validate screenshots
            for s in screenshots:
                base64_string = s.get('image')
                file_type = s.get('file_type')
                file_type = file_type.lower() if file_type else None

                error = valdate_image_type(base64_string, file_type)
                if error:
                    return {'Error': error}, 400

            s3_client = client(
                's3',
                aws_access_key_id=current_app.config['AWS_ACCESS_KEY_ID'],
                aws_secret_access_key=current_app.
                config['AWS_SECRET_ACCESS_KEY'])
            bucket = current_app.config['S3_BUCKET_NAME']

            # Create user
            user_address = request_json.get('user_address')

            if not verify_eth_address(user_address):
                return {'Error': 'Ethereum address not valid.'}, 400

            user = User.query.filter_by(address=user_address).first()
            # Upload image to S3
            s3_id = str(uuid4())

            if not user:
                user = User(address=user_address,
                            username=user_address,
                            blockchain_id=1,
                            s3_id=s3_id)
                user.save()

            # Upload image to S3
            s3_id = str(uuid4())

            try:
                logo_path = upload_image_to_s3(
                    s3_client,
                    bucket,
                    logo_base64_string,
                    logo_file_type,
                    path=f'dapp_submission/{s3_id}/logo')
            except Exception:
                return {'Error': 'Failed to upload image to S3.'}, 500

            # Upload screenshots to S3
            screenshot_names = []
            try:
                for s in screenshots:
                    base64_string = s.get('image')
                    file_type = s.get('file_type')
                    file_type = file_type.lower() if file_type else None
                    screenshot_name = upload_image_to_s3(
                        s3_client,
                        bucket,
                        base64_string,
                        file_type,
                        path=f'dapp_submission/{s3_id}/screenshots')
                    screenshot_names.append(screenshot_name)
            except Exception:
                return {'Error': 'Failed to upload image to S3.'}, 500

            dapp_submission = DappSubmission(
                name=request_json.get('name'),
                url=request_json.get('url'),
                address=address,
                blockchain_id=request_json.get('blockchain'),
                category_id=request_json.get('category'),
                user_id=user.id,
                author=request_json.get('author'),
                email=request_json.get('email'),
                logo_path=logo_path,
                screenshot=screenshot_names,
                tagline=request_json.get('tagline'),
                description=request_json.get('description'),
                whitepaper=request_json.get('whitepaper'),
                social_media=request_json.get('social_media'),
                s3_id=s3_id,
                status=DappSubmissionStatus.SUBMITTED.value)
            dapp_submission.save()

            #celery.send_task('update_contract_deployment_date', (dapp_submission.id, address))

            dapp_submission_schema = DappSubmissionSchema()
            result = dapp_submission_schema.dump(dapp_submission).data
            return result, 200

        except Exception as e:
            return {'Error': 'Failed to submit dapp: {}.'.format(e)}, 500