from flask import jsonify, request from app.payment import payment from app import db from app.classes.customer import Customer_Customer from app.classes.cards import Card_Card, Card_Card_schema from flask_login import current_user def set_card_main(user_id, card_id): """ updates a card of a user """ get_card_count = ( db.session .query(Card_Card) .filter(Card_Card.user_id == user_id) .count() ) get_card = ( db.session .query(Card_Card) .filter(Card_Card.user_id == user_id) .filter(Card_Card.id == card_id) .first() ) if get_card_count > 0: get_old_card = ( db.session .query(Card_Card) .filter(Card_Card.main_card == True) .filter(Card_Card.user_id == user_id) .first() ) get_old_card.main_card = False get_card.main_card = True db.session.add(get_old_card) db.session.commit() else: get_card.main_card = True db.session.add(get_card) db.session.commit() @payment.route("/cards/", methods=["GET"]) def get_user_cards(user_id): """ gets all cards of a user """ get_u_cards = db.session \ .query(Card_Card) \ .filter(Card_Card.user_id == user_id) \ .all() card_schema = Card_Card_schema(many=True) return jsonify(card_schema.dump(get_u_cards)) @payment.route("/cards/onfile/", methods=["GET"]) def get_user_cards_count(user_id): """ gets all cards of a user """ get_u_cards = db.session \ .query(Card_Card) \ .filter(Card_Card.user_id == user_id) \ .count() return jsonify({ "ok": True, 'cards': get_u_cards, }), 200 @payment.route("/card/", methods=["GET"]) def get_user_specific_card(card_id): """ gets a specific card of a user """ get_user_card = db.session \ .query(Card_Card) \ .filter(Card_Card.id == card_id) \ .first() card_schema = Card_Card_schema(many=False) return jsonify(card_schema.dump(get_user_card)) @payment.route("/card/create/", methods=["POST"]) def create_user_card(user_id): """ adds a card of a user """ get_customer = db.session \ .query(Customer_Customer) \ .filter(Customer_Customer.id == user_id) \ .first() name_on_card = request.json["card_name"] expiration_month = request.json["expiration_month"] expiration_year = request.json["expiration_year"] type_of_card = request.json["type_of_card"] security_number = request.json["security_number"] main_card = request.json["main_card"] card_number = request.json["card_number"] last_four = card_number[-4] create_new_card = Card_Card( user_id=get_customer.id, card_number=card_number, last_four_digits=last_four, name_on_card=name_on_card, expiration_month=expiration_month, expiration_year=expiration_year, type_of_card=type_of_card, security_number=security_number, accepted_or_declined=None, main_card=main_card, ) db.session.flush() if main_card is True: set_card_main(user_id=get_customer.id, card_id=create_new_card.id) db.session.add(create_new_card) db.session.commit() return jsonify({"ok": True}), 200 @payment.route("/card/main//", methods=["PUT"]) def set_main_card(user_id, card_id): """ updates a card of a user """ get_new_main_card = db.session \ .query(Card_Card) \ .filter(Card_Card.user_id == user_id) \ .filter(Card_Card.id == card_id) \ .first() get_other_card = db.session \ .query(Card_Card) \ .filter(Card_Card.main_card == True) \ .filter(Card_Card.user_id == user_id) \ .first() if get_other_card is not None: get_other_card.main_card = False db.session.add(get_other_card) get_new_main_card.main_card = True db.session.add(get_new_main_card) db.session.commit() return jsonify({"ok": True}), 200 @payment.route("/card/edit/", methods=["PUT"]) def update_user_card(card_id): """ edits a card """ get_card = db.session \ .query(Card_Card) \ .filter(Card_Card.id == card_id) \ .first() get_customer = db.session \ .query(Customer_Customer) \ .filter(Customer_Customer.id == get_card.user_id) \ .first() name_on_card = request.json["card_name"] expiration_month = request.json["expiration_month"] expiration_year = request.json["expiration_year"] type_of_card = request.json["type_of_card"] security_number = request.json["security_number"] card_number = request.json["card_number"] main_card = request.json["main_card"] get_card.user_id = get_customer.id get_card.card_number = card_number get_card.name_on_card = name_on_card get_card.expiration_month = expiration_month get_card.expiration_year = expiration_year get_card.type_of_card = type_of_card get_card.security_number = security_number get_card.main_card = main_card if main_card is True: set_card_main(user_id=get_customer.id, card_id=get_card.id) db.session.add(get_card) db.session.commit() return jsonify({"ok": True}), 200 @payment.route("/card/remove/", methods=["DELETE"]) def remove_user_card(card_id): """ removes a card """ get_card = db.session \ .query(Card_Card) \ .filter(Card_Card.id == card_id) \ .first() db.session.delete(get_card) db.session.commit() return jsonify({"ok": True}), 200