Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
5f273af
maint: Relax the markdown rule on unordered lists
stephenfuqua Jul 14, 2026
a990d56
docs: Add first draft PRD for ODS Admin API 2.3
stephenfuqua Jul 14, 2026
b104cee
docs: Align Admin API PRD personas and JTBDs with Admin App PRD
stephenfuqua Jul 17, 2026
4f0b175
docs: Manual editing
stephenfuqua Jul 17, 2026
e2dccaf
docs: No need to carry these documents into the future
stephenfuqua Jul 17, 2026
9ffdaad
docs: Promote implemented SHOULD requirements to SHALL, drop unimplem…
stephenfuqua Jul 17, 2026
ec9bbb0
docs: Remove leftover documentation for cancelled "Admin Console" sup…
stephenfuqua Jul 17, 2026
eb45849
docs: Address all GHCopilot review comments
stephenfuqua Jul 17, 2026
d8b8f7e
docs: Reduce or explain implementation details that have leaked into …
stephenfuqua Jul 17, 2026
1fc1a08
Fix multitenant tenant cleanup to accept 204 deletes
Copilot Jul 17, 2026
115b62c
docs: Simplify the personas
stephenfuqua Jul 18, 2026
dcea481
docs: Fix PRD scope typo and correct coverage requirement status
stephenfuqua Jul 19, 2026
621af6b
chore: Remove unnecessary api spec markdown files
stephenfuqua Jul 19, 2026
e1fbfe4
fix: Add two required variables to the db migration script
stephenfuqua Jul 19, 2026
0a54fd2
docs: Update the copyright year
stephenfuqua Jul 17, 2026
2b931a2
docs: PRD for ODS Admin API 2.4
stephenfuqua Jul 19, 2026
405a2f8
fix: Use MSSQL connection strings
stephenfuqua Jul 19, 2026
880ddfe
docs: Clarify Open API requirement; add new audit logging requirements
stephenfuqua Jul 20, 2026
5c2e3c7
docs: Remove database record health checks
stephenfuqua Jul 20, 2026
ab9e06a
chore: Expand test script to accept a filter and a NoBuild switch for…
stephenfuqua Jul 21, 2026
d0cab5f
docs: Improve agent instructions
stephenfuqua Jul 21, 2026
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
4 changes: 2 additions & 2 deletions .github/workflows/on-pullrequest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ jobs:

- name: Run Unit Tests
if: success()
run: ./build.ps1 -Command UnitTest -Configuration Debug -RunCoverageAnalysis
run: ./build.ps1 -Command UnitTest -NoBuild -Configuration Debug -RunCoverageAnalysis

- name: Upload Coverage Report
if: always()
Expand Down Expand Up @@ -133,7 +133,7 @@ jobs:

- name: Run Integration Tests
if: success()
run: ./build.ps1 -Command IntegrationTest -Configuration Debug -UseIntegratedSecurity:$false -DbUsername "sa" -DbPassword ${{ env.DB_Password }}
run: ./build.ps1 -Command IntegrationTest -NoBuild -Configuration Debug -UseIntegratedSecurity:$false -DbUsername "sa" -DbPassword ${{ env.DB_Password }}

- name: Upload Test Results
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
Expand Down
2 changes: 1 addition & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@
"style": "underscore"
},
"ul-style": {
"style": "asterisk"
"style": "consistent"
}
},
"[markdown]": {
Expand Down
1 change: 1 addition & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Read @CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ script:post-response {
const objectName = "DataStore";
const response = await axios.delete(`${API_URL}/v3/dataStores/${bru.getVar("created-DataStoreId")}`, axiosConfig);

if (response.status === 200) {
if (response.status === 200 || response.status === 204) {
console.log(`✅ ${objectName} with ID ${bru.getVar("created-DataStoreId")} removed successfully`);
bru.deleteVar("created-DataStoreId");
} else {
Expand Down
12 changes: 6 additions & 6 deletions Application/EdFi.Ods.AdminApi/appsettings.Development.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@
"ConnectionStrings": {
"EdFi_Admin": "Data Source=.\\;Initial Catalog=EdFi_Admin7;Integrated Security=True;Trusted_Connection=true;Encrypt=True;TrustServerCertificate=True",
"EdFi_Security": "Data Source=.\\;Initial Catalog=EdFi_Security7;Integrated Security=True;Trusted_Connection=true;Encrypt=True;TrustServerCertificate=True",
"EdFi_Ods": "host=localhost;port=5881;username=postgres;password=P@ssw0rd;database=EdFi_Admin;pooling=true",
"EdFi_Master": "host=localhost;port=5881;username=postgres;password=P@ssw0rd;database=postgres;pooling=true"
"EdFi_Ods": "Data Source=.\\;Initial Catalog=EdFi_ODS;Integrated Security=True;Trusted_Connection=true;Encrypt=True;TrustServerCertificate=True",
"EdFi_Master": "Data Source=.\\;Initial Catalog=master;Integrated Security=True;Trusted_Connection=true;Encrypt=True;TrustServerCertificate=True"
},
"SwaggerSettings": {
"EnableSwagger": true,
Expand All @@ -45,16 +45,16 @@
"ConnectionStrings": {
"EdFi_Security": "Data Source=.\\;Initial Catalog=EdFi_Security;Integrated Security=True;Trusted_Connection=true;Encrypt=True;TrustServerCertificate=True",
"EdFi_Admin": "Data Source=.\\;Initial Catalog=EdFi_Admin;Integrated Security=True;Trusted_Connection=true;Encrypt=True;TrustServerCertificate=True",
"EdFi_Ods": "host=localhost;port=5881;username=postgres;password=P@ssw0rd;database=EdFi_Admin;pooling=true",
"EdFi_Master": "host=localhost;port=5881;username=postgres;password=P@ssw0rd;database=postgres;pooling=true"
"EdFi_Ods": "Data Source=.\\;Initial Catalog=EdFi_ODS;Integrated Security=True;Trusted_Connection=true;Encrypt=True;TrustServerCertificate=True",
"EdFi_Master": "Data Source=.\\;Initial Catalog=master;Integrated Security=True;Trusted_Connection=true;Encrypt=True;TrustServerCertificate=True"
}
},
"tenant2": {
"ConnectionStrings": {
"EdFi_Security": "Data Source=.\\;Initial Catalog=EdFi_Security;Integrated Security=True;Trusted_Connection=true;Encrypt=True;TrustServerCertificate=True",
"EdFi_Admin": "Data Source=.\\;Initial Catalog=EdFi_Admin;Integrated Security=True;Trusted_Connection=true;Encrypt=True;TrustServerCertificate=True",
"EdFi_Ods": "host=localhost;port=5881;username=postgres;password=P@ssw0rd;database=EdFi_Admin;pooling=true",
"EdFi_Master": "host=localhost;port=5881;username=postgres;password=P@ssw0rd;database=postgres;pooling=true"
"EdFi_Ods": "Data Source=.\\;Initial Catalog=EdFi_ODS;Integrated Security=True;Trusted_Connection=true;Encrypt=True;TrustServerCertificate=True",
"EdFi_Master": "Data Source=.\\;Initial Catalog=master;Integrated Security=True;Trusted_Connection=true;Encrypt=True;TrustServerCertificate=True"
}
}
},
Expand Down
20 changes: 11 additions & 9 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -1,25 +1,25 @@
## AGENTS (summary)
# AGENTS (summary)

This file is a concise, machine-friendly summary of repository conventions and procedures. For full developer guidance and long-form procedures, see `docs/developer.md`.

Full developer procedures and examples: `docs/developer.md` (Build Script, Running on Localhost, Application Architecture, DB migrations, test coverage).

### Sections (use these exact headers when referencing)
## Sections (use these exact headers when referencing)

* `General`
* `Coding & Tests`
* `Run & Architecture`

---

### General
## General

* Make only high-confidence suggestions when reviewing code changes.
* Do not change `NuGet.config` files unless explicitly requested.
* For short tasks, include the section name in the prompt so agents load only that section.
* Keep updates to `CLAUDE.md` concise and focused to reduce token usage; put full details, examples and long procedures in `docs/developer.md`.

### Coding & Tests
## Coding & Tests

Concise coding conventions, nullability rules, and testing basics.

Expand All @@ -28,16 +28,18 @@ Concise coding conventions, nullability rules, and testing basics.
* Language: prefer pattern matching, switch expressions, and use `nameof` for member names.
* Nullability: declare variables non-nullable where possible; validate at entry points; use `is null` / `is not null`.
* Testing: NUnit + Shouldly for assertions; use FakeItEasy for mocks; mirror existing test naming/style.
* Run tests locally: `./build.ps1 -Command UnitTest` (see `docs/developer.md` for integration/E2E instructions).
* Run tests locally:
* All unit tests, with rebuild: `./build.ps1 -Command UnitTest`
* All unit tests, without rebuild: `./build.ps1 -Command UnitTest -NoBuild`
* Filter to a specific test, without rebuild: `./build.ps1 -Command UnitTest -Filter <?>`
* See `docs/developer.md` for integration/E2E instructions

### Run & Architecture
## Run & Architecture

Short run/build/architecture notes — see `docs/developer.md` for full procedures.

* Build helper: `./build.ps1` (common commands: `build`, `UnitTest`, `IntegrationTest`, `run`).
* Local run options: `build.ps1 run`, Docker compose, or Visual Studio launch profiles.
* DB migrations: scripts and artifacts under `Application/EdFi.Ods.AdminApi/Artifacts/` and `eng/run-dbup-migrations.ps1`.
* Run bruno e2e tests for a particular specification (v1, v2, v3) locally, e.g: `./eng/run-e2e-bruno.ps1 -ApiVersion 2 -TenantMode multitenant -TearDown`.
* Run bruno e2e tests for a particular specification (v1, v2, v3) locally, e.g: `./eng/run-bruno-e2e.ps1 -ApiVersion 2 -TenantMode multitenant -TearDown`.
* Architecture: feature-based layout; `IUsersContext` handles `EdFi_Admin`, `ISecurityContext` handles `EdFi_Security` (EF Core); AutoMapper mappings in `AdminApiMappingProfile.cs`.

<!-- Changelog removed to keep AGENTS.md concise; use git history for changes. -->
2 changes: 1 addition & 1 deletion NOTICES.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
This product includes software developed at the [Ed-Fi
Alliance](https://www.ed-fi.org).

Copyright (c) 2023 Ed-Fi Alliance, LLC and contributors.
Copyright (c) 2026 Ed-Fi Alliance, LLC and contributors.

This software distribution includes or contains external references to several
open source packages that are attributed below in this notice. Where required,
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

The Ed-Fi ODS/API Admin API is a programmatic interface to administrate ODS/API
platform instances. Admin API 2.0 will support ODS/API version 7.0 and greater.
For support of ODS/API 3.4 through 6.1, please use the
For support of ODS/API 3.4 through 6.1, please use the
[latest 1.x release](https://github.com/Ed-Fi-Alliance-OSS/Ed-Fi-AdminAPI/releases).

> **Note**
Expand Down Expand Up @@ -42,7 +42,7 @@ knowledge of the code base and architecture.

## Legal Information

Copyright (c) 2023 Ed-Fi Alliance, LLC and contributors.
Copyright (c) 2026 Ed-Fi Alliance, LLC and contributors.

Licensed under the [Apache License, Version 2.0](LICENSE) (the "License").

Expand Down
35 changes: 32 additions & 3 deletions build.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,18 @@

Output: test results displayed in the console and saved to XML files.

.EXAMPLE
.\build.ps1 unittest -TestFilter "FullyQualifiedName~SomeTestClassName"

Runs only the tests matching the given dotnet test filter expression.
Works with both UnitTest and IntegrationTest commands.

.EXAMPLE
.\build.ps1 unittest -NoBuild

Skips the implicit build step in `dotnet test` by passing "--no-build".
Works with both UnitTest and IntegrationTest commands.

.EXAMPLE
.\build.ps1 push -NuGetApiKey $env:nuget_key

Expand Down Expand Up @@ -135,7 +147,16 @@ param(

# Option to run integration tests with no integrated security
[string]
$DbPassword
$DbPassword,

# Optional dotnet test filter expression (e.g. "FullyQualifiedName~SomeClassName")
# to run a subset of tests within the UnitTest or IntegrationTest commands.
[string]
$TestFilter,

# Skip building before running tests; passes "--no-build" to dotnet test.
[switch]
$NoBuild
)

$Env:MSBUILDDISABLENODEREUSE = "1"
Expand Down Expand Up @@ -171,6 +192,8 @@ $script:coverageOutputFile = "coverage.cobertura.xml"
$script:targetDir = "coveragereport"

$script:RunCoverageAnalysis = $RunCoverageAnalysis
$script:TestFilter = $TestFilter
$script:NoBuild = $NoBuild

Import-Module -Name "$PSScriptRoot/eng/build-helpers.psm1" -Force
Import-Module -Name "$PSScriptRoot/eng/package-manager.psm1" -Force
Expand Down Expand Up @@ -260,13 +283,19 @@ function RunTests {
$testAssemblies | ForEach-Object {
Write-Output "Executing: dotnet test $($_)"
Invoke-Execute {
$filterArgs = @()
if ($script:TestFilter) { $filterArgs = @('--filter', $script:TestFilter) }

$noBuildArgs = @()
if ($script:NoBuild) { $noBuildArgs = @('--no-build') }

if ($script:RunCoverageAnalysis)
{
& dotnet test $_ --collect 'XPlat Code Coverage' --settings "$solutionRoot/coverlet.runsettings" --logger "trx;LogFileName=$($_).trx" --nologo
& dotnet test $_ --collect 'XPlat Code Coverage' --settings "$solutionRoot/coverlet.runsettings" --logger "trx;LogFileName=$($_).trx" --nologo @filterArgs @noBuildArgs
}
else
{
& dotnet test $_ --logger "trx;LogFileName=$($_).trx" --nologo
& dotnet test $_ --logger "trx;LogFileName=$($_).trx" --nologo @filterArgs @noBuildArgs
}
}
}
Expand Down
50 changes: 0 additions & 50 deletions docs/Healthcheck-Worker-Removal.md

This file was deleted.

80 changes: 0 additions & 80 deletions docs/Instance-Worker-Removal.md

This file was deleted.

Loading
Loading