المشروع ب: نظام إدارة المهام
الوصف
تطوير API RESTful لنظام إدارة المشاريع والمهام، مما يسمح للفرق بالتعاون، متابعة التقدم، وإدارة وقتهم.
الميزات المطلوبة
1. إدارة المستخدمين
POST /api/auth/register - تسجيل
POST /api/auth/login - تسجيل الدخول (يُرجع JWT)
GET /api/users/me - الملف الشخصي للمستخدم
PUT /api/users/me - تعديل الملف الشخصي
GET /api/users - قائمة المستخدمين (ADMIN/MANAGER)
كيان المستخدم:
- id، البريد الإلكتروني، كلمة المرور، الاسم الأول، الاسم الأخير
- الدور (ADMIN، MANAGER، MEMBER)
- القسم، تاريخ الإنشاء
2. إدارة المشاريع
GET /api/projects - مشاريعي
POST /api/projects - إنشاء مشروع
GET /api/projects/{id} - تفاصيل المشروع
PUT /api/projects/{id} - تعديل المشروع
DELETE /api/projects/{id} - حذف المشروع
POST /api/projects/{id}/members - إضافة عضو
DELETE /api/projects/{id}/members/{userId} - إزالة عضو
كيان المشروع:
- id، الاسم، الوصف
- المالك (المستخدم)
- الأعضاء (ManyToMany المستخدم)
- الحالة (PLANNING، ACTIVE، ON_HOLD، COMPLETED)
- تاريخ البدء، تاريخ الانتهاء، تاريخ الإنشاء
3. إدارة المهام
GET /api/projects/{id}/tasks - مهام المشروع
POST /api/projects/{id}/tasks - إنشاء مهمة
GET /api/tasks/{id} - تفاصيل المهمة
PUT /api/tasks/{id} - تعديل المهمة
DELETE /api/tasks/{id} - حذف المهمة
PUT /api/tasks/{id}/status - تغيير الحالة
PUT /api/tasks/{id}/assign - تعيين المهمة
GET /api/tasks/my-tasks - مهامي
كيان المهمة:
- id، العنوان، الوصف
- المشروع (ManyToOne)
- المكلف (المستخدم)
- الأولوية (LOW، MEDIUM، HIGH، URGENT)
- الحالة (TODO، IN_PROGRESS، IN_REVIEW، DONE)
- تاريخ الاستحقاق، الساعات المقدرة، تاريخ الإنشاء
4. التعليقات والنشاط
GET /api/tasks/{id}/comments - التعليقات
POST /api/tasks/{id}/comments - إضافة تعليق
DELETE /api/comments/{id} - حذف تعليق
GET /api/tasks/{id}/activity - سجل النشاط
كيان التعليق:
- id، المهمة، المؤلف، المحتوى، تاريخ الإنشاء
كيان النشاط:
- id، المهمة، المستخدم، الإجراء، التفاصيل، تاريخ الإنشاء
5. تتبع الوقت
POST /api/tasks/{id}/time-entries - تسجيل الوقت
GET /api/tasks/{id}/time-entries - الوقت على المهمة
GET /api/time-entries/my-entries - وقتي
GET /api/projects/{id}/time-report - تقرير وقت المشروع
كيان تسجيل الوقت:
- id، المهمة، المستخدم، الساعات، الوصف، التاريخ
مخطط قاعدة البيانات
users
├── id (PK)
├── email (UNIQUE)
├── password
├── first_name
├── last_name
├── role
├── department
└── created_at
projects
├── id (PK)
├── name
├── description
├── owner_id (FK)
├── status
├── start_date
├── end_date
└── created_at
project_members
├── project_id (FK)
└── user_id (FK)
tasks
├── id (PK)
├── title
├── description
├── project_id (FK)
├── assignee_id (FK)
├── priority
├── status
├── due_date
├── estimated_hours
└── created_at
comments
├── id (PK)
├── task_id (FK)
├── author_id (FK)
├── content
└── created_at
activities
├── id (PK)
├── task_id (FK)
├── user_id (FK)
├── action
├── details
└── created_at
time_entries
├── id (PK)
├── task_id (FK)
├── user_id (FK)
├── hours
├── description
└── date
قواعد العمل
المشاريع
- فقط المالك أو ADMIN يمكنه حذف مشروع
- MANAGER يمكنه إنشاء مشاريع
- يمكن للعضو رؤية المشاريع التي ينتمي إليها
المهام
- فقط أعضاء المشروع يمكنهم رؤية المهام
- تعيين مهمة ينشئ نشاطًا
- تغيير الحالة ينشئ نشاطًا
انتقالات حالة المهمة
TODO -> IN_PROGRESS -> IN_REVIEW -> DONE
<- (يمكن العودة للخلف)
الأذونات
| الدور | المشاريع | المهام | الأعضاء |
|---|---|---|---|
| ADMIN | CRUD الكل | CRUD الكل | إدارة الكل |
| MANAGER | CRUD الخاصة | CRUD المشاريع | إدارة المشاريع |
| MEMBER | قراءة المعينة | CRUD المعينة | - |
نقاط النهاية المفصلة
المشاريع
POST /api/projects
Authorization: Bearer <token>
Content-Type: application/json
{
"name": "Website Redesign",
"description": "Complete redesign of company website",
"startDate": "2024-02-01",
"endDate": "2024-04-30"
}
Response 201:
{
"id": 1,
"name": "Website Redesign",
"description": "Complete redesign of company website",
"owner": { "id": 1, "firstName": "John", "lastName": "Doe" },
"status": "PLANNING",
"startDate": "2024-02-01",
"endDate": "2024-04-30",
"members": [],
"createdAt": "2024-01-15T10:30:00"
}
المهام
POST /api/projects/1/tasks
Authorization: Bearer <token>
Content-Type: application/json
{
"title": "Design Homepage",
"description": "Create new homepage design mockups",
"priority": "HIGH",
"dueDate": "2024-02-15",
"estimatedHours": 16,
"assigneeId": 2
}
Response 201:
{
"id": 1,
"title": "Design Homepage",
"description": "Create new homepage design mockups",
"project": { "id": 1, "name": "Website Redesign" },
"assignee": { "id": 2, "firstName": "Jane", "lastName": "Smith" },
"priority": "HIGH",
"status": "TODO",
"dueDate": "2024-02-15",
"estimatedHours": 16
}
تتبع الوقت
POST /api/tasks/1/time-entries
Authorization: Bearer <token>
Content-Type: application/json
{
"hours": 4.5,
"description": "Initial design concepts",
"date": "2024-02-01"
}
Response 201:
{
"id": 1,
"task": { "id": 1, "title": "Design Homepage" },
"user": { "id": 2, "firstName": "Jane" },
"hours": 4.5,
"description": "Initial design concepts",
"date": "2024-02-01"
}
تقرير الوقت
GET /api/projects/1/time-report
Authorization: Bearer <token>
Response 200:
{
"project": { "id": 1, "name": "Website Redesign" },
"totalHours": 45.5,
"estimatedHours": 120,
"byUser": [
{ "user": "Jane Smith", "hours": 28.5 },
{ "user": "Bob Wilson", "hours": 17.0 }
],
"byTask": [
{ "task": "Design Homepage", "logged": 16, "estimated": 16 },
{ "task": "Implement Header", "logged": 12.5, "estimated": 24 }
]
}
الاختبارات المطلوبة
اختبارات وحدات
- ProjectService: CRUD، إدارة الأعضاء
- TaskService: CRUD، انتقالات الحالة
- TimeEntryService: التسجيل، الحسابات
اختبارات تكامل
- ProjectController: جميع نقاط النهاية
- TaskController: سير عمل المهمة
- الأمان: الوصول القائم على الدور
نقاط إضافية
| الميزة | النقاط |
|---|---|
| إشعارات WebSocket | +5 |
| نقطة بيانات لوحة Kanban | +3 |
| إشعارات البريد الإلكتروني (محاكاة) | +3 |
| مهام متكررة | +3 |
| تصدير تقرير PDF | +3 |
| لوحة إحصائيات | +5 |
تقدير الوقت
| المهمة | الساعات |
|---|---|
| إعداد المشروع وقاعدة البيانات | 2 |
| الكيانات والمستودعات | 5 |
| خدمات الأعمال | 8 |
| وحدات التحكم REST | 5 |
| الأمان والأذونات | 5 |
| الاختبارات | 6 |
| التوثيق | 2 |
| النقاط الإضافية | 4-8 |
| الإجمالي | 33-41 |