|
19 | 19 |
|
20 | 20 | from .forms import MissionCreateForm |
21 | 21 | from .models import Mission, MissionImage, Tag, Category, ChatRoom |
22 | | -from common.utils import publish_chat_event |
| 22 | +from common.utils import publish_chat_event, redis_client |
23 | 23 | from common.utils import publish_mission_update |
24 | 24 | from common.utils import acquire_lock, release_lock |
| 25 | +from collections import defaultdict |
25 | 26 |
|
26 | 27 |
|
27 | 28 | logger = logging.getLogger(__name__) |
@@ -510,27 +511,43 @@ def chat_room(request: HttpRequest, mission_id: int, room_id: int) -> HttpRespon |
510 | 511 |
|
511 | 512 | @login_required |
512 | 513 | def chat_list(request: HttpRequest) -> HttpResponse: |
513 | | - """내가 참여한 채팅방 목록 (차단된 유저 제외)""" |
| 514 | + """내가 참여한 채팅방을 미션별로 묶어서 보여줌""" |
514 | 515 | rooms = ( |
515 | 516 | ChatRoom.objects |
516 | 517 | .filter(models.Q(user1=request.user) | models.Q(user2=request.user)) |
517 | 518 | .select_related("mission", "mission__author", "user1", "user2") |
518 | 519 | .order_by("-created_at") |
519 | 520 | ) |
520 | | - room_list = [] |
| 521 | + |
| 522 | + mission_groups = defaultdict(list) |
521 | 523 | for room in rooms: |
522 | 524 | other = room.user2 if room.user1 == request.user else room.user1 |
523 | 525 | if _is_blocked_between(request.user, other): |
524 | 526 | continue |
525 | | - room_list.append({ |
| 527 | + # Redis에서 이 방의 마지막 메시지 미리보기 조회 |
| 528 | + last_message = None |
| 529 | + try: |
| 530 | + raw = redis_client.get(f"chat:room:{room.id}:last") |
| 531 | + if raw: |
| 532 | + data = json.loads(raw) |
| 533 | + last_message = data.get("content") or None |
| 534 | + except (json.JSONDecodeError, TypeError): |
| 535 | + pass |
| 536 | + mission_groups[room.mission].append({ |
526 | 537 | "room": room, |
527 | 538 | "other_user": other, |
528 | | - "mission": room.mission, |
| 539 | + "last_message": last_message, |
529 | 540 | }) |
| 541 | + |
| 542 | + grouped_list = [ |
| 543 | + {"mission": mission, "rooms": room_items} |
| 544 | + for mission, room_items in mission_groups.items() |
| 545 | + ] |
| 546 | + |
530 | 547 | return render( |
531 | 548 | request, |
532 | 549 | "chat/list.html", |
533 | | - {"room_list": room_list}, |
| 550 | + {"grouped_list": grouped_list}, |
534 | 551 | ) |
535 | 552 |
|
536 | 553 |
|
|
0 commit comments