feat: Initial commit - Task Reporter incident response system

Complete implementation of the production line incident response system (生產線異常即時反應系統) including:

Backend (FastAPI):
- User authentication with AD integration and session management
- Chat room management (create, list, update, members, roles)
- Real-time messaging via WebSocket (typing indicators, reactions)
- File storage with MinIO (upload, download, image preview)

Frontend (React + Vite):
- Authentication flow with token management
- Room list with filtering, search, and pagination
- Real-time chat interface with WebSocket
- File upload with drag-and-drop and image preview
- Member management and room settings
- Breadcrumb navigation
- 53 unit tests (Vitest)

Specifications:
- authentication: AD auth, sessions, JWT tokens
- chat-room: rooms, members, templates
- realtime-messaging: WebSocket, messages, reactions
- file-storage: MinIO integration, file management
- frontend-core: React SPA structure

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
egg
2025-12-01 17:42:52 +08:00
commit c8966477b9
135 changed files with 23269 additions and 0 deletions

169
test_chat_room.py Normal file
View File

@@ -0,0 +1,169 @@
#!/usr/bin/env python3
"""Test script for chat room management API"""
import json
import uuid
from datetime import datetime
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from app.core.database import Base
from app.modules.auth.models import UserSession
from app.modules.chat_room.models import IncidentRoom, RoomMember, RoomTemplate, RoomStatus, MemberRole
from app.modules.chat_room.services.room_service import room_service
from app.modules.chat_room.services.membership_service import membership_service
from app.modules.chat_room.services.template_service import template_service
from app.modules.chat_room.schemas import CreateRoomRequest, IncidentType, SeverityLevel
# Setup test database
engine = create_engine("sqlite:///./test_chat_room.db")
Base.metadata.create_all(bind=engine)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
def test_room_management():
"""Test the core room management functionality"""
db = SessionLocal()
print("=" * 60)
print("Testing Chat Room Management System")
print("=" * 60)
try:
# Test users
admin_email = "ymirliu@panjit.com.tw"
user1_email = "john.doe@panjit.com.tw"
user2_email = "jane.smith@panjit.com.tw"
# 1. Test admin check
print("\n1. Testing admin identification:")
is_admin = membership_service.is_system_admin(admin_email)
print(f" - Is {admin_email} admin? {is_admin}")
is_admin = membership_service.is_system_admin(user1_email)
print(f" - Is {user1_email} admin? {is_admin}")
# 2. Create a room
print("\n2. Creating a new incident room:")
room_data = CreateRoomRequest(
title="Equipment Failure in Line A",
incident_type=IncidentType.EQUIPMENT_FAILURE,
severity=SeverityLevel.HIGH,
location="Production Floor A",
description="Main conveyor belt stopped working"
)
room = room_service.create_room(db, user1_email, room_data)
print(f" - Room created: {room.title}")
print(f" - Room ID: {room.room_id}")
print(f" - Created by: {room.created_by}")
print(f" - Status: {room.status}")
# 3. Check initial membership
print("\n3. Checking initial membership:")
role = membership_service.get_user_role_in_room(db, room.room_id, user1_email)
print(f" - {user1_email} role: {role}")
# 4. Add members
print("\n4. Adding members to the room:")
member2 = membership_service.add_member(
db, room.room_id, user2_email, MemberRole.EDITOR, user1_email
)
print(f" - Added {user2_email} as {member2.role}")
member3 = membership_service.add_member(
db, room.room_id, admin_email, MemberRole.VIEWER, user1_email
)
print(f" - Added {admin_email} as {member3.role}")
# 5. List room members
print("\n5. Listing all room members:")
members = membership_service.get_room_members(db, room.room_id)
for member in members:
print(f" - {member.user_id}: {member.role}")
# 6. Test ownership transfer
print("\n6. Testing ownership transfer:")
print(f" - Current owner: {user1_email}")
print(f" - Transferring to: {user2_email}")
success = membership_service.transfer_ownership(
db, room.room_id, user1_email, user2_email
)
if success:
print(" - Transfer successful!")
# Check new roles
role1 = membership_service.get_user_role_in_room(db, room.room_id, user1_email)
role2 = membership_service.get_user_role_in_room(db, room.room_id, user2_email)
print(f" - {user1_email} new role: {role1}")
print(f" - {user2_email} new role: {role2}")
# Check audit fields (refetch room)
db.refresh(room)
print(f" - Transfer recorded at: {room.ownership_transferred_at}")
print(f" - Transfer by: {room.ownership_transferred_by}")
# 7. Test admin override
print("\n7. Testing admin override capabilities:")
# Admin can update room even if only a viewer
from app.modules.chat_room.schemas import UpdateRoomRequest
update_data = UpdateRoomRequest(
severity=SeverityLevel.CRITICAL,
status=RoomStatus.RESOLVED,
resolution_notes="Admin resolved the issue"
)
# Simulate admin update (in real API, this would be checked in dependencies)
is_admin = membership_service.is_system_admin(admin_email)
if is_admin:
print(f" - Admin {admin_email} updating room (has override)")
room = room_service.update_room(db, room.room_id, update_data)
print(f" - New severity: {room.severity}")
print(f" - New status: {room.status}")
print(f" - Resolution notes: {room.resolution_notes}")
# 8. Test room templates
print("\n8. Testing room templates:")
templates = template_service.get_templates(db)
print(f" - Found {len(templates)} templates")
for template in templates:
print(f" * {template.name}: {template.incident_type}")
if templates:
# Create room from template
print("\n9. Creating room from template:")
template = templates[0]
room2 = template_service.create_room_from_template(
db,
template.template_id,
user1_email,
title="New Equipment Issue",
location="Line B",
description="Using template for quick setup"
)
print(f" - Room created from template: {room2.title}")
print(f" - Incident type: {room2.incident_type}")
print(f" - Severity: {room2.severity}")
# Check default members
members = membership_service.get_room_members(db, room2.room_id)
print(f" - Auto-added {len(members)} members from template")
# 10. Test user's room listing
print("\n10. Testing user's room listing:")
from app.modules.chat_room.schemas import RoomFilterParams
filters = RoomFilterParams(limit=10, offset=0)
# User1's rooms
rooms, total = room_service.list_user_rooms(db, user1_email, filters, False)
print(f" - {user1_email} has access to {total} room(s)")
# Admin's rooms (with admin flag)
rooms, total = room_service.list_user_rooms(db, admin_email, filters, True)
print(f" - Admin {admin_email} can see {total} room(s)")
print("\n" + "=" * 60)
print("All tests completed successfully!")
print("=" * 60)
except Exception as e:
print(f"\nError during testing: {e}")
import traceback
traceback.print_exc()
finally:
db.close()
if __name__ == "__main__":
test_room_management()