Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ coverage.xml

# Django stuff:
*.log
*.log.zip
local_settings.py
*.sqlite3
*.sqlite3-journal
Expand Down
20 changes: 10 additions & 10 deletions chats/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@

class DirectChatListSerializer(serializers.ModelSerializer):
last_message = serializers.SerializerMethodField()
users = serializers.SerializerMethodField(read_only=True)
opponent = serializers.SerializerMethodField()

@classmethod
def get_users(cls, chat: ProjectChat):
return UserListSerializer(chat.get_users(), many=True).data
def get_opponent(self, chat: DirectChat):
user = self.context.get("opponent")
return UserDetailSerializer(user).data

@classmethod
def get_last_message(cls, chat: DirectChat):
Expand All @@ -26,23 +26,23 @@ class Meta:
model = DirectChat
fields = [
"id",
"users",
"opponent",
"last_message",
]


class DirectChatDetailSerializer(serializers.ModelSerializer):
users = serializers.SerializerMethodField(read_only=True)
opponent = serializers.SerializerMethodField()

@classmethod
def get_users(cls, chat: ProjectChat):
return UserListSerializer(chat.get_users(), many=True).data
def get_opponent(self, chat: DirectChat):
user = self.context.get("opponent")
return UserDetailSerializer(user).data

class Meta:
model = DirectChat
fields = [
"id",
"users",
"opponent",
]


Expand Down
42 changes: 34 additions & 8 deletions chats/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,31 @@ def get_queryset(self):
user = self.request.user
return user.direct_chats.all()

def get(self, request, *args, **kwargs):
chats = self.get_queryset()
serialized_chats = []
for chat in chats:
# fixme: move to function like get_user() and get_opponent()
chat_id = chat.id
user1_id, user2_id = map(int, chat_id.split("_"))

try:
user1 = User.objects.get(pk=user1_id)
user2 = User.objects.get(pk=user2_id)
except User.DoesNotExist:
# fixme: show deleted profile
continue

if user1 == request.user:
opponent = user2
else: # fixme: if user1 == user2
opponent = user1

context = {"opponent": opponent}
serialized_chat = DirectChatListSerializer(chat, context=context).data
serialized_chats.append(serialized_chat)
return Response(serialized_chats, status=status.HTTP_200_OK)


class ProjectChatList(ListAPIView):
serializer_class = ProjectChatListSerializer
Expand Down Expand Up @@ -70,16 +95,17 @@ def get(self, request, *args, **kwargs) -> Response:
user1 = User.objects.get(pk=user1_id)
user2 = User.objects.get(pk=user2_id)

data = DirectChatDetailSerializer(DirectChat.get_chat(user1, user2)).data

if user1 == request.user:
# may be is better to use serializer or return dict -
# {"first_name": user2.first_name, "last_name": user2.last_name}
data["name"] = f"{user2.first_name} {user2.last_name}"
data["image_address"] = user2.avatar
opponent = user2
else:
data["name"] = f"{user1.first_name} {user1.last_name}"
data["image_address"] = user1.avatar
opponent = user1
context = {"opponent": opponent}
data = DirectChatDetailSerializer(
DirectChat.get_chat(user1, user2), context=context
).data

data["name"] = f"{opponent.first_name} {opponent.last_name}"
data["image_address"] = opponent.avatar

return Response(
status=status.HTTP_200_OK,
Expand Down
35 changes: 35 additions & 0 deletions core/log/middleware.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
from loguru import logger
from django.conf import settings
import logging
from core.log.utils import InterceptHandler


class CustomLoguruMiddleware:
def __init__(self, get_response):
self.get_response = get_response
logging.basicConfig(handlers=[InterceptHandler()], level=0, force=True)

if settings.DEBUG:
logger.add(
f"{settings.BASE_DIR}/log/debug.log",
level="DEBUG",
**settings.LOGURU_LOGGING,
)
logger.add(
f"{settings.BASE_DIR}/log/info.log",
level="INFO",
**settings.LOGURU_LOGGING,
)
logger.add(
f"{settings.BASE_DIR}/log/warning.log",
level="WARNING",
**settings.LOGURU_LOGGING,
)

def __call__(self, request):
response = self.get_response(request)
logger.info(f"{request.method} {request.get_full_path()}")
return response

def process_exception(self, request, exception):
logger.warning(f"{exception} http_path={request.get_full_path()}")
18 changes: 18 additions & 0 deletions core/log/utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import logging
import sys
from loguru import logger


class InterceptHandler(logging.Handler):
def emit(self, record):
try:
level = logger.level(record.levelname).name
except ValueError:
level = record.levelno

frame, depth = sys._getframe(6), 6
while frame and frame.f_code.co_filename == logging.__file__:
frame = frame.f_back
depth += 1

logger.opt(depth=depth, exception=record.exc_info).log(level, record.getMessage())
67 changes: 54 additions & 13 deletions docker-compose.dev-ci.yml
Original file line number Diff line number Diff line change
@@ -1,19 +1,60 @@
version: "3.4"
version: '3.9'

services:
server:
ports:
- "8000:8000"
web:
container_name: web
build:
context: .
dockerfile: Dockerfile
dockerfile: ./Dockerfile
image: ghcr.io/procollab-github/api:latest
restart: always
volumes:
- log:/procollab/log
env_file:
- .env
restart: always
networks:
template-network:

networks:
template-network:

environment:
HOST: 0.0.0.0
grafana:
container_name: grafana
image: grafana/grafana:latest
ports:
- "3000"
volumes:
- grafana-data:/var/lib/grafana
- grafana-configs:/etc/grafana
environment:
- GF_SERVER_ROOT_URL=%(protocol)s://%(domain)s:%(http_port)s/grafana
- GF_SERVER_SERVE_FROM_SUB_PATH=true
prometheus:
container_name: prometheus
image: prom/prometheus:v2.36.0
ports:
- "9090"
volumes:
- prom-data:/prometheus
- ./prometheus:/etc/prometheus
node-exporter:
container_name: node-exporter
image: prom/node-exporter:v1.3.1
ports:
- "9100"
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.mount-points-exclude'
- '^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)'
nginx:
container_name: nginx
build: ./nginx
ports:
- 8000:80
volumes:
db-volume:
grafana-data:
grafana-configs:
prom-data:
prom-configs:
log:
67 changes: 55 additions & 12 deletions docker-compose.prod-ci.yml
Original file line number Diff line number Diff line change
@@ -1,17 +1,60 @@
version: "3.4"
version: '3.9'

services:
server:
ports:
- "8000:8000"
web:
container_name: web
build:
context: .
dockerfile: ./Dockerfile
image: ghcr.io/procollab-github/api:latest
restart: always
volumes:
- log:/procollab/log
env_file:
- .env
restart: always
networks:
template-network:

networks:
template-network:

environment:
HOST: 0.0.0.0
grafana:
container_name: grafana
image: grafana/grafana:latest
ports:
- "3000"
volumes:
- grafana-data:/var/lib/grafana
- grafana-configs:/etc/grafana
environment:
- GF_SERVER_ROOT_URL=%(protocol)s://%(domain)s:%(http_port)s/grafana
- GF_SERVER_SERVE_FROM_SUB_PATH=true
prometheus:
container_name: prometheus
image: prom/prometheus:v2.36.0
ports:
- "9090"
volumes:
- prom-data:/prometheus
- ./prometheus:/etc/prometheus
node-exporter:
container_name: node-exporter
image: prom/node-exporter:v1.3.1
ports:
- "9100"
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.mount-points-exclude'
- '^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)'
nginx:
container_name: nginx
build: ./nginx
ports:
- 8000:80
volumes:
db-volume:
grafana-data:
grafana-configs:
prom-data:
prom-configs:
log:
51 changes: 48 additions & 3 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,59 @@ version: '3.9'

services:
web:
container_name: web
build:
context: .
dockerfile: ./Dockerfile
ports:
- "8000:8000"
image: ghcr.io/procollab-github/api:latest
restart: always
volumes:
- log:/procollab/log
env_file:
- .env
environment:
HOST: 0.0.0.0
HOST: 0.0.0.0
grafana:
container_name: grafana
image: grafana/grafana:latest
ports:
- "3000"
volumes:
- grafana-data:/var/lib/grafana
- grafana-configs:/etc/grafana
environment:
- GF_SERVER_ROOT_URL=%(protocol)s://%(domain)s:%(http_port)s/grafana
- GF_SERVER_SERVE_FROM_SUB_PATH=true
prometheus:
container_name: prometheus
image: prom/prometheus:v2.36.0
ports:
- "9090"
volumes:
- prom-data:/prometheus
- ./prometheus:/etc/prometheus
node-exporter:
container_name: node-exporter
image: prom/node-exporter:v1.3.1
ports:
- "9100"
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.mount-points-exclude'
- '^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)'
nginx:
container_name: nginx
build: ./nginx
ports:
- 8000:80
volumes:
grafana-data:
grafana-configs:
prom-data:
prom-configs:
log:
4 changes: 4 additions & 0 deletions nginx/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
FROM nginx:1.21-alpine

RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d
Loading