# Marketing Parser Spring Boot service behind the KonturAI marketing platform. It ingests business news from RSS sources, runs AI-driven marketing analysis and strategy generation over that corpus, renders the results as PDF/DOCX/Markdown reports, and publishes campaign content to social networks. - **Java 21** · **Spring Boot 3.5.5** · **MongoDB** · **MinIO** - AI providers: **OpenAI**, **Ollama** (self-hosted), **Google Vertex AI** (Imagen/Veo) - Deployed via **Gitea Actions** to a self-hosted Docker runner --- ## Quick start ```bash # 1. Provide configuration (see docs/configuration.md) cp .env.example .env $EDITOR .env # fill in every REQUIRED value # 2. Supply the Google service-account key (only for image/video generation) cp /secure/path/google-key.json src/main/resources/keys/google-key.json # 3. Run set -a && source .env && set +a ./mvnw spring-boot:run ``` The service listens on `http://localhost:8080`. Interactive API docs are at `http://localhost:8080/swagger-ui.html`, health at `/api/parser/health`. > The application **fails fast at startup** if a required secret is missing. That is > deliberate — see [docs/configuration.md](docs/configuration.md). ## Build and test ```bash ./mvnw clean verify # unit tests + JaCoCo coverage gate ./mvnw clean package # build the jar ``` Integration tests boot the full Spring context and need real MongoDB plus the environment variables above. They are opt-in: ```bash RUN_INTEGRATION_TESTS=true ./mvnw verify ``` `verify` enforces 80% line coverage on `PostingTaskService`, `JwtService` and `SocialMediaCredentialsService` (see the JaCoCo rule in `pom.xml`). ## Documentation | Guide | What it covers | | --- | --- | | [Architecture](docs/architecture.md) | Modules, request flow, data model, external dependencies | | [Configuration](docs/configuration.md) | Every environment variable, secret handling, local setup | | [Deployment](docs/deployment.md) | Gitea Actions pipeline, Docker image, server layout | | [Development](docs/development.md) | Conventions, testing, adding a parser or endpoint | | [Troubleshooting](docs/troubleshooting.md) | MongoDB, 401s, common startup failures | | [API reference](docs/api/README.md) | Per-domain endpoint documentation | | [RSS parsers](docs/rss-parsers.md) | Sources, scheduling, deduplication | | [Email reports](docs/email-reports.md) | Sending generated reports by email | | [Facebook setup](docs/facebook-setup.md) | App, page tokens and lead collection | Historical specs, superseded API revisions and design notes live in [docs/archive/](docs/archive/README.md). ## Repository layout ``` src/main/java/kz/konturai/parser/ ├── controller/ REST endpoints (15) + GlobalExceptionHandler ├── service/ Business logic (52) — parsers, AI, reports, posting, targeting ├── model/ MongoDB documents (21) ├── dto/ Request/response payloads (68) ├── repository/ Spring Data Mongo repositories (11) ├── config/ Beans, CORS, Swagger, async executors, typed properties ├── validator/ Request validation ├── enums/ Shared enumerations ├── exception/ Domain exceptions └── util/ Helpers deployment/ docker-compose for the production host docs/ Documentation (see table above) scripts/ Run helper and smoke-test scripts .gitea/workflows/ CI/CD pipeline ``` ## Security Never commit credentials. All secrets are supplied through environment variables and `src/main/resources/keys/google-key.json` is deliberately untracked. See [docs/configuration.md](docs/configuration.md#secret-handling) before adding any new configuration value.