ActiviGo är en webbapplikation för att hitta, visa och boka aktiviteter i en kommun. Projektet består av en .NET 8 Web API-backend och en React + Vite-frontend, designad för att erbjuda en sömlös användarupplevelse.
ActiviGo är en webbapplikation för att hitta, visa och boka aktiviteter i en kommun. Systemet består av en .NET 8 Web API-backend och en React + Vite-frontend, designad för att erbjuda en sömlös användarupplevelse.
API:et kan användas av olika typer av aktivitetsledare för att skapa och hantera förekomster av aktiviteter. Det har CRUD-funktionalitet för att hantera platser, underplatser (som ett gym och en simhall i samma arena) och bokningar.
- Teknik
- Arkitekturöversikt
- Snabbstart och lokal körning
- API-endpoints
- Felsökning
- Gruppens arbetsprocess
- Team
| Teknologi | Version | Användning |
|---|---|---|
| .NET | 8.0 | Runtime & Framework |
| ASP.NET Core | 8.0 | Web API |
| Entity Framework Core | 8.0.20 | ORM & Databasåtkomst |
| SQL Server | 2022 | Databas |
| FluentValidation | 12.0.0 | Datavalidering |
| AutoMapper | 13.0.1 | DTO-mappning |
| JWT Bearer | 8.0.20 | Autentisering |
| RestSharp | 112.1.0 | HTTP-klient |
| Swashbuckle | 6.6.2 | API-dokumentation (Swagger) |
Microsoft.EntityFrameworkCore (8.0.20)Microsoft.EntityFrameworkCore.Design (8.0.20)Microsoft.EntityFrameworkCore.SqlServer (8.0.20)Microsoft.EntityFrameworkCore.Tools (8.0.20)AutoMapper (13.0.1)FluentValidation (12.0.0)FluentValidation.DependencyInjectionExtensions (12.0.0)Microsoft.AspNetCore.Authentication.JwtBearer (8.0.20)RestSharp (112.1.0)Swashbuckle.AspNetCore (6.6.2)
| Teknologi | Version | Användning |
|---|---|---|
| React | 18.x | UI-bibliotek |
| Vite | 5.x | Build-tool & Dev Server |
| React Router | 6.x | Navigering |
API:et använder en N-tier-struktur med fyra distinkta lager: Infrastruktur hanterar kommunikation med databasen, WebAPI hanterar kommunikation med slutanvändare, Core hanterar kärnmodeller för programmet och Service hanterar affärslogik, mappning och validering.
┌─────────────────────────────────────────┐
│ WebAPI Layer (Controllers) │
│ - HTTP endpoints, authentication │
└─────────────────┬───────────────────────┘
│
┌─────────────────▼───────────────────────┐
│ Service Layer │
│ - Business logic, validation, mapping │
└─────────────────┬───────────────────────┘
│
┌─────────────────▼───────────────────────┐
│ Infrastructure Layer │
│ - DbContext, Repositories, Data access │
└─────────────────┬───────────────────────┘
│
┌─────────────────▼───────────────────────┐
│ Core Layer │
│ - Domain models, interfaces │
└─────────────────────────────────────────┘
ActiviGo/
├── ActiviGoApi/ # Backend Solution
│ │
│ ├── ActiviGoApi.sln # Visual Studio Solution
│ │
│ ├── ActiviGoApi.Core/ # Core Layer - Domänmodeller
│ │ ├── Models/ # Entiteter
│ │ └── Interfaces/ # Interfaces
│ │
│ ├── ActiviGoApi.Infrastructur/ # Infrastructure Layer - Dataåtkomst
│ │ ├── Data/ # DbContext & Seed
│ │ ├── Migrations/ # EF migrations
│ │ └── Repositories/ # Repository-implementationer
│ │
│ ├── ActiviGoApi.Services/ # Service Layer - Affärslogik
│ │ ├── DTOs/ # Data Transfer Objects
│ │ ├── Services/ # Tjänster
│ │ ├── Mapping/ # AutoMapper profiles
│ │ ├── Validation/ # FluentValidation
│ │ └── Interfaces/ # Service interfaces
│ │
│ └── ActiviGoApi.WebApi/ # WebAPI Layer - Controllers
│ ├── Controllers/ # API-controllers
│ ├── Program.cs # Startup & DI
│ ├── appsettings.json # Konfiguration
│ └── Properties/ # Launch settings
│
└── Client/ # Frontend-projekt (React + Vite)
├── public/ # Statiska filer
├── src/
│ ├── api/ # API-anrop & services
│ ├── assets/ # Bilder, ikoner, etc.
│ ├── Components/ # React-komponenter
│ │ ├── Cards/ # Card-komponenter
│ │ ├── Display/ # Display-komponenter
│ │ ├── Layout/ # Layout-komponenter
│ │ └── Pages/ # Sidkomponenter
│ │ └── Admin/ # Admin-sidor
│ ├── contexts/ # React Context providers
│ ├── App.jsx # Root-komponent & routing
│ ├── main.jsx # Entry point
│ └── responsive.css # Responsive design styles
|
├── package.json # NPM dependencies & scripts
├── vite.config.js # Vite konfiguration
└── .env # Miljövariabler (gitignored)
Platsen för backend-koden finns i ActiviGoApi/
-
ActiviGoApi.sln - Visual Studio Solution-fil
-
ActiviGoApi.WebApi/
Program.cs- Huvudfil för uppstart, konfiguration och Dependency Injection (DI)appsettings.json- Konfigurationsfil (kan vara .gitignored för säkerhet)Controllers/- API-controllers för alla endpoints
-
ActiviGoApi.Infrastructur/
ToadContext.cs- EF Core DbContext för databasåtkomstSeedData.cs- Inkluderar initial data (t.ex. kategorier, aktiviteter, platser)Migrations/- Entity Framework migrationer- Exempel:
20251009092802_moreSeedData.cs - Exempel:
20251023112936_activity-fix-and-seedlatlong.cs
- Exempel:
Repositories/- Repository-implementationer
-
ActiviGoApi.Core/
Models/- Domänmodeller och entiteterLocation.csochSubLocation.cs- Modeller för platser och underplatserActivity.cs,Booking.cs,Category.cs- Övriga entiteter
Interfaces/- Interfaces för repositories och services
-
ActiviGoApi.Services/
DTOs/- Data Transfer Objects- Exempel:
GetSubLocationResponse.cs,CreateActivityRequest.cs
- Exempel:
Services/- Affärslogik och tjänsterValidation/- FluentValidation validatorsMapping/- AutoMapper profiles
Platsen för frontend-koden finns i Client/
- package.json - Definierar beroenden och skript
- vite.config.js - Vite konfiguration
- Client/src/
Components/- React-komponenter organiserade i underkatalogerapi/- API-anrop och servicescontexts/- React Context providersApp.jsx- Root-komponent med routingmain.jsx- Entry point
- Backend: .NET 8 SDK
- Frontend: Node.js (med npm eller yarn)
- Databas: SQL Server (LocalDB eller full installation)
git clone https://github.com/Darkdusk234/ActiviGo.git
cd ActiviGoProjektet använder Entity Framework Core (Code-First). I appsettings.json hittar du anslutningssträngen för SQL Server.
Öppna ActiviGoApi/ActiviGoApi.WebApi/appsettings.json och justera anslutningssträngen efter din lokala setup:
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=ActiviGoDB;Trusted_Connection=true;TrustServerCertificate=true;"
},
"Jwt": {
"Key": "din-hemliga-nyckel-minst-32-tecken-lång",
"Issuer": "ActiviGoAPI",
"Audience": "ActiviGoClient"
}
}Viktigt: Håll känslig data borta från versionering (använd t.ex. UserSecrets eller miljövariabler).
Navigera till ActiviGoApi/ActiviGoApi.WebApi/ i en terminal och kör:
dotnet ef database update --project ../ActiviGoApi.Infrastructur/ActiviGoApi.Infrastructur.csprojDetta skapar databasen och tillämpar all seed-data från SeedData.cs.
Lägg till en .env-fil i roten av ActiviGoApi/ActiviGoApi.WebApi/ för SMHI eller annan väder-API-integration.
Lägg till .env i .gitignore för att undvika att spara känslig data.
I samma katalog (ActiviGoApi/ActiviGoApi.WebApi/), kör:
dotnet build
dotnet runAPI:et startar på https://localhost:7XXX (porten visas i terminalen).
Öppna en ny terminal, navigera till Client/ och kör:
npm install
npm run devFrontend körs med Vite på http://localhost:5173 (se Client/vite.config.js för konfiguration).
- DbContext:
ToadContext.cshanterar databasen - Seed-data: Definieras i
SeedData.csoch inkluderar kategorier, aktiviteter, platser och underplatser - Migrations: Finns i
ActiviGoApi/ActiviGoApi.Infrastructur/Migrations/
Activity - Hantera aktiviteter
| Metod | Endpoint | Beskrivning | Svar |
|---|---|---|---|
| POST | /api/Activity |
Skapa ny aktivitet Body: CreateActivityRequest |
200 → GetActivityResponse |
| GET | /api/Activity |
Hämta alla aktiviteter | 200 → array av GetActivityResponse |
| GET | /api/Activity/{id} |
Hämta specifik aktivitet Path: id (int) |
200 → GetActivityResponse |
| PUT | /api/Activity/{id} |
Uppdatera aktivitet Path: id (int)Body: UpdateActivityRequest |
200 |
| DELETE | /api/Activity/{id} |
Ta bort aktivitet Path: id (int) |
200 |
| GET | /api/Activity/category/{categoryId} |
Hämta aktiviteter per kategori Path: categoryId (int) |
200 → array av GetActivityResponse404 → ProblemDetails |
ActivityOccurence - Hantera aktivitetsförekomster
| Metod | Endpoint | Beskrivning | Svar |
|---|---|---|---|
| GET | /api/ActivityOccurence |
Hämta alla förekomster | 200 → array av ActivityOccurenceResponseDTO |
| POST | /api/ActivityOccurence |
Skapa ny förekomst Body: CreateActivityOccurrenceDTO |
201 → ActivityOccurenceResponseDTO400 → ProblemDetails |
| GET | /api/ActivityOccurence/admin |
Hämta alla förekomster (admin) | 200 → array av ActivityOccurenceResponseDTO |
| GET | /api/ActivityOccurence/{id} |
Hämta specifik förekomst Path: id (int) |
200 → ActivityOccurenceResponseDTO404 → ProblemDetails |
| PUT | /api/ActivityOccurence/{id} |
Uppdatera förekomst Path: id (int)Body: UpdateActivityOccurrenceDTO |
200 → ActivityOccurenceResponseDTO400, 404 → ProblemDetails |
| DELETE | /api/ActivityOccurence/{id} |
Ta bort förekomst Path: id (int) |
204 (No Content)404 → ProblemDetails |
| POST | /api/ActivityOccurence/search |
Sök förekomster med filter Body: ActivityOccurenceSearchFilterDTO |
200 → array av ActivityOccurenceResponseDTO |
| POST | /api/ActivityOccurence/general-search |
Generell sökning Body: GeneralSearchDTO |
200 → array av ActivityOccurenceResponseDTO |
| PUT | /api/ActivityOccurence/cancel/{id} |
Avboka förekomst Path: id (int) |
204 (No Content)400, 404 → ProblemDetails |
| GET | /api/ActivityOccurence/adminstatistics |
Hämta statistik (admin) | 200 |
Booking - Hantera bokningar
| Metod | Endpoint | Beskrivning | Svar |
|---|---|---|---|
| GET | /api/Booking |
Hämta alla bokningar | 200 → array av BookingReadDTO |
| POST | /api/Booking |
Skapa ny bokning Body: BookingCreateDTO |
200 → BookingReadDTO |
| GET | /api/Booking/{id} |
Hämta specifik bokning Path: id (int) |
200 → BookingReadDTO |
| PUT | /api/Booking/{id} |
Uppdatera bokning Path: id (int)Body: BookingUpdateDTO |
200 |
| DELETE | /api/Booking/{id} |
Ta bort bokning Path: id (int) |
200 |
| GET | /api/Booking/bookings/user |
Hämta användarens bokningar | 200 → array av BookingReadDTO404 → ProblemDetails |
| PUT | /api/Booking/cancel/{id} |
Avboka Path: id (int) |
204 (No Content)400, 404 → ProblemDetails |
Auth - Autentisering
| Metod | Endpoint | Beskrivning | Svar |
|---|---|---|---|
| POST | /api/Auth |
Registrera ny användare Body: RegisterDTO |
200 |
| POST | /api/Auth/login |
Logga in Body: LoginDto |
200 |
| PUT | /api/Auth/{id} |
Uppdatera användare Path: id (string) |
200 |
| PUT | /api/Auth/reinstate/{id} |
Återställ användare Path: id (string) |
200 |
| GET | /api/Auth/AuthCheck |
Kontrollera autentisering | 200 → boolean |
Category - Hantera kategorier
| Metod | Endpoint | Beskrivning | Svar |
|---|---|---|---|
| GET | /api/Category |
Hämta alla kategorier | 200 |
| POST | /api/Category |
Skapa ny kategori Body: CategoryCreateDto |
201400 → ProblemDetails |
| GET | /api/Category/{id} |
Hämta specifik kategori Path: id (int) |
200404 → ProblemDetails |
| PUT | /api/Category/{id} |
Uppdatera kategori Path: id (int)Body: CategoryUpdateDto |
200400, 404 → ProblemDetails |
| DELETE | /api/Category/{id} |
Ta bort kategori Path: id (int) |
204 (No Content)404 → ProblemDetails |
Location - Hantera platser
| Metod | Endpoint | Beskrivning | Svar |
|---|---|---|---|
| GET | /api/Location |
Hämta alla platser | 200 → array av LocationRequestDTO |
| POST | /api/Location |
Skapa ny plats Body: CreateLocationDTO |
201 → LocationRequestDTO400, 404 → ProblemDetails |
| GET | /api/Location/{id} |
Hämta specifik plats Path: id (int) |
200 → LocationRequestDTO404 → ProblemDetails |
| PUT | /api/Location/{id} |
Uppdatera plats Path: id (int)Body: UpdateLocationDTO |
200 → LocationRequestDTO400, 404 → ProblemDetails |
| DELETE | /api/Location/{id} |
Ta bort plats Path: id (int) |
204 (No Content)404 → ProblemDetails |
SubLocation - Hantera underplatser
| Metod | Endpoint | Beskrivning | Svar |
|---|---|---|---|
| POST | /api/SubLocation |
Skapa ny underplats Body: CreateSubLocationRequest |
200 |
| GET | /api/SubLocation |
Hämta alla underplatser | 200 → array av GetSubLocationResponse |
| GET | /api/SubLocation/{id} |
Hämta specifik underplats Path: id (int) |
200 → GetSubLocationResponse |
| PUT | /api/SubLocation/{id} |
Uppdatera underplats Path: id (int)Body: UpdateSubLocationRequest |
200 |
| DELETE | /api/SubLocation/{id} |
Ta bort underplats Path: id (int) |
200 |
Weather - Väderprognos
| Metod | Endpoint | Beskrivning | Svar |
|---|---|---|---|
| POST | /api/Weather/LocationForecast |
Hämta väderprognos för plats Body: WeatherLocationForecastRequestDTO |
200 → array av WeatherResponseDTO |
| POST | /api/Weather/weather-at-time |
Hämta väder för specifik tid Body: WeatherAtTimeRequestDTO |
200 → WeatherResponseDTO |
Konfiguration/Secrets:
appsettings.json.gitignore(kontrollera att appsettings.json är ignorerad om det är avsett)
Databas/Seed:
SeedData.csToadContext.cs
Start/DI/Autentisering:
Program.cs
- Databasanslutning misslyckas: Kontrollera
ConnectionStringsiappsettings.json. - JWT-fel: Se till att
Jwt:Keyär korrekt och unik. - CORS-fel: Lägg till rätt ursprung i backend-konfigurationen om frontend körs på en annan port.
Branch-strategi:
Använd main för produktionskod, develop för integration, och feature/namn för nya funktioner.
PR-rutiner:
Öppna pull requests mot develop, minst en granskning krävs innan sammanslagning.
Inkludera beskrivning och testresultat.
Kodstandard:
Följ .NET och React best practices, inklusive konsistent namngivning
(PascalCase för klasser, camelCase för variabler)
och kommentarer för komplex logik.
Utvecklare i ActiviGo Team Toad
- Johan Svensson: "Darkdusk234" https://github.com/Darkdusk234
- Leon Johansson: "Conixen" https://github.com/Conixen
- Gustav Eriksson Söderlund: "GoodStuff15" https://github.com/GoodStuff15
- Edgar Skönnegård: "Edgarskonnegard" https://github.com/Edgarskonnegard