109 lines
No EOL
4.1 KiB
Python
109 lines
No EOL
4.1 KiB
Python
from os import path
|
|
from flask import render_template
|
|
from .data import db as db
|
|
from .data.data_models import ResponseCode
|
|
from .data.data_models import DataError
|
|
from .data.data_models import Device
|
|
from .data import dao_device
|
|
from .encrypt import encrypt
|
|
|
|
import firebase_admin
|
|
from firebase_admin import credentials, messaging
|
|
|
|
import json
|
|
from flask import request, jsonify, redirect
|
|
from flask import Flask
|
|
|
|
def create_app(test_config=None):
|
|
app = Flask(__name__)
|
|
if (test_config == None):
|
|
app.config.from_file('config.json', silent=True, load=json.load)
|
|
else:
|
|
app.config.from_mapping(test_config)
|
|
db.init_app(app)
|
|
|
|
firebase_cred = credentials.Certificate(app.config.get('FIREBASE_JSON'))
|
|
firebase_app = firebase_admin.initialize_app(firebase_cred)
|
|
|
|
@app.route('/', methods=['GET'])
|
|
def home():
|
|
devices = dao_device.get_devices()
|
|
token_limit = app.config.get('TOKEN_SHOW_LIMIT')
|
|
if (token_limit is None):
|
|
token_limit = 2
|
|
device_name_and_token = map(lambda device: format_device(device=device, token_limit=token_limit), devices)
|
|
|
|
return render_template('index.html', devices=device_name_and_token)
|
|
|
|
def format_device(device: Device, token_limit: int):
|
|
device_token_first = device.token[:token_limit]
|
|
device_token_last = device.token[-token_limit:]
|
|
device_token = device_token_first + ' ... ' + device_token_last
|
|
return (device.name, device_token)
|
|
|
|
@app.route('/delete', methods=['POST'])
|
|
def registerDelete():
|
|
device_name = request.form.get('device_name')
|
|
if device_name is None:
|
|
errorResponse = jsonify({'message':'DeviceName cannot be empty!','code':ResponseCode.EMPTY_DEVICE_NAME})
|
|
return errorResponse, 400
|
|
dao_device.delete_device_by_name(name=device_name)
|
|
return redirect("/")
|
|
|
|
@app.route("/register", methods=['POST'])
|
|
def register():
|
|
device_token = request.form.get('device_token')
|
|
device_name = request.form.get('device_name')
|
|
encryption_key = request.form.get('encryption_key')
|
|
if device_token is None:
|
|
errorResponse = jsonify({'message':'DeviceToken cannot be empty!','code':ResponseCode.EMPTY_DEVICE_TOKEN, 'request': request.form})
|
|
return errorResponse, 400
|
|
if device_name is None:
|
|
errorResponse = jsonify({'message':'DeviceName cannot be empty!','code':ResponseCode.EMPTY_DEVICE_NAME})
|
|
return errorResponse, 400
|
|
if encryption_key is None:
|
|
errorResponse = jsonify({'message':'DeviceEncryption cannot be empty!','code':ResponseCode.EMPTY_DEVICE_ENCRYPTION})
|
|
return errorResponse, 400
|
|
|
|
device = Device(name=device_name, token=device_token, encryption_key=encryption_key)
|
|
dao_device.delete_device_by_name(name=device.name)
|
|
result = dao_device.insert_device(device)
|
|
if result == DataError.DEVICE_INSERT_ERROR:
|
|
errorResponse = jsonify({'message':'Couldn\'t save device!','code':ResponseCode.DEVICE_SAVE_FAILURE})
|
|
return errorResponse, 400
|
|
|
|
return redirect("/")
|
|
|
|
@app.route("/notify", methods=['POST'])
|
|
def notify():
|
|
service = request.form.get('service') # name of the service
|
|
priority = request.form.get('priority') # Low, Medium, High
|
|
log = request.form.get('log') # log message
|
|
|
|
# could use batching but there shouldn't be that many devices so ¯\_(ツ)_/¯
|
|
devices = dao_device.get_devices()
|
|
if service and priority and log:
|
|
for device in devices:
|
|
dataWithEncryptedLog = encrypt(message=log, encryption_key=device.encryption_key)
|
|
dataWithEncryptedLog['priority'] = priority
|
|
dataWithEncryptedLog['service'] = service
|
|
message = messaging.Message(
|
|
data = dataWithEncryptedLog,
|
|
token = device.token
|
|
)
|
|
messaging.send(message)
|
|
return redirect("/")
|
|
else:
|
|
errorResponse = jsonify({'message':'service, priority & log cannot be empty!','code':ResponseCode.NOTIFICATION_PARAMS_MISSING})
|
|
return errorResponse, 400
|
|
|
|
return app
|
|
|
|
if __name__ == "__main__":
|
|
app = create_app()
|
|
app.run(host='0.0.0.0')
|
|
|
|
|
|
|
|
|
|
|