CINET Techinical Task
  • C# 99.5%
  • Dockerfile 0.5%
Find a file
Abdulrazaq Alhendi bd6ad3011a fix: enhance payment upload and loan closure process in Lending API
- Optimized loan queries by batching and locking rows for touched loans in payment uploads.
- Added logic to automatically close loans when total payments cover the full schedule.
- Introduced validation to reject future-dated payments.
- Extended tests to cover early loan closures, concurrent uploads, and edge cases.
- Updated ADRs and architecture documentation to reflect new payment and closure behavior.
2026-09-29 14:49:21 +03:00
docker/postgres feat: add database migrations testing project and containerized PostgreSQL setup 2026-09-26 10:58:39 +03:00
docs fix: enhance payment upload and loan closure process in Lending API 2026-09-29 14:49:21 +03:00
src fix: enhance payment upload and loan closure process in Lending API 2026-09-29 14:49:21 +03:00
tests fix: enhance payment upload and loan closure process in Lending API 2026-09-29 14:49:21 +03:00
.dockerignore feat: add database migrations testing project and containerized PostgreSQL setup 2026-09-26 10:58:39 +03:00
.gitattributes feat: add PostgreSQL migration runner and ADR for database migrations 2026-09-26 10:07:48 +03:00
.gitignore docs: add README and .NET 11 ADR 2026-09-23 14:58:42 +03:00
compose.yaml feat: set Development environment for APIs and update docs 2026-09-29 13:09:16 +03:00
global.json feat: add database migrations testing project and containerized PostgreSQL setup 2026-09-26 10:58:39 +03:00
peaceful-urchin.sln feat: integrate Lending and Credit APIs with new eligibility and loan blocking features 2026-09-28 22:37:37 +03:00
README.md feat: set Development environment for APIs and update docs 2026-09-29 13:09:16 +03:00
task.md init: add task requirements and TODO 2026-09-22 22:34:35 +03:00
TODO.md feat: add customer profile management and name update functionality 2026-09-29 10:32:51 +03:00

Peaceful Urchin

A loan and credit microservices task using .NET and PostgreSQL. The task defines the required behavior and deliverables. The architecture guide shows the services and the domain terms they use.

Run locally

Install Docker with Compose. No local .NET SDK is needed. From the repository root, start the three APIs and PostgreSQL:

docker compose up --build --detach --wait

One PostgreSQL container hosts separate access_db, lending_db, and credit_db databases. The Compose stack runs the APIs in Development so their OpenAPI documents are available:

Service OpenAPI document Liveness
Access http://127.0.0.1:8081/openapi/v1.json http://127.0.0.1:8081/health/live
Lending http://127.0.0.1:8082/openapi/v1.json http://127.0.0.1:8082/health/live
Credit http://127.0.0.1:8083/openapi/v1.json http://127.0.0.1:8083/health/live

The OpenAPI documents are JSON, with no separate UI. The APIs expose them only in Development.

Demo users

Institution Username Password
Bank A bank@example.test bank-local
CINET cinet@example.test cinet-local

Log in through Access's POST /auth/login, then send its access token as a Bearer token to protected routes. The seeded customer Civil ID 296051500019 can be used for reads and the demo flows.

Tests

Run the integration tests in a container, using the same PostgreSQL service:

docker compose run --build --rm tests

docker compose down stops the containers and keeps PostgreSQL's data. docker compose down --volumes removes that local database so the next up starts fresh.

AI Use Disclosure

OpenAI GPT 6-Sol (Proprietary) and local Google Gemma-4-E4B (Apache 2.0) used as research and learning aids.

  • Find and compare online sources such as https://learn.microsoft.com, and my personal Obsidian vault.
  • Translate concepts I know from Rust / Java into C# and .NET.
  • Code generation for test cases. Used to validate invariants that I expect to be held up.
  • Commit message generation
  • Final Sanity checks

In short, I treat it as a glorified search engine and concept translator, with a human in the loop for decisions, verification and implementation.

The disclosure will be updated accordingly in case any changes occur.