{"id":26412940,"url":"https://github.com/excellent-84/library_api","last_synced_at":"2026-04-18T09:35:08.080Z","repository":{"id":273446891,"uuid":"919167793","full_name":"Excellent-84/library_api","owner":"Excellent-84","description":"RESTful API для управления библиотечным каталогом. Система позволяет управлять информацией о книгах, авторах, читателях и выдачей книг.","archived":false,"fork":false,"pushed_at":"2025-03-01T14:36:58.000Z","size":96,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-17T22:11:52.608Z","etag":null,"topics":["alembic","docker","fastapi","jwt","postgresql","pydantic","pytest","python","sqlalchemy"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Excellent-84.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-01-19T21:35:45.000Z","updated_at":"2025-03-01T14:37:01.000Z","dependencies_parsed_at":"2025-01-21T01:18:34.911Z","dependency_job_id":"34805605-ecec-4ed8-8803-6694e6ce9d15","html_url":"https://github.com/Excellent-84/library_api","commit_stats":null,"previous_names":["excellent-84/library_api"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Excellent-84/library_api","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Excellent-84%2Flibrary_api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Excellent-84%2Flibrary_api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Excellent-84%2Flibrary_api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Excellent-84%2Flibrary_api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Excellent-84","download_url":"https://codeload.github.com/Excellent-84/library_api/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Excellent-84%2Flibrary_api/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31964146,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T00:39:45.007Z","status":"online","status_checked_at":"2026-04-18T02:00:07.018Z","response_time":103,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["alembic","docker","fastapi","jwt","postgresql","pydantic","pytest","python","sqlalchemy"],"created_at":"2025-03-17T22:10:12.916Z","updated_at":"2026-04-18T09:35:08.062Z","avatar_url":"https://github.com/Excellent-84.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"## API для Управления Библиотекой\n\n\u003cbr\u003e\n\n\u003cdiv style=\"display: flex; flex-wrap: wrap;\"\u003e\n  \u003cimg src=\"https://www.python.org/static/community_logos/python-logo.png\" alt=\"Python\" width=\"84\"/\u003e\n  \u003cimg src=\"https://img.shields.io/badge/FastAPI-FFFFFF?style=for-the-badge\u0026logo=fastapi\u0026logoColor=009688\"/\u003e\n  \u003cimg src=\"https://img.shields.io/badge/sqlalchemy-FFFFFF?style=for-the-badge\u0026logo=sqlalchemy\u0026logoColor=D71F00\"/\u003e\n  \u003cimg src=\"https://img.shields.io/badge/pydantic-FFFFFF?style=for-the-badge\u0026logo=pydantic\u0026logoColor=E92063\"/\u003e\n  \u003cimg src=\"https://img.shields.io/badge/alembic-FFFFFF?style=for-the-badge\u0026logo=alembic\u0026logoColor=8212\"/\u003e\n  \u003cimg src=\"https://img.shields.io/badge/PostgreSQL-FFFFFF?style=for-the-badge\u0026logo=PostgreSQL\u0026logoColor=4169E1\"/\u003e\n  \u003cimg src=\"https://img.shields.io/badge/JWT-FFFFFF?style=for-the-badge\u0026logo=JSON%20web%20tokens\u0026logoColor=black\"/\u003e\n  \u003cimg src=\"https://img.shields.io/badge/pytest-FFFFFF?style=for-the-badge\u0026logo=pytest\u0026logoColor=0A9EDC\"/\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Docker-FFFFFF?style=for-the-badge\u0026logo=Docker\u0026logoColor=2496ED\"/\u003e\n\u003c/div\u003e\n\n\u003cbr\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eОписание проекта\u003c/strong\u003e\u003c/summary\u003e\n\u003cbr\u003e\u003cbr\u003e\nRESTful API для управления библиотечным каталогом. Система позволяет управлять информацией о книгах, авторах, читателях и выдачей книг.\n\u003cbr\u003e\n\n - Регистрация и Аутентификация пользователей с использованием JWT токенов по email. Пользователи разделены на роли: администратор и читатель. Первому зарегистрированному пользователю присваивается роль администратора, всем последующим - читатель. Администратор может изменять роли пользователей. Администратор может управлять всеми ресурсами, читатель — только просмотр и взаимодействие с книгами.\n\n - Управление книгами. CRUD операции для книг.\n\n - Управление авторами. CRUD операции для авторов.\n\n - Управление читателями. Администратор может просматривать список читателей. Читатели могут обновлять свою информацию.\n\n - Выдача и возврат книг. Возможность выдачи книги читателю. Ограничение количества выдаваемых книг на одного читателя до 5. Фиксация даты выдачи и предполагаемой даты возврата. Обработка возврата книг и обновление количества доступных экземпляров.\n\n - Дополнительно:\n   - Пагинация и фильтрация для списков книг, авторов и выданных книг.\n   - Валидация входящих данных с использованием Pydantic.\n   - Обработка ошибок с соответствующими HTTP статусами.\n   - Логирование основных событий.\n   - Alembic для управления миграциями базы данных.\n   - Юнит-тесты для основных эндпоинтов.\n   - Документация ReDoc, Swagger.\n   - Развертывание проекта с помощью Docker.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eКак запустить проект\u003c/strong\u003e\u003c/summary\u003e\n\n##### Клонировать репозиторий и перейти в него в командной строке:\n\n```bash\n$ git clone https://github.com/Excellent-84/library_api.git\n$ cd library_api\n```\n\n##### Создать файл .env и указать необходимые токены по примеру .env.example:\n\n```bash\n$ touch .env\n```\n\n##### Собрать и запустить контейнеры с помощью Docker:\n\n```bash\n$ docker compose up -d\n```\n\n##### При необходимости проверить логи запущенного контейнера:\n\n```bash\n$ docker logs library_api\n```\n\n##### Проект будет доступен по адресу:\n\n```bash\nhttp://localhost:8000\n```\n\n##### Тестирование. Запуск тестов pytest внутри контейнера:\n\n```bash\n$ docker exec -it library_api pytest\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eПримеры запросов к API с помощью Postman\u003c/strong\u003e\u003c/summary\u003e\n\n##### Регистрация пользователя в базе данных:\n\nМетод POST к эндпоинту   http://localhost:8000/users/register/\n\nВо вкладке Body выбрать raw. Указать данные в формате json.\nПример запроса:\n\n```bash\n{\n  \"email\": \"example@example.com\",\n  \"username\": \"example_user\",\n  \"password\": \"example_password\"\n}\n```\n\nПример ответа:\n\n```bash\n{\n  \"email\": \"example@example.com\",\n  \"id\": 1,\n  \"username\": \"example_user\",\n  \"is_active\": true,\n  \"role\": \"reader\"\n}\n```\n\n##### Аутентификация пользователя:\n\nМетод POST к эндпоинту   http://localhost:8000/users/login/\n\nВо вкладке Body выбрать raw. Указать данные в формате json.\nСрок действия токена 30 минут, после чего необходимо пройти повторную аутентификацию.\nПример запроса:\n\n```bash\n{\n  \"email\": \"example@example.com\",\n  \"password\": \"example_password\"\n}\n```\n\nПример ответа:\n\n```bash\n{\n  \"access_token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6Ik...\",\n  \"token_type\": \"bearer\"\n}\n```\n\n##### Получение списка доступных книг:\n\nМетод GET к эндпоинту   http://localhost:8000/books/\n\nВо вкладке Auth в поле Type выбрать Bearer Token.\nВ поле Token скопировать значение access_token, полученного при аутентификации.\n\nПример ответа:\n\n```bash\n[\n  {\n    \"title\": \"Война и Мир\",\n    \"description\": \"Роман, описывающий...\",\n    \"publication_date\": \"1869-01-01\",\n    \"genre\": \"Роман\",\n    \"available_copies\": 5,\n    \"id\": 1,\n    \"authors\": [\n      \"Лев Толстой\"\n    ]\n  },\n  ...\n]\n```\n\n##### Получение книги по ID:\n\nМетод GET к эндпоинту   http://localhost:8000/books/{book_id}/\n\nВо вкладке Auth в поле Type выбрать Bearer Token.\nВ поле Token скопировать значение access_token, полученного при аутентификации.\n\nПример ответа:\n\n```bash\n{\n  \"title\": \"Война и Мир\",\n  \"description\": \"Роман, описывающий...\",\n  \"publication_date\": \"1869-01-01\",\n  \"genre\": \"Роман\",\n  \"available_copies\": 5,\n  \"id\": 1,\n  \"authors\": [\n    \"Лев Толстой\"\n  ]\n}\n```\n\n##### Выдача книги:\n\nМетод POST к эндпоинту   http://localhost:8000/rebooks/\n\nВо вкладке Auth в поле Type выбрать Bearer Token.\nВ поле Token скопировать значение access_token, полученного при аутентификации.\nВо вкладке Body выбрать raw. Указать данные в формате json.\nПример запроса:\n\n```bash\n{\n  \"book_id\": 1\n}\n```\n\nПример ответа:\n\n```bash\n{\n  \"book_id\": 1,\n  \"id\": 101,\n  \"borrowed_at\": \"2025-02-02T10:00:00\",\n  \"due_date\": \"2025-02-16T10:00:00\",\n  \"returned_at\": \"2025-02-14T15:00:00\",\n  \"user_id\": 42\n}\n```\n\n##### Возврат книги:\n\nМетод POST к эндпоинту   http://localhost:8000/rebooks/return/\n\nВо вкладке Auth в поле Type выбрать Bearer Token.\nВ поле Token скопировать значение access_token, полученного при аутентификации.\nВо вкладке Body выбрать raw. Указать данные в формате json.\nПример запроса:\n\n```bash\n{\n  \"book_id\": 1\n}\n```\n\nПример ответа:\n\n```bash\n{\n  \"book_id\": 1,\n  \"id\": 101,\n  \"borrowed_at\": \"2025-02-02T10:00:00\",\n  \"due_date\": \"2025-02-16T10:00:00\",\n  \"returned_at\": \"2025-02-14T15:00:00\",\n  \"user_id\": 42\n}\n```\n\n\u003cbr\u003e\n\n\u003cstrong\u003eПодробную версию запросов можно посмотреть по адресу:\u003c/strong\u003e\n- Swagger: [http://localhost:8000/docs](http://localhost:8000/docs)\n- ReDoc: [http://localhost:8000/redoc](http://localhost:8000/redoc)\n\n\u003c/details\u003e\n\n\u003cbr\u003e\n\n\u003cstrong\u003eАвтор: [Горин Евгений](https://github.com/Excellent-84)\u003c/strong\u003e","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fexcellent-84%2Flibrary_api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fexcellent-84%2Flibrary_api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fexcellent-84%2Flibrary_api/lists"}