CryptoInfoTracker is a fullstack software solution developed as part of a technical assessment for Hahn Software. The project integrates a well-structured backend built in .NET 9 using Minimal APIs with a modern Vue.js + TypeScript frontend, incorporating Hangfire for background job processing. It leverages Clean Architecture, Domain-Driven Design (DDD), and SOLID principles.
The application’s core purpose is to:
- Fetch live cryptocurrency data from the public Coinlore API
- Store and update this data periodically using a background job
- Expose the data via a clean REST API
- Display it in a responsive, filterable frontend table
- .NET 9 SDK
- SQL Server (I used SQLServer on Docker)
- Node.js
- (Optional) EF Core CLI:
dotnet tool install --global dotnet-ef
This is the minimal API exposing /cryptos.
cd HahnSoftwareTest\src\Hahn.WebApi
# Restore and build
dotnet build
# Apply DB migrations (migration assembly is Hahn.WebApi)
dotnet ef database update
# Run the WebAPI
dotnet runcd HahnSoftwareTest\src\Hahn.WorkerService
dotnet runcd HahnSoftwareTest\frontend
npm install
npm run devHahnSoftwareTest/
├── src/ # Backend source folder
│ ├── Hahn.Application # Use cases, interfaces, UpsertCryptoService (CoinLore api access)
│ ├── Hahn.Domain # Core domain entities, models, enums, repository interface
│ ├── Hahn.Infrastructure # Data access with EF Core, AppDbContext
│ ├── Hahn.Jobs # Hangfire job logic (CryptoUpsertJob)
│ ├── Hahn.WorkerService # Host for background job scheduler
│ └── Hahn.WebApi # Minimal API that exposes crypto data
└── frontend/ # Vue 3 + TypeScript frontend
- The
Hahn.WorkerServicehosts a background job using Hangfire. - Job scheduled via
RecurringJob.AddOrUpdateto run every hour. - The
CryptoUpsertJobcalls theUpsertCryptoService, which:- Sends a GET request to Coinlore API
- Deserializes the response into domain models
- Maps to internal
CryptoCurrencyentity - Upserts the data using a repository pattern and EF Core
- Dependencies registered via
AddWorkerServices()
- API hosted in
Hahn.WebApiusing .NET Minimal APIs - Main endpoint:
GET /cryptos - Supports sorting by:
- Name
- Symbol
- Price
- 24h change
- Market cap
- Sorting is dynamic via enums:
EnumSortByandEnumSortDirection - Query parameters wrapped in
CryptoQueryParams - Business logic lives in
Hahn.Application
- Implements:
- HTTP calls to Coinlore API
- Data mapping and transformation
- EF Core
DbContextwith SQL Server provider
UpsertAsync()method handles full transformation of Coinlore data into domain entities
- SPA built with Vue 3 + TypeScript + Vite
- Styling via Tailwind CSS and Flowbite UI
- Filter cryptos by name or symbol
- Sort by top gainers, losers, market cap
- Pagination support
- Main component:
App.vue - Custom composable:
useCryptos.tshandles:- API data fetching
- Filtering, sorting, pagination logic
- Uses
fetchoraxiosfor API communication
- .NET 8
- Entity Framework Core
- SQL Server
- Hangfire
- Clean Architecture + DDD + SOLID
- Vue 3
- TypeScript
- Tailwind CSS
- Flowbite UI
- Vite
- Hangfire job runs every hour
- Calls Coinlore API
- Upserts crypto data into SQL Server database
- Web API exposes
/cryptosendpoint - Frontend fetches from API
- Displays data in styled table with filtering, sorting, and pagination
