commit 57ca56c2f683e72e11357add3f7b5ede2f06acda Author: IluaAir Date: Wed Apr 2 16:37:39 2025 +0300 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..62a97aa --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/.venv/ +/.idea \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..39011c1 --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +# Task&Coffee + +___ + +Task&Coffee - менеджер задач созданный для отслеживания повседневных недельных заданий. + +#### Содержание: +1) [Installation](docs/installation.md) +2) [Api](docs/api.md) +3) [SQL-schema](docs/schema.md) +4) [Frontend](docs/frontend.md) \ No newline at end of file diff --git a/docs/Task&Coffee.ddb b/docs/Task&Coffee.ddb new file mode 100644 index 0000000..6d1ba30 --- /dev/null +++ b/docs/Task&Coffee.ddb @@ -0,0 +1,436 @@ +{ + "author": "Unnamed", + "title": "Task&Coffee", + "date": "2025-03-27T21:10:04.996Z", + "tables": [ + { + "id": 0, + "name": "Users", + "x": -104.8410100000001, + "y": -43.33970937500004, + "fields": [ + { + "name": "id", + "type": "INT", + "default": "", + "check": "", + "primary": true, + "unique": true, + "notNull": true, + "increment": true, + "comment": "", + "id": 0 + }, + { + "name": "name", + "type": "CHAR", + "default": "", + "check": "", + "primary": false, + "unique": false, + "notNull": true, + "increment": false, + "comment": "", + "id": 1, + "size": 50 + }, + { + "name": "password", + "type": "VARCHAR", + "default": "", + "check": "", + "primary": false, + "unique": false, + "notNull": true, + "increment": false, + "comment": "", + "id": 2, + "size": 255 + }, + { + "name": "email", + "type": "CHAR", + "default": "", + "check": "", + "primary": false, + "unique": true, + "notNull": true, + "increment": false, + "comment": "", + "id": 3, + "size": 1 + }, + { + "name": "telegram_id", + "type": "BIGINT", + "default": "", + "check": "", + "primary": false, + "unique": true, + "notNull": false, + "increment": false, + "comment": "телеграм id для ответов пользователю", + "id": 4 + }, + { + "name": "avatar_path ", + "type": "VARCHAR", + "default": "", + "check": "", + "primary": false, + "unique": false, + "notNull": false, + "increment": false, + "comment": "", + "id": 5, + "size": 255 + } + ], + "comment": "Данные пользователя", + "indices": [], + "color": "#6360f7", + "key": 1742200210667 + }, + { + "id": 1, + "name": "Tasks", + "x": 229, + "y": 65, + "fields": [ + { + "name": "id", + "type": "INT", + "default": "", + "check": "", + "primary": true, + "unique": true, + "notNull": true, + "increment": true, + "comment": "", + "id": 0 + }, + { + "name": "user_id", + "type": "INT", + "default": "", + "check": "", + "primary": false, + "unique": false, + "notNull": true, + "increment": false, + "comment": "", + "id": 1, + "size": 20 + }, + { + "name": "title", + "type": "CHAR", + "default": "", + "check": "", + "primary": false, + "unique": false, + "notNull": true, + "increment": false, + "comment": "", + "id": 2, + "size": 20 + }, + { + "name": "description", + "type": "TEXT", + "default": "", + "check": "", + "primary": false, + "unique": false, + "notNull": false, + "increment": false, + "comment": "", + "id": 3, + "size": 65535, + "values": [] + }, + { + "name": "due_date", + "type": "DATE", + "default": "", + "check": "", + "primary": false, + "unique": false, + "notNull": false, + "increment": false, + "comment": "", + "id": 4, + "size": "", + "values": [] + }, + { + "name": "status", + "type": "ENUM", + "default": "", + "check": "", + "primary": false, + "unique": false, + "notNull": true, + "increment": false, + "comment": "", + "id": 5, + "values": [ + "open", + "closed", + "in_progress", + "todo" + ] + }, + { + "name": "priority", + "type": "ENUM", + "default": "", + "check": "", + "primary": false, + "unique": false, + "notNull": true, + "increment": false, + "comment": "", + "id": 6, + "size": "", + "values": [ + "low", + "medium", + "high", + "critical" + ] + }, + { + "name": "created_at", + "type": "TIMESTAMP", + "default": "", + "check": "", + "primary": false, + "unique": false, + "notNull": true, + "increment": false, + "comment": "", + "id": 7, + "size": "", + "values": [] + }, + { + "name": "time_spent", + "type": "INT", + "default": "0", + "check": "", + "primary": false, + "unique": false, + "notNull": false, + "increment": false, + "comment": "", + "id": 8, + "values": [], + "size": "" + } + ], + "comment": " Задачи пользователя", + "indices": [], + "color": "#f03c3c", + "key": 1742200955993 + }, + { + "id": 2, + "name": "Tags", + "x": 698, + "y": 533, + "fields": [ + { + "name": "id", + "type": "INT", + "default": "", + "check": "", + "primary": true, + "unique": true, + "notNull": true, + "increment": true, + "comment": "", + "id": 0 + }, + { + "name": "name", + "type": "CHAR", + "default": "", + "check": "", + "primary": false, + "unique": false, + "notNull": false, + "increment": false, + "comment": "", + "id": 1, + "size": 20 + } + ], + "comment": "", + "indices": [], + "color": "#175e7a", + "key": 1742202331481 + }, + { + "id": 3, + "name": "Attachments", + "x": 693, + "y": -13, + "fields": [ + { + "name": "id", + "type": "INT", + "default": "", + "check": "", + "primary": true, + "unique": true, + "notNull": true, + "increment": true, + "comment": "", + "id": 0 + }, + { + "name": "task_id", + "type": "INT", + "default": "", + "check": "", + "primary": false, + "unique": false, + "notNull": true, + "increment": false, + "comment": "", + "id": 1, + "size": 255 + }, + { + "name": "file_path", + "type": "VARCHAR", + "default": "", + "check": "", + "primary": false, + "unique": false, + "notNull": true, + "increment": false, + "comment": "", + "id": 2, + "size": 255 + }, + { + "name": "uploaded_at", + "type": "TIMESTAMP", + "default": "", + "check": "", + "primary": false, + "unique": false, + "notNull": false, + "increment": false, + "comment": "", + "id": 3, + "size": "", + "values": [] + } + ], + "comment": "", + "indices": [], + "color": "#3cde7d", + "key": 1742203353583 + }, + { + "id": 4, + "name": "Task_Assignees", + "x": 287, + "y": 560, + "fields": [ + { + "name": "id", + "type": "INT", + "default": "", + "check": "", + "primary": true, + "unique": true, + "notNull": true, + "increment": true, + "comment": "", + "id": 0 + }, + { + "name": "task_id", + "type": "INT", + "default": "", + "check": "", + "primary": false, + "unique": false, + "notNull": true, + "increment": false, + "comment": "", + "id": 1 + }, + { + "name": "tags_id", + "type": "INT", + "default": "", + "check": "", + "primary": false, + "unique": false, + "notNull": true, + "increment": false, + "comment": "", + "id": 2 + } + ], + "comment": "", + "indices": [], + "color": "#7d9dff", + "key": 1742204065899 + } + ], + "relationships": [ + { + "startTableId": 0, + "startFieldId": 0, + "endTableId": 1, + "endFieldId": 1, + "cardinality": "One to many", + "updateConstraint": "No action", + "deleteConstraint": "No action", + "name": "Users_id_fk", + "id": 0 + }, + { + "startTableId": 1, + "startFieldId": 0, + "endTableId": 3, + "endFieldId": 1, + "cardinality": "One to many", + "updateConstraint": "No action", + "deleteConstraint": "No action", + "name": "Attachments_task_id_fk", + "id": 1 + }, + { + "startTableId": 4, + "startFieldId": 2, + "endTableId": 2, + "endFieldId": 0, + "cardinality": "One to one", + "updateConstraint": "Cascade", + "deleteConstraint": "Cascade", + "name": "Tags_id_fk", + "id": 2 + }, + { + "startTableId": 4, + "startFieldId": 1, + "endTableId": 1, + "endFieldId": 0, + "cardinality": "One to one", + "updateConstraint": "Cascade", + "deleteConstraint": "Cascade", + "name": "Tasks_id_fk", + "id": 3 + } + ], + "notes": [], + "subjectAreas": [], + "types": [] +} \ No newline at end of file diff --git a/docs/api.md b/docs/api.md new file mode 100644 index 0000000..491d905 --- /dev/null +++ b/docs/api.md @@ -0,0 +1,48 @@ +# API + +## Основные эндпоинты: + +___ +Пользователи (Users) +#### +GET /users – Получить список всех пользователей \ +GET /users/{user_id} – Получить конкретного пользователя \ +GET /users/{user_id}/tasks - Получить задачи пользователя \ +POST /users – Создать нового пользователя \ +PUT /users/{user_id} – Обновить данные пользователя \ +DELETE /users/{user_id} – Удалить пользователя + +Задачи (Tasks) +#### +GET /tasks – Получить список всех задач \ +GET /tasks/{task_id} – Получить задачу по ID \ +POST /tasks – Создать новую задачу \ +PUT /tasks/{task_id} – Обновить задачу \ +DELETE /tasks/{task_id} – Удалить задачу + +Вложения (Attachments) +#### +GET /tasks/{task_id}/attachments – Получить все вложения к задаче \ +POST /tasks/{task_id}/attachments – Добавить вложение к задаче \ +DELETE /attachments/{attach_id} – Удалить вложение + +Теги (Tags) +#### +GET /tags – Получить список всех тегов \ +GET /tags/{tag_id} – Получить тег по ID \ +POST /tags – Создать новый тег \ +DELETE /tags/{tag_id} – Удалить тег + +Назначение тегов к задачам (Task_Assignees) +#### +GET /tasks/{task_id}/tags – Получить все теги задачи \ +POST /tasks/{task_id}/tags/{tag_id} – Добавить тег к задаче \ +DELETE /tasks/{task_id}/tags/{tag_id} – Удалить тег у задачи + +Авторизация (Auth) +#### +POST /auth/register – Регистрация нового пользователя \ +POST /auth/login – Вход пользователя \ +POST /auth/logout – Выход пользователя \ +POST /auth/refresh – Обновление токена \ +GET /auth/me – Получение данных текущего пользователя\ \ No newline at end of file diff --git a/docs/frontend.md b/docs/frontend.md new file mode 100644 index 0000000..6e48f41 --- /dev/null +++ b/docs/frontend.md @@ -0,0 +1,5 @@ +# Frontend +### pre-concept: +![pre_frontend.png](pics/pre_frontend01.png) + +![pre_frontend02.png](pics/pre_frontend02.png) \ No newline at end of file diff --git a/docs/installation.md b/docs/installation.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/pics/db-schema.png b/docs/pics/db-schema.png new file mode 100644 index 0000000..2c9e707 Binary files /dev/null and b/docs/pics/db-schema.png differ diff --git a/docs/pics/pre_frontend01.png b/docs/pics/pre_frontend01.png new file mode 100644 index 0000000..c82efc7 Binary files /dev/null and b/docs/pics/pre_frontend01.png differ diff --git a/docs/pics/pre_frontend02.png b/docs/pics/pre_frontend02.png new file mode 100644 index 0000000..653e2c9 Binary files /dev/null and b/docs/pics/pre_frontend02.png differ diff --git a/docs/schema.md b/docs/schema.md new file mode 100644 index 0000000..24c0beb --- /dev/null +++ b/docs/schema.md @@ -0,0 +1,53 @@ +# SQL-schema + +База данных SQLite, движок *aiosqlite* +___ + +### Структура базы данных: +##### +#### Users + +id - int, первичный ключ \ +name - char, логин пользователя (уникально)\ +password - varchar, пароль пользователя \ +email - char, электронная почта для отправки уведомлений (не обязательно) \ +telegram_id - bigint, id пользователя в телеграм для отправки уведомлений (не обязательно) \ +avatar_path - varchar, путь до аватарки на диске (не обязательно) +##### +#### Tasks + +Отношение многие к одному Users. +##### +id - int, первичный ключ \ +user_id - int, relationship для Users.id \ +title - char, заголовок задачи \ +description - text, полное описание задачи (не обязательно) \ +due_date - date, день недели на которое будет назначена задача \ +status - enum, текущий статус задачи (open, closed, in progress, todo; по умолчанию open) \ +priority - enum, приоритетность задачи (low, medium, high, critical) \ +created_at - timestamp, время создания \ +time_spent - int, затраченное время (по умолчанию - 0) +##### +#### Attachements + +Отношение многие к одному Tasks. +#### +id - int, первичный ключ \ +task_id - int, relationship для Tasks.id \ +file_path - varchar, путь до файла на диске \ +uploaded_at - timestamp +##### +#### Tags + +id - int, первичный ключ \ +name - char, название тега (уникально) +##### +#### Task_Assignees + +Отношение многие с многими Tasks - Tags +##### +id - int, первичный ключ \ +task_id - int, relationship для Tasks.id \ +tag_id - int, relationship для Tags.id +___ +![db-schema.png](pics/db-schema.png) \ No newline at end of file diff --git a/src/main.py b/src/main.py new file mode 100644 index 0000000..e69de29