Lightweight containerized prosody tooling + moved auth scripts + xmpp reconnect/auth stabilization

This commit is contained in:
2026-03-05 02:18:12 +00:00
parent 0718a06c19
commit 2140c5facf
69 changed files with 3767 additions and 144 deletions

View File

@@ -391,6 +391,85 @@ class Message(models.Model):
]
class ConversationEvent(models.Model):
EVENT_TYPE_CHOICES = (
("message_created", "Message Created"),
("message_edited", "Message Edited"),
("message_deleted", "Message Deleted"),
("reaction_added", "Reaction Added"),
("reaction_removed", "Reaction Removed"),
("read_receipt", "Read Receipt"),
("typing_started", "Typing Started"),
("typing_stopped", "Typing Stopped"),
("participant_added", "Participant Added"),
("participant_removed", "Participant Removed"),
("delivery_receipt", "Delivery Receipt"),
)
DIRECTION_CHOICES = (
("in", "Inbound"),
("out", "Outbound"),
("system", "System"),
)
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
user = models.ForeignKey(User, on_delete=models.CASCADE)
session = models.ForeignKey(ChatSession, on_delete=models.CASCADE)
ts = models.BigIntegerField(
db_index=True,
help_text="Event timestamp (unix ms).",
)
event_type = models.CharField(max_length=64, choices=EVENT_TYPE_CHOICES)
direction = models.CharField(max_length=16, choices=DIRECTION_CHOICES)
actor_identifier = models.CharField(max_length=255, blank=True, default="")
origin_transport = models.CharField(
max_length=32, blank=True, default="", choices=CHANNEL_SERVICE_CHOICES
)
origin_message_id = models.CharField(max_length=255, blank=True, default="")
origin_chat_id = models.CharField(max_length=255, blank=True, default="")
payload = models.JSONField(default=dict, blank=True)
raw_payload = models.JSONField(default=dict, blank=True)
trace_id = models.CharField(max_length=64, blank=True, default="")
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ["ts", "created_at"]
indexes = [
models.Index(fields=["user", "session", "ts"]),
models.Index(fields=["origin_transport", "origin_message_id"]),
models.Index(fields=["trace_id"]),
models.Index(fields=["event_type", "created_at"]),
]
class AdapterHealthEvent(models.Model):
STATUS_CHOICES = (
("ok", "OK"),
("degraded", "Degraded"),
("down", "Down"),
("recovering", "Recovering"),
)
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
service = models.CharField(max_length=32, choices=SERVICE_CHOICES)
status = models.CharField(max_length=32, choices=STATUS_CHOICES)
reason = models.TextField(blank=True, default="")
retry_meta = models.JSONField(default=dict, blank=True)
ts = models.BigIntegerField(
db_index=True,
help_text="Health transition timestamp (unix ms).",
)
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ["-ts", "-created_at"]
indexes = [
models.Index(fields=["service", "ts"]),
models.Index(fields=["status", "created_at"]),
]
class Group(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
user = models.ForeignKey(User, on_delete=models.CASCADE)