core/README.md
Untone b5aa7032eb
All checks were successful
Deploy on push / deploy (push) Successful in 6s
docs+featured/unfeatured-upgrade
2025-06-19 11:28:48 +03:00

4.9 KiB

GraphQL API Backend

Version Python GraphQL Tests

PostgreSQL Redis txtai

Backend service providing GraphQL API for content management system with reactions, ratings and topics.

📚 Documentation

APIAPI Documentation AuthAuthentication Guide CacheCaching System FeaturesFeatures Overview

🚀 Core Features

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

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

Core: Python 3.12 • GraphQL • PostgreSQL • Redis • txtai Server: Starlette • Granian • Nginx Tools: SQLAlchemy • JWT • Pytest • Ruff Deploy: Dokku • Gitea • Glitchtip

🔧 Development

PRs Welcome Ruff Mypy

📦 Prepare environment:

python3.12 -m venv venv
source venv/bin/activate
pip install -r requirements.dev.txt

🚀 Run server

First, certificates are required to run the server with HTTPS.

mkcert -install
mkcert localhost

Then, run the server:

python -m granian main:app --interface asgi

Useful Commands

# Linting and import sorting
ruff check . --fix --select I

# Code formatting
ruff format . --line-length=120

# Run tests
pytest

# Type checking
mypy .

# dev run
python -m granian main:app --interface asgi

📝 Code Style

Line 120 Types Docs

Ruff for linting • 120 char lines • Type hints required • Docstrings for public methods

🔍 GraphQL Development

Test queries in GraphQL Playground at http://localhost:8000:

# Example query
query GetShout($slug: String) {
  get_shout(slug: $slug) {
    id
    title
    main_author {
      name
    }
  }
}

📊 Project Stats

Lines Files Coverage MIT

🤝 Contributing

ContributingRead the guide

We welcome contributions! Please read our contributing guide before submitting PRs.

📄 License

This project is licensed under the MIT License - see the LICENSE file for details.

Websitediscours.io GitHubSource Code


Made with ❤️ by the Discours Team

Made with Love Open Source