From 9dd62bb4f0e729b9d74bd0090b24b1655fc33a84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 24 Jan 2022 19:37:27 +0100 Subject: [PATCH 01/50] twitter backend part1 --- ayct_backend/__init__.py | 19 +++++++- ayct_backend/campaign/__init__.py | 31 ++++++++++++ ayct_backend/campaign/models.py | 7 +++ ayct_backend/twitter/__init__.py | 80 +++++++++++++++++++++++++++++++ ayct_backend/twitter/models.py | 11 +++++ 5 files changed, 147 insertions(+), 1 deletion(-) create mode 100644 ayct_backend/campaign/__init__.py create mode 100644 ayct_backend/campaign/models.py create mode 100644 ayct_backend/twitter/__init__.py create mode 100644 ayct_backend/twitter/models.py diff --git a/ayct_backend/__init__.py b/ayct_backend/__init__.py index 6c67c1c..5613982 100644 --- a/ayct_backend/__init__.py +++ b/ayct_backend/__init__.py @@ -1,9 +1,26 @@ +import os from flask import Flask +from flask_sqlalchemy import SQLAlchemy +from twitter import twitter +from twitter.models import twitter_db +from campaign import campaign +from campaign.models import campaign_db import pbrAyctCore.core as core def create_app(): app = Flask('ayct-backend') - + + app.config['SECRET_KEY'] = os.getenv('SECRET_KEY') + app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv('SQLALCHEMY_DATABASE_URI') + app.config['TWITTER_CONSUMER_KEY'] = os.getenv('TWITTER_CONSUMER_KEY') + app.config['TWITTER_CONSUMER_SECERT'] = os.getenv('TWITTER_CONSUMER_SECERT') + + twitter_db.init_app(app) + campaign_db.init_app(app) + + app.register_blueprint(twitter, url_prefix='/twitter') + app.register_blueprint(campaign, url_prefix='/campaign') + @app.route('/hello') def hello(): return core.getTestString() diff --git a/ayct_backend/campaign/__init__.py b/ayct_backend/campaign/__init__.py new file mode 100644 index 0000000..bb7017c --- /dev/null +++ b/ayct_backend/campaign/__init__.py @@ -0,0 +1,31 @@ +import os +from flask import Blueprint, current_app, request, jsonify + +campaign = Blueprint('campaign', __name__) + +@campaign.route('/account', methods=['GET']) +def get_twitter_accounts(): + content_type = request.headers.get('Content-Type') + if (content_type == 'application/json'): + json = request.json + return json + else: + return 'Content-Type not supported!' + +@campaign.route('/account', methods=['POST']) +def add_twitter_account(): + content_type = request.headers.get('Content-Type') + if (content_type == 'application/json'): + json = request.json + return json + else: + return 'Content-Type not supported!' + +@campaign.route('/account', methods=['DELETE']) +def delete_twitter_account(): + content_type = request.headers.get('Content-Type') + if (content_type == 'application/json'): + json = request.json + return json + else: + return 'Content-Type not supported!' diff --git a/ayct_backend/campaign/models.py b/ayct_backend/campaign/models.py new file mode 100644 index 0000000..8664272 --- /dev/null +++ b/ayct_backend/campaign/models.py @@ -0,0 +1,7 @@ +from flask_sqlalchemy import SQLAlchemy + +campaign_db = SQLAlchemy() + +class TwitterAccount(campaign_db.Model): + # fields here + pass \ No newline at end of file diff --git a/ayct_backend/twitter/__init__.py b/ayct_backend/twitter/__init__.py new file mode 100644 index 0000000..59e9591 --- /dev/null +++ b/ayct_backend/twitter/__init__.py @@ -0,0 +1,80 @@ +import os +from uuid import uuid4 +from requests_oauthlib import OAuth1Session +from flask import Blueprint, Response, current_app, request, jsonify +from models import * + +twitter = Blueprint('twitter', __name__) + +consumer_key = current_app.config["TWITTER_CONSUMER_KEY"] +consumer_secret = current_app.config["TWITTER_CONSUMER_SECERT"] + +@twitter.route('/account', methods=['GET']) +def get_twitter_accounts(): + twitter_accounts = TwitterAccount.query.all() + + accounts = [] + + for account in twitter_accounts: + account_data = {} + account_data['twitter_user_id'] = account.twitter_user_id + account_data['username'] = account.username + accounts.append(account_data) + + return Response( + jsonify({ + "twitter_accounts": accounts + }), + status=200, + ) + +@twitter.route('/account', methods=['POST']) +def add_twitter_account(): + content_type = request.headers.get('Content-Type') + if (content_type == 'application/json'): + json = request.json + if not json['veryfier']: + return Response( + "Invalid request!", + status=400, + ) + else: + oauth = OAuth1Session( + consumer_key, + client_secret=consumer_secret + ) + request_token_url = "https://api.twitter.com/oauth/request_token?oauth_callback=oob&x_auth_access_type=write" + fetch_response = oauth.fetch_request_token(request_token_url) + + access_token_url = "https://api.twitter.com/oauth/access_token" + oauth = OAuth1Session( + consumer_key, + client_secret=consumer_secret, + resource_owner_key=fetch_response.get("oauth_token"), + resource_owner_secret=fetch_response.get("oauth_token_secret"), + verifier=json['veryfier'], + ) + oauth_tokens = oauth.fetch_access_token(access_token_url) + + new_twitter_account = TwitterAccount( + twitter_user_id = oauth_tokens["user_id"], + username = oauth_tokens["screen_name"], + access_token = oauth_tokens["oauth_token"], + access_token_secret = oauth_tokens["oauth_token_secret"] + ) + + twitter_db.session.add(new_twitter_account) + twitter_db.session.commit() + + return Response( + jsonify({ + "message": "Twitter account succesfully added." + }), + status=201, + ) + else: + return Response( + "Content-type not supported!", + status=400, + ) + diff --git a/ayct_backend/twitter/models.py b/ayct_backend/twitter/models.py new file mode 100644 index 0000000..4eeacd2 --- /dev/null +++ b/ayct_backend/twitter/models.py @@ -0,0 +1,11 @@ +from enum import unique +from flask_sqlalchemy import SQLAlchemy + +twitter_db = SQLAlchemy() + +class TwitterAccount(twitter_db.Model): + id = twitter_db.Column(twitter_db.Integer, primary_key=True) + twitter_user_id = twitter_db.Column(twitter_db.String(16), unique=True) + username = twitter_db.Column(twitter_db.String(16), unique=True) + access_token = twitter_db.Column(twitter_db.String(256)) + access_token_secret = twitter_db.Column(twitter_db.String(256)) From 79070282836721676b17191d72d3132d802a02bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 24 Jan 2022 20:03:33 +0100 Subject: [PATCH 02/50] req fix --- ayct_backend/__init__.py | 2 +- requirements.txt | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/ayct_backend/__init__.py b/ayct_backend/__init__.py index 5613982..7eda91d 100644 --- a/ayct_backend/__init__.py +++ b/ayct_backend/__init__.py @@ -11,7 +11,7 @@ def create_app(): app = Flask('ayct-backend') app.config['SECRET_KEY'] = os.getenv('SECRET_KEY') - app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv('SQLALCHEMY_DATABASE_URI') + app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv('DATABASE_URL') app.config['TWITTER_CONSUMER_KEY'] = os.getenv('TWITTER_CONSUMER_KEY') app.config['TWITTER_CONSUMER_SECERT'] = os.getenv('TWITTER_CONSUMER_SECERT') diff --git a/requirements.txt b/requirements.txt index 85e0fb5..caf0ed9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,5 @@ Flask==2.0.2 flask_restful==0.3.9 +flask_sqlalchemy==2.5.1 +requests_oauthlib==1.3.0 pytest==6.2.5 From 38094e7b26ef4e38d361ed7e98b7b030defb63ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 24 Jan 2022 20:06:33 +0100 Subject: [PATCH 03/50] docker fix --- Dockerfile | 4 ++-- ayct_backend/__init__.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 5d080d0..e6097e4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,8 +4,8 @@ USER root WORKDIR /app COPY . . -RUN chmod u+x setup_core.sh -RUN bash setup_core.sh +#RUN chmod u+x setup_core.sh +#RUN bash setup_core.sh RUN pip3 install -r requirements.txt EXPOSE 5000/udp EXPOSE 5000/tcp diff --git a/ayct_backend/__init__.py b/ayct_backend/__init__.py index 7eda91d..3a7a763 100644 --- a/ayct_backend/__init__.py +++ b/ayct_backend/__init__.py @@ -5,7 +5,7 @@ from twitter import twitter from twitter.models import twitter_db from campaign import campaign from campaign.models import campaign_db -import pbrAyctCore.core as core +#import pbrAyctCore.core as core def create_app(): app = Flask('ayct-backend') @@ -23,6 +23,6 @@ def create_app(): @app.route('/hello') def hello(): - return core.getTestString() + return "Hello world!" return app \ No newline at end of file From 34a8af1e1786676062ccb3580dbcb35aabc8fb2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 24 Jan 2022 20:26:12 +0100 Subject: [PATCH 04/50] import fix --- ayct_backend/__init__.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ayct_backend/__init__.py b/ayct_backend/__init__.py index 3a7a763..b7531e8 100644 --- a/ayct_backend/__init__.py +++ b/ayct_backend/__init__.py @@ -1,10 +1,10 @@ import os from flask import Flask from flask_sqlalchemy import SQLAlchemy -from twitter import twitter -from twitter.models import twitter_db -from campaign import campaign -from campaign.models import campaign_db +from ayct_backend.twitter import twitter +from ayct_backend.twitter.models import twitter_db +from ayct_backend.campaign import campaign +from ayct_backend.campaign.models import campaign_db #import pbrAyctCore.core as core def create_app(): From 5d730cdfe315c33b1ee29f165ab127c57f16dfef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 24 Jan 2022 20:30:06 +0100 Subject: [PATCH 05/50] import fix 2 --- ayct_backend/twitter/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ayct_backend/twitter/__init__.py b/ayct_backend/twitter/__init__.py index 59e9591..d174c2a 100644 --- a/ayct_backend/twitter/__init__.py +++ b/ayct_backend/twitter/__init__.py @@ -2,7 +2,7 @@ import os from uuid import uuid4 from requests_oauthlib import OAuth1Session from flask import Blueprint, Response, current_app, request, jsonify -from models import * +from ayct_backend.twitter.models import * twitter = Blueprint('twitter', __name__) From 7dd6a34338075ad24d07fd795bb51d26b4ac71c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 24 Jan 2022 20:34:03 +0100 Subject: [PATCH 06/50] os var import fix --- ayct_backend/twitter/__init__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ayct_backend/twitter/__init__.py b/ayct_backend/twitter/__init__.py index d174c2a..5b7554a 100644 --- a/ayct_backend/twitter/__init__.py +++ b/ayct_backend/twitter/__init__.py @@ -6,9 +6,6 @@ from ayct_backend.twitter.models import * twitter = Blueprint('twitter', __name__) -consumer_key = current_app.config["TWITTER_CONSUMER_KEY"] -consumer_secret = current_app.config["TWITTER_CONSUMER_SECERT"] - @twitter.route('/account', methods=['GET']) def get_twitter_accounts(): twitter_accounts = TwitterAccount.query.all() @@ -39,6 +36,9 @@ def add_twitter_account(): status=400, ) else: + consumer_key = current_app.config["TWITTER_CONSUMER_KEY"] + consumer_secret = current_app.config["TWITTER_CONSUMER_SECERT"] + oauth = OAuth1Session( consumer_key, client_secret=consumer_secret From 426feab1fda8a3a49e27379b1a7466bfa7b1229b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 24 Jan 2022 20:48:33 +0100 Subject: [PATCH 07/50] twt account model fix --- ayct_backend/twitter/models.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/ayct_backend/twitter/models.py b/ayct_backend/twitter/models.py index 4eeacd2..8650611 100644 --- a/ayct_backend/twitter/models.py +++ b/ayct_backend/twitter/models.py @@ -4,8 +4,10 @@ from flask_sqlalchemy import SQLAlchemy twitter_db = SQLAlchemy() class TwitterAccount(twitter_db.Model): - id = twitter_db.Column(twitter_db.Integer, primary_key=True) - twitter_user_id = twitter_db.Column(twitter_db.String(16), unique=True) - username = twitter_db.Column(twitter_db.String(16), unique=True) - access_token = twitter_db.Column(twitter_db.String(256)) - access_token_secret = twitter_db.Column(twitter_db.String(256)) + __tablename__ = 'twitter_account' + + account_id = twitter_db.Column(twitter_db.Integer, primary_key=True) + twitter_user_id = twitter_db.Column(twitter_db.String(16), unique=True, nullable=False) + username = twitter_db.Column(twitter_db.String(16), unique=True, nullable=False) + access_token = twitter_db.Column(twitter_db.String(256), nullable=False) + access_token_secret = twitter_db.Column(twitter_db.String(256), nullable=False) From 74b2cd9d91e70a76c01f557590d849542d674888 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 24 Jan 2022 21:04:19 +0100 Subject: [PATCH 08/50] campaign model fix --- ayct_backend/campaign/models.py | 7 ++++--- ayct_backend/twitter/models.py | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/ayct_backend/campaign/models.py b/ayct_backend/campaign/models.py index 8664272..a29447b 100644 --- a/ayct_backend/campaign/models.py +++ b/ayct_backend/campaign/models.py @@ -2,6 +2,7 @@ from flask_sqlalchemy import SQLAlchemy campaign_db = SQLAlchemy() -class TwitterAccount(campaign_db.Model): - # fields here - pass \ No newline at end of file +class TwitterCampaign(campaign_db.Model): + __tablename__ = 'twitter_campaign' + + campaign_id = campaign_db.Column(campaign_db.Integer, primary_key=True, nullable=False) diff --git a/ayct_backend/twitter/models.py b/ayct_backend/twitter/models.py index 8650611..677088f 100644 --- a/ayct_backend/twitter/models.py +++ b/ayct_backend/twitter/models.py @@ -6,7 +6,7 @@ twitter_db = SQLAlchemy() class TwitterAccount(twitter_db.Model): __tablename__ = 'twitter_account' - account_id = twitter_db.Column(twitter_db.Integer, primary_key=True) + account_id = twitter_db.Column(twitter_db.Integer, primary_key=True, nullable=False) twitter_user_id = twitter_db.Column(twitter_db.String(16), unique=True, nullable=False) username = twitter_db.Column(twitter_db.String(16), unique=True, nullable=False) access_token = twitter_db.Column(twitter_db.String(256), nullable=False) From 5ba33a5f0f39b5dd00b0fe6c30d1bf3f95c8c147 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 24 Jan 2022 21:17:01 +0100 Subject: [PATCH 09/50] auth token in request --- ayct_backend/campaign/models.py | 2 +- ayct_backend/twitter/__init__.py | 13 +++---------- ayct_backend/twitter/models.py | 2 +- 3 files changed, 5 insertions(+), 12 deletions(-) diff --git a/ayct_backend/campaign/models.py b/ayct_backend/campaign/models.py index a29447b..8db7bb8 100644 --- a/ayct_backend/campaign/models.py +++ b/ayct_backend/campaign/models.py @@ -5,4 +5,4 @@ campaign_db = SQLAlchemy() class TwitterCampaign(campaign_db.Model): __tablename__ = 'twitter_campaign' - campaign_id = campaign_db.Column(campaign_db.Integer, primary_key=True, nullable=False) + campaign_id = campaign_db.Column(campaign_db.Integer, primary_key=True) diff --git a/ayct_backend/twitter/__init__.py b/ayct_backend/twitter/__init__.py index 5b7554a..775d928 100644 --- a/ayct_backend/twitter/__init__.py +++ b/ayct_backend/twitter/__init__.py @@ -30,7 +30,7 @@ def add_twitter_account(): content_type = request.headers.get('Content-Type') if (content_type == 'application/json'): json = request.json - if not json['veryfier']: + if not json['veryfier'] or not json['oauth_token'] or not json['oauth_token_secret']: return Response( "Invalid request!", status=400, @@ -39,19 +39,12 @@ def add_twitter_account(): consumer_key = current_app.config["TWITTER_CONSUMER_KEY"] consumer_secret = current_app.config["TWITTER_CONSUMER_SECERT"] - oauth = OAuth1Session( - consumer_key, - client_secret=consumer_secret - ) - request_token_url = "https://api.twitter.com/oauth/request_token?oauth_callback=oob&x_auth_access_type=write" - fetch_response = oauth.fetch_request_token(request_token_url) - access_token_url = "https://api.twitter.com/oauth/access_token" oauth = OAuth1Session( consumer_key, client_secret=consumer_secret, - resource_owner_key=fetch_response.get("oauth_token"), - resource_owner_secret=fetch_response.get("oauth_token_secret"), + resource_owner_key=json['oauth_token'], + resource_owner_secret=json['oauth_token_secret'], verifier=json['veryfier'], ) oauth_tokens = oauth.fetch_access_token(access_token_url) diff --git a/ayct_backend/twitter/models.py b/ayct_backend/twitter/models.py index 677088f..8650611 100644 --- a/ayct_backend/twitter/models.py +++ b/ayct_backend/twitter/models.py @@ -6,7 +6,7 @@ twitter_db = SQLAlchemy() class TwitterAccount(twitter_db.Model): __tablename__ = 'twitter_account' - account_id = twitter_db.Column(twitter_db.Integer, primary_key=True, nullable=False) + account_id = twitter_db.Column(twitter_db.Integer, primary_key=True) twitter_user_id = twitter_db.Column(twitter_db.String(16), unique=True, nullable=False) username = twitter_db.Column(twitter_db.String(16), unique=True, nullable=False) access_token = twitter_db.Column(twitter_db.String(256), nullable=False) From 9bc20aea0731066083ee242e742e87e15c99d4ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 24 Jan 2022 21:41:18 +0100 Subject: [PATCH 10/50] create tables --- ayct_backend/__init__.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ayct_backend/__init__.py b/ayct_backend/__init__.py index b7531e8..3e26235 100644 --- a/ayct_backend/__init__.py +++ b/ayct_backend/__init__.py @@ -11,13 +11,19 @@ def create_app(): app = Flask('ayct-backend') app.config['SECRET_KEY'] = os.getenv('SECRET_KEY') - app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv('DATABASE_URL') + database_uri = os.getenv('DATABASE_URL') + if database_uri and database_uri.startswith("postgres://"): + database_uri = database_uri.replace("postgres://", "postgresql://", 1) + app.config['SQLALCHEMY_DATABASE_URI'] = database_uri app.config['TWITTER_CONSUMER_KEY'] = os.getenv('TWITTER_CONSUMER_KEY') app.config['TWITTER_CONSUMER_SECERT'] = os.getenv('TWITTER_CONSUMER_SECERT') twitter_db.init_app(app) campaign_db.init_app(app) + twitter_db.create_all() + #campaign_db.create_all() + app.register_blueprint(twitter, url_prefix='/twitter') app.register_blueprint(campaign, url_prefix='/campaign') From 1c0179e088bca68764a3859e173a7557d95c71ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 24 Jan 2022 21:52:38 +0100 Subject: [PATCH 11/50] create tables fix --- ayct_backend/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ayct_backend/__init__.py b/ayct_backend/__init__.py index 3e26235..fea4c9d 100644 --- a/ayct_backend/__init__.py +++ b/ayct_backend/__init__.py @@ -21,8 +21,8 @@ def create_app(): twitter_db.init_app(app) campaign_db.init_app(app) - twitter_db.create_all() - #campaign_db.create_all() + twitter_db.create_all(app=app) + #campaign_db.create_all(app=app) app.register_blueprint(twitter, url_prefix='/twitter') app.register_blueprint(campaign, url_prefix='/campaign') From 03689c9b0a5d723d50c88f896428d4f394ba1b5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 24 Jan 2022 21:58:36 +0100 Subject: [PATCH 12/50] db requirement lib --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index caf0ed9..799a9fe 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,5 @@ Flask==2.0.2 flask_restful==0.3.9 flask_sqlalchemy==2.5.1 requests_oauthlib==1.3.0 +psycopg2==2.9.3 pytest==6.2.5 From 8ddfdf06394f3efb8a807157632eb24d7c2a5f93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 24 Jan 2022 22:05:07 +0100 Subject: [PATCH 13/50] fix twt user id length --- ayct_backend/twitter/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ayct_backend/twitter/models.py b/ayct_backend/twitter/models.py index 8650611..88ce407 100644 --- a/ayct_backend/twitter/models.py +++ b/ayct_backend/twitter/models.py @@ -7,7 +7,7 @@ class TwitterAccount(twitter_db.Model): __tablename__ = 'twitter_account' account_id = twitter_db.Column(twitter_db.Integer, primary_key=True) - twitter_user_id = twitter_db.Column(twitter_db.String(16), unique=True, nullable=False) + twitter_user_id = twitter_db.Column(twitter_db.String(32), unique=True, nullable=False) username = twitter_db.Column(twitter_db.String(16), unique=True, nullable=False) access_token = twitter_db.Column(twitter_db.String(256), nullable=False) access_token_secret = twitter_db.Column(twitter_db.String(256), nullable=False) From f8aab50eaead1b5c1c1d6bbbb658eaa997729c44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 24 Jan 2022 22:12:07 +0100 Subject: [PATCH 14/50] drop tables --- ayct_backend/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ayct_backend/__init__.py b/ayct_backend/__init__.py index fea4c9d..d2a0034 100644 --- a/ayct_backend/__init__.py +++ b/ayct_backend/__init__.py @@ -21,6 +21,7 @@ def create_app(): twitter_db.init_app(app) campaign_db.init_app(app) + twitter_db.drop_all(app=app) twitter_db.create_all(app=app) #campaign_db.create_all(app=app) From a41a7dc052a7a9de3fd151798a40354a6ab1dac8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 24 Jan 2022 22:20:54 +0100 Subject: [PATCH 15/50] fix twitter api responses --- ayct_backend/twitter/__init__.py | 29 +++++++---------------------- 1 file changed, 7 insertions(+), 22 deletions(-) diff --git a/ayct_backend/twitter/__init__.py b/ayct_backend/twitter/__init__.py index 775d928..7afb92c 100644 --- a/ayct_backend/twitter/__init__.py +++ b/ayct_backend/twitter/__init__.py @@ -18,12 +18,9 @@ def get_twitter_accounts(): account_data['username'] = account.username accounts.append(account_data) - return Response( - jsonify({ - "twitter_accounts": accounts - }), - status=200, - ) + return jsonify({ + "twitter_accounts": accounts + }), 200 @twitter.route('/account', methods=['POST']) def add_twitter_account(): @@ -31,10 +28,7 @@ def add_twitter_account(): if (content_type == 'application/json'): json = request.json if not json['veryfier'] or not json['oauth_token'] or not json['oauth_token_secret']: - return Response( - "Invalid request!", - status=400, - ) + return "Invalid request!", 400 else: consumer_key = current_app.config["TWITTER_CONSUMER_KEY"] consumer_secret = current_app.config["TWITTER_CONSUMER_SECERT"] @@ -58,16 +52,7 @@ def add_twitter_account(): twitter_db.session.add(new_twitter_account) twitter_db.session.commit() - - return Response( - jsonify({ - "message": "Twitter account succesfully added." - }), - status=201, - ) + + return "Twitter account succesfully added.", 201 else: - return Response( - "Content-type not supported!", - status=400, - ) - + return "Content-type not supported!", 400 From a295309398c7349b3c3b70cda3dbe0491cf5914b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 24 Jan 2022 23:20:49 +0100 Subject: [PATCH 16/50] campaign api v1 --- ayct_backend/__init__.py | 3 +- ayct_backend/campaign/__init__.py | 78 +++++++++++++++++++++++-------- ayct_backend/campaign/models.py | 5 ++ ayct_backend/twitter/__init__.py | 9 ++-- ayct_backend/twitter/models.py | 2 +- 5 files changed, 71 insertions(+), 26 deletions(-) diff --git a/ayct_backend/__init__.py b/ayct_backend/__init__.py index d2a0034..53d9e23 100644 --- a/ayct_backend/__init__.py +++ b/ayct_backend/__init__.py @@ -23,7 +23,8 @@ def create_app(): twitter_db.drop_all(app=app) twitter_db.create_all(app=app) - #campaign_db.create_all(app=app) + campaign_db.drop_all(app=app) + campaign_db.create_all(app=app) app.register_blueprint(twitter, url_prefix='/twitter') app.register_blueprint(campaign, url_prefix='/campaign') diff --git a/ayct_backend/campaign/__init__.py b/ayct_backend/campaign/__init__.py index bb7017c..4256fa6 100644 --- a/ayct_backend/campaign/__init__.py +++ b/ayct_backend/campaign/__init__.py @@ -1,31 +1,71 @@ import os +from requests_oauthlib import OAuth1Session from flask import Blueprint, current_app, request, jsonify +from ayct_backend.twitter.models import * +from ayct_backend.campaign.models import * campaign = Blueprint('campaign', __name__) -@campaign.route('/account', methods=['GET']) -def get_twitter_accounts(): - content_type = request.headers.get('Content-Type') - if (content_type == 'application/json'): - json = request.json - return json - else: - return 'Content-Type not supported!' +@campaign.route('/campaign', methods=['GET']) +def get_twitter_campaigns(): + twitter_campaigns = TwitterCampaign.query.all() -@campaign.route('/account', methods=['POST']) + campaigns = [] + + for campaign in twitter_campaigns: + campaign_data = {} + campaign_data['campaign_name'] = campaign.campaign_name + campaign_data['twitter_account_id'] = campaign.twitter_account_id + campaign_data['user_input'] = campaign.user_input + campaign_data['generated_content'] = campaign.generated_content + campaign_data['twitter_post_id'] = campaign.twitter_post_id + campaigns.append(campaign_data) + + return jsonify({ + "twitter_campaigns": campaigns + }), 200 + +@campaign.route('/campaign', methods=['POST']) def add_twitter_account(): content_type = request.headers.get('Content-Type') if (content_type == 'application/json'): json = request.json - return json - else: - return 'Content-Type not supported!' + if not json['campaign_name'] or not json['user_input'] or not json['twitter_account_id']: + return "Invalid request!", 400 + else: + consumer_key = current_app.config["TWITTER_CONSUMER_KEY"] + consumer_secret = current_app.config["TWITTER_CONSUMER_SECERT"] -@campaign.route('/account', methods=['DELETE']) -def delete_twitter_account(): - content_type = request.headers.get('Content-Type') - if (content_type == 'application/json'): - json = request.json - return json + twitter_account = TwitterAccount.query.filter_by(twitter_account_id=json['twitter_account_id']).first() + + # generate campaign content, change after core integration + generated_content = "This is wonderful post content generated by our very smart core API!" + + # create post on twitter + oauth = OAuth1Session( + consumer_key, + client_secret=consumer_secret, + resource_owner_key=twitter_account.access_token, + resource_owner_secret=twitter_account.access_token_secret, + ) + + response = oauth.post( + "https://api.twitter.com/2/tweets", + json={"text": generated_content}, + ) + + # save campaign to database + new_twitter_campaign = TwitterCampaign( + campaign_name = json['campaign_name'], + twitter_account_id = json['twitter_account_id'], + user_input = json['user_input'], + generated_content = generated_content, + twitter_post_id = response['id'] + ) + + campaign_db.session.add(new_twitter_campaign) + campaign_db.session.commit() + + return "Campaign succesfully created.", 201 else: - return 'Content-Type not supported!' + return "Content-type not supported!", 400 diff --git a/ayct_backend/campaign/models.py b/ayct_backend/campaign/models.py index 8db7bb8..d93cf08 100644 --- a/ayct_backend/campaign/models.py +++ b/ayct_backend/campaign/models.py @@ -6,3 +6,8 @@ class TwitterCampaign(campaign_db.Model): __tablename__ = 'twitter_campaign' campaign_id = campaign_db.Column(campaign_db.Integer, primary_key=True) + campaign_name = campaign_db.Column(campaign_db.String(64), nullable=False) + twitter_account_id = campaign_db.Column(campaign_db.String(32), unique=True, nullable=False) + user_input = campaign_db.Column(campaign_db.String(100), nullable=False) + generated_content = campaign_db.Column(campaign_db.String(300), nullable=False) + twitter_post_id = campaign_db.Column(campaign_db.String(32), unique=True, nullable=False) diff --git a/ayct_backend/twitter/__init__.py b/ayct_backend/twitter/__init__.py index 7afb92c..05c045f 100644 --- a/ayct_backend/twitter/__init__.py +++ b/ayct_backend/twitter/__init__.py @@ -1,5 +1,4 @@ import os -from uuid import uuid4 from requests_oauthlib import OAuth1Session from flask import Blueprint, Response, current_app, request, jsonify from ayct_backend.twitter.models import * @@ -44,10 +43,10 @@ def add_twitter_account(): oauth_tokens = oauth.fetch_access_token(access_token_url) new_twitter_account = TwitterAccount( - twitter_user_id = oauth_tokens["user_id"], - username = oauth_tokens["screen_name"], - access_token = oauth_tokens["oauth_token"], - access_token_secret = oauth_tokens["oauth_token_secret"] + twitter_account_id = oauth_tokens['user_id'], + username = oauth_tokens['screen_name'], + access_token = oauth_tokens['oauth_token'], + access_token_secret = oauth_tokens['oauth_token_secret'] ) twitter_db.session.add(new_twitter_account) diff --git a/ayct_backend/twitter/models.py b/ayct_backend/twitter/models.py index 88ce407..a17f9bd 100644 --- a/ayct_backend/twitter/models.py +++ b/ayct_backend/twitter/models.py @@ -7,7 +7,7 @@ class TwitterAccount(twitter_db.Model): __tablename__ = 'twitter_account' account_id = twitter_db.Column(twitter_db.Integer, primary_key=True) - twitter_user_id = twitter_db.Column(twitter_db.String(32), unique=True, nullable=False) + twitter_account_id = twitter_db.Column(twitter_db.String(32), unique=True, nullable=False) username = twitter_db.Column(twitter_db.String(16), unique=True, nullable=False) access_token = twitter_db.Column(twitter_db.String(256), nullable=False) access_token_secret = twitter_db.Column(twitter_db.String(256), nullable=False) From 9af91e3760fcdea9ffe6d2749993404724ec4a7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 24 Jan 2022 23:26:55 +0100 Subject: [PATCH 17/50] fix get twitter users --- ayct_backend/__init__.py | 1 - ayct_backend/twitter/__init__.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/ayct_backend/__init__.py b/ayct_backend/__init__.py index 53d9e23..f12cad3 100644 --- a/ayct_backend/__init__.py +++ b/ayct_backend/__init__.py @@ -21,7 +21,6 @@ def create_app(): twitter_db.init_app(app) campaign_db.init_app(app) - twitter_db.drop_all(app=app) twitter_db.create_all(app=app) campaign_db.drop_all(app=app) campaign_db.create_all(app=app) diff --git a/ayct_backend/twitter/__init__.py b/ayct_backend/twitter/__init__.py index 05c045f..7e4615f 100644 --- a/ayct_backend/twitter/__init__.py +++ b/ayct_backend/twitter/__init__.py @@ -13,7 +13,7 @@ def get_twitter_accounts(): for account in twitter_accounts: account_data = {} - account_data['twitter_user_id'] = account.twitter_user_id + account_data['twitter_account_id'] = account.twitter_account_id account_data['username'] = account.username accounts.append(account_data) From 7eeff9bd4cb48c3da01d8be010c5f2319ed66b2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 24 Jan 2022 23:32:06 +0100 Subject: [PATCH 18/50] fix twitter post response --- ayct_backend/campaign/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ayct_backend/campaign/__init__.py b/ayct_backend/campaign/__init__.py index 4256fa6..8a62ceb 100644 --- a/ayct_backend/campaign/__init__.py +++ b/ayct_backend/campaign/__init__.py @@ -52,7 +52,7 @@ def add_twitter_account(): response = oauth.post( "https://api.twitter.com/2/tweets", json={"text": generated_content}, - ) + ).json() # save campaign to database new_twitter_campaign = TwitterCampaign( From 6679436a9e85c68bc929fb00dd203001c5ea5327 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 24 Jan 2022 23:35:43 +0100 Subject: [PATCH 19/50] twitter post response fix 2 --- ayct_backend/campaign/__init__.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ayct_backend/campaign/__init__.py b/ayct_backend/campaign/__init__.py index 8a62ceb..53ccee3 100644 --- a/ayct_backend/campaign/__init__.py +++ b/ayct_backend/campaign/__init__.py @@ -52,7 +52,10 @@ def add_twitter_account(): response = oauth.post( "https://api.twitter.com/2/tweets", json={"text": generated_content}, - ).json() + ) + + print(response) + print(response.json()) # save campaign to database new_twitter_campaign = TwitterCampaign( From ac7e7a44e03562527289cbd0ef1a85c1d2f29e7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 24 Jan 2022 23:42:20 +0100 Subject: [PATCH 20/50] twitter post response fix 3 --- ayct_backend/campaign/__init__.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/ayct_backend/campaign/__init__.py b/ayct_backend/campaign/__init__.py index 53ccee3..6c1edd5 100644 --- a/ayct_backend/campaign/__init__.py +++ b/ayct_backend/campaign/__init__.py @@ -52,10 +52,7 @@ def add_twitter_account(): response = oauth.post( "https://api.twitter.com/2/tweets", json={"text": generated_content}, - ) - - print(response) - print(response.json()) + ).json()['data'] # save campaign to database new_twitter_campaign = TwitterCampaign( From abf43f17ecd0f4fbfcef4e5a841b59c4c5c1e4da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Tue, 25 Jan 2022 14:07:07 +0100 Subject: [PATCH 21/50] core integration v1 --- ayct_backend/__init__.py | 1 - ayct_backend/campaign/__init__.py | 18 ++++++++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/ayct_backend/__init__.py b/ayct_backend/__init__.py index f12cad3..d96bf53 100644 --- a/ayct_backend/__init__.py +++ b/ayct_backend/__init__.py @@ -22,7 +22,6 @@ def create_app(): campaign_db.init_app(app) twitter_db.create_all(app=app) - campaign_db.drop_all(app=app) campaign_db.create_all(app=app) app.register_blueprint(twitter, url_prefix='/twitter') diff --git a/ayct_backend/campaign/__init__.py b/ayct_backend/campaign/__init__.py index 6c1edd5..23fe447 100644 --- a/ayct_backend/campaign/__init__.py +++ b/ayct_backend/campaign/__init__.py @@ -1,4 +1,5 @@ -import os +import requests +import json from requests_oauthlib import OAuth1Session from flask import Blueprint, current_app, request, jsonify from ayct_backend.twitter.models import * @@ -38,8 +39,17 @@ def add_twitter_account(): twitter_account = TwitterAccount.query.filter_by(twitter_account_id=json['twitter_account_id']).first() - # generate campaign content, change after core integration - generated_content = "This is wonderful post content generated by our very smart core API!" + # generate campaign content + core_url = 'http://65.108.80.28:4999/generate' + payload = { + "data": json['user_input'], + "length": 400 + } + + response = requests.post(core_url, headers={"Content-Type":"application/json"}, data=json.dumps(payload)) + + generated_content = response.content.decode("utf-8").replace('<|endoftext|>', '') + #generated_content = "This is wonderful post content generated by our very smart core API!" # create post on twitter oauth = OAuth1Session( @@ -51,7 +61,7 @@ def add_twitter_account(): response = oauth.post( "https://api.twitter.com/2/tweets", - json={"text": generated_content}, + json={"text": generated_content[0:260]}, ).json()['data'] # save campaign to database From 498d514708f67779dfff49e382ae300d1e28087b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Tue, 25 Jan 2022 14:14:54 +0100 Subject: [PATCH 22/50] core integration fix 1 --- ayct_backend/campaign/__init__.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/ayct_backend/campaign/__init__.py b/ayct_backend/campaign/__init__.py index 23fe447..224940a 100644 --- a/ayct_backend/campaign/__init__.py +++ b/ayct_backend/campaign/__init__.py @@ -30,19 +30,19 @@ def get_twitter_campaigns(): def add_twitter_account(): content_type = request.headers.get('Content-Type') if (content_type == 'application/json'): - json = request.json - if not json['campaign_name'] or not json['user_input'] or not json['twitter_account_id']: + request_json = request.json + if not request_json['campaign_name'] or not request_json['user_input'] or not request_json['twitter_account_id']: return "Invalid request!", 400 else: consumer_key = current_app.config["TWITTER_CONSUMER_KEY"] consumer_secret = current_app.config["TWITTER_CONSUMER_SECERT"] - twitter_account = TwitterAccount.query.filter_by(twitter_account_id=json['twitter_account_id']).first() + twitter_account = TwitterAccount.query.filter_by(twitter_account_id=request_json['twitter_account_id']).first() # generate campaign content core_url = 'http://65.108.80.28:4999/generate' payload = { - "data": json['user_input'], + "data": request_json['user_input'], "length": 400 } @@ -66,9 +66,9 @@ def add_twitter_account(): # save campaign to database new_twitter_campaign = TwitterCampaign( - campaign_name = json['campaign_name'], - twitter_account_id = json['twitter_account_id'], - user_input = json['user_input'], + campaign_name = request_json['campaign_name'], + twitter_account_id = request_json['twitter_account_id'], + user_input = request_json['user_input'], generated_content = generated_content, twitter_post_id = response['id'] ) From 315292f0e8e66d8681860fe8fcdf046ae0b143f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Tue, 25 Jan 2022 14:30:40 +0100 Subject: [PATCH 23/50] core integration fix db --- ayct_backend/campaign/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ayct_backend/campaign/__init__.py b/ayct_backend/campaign/__init__.py index 224940a..be12d62 100644 --- a/ayct_backend/campaign/__init__.py +++ b/ayct_backend/campaign/__init__.py @@ -69,7 +69,7 @@ def add_twitter_account(): campaign_name = request_json['campaign_name'], twitter_account_id = request_json['twitter_account_id'], user_input = request_json['user_input'], - generated_content = generated_content, + generated_content = generated_content[0:260], twitter_post_id = response['id'] ) From aeb87ec2726e9697d35e82b925713e672ed60978 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Tue, 25 Jan 2022 14:40:43 +0100 Subject: [PATCH 24/50] core integration fix db 2 --- ayct_backend/__init__.py | 1 + ayct_backend/campaign/models.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ayct_backend/__init__.py b/ayct_backend/__init__.py index d96bf53..f12cad3 100644 --- a/ayct_backend/__init__.py +++ b/ayct_backend/__init__.py @@ -22,6 +22,7 @@ def create_app(): campaign_db.init_app(app) twitter_db.create_all(app=app) + campaign_db.drop_all(app=app) campaign_db.create_all(app=app) app.register_blueprint(twitter, url_prefix='/twitter') diff --git a/ayct_backend/campaign/models.py b/ayct_backend/campaign/models.py index d93cf08..cf7fd99 100644 --- a/ayct_backend/campaign/models.py +++ b/ayct_backend/campaign/models.py @@ -7,7 +7,7 @@ class TwitterCampaign(campaign_db.Model): campaign_id = campaign_db.Column(campaign_db.Integer, primary_key=True) campaign_name = campaign_db.Column(campaign_db.String(64), nullable=False) - twitter_account_id = campaign_db.Column(campaign_db.String(32), unique=True, nullable=False) + twitter_account_id = campaign_db.Column(campaign_db.String(32), nullable=False) user_input = campaign_db.Column(campaign_db.String(100), nullable=False) generated_content = campaign_db.Column(campaign_db.String(300), nullable=False) twitter_post_id = campaign_db.Column(campaign_db.String(32), unique=True, nullable=False) From 61096f0c4fd9f77bd07cbfe6888a686236b6931e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 31 Jan 2022 17:10:35 +0100 Subject: [PATCH 25/50] request logs --- ayct_backend/__init__.py | 8 +++++++- ayct_backend/twitter/__init__.py | 1 - 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/ayct_backend/__init__.py b/ayct_backend/__init__.py index f12cad3..7b60880 100644 --- a/ayct_backend/__init__.py +++ b/ayct_backend/__init__.py @@ -21,13 +21,19 @@ def create_app(): twitter_db.init_app(app) campaign_db.init_app(app) + twitter_db.drop_all(app=app) twitter_db.create_all(app=app) - campaign_db.drop_all(app=app) + twitter_db.drop_all(app=app) campaign_db.create_all(app=app) app.register_blueprint(twitter, url_prefix='/twitter') app.register_blueprint(campaign, url_prefix='/campaign') + @app.before_request + def log_request_info(): + app.logger.debug('Headers: %s', request.headers) + app.logger.debug('Body: %s', request.get_data()) + @app.route('/hello') def hello(): return "Hello world!" diff --git a/ayct_backend/twitter/__init__.py b/ayct_backend/twitter/__init__.py index 7e4615f..4864a7a 100644 --- a/ayct_backend/twitter/__init__.py +++ b/ayct_backend/twitter/__init__.py @@ -1,4 +1,3 @@ -import os from requests_oauthlib import OAuth1Session from flask import Blueprint, Response, current_app, request, jsonify from ayct_backend.twitter.models import * From 630e57d2608ff82e19451f8f3bafbbe6cca77f05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 31 Jan 2022 17:21:23 +0100 Subject: [PATCH 26/50] request logs fix --- ayct_backend/__init__.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ayct_backend/__init__.py b/ayct_backend/__init__.py index 7b60880..6e73766 100644 --- a/ayct_backend/__init__.py +++ b/ayct_backend/__init__.py @@ -1,6 +1,5 @@ import os -from flask import Flask -from flask_sqlalchemy import SQLAlchemy +from flask import Flask, request from ayct_backend.twitter import twitter from ayct_backend.twitter.models import twitter_db from ayct_backend.campaign import campaign From 43a8763c771ff08566149a0bbd398dbce8bd7589 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 31 Jan 2022 17:28:52 +0100 Subject: [PATCH 27/50] request logs fix 2 --- ayct_backend/__init__.py | 5 ----- ayct_backend/campaign/__init__.py | 3 +++ setup.py | 2 -- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/ayct_backend/__init__.py b/ayct_backend/__init__.py index 6e73766..74f05dc 100644 --- a/ayct_backend/__init__.py +++ b/ayct_backend/__init__.py @@ -28,11 +28,6 @@ def create_app(): app.register_blueprint(twitter, url_prefix='/twitter') app.register_blueprint(campaign, url_prefix='/campaign') - @app.before_request - def log_request_info(): - app.logger.debug('Headers: %s', request.headers) - app.logger.debug('Body: %s', request.get_data()) - @app.route('/hello') def hello(): return "Hello world!" diff --git a/ayct_backend/campaign/__init__.py b/ayct_backend/campaign/__init__.py index be12d62..b614678 100644 --- a/ayct_backend/campaign/__init__.py +++ b/ayct_backend/campaign/__init__.py @@ -9,6 +9,9 @@ campaign = Blueprint('campaign', __name__) @campaign.route('/campaign', methods=['GET']) def get_twitter_campaigns(): + print('Headers: %s', request.headers) + print('Body: %s', request.get_data()) + twitter_campaigns = TwitterCampaign.query.all() campaigns = [] diff --git a/setup.py b/setup.py index bbd0ca4..58b0919 100644 --- a/setup.py +++ b/setup.py @@ -1,5 +1,3 @@ -import io - from setuptools import find_packages from setuptools import setup From 14d411f98f0998d014aef9cc77e92a8ea940299d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 31 Jan 2022 18:29:20 +0100 Subject: [PATCH 28/50] user_id + verify token --- ayct_backend/campaign/__init__.py | 18 +++++++++++++++--- ayct_backend/campaign/models.py | 1 + ayct_backend/firebase.py | 13 +++++++++++++ ayct_backend/twitter/__init__.py | 16 +++++++++++++++- ayct_backend/twitter/models.py | 1 + 5 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 ayct_backend/firebase.py diff --git a/ayct_backend/campaign/__init__.py b/ayct_backend/campaign/__init__.py index b614678..2d71db7 100644 --- a/ayct_backend/campaign/__init__.py +++ b/ayct_backend/campaign/__init__.py @@ -2,17 +2,22 @@ import requests import json from requests_oauthlib import OAuth1Session from flask import Blueprint, current_app, request, jsonify +from rsa import verify from ayct_backend.twitter.models import * from ayct_backend.campaign.models import * +from ayct_backend.firebase import verify_token campaign = Blueprint('campaign', __name__) @campaign.route('/campaign', methods=['GET']) def get_twitter_campaigns(): - print('Headers: %s', request.headers) - print('Body: %s', request.get_data()) + decoded_token = verify_token(request.headers) + if not decoded_token: + return "Not authorised!", 401 - twitter_campaigns = TwitterCampaign.query.all() + user_id = decoded_token['uid'] + + twitter_campaigns = TwitterCampaign.query.filter_by(user_id=user_id) campaigns = [] @@ -31,6 +36,12 @@ def get_twitter_campaigns(): @campaign.route('/campaign', methods=['POST']) def add_twitter_account(): + decoded_token = verify_token(request.headers) + if not decoded_token: + return "Not authorised!", 401 + + user_id = decoded_token['uid'] + content_type = request.headers.get('Content-Type') if (content_type == 'application/json'): request_json = request.json @@ -70,6 +81,7 @@ def add_twitter_account(): # save campaign to database new_twitter_campaign = TwitterCampaign( campaign_name = request_json['campaign_name'], + user_id = user_id, twitter_account_id = request_json['twitter_account_id'], user_input = request_json['user_input'], generated_content = generated_content[0:260], diff --git a/ayct_backend/campaign/models.py b/ayct_backend/campaign/models.py index cf7fd99..48d2738 100644 --- a/ayct_backend/campaign/models.py +++ b/ayct_backend/campaign/models.py @@ -6,6 +6,7 @@ class TwitterCampaign(campaign_db.Model): __tablename__ = 'twitter_campaign' campaign_id = campaign_db.Column(campaign_db.Integer, primary_key=True) + user_id = campaign_db.Column(campaign_db.String(64), nullable=False) campaign_name = campaign_db.Column(campaign_db.String(64), nullable=False) twitter_account_id = campaign_db.Column(campaign_db.String(32), nullable=False) user_input = campaign_db.Column(campaign_db.String(100), nullable=False) diff --git a/ayct_backend/firebase.py b/ayct_backend/firebase.py new file mode 100644 index 0000000..f2d408d --- /dev/null +++ b/ayct_backend/firebase.py @@ -0,0 +1,13 @@ +import os +import google.oauth2.id_token +import google.auth.transport.requests + +HTTP_REQUEST = google.auth.transport.requests.Request() +AUDIENCE = os.environ.get('GOOGLE_CLOUD_PROJECT') + +def verify_token(headers): + id_token = headers['auth'].split(' ').pop() + + claims = google.oauth2.id_token.verify_firebase_token(id_token, HTTP_REQUEST, audience=AUDIENCE) + + return claims \ No newline at end of file diff --git a/ayct_backend/twitter/__init__.py b/ayct_backend/twitter/__init__.py index 4864a7a..dfe1fe3 100644 --- a/ayct_backend/twitter/__init__.py +++ b/ayct_backend/twitter/__init__.py @@ -1,12 +1,19 @@ from requests_oauthlib import OAuth1Session from flask import Blueprint, Response, current_app, request, jsonify from ayct_backend.twitter.models import * +from ayct_backend.firebase import verify_token twitter = Blueprint('twitter', __name__) @twitter.route('/account', methods=['GET']) def get_twitter_accounts(): - twitter_accounts = TwitterAccount.query.all() + decoded_token = verify_token(request.headers) + if not decoded_token: + return "Not authorised!", 401 + + user_id = decoded_token['uid'] + + twitter_accounts = TwitterAccount.query.filter_by(user_id=user_id) accounts = [] @@ -22,6 +29,12 @@ def get_twitter_accounts(): @twitter.route('/account', methods=['POST']) def add_twitter_account(): + decoded_token = verify_token(request.headers) + if not decoded_token: + return "Not authorised!", 401 + + user_id = decoded_token['uid'] + content_type = request.headers.get('Content-Type') if (content_type == 'application/json'): json = request.json @@ -42,6 +55,7 @@ def add_twitter_account(): oauth_tokens = oauth.fetch_access_token(access_token_url) new_twitter_account = TwitterAccount( + user_id = user_id, twitter_account_id = oauth_tokens['user_id'], username = oauth_tokens['screen_name'], access_token = oauth_tokens['oauth_token'], diff --git a/ayct_backend/twitter/models.py b/ayct_backend/twitter/models.py index a17f9bd..ef86f7f 100644 --- a/ayct_backend/twitter/models.py +++ b/ayct_backend/twitter/models.py @@ -7,6 +7,7 @@ class TwitterAccount(twitter_db.Model): __tablename__ = 'twitter_account' account_id = twitter_db.Column(twitter_db.Integer, primary_key=True) + user_id = twitter_db.Column(twitter_db.String(64), nullable=False) twitter_account_id = twitter_db.Column(twitter_db.String(32), unique=True, nullable=False) username = twitter_db.Column(twitter_db.String(16), unique=True, nullable=False) access_token = twitter_db.Column(twitter_db.String(256), nullable=False) From 163d477a55ce2dc9ec7edf5963a59d30942a572d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 31 Jan 2022 18:33:57 +0100 Subject: [PATCH 29/50] requirements fix --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 799a9fe..37c6f22 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,3 +4,4 @@ flask_sqlalchemy==2.5.1 requests_oauthlib==1.3.0 psycopg2==2.9.3 pytest==6.2.5 +google==3.0.0 From 7aba9dfa39daf7d6791a1d2d188d975d50d2ee2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 31 Jan 2022 18:38:25 +0100 Subject: [PATCH 30/50] requirements fix 2 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 37c6f22..b4ec050 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,4 +4,4 @@ flask_sqlalchemy==2.5.1 requests_oauthlib==1.3.0 psycopg2==2.9.3 pytest==6.2.5 -google==3.0.0 +google-api-python-client==2.36.0 From f72f25bebd0f89b9d279cc5db45f018940ba1175 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 31 Jan 2022 18:42:32 +0100 Subject: [PATCH 31/50] verify token fix --- ayct_backend/firebase.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ayct_backend/firebase.py b/ayct_backend/firebase.py index f2d408d..432fc3f 100644 --- a/ayct_backend/firebase.py +++ b/ayct_backend/firebase.py @@ -6,7 +6,7 @@ HTTP_REQUEST = google.auth.transport.requests.Request() AUDIENCE = os.environ.get('GOOGLE_CLOUD_PROJECT') def verify_token(headers): - id_token = headers['auth'].split(' ').pop() + id_token = headers['Auth'].split(' ').pop() claims = google.oauth2.id_token.verify_firebase_token(id_token, HTTP_REQUEST, audience=AUDIENCE) From 0756ec8ce3fb8ca9b2af2875a7b1088549bf5abf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 31 Jan 2022 18:49:47 +0100 Subject: [PATCH 32/50] verify token fix 2 --- ayct_backend/firebase.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ayct_backend/firebase.py b/ayct_backend/firebase.py index 432fc3f..dd66d55 100644 --- a/ayct_backend/firebase.py +++ b/ayct_backend/firebase.py @@ -6,7 +6,7 @@ HTTP_REQUEST = google.auth.transport.requests.Request() AUDIENCE = os.environ.get('GOOGLE_CLOUD_PROJECT') def verify_token(headers): - id_token = headers['Auth'].split(' ').pop() + id_token = headers['Authorization'].split(' ').pop() claims = google.oauth2.id_token.verify_firebase_token(id_token, HTTP_REQUEST, audience=AUDIENCE) From 77c4fc49d9b5d2152eee8596b5cdf3eb1300b14b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 31 Jan 2022 19:05:14 +0100 Subject: [PATCH 33/50] verify token fix 3 --- ayct_backend/campaign/__init__.py | 4 ++-- ayct_backend/twitter/__init__.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ayct_backend/campaign/__init__.py b/ayct_backend/campaign/__init__.py index 2d71db7..ed6f806 100644 --- a/ayct_backend/campaign/__init__.py +++ b/ayct_backend/campaign/__init__.py @@ -15,7 +15,7 @@ def get_twitter_campaigns(): if not decoded_token: return "Not authorised!", 401 - user_id = decoded_token['uid'] + user_id = decoded_token['sub'] twitter_campaigns = TwitterCampaign.query.filter_by(user_id=user_id) @@ -40,7 +40,7 @@ def add_twitter_account(): if not decoded_token: return "Not authorised!", 401 - user_id = decoded_token['uid'] + user_id = decoded_token['sub'] content_type = request.headers.get('Content-Type') if (content_type == 'application/json'): diff --git a/ayct_backend/twitter/__init__.py b/ayct_backend/twitter/__init__.py index dfe1fe3..451e15a 100644 --- a/ayct_backend/twitter/__init__.py +++ b/ayct_backend/twitter/__init__.py @@ -11,7 +11,7 @@ def get_twitter_accounts(): if not decoded_token: return "Not authorised!", 401 - user_id = decoded_token['uid'] + user_id = decoded_token['sub'] twitter_accounts = TwitterAccount.query.filter_by(user_id=user_id) @@ -33,7 +33,7 @@ def add_twitter_account(): if not decoded_token: return "Not authorised!", 401 - user_id = decoded_token['uid'] + user_id = decoded_token['sub'] content_type = request.headers.get('Content-Type') if (content_type == 'application/json'): From 708e241ea1f3ffdbc04b75f802541b78fc700170 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 31 Jan 2022 19:10:21 +0100 Subject: [PATCH 34/50] verify token fix 4 --- ayct_backend/__init__.py | 2 +- ayct_backend/firebase.py | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/ayct_backend/__init__.py b/ayct_backend/__init__.py index 74f05dc..0145152 100644 --- a/ayct_backend/__init__.py +++ b/ayct_backend/__init__.py @@ -22,7 +22,7 @@ def create_app(): twitter_db.drop_all(app=app) twitter_db.create_all(app=app) - twitter_db.drop_all(app=app) + campaign_db.drop_all(app=app) campaign_db.create_all(app=app) app.register_blueprint(twitter, url_prefix='/twitter') diff --git a/ayct_backend/firebase.py b/ayct_backend/firebase.py index dd66d55..ce47677 100644 --- a/ayct_backend/firebase.py +++ b/ayct_backend/firebase.py @@ -8,6 +8,9 @@ AUDIENCE = os.environ.get('GOOGLE_CLOUD_PROJECT') def verify_token(headers): id_token = headers['Authorization'].split(' ').pop() - claims = google.oauth2.id_token.verify_firebase_token(id_token, HTTP_REQUEST, audience=AUDIENCE) + try: + claims = google.oauth2.id_token.verify_firebase_token(id_token, HTTP_REQUEST, audience=AUDIENCE) + except: + return None return claims \ No newline at end of file From ca114e3c64ca15dd7ac9828f82427d48b4d95918 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 31 Jan 2022 19:22:00 +0100 Subject: [PATCH 35/50] verify token final --- ayct_backend/__init__.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/ayct_backend/__init__.py b/ayct_backend/__init__.py index 0145152..0775ac3 100644 --- a/ayct_backend/__init__.py +++ b/ayct_backend/__init__.py @@ -20,9 +20,7 @@ def create_app(): twitter_db.init_app(app) campaign_db.init_app(app) - twitter_db.drop_all(app=app) twitter_db.create_all(app=app) - campaign_db.drop_all(app=app) campaign_db.create_all(app=app) app.register_blueprint(twitter, url_prefix='/twitter') From 26620708f36594ef64802092ca94d9b29bdfda6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 31 Jan 2022 19:48:46 +0100 Subject: [PATCH 36/50] temp fixes used id --- ayct_backend/twitter/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ayct_backend/twitter/__init__.py b/ayct_backend/twitter/__init__.py index 451e15a..1514d1a 100644 --- a/ayct_backend/twitter/__init__.py +++ b/ayct_backend/twitter/__init__.py @@ -55,7 +55,7 @@ def add_twitter_account(): oauth_tokens = oauth.fetch_access_token(access_token_url) new_twitter_account = TwitterAccount( - user_id = user_id, + user_id = 'Q9De5dPreNhc8DdrmUBmSE3AYyk1', twitter_account_id = oauth_tokens['user_id'], username = oauth_tokens['screen_name'], access_token = oauth_tokens['oauth_token'], From 4d4992ed1d74c727bf4b4c87ee8119fc054ebf52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 31 Jan 2022 19:58:11 +0100 Subject: [PATCH 37/50] fix user id token --- ayct_backend/twitter/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ayct_backend/twitter/__init__.py b/ayct_backend/twitter/__init__.py index 1514d1a..451e15a 100644 --- a/ayct_backend/twitter/__init__.py +++ b/ayct_backend/twitter/__init__.py @@ -55,7 +55,7 @@ def add_twitter_account(): oauth_tokens = oauth.fetch_access_token(access_token_url) new_twitter_account = TwitterAccount( - user_id = 'Q9De5dPreNhc8DdrmUBmSE3AYyk1', + user_id = user_id, twitter_account_id = oauth_tokens['user_id'], username = oauth_tokens['screen_name'], access_token = oauth_tokens['oauth_token'], From 2b1f3405a0da80345876232cb7caa8a441607b23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 31 Jan 2022 23:25:02 +0100 Subject: [PATCH 38/50] change generated text trimming --- ayct_backend/campaign/__init__.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/ayct_backend/campaign/__init__.py b/ayct_backend/campaign/__init__.py index ed6f806..b1c493f 100644 --- a/ayct_backend/campaign/__init__.py +++ b/ayct_backend/campaign/__init__.py @@ -57,13 +57,20 @@ def add_twitter_account(): core_url = 'http://65.108.80.28:4999/generate' payload = { "data": request_json['user_input'], - "length": 400 + "length": 420 } response = requests.post(core_url, headers={"Content-Type":"application/json"}, data=json.dumps(payload)) - generated_content = response.content.decode("utf-8").replace('<|endoftext|>', '') - #generated_content = "This is wonderful post content generated by our very smart core API!" + generated_content = response.content.decode("utf-8").replace('<|endoftext|>', '').replace(' ', ' ') + + trimmed_text = generated_content[:270] + dot_index = trimmed_text.rfind(".") + space_index = trimmed_text.rfind(" ") + if dot_index > 0: + tweet_text = trimmed_text[:dot_index] + else: + tweet_text = trimmed_text[:space_index] # create post on twitter oauth = OAuth1Session( @@ -75,7 +82,7 @@ def add_twitter_account(): response = oauth.post( "https://api.twitter.com/2/tweets", - json={"text": generated_content[0:260]}, + json={"text": tweet_text}, ).json()['data'] # save campaign to database @@ -84,7 +91,7 @@ def add_twitter_account(): user_id = user_id, twitter_account_id = request_json['twitter_account_id'], user_input = request_json['user_input'], - generated_content = generated_content[0:260], + generated_content = tweet_text, twitter_post_id = response['id'] ) From 7a2f9f832df8291e4e60917d80006cd68a07c79d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Mon, 31 Jan 2022 23:31:11 +0100 Subject: [PATCH 39/50] change generated text trimming fix 1 --- ayct_backend/campaign/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ayct_backend/campaign/__init__.py b/ayct_backend/campaign/__init__.py index b1c493f..b71e8df 100644 --- a/ayct_backend/campaign/__init__.py +++ b/ayct_backend/campaign/__init__.py @@ -68,9 +68,9 @@ def add_twitter_account(): dot_index = trimmed_text.rfind(".") space_index = trimmed_text.rfind(" ") if dot_index > 0: - tweet_text = trimmed_text[:dot_index] + tweet_text = trimmed_text[:dot_index].capitalize() else: - tweet_text = trimmed_text[:space_index] + tweet_text = trimmed_text[:space_index].capitalize() # create post on twitter oauth = OAuth1Session( From 895df4998e8664f4301cf9962cad7e870ebf538d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Tue, 1 Feb 2022 11:16:57 +0100 Subject: [PATCH 40/50] change generated text trimming fix 2 --- ayct_backend/campaign/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ayct_backend/campaign/__init__.py b/ayct_backend/campaign/__init__.py index b71e8df..577ded2 100644 --- a/ayct_backend/campaign/__init__.py +++ b/ayct_backend/campaign/__init__.py @@ -82,7 +82,7 @@ def add_twitter_account(): response = oauth.post( "https://api.twitter.com/2/tweets", - json={"text": tweet_text}, + json={"text": tweet_text + str(dot_index) + str(space_index)}, ).json()['data'] # save campaign to database From 48fc3fc9541b62bef96ff599bd920f809f2b6036 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Tue, 1 Feb 2022 13:36:05 +0100 Subject: [PATCH 41/50] non unique twt accounts --- ayct_backend/__init__.py | 2 ++ ayct_backend/twitter/models.py | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/ayct_backend/__init__.py b/ayct_backend/__init__.py index 0775ac3..0145152 100644 --- a/ayct_backend/__init__.py +++ b/ayct_backend/__init__.py @@ -20,7 +20,9 @@ def create_app(): twitter_db.init_app(app) campaign_db.init_app(app) + twitter_db.drop_all(app=app) twitter_db.create_all(app=app) + campaign_db.drop_all(app=app) campaign_db.create_all(app=app) app.register_blueprint(twitter, url_prefix='/twitter') diff --git a/ayct_backend/twitter/models.py b/ayct_backend/twitter/models.py index ef86f7f..e35e1d3 100644 --- a/ayct_backend/twitter/models.py +++ b/ayct_backend/twitter/models.py @@ -8,7 +8,7 @@ class TwitterAccount(twitter_db.Model): account_id = twitter_db.Column(twitter_db.Integer, primary_key=True) user_id = twitter_db.Column(twitter_db.String(64), nullable=False) - twitter_account_id = twitter_db.Column(twitter_db.String(32), unique=True, nullable=False) - username = twitter_db.Column(twitter_db.String(16), unique=True, nullable=False) + twitter_account_id = twitter_db.Column(twitter_db.String(32), nullable=False) + username = twitter_db.Column(twitter_db.String(16), nullable=False) access_token = twitter_db.Column(twitter_db.String(256), nullable=False) access_token_secret = twitter_db.Column(twitter_db.String(256), nullable=False) From 12a946c88ad8b8ef3f84e51a70350606eebd3653 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Tue, 1 Feb 2022 13:50:40 +0100 Subject: [PATCH 42/50] fix twt text trim --- ayct_backend/__init__.py | 2 -- ayct_backend/campaign/__init__.py | 6 +++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/ayct_backend/__init__.py b/ayct_backend/__init__.py index 0145152..0775ac3 100644 --- a/ayct_backend/__init__.py +++ b/ayct_backend/__init__.py @@ -20,9 +20,7 @@ def create_app(): twitter_db.init_app(app) campaign_db.init_app(app) - twitter_db.drop_all(app=app) twitter_db.create_all(app=app) - campaign_db.drop_all(app=app) campaign_db.create_all(app=app) app.register_blueprint(twitter, url_prefix='/twitter') diff --git a/ayct_backend/campaign/__init__.py b/ayct_backend/campaign/__init__.py index 577ded2..a1cd3c5 100644 --- a/ayct_backend/campaign/__init__.py +++ b/ayct_backend/campaign/__init__.py @@ -68,9 +68,9 @@ def add_twitter_account(): dot_index = trimmed_text.rfind(".") space_index = trimmed_text.rfind(" ") if dot_index > 0: - tweet_text = trimmed_text[:dot_index].capitalize() + tweet_text = trimmed_text[:dot_index + 1].capitalize() else: - tweet_text = trimmed_text[:space_index].capitalize() + tweet_text = trimmed_text[:space_index + 1].capitalize() # create post on twitter oauth = OAuth1Session( @@ -82,7 +82,7 @@ def add_twitter_account(): response = oauth.post( "https://api.twitter.com/2/tweets", - json={"text": tweet_text + str(dot_index) + str(space_index)}, + json={"text": tweet_text}, ).json()['data'] # save campaign to database From 9d95c8a411d02af8d167f666f063f5bfcf145404 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Tue, 12 Apr 2022 17:55:52 +0200 Subject: [PATCH 43/50] delete twitter account and campaign --- ayct_backend/campaign/__init__.py | 196 ++++++++++++++++++++---------- ayct_backend/campaign/models.py | 11 +- ayct_backend/twitter/__init__.py | 93 +++++++++----- ayct_backend/twitter/models.py | 3 +- 4 files changed, 204 insertions(+), 99 deletions(-) diff --git a/ayct_backend/campaign/__init__.py b/ayct_backend/campaign/__init__.py index a1cd3c5..fdc6da4 100644 --- a/ayct_backend/campaign/__init__.py +++ b/ayct_backend/campaign/__init__.py @@ -2,14 +2,13 @@ import requests import json from requests_oauthlib import OAuth1Session from flask import Blueprint, current_app, request, jsonify -from rsa import verify from ayct_backend.twitter.models import * from ayct_backend.campaign.models import * from ayct_backend.firebase import verify_token campaign = Blueprint('campaign', __name__) -@campaign.route('/campaign', methods=['GET']) +@campaign.route('/', methods=['GET']) def get_twitter_campaigns(): decoded_token = verify_token(request.headers) if not decoded_token: @@ -23,19 +22,17 @@ def get_twitter_campaigns(): for campaign in twitter_campaigns: campaign_data = {} + campaign_data['campaign_id'] = campaign.id campaign_data['campaign_name'] = campaign.campaign_name campaign_data['twitter_account_id'] = campaign.twitter_account_id - campaign_data['user_input'] = campaign.user_input - campaign_data['generated_content'] = campaign.generated_content - campaign_data['twitter_post_id'] = campaign.twitter_post_id campaigns.append(campaign_data) return jsonify({ "twitter_campaigns": campaigns }), 200 -@campaign.route('/campaign', methods=['POST']) -def add_twitter_account(): +@campaign.route('/', methods=['POST']) +def add_twitter_campaign(): decoded_token = verify_token(request.headers) if not decoded_token: return "Not authorised!", 401 @@ -43,61 +40,132 @@ def add_twitter_account(): user_id = decoded_token['sub'] content_type = request.headers.get('Content-Type') - if (content_type == 'application/json'): - request_json = request.json - if not request_json['campaign_name'] or not request_json['user_input'] or not request_json['twitter_account_id']: - return "Invalid request!", 400 - else: - consumer_key = current_app.config["TWITTER_CONSUMER_KEY"] - consumer_secret = current_app.config["TWITTER_CONSUMER_SECERT"] - - twitter_account = TwitterAccount.query.filter_by(twitter_account_id=request_json['twitter_account_id']).first() - - # generate campaign content - core_url = 'http://65.108.80.28:4999/generate' - payload = { - "data": request_json['user_input'], - "length": 420 - } - - response = requests.post(core_url, headers={"Content-Type":"application/json"}, data=json.dumps(payload)) - - generated_content = response.content.decode("utf-8").replace('<|endoftext|>', '').replace(' ', ' ') - - trimmed_text = generated_content[:270] - dot_index = trimmed_text.rfind(".") - space_index = trimmed_text.rfind(" ") - if dot_index > 0: - tweet_text = trimmed_text[:dot_index + 1].capitalize() - else: - tweet_text = trimmed_text[:space_index + 1].capitalize() - - # create post on twitter - oauth = OAuth1Session( - consumer_key, - client_secret=consumer_secret, - resource_owner_key=twitter_account.access_token, - resource_owner_secret=twitter_account.access_token_secret, - ) - - response = oauth.post( - "https://api.twitter.com/2/tweets", - json={"text": tweet_text}, - ).json()['data'] - - # save campaign to database - new_twitter_campaign = TwitterCampaign( - campaign_name = request_json['campaign_name'], - user_id = user_id, - twitter_account_id = request_json['twitter_account_id'], - user_input = request_json['user_input'], - generated_content = tweet_text, - twitter_post_id = response['id'] - ) - - campaign_db.session.add(new_twitter_campaign) - campaign_db.session.commit() - - return "Campaign succesfully created.", 201 - else: + if content_type != 'application/json': return "Content-type not supported!", 400 + + request_json = request.json + if not request_json['campaign_name'] or not request_json['user_input'] or not request_json['twitter_account_id']: + return "Invalid request!", 400 + + consumer_key = current_app.config["TWITTER_CONSUMER_KEY"] + consumer_secret = current_app.config["TWITTER_CONSUMER_SECERT"] + + twitter_account = TwitterAccount.query.filter_by(twitter_account_id=request_json['twitter_account_id']).first() + + # generate campaign content + core_url = 'http://65.108.80.28:4999/generate' + payload = { + "data": request_json['user_input'], + "length": 420 + } + + response = requests.post(core_url, headers={"Content-Type":"application/json"}, data=json.dumps(payload)) + + generated_content = response.content.decode("utf-8").replace('<|endoftext|>', '').replace(' ', ' ') + + trimmed_text = generated_content[:270] + dot_index = trimmed_text.rfind(".") + space_index = trimmed_text.rfind(" ") + if dot_index > 0: + tweet_text = trimmed_text[:dot_index + 1].capitalize() + else: + tweet_text = trimmed_text[:space_index + 1].capitalize() + + # create post on twitter + oauth = OAuth1Session( + consumer_key, + client_secret=consumer_secret, + resource_owner_key=twitter_account.access_token, + resource_owner_secret=twitter_account.access_token_secret, + ) + + response = oauth.post( + "https://api.twitter.com/2/tweets", + json={"text": tweet_text}, + ).json()['data'] + + # save campaign to database + twitter_campaign = TwitterCampaign( + user_id = user_id, + campaign_name = request_json['campaign_name'], + twitter_account_id = request_json['twitter_account_id'], + user_input = request_json['user_input'], + ) + + campaign_db.session.add(twitter_campaign) + campaign_db.session.flush() + campaign_db.session.refresh() + + twitter_campaign_post = TwitterPost( + campaign_id = twitter_campaign.id, + user_id = user_id, + post_content = tweet_text, + twitter_post_id = response['id'] + ) + + campaign_db.session.add(twitter_campaign_post) + campaign_db.session.commit() + + return "Campaign succesfully created.", 201 + +@campaign.route('/', methods=['DELETE']) +def delete_twitter_campaign(): + decoded_token = verify_token(request.headers) + if not decoded_token: + return "Not authorised!", 401 + + user_id = decoded_token['sub'] + + content_type = request.headers.get('Content-Type') + if content_type != 'application/json': + return "Content-type not supported!", 400 + + request_json = request.json + if not request_json['campaign_id']: + return "Invalid request!", 400 + + twitter_campaign = TwitterAccount.query.filter_by(user_id=user_id, id=request_json['campaign_id']) + + if not twitter_campaign: + return "Account not found!", 404 + + twitter_db.session.delete(twitter_campaign) + twitter_db.session.commit() + + return "Twitter campaign succesfully deleted.", 200 + +@campaign.route('/details', methods=['GET']) +def get_twitter_campaign_details(): + decoded_token = verify_token(request.headers) + if not decoded_token: + return "Not authorised!", 401 + + user_id = decoded_token['sub'] + + content_type = request.headers.get('Content-Type') + if content_type != 'application/json': + return "Content-type not supported!", 400 + + request_json = request.json + if not request_json['campaign_id']: + return "Invalid request!", 400 + + twitter_campaign = TwitterCampaign.query.filter_by(user_id=user_id, id=request_json['campaign_id']).first() + campaign_posts = TwitterPost.query.filter_by(user_id=user_id, campaign_id=request_json['campaign_id']) + + posts = [] + for post in campaign_posts: + post_data = {} + post_data['post_id'] = post.post_id + post_data['campaign_id'] = post.campaign_id + post_data['post_content'] = post.post_content + post_data['twitter_post_id'] = post.twitter_post_id + posts.append(post_data) + + return jsonify({ + "campaign_id": twitter_campaign.id, + "campaign_name": twitter_campaign.campaign_name, + "user_input": twitter_campaign.user_input, + "twitter_account_id": twitter_campaign.twitter_account_id, + "posts": posts + }), 200 diff --git a/ayct_backend/campaign/models.py b/ayct_backend/campaign/models.py index 48d2738..24b268c 100644 --- a/ayct_backend/campaign/models.py +++ b/ayct_backend/campaign/models.py @@ -5,10 +5,17 @@ campaign_db = SQLAlchemy() class TwitterCampaign(campaign_db.Model): __tablename__ = 'twitter_campaign' - campaign_id = campaign_db.Column(campaign_db.Integer, primary_key=True) + id = campaign_db.Column(campaign_db.Integer, primary_key=True) user_id = campaign_db.Column(campaign_db.String(64), nullable=False) campaign_name = campaign_db.Column(campaign_db.String(64), nullable=False) twitter_account_id = campaign_db.Column(campaign_db.String(32), nullable=False) user_input = campaign_db.Column(campaign_db.String(100), nullable=False) - generated_content = campaign_db.Column(campaign_db.String(300), nullable=False) + +class TwitterPost(campaign_db.Model): + __tablename__ = 'twitter_post' + + id = campaign_db.Column(campaign_db.Integer, primary_key=True) + campaign_id = campaign_db.Column(campaign_db.Integer, nullable=False) + user_id = campaign_db.Column(campaign_db.String(64), nullable=False) + post_content = campaign_db.Column(campaign_db.String(300), nullable=False) twitter_post_id = campaign_db.Column(campaign_db.String(32), unique=True, nullable=False) diff --git a/ayct_backend/twitter/__init__.py b/ayct_backend/twitter/__init__.py index 451e15a..17d9ec1 100644 --- a/ayct_backend/twitter/__init__.py +++ b/ayct_backend/twitter/__init__.py @@ -36,35 +36,66 @@ def add_twitter_account(): user_id = decoded_token['sub'] content_type = request.headers.get('Content-Type') - if (content_type == 'application/json'): - json = request.json - if not json['veryfier'] or not json['oauth_token'] or not json['oauth_token_secret']: - return "Invalid request!", 400 - else: - consumer_key = current_app.config["TWITTER_CONSUMER_KEY"] - consumer_secret = current_app.config["TWITTER_CONSUMER_SECERT"] - - access_token_url = "https://api.twitter.com/oauth/access_token" - oauth = OAuth1Session( - consumer_key, - client_secret=consumer_secret, - resource_owner_key=json['oauth_token'], - resource_owner_secret=json['oauth_token_secret'], - verifier=json['veryfier'], - ) - oauth_tokens = oauth.fetch_access_token(access_token_url) - - new_twitter_account = TwitterAccount( - user_id = user_id, - twitter_account_id = oauth_tokens['user_id'], - username = oauth_tokens['screen_name'], - access_token = oauth_tokens['oauth_token'], - access_token_secret = oauth_tokens['oauth_token_secret'] - ) - - twitter_db.session.add(new_twitter_account) - twitter_db.session.commit() - - return "Twitter account succesfully added.", 201 - else: + if content_type != 'application/json': return "Content-type not supported!", 400 + + json = request.json + if not json['veryfier'] or not json['oauth_token'] or not json['oauth_token_secret']: + return "Invalid request!", 400 + + consumer_key = current_app.config["TWITTER_CONSUMER_KEY"] + consumer_secret = current_app.config["TWITTER_CONSUMER_SECERT"] + + access_token_url = "https://api.twitter.com/oauth/access_token" + oauth = OAuth1Session( + consumer_key, + client_secret=consumer_secret, + resource_owner_key=json['oauth_token'], + resource_owner_secret=json['oauth_token_secret'], + verifier=json['veryfier'], + ) + oauth_tokens = oauth.fetch_access_token(access_token_url) + + twitter_account = TwitterAccount.query.filter_by(user_id=user_id, twitter_account_id=oauth_tokens['user_id']) + + if twitter_account: + return "Account already exists!", 400 + + twitter_account = TwitterAccount( + user_id = user_id, + twitter_account_id = oauth_tokens['user_id'], + username = oauth_tokens['screen_name'], + access_token = oauth_tokens['oauth_token'], + access_token_secret = oauth_tokens['oauth_token_secret'] + ) + + twitter_db.session.add(twitter_account) + twitter_db.session.commit() + + return "Twitter account succesfully added.", 201 + +@twitter.route('/account', methods=['DELETE']) +def delete_twitter_account(): + decoded_token = verify_token(request.headers) + if not decoded_token: + return "Not authorised!", 401 + + user_id = decoded_token['sub'] + + content_type = request.headers.get('Content-Type') + if content_type != 'application/json': + return "Content-type not supported!", 400 + + request_json = request.json + if not request_json['twitter_account_id']: + return "Invalid request!", 400 + + twitter_account = TwitterAccount.query.filter_by(user_id=user_id, twitter_account_id=request_json['twitter_account_id']) + + if not twitter_account: + return "Account not found!", 404 + + twitter_db.session.delete(twitter_account) + twitter_db.session.commit() + + return "Twitter account succesfully deleted.", 200 diff --git a/ayct_backend/twitter/models.py b/ayct_backend/twitter/models.py index e35e1d3..e8eef81 100644 --- a/ayct_backend/twitter/models.py +++ b/ayct_backend/twitter/models.py @@ -1,4 +1,3 @@ -from enum import unique from flask_sqlalchemy import SQLAlchemy twitter_db = SQLAlchemy() @@ -6,7 +5,7 @@ twitter_db = SQLAlchemy() class TwitterAccount(twitter_db.Model): __tablename__ = 'twitter_account' - account_id = twitter_db.Column(twitter_db.Integer, primary_key=True) + id = twitter_db.Column(twitter_db.Integer, primary_key=True) user_id = twitter_db.Column(twitter_db.String(64), nullable=False) twitter_account_id = twitter_db.Column(twitter_db.String(32), nullable=False) username = twitter_db.Column(twitter_db.String(16), nullable=False) From 5faadaa69b24d5cf6cfe7be7f1e788cdece1b979 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Tue, 10 May 2022 11:37:54 +0200 Subject: [PATCH 44/50] model relationship + minor fixes --- ayct_backend/__init__.py | 12 +++---- ayct_backend/campaign/__init__.py | 53 ++++++++++++++++--------------- ayct_backend/campaign/models.py | 21 ------------ ayct_backend/models.py | 32 +++++++++++++++++++ ayct_backend/twitter/__init__.py | 34 ++++++++++---------- ayct_backend/twitter/models.py | 13 -------- 6 files changed, 82 insertions(+), 83 deletions(-) delete mode 100644 ayct_backend/campaign/models.py create mode 100644 ayct_backend/models.py delete mode 100644 ayct_backend/twitter/models.py diff --git a/ayct_backend/__init__.py b/ayct_backend/__init__.py index 0775ac3..4f782f7 100644 --- a/ayct_backend/__init__.py +++ b/ayct_backend/__init__.py @@ -1,9 +1,8 @@ import os -from flask import Flask, request +from flask import Flask from ayct_backend.twitter import twitter -from ayct_backend.twitter.models import twitter_db from ayct_backend.campaign import campaign -from ayct_backend.campaign.models import campaign_db +from ayct_backend.models import db #import pbrAyctCore.core as core def create_app(): @@ -17,11 +16,8 @@ def create_app(): app.config['TWITTER_CONSUMER_KEY'] = os.getenv('TWITTER_CONSUMER_KEY') app.config['TWITTER_CONSUMER_SECERT'] = os.getenv('TWITTER_CONSUMER_SECERT') - twitter_db.init_app(app) - campaign_db.init_app(app) - - twitter_db.create_all(app=app) - campaign_db.create_all(app=app) + db.init_app(app) + db.create_all(app=app) app.register_blueprint(twitter, url_prefix='/twitter') app.register_blueprint(campaign, url_prefix='/campaign') diff --git a/ayct_backend/campaign/__init__.py b/ayct_backend/campaign/__init__.py index fdc6da4..ccc504e 100644 --- a/ayct_backend/campaign/__init__.py +++ b/ayct_backend/campaign/__init__.py @@ -1,9 +1,9 @@ import requests import json +from uuid import uuid4 from requests_oauthlib import OAuth1Session from flask import Blueprint, current_app, request, jsonify -from ayct_backend.twitter.models import * -from ayct_backend.campaign.models import * +from ayct_backend.models import * from ayct_backend.firebase import verify_token campaign = Blueprint('campaign', __name__) @@ -16,7 +16,7 @@ def get_twitter_campaigns(): user_id = decoded_token['sub'] - twitter_campaigns = TwitterCampaign.query.filter_by(user_id=user_id) + twitter_campaigns = TwitterCampaign.query.filter_by(user_id=user_id).all() campaigns = [] @@ -44,7 +44,7 @@ def add_twitter_campaign(): return "Content-type not supported!", 400 request_json = request.json - if not request_json['campaign_name'] or not request_json['user_input'] or not request_json['twitter_account_id']: + if 'campaign_name' not in request_json or 'user_input' not in request_json or 'twitter_account_id' not in request_json: return "Invalid request!", 400 consumer_key = current_app.config["TWITTER_CONSUMER_KEY"] @@ -59,17 +59,18 @@ def add_twitter_campaign(): "length": 420 } - response = requests.post(core_url, headers={"Content-Type":"application/json"}, data=json.dumps(payload)) + #response = requests.post(core_url, headers={"Content-Type":"application/json"}, data=json.dumps(payload)) + #generated_content = response.content.decode("utf-8").replace('<|endoftext|>', '').replace(' ', ' ') - generated_content = response.content.decode("utf-8").replace('<|endoftext|>', '').replace(' ', ' ') + # trimmed_text = generated_content[:270] + # dot_index = trimmed_text.rfind(".") + # space_index = trimmed_text.rfind(" ") + # if dot_index > 0: + # tweet_text = trimmed_text[:dot_index + 1].capitalize() + # else: + # tweet_text = trimmed_text[:space_index + 1].capitalize() - trimmed_text = generated_content[:270] - dot_index = trimmed_text.rfind(".") - space_index = trimmed_text.rfind(" ") - if dot_index > 0: - tweet_text = trimmed_text[:dot_index + 1].capitalize() - else: - tweet_text = trimmed_text[:space_index + 1].capitalize() + tweet_text = "This is placeholder content generated by our application. Normal generation doesn't work." # create post on twitter oauth = OAuth1Session( @@ -86,25 +87,27 @@ def add_twitter_campaign(): # save campaign to database twitter_campaign = TwitterCampaign( + id = str(uuid4()), user_id = user_id, campaign_name = request_json['campaign_name'], twitter_account_id = request_json['twitter_account_id'], user_input = request_json['user_input'], ) - campaign_db.session.add(twitter_campaign) - campaign_db.session.flush() - campaign_db.session.refresh() + db.session.add(twitter_campaign) + db.session.flush() + db.session.refresh() twitter_campaign_post = TwitterPost( + id = str(uuid4()), campaign_id = twitter_campaign.id, user_id = user_id, post_content = tweet_text, twitter_post_id = response['id'] ) - campaign_db.session.add(twitter_campaign_post) - campaign_db.session.commit() + db.session.add(twitter_campaign_post) + db.session.commit() return "Campaign succesfully created.", 201 @@ -121,16 +124,16 @@ def delete_twitter_campaign(): return "Content-type not supported!", 400 request_json = request.json - if not request_json['campaign_id']: + if 'campaign_id' not in request_json: return "Invalid request!", 400 - twitter_campaign = TwitterAccount.query.filter_by(user_id=user_id, id=request_json['campaign_id']) + twitter_campaign = TwitterAccount.query.filter_by(user_id=user_id, id=request_json['campaign_id']).first() if not twitter_campaign: - return "Account not found!", 404 + return "Capmaign not found!", 404 - twitter_db.session.delete(twitter_campaign) - twitter_db.session.commit() + db.session.delete(twitter_campaign) + db.session.commit() return "Twitter campaign succesfully deleted.", 200 @@ -147,11 +150,11 @@ def get_twitter_campaign_details(): return "Content-type not supported!", 400 request_json = request.json - if not request_json['campaign_id']: + if 'campaign_id' not in request_json: return "Invalid request!", 400 twitter_campaign = TwitterCampaign.query.filter_by(user_id=user_id, id=request_json['campaign_id']).first() - campaign_posts = TwitterPost.query.filter_by(user_id=user_id, campaign_id=request_json['campaign_id']) + campaign_posts = TwitterPost.query.filter_by(user_id=user_id, campaign_id=request_json['campaign_id']).all() posts = [] for post in campaign_posts: diff --git a/ayct_backend/campaign/models.py b/ayct_backend/campaign/models.py deleted file mode 100644 index 24b268c..0000000 --- a/ayct_backend/campaign/models.py +++ /dev/null @@ -1,21 +0,0 @@ -from flask_sqlalchemy import SQLAlchemy - -campaign_db = SQLAlchemy() - -class TwitterCampaign(campaign_db.Model): - __tablename__ = 'twitter_campaign' - - id = campaign_db.Column(campaign_db.Integer, primary_key=True) - user_id = campaign_db.Column(campaign_db.String(64), nullable=False) - campaign_name = campaign_db.Column(campaign_db.String(64), nullable=False) - twitter_account_id = campaign_db.Column(campaign_db.String(32), nullable=False) - user_input = campaign_db.Column(campaign_db.String(100), nullable=False) - -class TwitterPost(campaign_db.Model): - __tablename__ = 'twitter_post' - - id = campaign_db.Column(campaign_db.Integer, primary_key=True) - campaign_id = campaign_db.Column(campaign_db.Integer, nullable=False) - user_id = campaign_db.Column(campaign_db.String(64), nullable=False) - post_content = campaign_db.Column(campaign_db.String(300), nullable=False) - twitter_post_id = campaign_db.Column(campaign_db.String(32), unique=True, nullable=False) diff --git a/ayct_backend/models.py b/ayct_backend/models.py new file mode 100644 index 0000000..61546d0 --- /dev/null +++ b/ayct_backend/models.py @@ -0,0 +1,32 @@ +from flask_sqlalchemy import SQLAlchemy + +db = SQLAlchemy() + +class TwitterAccount(db.Model): + __tablename__ = 'twitter_account' + + id = db.Column(db.String(36), primary_key=True) + user_id = db.Column(db.String(64), nullable=False) + twitter_account_id = db.Column(db.String(32), nullable=False) + username = db.Column(db.String(16), nullable=False) + access_token = db.Column(db.String(256), nullable=False) + access_token_secret = db.Column(db.String(256), nullable=False) + +class TwitterCampaign(db.Model): + __tablename__ = 'twitter_campaign' + + id = db.Column(db.String(36), primary_key=True) + user_id = db.Column(db.String(64), nullable=False) + campaign_name = db.Column(db.String(64), nullable=False) + twitter_account_id = db.Column(db.String(32), nullable=False) + user_input = db.Column(db.String(100), nullable=False) + posts = db.relationship('TwitterPost', backref='campaign', lazy=True) + +class TwitterPost(db.Model): + __tablename__ = 'twitter_post' + + id = db.Column(db.String(36), primary_key=True) + campaign_id = db.Column(db.String(36), db.ForeignKey(TwitterCampaign.id), nullable=False) + user_id = db.Column(db.String(64), nullable=False) + post_content = db.Column(db.String(300), nullable=False) + twitter_post_id = db.Column(db.String(32), unique=True, nullable=False) \ No newline at end of file diff --git a/ayct_backend/twitter/__init__.py b/ayct_backend/twitter/__init__.py index 17d9ec1..20547be 100644 --- a/ayct_backend/twitter/__init__.py +++ b/ayct_backend/twitter/__init__.py @@ -1,6 +1,7 @@ +from uuid import uuid4 from requests_oauthlib import OAuth1Session from flask import Blueprint, Response, current_app, request, jsonify -from ayct_backend.twitter.models import * +from ayct_backend.models import * from ayct_backend.firebase import verify_token twitter = Blueprint('twitter', __name__) @@ -13,7 +14,7 @@ def get_twitter_accounts(): user_id = decoded_token['sub'] - twitter_accounts = TwitterAccount.query.filter_by(user_id=user_id) + twitter_accounts = TwitterAccount.query.filter_by(user_id=user_id).all() accounts = [] @@ -39,8 +40,8 @@ def add_twitter_account(): if content_type != 'application/json': return "Content-type not supported!", 400 - json = request.json - if not json['veryfier'] or not json['oauth_token'] or not json['oauth_token_secret']: + request_json = request.json + if 'veryfier' not in request_json or 'oauth_token' not in request_json or 'oauth_token_secret' not in request_json: return "Invalid request!", 400 consumer_key = current_app.config["TWITTER_CONSUMER_KEY"] @@ -49,19 +50,20 @@ def add_twitter_account(): access_token_url = "https://api.twitter.com/oauth/access_token" oauth = OAuth1Session( consumer_key, - client_secret=consumer_secret, - resource_owner_key=json['oauth_token'], - resource_owner_secret=json['oauth_token_secret'], - verifier=json['veryfier'], + client_secret = consumer_secret, + resource_owner_key = request_json['oauth_token'], + resource_owner_secret = request_json['oauth_token_secret'], + verifier = request_json['veryfier'], ) oauth_tokens = oauth.fetch_access_token(access_token_url) - twitter_account = TwitterAccount.query.filter_by(user_id=user_id, twitter_account_id=oauth_tokens['user_id']) + twitter_account = TwitterAccount.query.filter_by(user_id=user_id, twitter_account_id=oauth_tokens['user_id']).first() if twitter_account: - return "Account already exists!", 400 + return "Account already exists!", 409 twitter_account = TwitterAccount( + id = str(uuid4()), user_id = user_id, twitter_account_id = oauth_tokens['user_id'], username = oauth_tokens['screen_name'], @@ -69,8 +71,8 @@ def add_twitter_account(): access_token_secret = oauth_tokens['oauth_token_secret'] ) - twitter_db.session.add(twitter_account) - twitter_db.session.commit() + db.session.add(twitter_account) + db.session.commit() return "Twitter account succesfully added.", 201 @@ -87,15 +89,15 @@ def delete_twitter_account(): return "Content-type not supported!", 400 request_json = request.json - if not request_json['twitter_account_id']: + if 'twitter_account_id' not in request_json: return "Invalid request!", 400 - twitter_account = TwitterAccount.query.filter_by(user_id=user_id, twitter_account_id=request_json['twitter_account_id']) + twitter_account = TwitterAccount.query.filter_by(user_id=user_id, twitter_account_id=request_json['twitter_account_id']).first() if not twitter_account: return "Account not found!", 404 - twitter_db.session.delete(twitter_account) - twitter_db.session.commit() + db.session.delete(twitter_account) + db.session.commit() return "Twitter account succesfully deleted.", 200 diff --git a/ayct_backend/twitter/models.py b/ayct_backend/twitter/models.py deleted file mode 100644 index e8eef81..0000000 --- a/ayct_backend/twitter/models.py +++ /dev/null @@ -1,13 +0,0 @@ -from flask_sqlalchemy import SQLAlchemy - -twitter_db = SQLAlchemy() - -class TwitterAccount(twitter_db.Model): - __tablename__ = 'twitter_account' - - id = twitter_db.Column(twitter_db.Integer, primary_key=True) - user_id = twitter_db.Column(twitter_db.String(64), nullable=False) - twitter_account_id = twitter_db.Column(twitter_db.String(32), nullable=False) - username = twitter_db.Column(twitter_db.String(16), nullable=False) - access_token = twitter_db.Column(twitter_db.String(256), nullable=False) - access_token_secret = twitter_db.Column(twitter_db.String(256), nullable=False) From 611f7a02d9efdacd5819ddeedd36252d9fad3e59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Tue, 17 May 2022 19:19:47 +0200 Subject: [PATCH 45/50] fix add campaign --- ayct_backend/campaign/__init__.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/ayct_backend/campaign/__init__.py b/ayct_backend/campaign/__init__.py index ccc504e..0208049 100644 --- a/ayct_backend/campaign/__init__.py +++ b/ayct_backend/campaign/__init__.py @@ -94,10 +94,6 @@ def add_twitter_campaign(): user_input = request_json['user_input'], ) - db.session.add(twitter_campaign) - db.session.flush() - db.session.refresh() - twitter_campaign_post = TwitterPost( id = str(uuid4()), campaign_id = twitter_campaign.id, @@ -106,6 +102,7 @@ def add_twitter_campaign(): twitter_post_id = response['id'] ) + db.session.add(twitter_campaign) db.session.add(twitter_campaign_post) db.session.commit() From 9a4b84552b8ac0ba786951f7cab715d97be2b946 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Tue, 17 May 2022 19:23:15 +0200 Subject: [PATCH 46/50] fix add campaign 2 random --- ayct_backend/campaign/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ayct_backend/campaign/__init__.py b/ayct_backend/campaign/__init__.py index 0208049..d0f4dc5 100644 --- a/ayct_backend/campaign/__init__.py +++ b/ayct_backend/campaign/__init__.py @@ -70,7 +70,8 @@ def add_twitter_campaign(): # else: # tweet_text = trimmed_text[:space_index + 1].capitalize() - tweet_text = "This is placeholder content generated by our application. Normal generation doesn't work." + random_part = str(uuid4().hex) + tweet_text = "This is placeholder content generated by our application. Normal generation doesn't work." + random_part # create post on twitter oauth = OAuth1Session( From edb98740a05068e2de5c94fe24f4e30a793f175d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Tue, 17 May 2022 21:20:37 +0200 Subject: [PATCH 47/50] fix delete campaing query --- ayct_backend/campaign/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ayct_backend/campaign/__init__.py b/ayct_backend/campaign/__init__.py index d0f4dc5..3972d53 100644 --- a/ayct_backend/campaign/__init__.py +++ b/ayct_backend/campaign/__init__.py @@ -125,7 +125,7 @@ def delete_twitter_campaign(): if 'campaign_id' not in request_json: return "Invalid request!", 400 - twitter_campaign = TwitterAccount.query.filter_by(user_id=user_id, id=request_json['campaign_id']).first() + twitter_campaign = TwitterCampaign.query.filter_by(user_id=user_id, id=request_json['campaign_id']).first() if not twitter_campaign: return "Capmaign not found!", 404 From 2458cff7979e7bb6b347667943af9cc968d0f9d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Tue, 17 May 2022 21:55:57 +0200 Subject: [PATCH 48/50] fix get campaign details --- ayct_backend/campaign/__init__.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/ayct_backend/campaign/__init__.py b/ayct_backend/campaign/__init__.py index 3972d53..2881dba 100644 --- a/ayct_backend/campaign/__init__.py +++ b/ayct_backend/campaign/__init__.py @@ -147,12 +147,11 @@ def get_twitter_campaign_details(): if content_type != 'application/json': return "Content-type not supported!", 400 - request_json = request.json - if 'campaign_id' not in request_json: + if 'campaign_id' not in request.headers: return "Invalid request!", 400 - twitter_campaign = TwitterCampaign.query.filter_by(user_id=user_id, id=request_json['campaign_id']).first() - campaign_posts = TwitterPost.query.filter_by(user_id=user_id, campaign_id=request_json['campaign_id']).all() + twitter_campaign = TwitterCampaign.query.filter_by(user_id=user_id, id=request.headers['campaign_id']).first() + campaign_posts = TwitterPost.query.filter_by(user_id=user_id, campaign_id=request.headers['campaign_id']).all() posts = [] for post in campaign_posts: From 3b78c15b85bf1791313189bdeb0a92307317c1c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Tue, 17 May 2022 22:11:55 +0200 Subject: [PATCH 49/50] fix campaign_id in url --- ayct_backend/campaign/__init__.py | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/ayct_backend/campaign/__init__.py b/ayct_backend/campaign/__init__.py index 2881dba..fc3bc40 100644 --- a/ayct_backend/campaign/__init__.py +++ b/ayct_backend/campaign/__init__.py @@ -135,23 +135,16 @@ def delete_twitter_campaign(): return "Twitter campaign succesfully deleted.", 200 -@campaign.route('/details', methods=['GET']) -def get_twitter_campaign_details(): +@campaign.route('/', methods=['GET']) +def get_twitter_campaign_details(campaign_id): decoded_token = verify_token(request.headers) if not decoded_token: return "Not authorised!", 401 user_id = decoded_token['sub'] - content_type = request.headers.get('Content-Type') - if content_type != 'application/json': - return "Content-type not supported!", 400 - - if 'campaign_id' not in request.headers: - return "Invalid request!", 400 - - twitter_campaign = TwitterCampaign.query.filter_by(user_id=user_id, id=request.headers['campaign_id']).first() - campaign_posts = TwitterPost.query.filter_by(user_id=user_id, campaign_id=request.headers['campaign_id']).all() + twitter_campaign = TwitterCampaign.query.filter_by(user_id=user_id, id=campaign_id).first() + campaign_posts = TwitterPost.query.filter_by(user_id=user_id, campaign_id=campaign_id).all() posts = [] for post in campaign_posts: From dbc94486011e9baf3b8aaefdb4282813f047a894 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Tue, 17 May 2022 22:25:20 +0200 Subject: [PATCH 50/50] fix get posts id --- ayct_backend/campaign/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ayct_backend/campaign/__init__.py b/ayct_backend/campaign/__init__.py index fc3bc40..4c0e18b 100644 --- a/ayct_backend/campaign/__init__.py +++ b/ayct_backend/campaign/__init__.py @@ -149,7 +149,7 @@ def get_twitter_campaign_details(campaign_id): posts = [] for post in campaign_posts: post_data = {} - post_data['post_id'] = post.post_id + post_data['post_id'] = post.id post_data['campaign_id'] = post.campaign_id post_data['post_content'] = post.post_content post_data['twitter_post_id'] = post.twitter_post_id