Skip to content
Merged

Dev #25

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
cb106a7
Создан database, config
dmsnback Dec 4, 2025
bd4e2da
Merge pull request #1 from dmsnback/feature/database
dmsnback Dec 4, 2025
6782149
id и tablename создается автоматически
dmsnback Dec 4, 2025
221841a
Merge pull request #2 from dmsnback/feature/database
dmsnback Dec 4, 2025
4f36bb4
users midels, schemas
dmsnback Dec 4, 2025
6f29584
user_routers
dmsnback Dec 6, 2025
ebad571
Merge pull request #3 from dmsnback/feature/users
dmsnback Dec 6, 2025
581cc21
Созданы первые миграции alembic, авттоматическое созданиее супеерюзер…
dmsnback Dec 7, 2025
14e844d
Merge pull request #4 from dmsnback/feature/migrations
dmsnback Dec 7, 2025
583f2b7
logging users
dmsnback Dec 8, 2025
4d94df4
Merge pull request #5 from dmsnback/users
dmsnback Dec 8, 2025
fac3ea5
clients
dmsnback Dec 8, 2025
b0c3eb6
User Client
dmsnback Dec 10, 2025
10fc187
Merge pull request #6 from dmsnback/feature/clients
dmsnback Dec 10, 2025
38a2c83
ClientSchemas
dmsnback Dec 11, 2025
62d2aaf
Merge pull request #7 from dmsnback/feature/schema_clients
dmsnback Dec 11, 2025
8bd2ab7
crud client + routers client
dmsnback Dec 11, 2025
7e9d556
isort black flake8
dmsnback Dec 11, 2025
0f51a53
Merge pull request #8 from dmsnback/feature/crud_clients
dmsnback Dec 11, 2025
870ecd9
user_mannager
dmsnback Dec 11, 2025
a02bfee
Merge pull request #9 from dmsnback/user_manager
dmsnback Dec 11, 2025
f949f68
права пользователей, валидация при добавлении клиента
dmsnback Dec 13, 2025
ab962c6
Merge pull request #10 from dmsnback/user_manager
dmsnback Dec 13, 2025
a1dfc04
модель сделок
dmsnback Dec 14, 2025
56cdf44
Merge pull request #11 from dmsnback/feature/deals
dmsnback Dec 14, 2025
7ed858d
CRUD, роутеры и схемы для сделок
dmsnback Dec 16, 2025
f250465
Merge pull request #12 from dmsnback/feature/deals
dmsnback Dec 16, 2025
720ba65
Модель для комментариев к сделке
dmsnback Dec 16, 2025
58238ac
Merge pull request #13 from dmsnback/feature/comment
dmsnback Dec 16, 2025
3440364
Добавление ккоментария, получение коментария
dmsnback Dec 17, 2025
d74b551
Merge pull request #14 from dmsnback/feature/comment
dmsnback Dec 17, 2025
dadbccd
Изменение и удаление комментариев
dmsnback Dec 23, 2025
7a58e7a
Merge pull request #15 from dmsnback/feature/comment
dmsnback Dec 23, 2025
ca074fa
GithubActions
dmsnback Dec 24, 2025
362e53f
GithubActions
dmsnback Dec 24, 2025
0555b6a
GithubActions
dmsnback Dec 24, 2025
311efcd
Merge pull request #16 from dmsnback/feature/actions
dmsnback Dec 24, 2025
b1c765a
бд postgresql
dmsnback Dec 24, 2025
a0eac0a
Merge pull request #17 from dmsnback/feature/posgresql
dmsnback Dec 24, 2025
5f8c955
dockerfile и docker-compose
dmsnback Dec 25, 2025
7f5da65
Merge pull request #18 from dmsnback/feature/docker
dmsnback Dec 25, 2025
a84792b
push to dockerhub
dmsnback Dec 26, 2025
1471b92
Merge pull request #19 from dmsnback/feature/pushtodockerhub
dmsnback Dec 26, 2025
c2a74a4
push to dockerhub
dmsnback Dec 26, 2025
dad2175
Merge pull request #20 from dmsnback/feature/pushtodockerhub
dmsnback Dec 26, 2025
5f01821
push to dockerhub_dev_and_main
dmsnback Dec 26, 2025
9c762d2
Merge pull request #21 from dmsnback/feature/pushtodockerhub
dmsnback Dec 26, 2025
9c0250e
push to dockerhub_dev_and_main
dmsnback Dec 26, 2025
e3be13b
push to dockerhub_dev_and_main
dmsnback Dec 26, 2025
37fced1
push to dockerhub_dev_and_main
dmsnback Dec 26, 2025
4482fd2
push to dockerhub_dev_and_main
dmsnback Dec 26, 2025
7d6e799
push to dockerhub_dev_and_main
dmsnback Dec 26, 2025
f6ba542
Merge pull request #22 from dmsnback/feature/pushtodockerhub
dmsnback Dec 26, 2025
5735440
push to dockerhub_dev
dmsnback Dec 26, 2025
9c73c96
Merge pull request #23 from dmsnback/feature/readme
dmsnback Dec 26, 2025
c700c56
readme.md
dmsnback Dec 28, 2025
ab23778
Merge pull request #24 from dmsnback/feature/readme
dmsnback Dec 28, 2025
bb135aa
prod
dmsnback Dec 28, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .flake8
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
[flake8]
max-line-length = 90
extend-ignore = E501, E203, W503
exclude =
.git,
__pycache__,
.tox,
.eggs,
*.egg,
.venv,
venv,
alembic/
89 changes: 89 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
name: miniCRM workflow

on:
push:
branches:
- '**'

jobs:
lint:
name: Lint
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: 3.11

- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt

- name: Test with black(check only)
run: |
python -m black . --check

- name: Test with isort(check only)
run: |
python -m isort . --check-only

- name: Test with flake8
run: |
flake8 . --count --statistics --show-source

push_branch_dev_to_docker_hub:
name: Build and Push Docker (dev)
runs-on: ubuntu-latest
needs: lint

if: github.ref == 'refs/heads/dev'

steps:
- name: Check out the repo
uses: actions/checkout@v4

- name: Setup Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Login to Docker
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Push to Docker Hub
uses: docker/build-push-action@v5
with:
push: true
tags: |
dmsn/minicrm:dev

push_branch_main_to_docker_hub:
name: Build and Push Docker (prod)
runs-on: ubuntu-latest
needs: lint

if: github.ref == 'refs/heads/main'

steps:
- name: Check out the repo
uses: actions/checkout@v4

- name: Setup Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Login to Docker
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Push to Docker Hub
uses: docker/build-push-action@v5
with:
push: true
tags: |
dmsn/minicrm:prod
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -205,3 +205,8 @@ cython_debug/
marimo/_static/
marimo/_lsp/
__marimo__/

minicrm.db

logs/
*.log
10 changes: 10 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
FROM python:3.11-slim
LABEL maintainer="Dmitry Titenkov <lt200711@yandex.ru>"
LABEL version="1.0"
LABEL description="API for miniCRM"
RUN mkdir /app
COPY requirements.txt /app
RUN pip3 install -r /app/requirements.txt --no-cache-dir -vvv
COPY . /app
WORKDIR /app
CMD [ "uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload" ]
166 changes: 165 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,166 @@
# minicrm
# miniCRM

API мини CRM приложеение

[![miniCRM Lint](https://img.shields.io/github/actions/workflow/status/dmsnback/minicrm/main.yml?branch=main&style=flat-square&label=miniCRM%20Lint)](https://github.com/dmsnback/minicrm/actions/workflows/main.yml)
[![miniCRM Docker Dev](https://img.shields.io/github/actions/workflow/status/dmsnback/minicrm/main.yml?branch=dev&style=flat-square&label=miniCRM%20Docker%20Dev)](https://github.com/dmsnback/minicrm/actions/workflows/main.yml)
[![miniCRM Docker Prod](https://img.shields.io/github/actions/workflow/status/dmsnback/minicrm/main.yml?branch=main&style=flat-square&label=miniCRM%20Docker%20Prod)](https://github.com/dmsnback/minicrm/actions/workflows/main.yml)


- [Описание](#Описание)
- [Технологии](#Технологии)
- [Таблица эндпоинтов](#Таблица)
- [Шаблон заполнения .env-файла](#Шаблон)
- [Запуск проекта на локальной машине](#Запуск)
- [Автор](#Автор)

<a name="Описание"></a>
### Описание

MiniCRM — это backend-сервис для управления клиентами, сделками и комментариями, реализованный на FastAPI с асинхронной работой через PostgreSQL.

Проект ориентирован на практическую разработку API с авторизацией, ролями пользователей и правами доступа.

REST API для управления:

- Клиентами (CRUD)
- Сделками (CRUD, статусы, фильтрация по менеджерам)
- Комментариями к сделкам
- Пользователями с ролями (admin / manager)
- Авторизацией через JWT

Приложение написано с использованием **асинхронного FastAPI**, **SQLAlchemy**, **PostgreSQL** и **FastAPI Users**.


> [Вернуться в начало](#Начало)
<a name="Технологии"></a>

### Технологии


[![Python](https://img.shields.io/badge/Python-1000?style=for-the-badge&logo=python&logoColor=ffffff&labelColor=000000&color=000000)](https://www.python.org)
[![FastAPI](https://img.shields.io/badge/FastAPI-1000?style=for-the-badge&logo=fastapi&logoColor=ffffff&labelColor=000000&color=000000)](https://fastapi.tiangolo.com)
[![FastAPI Users](https://img.shields.io/badge/FastAPI_Users-1000?style=for-the-badge&logoColor=ffffff&labelColor=000000&color=000000)](https://fastapi-users.github.io/fastapi-users/latest/)
[![SQLAlchemy](https://img.shields.io/badge/SQLAlchemy-1000?style=for-the-badge&logo=sqlalchemy&logoColor=ffffff&labelColor=000000&color=000000)](https://www.sqlalchemy.org)
[![Pydantic](https://img.shields.io/badge/Pydantic_V2-1000?style=for-the-badge&logo=Pydantic&logoColor=ffffff&labelColor=000000&color=000000)](https://docs.pydantic.dev/latest/)
[![Docker](https://img.shields.io/badge/Docker-1000?style=for-the-badge&logo=docker&logoColor=ffffff&labelColor=000000&color=000000)](https://www.docker.com)
[![Postgres](https://img.shields.io/badge/Postgres-1000?style=for-the-badge&logo=postgresql&logoColor=ffffff&labelColor=000000&color=000000)](https://www.postgresql.org)
[![GitHub Actions](https://img.shields.io/badge/github%20actions-%232671E5.svg?style=for-the-badge&logo=githubactions&logoColor=ffffff&labelColor=000000&color=000000)](https://github.com/features/actions)

> [Вернуться в начало](#Начало)
<a name="Таблица"></a>

### Таблица эндпоинтов

**Авторизация**

|Метод|URL|Описание|Доступ|
|:-:|:-:|:-:|:-:|
|POST|/auth/register|Регистрация новых менеджеров|Админ|
|POST|/auth/jwt/login|получение JWT токена|Админ<br> Менеджер|

**Пользователи**

|Метод|URL|Описание|Доступ|
|:-:|:-:|:-:|:-:|
|GET|/users/all|Список всеех менеджеров|Админ|
|GET|/users/{user_id}/clients|Получение списка клиентов менеджра по id|Админ|
|GET|/users/me|Получение текущего юзера|Админ<br> Менеджер|
|PATCH|/users/{id}|Редактирование юзера|Админ|
|DELETE|/users/{id}|Удаление юзера|Админ|

**Клиенты**

|Метод|URL|Описание|Доступ|
|:-:|:-:|:-:|:-:|
|GET|/clients/all|Список всех клиентов<br>(Админ видит всех, менеджер - своих)|Админ<br> Менеджер|
|GET|/clients/{clients_id}|Получение клиента по id|Админ<br> Менеджер|
|PATCH|/clients/{clients_id}|Редактирование клиента|Админ<br> Менеджер|
|DELETE|/clients/{clients_id}|Удаление клиентв|Админ|
|POST|/clients|Добавление нового клиента|Админ<br> Менеджер|

**Сделки**

|Метод|URL|Описание|Доступ|
|:-:|:-:|:-:|:-:|
|GET|/deals/all|Список всех сделок<br>(Админ видит вс своих)|Админ<br> Менеджер|
|GET|/deals/{deals_id}|Получение сделки по id|Админ<br> Менеджер|
|PATCH|/deals/{deals_id}|Редактирование сделки|Админ<br> Менеджер|
|DELETE|/deals/{deals_id}|Удаление сделки|Админ|
|POST|/deals|Добавление новой сделки|Админ<br> Менеджер|

**Комментарии**

|Метод|URL|Описание|Доступ|
|:-:|:-:|:-:|:-:|
|GET|/comments/{deal_id}/comments|Получить все комментарии сделки|Админ<br> Менеджер|
|POST|/comments/{deal_id}/comments|Добавление комментария к сделке|Админ<br> Менеджер|
|PATCH|/comments/{deal_id}/comments/{comment_id}|Редактирование комментария|Админ<br> Менеджер|
|DELETE|/comments/{deal_id}/comments/{comment_id}|Удаление комментария|Админ|

> [Вернуться в начало](#Начало)

<a name="Шаблон"></a>

### Шаблон заполнения .env-файла

> `env.example` с дефолтнными значениями расположен в корневой папке

```python
POSTGRES_DB = minicrmdb # Имя базы дданнных
POSTGRES_USER = postgres # Имя юзера PostgreSQL
POSTGRES_PASSWORD = yourpassword # Пароль юзера PostgreSQL
DATABASE_URL = postgresql+asyncpg://postgres:yourpassword@db:5432/minicrmdb # Указываем адрес БД
DEBUG = False # Включеение/Выключение режима отладки
APP_TITLE = МиниCRM приложение # Название приложения
SECRET = SUPERSECRETKEY # Секретный ключ для подписания JWT токенов
FIRST_SUPERUSER_USERNAME = superadmin # Указываеем usernsme для суперюзера
FIRST_SUPERUSER_EMAIL = superadmin@mail.com # Указываеем почту для суперюзера
FIRST_SUPERUSER_PASSWORD = superadmin # Указываеем пароль для суперюзера
FIRST_SUPERUSER_ROLE = admin # Указываеем роль для суперюзера

```

> [Вернуться в начало](#Начало)

<a name="Запуск"></a>

### Запуск проекта на локальной машине

- Склонируйте репозиторий

```python
git clone git@github.com:dmsnback/minicrm.git
```

- Запускаем Docker контейнер

```python
docker-compose up -d --build
```

- Выполняем миграции

```python
docker-compose exec backend alembic upgrade head
```

- Создаём суперюзера

```python
docker-compose exec backend python create_superuser.py
```

> __Документация к API будет доступна по адресу:__

[http://localhost:8000/docs/](http://localhost:8000/docs/)

> [Вернуться в начало](#Начало)

<a name="Авторы"></a>

### Автор

- [Титенков Дмитрий](https://github.com/dmsnback)

> [Вернуться в начало](#Начало)
Loading