From f50062f5388d206dae02d19eb14981d990911aa5 Mon Sep 17 00:00:00 2001 From: Tomasz Brzezina Date: Tue, 1 Nov 2016 21:53:58 +0100 Subject: [PATCH 1/4] postgresql support - only one --- database.sql => mysql-database.sql | 0 pgsql-database.sql | 65 ++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) rename database.sql => mysql-database.sql (100%) create mode 100644 pgsql-database.sql diff --git a/database.sql b/mysql-database.sql similarity index 100% rename from database.sql rename to mysql-database.sql diff --git a/pgsql-database.sql b/pgsql-database.sql new file mode 100644 index 0000000..0d02d34 --- /dev/null +++ b/pgsql-database.sql @@ -0,0 +1,65 @@ +-- ----------------------------------------------------- +-- Table "subscription" +-- ----------------------------------------------------- +DROP TABLE IF EXISTS "subscription"; +DROP SEQUENCE IF EXISTS "subscription_id_seq"; + +CREATE TABLE IF NOT EXISTS "subscription" ( + "id" SERIAL, + "device" VARCHAR(40) NOT NULL, + "service_id" integer NOT NULL, + "last_read" integer NOT NULL DEFAULT 0, + "timestamp_created" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + "timestamp_checked" TIMESTAMP NULL DEFAULT NULL, + PRIMARY KEY ("id") +); + +-- ----------------------------------------------------- +-- Table "message" +-- ----------------------------------------------------- +DROP TABLE IF EXISTS "message"; +DROP SEQUENCE IF EXISTS "message_id_seq"; + +CREATE TABLE IF NOT EXISTS "message" ( + "id" SERIAL, + "service_id" integer NOT NULL, + "text" TEXT NOT NULL, + "title" VARCHAR(255) NULL DEFAULT NULL, + "level" SMALLINT NOT NULL DEFAULT 0, + "link" TEXT NULL, + "timestamp_created" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY ("id") +); + +-- ----------------------------------------------------- +-- Table "service" +-- ----------------------------------------------------- +DROP TABLE IF EXISTS "service"; +DROP SEQUENCE IF EXISTS "service_id_seq"; + +CREATE TABLE IF NOT EXISTS "service" ( + "id" SERIAL, + "secret" VARCHAR(32) NOT NULL, + "public" VARCHAR(40) NOT NULL, + "name" VARCHAR(255) NOT NULL, + "icon" TEXT NULL, + "timestamp_created" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY ("id") +); + +-- ----------------------------------------------------- +-- Table "gcm" +-- ----------------------------------------------------- +DROP TABLE IF EXISTS "gcm"; +DROP SEQUENCE IF EXISTS "gcm_id_seq"; + +CREATE TABLE IF NOT EXISTS "gcm" ( + "id" SERIAL, + "uuid" VARCHAR(40) NOT NULL, + "gcmid" TEXT NOT NULL, + "pubkey" TEXT DEFAULT NULL, + "timestamp_created" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + "rsa_pub" BYTEA DEFAULT NULL, + PRIMARY KEY ("id") +); + From ae5e95f41de98aebf58cfda58937d200ea2bfd48 Mon Sep 17 00:00:00 2001 From: Tomasz Brzezina Date: Tue, 1 Nov 2016 22:04:32 +0100 Subject: [PATCH 2/4] postgresql support --- application.py | 3 ++- config.example.py | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/application.py b/application.py index c7f82ee..6c73fbe 100755 --- a/application.py +++ b/application.py @@ -33,7 +33,8 @@ app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db.init_app(app) with app.app_context(): - db.engine.execute("SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'") + db.engine.execute("SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'") #mysql + #db.engine.execute("SET NAMES 'utf8'") #pgsql @app.route('/') diff --git a/config.example.py b/config.example.py index 8f899ad..bb6b767 100644 --- a/config.example.py +++ b/config.example.py @@ -1,5 +1,7 @@ -# Must be a mysql database! +# Must be a mysql or postgresql database! database_uri = 'mysql://root@localhost/pushjet_api' +#database_uri = 'postgresql://user:password@localhost/pushjet_api' + # Are we debugging the server? # Do not turn this on when in production! From 5745e1414c7e91e6ac4ecffed92873a289cf21d9 Mon Sep 17 00:00:00 2001 From: Tomasz Brzezina Date: Thu, 24 Nov 2016 12:30:33 +0100 Subject: [PATCH 3/4] GCM -> FCM --- application.py | 11 ++--------- controllers/message.py | 2 -- models/gcm.py | 7 +++---- models/message.py | 6 ++++++ 4 files changed, 11 insertions(+), 15 deletions(-) diff --git a/application.py b/application.py index 6c73fbe..722d85c 100755 --- a/application.py +++ b/application.py @@ -19,13 +19,6 @@ if config.google_api_key == '': stderr.write("WARNING: GCM disabled, please enter the google api key for gcm") gcm_enabled = False -if not isinstance(config.google_gcm_sender_id, int): - stderr.write("WARNING: GCM disabled, sender id is not an integer") - gcm_enabled = False -elif config.google_gcm_sender_id == 0: - stderr.write('WARNING: GCM disabled, invalid sender id found') - gcm_enabled = False - app = Flask(__name__) app.debug = config.debug or int(getenv('FLASK_DEBUG', 0)) > 0 @@ -33,8 +26,8 @@ app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db.init_app(app) with app.app_context(): - db.engine.execute("SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'") #mysql - #db.engine.execute("SET NAMES 'utf8'") #pgsql + #db.engine.execute("SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'") #mysql + db.engine.execute("SET NAMES 'utf8'") #pgsql @app.route('/') diff --git a/controllers/message.py b/controllers/message.py index f1ec8f0..bcbc0de 100644 --- a/controllers/message.py +++ b/controllers/message.py @@ -10,7 +10,6 @@ message = Blueprint('message', __name__) - @message.route('/message', methods=['POST']) @has_secret def message_send(service): @@ -31,7 +30,6 @@ def message_send(service): msg = Message(service, text, title, level, link) db.session.add(msg) db.session.commit() - if google_api_key or current_app.config['TESTING']: Gcm.send_message(msg) diff --git a/models/gcm.py b/models/gcm.py index 4306f6c..1de45fa 100644 --- a/models/gcm.py +++ b/models/gcm.py @@ -8,7 +8,6 @@ gcm_url = 'https://android.googleapis.com/gcm/send' - class Gcm(db.Model): id = db.Column(INTEGER(unsigned=True), primary_key=True) uuid = db.Column(db.VARCHAR(40), nullable=False) @@ -42,8 +41,7 @@ def send_message(message): gcm_devices = Gcm.query.filter(Gcm.uuid.in_([l.device for l in subscriptions])).all() if len(gcm_devices) > 0: - data = dict(message=message.as_dict(), encrypted=False) - Gcm.gcm_send([r.gcmid for r in gcm_devices], data) + Gcm.gcm_send([r.gcmid for r in gcm_devices], message.as_notification()) if len(gcm_devices) > 0: uuids = [g.uuid for g in gcm_devices] @@ -59,9 +57,10 @@ def send_message(message): def gcm_send(ids, data): url = 'https://android.googleapis.com/gcm/send' headers = dict(Authorization='key={}'.format(google_api_key)) - data = dict(registration_ids=ids, data=data) + data = dict(registration_ids=ids, notification=data) if current_app.config['TESTING'] is True: current_app.config['TESTING_GCM'].append(data) else: requests.post(url, json=data, headers=headers) + diff --git a/models/message.py b/models/message.py index c469d32..81bf5b4 100644 --- a/models/message.py +++ b/models/message.py @@ -32,3 +32,9 @@ def as_dict(self): "level": self.level, "timestamp": int((self.timestamp_created - datetime.utcfromtimestamp(0)).total_seconds()) } + def as_notification(self): + return { + "title" : self.title, + "body" : self.text, + "click_action" : self.link + } From d715866db1fbdbbd1ce8845c20a00799d423c102 Mon Sep 17 00:00:00 2001 From: Tomasz Brzezina Date: Thu, 24 Nov 2016 12:32:50 +0100 Subject: [PATCH 4/4] small editors --- application.py | 6 ++++++ controllers/message.py | 2 ++ 2 files changed, 8 insertions(+) diff --git a/application.py b/application.py index 722d85c..ea3bc47 100755 --- a/application.py +++ b/application.py @@ -19,6 +19,12 @@ if config.google_api_key == '': stderr.write("WARNING: GCM disabled, please enter the google api key for gcm") gcm_enabled = False +if not isinstance(config.google_gcm_sender_id, int): + stderr.write("WARNING: GCM disabled, sender id is not an integer") + gcm_enabled = False +elif config.google_gcm_sender_id == 0: + stderr.write('WARNING: GCM disabled, invalid sender id found') + gcm_enabled = False app = Flask(__name__) app.debug = config.debug or int(getenv('FLASK_DEBUG', 0)) > 0 diff --git a/controllers/message.py b/controllers/message.py index bcbc0de..f1ec8f0 100644 --- a/controllers/message.py +++ b/controllers/message.py @@ -10,6 +10,7 @@ message = Blueprint('message', __name__) + @message.route('/message', methods=['POST']) @has_secret def message_send(service): @@ -30,6 +31,7 @@ def message_send(service): msg = Message(service, text, title, level, link) db.session.add(msg) db.session.commit() + if google_api_key or current_app.config['TESTING']: Gcm.send_message(msg)