Full-Stack

Enterprise Document Search

JavaSpring BootAWS KendraAWS S3MicroservicesMockito

Backend work on an enterprise web application built as loosely coupled microservices. I implemented database models and REST services behind a backend-for-frontend (BFF), shipped an ML-powered search feature on AWS Kendra and a recently-viewed-documents feature, and raised test coverage with Mockito. (Client data and document types are confidential and omitted.)

Architecture

A React single-page app calls a BFF through an API gateway; the BFF fans requests out to downstream microservices — each a Spring Boot service on its own EC2 instance, some in separate VPCs — which read from an RDS SQL Server database, with DynamoDB as a shared cache.

Microservice backend-for-frontend architecture A React single-page app calls an API gateway, which reaches a backend-for-frontend. The BFF calls three downstream Spring Boot microservices, some in other VPCs. The services read from an RDS SQL Server database and use DynamoDB as a cache. React SPA single-page app API Gateway REST BFF Spring Boot · EC2 App A service same VPC App B service other VPC App S service other VPC RDS SQL Server DynamoDB cache SQL cache
The BFF pattern: one gateway in front, independently scalable services behind it, some reachable only across VPC boundaries.

AWS Kendra search

The headline deliverable: an intelligent search over documents in S3, powered by AWS Kendra's ML and NLP. It runs in two phases — ingestion keeps the index in sync with S3, and query serves suggestions and ranked results to the search bar.

AWS Kendra ingestion and query flow Ingestion: documents in S3 are mapped by a custom connector and pushed to the Kendra index with asynchronous batch operations. Query: the frontend search bar calls a search service, which queries Kendra for suggestions and ranked results. INGEST QUERY AWS S3 source documents Custom connector App S · field mapping AWS Kendra ML + NLP index batch · async Frontend search bar + filters Search service App A · GET endpoints Results ranked + paginated Query / Suggestions
Two GET endpoints sit over one Kendra index: one for type-ahead suggestions, one for the full search, both filtered with AttributeFilters.

Recently Viewed Documents

A backend feature powering a carousel of a user's recently opened documents. Views are logged by POST into a per-service table (document ID plus timestamp). To render the carousel, the service queries that table for the latest unique IDs, enriches them with names and metadata fetched from another application living in a separate VPC, then returns the list sorted newest-first with pagination.

Testing & debugging

I raised code coverage by writing Mockito tests across repositories and services — mock objects let each microservice be tested in isolation, which suited the architecture and gave the client measurable confidence in the code. For debugging, I traced failures across services with AWS CloudWatch, matching HTTP error timestamps to logs; one recurring class of 404s traced back to endpoints that were never exposed through the BFF.

Back to projects