# Blog App (Coop) Blog, authentication, and content management service for the Rose Ash cooperative platform. Handles Ghost CMS integration, user auth, and admin settings. ## Architecture One of five 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 | | federation | 8004 | ActivityPub, fediverse social | ## 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 (+ re-export stubs for shared models) 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 templates/ # Jinja2 templates services/ # register_domain_services() — wires blog + calendar + market + cart shared/ # Submodule -> git.rose-ash.com/coop/shared.git ``` ## Cross-Domain Communication All inter-app communication uses typed service contracts (no HTTP APIs): - `services.calendar.*` — calendar/entry queries via CalendarService protocol - `services.market.*` — marketplace queries via MarketService protocol - `services.cart.*` — cart summary via CartService protocol - `services.federation.*` — AP publishing via FederationService protocol - `shared.services.navigation` — site navigation tree ## Domain Events - `auth/routes.py` emits `user.logged_in` via `shared.events.emit_event` - Ghost sync emits `post.published` / `post.updated` for federation ## Running ```bash 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 ```