This repository has been archived on 2026-02-24. You can view files and clone it. You cannot open issues or pull requests or push a commit.
giles 43bc03836d
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 44s
Update shared + glue submodule pointers (README additions)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 19:36:25 +00:00

Blog App (Coop)

Blog, authentication, and content management service for the Rose Ash cooperative platform. This is the primary "coop" app — it handles Ghost CMS integration, user auth, and admin settings.

Architecture

One of four Quart microservices sharing a single PostgreSQL database:

App Port Domain
blog (coop) 8000 Auth, blog, admin, menus, snippets
market 8001 Product browsing, Suma scraping
cart 8002 Shopping cart, checkout, orders
events 8003 Calendars, bookings, tickets

Structure

app.py                  # Application factory (create_base_app + blueprints)
path_setup.py           # Adds project root + app dir to sys.path
config/app-config.yaml  # App URLs, feature flags, SumUp config
models/                 # Blog-domain models
  ghost_content.py      #   Post, Tag, PostTag
  ghost_membership_entities.py  #   GhostNewsletter, UserNewsletter
  user.py               #   Re-export of shared User model
  magic_link.py         #   Re-export of shared MagicLink model
  kv.py                 #   Re-export of shared KeyValue model
  menu_item.py          #   MenuItem
  snippet.py            #   Snippet
  tag_group.py          #   TagGroup, TagGroupTag
bp/                     # Blueprints
  auth/                 #   Magic link login, account, newsletters
  blog/                 #   Post listing, Ghost CMS sync
  post/                 #   Single post view and admin
  admin/                #   Settings admin interface
  menu_items/           #   Navigation menu management
  snippets/             #   Reusable content snippets
  coop_api.py           #   Internal API (/internal/coop/*)
templates/              # Jinja2 templates
entrypoint.sh           # Docker entrypoint (runs alembic + starts server)
Dockerfile
shared/                 # Submodule → git.rose-ash.com/coop/shared.git
glue/                   # Submodule → git.rose-ash.com/coop/glue.git

Cross-App Integration

  • Login adoption: When a user logs in via magic link, auth/routes.py emits a user.logged_in domain event. The glue layer's login_handlers.py picks it up and adopts anonymous cart items + calendar entries.
  • Cart widget: Context processor fetches cart summary via internal_api.get("cart", "/internal/cart/summary").
  • Internal API: /internal/coop/ endpoints serve blog data to other apps.

Running

export DATABASE_URL_ASYNC=postgresql+asyncpg://user:pass@localhost/coop
export REDIS_URL=redis://localhost:6379/0
export SECRET_KEY=your-secret-key

alembic -c shared/alembic.ini upgrade head
hypercorn app:app --bind 0.0.0.0:8000

Docker

docker build -t blog .
docker run -p 8000:8000 --env-file .env blog
Description
No description provided
Readme 815 KiB
Languages
Python 62.2%
HTML 37.1%
Dockerfile 0.4%
Shell 0.3%