Skip to content

Commit 696ad43

Browse files
committed
feat : setup signup and login page for frontend react
1 parent 39d62b0 commit 696ad43

File tree

8 files changed

+109
-11
lines changed

8 files changed

+109
-11
lines changed
83 Bytes
Binary file not shown.

server/server/asgi.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,18 @@
1010
import os
1111

1212
from django.core.asgi import get_asgi_application
13+
from channels.routing import ProtocolTypeRouter, URLRouter
14+
from channels.auth import AuthMiddlewareStack
15+
from server import routing
16+
1317

1418
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "server.settings")
1519

16-
application = get_asgi_application()
20+
application = ProtocolTypeRouter({
21+
"http": get_asgi_application(),
22+
"websocket": AuthMiddlewareStack(
23+
URLRouter(
24+
routing.websocket_urlpatterns
25+
)
26+
),
27+
})

server/server/settings.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,14 @@
4141
'rest_framework',
4242
'rest_framework_simplejwt',
4343
'corsheaders',
44+
'channels',
4445
"userApp",
4546
]
4647

4748
MIDDLEWARE = [
4849
"django.middleware.security.SecurityMiddleware",
4950
"django.contrib.sessions.middleware.SessionMiddleware",
51+
'corsheaders.middleware.CorsMiddleware',
5052
"django.middleware.common.CommonMiddleware",
5153
"django.middleware.csrf.CsrfViewMiddleware",
5254
"django.contrib.auth.middleware.AuthenticationMiddleware",
@@ -69,7 +71,7 @@
6971
'SLIDING_TOKEN_REFRESH_LIFETIME_LATE_USER': timedelta(days=1),
7072
'SLIDING_TOKEN_LIFETIME_LATE_USER': timedelta(days=30),
7173
}
72-
74+
CORS_ALLOW_ALL_ORIGINS = True
7375
ROOT_URLCONF = "server.urls"
7476

7577
TEMPLATES = [
@@ -119,7 +121,14 @@
119121
"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",
120122
},
121123
]
122-
124+
CHANNEL_LAYERS = {
125+
'default': {
126+
'BACKEND': 'channels_redis.core.RedisChannelLayer',
127+
'CONFIG': {
128+
"hosts": [('127.0.0.1', 6379)],
129+
},
130+
},
131+
}
123132

124133
# Internationalization
125134
# https://docs.djangoproject.com/en/4.2/topics/i18n/

server/userApp/consumers.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import json
2+
from channels.generic.websocket import AsyncWebsocketConsumer
3+
4+
class ChatConsumer(AsyncWebsocketConsumer):
5+
async def connect(self):
6+
self.room_name = self.scope['url_route']['kwargs']['room_name']
7+
self.room_group_name = f'chat_{self.room_name}'
8+
9+
# Join room group
10+
await self.channel_layer.group_add(
11+
self.room_group_name,
12+
self.channel_name
13+
)
14+
15+
await self.accept()
16+
17+
async def disconnect(self, close_code):
18+
# Leave room group
19+
await self.channel_layer.group_discard(
20+
self.room_group_name,
21+
self.channel_name
22+
)
23+
24+
async def receive(self, text_data):
25+
text_data_json = json.loads(text_data)
26+
message = text_data_json['message']
27+
28+
# Send message to room group
29+
await self.channel_layer.group_send(
30+
self.room_group_name,
31+
{
32+
'type': 'chat_message',
33+
'message': message
34+
}
35+
)
36+
37+
async def chat_message(self, event):
38+
message = event['message']
39+
40+
# Send message to WebSocket
41+
await self.send(text_data=json.dumps({
42+
'message': message
43+
}))

server/userApp/models.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,19 @@ class Interest(models.Model):
1313
receiver = models.ForeignKey(User, on_delete=models.CASCADE, related_name='received_interests')
1414
# message = models.TextField(blank=True)
1515
status = models.CharField(max_length=20, choices=[('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected')])
16-
created_at = models.DateTimeField(auto_now_add=True)
16+
created_at = models.DateTimeField(auto_now_add=True)
17+
18+
19+
20+
class Messages(models.Model):
21+
sender = models.ForeignKey(User, on_delete=models.CASCADE, related_name='sent_interests')
22+
receiver = models.ForeignKey(User, on_delete=models.CASCADE, related_name='received_interests')
23+
message = models.CharField(max_length=1000)
24+
date = models.DateTimeField(auto_now_add=True)
25+
26+
class Meta:
27+
ordering = ['date']
28+
verbos_plural_name = "Message"
29+
30+
def __str__(self):
31+
return f"{self.sender} - {self.receiver}"

server/userApp/routing.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from django.urls import path
2+
from . import consumers
3+
4+
websocket_urlpatterns = [
5+
path('ws/chat/<str:room_name>/', consumers.ChatConsumer.as_asgi()),
6+
]

server/userApp/serializers.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from rest_framework import serializers
2-
from .models import User , Interest
2+
from .models import User , Interest, Messages
33

44

55
class UserSerializer(serializers.ModelSerializer):
@@ -31,4 +31,10 @@ class Meta:
3131
def validate(self, data):
3232
if data['sender'] == data['receiver']:
3333
raise serializers.ValidationError("You cannot send interest to yourself.")
34-
return data
34+
return data
35+
36+
37+
class MessageSerializer(serializers.ModelSerializer):
38+
class Meta:
39+
model = Messages
40+
fields = ['id', 'sender','reciever', 'message']

server/userApp/views.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@
22
from rest_framework.decorators import api_view
33
from rest_framework.response import Response
44
from rest_framework.serializers import Serializer
5-
from .serializers import UserSerializer, UserListSerializer , InterestSerializer
5+
from rest_framework import generics, permissions
6+
from .serializers import UserSerializer, UserListSerializer , InterestSerializer, MessageSerializer
67
from rest_framework.views import APIView
78
from rest_framework import status
89
from django.contrib.auth import authenticate
9-
from .models import User, Interest
10+
from .models import User, Interest, Messages
1011
from rest_framework.permissions import IsAuthenticated, AllowAny
1112
from rest_framework_simplejwt.tokens import RefreshToken
1213
@api_view(['GET'])
@@ -122,8 +123,15 @@ def post(self,request):
122123
return Response({"detail": "Interest rejected."})
123124

124125

125-
# 8. if accept inreset
126-
# 9. send message
126+
# 8. send message
127+
class MessageListView(generics.ListAPIView):
128+
serializer_class = MessageSerializer
129+
permission_classes = [permissions.IsAuthenticated]
127130

131+
def get_queryset(self):
132+
user = self.request.user
133+
return Messages.objects.filter(receiver=user)
128134

129-
#10. get all messages
135+
136+
137+
#9. get all messages

0 commit comments

Comments
 (0)