from flask import Flask, jsonify, request, json from types import SimpleNamespace from xmpp import cli from flask_jwt_extended import JWTManager, jwt_required, get_jwt_identity, create_access_token from datetime import date, timedelta, datetime import sqlalchemy as db from sqlalchemy import create_engine, Integer, Date, DateTime, Column, String, Boolean, or_ from sqlalchemy.orm import sessionmaker, scoped_session, declarative_base from BackendApi.connect import connect from api_config import Config app = Flask(__name__) #Добавление секртного слова для шифрования JWT app.config.from_object(Config) engine = create_engine(connect()) session = scoped_session(sessionmaker( autocommit=False, autoflush=False, bind=engine )) Base = declarative_base() class UserModel(Base): __tablename__ = 'rest_user' id = Column(Integer, primary_key=True, autoincrement=True, ) name = Column(String, unique=True, nullable=False) birthday = Column(Date) insys = Column(Boolean) idrole = Column(Integer) lastlogintime = Column(DateTime) email = Column(String, unique=True, nullable=False) password = Column(String) def as_dict(self): return {c.name: getattr(self, c.name) for c in self.__table__.columns} #Инициализация класса шифрования jwt = JWTManager(app) #Переменные чтобы не ошибиться data = 'data' code = 'httpcode' #Генерация токена (id - данные которые шифруются, min - время действия токена) #Используются при авторизации или регистрации (возможно выдавать и при других обстоятельствах) def gen_token(id, min): token = {"access_token" : create_access_token(identity=id, expires_delta=timedelta(minutes=min))} return jsonify(token) #Ошибка сервера (возвращает ошибку и код ошибки) def err_mes(ex): return jsonify({"msg":str(ex)}), 500 def data_for_model(data): return json.loads(data, object_hook=lambda d: SimpleNamespace(**d)) #Авторизация пользователя # @app.route('/auth', methods=['POST']) # def post_auth(): # try: # result = db_query.auth_query(request.get_json()) # return gen_token(result[data]['id'], 5), result[code] # except Exception as ex: # return err_mes(ex) #Добавление пользователя и проверка на сходства @app.route('/adduser', methods=['POST']) def add_user(): try: user = UserModel(**request.get_json()) chek = session.query(UserModel).filter(or_(UserModel.email==user.email, UserModel.name==user.name)).first() if chek is None: session.add(user) session.flush() session.commit() return str(user.id), 200 else: return "User exist", 400 except Exception as ex: return err_mes(ex) #Запрос на получение данных об одном пользователе # @app.route('/user/', methods=['GET']) # def get_user(id): # try: # result = db_query.get_user_query(id) # return jsonify(result[data]), result[code] # except Exception as ex: # return err_mes(ex) #Запрос на получение данных всех пользователей @app.route('/users', methods=['GET']) def get_show_user(): try: data = [] for user in session.query(UserModel).all(): data.append(user.as_dict()) #result = db_query.get_all_user_query() return jsonify(data), 200 except Exception as ex: return err_mes(ex) #Удаление пользователя @app.route('/deleteuser', methods=['POST']) def delete_user(): try: user = UserModel(**request.get_json()) session.query(UserModel).filter_by(id=user.id).delete() session.commit() return "Success delete" #result = db_query.delete_user_query(request.get_json()) #return jsonify(result[data]), result[code] except Exception as ex: return err_mes(ex) #Обновление данных пользователя # @app.route('/updateuser', methods=['POST']) # @jwt_required() # def test_api(): # try: # result = db_query.update_user_query(request.get_json(), get_jwt_identity()) # return jsonify(result[data]), result[code] # except Exception as ex: # return err_mes(ex) #Отправка сообщения через XMPP @app.route('/testmessage', methods=['POST']) def send_mess(): try: request_data = request.get_json() for to in request_data['to']: cli.send_message(request_data['from'], request_data['password'], to, request_data['message']) return jsonify({"msg":"Succes send!"}), 200 except Exception as ex: return err_mes(ex) # @app.route('/testaddcarlog', methods=['POST']) # def test_add_car_log(): # try: # result = db_query.add_car_log(request.get_json()) # return gen_token(result[data], 5), result[code] # except Exception as ex: # return err_mes(ex) if __name__ == '__main__': #from waitress import serve #serve(app, host='127.0.0.2', port='8080') app.run(host='0.0.0.0', debug=True, load_dotenv=True )