init
This commit is contained in:
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/.venv/
|
||||||
|
/.idea
|
||||||
11
README.md
Normal file
11
README.md
Normal file
@@ -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)
|
||||||
436
docs/Task&Coffee.ddb
Normal file
436
docs/Task&Coffee.ddb
Normal file
@@ -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": []
|
||||||
|
}
|
||||||
48
docs/api.md
Normal file
48
docs/api.md
Normal file
@@ -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 – Получение данных текущего пользователя\
|
||||||
5
docs/frontend.md
Normal file
5
docs/frontend.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# Frontend
|
||||||
|
### pre-concept:
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
0
docs/installation.md
Normal file
0
docs/installation.md
Normal file
BIN
docs/pics/db-schema.png
Normal file
BIN
docs/pics/db-schema.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 282 KiB |
BIN
docs/pics/pre_frontend01.png
Normal file
BIN
docs/pics/pre_frontend01.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.8 MiB |
BIN
docs/pics/pre_frontend02.png
Normal file
BIN
docs/pics/pre_frontend02.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.7 MiB |
53
docs/schema.md
Normal file
53
docs/schema.md
Normal file
@@ -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
|
||||||
|
___
|
||||||
|

|
||||||
0
src/main.py
Normal file
0
src/main.py
Normal file
Reference in New Issue
Block a user