From 105733a0ce641976ae9532ca7279b44b7bae9895 Mon Sep 17 00:00:00 2001 From: aniebietafia Date: Wed, 24 Jun 2026 15:12:55 +0100 Subject: [PATCH] fix: Replaced stale imports of `com.extractor.unraveldocs` with `com.xtraction.api` Signed-off-by: aniebietafia --- .../api/auth/documentation/api_docs.md | 40 ++++++------ .../api/brokers/documentation/api_docs.md | 62 +++++++++---------- .../api_docs/COUPON_SYSTEM_DOCUMENTATION.md | 2 +- .../elasticsearch/documentation/api_docs.md | 38 ++++++------ .../metrics/dashboard/api_docs/api_docs.md | 8 +-- .../documentation/api_docs.md | 6 +- .../api/ratelimit/documentation/api_docs.md | 10 +-- .../subscription/documentation/api_docs.md | 44 ++++++------- .../api/team/documentation/api_docs.md | 2 +- .../api/user/documentation/api_docs.md | 32 +++++----- 10 files changed, 122 insertions(+), 122 deletions(-) diff --git a/src/main/java/com/xtraction/api/auth/documentation/api_docs.md b/src/main/java/com/xtraction/api/auth/documentation/api_docs.md index ea91efe..c48f048 100644 --- a/src/main/java/com/xtraction/api/auth/documentation/api_docs.md +++ b/src/main/java/com/xtraction/api/auth/documentation/api_docs.md @@ -1,7 +1,7 @@ # Auth Package — API Documentation > **Base URL:** `/api/v1/auth` -> **Package:** `com.extractor.unraveldocs.auth` +> **Package:** `com.xtraction.api.auth` > **Last Updated:** 2026-03-07 --- @@ -123,7 +123,7 @@ auth/ ### Enums #### `Role` -**Package:** `com.extractor.unraveldocs.auth.datamodel` +**Package:** `com.xtraction.api.auth.datamodel` Defines the authorization roles assignable to a user account. @@ -144,7 +144,7 @@ Defines the authorization roles assignable to a user account. --- #### `VerifiedStatus` -**Package:** `com.extractor.unraveldocs.auth.datamodel` +**Package:** `com.xtraction.api.auth.datamodel` Tracks the state of a user's email verification lifecycle. @@ -160,7 +160,7 @@ Tracks the state of a user's email verification lifecycle. ### Entities #### `UserVerification` -**Package:** `com.extractor.unraveldocs.auth.model` +**Package:** `com.xtraction.api.auth.model` **Table:** `user_verification` Stores all verification and password-reset token data for a `User`. Has a one-to-one relationship with the `User` entity. @@ -185,7 +185,7 @@ Stores all verification and password-reset token data for a `User`. Has a one-to ### Request DTOs #### `SignupRequestDto` -**Package:** `com.extractor.unraveldocs.auth.dto.request` +**Package:** `com.xtraction.api.auth.dto.request` | Field | Type | Required | Constraints | Example | |------------------------|-----------|----------|-------------------------------------------------------------------------------------|-------------------------| @@ -205,7 +205,7 @@ Stores all verification and password-reset token data for a `User`. Has a one-to --- #### `LoginRequestDto` -**Package:** `com.extractor.unraveldocs.auth.dto.request` +**Package:** `com.xtraction.api.auth.dto.request` | Field | Type | Required | Constraints | Example | |------------|----------|----------|--------------------|-----------------------| @@ -215,7 +215,7 @@ Stores all verification and password-reset token data for a `User`. Has a one-to --- #### `EmailVerificationRequestDto` -**Package:** `com.extractor.unraveldocs.auth.dto.request` +**Package:** `com.xtraction.api.auth.dto.request` | Field | Type | Required | Constraints | Example | |---------|----------|----------|--------------------|----------------------| @@ -225,7 +225,7 @@ Stores all verification and password-reset token data for a `User`. Has a one-to --- #### `ResendEmailVerificationDto` -**Package:** `com.extractor.unraveldocs.auth.dto.request` +**Package:** `com.xtraction.api.auth.dto.request` | Field | Type | Required | Constraints | Example | |---------|----------|----------|------------------------|-----------------------| @@ -234,14 +234,14 @@ Stores all verification and password-reset token data for a `User`. Has a one-to --- #### `RefreshTokenRequest` -**Package:** `com.extractor.unraveldocs.auth.dto.request` +**Package:** `com.xtraction.api.auth.dto.request` > ⚠️ **Deprecated:** The refresh token is now read from an HttpOnly cookie, not from the request body. This DTO is retained for backward compatibility but its fields are no longer required. --- #### `GeneratePasswordDto` -**Package:** `com.extractor.unraveldocs.auth.dto.request` +**Package:** `com.xtraction.api.auth.dto.request` | Field | Type | Required | Constraints | Example | |------------------|----------|----------|------------------------------------------------|---------------| @@ -699,7 +699,7 @@ No response body. ## Service Layer ### `AuthService` (Facade) -**Package:** `com.extractor.unraveldocs.auth.service` +**Package:** `com.xtraction.api.auth.service` A thin orchestration layer that delegates every operation to the appropriate interface implementation. Controllers depend only on `AuthService`, keeping them decoupled from implementation details. @@ -717,7 +717,7 @@ A thin orchestration layer that delegates every operation to the appropriate int --- ### `SignupUserImpl` -**Package:** `com.extractor.unraveldocs.auth.impl` +**Package:** `com.xtraction.api.auth.impl` **Implements:** `SignupUserService` **Transactional:** Yes (`@Transactional`) @@ -742,7 +742,7 @@ A thin orchestration layer that delegates every operation to the appropriate int --- ### `LoginUserImpl` -**Package:** `com.extractor.unraveldocs.auth.impl` +**Package:** `com.xtraction.api.auth.impl` **Implements:** `LoginUserService` **Login sequence:** @@ -767,7 +767,7 @@ A thin orchestration layer that delegates every operation to the appropriate int --- ### `EmailVerificationImpl` -**Package:** `com.extractor.unraveldocs.auth.impl` +**Package:** `com.xtraction.api.auth.impl` **Implements:** `EmailVerificationService` **Transactional:** Yes (`@Transactional`) @@ -798,7 +798,7 @@ Handles two operations: --- ### `GeneratePasswordImpl` -**Package:** `com.extractor.unraveldocs.auth.impl` +**Package:** `com.xtraction.api.auth.impl` **Implements:** `GeneratePasswordService` **Logic:** @@ -813,7 +813,7 @@ Handles two operations: --- ### `RefreshTokenImpl` -**Package:** `com.extractor.unraveldocs.auth.impl` +**Package:** `com.xtraction.api.auth.impl` **Implements:** `RefreshTokenService` (auth.interfaces) **`refreshToken(RefreshTokenRequest)`** @@ -841,7 +841,7 @@ Handles two operations: --- ### `CustomUserDetailsService` -**Package:** `com.extractor.unraveldocs.auth.service` +**Package:** `com.xtraction.api.auth.service` **Implements:** `UserDetailsService`, `UserEntityById` | Method | Description | @@ -856,7 +856,7 @@ Handles two operations: The auth package publishes events to Kafka after successful database commits using `TransactionSynchronizationManager.registerSynchronization`. This guarantees that events are only emitted when the database state has been committed, preventing ghost notifications on rollback. ### `UserRegisteredEvent` -**Package:** `com.extractor.unraveldocs.auth.events` +**Package:** `com.xtraction.api.auth.events` **Published by:** `SignupUserImpl`, `EmailVerificationImpl` (resend flow) | Field | Type | Description | @@ -870,7 +870,7 @@ The auth package publishes events to Kafka after successful database commits usi --- ### `WelcomeEvent` -**Package:** `com.extractor.unraveldocs.auth.events` +**Package:** `com.xtraction.api.auth.events` **Published by:** `EmailVerificationImpl` (after successful verification) | Field | Type | Description | @@ -882,7 +882,7 @@ The auth package publishes events to Kafka after successful database commits usi --- ### `UserRegisteredEventHandler` -**Package:** `com.extractor.unraveldocs.auth.components` +**Package:** `com.xtraction.api.auth.components` **Implements:** `EventHandler` **Event Type:** `EventTypes.USER_REGISTERED` diff --git a/src/main/java/com/xtraction/api/brokers/documentation/api_docs.md b/src/main/java/com/xtraction/api/brokers/documentation/api_docs.md index 04244d3..26a8848 100644 --- a/src/main/java/com/xtraction/api/brokers/documentation/api_docs.md +++ b/src/main/java/com/xtraction/api/brokers/documentation/api_docs.md @@ -1,6 +1,6 @@ # Brokers Package — Documentation -> **Package:** `com.extractor.unraveldocs.brokers` +> **Package:** `com.xtraction.api.brokers` > **Last Updated:** February 26, 2026 --- @@ -175,7 +175,7 @@ EmailOrchestratorService ## Core Abstractions ### `Message` -**Package:** `com.extractor.unraveldocs.brokers.core` +**Package:** `com.xtraction.api.brokers.core` A generic, immutable message record that wraps any payload for sending across any broker. @@ -203,7 +203,7 @@ public record Message( --- ### `MessageProducer` -**Package:** `com.extractor.unraveldocs.brokers.core` +**Package:** `com.xtraction.api.brokers.core` Interface all producer implementations must satisfy. @@ -218,7 +218,7 @@ Interface all producer implementations must satisfy. --- ### `MessageConsumer` -**Package:** `com.extractor.unraveldocs.brokers.core` +**Package:** `com.xtraction.api.brokers.core` Marker interface defining what a consumer must expose, plus two nested functional interfaces for processing callbacks. @@ -233,7 +233,7 @@ Marker interface defining what a consumer must expose, plus two nested functiona --- ### `MessageResult` -**Package:** `com.extractor.unraveldocs.brokers.core` +**Package:** `com.xtraction.api.brokers.core` Immutable record returned by every send operation. @@ -259,7 +259,7 @@ Immutable record returned by every send operation. --- ### `MessageBrokerFactory` -**Package:** `com.extractor.unraveldocs.brokers.core` +**Package:** `com.xtraction.api.brokers.core` Spring `@Component` that auto-discovers all `MessageProducer` beans and registers them in an `EnumMap>`. @@ -277,7 +277,7 @@ Spring `@Component` that auto-discovers all `MessageProducer` beans and regis --- ### `MessageBrokerType` -**Package:** `com.extractor.unraveldocs.brokers.core` +**Package:** `com.xtraction.api.brokers.core` | Value | Description | |---|---| @@ -287,7 +287,7 @@ Spring `@Component` that auto-discovers all `MessageProducer` beans and regis --- ### `MessagingException` -**Package:** `com.extractor.unraveldocs.brokers.core` +**Package:** `com.xtraction.api.brokers.core` `RuntimeException` subclass that wraps broker-specific errors. Carries the broker type, message ID, and topic for contextual error reporting. @@ -306,7 +306,7 @@ Spring `@Component` that auto-discovers all `MessageProducer` beans and regis ## Kafka Configuration ### `MessagingProperties` -**Package:** `com.extractor.unraveldocs.brokers.config` +**Package:** `com.xtraction.api.brokers.config` **Prefix:** `messaging` Top-level configuration object. All sub-properties are nested classes. @@ -366,7 +366,7 @@ Top-level configuration object. All sub-properties are nested classes. --- ### `KafkaProducerConfig` -**Package:** `com.extractor.unraveldocs.brokers.kafka.config` +**Package:** `com.xtraction.api.brokers.kafka.config` **Conditional:** `@ConditionalOnProperty(name = "spring.kafka.bootstrap-servers")` Configures the `ProducerFactory` and `KafkaTemplate`. @@ -390,7 +390,7 @@ Configures the `ProducerFactory` and `KafkaTemplate`, `ConcurrentKafkaListenerContainerFactory`, and the `DefaultErrorHandler`. @@ -404,7 +404,7 @@ Configures `ConsumerFactory`, `ConcurrentKafkaListenerContainerF | Auto-offset reset | `spring.kafka.consumer.auto-offset-reset` | `"earliest"` | Read from beginning on new group | | Auto commit | `spring.kafka.consumer.enable-auto-commit` | `false` | Manual acknowledgment mode | | Key deserializer | — | `ErrorHandlingDeserializer` | Wraps errors without crashing the consumer | -| Value deserializer | — | `ErrorHandlingDeserializer` | JSON with `com.extractor.unraveldocs.*` trusted packages | +| Value deserializer | — | `ErrorHandlingDeserializer` | JSON with `com.xtraction.api.*` trusted packages | | Type info headers | — | `true` | Uses `__TypeId__` header for polymorphic deserialization | | Ack mode | — | `MANUAL_IMMEDIATE` | Consumer calls `acknowledgment.acknowledge()` explicitly | | Concurrency | `messaging.kafka.consumer.concurrency` | `3` | Parallel listener threads | @@ -418,7 +418,7 @@ Configures `ConsumerFactory`, `ConcurrentKafkaListenerContainerF --- ### `KafkaTopicConfig` -**Package:** `com.extractor.unraveldocs.brokers.kafka.config` +**Package:** `com.xtraction.api.brokers.kafka.config` **Conditional:** `@ConditionalOnProperty(name = "spring.kafka.bootstrap-servers")` Declares all Kafka topics as Spring `@Bean`s. Topics are auto-created by the Kafka Admin client on application startup if they do not already exist. @@ -428,7 +428,7 @@ See the full [Topics Reference](#topics-reference) section below. --- ### `EventHandlerConfiguration` -**Package:** `com.extractor.unraveldocs.brokers.kafka.config` +**Package:** `com.xtraction.api.brokers.kafka.config` **Conditional:** `@ConditionalOnProperty(name = "spring.kafka.bootstrap-servers")` Scans the Spring context for all `EventHandler` beans and builds: @@ -495,7 +495,7 @@ All topic names share the prefix `unraveldocs-`. Topics are organized into three ## Event System ### `BaseEvent` & `EventMetadata` -**Package:** `com.extractor.unraveldocs.brokers.kafka.events` +**Package:** `com.xtraction.api.brokers.kafka.events` `BaseEvent` is the envelope for all strongly-typed events published via `EventPublisherService`. It separates routing metadata from the business payload. @@ -531,7 +531,7 @@ eventPublisherService.publishUserEvent(event); --- ### `EventTypes` -**Package:** `com.extractor.unraveldocs.brokers.kafka.events` +**Package:** `com.xtraction.api.brokers.kafka.events` String constant class — all values are used as the `event-type` Kafka header. Consumers use these strings as map keys for `EventHandler` dispatch. @@ -575,7 +575,7 @@ String constant class — all values are used as the `event-type` Kafka header. --- ### `EventHandler` -**Package:** `com.extractor.unraveldocs.brokers.kafka.events` +**Package:** `com.xtraction.api.brokers.kafka.events` Simple two-method interface that all event handler components implement. @@ -591,7 +591,7 @@ All `@Component` implementations are auto-registered by `EventHandlerConfigurati --- ### `EventPublisherService` -**Package:** `com.extractor.unraveldocs.brokers.kafka.events` +**Package:** `com.xtraction.api.brokers.kafka.events` **Conditional:** `@ConditionalOnProperty(name = "spring.kafka.bootstrap-servers")` Thin routing layer over `MessageBrokerFactory`. Wraps `BaseEvent` into a `Message`, adds the `event-type` header, uses `correlationId` as the Kafka message key (for partition ordering), and fires async. @@ -612,7 +612,7 @@ On failure: logs error and throws `MessagingException.sendFailed(...)`. ## Kafka Producer ### `KafkaMessageProducer` -**Package:** `com.extractor.unraveldocs.brokers.kafka.producer` +**Package:** `com.xtraction.api.brokers.kafka.producer` **Implements:** `MessageProducer` **Conditional:** `@ConditionalOnProperty(name = "spring.kafka.bootstrap-servers")` @@ -653,7 +653,7 @@ The concrete Kafka implementation of the `MessageProducer` interface. All broker ## Kafka Consumer ### `EmailKafkaConsumer` -**Package:** `com.extractor.unraveldocs.brokers.kafka.consumer` +**Package:** `com.xtraction.api.brokers.kafka.consumer` **Topic:** `unraveldocs-emails` **Group ID:** `email-consumer-group` **Ack Mode:** `MANUAL_IMMEDIATE` @@ -677,7 +677,7 @@ The dedicated consumer for the email delivery pipeline. ## Message Schemas ### `EmailNotificationMessage` -**Package:** `com.extractor.unraveldocs.brokers.messages` +**Package:** `com.xtraction.api.brokers.messages` ``` EmailNotificationMessage @@ -705,7 +705,7 @@ EmailNotificationMessage --- ### `DocumentProcessingMessage` -**Package:** `com.extractor.unraveldocs.brokers.messages` +**Package:** `com.xtraction.api.brokers.messages` ``` DocumentProcessingMessage @@ -732,7 +732,7 @@ DocumentProcessingMessage --- ### `PaymentEventMessage` -**Package:** `com.extractor.unraveldocs.brokers.messages` +**Package:** `com.xtraction.api.brokers.messages` ``` PaymentEventMessage @@ -775,7 +775,7 @@ PaymentEventMessage --- ### `UserEventMessage` -**Package:** `com.extractor.unraveldocs.brokers.messages` +**Package:** `com.xtraction.api.brokers.messages` ``` UserEventMessage @@ -820,7 +820,7 @@ UserEventMessage These services are the public API that all other packages use to interact with the broker. They abstract away `Message` construction and Kafka topic routing. ### `EmailMessageProducerService` -**Package:** `com.extractor.unraveldocs.brokers.service` +**Package:** `com.xtraction.api.brokers.service` | Method | Priority | Description | |---|---|---| @@ -841,7 +841,7 @@ All methods return `CompletableFuture`. Callers may chain `.thenA --- ### `DocumentProcessingProducerService` -**Package:** `com.extractor.unraveldocs.brokers.service` +**Package:** `com.xtraction.api.brokers.service` | Method | Processing Type | Priority | Description | |---|---|---|---| @@ -854,7 +854,7 @@ All methods return `CompletableFuture`. Documents are keyed by `d --- ### `PaymentEventProducerService` -**Package:** `com.extractor.unraveldocs.brokers.service` +**Package:** `com.xtraction.api.brokers.service` | Method | Event Type | Description | |---|---|---| @@ -869,7 +869,7 @@ All methods return `CompletableFuture`. Payment events are keyed ## Error Handling & Retry Strategy ### `KafkaErrorHandler` -**Package:** `com.extractor.unraveldocs.brokers.kafka.handler` +**Package:** `com.xtraction.api.brokers.kafka.handler` **Conditional:** `@ConditionalOnProperty(name = "spring.kafka.bootstrap-servers")` Programmatic DLQ handler that can be called by consumer code directly (as opposed to the framework's `DefaultErrorHandler`). @@ -933,7 +933,7 @@ Message received by @KafkaListener ## Observability ### `KafkaMetrics` -**Package:** `com.extractor.unraveldocs.brokers.kafka.metrics` +**Package:** `com.xtraction.api.brokers.kafka.metrics` **Conditional:** `@ConditionalOnProperty(name = "spring.kafka.bootstrap-servers")` Micrometer-based metrics. All metrics are per-topic, lazily initialized in `ConcurrentHashMap` caches. @@ -971,7 +971,7 @@ Metrics are visible via Spring Boot Actuator at `GET /actuator/metrics/kafka.mes --- ### `KafkaHealthIndicator` -**Package:** `com.extractor.unraveldocs.brokers.kafka.health` +**Package:** `com.xtraction.api.brokers.kafka.health` **Conditional:** `@ConditionalOnProperty(name = "spring.kafka.bootstrap-servers")` + `@ConditionalOnClass(KafkaAdmin.class)` Uses Kafka `AdminClient` to describe the cluster. Times out after 10 seconds. @@ -994,7 +994,7 @@ Uses Kafka `AdminClient` to describe the cluster. Times out after 10 seconds. --- ### `KafkaHealthEndpoint` -**Package:** `com.extractor.unraveldocs.brokers.kafka.health` +**Package:** `com.xtraction.api.brokers.kafka.health` **Actuator ID:** `kafka` **Path:** `GET /actuator/kafka` diff --git a/src/main/java/com/xtraction/api/coupon/api_docs/COUPON_SYSTEM_DOCUMENTATION.md b/src/main/java/com/xtraction/api/coupon/api_docs/COUPON_SYSTEM_DOCUMENTATION.md index b5a13f6..8dcf8c0 100644 --- a/src/main/java/com/xtraction/api/coupon/api_docs/COUPON_SYSTEM_DOCUMENTATION.md +++ b/src/main/java/com/xtraction/api/coupon/api_docs/COUPON_SYSTEM_DOCUMENTATION.md @@ -317,7 +317,7 @@ coupon.expiration.check.cron=0 0 9 * * ? ```bash # Run all coupon tests -mvn test -Dtest="com.extractor.unraveldocs.coupon.**" +mvn test -Dtest="com.xtraction.api.coupon.**" # Run specific test class mvn test -Dtest="CouponServiceImplTest" diff --git a/src/main/java/com/xtraction/api/elasticsearch/documentation/api_docs.md b/src/main/java/com/xtraction/api/elasticsearch/documentation/api_docs.md index 56f08a3..d9877b7 100644 --- a/src/main/java/com/xtraction/api/elasticsearch/documentation/api_docs.md +++ b/src/main/java/com/xtraction/api/elasticsearch/documentation/api_docs.md @@ -1,6 +1,6 @@ # Elasticsearch Package — Documentation -> **Package:** `com.extractor.unraveldocs.elasticsearch` +> **Package:** `com.xtraction.api.elasticsearch` > **Base URLs:** > - User Search: `/api/v1/search` > - Admin Search: `/api/v1/admin/search` @@ -178,9 +178,9 @@ elasticsearch/ ## Configuration ### `ElasticsearchConfig` -**Package:** `com.extractor.unraveldocs.elasticsearch.config` +**Package:** `com.xtraction.api.elasticsearch.config` **Conditional:** `@ConditionalOnProperty(name = "spring.elasticsearch.uris")` -**Enables:** `@EnableElasticsearchRepositories(basePackages = "com.extractor.unraveldocs.elasticsearch.repository")` +**Enables:** `@EnableElasticsearchRepositories(basePackages = "com.xtraction.api.elasticsearch.repository")` Manually constructs the Elasticsearch Java client stack (bypassing Spring Boot autoconfiguration) to allow full control over connection parameters. @@ -218,7 +218,7 @@ ElasticsearchTemplate(client) ← implements ElasticsearchOperations ### `DocumentSearchIndex` **Index name:** `documents` **Settings:** `/elasticsearch/document-settings.json` -**Package:** `com.extractor.unraveldocs.elasticsearch.document` +**Package:** `com.xtraction.api.elasticsearch.document` Combines `FileEntry` metadata with OCR-extracted text from `OcrData` into a single flat Elasticsearch document. @@ -245,7 +245,7 @@ Combines `FileEntry` metadata with OCR-extracted text from `OcrData` into a sing ### `UserSearchIndex` **Index name:** `users` -**Package:** `com.extractor.unraveldocs.elasticsearch.document` +**Package:** `com.xtraction.api.elasticsearch.document` Snapshot of a user's profile, role, subscription, and activity. Used exclusively by admin search. @@ -275,7 +275,7 @@ Snapshot of a user's profile, role, subscription, and activity. Used exclusively ### `PaymentSearchIndex` **Index name:** `payments` -**Package:** `com.extractor.unraveldocs.elasticsearch.document` +**Package:** `com.xtraction.api.elasticsearch.document` Snapshot of a `Receipt` entity enriched with user data. All receipts are indexed as `status = "COMPLETED"` since receipts are only created for successful payments. @@ -307,7 +307,7 @@ Snapshot of a `Receipt` entity enriched with user data. All receipts are indexed ## Events & Enums ### `ElasticsearchIndexEvent` -**Package:** `com.extractor.unraveldocs.elasticsearch.events` +**Package:** `com.xtraction.api.elasticsearch.events` Serializable event envelope published to Kafka for async index processing. @@ -331,7 +331,7 @@ ElasticsearchIndexEvent --- ### `IndexAction` -**Package:** `com.extractor.unraveldocs.elasticsearch.events` +**Package:** `com.xtraction.api.elasticsearch.events` | Value | Description | |---|---| @@ -342,7 +342,7 @@ ElasticsearchIndexEvent --- ### `IndexType` -**Package:** `com.extractor.unraveldocs.elasticsearch.events` +**Package:** `com.xtraction.api.elasticsearch.events` | Value | ES Index | Repository | |---|---|---| @@ -356,7 +356,7 @@ ElasticsearchIndexEvent ## Publisher ### `ElasticsearchEventPublisher` -**Package:** `com.extractor.unraveldocs.elasticsearch.publisher` +**Package:** `com.xtraction.api.elasticsearch.publisher` **Conditional:** `@ConditionalOnProperty(name = "spring.elasticsearch.uris")` Wraps `MessageBrokerFactory` to publish `ElasticsearchIndexEvent`s to the `unraveldocs-elasticsearch` Kafka topic. Uses `documentId` as the Kafka message key for partition ordering (all events for the same document land in the same partition, preserving causal order). @@ -389,7 +389,7 @@ MessageBrokerFactory.getProducer(KAFKA).send(message) ← async CompletableFut ## Consumer ### `ElasticsearchIndexConsumer` -**Package:** `com.extractor.unraveldocs.elasticsearch.consumer` +**Package:** `com.xtraction.api.elasticsearch.consumer` **Topic:** `unraveldocs-elasticsearch` **Group ID:** `elasticsearch-consumer-group` **Ack Mode:** `MANUAL_IMMEDIATE` @@ -428,7 +428,7 @@ handleIndexEvent(ElasticsearchIndexEvent, Acknowledgment) ## Services ### `ElasticsearchIndexingService` -**Package:** `com.extractor.unraveldocs.elasticsearch.service` +**Package:** `com.xtraction.api.elasticsearch.service` **Conditional:** `@ConditionalOnProperty(name = "spring.elasticsearch.uris")` The **primary domain-facing facade** for indexing. Called by `SignupUserImpl`, `ChangePasswordImpl`, document upload services, payment services, etc. Maps JPA entities to index documents and delegates to `ElasticsearchEventPublisher`. @@ -461,7 +461,7 @@ The **primary domain-facing facade** for indexing. Called by `SignupUserImpl`, ` --- ### `ElasticsearchSyncService` -**Package:** `com.extractor.unraveldocs.elasticsearch.service` +**Package:** `com.xtraction.api.elasticsearch.service` **Conditional:** `@ConditionalOnProperty(name = "spring.elasticsearch.uris")` Handles **bulk re-indexing** of existing PostgreSQL data into Elasticsearch. Used for initial migration and recovery scenarios. Reads in pages of 100 records (`BATCH_SIZE = 100`) to avoid OOM. @@ -494,7 +494,7 @@ Handles **bulk re-indexing** of existing PostgreSQL data into Elasticsearch. Use --- ### `DocumentSearchService` -**Package:** `com.extractor.unraveldocs.elasticsearch.service` +**Package:** `com.xtraction.api.elasticsearch.service` **Conditional:** `@ConditionalOnProperty(name = "spring.elasticsearch.uris")` Handles document search and individual document index operations for authenticated users. @@ -524,7 +524,7 @@ Handles document search and individual document index operations for authenticat --- ### `UserSearchService` -**Package:** `com.extractor.unraveldocs.elasticsearch.service` +**Package:** `com.xtraction.api.elasticsearch.service` **Conditional:** `@ConditionalOnProperty(name = "spring.elasticsearch.uris")` Handles user search for admin dashboards. Supports query + filter combinations. @@ -556,7 +556,7 @@ Handles user search for admin dashboards. Supports query + filter combinations. --- ### `PaymentSearchService` -**Package:** `com.extractor.unraveldocs.elasticsearch.service` +**Package:** `com.xtraction.api.elasticsearch.service` **Conditional:** `@ConditionalOnProperty(name = "spring.elasticsearch.uris")` Handles payment search for admin oversight. @@ -641,7 +641,7 @@ All three repositories extend `ElasticsearchRepository` which ## DTOs ### `SearchRequest` -**Package:** `com.extractor.unraveldocs.elasticsearch.dto` +**Package:** `com.xtraction.api.elasticsearch.dto` Generic, reusable search request used across all three search services. @@ -660,7 +660,7 @@ Generic, reusable search request used across all three search services. --- ### `SearchResponse` -**Package:** `com.extractor.unraveldocs.elasticsearch.dto` +**Package:** `com.xtraction.api.elasticsearch.dto` Generic, pageable search response wrapping any index document type. @@ -683,7 +683,7 @@ Generic, pageable search response wrapping any index document type. --- ### `DocumentSearchResult` -**Package:** `com.extractor.unraveldocs.elasticsearch.dto` +**Package:** `com.xtraction.api.elasticsearch.dto` Enriched result DTO used specifically for document search — adds text preview and highlights list. diff --git a/src/main/java/com/xtraction/api/metrics/dashboard/api_docs/api_docs.md b/src/main/java/com/xtraction/api/metrics/dashboard/api_docs/api_docs.md index beb4442..c6fdc50 100644 --- a/src/main/java/com/xtraction/api/metrics/dashboard/api_docs/api_docs.md +++ b/src/main/java/com/xtraction/api/metrics/dashboard/api_docs/api_docs.md @@ -1,7 +1,7 @@ # Dashboard Metrics Package — API Documentation > **Base URL:** `/api/v1/admin/dashboard` -> **Package:** `com.extractor.unraveldocs.metrics.dashboard` +> **Package:** `com.xtraction.api.metrics.dashboard` > **Last Updated:** 2026-03-24 --- @@ -53,7 +53,7 @@ metrics/dashboard/ ### Response DTOs #### `DashboardKpiStatsDto` -**Package:** `com.extractor.unraveldocs.metrics.dashboard.dto` +**Package:** `com.xtraction.api.metrics.dashboard.dto` Returned inside `XtractionResponse` when fetching stats. | Section | Field | Type | Description | @@ -147,12 +147,12 @@ All endpoints are prefixed with `/api/v1/admin/dashboard`. Role-based access con ## Service Layer ### `DashboardMetricsService` -**Package:** `com.extractor.unraveldocs.metrics.dashboard.service` +**Package:** `com.xtraction.api.metrics.dashboard.service` Contract for fetching dashboard metrics. ### `DashboardMetricsServiceImpl` -**Package:** `com.extractor.unraveldocs.metrics.dashboard.service.impl` +**Package:** `com.xtraction.api.metrics.dashboard.service.impl` **Implements:** `DashboardMetricsService` **Logic:** diff --git a/src/main/java/com/xtraction/api/pushnotification/documentation/api_docs.md b/src/main/java/com/xtraction/api/pushnotification/documentation/api_docs.md index 04c7f07..6aab015 100644 --- a/src/main/java/com/xtraction/api/pushnotification/documentation/api_docs.md +++ b/src/main/java/com/xtraction/api/pushnotification/documentation/api_docs.md @@ -1,6 +1,6 @@ # Push Notification Package — Documentation -> **Package:** `com.extractor.unraveldocs.pushnotification` +> **Package:** `com.xtraction.api.pushnotification` > **Base URL:** `/api/v1/notifications` > **Last Updated:** March 18, 2026 @@ -180,7 +180,7 @@ User/Admin REST API ## Enums & Data Models ### `NotificationType` -**Package:** `com.extractor.unraveldocs.pushnotification.datamodel` +**Package:** `com.xtraction.api.pushnotification.datamodel` 55 typed notification events across 8 categories. Each value carries a human-readable `displayName` and a `category` string used for preference gating. @@ -435,7 +435,7 @@ Both follow the same pattern — conditional on their respective `*.enabled` pro ## Kafka Integration ### `NotificationEvent` -**Package:** `com.extractor.unraveldocs.pushnotification.kafka` +**Package:** `com.xtraction.api.pushnotification.kafka` Serializable Kafka message envelope. diff --git a/src/main/java/com/xtraction/api/ratelimit/documentation/api_docs.md b/src/main/java/com/xtraction/api/ratelimit/documentation/api_docs.md index 46c6fa6..3aaf3a3 100644 --- a/src/main/java/com/xtraction/api/ratelimit/documentation/api_docs.md +++ b/src/main/java/com/xtraction/api/ratelimit/documentation/api_docs.md @@ -1,6 +1,6 @@ # Rate Limit Package — Documentation -> **Package:** `com.extractor.unraveldocs.ratelimit` +> **Package:** `com.xtraction.api.ratelimit` > **Applies to:** `/api/v1/ai/**` > **Last Updated:** February 26, 2026 @@ -109,7 +109,7 @@ RateLimitInterceptor.preHandle() ## Configuration ### `RateLimitConfig` -**Package:** `com.extractor.unraveldocs.ratelimit.config` +**Package:** `com.xtraction.api.ratelimit.config` **Prefix:** `rate-limit` ```java @@ -150,7 +150,7 @@ Resolves the correct `TierLimit` from the `tiers` map using a `plan → tierKey` --- ### `RateLimitWebConfig` -**Package:** `com.extractor.unraveldocs.ratelimit.config` +**Package:** `com.xtraction.api.ratelimit.config` Registers the `RateLimitInterceptor` **only** on paths matching `/api/v1/ai/**` via `InterceptorRegistry`. All other application routes are unaffected. @@ -164,7 +164,7 @@ registry.addInterceptor(rateLimitInterceptor) ## Service ### `RateLimitService` -**Package:** `com.extractor.unraveldocs.ratelimit.service` +**Package:** `com.xtraction.api.ratelimit.service` The core rate-limiting engine. Manages a `ConcurrentHashMap` keyed by `"{userId}:minute"` and `"{userId}:daily"`. @@ -214,7 +214,7 @@ Refill = dailyLimit tokens per 24 hours (greedy — resets gradually) ## Interceptor ### `RateLimitInterceptor` -**Package:** `com.extractor.unraveldocs.ratelimit.interceptor` +**Package:** `com.xtraction.api.ratelimit.interceptor` **Implements:** `HandlerInterceptor` **Registered on:** `/api/v1/ai/**` diff --git a/src/main/java/com/xtraction/api/subscription/documentation/api_docs.md b/src/main/java/com/xtraction/api/subscription/documentation/api_docs.md index b1c16c3..e9a3e5d 100644 --- a/src/main/java/com/xtraction/api/subscription/documentation/api_docs.md +++ b/src/main/java/com/xtraction/api/subscription/documentation/api_docs.md @@ -5,7 +5,7 @@ > - User: `/api/v1/subscriptions` > - Admin: `/api/v1/admin/subscriptions` > -> **Package:** `com.extractor.unraveldocs.subscription` +> **Package:** `com.xtraction.api.subscription` > **Last Updated:** 2026-02-26 --- @@ -145,7 +145,7 @@ subscription/ ### Enums #### `SubscriptionPlans` -**Package:** `com.extractor.unraveldocs.subscription.datamodel` +**Package:** `com.xtraction.api.subscription.datamodel` Defines all plan identifiers stored in `SubscriptionPlan.name`. @@ -164,7 +164,7 @@ Defines all plan identifiers stored in `SubscriptionPlan.name`. --- #### `SubscriptionStatus` -**Package:** `com.extractor.unraveldocs.subscription.datamodel` +**Package:** `com.xtraction.api.subscription.datamodel` | Value | Display Name | Description | |---|---|---| @@ -178,7 +178,7 @@ Defines all plan identifiers stored in `SubscriptionPlan.name`. --- #### `BillingIntervalUnit` -**Package:** `com.extractor.unraveldocs.subscription.datamodel` +**Package:** `com.xtraction.api.subscription.datamodel` | Value | String Value | Description | |---|---|---| @@ -191,7 +191,7 @@ Defines all plan identifiers stored in `SubscriptionPlan.name`. --- #### `SubscriptionCurrency` -**Package:** `com.extractor.unraveldocs.subscription.datamodel` +**Package:** `com.xtraction.api.subscription.datamodel` 64 global currencies are supported. Each entry carries a `symbol`, `fullName`, and ISO `code`. @@ -217,7 +217,7 @@ Selected currencies: ### Entities #### `SubscriptionPlan` -**Package:** `com.extractor.unraveldocs.subscription.model` +**Package:** `com.xtraction.api.subscription.model` **Table:** `subscription_plans` | Column | Type | Nullable | Description | @@ -246,7 +246,7 @@ Selected currencies: --- #### `UserSubscription` -**Package:** `com.extractor.unraveldocs.subscription.model` +**Package:** `com.xtraction.api.subscription.model` **Table:** `user_subscriptions` | Column | Type | Nullable | Description | @@ -272,7 +272,7 @@ Selected currencies: --- #### `Discount` -**Package:** `com.extractor.unraveldocs.subscription.model` +**Package:** `com.xtraction.api.subscription.model` **Table:** `discounts` | Column | Type | Nullable | Description | @@ -292,7 +292,7 @@ Selected currencies: ### Request DTOs #### `CreateSubscriptionPlanRequest` -**Package:** `com.extractor.unraveldocs.subscription.dto.request` +**Package:** `com.xtraction.api.subscription.dto.request` | Field | Type | Required | Constraints | Description | |------------------------|------------------------|----------|---------------|-------------------------------------------------| @@ -308,7 +308,7 @@ Selected currencies: --- #### `UpdateSubscriptionPlanRequest` -**Package:** `com.extractor.unraveldocs.subscription.dto.request` +**Package:** `com.xtraction.api.subscription.dto.request` All fields are **optional** — only provided fields are applied. @@ -1540,7 +1540,7 @@ Retrieves a paginated list of users subscribed to a specific plan. ## Service Layer ### `SubscriptionPlansService` (Facade) -**Package:** `com.extractor.unraveldocs.subscription.service` +**Package:** `com.xtraction.api.subscription.service` Thin admin-facing facade — delegates to interface implementations. @@ -1553,7 +1553,7 @@ Thin admin-facing facade — delegates to interface implementations. --- ### `AddSubscriptionPlansImpl` -**Package:** `com.extractor.unraveldocs.subscription.impl` +**Package:** `com.xtraction.api.subscription.impl` **Implements:** `AddSubscriptionPlansService` **Transactional:** Yes @@ -1569,7 +1569,7 @@ Thin admin-facing facade — delegates to interface implementations. --- ### `UpdateSubscriptionPlanImpl` -**Package:** `com.extractor.unraveldocs.subscription.impl` +**Package:** `com.xtraction.api.subscription.impl` **Implements:** `UpdateSubscriptionPlanService` **Transactional:** Yes @@ -1586,7 +1586,7 @@ Thin admin-facing facade — delegates to interface implementations. --- ### `AssignSubscriptionService` -**Package:** `com.extractor.unraveldocs.subscription.impl` +**Package:** `com.xtraction.api.subscription.impl` Utility service used internally (not exposed via REST). Assigns a single default `UserSubscription` to a given `User` based on their `Role`. @@ -1610,7 +1610,7 @@ Utility service used internally (not exposed via REST). Assigns a single default --- ### `AssignSubscriptionToUsersImpl` -**Package:** `com.extractor.unraveldocs.subscription.impl` +**Package:** `com.xtraction.api.subscription.impl` **Implements:** `AssignSubscriptionToUsersService` **Transactional:** Yes @@ -1626,7 +1626,7 @@ Utility service used internally (not exposed via REST). Assigns a single default --- ### `UserSubscriptionServiceImpl` -**Package:** `com.extractor.unraveldocs.subscription.impl` +**Package:** `com.xtraction.api.subscription.impl` **Implements:** `UserSubscriptionService` #### `getUserSubscriptionDetails(User)` @@ -1677,7 +1677,7 @@ Utility service used internally (not exposed via REST). Assigns a single default --- ### `PlanPricingServiceImpl` -**Package:** `com.extractor.unraveldocs.subscription.service` +**Package:** `com.xtraction.api.subscription.service` **Implements:** `PlanPricingService` #### `getAllPlansWithPricing(SubscriptionCurrency currency)` @@ -1713,7 +1713,7 @@ Utility service used internally (not exposed via REST). Assigns a single default --- ### `CurrencyConversionServiceImpl` -**Package:** `com.extractor.unraveldocs.subscription.service` +**Package:** `com.xtraction.api.subscription.service` **Implements:** `CurrencyConversionService` Maintains an **in-memory `ConcurrentHashMap`** of exchange rates. On `@PostConstruct`, seeds the map with hardcoded fallback rates (≈ Dec 2024 values for 29 currencies). Live rates are fetched from `exchangerate-api.com` via `RestTemplate`. @@ -1736,7 +1736,7 @@ convert(amountUsd, targetCurrency): --- ### `SubscriptionFeatureService` -**Package:** `com.extractor.unraveldocs.subscription.service` +**Package:** `com.xtraction.api.subscription.service` Provides programmatic feature gating — called by other packages (e.g., document processing, search) to enforce plan-tier restrictions. @@ -1797,7 +1797,7 @@ Provides programmatic feature gating — called by other packages (e.g., documen ## Scheduled Jobs ### `ExchangeRateUpdateJob` -**Package:** `com.extractor.unraveldocs.subscription.jobs` +**Package:** `com.xtraction.api.subscription.jobs` **Schedule:** `0 0 6 * * *` — daily at 06:00 Calls `CurrencyConversionService.refreshRates()` to fetch live exchange rates from the external API. On failure, logs the error and retains the existing cached rates (degraded mode with fallback rates). @@ -1805,7 +1805,7 @@ Calls `CurrencyConversionService.refreshRates()` to fetch live exchange rates fr --- ### `MonthlyQuotaResetJob` -**Package:** `com.extractor.unraveldocs.subscription.jobs` +**Package:** `com.xtraction.api.subscription.jobs` **Two scheduled methods:** @@ -1839,7 +1839,7 @@ Ensures all subscriptions (including newly created ones) always have a `quotaRes --- ### `TrialExpiryJob` -**Package:** `com.extractor.unraveldocs.subscription.jobs` +**Package:** `com.xtraction.api.subscription.jobs` **Schedule:** `0 0 * * * *` — every hour Delegates to `UserSubscriptionService.checkAndExpireTrials()`: diff --git a/src/main/java/com/xtraction/api/team/documentation/api_docs.md b/src/main/java/com/xtraction/api/team/documentation/api_docs.md index 9041365..3fff671 100644 --- a/src/main/java/com/xtraction/api/team/documentation/api_docs.md +++ b/src/main/java/com/xtraction/api/team/documentation/api_docs.md @@ -1,7 +1,7 @@ # Team Package — API Documentation > **Base URL:** `/api/v1/teams` -> **Package:** `com.extractor.unraveldocs.team` +> **Package:** `com.xtraction.api.team` > **Last Updated:** 2026-03-07 --- diff --git a/src/main/java/com/xtraction/api/user/documentation/api_docs.md b/src/main/java/com/xtraction/api/user/documentation/api_docs.md index 8ca6271..528420a 100644 --- a/src/main/java/com/xtraction/api/user/documentation/api_docs.md +++ b/src/main/java/com/xtraction/api/user/documentation/api_docs.md @@ -1,7 +1,7 @@ # User Package — API Documentation > **Base URL:** `/api/v1/user` -> **Package:** `com.extractor.unraveldocs.user` +> **Package:** `com.xtraction.api.user` > **Last Updated:** 2026-02-26 --- @@ -126,7 +126,7 @@ user/ ## Data Models ### User Entity -**Package:** `com.extractor.unraveldocs.user.model` +**Package:** `com.xtraction.api.user.model` **Table:** `users` **Implements:** `UserDetails` (Spring Security) @@ -180,7 +180,7 @@ user/ ### Request DTOs #### `ForgotPasswordDto` -**Package:** `com.extractor.unraveldocs.user.dto.request` +**Package:** `com.xtraction.api.user.dto.request` | Field | Type | Required | Constraints | Example | |---------|----------|----------|------------------------|-------------------------| @@ -189,7 +189,7 @@ user/ --- #### `ResetPasswordDto` -**Package:** `com.extractor.unraveldocs.user.dto.request` +**Package:** `com.xtraction.api.user.dto.request` | Field | Type | Required | Constraints | Example | |----------------------|----------|----------|-----------------------------------------------------------|-------------------------| @@ -201,7 +201,7 @@ user/ --- #### `ChangePasswordDto` -**Package:** `com.extractor.unraveldocs.user.dto.request` +**Package:** `com.xtraction.api.user.dto.request` | Field | Type | Required | Constraints | Example | |----------------------|----------|----------|-----------------------------------------------------------------------|-----------------| @@ -212,7 +212,7 @@ user/ --- #### `ProfileUpdateRequestDto` -**Package:** `com.extractor.unraveldocs.user.dto.request` +**Package:** `com.xtraction.api.user.dto.request` All fields are **optional** — only provided fields that differ from the current value are applied. @@ -231,7 +231,7 @@ All fields are **optional** — only provided fields that differ from the curren ### Response DTOs #### `UserData` -**Package:** `com.extractor.unraveldocs.user.dto` +**Package:** `com.xtraction.api.user.dto` Returned inside `XtractionResponse` for profile retrieval and profile update responses. | Field | Type | Description | @@ -639,7 +639,7 @@ All endpoints are prefixed with `/api/v1/user`. All endpoints except `forgot-pas ## Service Layer ### `UserService` (Facade) -**Package:** `com.extractor.unraveldocs.user.service` +**Package:** `com.xtraction.api.user.service` Thin orchestration layer. Controllers depend only on `UserService`, keeping them decoupled from implementation details. @@ -657,7 +657,7 @@ Thin orchestration layer. Controllers depend only on `UserService`, keeping them --- ### `GetUserProfileImpl` -**Package:** `com.extractor.unraveldocs.user.impl` +**Package:** `com.xtraction.api.user.impl` **Implements:** `GetUserProfileService` **Logic:** @@ -673,7 +673,7 @@ Thin orchestration layer. Controllers depend only on `UserService`, keeping them --- ### `ProfileUpdateImpl` -**Package:** `com.extractor.unraveldocs.user.impl` +**Package:** `com.xtraction.api.user.impl` **Implements:** `ProfileUpdateService` **Transactional:** Yes (`@Transactional`) **Cache:** `@CachePut` on `getProfileByUser` and `getProfileByAdmin` caches, keyed by `userId` @@ -693,7 +693,7 @@ Thin orchestration layer. Controllers depend only on `UserService`, keeping them --- ### `ProfilePictureImpl` -**Package:** `com.extractor.unraveldocs.user.impl` +**Package:** `com.xtraction.api.user.impl` **Implements:** `ProfilePictureService` **Transactional:** Yes (`@Transactional`) @@ -719,7 +719,7 @@ Thin orchestration layer. Controllers depend only on `UserService`, keeping them --- ### `PasswordResetImpl` -**Package:** `com.extractor.unraveldocs.user.impl` +**Package:** `com.xtraction.api.user.impl` **Implements:** `PasswordResetService` **Transactional:** Yes (`@Transactional`) @@ -752,7 +752,7 @@ Thin orchestration layer. Controllers depend only on `UserService`, keeping them --- ### `ChangePasswordImpl` -**Package:** `com.extractor.unraveldocs.user.impl` +**Package:** `com.xtraction.api.user.impl` **Implements:** `ChangePasswordService` **Transactional:** Yes (`@Transactional`) @@ -772,7 +772,7 @@ Thin orchestration layer. Controllers depend only on `UserService`, keeping them --- ### `DeleteUserImpl` -**Package:** `com.extractor.unraveldocs.user.impl` +**Package:** `com.xtraction.api.user.impl` **Implements:** `DeleteUserService` **Transactional:** Yes (all methods) @@ -811,7 +811,7 @@ Midnight cron: ## Repository ### `UserRepository` -**Package:** `com.extractor.unraveldocs.user.repository` +**Package:** `com.xtraction.api.user.repository` **Extends:** `JpaRepository` | Method | Description | @@ -897,7 +897,7 @@ All handlers implement `EventHandler` and are registered by event type in the --- ### Kafka Consumer — `UserEventListener` -**Package:** `com.extractor.unraveldocs.user.eventlistener` +**Package:** `com.xtraction.api.user.eventlistener` **Topic:** `KafkaTopicConfig.TOPIC_USERS` **Consumer Group:** `user-events-group` **Conditional:** Only active when `spring.kafka.bootstrap-servers` is configured