2024-11-20 20:59:11 +00:00
|
|
|
# GraphQL API Backend
|
2021-08-20 23:17:15 +00:00
|
|
|
|
2024-11-20 20:59:11 +00:00
|
|
|
Backend service providing GraphQL API for content management system with reactions, ratings and comments.
|
2021-08-20 23:17:15 +00:00
|
|
|
|
2024-11-20 20:59:11 +00:00
|
|
|
## Core Features
|
2021-08-20 23:17:15 +00:00
|
|
|
|
2024-11-20 20:59:11 +00:00
|
|
|
### Shouts (Posts)
|
|
|
|
- CRUD operations via GraphQL mutations
|
|
|
|
- Rich filtering and sorting options
|
|
|
|
- Support for multiple authors and topics
|
|
|
|
- Rating system with likes/dislikes
|
|
|
|
- Comments and nested replies
|
|
|
|
- Bookmarks and following
|
2021-08-20 23:17:15 +00:00
|
|
|
|
2024-11-20 20:59:11 +00:00
|
|
|
### Reactions System
|
|
|
|
- `ReactionKind` types: LIKE, DISLIKE, COMMENT
|
|
|
|
- Rating calculation for shouts and comments
|
|
|
|
- User-specific reaction tracking
|
|
|
|
- Reaction stats and aggregations
|
|
|
|
- Nested comments support
|
|
|
|
|
|
|
|
### Authors & Topics
|
|
|
|
- Author profiles with stats
|
|
|
|
- Topic categorization and hierarchy
|
|
|
|
- Following system for authors/topics
|
|
|
|
- Activity tracking and stats
|
|
|
|
- Community features
|
|
|
|
|
|
|
|
## Tech Stack
|
|
|
|
|
|
|
|
- **(Python)[https://www.python.org/]** 3.12+
|
|
|
|
- **GraphQL** with [Ariadne](https://ariadnegraphql.org/)
|
|
|
|
- **(SQLAlchemy)[https://docs.sqlalchemy.org/en/20/orm/]**
|
|
|
|
- **(PostgreSQL)[https://www.postgresql.org/]/(SQLite)[https://www.sqlite.org/]** support
|
|
|
|
- **(Starlette)[https://www.starlette.io/]** for ASGI server
|
|
|
|
- **(Redis)[https://redis.io/]** for caching
|
|
|
|
|
|
|
|
## Development
|
|
|
|
|
2025-02-10 15:04:08 +00:00
|
|
|
### Prepare environment:
|
2023-11-27 08:12:42 +00:00
|
|
|
|
|
|
|
```shell
|
|
|
|
mkdir .venv
|
2025-02-09 14:18:01 +00:00
|
|
|
python3.12 -m venv venv
|
2025-02-10 15:04:08 +00:00
|
|
|
source venv/bin/activate
|
|
|
|
```
|
|
|
|
|
|
|
|
### Run server
|
|
|
|
|
|
|
|
First, certifcates are required to run the server.
|
2024-12-11 22:04:11 +00:00
|
|
|
|
2025-02-10 15:04:08 +00:00
|
|
|
```shell
|
2024-12-11 22:04:11 +00:00
|
|
|
mkcert -install
|
|
|
|
mkcert localhost
|
2025-02-10 15:04:08 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
Then, run the server:
|
|
|
|
|
|
|
|
```shell
|
|
|
|
python server.py dev
|
2022-06-14 05:41:40 +00:00
|
|
|
```
|
2024-08-09 06:37:06 +00:00
|
|
|
|
2024-11-20 20:59:11 +00:00
|
|
|
### Useful Commands
|
2024-08-09 06:37:06 +00:00
|
|
|
|
|
|
|
```shell
|
2024-11-20 20:59:11 +00:00
|
|
|
# Linting and import sorting
|
2025-02-10 15:04:08 +00:00
|
|
|
ruff check . --fix --select I
|
2024-11-20 20:59:11 +00:00
|
|
|
|
|
|
|
# Code formatting
|
2025-02-10 15:04:08 +00:00
|
|
|
ruff format . --line-length=120
|
2024-11-20 20:59:11 +00:00
|
|
|
|
|
|
|
# Run tests
|
2025-02-10 15:04:08 +00:00
|
|
|
pytest
|
2024-11-20 20:59:11 +00:00
|
|
|
|
|
|
|
# Type checking
|
2025-02-10 15:04:08 +00:00
|
|
|
mypy .
|
2024-08-09 06:37:06 +00:00
|
|
|
```
|
|
|
|
|
2024-11-20 20:59:11 +00:00
|
|
|
### Code Style
|
|
|
|
|
|
|
|
We use:
|
|
|
|
- Ruff for linting and import sorting
|
|
|
|
- Line length: 120 characters
|
|
|
|
- Python type hints
|
|
|
|
- Docstrings for public methods
|
|
|
|
|
|
|
|
### GraphQL Development
|
|
|
|
|
|
|
|
Test queries in GraphQL Playground at `http://localhost:8000`:
|
|
|
|
|
|
|
|
```graphql
|
|
|
|
# Example query
|
|
|
|
query GetShout($slug: String) {
|
|
|
|
get_shout(slug: $slug) {
|
|
|
|
id
|
|
|
|
title
|
|
|
|
main_author {
|
|
|
|
name
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|