Skip to content

Latest commit

Β 

History

History
221 lines (186 loc) Β· 7.93 KB

File metadata and controls

221 lines (186 loc) Β· 7.93 KB

🌾 CerealAPI

Et simpelt C# .NET 9 Web API projekt, der demonstrerer hvordan man kan bygge en REST API med Entity Framework Core og dokumenteres med Swagger UI. Derudover er der ogsΓ₯ mulighed for Dockerization, og CI/CD med Jenkins, i en samlet pakke med docker compose. Projektet kan kΓΈres lokalt med dotnet run fra projektroden og Docker containers med docker compose up --build (--build er til fΓΈrste gang man kΓΈrer det)

NΓ₯r projektet kΓΈres i Docker med docker compose up --build sΓ₯ oprettes der 4 containere: cereal-api, cereal-db, cereal-frontend, og jenkins i Γ©n samlet compose

cereal-api er den container der holder pΓ₯ alt API funktionalitet. Som f.eks. Models, Controllers, Endpoints, etc. cereal-db er en MySQL database instance. cereal-frontend er React frontend der kΓΈres med Vite. Der er desuden hot-reload indbygget, sΓ₯ man ikke skal genstarte containere hver gang man Γ¦ndre pΓ₯ koden. jenkins er et CI/CD vΓ¦rktΓΈj der kΓΈrer i sin egen instance.


πŸ–ΌοΈ Frontend

NΓ₯r projektet kΓΈrer enten lokalt eller gennem Docker containerization, kan det tilgΓ₯s pΓ₯ http://localhost:5173.

πŸ—‚οΈ Projektstruktur

CerealAPI/
β”œβ”€β”€ πŸ“‚ CerealAPI/                 # API projektmappe
β”‚   β”œβ”€β”€ πŸ“ Controllers/             # API controllere
β”‚   β”œβ”€β”€ πŸ“ Data/                    # CSV-fil og database seeder
β”‚   β”œβ”€β”€ πŸ“ Migrations/              # Entity Framework migrations
β”‚   β”œβ”€β”€ πŸ“ Models/                  # Datamodeller
β”‚   β”œβ”€β”€ πŸ“œ CerealAPI.csproj         # C# projektfilen
β”œβ”€β”€ β”œβ”€β”€ πŸ‹ Dockerfile               # Dockerfilen til API
β”‚   └── βš™οΈ Program.cs               # Main entry point
β”œβ”€β”€ πŸ“‚ CerealFrontEnd/            # Frontend projektmappe
β”‚   β”œβ”€β”€ πŸ“ public/                  # Den "offentlige" mappe
β”‚   β”œβ”€β”€ πŸ“ src/                     # Resurse mappen
β”‚   β”‚    β”œβ”€β”€ πŸ“ api/                  # Indeholder API typing
β”‚   β”‚    β”œβ”€β”€ πŸ“ assets/               # Diverse assets
β”‚   β”‚    β”œβ”€β”€ πŸ“ components/           # Genbrugelige komponenter
β”‚   β”‚    β”œβ”€β”€ πŸ“ pages/                # Alle siderne der loades
β”‚   β”‚    β”œβ”€β”€ πŸͺ¨ App.tsx               # Filen hvor det hele kΓΈres (minimal size)
β”‚   β”‚    β”œβ”€β”€ πŸ“‹ types.ts              # TypesΓ¦tning til objekter (pt. kun Cereals) 
β”‚   β”‚    └── πŸ“‹ Og mange flere filer... 
β”œβ”€β”€ β”œβ”€β”€ πŸ‹ Dockerfile               # Docker filen til Frontend
β”‚   └── βš™οΈ Config-filer..           # En hel masse config filer
β”œβ”€β”€ 🎼 docker-compose.yml         # Orkestrerer API, MySQL, Frontend, og Jenkins
└── πŸ€΅πŸ»β€β™‚οΈ Jenkinsfile                # CI/CD pipeline konfiguration

πŸ“‘ API Endpoints

Metode Endpoint Beskrivelse Body (JSON) eksempel
GET /api/Cereal Hent alle cereals –
GET /api/Cereal/{id} Hent en cereal via Id { "id": 15 }
POST /api/Cereal Opret en ny cereal { "name": "Corn Flakes", "calories": 120 }
PUT /api/Cereal/{id} Opdater en cereal { "id": 1, "name": "Choco Pops", "calories": 200 }
DELETE /api/Cereal/{id} Slet en cereal { "id": 37 }

πŸš€ Teknologier

  • ASP.NET Core Web API
  • Entity Framework Core
  • MySQL Workbench
  • Swagger / Swashbuckle
  • Docker Containers
  • Jenkins
  • React w. Vite & TypeScript

🍽️ CSV-import og seeding

Ved fΓΈrste opstart importerer API’et automatisk data fra Data/Cereal.csv til databasen. Dette hΓ₯ndteres af CerealSeeder under opstart:

CerealSeeder.SeedProducts(context, "Data/Cereal.csv");

Hvis filen ikke findes, kaster den en exception f.eks.:

System.IO.FileNotFoundException: CSV filen blev ikke fundet

For at sikre adgang og at Docker faktisk kan finde filen tilfΓΈjes denne linje til docker-compose.yml:

volumes:
  - ./CerealApi/Data:/app/Data

βš™οΈ Installation (Lokal Udvikling)

  1. Klon repoet:
git clone https://github.com/brugernavn/CerealAPI.git
cd CerealAPI
  1. TilfΓΈj database-forbindelse i appsettings.json :
"ConnectionStrings": {
    "DefaultConnection": "server=localhost;database=cerealsdb;user=dinBruger;password=dinKode"
  }
  1. Opret migrations og opdater databasen:
dotnet ef add migrations initialCreate
dotnet ef database update
  1. Start API'et enten i Visual Studio Run eller .NET CLI:
dotnet run

πŸ“– Brug af Swagger

NΓ₯r API’et kΓΈrer, kan du Γ₯bne:

http://localhost:5555/swagger

Her kan ud teste alle endpoints til API'et i browseren.

Hvis det kΓΈres i Docker er porten 5556: (Husk at tjekke om Docker containers kΓΈrer fΓΈr du gΓ₯r ind pΓ₯ adressen)

http://localhost:5556/swagger

🚒 Dockerization

GennemgΓ₯ Dockerfile og docker-compose.yml for at sΓ¦tte dine egne vΓ¦rdier:

Dockerfile

EXPOSE 5556 # bruges i dette projekt

docker-compose.yml

# Under api:
ports:
      - "5556:5556"   # Docker API port
environment:
      - ConnectionStrings__DefaultConnection=Server=db;Port=3306;Database=cerealdb;User=DockerUserDb;Password=DockerPassDb;
      - ASPNETCORE_URLS=http://+:5556
      - DOTNET_ENVIRONMENT=Development
# Under db:
environment:
  MYSQL_ROOT_PASSWORD: DbPassIDocker
  MYSQL_DATABASE: cerealdb
  MYSQL_ROOT_HOST: '%'
ports:
- "3308:3306"   # Docker MySQL port

Derefter kan de startes gennem Docker Desktop, eller med Docker CLI fra rod-mappen (samme sted som README):

docker compose up --build

πŸ”„ CI/CD Pipeline

Pipelinen (defineret i Jenkinsfile) bestΓ₯r af fire hovedtrin: 🧾 Checkout – Henter projektet fra GitHub πŸ—οΈ Build – Genskaber og kompilerer .NET-projektet πŸ§ͺ Test – KΓΈrer enhedstests πŸš€ Deploy – Genstarter containerne via Docker Compose


🧭 Continous Integration Flowchart (Rough sketch)

        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚       GitHub         β”‚
        β”‚    (CerealAPI Repo)  β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                   β”‚ Push / Commit
                   β–Ό
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚       Jenkins        β”‚
        β”‚   CI/CD Pipeline     β”‚
        β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
        β”‚  1️⃣ Build & Test     β”‚
        β”‚  2️⃣ Docker Compose   β”‚
        β”‚  3️⃣ Deploy API       β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                   β”‚
                   β–Ό
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚        Docker Host         β”‚
        β”‚                            β”‚
        β”‚  πŸ₯£ CerealAPI | 🐬 MySQL  β”‚
        β”‚                            β”‚
        β”‚ Swagger β†’ localhost:5556   β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Repo Flow: NΓ₯r der pushes ny kode til GitHub, trigger Jenkins pipelinen, der automatisk bygger, tester og genstarter hele miljΓΈet i Docker. (I teorien)


πŸ§ͺ Test

Kald Lokalt API fra terminalen:

curl https://localhost:5555/api/cereal

Eller benyt Swagger til GET/POST requests.

Kald Dockerized API i terminalen:

curl http://localhost:5556/api/cereal

πŸ“‹ Mulige udvidelser

  • Jenkins Agent (docker image)
  • Frontend (React?)