From 72edb440b73a90ff552c38b7d8cff926952f0a6d Mon Sep 17 00:00:00 2001 From: bmondream Date: Fri, 1 May 2026 21:29:46 +0200 Subject: [PATCH] feat: add /api/v1/sms-messages GET endpoint --- app.py | 10 ++++++++++ db.py | 13 ++++++++++++- dto.py | 27 +++++++++++++++++++++++++++ init-db.py | 12 +++++++++++- 4 files changed, 60 insertions(+), 2 deletions(-) diff --git a/app.py b/app.py index eb63cb9..dddd081 100644 --- a/app.py +++ b/app.py @@ -85,5 +85,15 @@ def get_sim_cards_by_device(): return make_response(jsonify([s.to_dict() for s in db.get_sim_cards_by_device(cur, access_key)]), 200) +@app.route("/api/v1/sms-messages", methods=["GET"]) +@jwt_required() +def get_sms_messages_by_local_phone_number(): + if not is_primary(get_jwt()): + return make_response(jsonify(msg=msg_403_not_primary), 403) + + local_phone_number = request.args.get("local_phone_number", None) + return make_response(jsonify([n.to_dict() for n in db.get_sms_messages_by_local_phone_number(cur, local_phone_number)]), 200) + + def is_primary(jwt): return jwt["typ"] == "PRIMARY" diff --git a/db.py b/db.py index 22b24a1..a99e294 100644 --- a/db.py +++ b/db.py @@ -1,4 +1,4 @@ -from dto import Device, SimCard +from dto import Device, SimCard, SmsMessage def get_all_devices(cur) -> list[Device]: @@ -20,3 +20,14 @@ def get_sim_cards_by_device(cur, access_key: str) -> list[SimCard]: for item in sim_cards_from_db: sim_cards.append(SimCard.convert(item)) return sim_cards + + +def get_sms_messages_by_local_phone_number(cur, local_phone_number: str) -> list[SmsMessage]: + if local_phone_number is None or not local_phone_number: + return [] + + msgs_from_db = cur.execute("SELECT * FROM messages WHERE local_phone_number = ?", (local_phone_number,)).fetchall() + msgs = [] + for item in msgs_from_db: + msgs.append(SmsMessage.convert(item)) + return msgs diff --git a/dto.py b/dto.py index a3a6edd..4c91e2e 100644 --- a/dto.py +++ b/dto.py @@ -6,6 +6,7 @@ class Device: device_type: str name: str + def to_dict(self): return { 'access_key': self.access_key, @@ -13,6 +14,7 @@ class Device: 'name': self.name } + def convert(device_from_db) -> Device: return Device(*device_from_db) @@ -21,11 +23,36 @@ 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) + +@dataclass +class SmsMessage: + content: str + ts_received: int + ts_sent: int + msg_type: str + local_phone_number: str + remote_phone_number: str + + def to_dict(self): + return { + 'content': self.content, + 'ts_received': self.ts_received, + 'ts_sent': self.ts_sent, + 'msg_type': self.msg_type, + 'local_phone_number': self.local_phone_number, + 'remote_phone_number': self.remote_phone_number + } + + + def convert(sms_from_db) -> SmsMessage: + return SmsMessage(*sms_from_db) diff --git a/init-db.py b/init-db.py index 144495c..24e7415 100644 --- a/init-db.py +++ b/init-db.py @@ -12,7 +12,11 @@ cur = con.cursor() # ID columns are not necessary - SQLite by default sets ROWID as INTEGER PRIMARY KEY which auto increments cur.execute("CREATE TABLE devices(access_key, secret_key_hash, type, name)") -cur.execute("CREATE TABLE messages(content, ts_received, ts_sent, sender, recipient)") + +# type : INCOMING, OUTGOING +# local_phone_number : a SECONDARY device SIM's phone number +# remote_phone_number : a phone number or shortcode of the other party +cur.execute("CREATE TABLE messages(content, ts_received, ts_sent, type, local_phone_number, remote_phone_number)") cur.execute("CREATE TABLE sim_events(sim_id, ts, note, cost, currency)") cur.execute("CREATE TABLE sim_cards(phone_number, device_access_key)") @@ -31,6 +35,12 @@ cur.execute(""" ('+422999888777', 'test_access_key2') """) +cur.execute(""" + INSERT INTO messages VALUES + ('how are you?', 1000, 999, 'INCOMING', '+420123456789', '+10005558888'), + ('i am fine', 2000, 1999, 'OUTGOING', '+420123456789', '+10005558888') +""") + con.commit() con.close()