emile 7 months ago
parent 24d4d50753
commit 1028b6c1e1

BIN
.DS_Store vendored

Binary file not shown.

BIN
osinaweb/.DS_Store vendored

Binary file not shown.

Binary file not shown.

@ -59,6 +59,7 @@ class OsitcomVisitor(WebsocketConsumer):
class Osichat(WebsocketConsumer): class Osichat(WebsocketConsumer):
def connect(self): def connect(self):
self.user = self.scope["user"]
async_to_sync(self.channel_layer.group_add)( async_to_sync(self.channel_layer.group_add)(
'osichat', self.channel_name 'osichat', self.channel_name
) )
@ -75,7 +76,6 @@ class Osichat(WebsocketConsumer):
if event_type == 'set_client_type': if event_type == 'set_client_type':
self.client_type = data.get('client_type') self.client_type = data.get('client_type')
self.user_id = data.get('user_id')
event = { event = {
'type': 'get_chats_handler', 'type': 'get_chats_handler',
} }
@ -112,10 +112,8 @@ class Osichat(WebsocketConsumer):
default=F('last_update'), default=F('last_update'),
output_field=DateTimeField(),)).filter(chatroomguest__isnull=False).order_by('-order_key') output_field=DateTimeField(),)).filter(chatroomguest__isnull=False).order_by('-order_key')
user = get_object_or_404(User, id=self.user_id)
for room in chat_rooms: for room in chat_rooms:
room.number_of_unread = room.unread_messages(user) room.number_of_unread = room.unread_messages(self.user)
context = { context = {
'chat_rooms': chat_rooms, 'chat_rooms': chat_rooms,
} }
@ -125,7 +123,7 @@ class Osichat(WebsocketConsumer):
for chat_room in chat_rooms: for chat_room in chat_rooms:
last_message = ChatMessage.objects.filter(room=chat_room).last() last_message = ChatMessage.objects.filter(room=chat_room).last()
room_data = model_to_dict(chat_room) room_data = model_to_dict(chat_room)
room_data['number_of_unread'] = chat_room.unread_messages(user) room_data['number_of_unread'] = chat_room.unread_messages(self.user)
if last_message: if last_message:
room_data['last_message'] = model_to_dict(last_message) room_data['last_message'] = model_to_dict(last_message)
else: else:
@ -158,8 +156,7 @@ class Osichat(WebsocketConsumer):
def new_chat_update_handler(self, event): def new_chat_update_handler(self, event):
chat_room = get_object_or_404(ChatRoom, id=event['chatroom_id']) chat_room = get_object_or_404(ChatRoom, id=event['chatroom_id'])
user = get_object_or_404(User, id=self.user_id) number_of_unread = ChatMessage.objects.filter(room=chat_room).exclude(member=self.user).exclude(chatmessageseen__member=self.user).count()
number_of_unread = ChatMessage.objects.filter(room=chat_room).exclude(member=user).exclude(chatmessageseen__member=user).count()
last_message = ChatMessage.objects.filter(room=chat_room).last() last_message = ChatMessage.objects.filter(room=chat_room).last()
context = { context = {
@ -189,18 +186,16 @@ class Osichat(WebsocketConsumer):
def get_dms_handler(self, event): def get_dms_handler(self, event):
if self.scope["user"].is_authenticated:
chat_rooms = ChatRoom.objects.annotate(last_update=Max('chatmessage__date_sent'),order_key=Case( chat_rooms = ChatRoom.objects.annotate(last_update=Max('chatmessage__date_sent'),order_key=Case(
When(last_update__isnull=True, then=F('date_created')), When(last_update__isnull=True, then=F('date_created')),
default=F('last_update'), default=F('last_update'),
output_field=DateTimeField(),)).filter(chatroomguest__isnull=True, chatmember__member=self.scope["user"]).order_by('-order_key') output_field=DateTimeField(),)).filter(chatroomguest__isnull=True, chatmember__member=self.user).order_by('-order_key')
else:
chat_rooms = None
context = { context = {
'chat_rooms': chat_rooms, 'chat_rooms': chat_rooms,
} }
if self.client_type == 'mobile_admin': if self.client_type == 'mobile_admin':
chat_rooms_data = [] chat_rooms_data = []
if chat_rooms:
for chat_room in chat_rooms: for chat_room in chat_rooms:
last_message = ChatMessage.objects.filter(room=chat_room).last() last_message = ChatMessage.objects.filter(room=chat_room).last()
chat_room_data = { chat_room_data = {
@ -208,7 +203,7 @@ class Osichat(WebsocketConsumer):
'name': chat_room.name, 'name': chat_room.name,
'last_update': chat_room.last_updated, 'last_update': chat_room.last_updated,
'date_created': chat_room.date_created, 'date_created': chat_room.date_created,
'unread_messages': chat_room.unread_messages(self.scope["user"]), 'unread_messages': chat_room.unread_messages(self.user),
'last_message': model_to_dict(last_message) if last_message else None 'last_message': model_to_dict(last_message) if last_message else None
} }
members = chat_room.chatmember_set.all() members = chat_room.chatmember_set.all()

@ -1,5 +1,4 @@
{% load static %} {% load static %}
<p id="userId" class="hidden">{{request.user.id}}</p>
<div id="osichatWidget" class="hidden fixed bg-black bg-opacity-50 inset-0 z-50 h-[100vh]"> <div id="osichatWidget" class="hidden fixed bg-black bg-opacity-50 inset-0 z-50 h-[100vh]">
<div <div
class="w-[950px] min-h-[500px] h-[80%] bg-white rounded-md border border-gray-200 shadow-xl z-20 right-9 bottom-24 grid grid-cols-3 fixed"> class="w-[950px] min-h-[500px] h-[80%] bg-white rounded-md border border-gray-200 shadow-xl z-20 right-9 bottom-24 grid grid-cols-3 fixed">

@ -6,25 +6,56 @@ It exposes the ASGI callable as a module-level variable named ``application``.
For more information on this file, see For more information on this file, see
https://docs.djangoproject.com/en/4.1/howto/deployment/asgi/ https://docs.djangoproject.com/en/4.1/howto/deployment/asgi/
""" """
import os import os
import jwt
from django.core.asgi import get_asgi_application from django.core.asgi import get_asgi_application
from django.conf import settings
from django.contrib.auth.models import User
from django.contrib.auth.models import AnonymousUser
from channels.routing import ProtocolTypeRouter, URLRouter from channels.routing import ProtocolTypeRouter, URLRouter
from channels.security.websocket import AllowedHostsOriginValidator
from channels.auth import AuthMiddlewareStack from channels.auth import AuthMiddlewareStack
from channels.security.websocket import AllowedHostsOriginValidator
from channels.routing import ProtocolTypeRouter
from osinaweb.routing import websocket_urlpatterns from osinaweb.routing import websocket_urlpatterns
from django.core.exceptions import ObjectDoesNotExist
from urllib.parse import parse_qs
from osinacore.api.utils import *
from channels.db import database_sync_to_async
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'osinaweb.settings') os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'osinaweb.settings')
django_asgi_app = get_asgi_application() django_asgi_app = get_asgi_application()
class JWTAuthMiddleware:
"""Middleware to extract JWT token from the URL query parameters and set the user in the scope."""
def __init__(self, inner):
self.inner = inner
async def __call__(self, scope, receive, send):
# Extract the token from the URL query parameters
query_string = scope['query_string'].decode() # Decode the query string
query_params = parse_qs(query_string) # Parse the query string
token = query_params.get('token', [None])[0]
if token:
try:
token_data = verify(token)
user = await database_sync_to_async(User.objects.get)(id=token_data['userid'])
scope['user'] = user
except (jwt.ExpiredSignatureError, jwt.DecodeError, ObjectDoesNotExist):
scope['user'] = AnonymousUser() # Set user to AnonymousUser if there's an error
else:
# No JWT token provided, fallback to default authentication
return await AuthMiddlewareStack(self.inner)(scope, receive, send)
return await self.inner(scope, receive, send)
application = ProtocolTypeRouter({ application = ProtocolTypeRouter({
"http": django_asgi_app, "http": django_asgi_app,
"websocket": AllowedHostsOriginValidator( "websocket": AllowedHostsOriginValidator(
JWTAuthMiddleware(
AuthMiddlewareStack(URLRouter(websocket_urlpatterns)) AuthMiddlewareStack(URLRouter(websocket_urlpatterns))
)
), ),
}) })

Binary file not shown.

Binary file not shown.

@ -1,7 +1,6 @@
let admin_chat_ws_scheme = window.location.protocol === "https:" ? "wss" : "ws"; let admin_chat_ws_scheme = window.location.protocol === "https:" ? "wss" : "ws";
let protocol = window.location.protocol === "https:" ? "https" : "http"; let protocol = window.location.protocol === "https:" ? "https" : "http";
let admin_chat_domain = "osina.ositcom.com"; let admin_chat_domain = "osina.ositcom.com";
let userId = document.getElementById('userId').textContent.trim();
let osichatadminroomSocket = null; let osichatadminroomSocket = null;
let currentChatId = null; let currentChatId = null;
let whereAmI = null; let whereAmI = null;
@ -39,7 +38,6 @@ function initializeOsichat(){
osichatroomsSocket.send(JSON.stringify({ osichatroomsSocket.send(JSON.stringify({
'event_type': 'set_client_type', 'event_type': 'set_client_type',
'client_type': 'website_admin', 'client_type': 'website_admin',
'user_id': userId,
'whereAmI': whereAmI === 'Visitors' ? 'Visitors' : 'Chats' // Default to 'Chats' if not 'Visitors' 'whereAmI': whereAmI === 'Visitors' ? 'Visitors' : 'Chats' // Default to 'Chats' if not 'Visitors'
})); }));
}; };

Loading…
Cancel
Save