diff --git a/app.py b/app.py index 5e2de3e..eb63cb9 100644 --- a/app.py +++ b/app.py @@ -24,6 +24,8 @@ file_handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s: %(messag app.logger.addHandler(file_handler) app.logger.setLevel(logging.INFO) +msg_403_not_primary = "Only a PRIMARY device can perform this action" + @app.route("/api/v1/login", methods=["POST"]) def login(): @@ -69,5 +71,19 @@ def refresh_token(): @jwt_required() def get_all_devices(): if get_jwt()["typ"] != "PRIMARY": - return make_response(jsonify(msg="Only a PRIMARY device can list all devices"), 403) + return make_response(jsonify(msg=msg_403_not_primary), 403) return make_response(jsonify([d.to_dict() for d in db.get_all_devices(cur)]), 200) + + +@app.route("/api/v1/sim-cards", methods=["GET"]) +@jwt_required() +def get_sim_cards_by_device(): + if not is_primary(get_jwt()): + return make_response(jsonify(msg=msg_403_not_primary), 403) + + access_key = request.args.get('access_key', None) + return make_response(jsonify([s.to_dict() for s in db.get_sim_cards_by_device(cur, access_key)]), 200) + + +def is_primary(jwt): + return jwt["typ"] == "PRIMARY" diff --git a/db.py b/db.py index a48acf7..22b24a1 100644 --- a/db.py +++ b/db.py @@ -1,4 +1,4 @@ -from dto import Device +from dto import Device, SimCard def get_all_devices(cur) -> list[Device]: @@ -10,3 +10,13 @@ def get_all_devices(cur) -> list[Device]: devices.append(Device.convert(item)) return devices + +def get_sim_cards_by_device(cur, access_key: str) -> list[SimCard]: + if access_key is None or not access_key: + return [] + + sim_cards_from_db = cur.execute("SELECT phone_number, device_access_key FROM sim_cards WHERE device_access_key = ?", (access_key,)).fetchall() + sim_cards = [] + for item in sim_cards_from_db: + sim_cards.append(SimCard.convert(item)) + return sim_cards diff --git a/dto.py b/dto.py index 2ed4a19..a3a6edd 100644 --- a/dto.py +++ b/dto.py @@ -1,9 +1,10 @@ -class Device: - def __init__(self, access_key, device_type, name): - self.access_key = access_key - self.device_type = device_type - self.name = name +from dataclasses import dataclass +@dataclass +class Device: + access_key: str + device_type: str + name: str def to_dict(self): return { @@ -15,3 +16,16 @@ class Device: def convert(device_from_db) -> Device: return Device(*device_from_db) +@dataclass +class SimCard: + phone_number: str + device_access_key: str + + def to_dict(self): + return { + 'phone_number': self.phone_number, + 'device_access_key': self.device_access_key + } + + def convert(sim_from_db) -> SimCard: + return SimCard(*sim_from_db) diff --git a/init-db.py b/init-db.py index 014c594..144495c 100644 --- a/init-db.py +++ b/init-db.py @@ -14,7 +14,7 @@ cur = con.cursor() cur.execute("CREATE TABLE devices(access_key, secret_key_hash, type, name)") cur.execute("CREATE TABLE messages(content, ts_received, ts_sent, sender, recipient)") cur.execute("CREATE TABLE sim_events(sim_id, ts, note, cost, currency)") -cur.execute("CREATE TABLE sim_cards(phone_number, device_id)") +cur.execute("CREATE TABLE sim_cards(phone_number, device_access_key)") pw1_hash = flask_bcrypt.generate_password_hash('pw1').decode('utf-8') pw2_hash = flask_bcrypt.generate_password_hash('pw2').decode('utf-8') @@ -24,6 +24,13 @@ cur.execute(""" ('test_access_key2', ?, 'SECONDARY', 'test-secondary') """, (pw1_hash, pw2_hash)) +cur.execute(""" + INSERT INTO sim_cards VALUES + ('+420123456789', 'test_access_key'), + ('+421000111222', 'test_access_key'), + ('+422999888777', 'test_access_key2') +""") + con.commit() con.close()