From d913674426f9abff23fcbf829f61a1f94737a078 Mon Sep 17 00:00:00 2001 From: Michael Woods Date: Thu, 25 Dec 2025 20:32:12 -0500 Subject: [PATCH] Partially fixed bad send behavior. --- packetserver/http/routers/send.py | 41 ++++++++++++++++++---- packetserver/http/templates/base.html | 4 +++ packetserver/http/templates/dashboard.html | 7 ++-- 3 files changed, 43 insertions(+), 9 deletions(-) diff --git a/packetserver/http/routers/send.py b/packetserver/http/routers/send.py index b7e5a96..0218861 100644 --- a/packetserver/http/routers/send.py +++ b/packetserver/http/routers/send.py @@ -56,6 +56,8 @@ async def send_message( username = current_user.username + users_dict = root.get('users', {}) + # Prepare recipients to_list = payload.to to_tuple = tuple(to_list) @@ -63,9 +65,28 @@ async def send_message( to_tuple = ("ALL",) is_bulletin = "ALL" in to_list - recipients = to_list if not is_bulletin else list(root.get('users', {}).keys()) - # Create message using only supported core params + if is_bulletin: + # Bulletin: deliver to all registered users + valid_recipients = list(users_dict.keys()) + failed_recipients = [] + else: + # Private message: validate each recipient exists + valid_recipients = [] + failed_recipients = [] + for recip in to_list: + if users_dict.get(recip): + valid_recipients.append(recip) + else: + failed_recipients.append(recip) + + if not valid_recipients: + raise HTTPException( + status_code=400, + detail=f"No valid recipients found. Failed: {', '.join(failed_recipients)}" + ) + + # Create message new_msg = Message( text=payload.text, msg_from=username, @@ -73,11 +94,11 @@ async def send_message( attachments=() ) - # Deliver to recipients + always sender (sent folder) + # Deliver to valid recipients + always sender (sent folder) messages_root = root.setdefault('messages', PersistentMapping()) - delivered_to = set() + delivered_to = set([username]) # sender always gets copy - for recip in set(recipients) | {username}: + for recip in valid_recipients: mailbox = messages_root.setdefault(recip, PersistentList()) mailbox.append(new_msg) mailbox._p_changed = True @@ -86,11 +107,17 @@ async def send_message( messages_root._p_changed = True transaction.commit() - return { + response = { "status": "sent", "message_id": str(new_msg.msg_id), "from": username, "to": list(to_tuple), "sent_at": new_msg.sent_at.isoformat() + "Z", "recipients_delivered": len(delivered_to) - } \ No newline at end of file + } + + if failed_recipients: + response["warning"] = f"Some recipients not registered: {', '.join(failed_recipients)}" + response["failed_recipients"] = failed_recipients + + return response \ No newline at end of file diff --git a/packetserver/http/templates/base.html b/packetserver/http/templates/base.html index 98fa434..04bc8d1 100644 --- a/packetserver/http/templates/base.html +++ b/packetserver/http/templates/base.html @@ -103,6 +103,10 @@ }); if (response.ok) { + const result = await response.json(); + let msg = 'Message sent!'; + if (result.warning) msg += ` ${result.warning}`; + status.textContent = msg; status.className = 'alert alert-success'; status.textContent = 'Message sent successfully!'; status.style.display = 'block'; diff --git a/packetserver/http/templates/dashboard.html b/packetserver/http/templates/dashboard.html index 5d49afd..034c310 100644 --- a/packetserver/http/templates/dashboard.html +++ b/packetserver/http/templates/dashboard.html @@ -101,8 +101,11 @@ credentials: 'include' // sends Basic Auth }); if (resp.ok) { - const data = await resp.json(); - document.getElementById('composeAlert').innerHTML = '
Sent! ID: ' + data.message_id + '
'; + const result = await response.json(); + let msg = 'Message sent!'; + if (result.warning) msg += ` ${result.warning}`; + status.textContent = msg; + document.getElementById('composeAlert').innerHTML = '
' + msg + '
'; setTimeout(() => location.reload(), 1500); } else { const err = await resp.json();