ΠΡΠΎΠ΅ΠΊΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ Π²ΡΡΠΎΠΊΠΎΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π·Π°Π΄Π°ΡΠ°ΠΌΠΈ, ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌΠΈ, ΠΏΡΠΎΠ΅ΠΊΡΠ°ΠΌΠΈ ΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡΠΌΠΈ Ρ Π²Π½Π΅ΡΠ½ΠΈΠΌΠΈ ΡΠΈΡΡΠ΅ΠΌΠ°ΠΌΠΈ. ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΠΊΠ»ΡΡΠ°ΡΡ:
- Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°ΡΠ°ΠΌΠΈ ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌΠΈ.
- ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ Google Calendar Π΄Π»Ρ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΠ·Π²ΠΎΠ½ΠΎΠ².
- Π‘ΠΈΡΡΠ΅ΠΌΠ° Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΠΉ Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡΠΌΠΈ.
- ΠΠ-ΠΏΠΎΠΌΠΎΡΠ½ΠΈΠΊ Π΄Π»Ρ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° Π·Π°Π΄Π°Ρ ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ².
- Π’ΡΠ΅ΠΊΠΊΠΈΠ½Π³ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π½Π° Π·Π°Π΄Π°ΡΡ, ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΡΠ°Π²ΠΈΡΡ Π·Π°Π΄Π°ΡΠΈ Π½Π° ΠΏΠ°ΡΠ·Ρ.
ΠΡΠΊΠ΅Π½Π΄:
- ΠΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠ½Π°Ρ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° (Go ΠΈ C#).
- Redis β Π±ΡΠΎΠΊΠ΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π΄Π»Ρ ΠΎΠ±ΠΌΠ΅Π½Π° ΡΠΎΠ±ΡΡΠΈΡΠΌΠΈ.
- RESTful API Π΄Π»Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΠΎΠ½ΡΠ΅Π½Π΄ΠΎΠΌ ΠΈ Π±ΡΠΊΠ΅Π½Π΄ΠΎΠΌ.
Π€ΡΠΎΠ½ΡΠ΅Π½Π΄:
- SPA (React/Vue/Angular).
- ΠΠ·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ API Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π·Π°Π΄Π°ΡΠ°ΠΌΠΈ, ΠΏΡΠΎΠ΅ΠΊΡΠ°ΠΌΠΈ, ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌΠΈ ΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠ΅ΠΉ Ρ Google Calendar.
-
ΠΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡ "ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ" (C#):
- Π Π΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ ΠΈ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ.
- Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΡΠΈΠ»Π΅ΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ (Π°Π²Π°ΡΠ°Ρ, ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ).
- Π‘Π²ΡΠ·Ρ Ρ Google Calendar.
-
ΠΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡ "ΠΡΠΎΠ΅ΠΊΡΡ ΠΈ Π·Π°Π΄Π°ΡΠΈ" (Go):
- CRUD ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π΄Π»Ρ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² ΠΈ Π·Π°Π΄Π°Ρ.
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΡΠ°ΡΡΡΠΎΠ² Π·Π°Π΄Π°Ρ, ΡΡΠ΅ΠΊΠΈΠ½Π³ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΈ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ.
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΡΠ°ΡΡΡΠ° "Π½Π° ΠΏΠ°ΡΠ·Π΅" (on hold).
-
ΠΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡ "ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ Google Calendar" (C#):
- Π‘ΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ Ρ ΠΊΠ°Π»Π΅Π½Π΄Π°ΡΠ΅ΠΌ.
- ΠΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΎΠ·Π²ΠΎΠ½ΠΎΠ² Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ.
-
ΠΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡ "Π£Π²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ ΠΈ ΠΠ-ΠΏΠΎΠΌΠΎΡΠ½ΠΈΠΊ" (Go):
- ΠΡΠΏΡΠ°Π²ΠΊΠ° ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΠΎ Π²Π°ΠΆΠ½ΡΡ Π·Π°Π΄Π°ΡΠ°Ρ .
- Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΠΈ ΠΏΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°ΠΌ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½ΡΡ .
-
ΠΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡ "ΠΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΡ" (C#):
- Π‘ΠΈΡΡΠ΅ΠΌΠ° Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΠΉ Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡΠΌΠΈ.
- Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΌΠΈ Π°ΡΠΈΠ²ΠΊΠ°ΠΌΠΈ.
id
(UUID) β ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ.name
(string) β ΠΈΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.email
(string) β ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½Π°Ρ ΠΏΠΎΡΡΠ°.password_hash
(string) β Ρ ΡΡ ΠΏΠ°ΡΠΎΠ»Ρ.avatar_url
(string) β URL Π°Π²Π°ΡΠ°ΡΠ° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.google_calendar_token
(string) β ΡΠΎΠΊΠ΅Π½ Π΄Π»Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ Ρ Google Calendar.created_at
(timestamp).updated_at
(timestamp).
id
(UUID) β ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°.name
(string) β Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ°.description
(text) β ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ°.created_by
(UUID, referencesusers
) β Π°Π²ΡΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°.created_at
(timestamp).updated_at
(timestamp).
id
(UUID) β ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π·Π°Π΄Π°ΡΠΈ.project_id
(UUID, referencesprojects
) β ΠΏΡΠΎΠ΅ΠΊΡ, ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ Π·Π°Π΄Π°ΡΠ°.title
(string) β Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Π·Π°Π΄Π°ΡΠΈ.description
(text) β ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ.assigned_to
(UUID, referencesusers
) β ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΠΉ Π½Π° Π·Π°Π΄Π°ΡΡ.status
(string: "open", "in progress", "completed", "on hold") β ΡΡΠ°ΡΡΡ Π·Π°Π΄Π°ΡΠΈ.priority
(string: "minor", "major", "critical", "blocker") β ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ Π·Π°Π΄Π°ΡΠΈ.due_date
(timestamp) β ΡΡΠΎΠΊ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π°Π΄Π°ΡΠΈ.time_spent
(integer) β Π·Π°ΡΡΠ°ΡΠ΅Π½Π½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Π² ΠΌΠΈΠ½ΡΡΠ°Ρ .comments
(JSONB) β ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ (Π°Π²ΡΠΎΡ, ΡΠ΅ΠΊΡΡ, timestamp).created_at
(timestamp).updated_at
(timestamp).
id
(UUID) β ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΡ.user_id
(UUID, referencesusers
) β ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΠΏΠΎΠ»ΡΡΠΈΠ²ΡΠΈΠΉ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΠ΅.achievement_type
(string) β ΡΠΈΠΏ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΡ.image_url
(string) β URL ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΡ.created_at
(timestamp).
id
(UUID) β ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΡΠΎΠ±ΡΡΠΈΡ.task_id
(UUID, referencestasks
) β Π·Π°Π΄Π°ΡΠ°, ΡΠ²ΡΠ·Π°Π½Π½Π°Ρ Ρ ΡΠΎΠ±ΡΡΠΈΠ΅ΠΌ.event_start
(timestamp) β Π²ΡΠ΅ΠΌΡ Π½Π°ΡΠ°Π»Π° ΡΠΎΠ±ΡΡΠΈΡ.event_end
(timestamp) β Π²ΡΠ΅ΠΌΡ ΠΎΠΊΠΎΠ½ΡΠ°Π½ΠΈΡ ΡΠΎΠ±ΡΡΠΈΡ.event_url
(string) - ΡΡΡΠ»ΠΊΠ° Π½Π° ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΠΌΠΎΠ΅ ΡΠΎΠ±ΡΡΠΈΠ΅google_event_id
(string) β ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΡΠΎΠ±ΡΡΠΈΡ Π² Google Calendar.
project_id
(UUID, referencesprojects
) β ΠΏΡΠΎΠ΅ΠΊΡ.user_id
(UUID, referencesusers
) β ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
POST /users/register
{
"name": "John Doe",
"email": "[email protected]",
"password": "password123"
}
ΠΡΠ²Π΅Ρ:
{
"id": "a1b2c3d4",
"name": "John Doe",
"email": "[email protected]",
"avatar_url": null,
"created_at": "2024-09-17T10:00:00Z"
}
POST /users/upload-avatar
{
"user_id": "a1b2c3d4",
"avatar_url": "https://example.com/avatars/user123.png"
}
ΠΡΠ²Π΅Ρ:
{
"message": "Avatar updated successfully"
}
POST /projects
{
"name": "New Project",
"description": "This is a new project",
"created_by": "a1b2c3d4"
}
ΠΡΠ²Π΅Ρ:
{
"id": "p1q2w3e4",
"name": "New Project",
"description": "This is a new project",
"created_by": "a1b2c3d4",
"created_at": "2024-09-17T10:00:00Z"
}
POST /tasks
{
"project_id": "p1q2w3e4",
"title": "Task 1",
"description": "Description of the task",
"assigned_to": "b2c3d4e5",
"status": "in progress",
"due_date": "2024-09-20T15:00:00Z",
"time_spent": 120,
"comments": [
{
"author": "a1b2c3d4",
"text": "Initial comment",
"timestamp": "2024-09-17T10:05:00Z"
}
]
}
ΠΡΠ²Π΅Ρ:
{
"id": "t1y2u3i4",
"project_id": "p1q2w3e4",
"title": "Task 1",
"description": "Description of the task",
"assigned_to": "b2c3d4e5",
"status": "in progress",
"time_spent": 120,
"comments": [
{
"author": "a1b2c3d4",
"text": "Initial comment",
"timestamp": "2024-09-17T10:05:00Z"
}
],
"created_at": "2024-09-17T10:00:00Z"
}
POST /tasks/:id/comments
{
"author": "b2c3d4e5",
"text": "Additional comment",
"timestamp": "2024-09-17T11:00:00Z"
}
ΠΡΠ²Π΅Ρ:
{
"message": "Comment added successfully"
}
POST /achievements
{
"user_id": "a1b2c3d4",
"achievement_type": "Completed 10 tasks",
"image_url": "https://example.com/images/achievement1.png"
}
ΠΡΠ²Π΅Ρ:
{
"id": "ach1",
"user_id": "a1b2c3d4",
"achievement_type": "Completed 10 tasks",
"image_url": "https://example.com/images/achievement1.png",
"created_at": "2024-09-17T10:00:00Z"
}
POST /users/logout
{
"user_id": "a1b2c3d4"
}
ΠΡΠ²Π΅Ρ:
{
"message": "User logged out successfully"
}
GET /users/:id/projects
{
"user_id": "a1b2c3d4"
}
ΠΡΠ²Π΅Ρ:
[
{
"id": "p1q2w3e4",
"name": "New Project",
"description": "This is a new project",
"created_at": "2024-09-17T10:00:00Z"
},
{
"id": "r5t6y7u8",
"name": "Second Project",
"description": "This is another project",
"created_at": "2024-09-16T09:00:00Z"
}
]
POST /calendar/sync
{
"user_id": "a1b2c3d4",
"google_calendar_token": "ya29.A0ARrdaM..."
}
ΠΡΠ²Π΅Ρ:
{
"message": "Calendar synchronized successfully",
"synced_events": [
{
"id": "event1",
"task_id": "t1y2u3i4",
"event_start": "2024-09-18T09:00:00Z",
"event_end": "2024-09-18T10:00:00Z",
"google_event_id": "abc123"
},
{
"id": "event2",
"task_id": "t5r6u7v8",
"event_start": "2024-09-19T14:00:00Z",
"event_end": "2024-09-19T15:00:00Z",
"google_event_id": "def456"
}
]
}
ΠΠ° ΡΡΡΠ°Π½ΠΈΡΠ΅ ΠΏΡΠΎΡΠΈΠ»Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΠΌΠΎΠΆΠ΅Ρ:
- ΠΠ°Π³ΡΡΠ·ΠΈΡΡ Π°Π²Π°ΡΠ°Ρ (ΡΠΌ. Π·Π°ΠΏΡΠΎΡ 2).
- ΠΡΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΠΏΠΈΡΠΎΠΊ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² (ΡΠΌ. Π·Π°ΠΏΡΠΎΡ 8).
- Π‘ΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΠ±ΡΡΠΈΡ Ρ Google Calendar (ΡΠΌ. Π·Π°ΠΏΡΠΎΡ 9).
- ΠΡΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΠ²ΠΎΠΈ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΡ Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡΠΌΠΈ.
{
"id": "ach1",
"achievement_type": "Completed 10 tasks",
"image_url": "https://example.com/images/achievement1.png",
"created_at": "2024-09-17T10:00:00Z"
}
[
{
"id": "ach1",
"achievement_type": "Completed 10 tasks",
"image_url": "https://example.com/images/achievement1.png",
"created_at": "2024-09-17T10:00:00Z"
},
{
"id": "ach2",
"achievement_type": "Completed 5 projects",
"image_url": "https://example.com/images/achievement2.png",
"created_at": "2024-09-16T12:00:00Z"
}
]