Skip to content

Commit 818d809

Browse files
Merge branch 'release/0.1.0'
2 parents db80752 + ad5d69e commit 818d809

8 files changed

Lines changed: 273 additions & 9 deletions

File tree

.claude/settings.local.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
{
22
"permissions": {
33
"allow": [
4-
"Bash(mv:*)"
4+
"Bash(mv:*)",
5+
"Bash(git submodule add:*)"
56
],
67
"deny": [],
78
"ask": []

.gitmodules

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[submodule "Clients/TalentManagement-Angular-Material"]
2+
path = Clients/TalentManagement-Angular-Material
3+
url = https://github.com/workcontrolgit/TalentManagement-Angular-Material.git
4+
[submodule "ApiResources/TalentManagement-API"]
5+
path = ApiResources/TalentManagement-API
6+
url = https://github.com/workcontrolgit/TalentManagement-API.git
7+
[submodule "TokenService/Duende-IdentityServer"]
8+
path = TokenService/Duende-IdentityServer
9+
url = https://github.com/workcontrolgit/Duende-IdentityServer.git

ApiResources/TalentManagement-API

Submodule TalentManagement-API added at ae364a2

CLAUDE.md

Lines changed: 241 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,241 @@
1+
# CLAUDE.md
2+
3+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4+
5+
## Repository Overview
6+
7+
This is a **tutorial repository** demonstrating the **CAT (Client, API Resource, Token Service)** pattern using Git submodules. Each component is a separate repository that can be developed independently.
8+
9+
**Tutorial Repository**: https://github.com/workcontrolgit/AngularNetTutotial.git
10+
11+
## Architecture: CAT Pattern with Git Submodules
12+
13+
### Three-Tier Architecture
14+
15+
```
16+
AngularNetTutorial/
17+
├── Clients/TalentManagement-Angular-Material/ # Git submodule
18+
├── ApiResources/TalentManagement-API/ # Git submodule
19+
└── TokenService/Duende-IdentityServer/ # Git submodule
20+
```
21+
22+
Each folder is a **git submodule** pointing to its own repository:
23+
- `Clients/`: Angular 20 + Material Design client (ng-matero template)
24+
- `ApiResources/`: .NET 10 Web API with Clean Architecture
25+
- `TokenService/`: Duende IdentityServer 7.0 for OAuth 2.0/OIDC
26+
27+
### Authentication Flow
28+
29+
1. User visits Angular app (`http://localhost:4200`)
30+
2. Login redirects to IdentityServer (`https://localhost:44310`)
31+
3. IdentityServer authenticates user, issues ID token + access token
32+
4. Angular stores tokens, attaches access token to API requests
33+
5. API validates token against IdentityServer, returns protected data
34+
35+
## Running the Full Stack
36+
37+
**Start all three services in this order:**
38+
39+
```bash
40+
# Terminal 1: IdentityServer (must start first)
41+
cd TokenService/Duende-IdentityServer/src/Duende.STS.Identity
42+
dotnet run
43+
44+
# Terminal 2: API (needs IdentityServer running)
45+
cd ApiResources/TalentManagement-API
46+
dotnet run
47+
48+
# Terminal 3: Angular Client
49+
cd Clients/TalentManagement-Angular-Material/talent-management
50+
npm start
51+
```
52+
53+
**Application URLs:**
54+
- Angular: `http://localhost:4200`
55+
- API: `https://localhost:44378`
56+
- IdentityServer: `https://localhost:44310`
57+
- IdentityServer Admin: `https://localhost:44303`
58+
- IdentityServer Admin API: `https://localhost:44302`
59+
60+
## Working with Git Submodules
61+
62+
### Initial Clone
63+
64+
```bash
65+
# Clone with all submodules
66+
git clone --recurse-submodules https://github.com/workcontrolgit/AngularNetTutotial.git
67+
68+
# Or initialize submodules after cloning
69+
git submodule update --init --recursive
70+
```
71+
72+
### Making Changes in a Submodule
73+
74+
**Critical**: Submodules have their own Git history. Changes must be committed in the submodule first, then the parent.
75+
76+
```bash
77+
# 1. Navigate to submodule and make changes
78+
cd Clients/TalentManagement-Angular-Material
79+
git checkout develop # or appropriate branch
80+
# ... make your changes ...
81+
git add .
82+
git commit -m "Your changes"
83+
git push
84+
85+
# 2. Return to parent and update reference
86+
cd ../..
87+
git add Clients/TalentManagement-Angular-Material
88+
git commit -m "Update Angular client submodule"
89+
git push
90+
```
91+
92+
### Pulling Latest Changes
93+
94+
```bash
95+
# Pull parent repo changes
96+
git pull
97+
98+
# Update all submodules to their referenced commits
99+
git submodule update --init --recursive
100+
101+
# OR pull latest from submodule's remote branch
102+
git submodule update --remote --merge
103+
```
104+
105+
### Check Submodule Status
106+
107+
```bash
108+
git submodule status
109+
# Shows current commit hash for each submodule
110+
```
111+
112+
### Common Submodule Issues
113+
114+
**Submodule shows modified but you didn't change anything:**
115+
- Submodule is on a different commit than parent expects
116+
- Navigate to submodule: `cd Clients/TalentManagement-Angular-Material`
117+
- Check status: `git status` and `git log`
118+
- Reset to parent's expected commit or commit the change
119+
120+
**Submodule folder is empty:**
121+
```bash
122+
git submodule update --init --recursive
123+
```
124+
125+
## Configuration Dependencies
126+
127+
### IdentityServer Configuration
128+
129+
**File**: `TokenService/Duende-IdentityServer/src/Duende.Admin/identityserverdata.json`
130+
131+
Key configuration for Angular client:
132+
```json
133+
{
134+
"ClientId": "TalentManagement",
135+
"AllowedScopes": [
136+
"openid",
137+
"email",
138+
"profile",
139+
"roles",
140+
"app.api.talentmanagement.read",
141+
"app.api.talentmanagement.write"
142+
],
143+
"RedirectUris": ["http://localhost:4200/callback"],
144+
"PostLogoutRedirectUris": ["http://localhost:4200"]
145+
}
146+
```
147+
148+
### Angular Environment Configuration
149+
150+
**File**: `Clients/TalentManagement-Angular-Material/talent-management/src/environments/environment.ts`
151+
152+
Must match IdentityServer configuration:
153+
```typescript
154+
identityServerUrl: 'https://localhost:44310'
155+
clientId: 'TalentManagement'
156+
scope: 'openid profile email roles app.api.talentmanagement.read app.api.talentmanagement.write'
157+
```
158+
159+
### API Configuration
160+
161+
**File**: `ApiResources/TalentManagement-API/appsettings.json`
162+
163+
Must trust IdentityServer:
164+
```json
165+
{
166+
"IdentityServer": {
167+
"Authority": "https://localhost:44310"
168+
}
169+
}
170+
```
171+
172+
## Development Workflow
173+
174+
### Branching Strategy
175+
176+
Parent repository tracks submodule commits, not branches. Each submodule has its own branch strategy:
177+
- Angular: Uses `develop` and `master` branches
178+
- API: Check submodule for branch strategy
179+
- IdentityServer: Check submodule for branch strategy
180+
181+
### Testing Changes Across Multiple Submodules
182+
183+
When changes span multiple components (e.g., new API endpoint + Angular UI):
184+
185+
1. Make changes in API submodule, commit, push
186+
2. Make changes in Angular submodule, commit, push
187+
3. Update parent repo to reference both new commits
188+
4. Test the integration locally before pushing parent
189+
190+
### Port Conflicts
191+
192+
If ports are already in use:
193+
- **IdentityServer**: Edit `Properties/launchSettings.json`
194+
- **API**: Edit `Properties/launchSettings.json`
195+
- **Angular**: Use `ng serve --port 4201` or edit `angular.json`
196+
197+
## Component-Specific Documentation
198+
199+
Each submodule has its own documentation:
200+
201+
### Angular Client Documentation
202+
- `Clients/TalentManagement-Angular-Material/docs/claude-code-guide.md` - Comprehensive development guide
203+
- `Clients/TalentManagement-Angular-Material/docs/` - Feature plans, implementation guides
204+
205+
### API Documentation
206+
- Check `ApiResources/TalentManagement-API/` for API-specific documentation
207+
208+
### IdentityServer Documentation
209+
- Check `TokenService/Duende-IdentityServer/` for IdentityServer configuration guides
210+
211+
## Common Development Tasks
212+
213+
### Adding a New API Scope
214+
215+
1. Update `TokenService/.../identityserverdata.json` with new scope
216+
2. Restart IdentityServer
217+
3. Update Angular `environment.ts` scope string
218+
4. Update API to protect endpoints with `[Authorize]` requiring the scope
219+
220+
### Troubleshooting Authentication Issues
221+
222+
Common issue: **"invalid_scope" error**
223+
- Cause: Angular requests a scope not in IdentityServer's `AllowedScopes`
224+
- Fix: Ensure `environment.ts` scope matches `identityserverdata.json` exactly
225+
226+
Common issue: **Angular stuck at login page after successful auth**
227+
- Cause: Auth guard using wrong authentication service
228+
- Fix: Verify `auth-guard.ts` uses `OidcAuthService.isAuthenticated()`
229+
230+
Common issue: **CORS errors**
231+
- Cause: IdentityServer URL mismatch
232+
- Fix: Ensure `environment.ts` identityServerUrl matches running IdentityServer URL
233+
234+
### Verifying Full Stack Integration
235+
236+
1. Start all three services
237+
2. Navigate to `http://localhost:4200`
238+
3. Click login → should redirect to IdentityServer
239+
4. Login with test credentials
240+
5. Should redirect back to Angular dashboard
241+
6. API calls should work (check Network tab for 200 responses with Bearer token)

README.md

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ This repository demonstrates the **Client, API Resource, and Token Service (CAT)
77
## Repository Structure
88

99
```
10-
medium/
10+
AngularNetTutorial/
1111
├── Clients/
1212
│ └── TalentManagement-Angular-Material/ # Angular Material client
1313
├── ApiResources/
@@ -55,12 +55,12 @@ git submodule update --init --recursive
5555
#### 1. Start the Token Service (Identity Server)
5656

5757
```bash
58-
cd TokenService/Duende-IdentityServer
58+
cd TokenService/Duende-IdentityServer/src/Duende.STS.Identity
5959
dotnet restore
6060
dotnet run
6161
```
6262

63-
Default URL: `https://localhost:5001`
63+
**URL**: `https://localhost:44310`
6464

6565
#### 2. Start the API Resource
6666

@@ -70,17 +70,27 @@ dotnet restore
7070
dotnet run
7171
```
7272

73-
Default URL: `https://localhost:7001`
73+
**URL**: `https://localhost:44378`
7474

7575
#### 3. Start the Angular Client
7676

7777
```bash
78-
cd Clients/TalentManagement-Angular-Material
78+
cd Clients/TalentManagement-Angular-Material/talent-management
7979
npm install
8080
npm start
8181
```
8282

83-
Default URL: `http://localhost:4200`
83+
**URL**: `http://localhost:4200`
84+
85+
## Application URLs
86+
87+
| Component | URL | Description |
88+
|-----------|-----|-------------|
89+
| **Angular Client** | `http://localhost:4200` | Main application UI |
90+
| **Web API** | `https://localhost:44378` | RESTful API endpoints |
91+
| **IdentityServer** | `https://localhost:44310` | Authentication & Authorization |
92+
| **IdentityServer Admin** | `https://localhost:44303` | IdentityServer admin panel |
93+
| **IdentityServer Admin API** | `https://localhost:44302` | IdentityServer admin API |
8494

8595
## Architecture Overview
8696

SETUP-SUBMODULES.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ This guide will help you convert the existing repositories into proper Git submo
77
## Current Situation
88

99
You have:
10-
- A parent Git repository initialized at `c:\apps\medium`
10+
- A parent Git repository initialized at `c:\apps\AngularNetTutotial`
1111
- Three component folders with their own Git repositories (or content)
1212

1313
## Steps to Set Up Submodules
@@ -21,7 +21,7 @@ Before running these commands, **close VS Code** or any other applications that
2121
Open PowerShell or Git Bash and navigate to your project:
2222

2323
```bash
24-
cd c:\apps\medium
24+
cd c:\apps\AngularNetTutotial
2525
```
2626

2727
Remove the existing folders (they have their .git directories removed already):

TokenService/Duende-IdentityServer

Submodule Duende-IdentityServer added at b634658

0 commit comments

Comments
 (0)