Skip to content

Repository files navigation

Fake Survey Generator

This is an app. That generates surveys. Fake ones. For fun. That is all.

Build Status

Open in github.dev

Screenshot

Screenshot

What is this?

This is a .NET | C# | React | TypeScript full-stack application of moderate complexity (not just a to-do app), used as a playground for experimentation. Simply put: This is where I mess around with code. It is heavily inspired by the .NET Microservices: Architecture for Containerized .NET Applications book, as well as its companion reference application eShopOnAzure. It also incorporates various elements from different repos & blog posts which served as inspiration.

It is built using Vertical Slice Architecture principles with CQRS (Command Query Responsibility Segregation) and DDD (Domain-Driven Design) thrown into the mix. It doesn't follow these principles to the letter, but provides a decent example of how to apply the basics of these principles.

It is heavily centered around the Microsoft .NET + Azure technology stacks as these are what I have the most experience in & just like building things with. 😀

Here are some of the features incorporated into this project:

Application Features

Infrastructure Features

Some of the above features are relatively straightforward to implement, others have some intricacies that require some Googling in order to set up. I just like to have them placed in the context of a complete working application to refer back to when necessary.

Why is this here?

I wanted something to try new things out on, without the risk of substantially endangering an actual production environment used by actual people.

It was for this reason that I built the Fake Survey Generator (FSG) app as a way to test out tools, libraries, patterns, frameworks & various other stuff.

It has a very simple domain: it generates surveys. Fake ones. They can be used as a tool for helping you decide what to have for dinner, which book you should read next, where you should go for your next team lunch, or anything that tickles your fancy.

This application is also used as a reference for configuring/wiring up some common things I sometimes forget how to do. Living Documentation if you will. You know the culprits: How do I wire up that database again? What is the syntax for that logging configuration? How do I make thing A talk to thing B?

The domain is kept relatively simple such that it doesn't overwhelm the app with unnecessary complexity. It should be quite easy to wrap your head around without requiring a degree in Computer Science.

I also felt that a lot of reference/demo/boilerplate projects out there cover the core application domain & don't go into much detail around the building/deployment/hosting of final application. So this project aims to cover both. It contains application code, configuration, CI/CD pipelines, infrastructure-as-code needed to run the application, as well as a live, running version of the application (as long as budget allows 😁). So this repo hopefully may contain something for everyone & fill in the potential gaps across the whole spectrum of application development. It falls somewhere between a template/boilerplate project & a real-world production open-source application.

How is this thing structured?

FSG consists of two parts:

Server

The server side consists of the following main components:

  • Fake Survey Generator API
  • Fake Survey Generator Worker
  • Aspire AppHost
  • Service Defaults
  • Application Project
  • Application Tests Project
  • API Integration Tests Project
  • E2E Acceptance Tests Project

The Aspire AppHost also runs SQL Server, Redis, Redis Insight, a Dapr sidecar, and the Vite UI during local development.

The server side makes use of the following tools, libraries & frameworks:

Client

The client side consists of the following main components:

  • UI

The client side makes use of the following tools, libraries & frameworks:

For production, the UI is built by the API's Dockerfile and served by the API container; it does not have a separate UI Dockerfile.

Common

The application is containerized and orchestrated locally with Aspire. During local development, the Aspire AppHost runs the API, Worker, SQL Server, Redis, Redis Insight, Dapr, and the Vite UI. The UI is a separate Vite resource locally.

For production, the current Azure deployment publishes the API container only. The API Dockerfile builds the React UI and serves its static files from wwwroot; the Worker is not currently deployed by azure.yaml or the Azure infrastructure.

In Development, the API applies Entity Framework migrations during startup. In production, Azure Pipelines generates a migration script and executes it against Azure SQL as a separate deployment stage.

The hosted version of the application is deployed here: https://fakesurveygenerator.mysecondarydomain.com

The following endpoints are accessible:

  • /api-docs - Scalar OpenAPI documentation UI
  • /openapi/v1.json - OpenAPI 3.1 JSON document
  • /health/live - Liveness endpoint used by Azure Container Apps ingress; it does not check external dependencies
  • /health/ready - Readiness endpoint used by Azure Container Apps ingress; it runs the configured readiness checks

The hosted version utilizes the following infrastructure:

Authentication

The application uses OpenID Connect through Auth0. The API validates Auth0 JWT bearer tokens with the audience fake-survey-generator-api, while the React UI uses the Auth0 React SDK. The Auth0 tenant's enabled connections are external configuration; the current tenant supports:

  • Auth0
  • Google

The client configuration is in src/client/ui/src/auth_config.json, and the local API identity-provider URL is in src/server/FakeSurveyGenerator.Api/appsettings.Development.json. If you use a different Auth0 tenant, update both configurations and configure its allowed callback/logout URLs for the local and deployed UI origins.

Semantic survey analysis

The Analyse Survey button uses TypeSafe to check survey wording and options for potential issues such as leading questions, multiple-choice ambiguity, incomplete coverage, and semantically duplicate options. Configure the API key on the server; never expose it to the browser:

TYPESAFE_API_KEY=your-key

TYPESAFE_BASE_URL and TYPESAFE_MODEL are optional and default to https://api.typesafe.ai/ and jev-latest.

For Azure deployments, configure typeSafeApiKey as a secret Azure Pipelines variable. The deployment seeds it into Azure Key Vault and exposes it to the API container through a managed-identity-backed secret reference.

How do I run this thing?

In order to run FSG on your local machine, you will need the following prerequisites:

The local AppHost uses the Dapr component in dapr/components/local-file.yml and its accompanying dapr/components/secrets.json file for development secrets.

  1. Open FakeSurveyGenerator.slnx in Visual Studio 2026, or in an IDE with .NET 11 SDK support.

  2. Ensure that the FakeSurveyGenerator.AppHost project is selected as the startup project.

  3. Hit F5 to debug the application, or Ctrl + F5 to run without debugging.

  4. The Aspire Dashboard should open automatically, along with the local UI.

How do I contribute?

If you find a bug, want to add a feature, or want to improve the documentation, open up a PR!

References

My deepest thanks to all the people who provided these resources as reference: