Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/chatmodes/dotnet-maui-blazor.chatmode.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,16 @@ tools: ['edit', 'search', 'runCommands', 'runTasks', 'usages', 'problems', 'chan
mcpServers: ["upstash/context7"]
---

Expert in .NET MAUI, Blazor WebAssembly, EF Core, .NET 9. Build modern cross-platform apps with clean architecture.
Expert in .NET MAUI, Blazor WebAssembly, EF Core, .NET 10. Build modern cross-platform apps with clean architecture.

## Project: SSW.Rewards.Mobile (.NET 9)
## Project: SSW.Rewards.Mobile (.NET 10)

- **MAUI** (`src/MobileUI/`): iOS/Android, CommunityToolkit.Mvvm, Firebase
- **Blazor WASM** (`src/AdminUI/`): MudBlazor, API client
- **API** (`src/WebAPI/`): MediatR CQRS, SQL Server, EF Core
- **Architecture**: Domain → Application → Infrastructure

## C# 13 & .NET 9
## C# 14 & .NET 10

- File-scoped namespaces, primary constructors, collection expressions `[1, 2, 3]`
- Records for DTOs, pattern matching, nullable types, `var`, `[^1]` indexing
Expand Down
8 changes: 4 additions & 4 deletions .github/chatmodes/gh-actions.chatmode.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ You are an expert in GitHub Actions CI/CD workflows with deep knowledge of YAML

## Project Context

This is **SSW.Rewards.Mobile**, a .NET 9.0 solution containing:
This is **SSW.Rewards.Mobile**, a .NET 10.0 solution containing:

- **MobileUI**: .NET MAUI mobile app (iOS, Android, MacCatalyst) in `src/MobileUI/`
- **AdminUI**: Blazor Server admin portal in `src/AdminUI/`
Expand All @@ -30,9 +30,9 @@ This is **SSW.Rewards.Mobile**, a .NET 9.0 solution containing:

### Build Characteristics

- **.NET SDK**: 9.0.305 (see `global.json`)
- **.NET SDK**: 10.0.100 (see `global.json`)
- **Workloads**: `maui`, `android`, `wasm-tools` required
- **Platform TFMs**: `net9.0-android`, `net9.0-ios`, `net9.0-maccatalyst` for mobile
- **Platform TFMs**: `net10.0-android`, `net10.0-ios`, `net10.0-maccatalyst` for mobile
- **Secrets/Config**: `google-services.json` for Android (base64 encoded in vars)
- **Signing**: iOS requires certificates/provisioning profiles; Android uses keystore
- **Azure**: Deploys to Azure App Service (Web API & Admin Portal) + Notification Hub
Expand Down Expand Up @@ -80,7 +80,7 @@ All workflows are in `.github/workflows/`:

- **Workload installation**: `dotnet workload install maui android wasm-tools`
- **NuGet cache clearing**: `dotnet nuget locals all --clear` before restore
- **Multi-targeting**: Build with `-f:net9.0-android` or `-f:net9.0-ios` flags
- **Multi-targeting**: Build with `-f:net10.0-android` or `-f:net10.0-ios` flags
- **Linker/Trimming**: Recognize trimming errors and suggest `TrimMode` settings
- **AOT compilation**: For iOS (required for App Store)
- **Secrets injection**: Decode base64 secrets (e.g., `google-services.json`, signing certs)
Expand Down
8 changes: 5 additions & 3 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ This file provides GitHub Copilot with essential context about the SSW.Rewards.M

## Quick Reference

**Project Type**: .NET 9 MAUI Mobile App + Blazor WASM Admin + ASP.NET Core API
**Project Type**: .NET 10 MAUI Mobile App + Blazor WASM Admin + ASP.NET Core API
**Architecture**: Clean Architecture with CQRS (MediatR)
**Database**: SQL Server with EF Core
**Key Technologies**: .NET MAUI, Blazor, MediatR, FluentValidation, Entity Framework Core
Expand Down Expand Up @@ -44,6 +44,7 @@ var orders = await _context.Orders
```

**Rules**:

1. ✅ **Always** `.AsNoTracking()` for read-only queries
2. ✅ **Always** `.TagWithContext()` after `.AsNoTracking()`
3. ✅ **Always** `.Select()` to project, **never** `Include`/`ThenInclude` for read-only
Expand Down Expand Up @@ -94,7 +95,7 @@ public partial class HomeViewModel : ObservableObject
- **DTOs**: `{Entity}Dto` or `{Entity}ViewModel`
- **PascalCase**: Classes, methods, properties, public fields
- **camelCase**: Parameters, local variables
- **_camelCase**: Private fields
- **\_camelCase**: Private fields
- **Async suffix**: All async methods

## Common Commands
Expand Down Expand Up @@ -135,6 +136,7 @@ dotnet run --project src/AdminUI
## Documentation

See [`AGENTS.md`](../AGENTS.md) for:

- Complete technology stack details
- Full architecture documentation
- Detailed coding standards
Expand All @@ -151,4 +153,4 @@ See [`AGENTS.md`](../AGENTS.md) for:

---

**Last Updated**: November 2025 | **Target Framework**: .NET 9.0 | **MAUI Version**: 9.0.21
**Last Updated**: December 2025 | **Target Framework**: .NET 10.0 | **MAUI Version**: 10.0.x
4 changes: 2 additions & 2 deletions .github/workflows/android-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ jobs:

- name: Build and sign
run: dotnet publish src/MobileUI/MobileUI.csproj `
-f:net9.0-android -c:Release `
-f:net10.0-android -c:Release `
/p:ApplicationVersion=${{ inputs.build_number }} `
/p:AndroidKeyStore=True `
/p:AndroidSigningKeyStore="${{ github.workspace }}/sswrewards.keystore" `
Expand All @@ -65,4 +65,4 @@ jobs:
with:
name: artifacts-android-${{ inputs.build_number }}
path: |
src/MobileUI/bin/Release/net9.0-android/publish/*.aab
src/MobileUI/bin/Release/net10.0-android/publish/*.aab
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ jobs:
echo ${{ vars.GOOGLE_SERVICES_JSON }} | base64 --decode > src/MobileUI/Platforms/Android/google-services.json

- name: Build and sign Android
run: dotnet build src/MobileUI/MobileUI.csproj -f:net9.0-android --configuration Release
run: dotnet build src/MobileUI/MobileUI.csproj -f:net10.0-android --configuration Release

- name: Test
run: dotnet test ${{ inputs.project_path }} --no-build --configuration Release --logger "trx;LogFileName=test-results.trx"
Expand Down
14 changes: 7 additions & 7 deletions .github/workflows/ios-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,22 +53,22 @@ jobs:

- name: Import Provisioning Profile
run: |
echo ${{ secrets.APPLE_PROFILE }} | base64 --decode > SSW_Rewards_iOS_Distribution.mobileprovision
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
cp SSW_Rewards_iOS_Distribution.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/
echo ${{ secrets.APPLE_PROFILE }} | base64 --decode > SSW_Rewards_iOS_Distribution.mobileprovision
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
cp SSW_Rewards_iOS_Distribution.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/

- name: Copy Entitlements.plist
run: |
if [ "${{ inputs.environment }}" == "prod" ]; then
cp -f src/MobileUI/Platforms/iOS/Entitlements.production.plist src/MobileUI/Platforms/iOS/Entitlements.plist
fi

- name: Build and sign
run: dotnet publish src/MobileUI/MobileUI.csproj -v:diag -f:net9.0-ios -c:Release /p:ArchiveOnBuild=true /p:RuntimeIdentifier=ios-arm64 /p:CodeSignKey="${{ secrets.APPLE_CERT_NAME }}" /p:CodesignProvision="${{ secrets.APPLE_PROFILE_NAME }}"
run: dotnet publish src/MobileUI/MobileUI.csproj -v:diag -f:net10.0-ios -c:Release /p:ArchiveOnBuild=true /p:RuntimeIdentifier=ios-arm64 /p:CodeSignKey="${{ secrets.APPLE_CERT_NAME }}" /p:CodesignProvision="${{ secrets.APPLE_PROFILE_NAME }}"

- name: Upload iOS Artifact
uses: actions/upload-artifact@v4
with:
name: artifacts-ios-${{ inputs.build_number }}
path: |
src/MobileUI/bin/Release/net9.0-ios/ios-arm64/publish/*.ipa
path: |
src/MobileUI/bin/Release/net10.0-ios/ios-arm64/publish/*.ipa
20 changes: 10 additions & 10 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ This file provides AI agents (GitHub Copilot, Cursor, Windsurf, etc.) with essen

- **Mobile App**: .NET MAUI (iOS & Android)
- **Admin Portal**: Blazor WebAssembly with MudBlazor
- **Backend API**: ASP.NET Core Web API (.NET 9)
- **Backend API**: ASP.NET Core Web API (.NET 10)
- **Database**: SQL Server with EF Core
- **Authentication**: SSW.Identity (OIDC/OAuth2)
- **Architecture**: Clean Architecture with CQRS (MediatR)
Expand Down Expand Up @@ -105,10 +105,10 @@ Application/Achievements/

## 🛠️ Technology Stack

### Backend (.NET 9)
### Backend (.NET 10)

- **Framework**: ASP.NET Core 9.0, Minimal APIs
- **ORM**: Entity Framework Core 9.0 (SQL Server provider)
- **Framework**: ASP.NET Core 10.0, Minimal APIs
- **ORM**: Entity Framework Core 10.0 (SQL Server provider)
- **CQRS**: MediatR 12.x
- **Validation**: FluentValidation 11.x
- **Mapping**: AutoMapper (limited use, prefer manual mapping)
Expand All @@ -118,14 +118,14 @@ Application/Achievements/

### Frontend (Blazor WASM)

- **Framework**: Blazor WebAssembly (.NET 9)
- **Framework**: Blazor WebAssembly (.NET 10)
- **UI Library**: MudBlazor 6.x
- **HTTP**: Custom API client with auth handler
- **State**: Scoped services per session

### Mobile (.NET MAUI)

- **Framework**: .NET MAUI (.NET 9), targets `net9.0-ios` and `net9.0-android`
- **Framework**: .NET MAUI (.NET 10), targets `net10.0-ios` and `net10.0-android`
- **Architecture**: MVVM with `CommunityToolkit.Mvvm`
- **Navigation**: Shell-based navigation
- **DI**: Built-in .NET DI container
Expand All @@ -146,7 +146,7 @@ Application/Achievements/

## 📋 Coding Standards & Best Practices

### C# 13 & .NET 9 Conventions
### C# 14 & .NET 10 Conventions

```csharp
// File-scoped namespaces (always)
Expand Down Expand Up @@ -373,10 +373,10 @@ dotnet ef migrations add MigrationName --project src/Infrastructure --startup-pr
dotnet ef database update --project src/Infrastructure --startup-project src/WebAPI

# Mobile (Android)
dotnet build src/MobileUI/MobileUI.csproj -f net9.0-android
dotnet build src/MobileUI/MobileUI.csproj -f net10.0-android

# Mobile (iOS) - requires macOS
dotnet build src/MobileUI/MobileUI.csproj -f net9.0-ios
dotnet build src/MobileUI/MobileUI.csproj -f net10.0-ios
```

### Docker Services
Expand Down Expand Up @@ -641,4 +641,4 @@ When generating code for this project:

---

**Last Updated**: October 2025 | **Target Framework**: .NET 9.0 | **MAUI Version**: 9.0.21
**Last Updated**: December 2025 | **Target Framework**: .NET 10.0 | **MAUI Version**: 10.0.x
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# SSW Rewards Mobile App!

This is a .NET MAUI app with a .NET 8 backend.
This is a .NET MAUI app with a .NET 10 backend.

Use this app to scan SSW QR codes, earn SSW Points ⭐, claim rewards and win prizes!

Expand All @@ -21,7 +21,7 @@ Connect the outside world with SSW at events through awesome rewards!

## Roadmap

- Upgrade to .NET 9
- ✅ Upgraded to .NET 10
- Push notification support - for prize draws 🥳
- Offline access
- Better support for white labelling to allow companies to put their own branding to the app
Expand Down
Loading
Loading