Full-Stack
Enterprise Document Search
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.
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.
- Custom data source connector — the AWS S3 connector was off-limits under security constraints, so I built a custom connector that maps document fields into Kendra's schema.
- Keeping the index in sync — ingestion through
BatchPutDocument/BatchDeleteDocumentis asynchronous; I handled it by syncing to each document's latest S3 state rather than tracking every create/delete event. - Suggestions + search — type-ahead query suggestions on keystroke, and full search on submit, decoding Base64 queries from the frontend and applying AttributeFilters to narrow results.
- Relevance tuning — configured each field as displayable, facetable, searchable, or sortable, and tuned attribute weights in the Kendra console to improve ranking.
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.