Files
helloasso/api/serv.py

139 lines
3.5 KiB
Python
Raw Normal View History

2023-09-12 22:52:05 +02:00
#!/bin/env python3
2023-09-13 00:14:14 +02:00
import os
2023-11-18 14:30:34 +01:00
from re import A
2023-09-13 00:14:14 +02:00
import sqlite3
2023-09-14 00:30:02 +02:00
from flask import Flask, make_response, render_template,request,g,jsonify
2023-09-12 22:52:05 +02:00
from flask_sock import Sock
2023-11-18 14:30:34 +01:00
from classes import Payment, Client,Donator, CustomJSONProvider
import random
from flask_cors import CORS,cross_origin
2023-09-12 22:52:05 +02:00
clients_list = []
2023-09-14 00:30:02 +02:00
payments_list : list[Payment] = []
2023-09-13 00:14:14 +02:00
app = Flask(__name__, instance_relative_config=True)
app.config.from_mapping(
DATABASE=os.path.join(app.instance_path,'db.sqlite')
)
2023-09-14 00:30:02 +02:00
app.json = CustomJSONProvider(app)
2023-09-13 00:14:14 +02:00
sock = Sock(app)
2023-11-18 14:30:34 +01:00
cors = CORS(app)
app.config['CORS_HEADERS'] = 'Content-Type'
2023-09-13 00:14:14 +02:00
def get_db():
db = getattr(g, '_database', None)
if db is None:
db = g.db = sqlite3.connect('db.sqlite')
return db
@app.teardown_appcontext
def close(exception):
db = getattr(g, 'db', None)
if db is not None:
db.close()
2023-09-14 00:30:02 +02:00
def notify_client_payment(msg):
for c in clients_list:
try:
c.send_event(app.json.dumps(msg))
except:
clients_list.remove(c)
2023-09-12 22:52:05 +02:00
@app.route('/')
def index():
return render_template('index.html')
2023-11-18 14:30:34 +01:00
#@app.route('/show')
#def show():
# db = get_db()
# cur = db.cursor()
# cur.execute('select * from orders;')
# info = cur.fetchall();
# val = ""
# for i in info:
# val += '{} {} <br/>'.format(i[0],i[1])
# return make_response(val, 200)
2023-09-13 00:14:14 +02:00
@app.route('/test')
def test():
2023-11-18 14:30:34 +01:00
p = Payment(int(random.random()*100),5000,'TEST DE MESSAGE BIEN LONG SKLDJQLKDJQLKSJDQLSKJDQLKJD','Nom donation')
p.save(get_db())
2023-09-14 00:30:02 +02:00
notify_client_payment(p)
return jsonify(p), 200
2023-09-13 00:14:14 +02:00
2023-11-14 22:08:05 +01:00
@app.route('/replay')
def replay():
ps = Payment.get_all(get_db())
print(ps)
if ps:
for p in ps:
print(repr(p))
notify_client_payment(p)
return jsonify(ps), 200
2023-09-12 22:52:05 +02:00
@app.route('/last')
def last():
print(len(clients_list))
2023-09-14 00:30:02 +02:00
if(len(payments_list) > 0):
p = payments_list[0]
notify_client_payment(p)
2023-09-12 22:52:05 +02:00
return make_response('last',200)
@sock.route('/notify')
def notify(sock):
clients_list.append(Client(sock))
while True:
data = sock.receive()
sock.send(data)
2023-11-18 14:30:34 +01:00
@app.route('/total')
@cross_origin()
def total():
data= Payment.get_all(get_db())
if data is not None:
total = sum(x.amount for x in data)
2023-11-18 18:52:39 +01:00
return jsonify(float(total/100)), 200
2023-11-18 14:30:34 +01:00
else:
return jsonify(0);
@app.route('/topdonators')
@cross_origin()
def topdonator():
data = Donator.top_donator(get_db())
if data is not None:
return jsonify(data), 200
else:
return jsonify(0);
2023-09-12 22:52:05 +02:00
@app.route('/notifications',methods=['POST'])
def notifications():
if request.json is not None:
print(request.json)
if request.json['eventType'] == 'Order':
2023-11-19 13:16:17 +01:00
name = ''
message = ''
try:
fields = request.json['data']['items'][0]['customFields']
for f in fields:
if f['name'] == 'Message':
message = f['answer']
if f['name'] == 'Pseudo':
name = f['answer']
except:
print('Fail to parse');
2023-09-14 00:30:02 +02:00
p = Payment(request.json['data']['id'],
2023-09-13 00:14:14 +02:00
request.json['data']['amount']['total'],
2023-11-19 13:16:17 +01:00
message,
name)
2023-09-13 00:14:14 +02:00
p.save(get_db());
2023-09-14 00:30:02 +02:00
payments_list.append(p)
notify_client_payment(p)
2023-09-12 22:52:05 +02:00
return make_response('OK',200)
return make_response('Not Handled',400)