# План разработки удобного развертываемого месседжера с блэкджоком и шлюхами
___________________________
## БД сервер PostgtresSQL поднятый на Docker (рассмотреть возможность репликации):

### docker-compose.yml
``` 
services:
  msgdb:
    image: postgres
    restart: always
    shm_size: 128mb
    environment:
      POSTGRES_PASSWORD: postgr
      POSTGRES_USER: pass
    volumes:
      - ./postgres-data:/var/lib/postgresql/data

    ports:
      - 5435:5432

  msgadminer:
    image: adminer
    restart: always
    ports:
      - 8056:8080

  msgpgadmin:
    image: dpage/pgadmin4
    restart: always
    environment:
      PGADMIN_DEFAULT_EMAIL: redabyq.space@gmail.com
      PGADMIN_DEFAULT_PASSWORD: pass
      PGADMIN_LISTEN_PORT: 8081
    ports:
      - 8055:8081

volumes:
  volume_postgres:
```

### Структура БД *messager* (выполнить запросами для postgreSQL)

#### Users

| id | email | login | name  | surname | hashpassword | emailcode | confirmed | forgotpasscode | onetimecode | isbanned | status | token | FP_code_expires_at | OT_code_expires_at 
|--|--|
| *int*<br><u>primarykey</u> | *varchar(unique)* | *varchar(unique)* | *varchar* | *varchar* | *byte* | *int(unique)* | *bool* | *int(unique)* | *bool* | *varchar* |  *varchar(unique)* | *datetime*


#### Avatars
| id | userid | imagemaxpath | imageminpath | date | 
|--|--|
| *int*<br><u>primarykey</u> | *int* <br><u>foreignkey (users)</u> | *varchar* | *varchar* | *date* |

#### DirectChats

| id | user1id | user2id | createdate | 
|--|--|
| *int*<br><u>primarykey</u> | *int* <br><u>foreignkey (users)</u> | *int* <br><u>foreignkey (users)</u> | *date* |

Должно быть уникальное сочетание user1id и user2id, но при этом не должно быть чатов типа user1id=1, user2id=2  и  user1id=2, user2id=1 одновременно

##### Пример правильной структуры ✅️ 

| user1id | user2id |
|--|--|
| 1 | 2 |
| 2 | 3 |
| 1 | 3 |

##### Пример неправильной структуры ❌ 

| user1id | user2id |
|--|--|
| 1 | 2 |
| 2 | 1 |
| 1 | 2 |
#### Groups
| id | createdate | isPrivate | name | description |  ownerid
|--|--|
| *int*<br><u>primarykey</u> | *date* | *bool* | *varchar* | *varchar* |*int* <br><u>foreignkey (users)</u> |

#### Channels
| id | createdate | name | groupid | type |
|--|--|
| *int*<br><u>primarykey</u> | *date* | *varchar* | *<u>foreignkey (Groups)</u>* | *bool*
# ПОМЕТКА ЕБАНУТЬ Channels и DirectMesages одним

#### Groupsusers
| userid | groupid | date |
|--|--|
|  *int* <br><u>foreignkey (users)</u> |  *int* <br><u>foreignkey (groups)</u> | *date* | 


#### Messages
| id | userid | isedited | date | time | content | chatid | channelid | reply_to |
|--|--|
| *int*<br><u>primarykey</u> |   *int* <br><u>foreignkey (users)</u>  | *bool* | *date* | *time* | *varchar* | *int* <br><u>foreignkey (DirectChats)</u> |  *int* <br><u>foreignkey (Groups)</u> |  *int* <br><u>foreignkey (Messages)</u> 


#### statFiles
 | id | filename | type | path | date | time | msgid
|--|--|
| *int*<br><u>primarykey</u> | *varchar* |   *int* <br><u>foreignkey (types) </u> | *varchar(unique)* | *date* | *time* |  *int* <br><u>foreignkey (Messages) </u> 
 
#### FileTypes
| id | type |
|--|--|
| *int*<br><u>primarykey</u> | *varchar(unique)* |

#### FileTypes заполнение
| id | type |
|--|--|
| 1 | image |
| 2 | video |
| 3 | music |
| 4 | voice |
| 5 | other |

___________________________
## API:
- Поделен на микросервисы (далее Micr) на flask restx
- На отдельном домене
- Написать модуль для продления сертификатов
- Модуль для отправки сообщений SMTPLIB

___________________________
### Micr1 Регистрация и авторизация
#### Нэймспэйс /reg/

##### <u>POST</u> /reg/register
| Параметр | Тип |  Проверка |
|--|--|
| email | *string* | Валидация формата email |
| login	| *string* | От 6 до 24 символов |
| name	| *string* | - |
| surname	| *string* | - |
| pass | *string* | От 8 до 24 символов должен включать прописные и заглавные буквы, цифры и спецсимволы |
| confirmpass	 | *string* | Должен совпадать с  pass |

Регистрация происходит, а тем временем через smtplib отправляется письмо на email пользователя с ссылкой для подтверждения аккаунта.




##### <u>POST</u> /reg/resendconfirmemail
| Параметр | Тип |  Проверка |
|--|--|
| email | *string* | Валидация формата email и проверка наличия аккаунта с такой почтой в БД |

Если email существует в бд, повторно отправляется письмо с новым кодом

##### <u>GET</u> /reg/confirmemail
| Параметр | Тип |  Проверка |
|--|--|
| email | *string* | Валидация формата email и проверка наличия аккаунта с такой почтой в БД |
| code | int | Проверка кода и срока когда он истекает в БД |

Эта ссылка и приходит в письмо если код правильный происходит редирект на одну страницу, если неправильный, на другую

#### Нэймспэйс /auth/
##### <u>POST</u> /auth/loginonetimecode
| Параметр | Тип |  Проверка |
|--|--|
| loginoremail | *string* | Валидация формата логина или формата email и проверка наличия аккаунта с такими данными в БД |

Тут на почту отправляется код для единоразового входа в аккаунт.
Добавить возможность убрать эту хуйню


##### <u>POST</u> /auth/pass
| Параметр | Тип |  Проверка |
|--|--|
| loginoremail | *string* | Валидация формата логина или формата email и проверка наличия аккаунта с такими данными в БД |
| hashpass | *string* | Валидация формата хэша пароля и проверка его с хэшем из базы.
Должен передаваться не пароль а хэш


___________________________
### Micr2 Работа с файлами
#### Нэймспэйс /getimage/
JWT эндпоинт

#### Нэймспэйс /getvideo/


#### Нэймспэйс /getaudio/


# Фронт
nuxt + tailwing