5.8 KiB
AyaNova v8 codebase reference
Technical facts about the v8 code, gathered from notes written in February–March 2026.
Version numbers are a snapshot from then: AyaNova.csproj and package.json are the
truth. Anything marked [unverified] has not been checked against the code.
Back end — raven/server/AyaNova/
Stack (February 2026, before the .NET 10 port)
| Component | Version | Notes |
|---|---|---|
| .NET / ASP.NET Core | 8.0 | |
| Entity Framework Core | 8.0.8 | |
| Npgsql.EntityFrameworkCore.PostgreSQL | 8.0.4 | |
| Microsoft.AspNetCore.Authentication.JwtBearer | 8.0.4 | Custom JWT implementation |
| PuppeteerSharp | 17.0.0 | PDF reports through headless Chrome |
| MailKit | 4.5.0 | |
| Swashbuckle.AspNetCore | 6.5.0 | OpenAPI |
| NLog.Web.AspNetCore | 5.3.11 | Logging |
| Asp.Versioning.Mvc | 8.1.0 | API versioning (with Asp.Versioning.Mvc.ApiExplorer) |
Structure
raven/server/AyaNova/
├── AyaNova.csproj
├── Program.cs, Startup.cs
├── biz/ business objects (…Biz.cs), report rendering (ReportBiz.cs)
├── ControllerHelpers/
├── Controllers/ API controllers
├── DataList/ data-list definitions and the SQL filter builder
├── generator/ background jobs (CoreJob…: backup, licence, sweeper …)
├── kpi/
├── models/ EF Core context and entities
├── PickList/
├── util/ ServerBootConfig, DbUtil, License, FileUtil, Mailer …
├── resource/ report templates and static resources, copied to output
│ └── rpt/ report templates (.ayrt)
└── wwwroot/ built front end and customer manual, copied in by the build
There are no Services/ or Data/ folders. Data-list classes live in the AyaNova.DataList namespace, and their class names are the
list keys (WorkOrderDataList, CustomerDataList …).
Hosted vs self-hosted
<DefineConstants Condition=" '$(SUBSCRIPTION_BUILD)' == 'true' ">$(DefineConstants);SUBSCRIPTION_BUILD</DefineConstants>
#if SUBSCRIPTION_BUILD
// hosted-subscription-only code
#endif
Reports
PuppeteerSharp renders PDFs in headless Chrome, downloaded on first run
(biz/ReportBiz.cs). Two configuration keys control it: AYANOVA_REPORT_RENDER_BROWSER_PATH
points at an existing browser instead of downloading one, and
AYANOVA_REPORT_RENDER_BROWSER_PARAMS replaces the default launch arguments
(util/ServerBootConfig.cs:84-88, :185-191).
Configuration
Program.cs:38 reads config.json beside the app, then environment variables, then the
command line (later sources win). util/ServerBootConfig.cs reads AYANOVA_* keys:
AYANOVA_DB_CONNECTION, AYANOVA_USE_URLS, AYANOVA_JWT_SECRET, AYANOVA_DATA_PATH,
AYANOVA_LOG_PATH, AYANOVA_LOG_LEVEL, AYANOVA_ATTACHMENT_FILES_PATH,
AYANOVA_BACKUP_FILES_PATH, AYANOVA_TEMP_FILES_PATH, AYANOVA_BACKUP_PG_DUMP_PATH,
AYANOVA_DEFAULT_TRANSLATION, AYANOVA_SET_SUPERUSER_PW, AYANOVA_REPORT_RENDER_*, plus
boot flags such as AYANOVA_PERMANENTLY_ERASE_DATABASE and AYANOVA_REMOVE_LICENSE_FROM_DB.
The names in older notes (ConnectionStrings__DefaultConnection, JWT_SECRET) were wrong.
The Linux packages ship a config.json from dist/assets/linux-server/ or
dist/assets/linux-desktop/; the LAN installer uses dist/assets/lan-install-config.json.
API conventions
Confirmed by the integration tests. Base http://localhost:7575/api/v8/.
| Call | Response |
|---|---|
| POST | 201, { data: <full object> } |
| GET | 200, { data: <full object> } |
| DELETE | 204, no body |
| PUT on Customer, QuoteItem, PMItem | 200, { data: { Concurrency: N } } (concurrency only) |
| PUT on Quote, PM, Contract, WorkOrder headers | 200, { data: <full object> } |
| Concurrency conflict | 409 |
| Referential integrity violation | 400, error.code = 2200 |
| Not found | 404, error.code = 2010 |
Saved data-list filters: /data-list-filter (not the older data-list-view); list with
GET /data-list-filter/list?ListKey=WorkOrderDataList.
Front end — raven-client/ayanova/
Stack
| Package | Version | Notes |
|---|---|---|
| vue | 2.6.14 | End of life December 2023 |
| vuetify | 2.6.6 | |
| vue-router | 3.5.4 | |
| vuex | 3.6.2 | plus vuex-persistedstate 2.7.1 |
| @vue/cli-service | 4.5.15 | |
| webpack | 4.46.0 | |
| sass / sass-loader | 1.52.3 / 8.0.2 | |
| fibers | 4.0.3 | Deprecated native addon; the reason Node is pinned |
| monaco-editor | 0.30.1 | Large worker files |
| others | chart.js 2.9, luxon 1.28, marked 1.2, dompurify 2.3, jwt-decode 3.1, papaparse 5.3 |
Node.js 12.22.9, pinned. Plain JavaScript, no TypeScript.
Structure
raven-client/ayanova/
├── src/
│ ├── api/ API utilities, auth, error handling
│ ├── components/ ~80 components
│ ├── views/ ~100 page components
│ ├── plugins/ Vuetify configuration
│ ├── App.vue, main.js, router.js, store.js
├── public/
├── package.json, vue.config.js, webpack.config.js
View prefixes: acc- accounting (rates, taxes), adm- administration, cust- customers,
home- dashboard and user home, inv- inventory, ops- server operations, svc- service
(work orders, quotes, PMs).
QuickBooks integration — ravenqbi/
.NET Framework 4.8, Windows Forms, x86 only (the QuickBooks SDK is 32-bit). References
interop.QBFC14.dll, which needs the QuickBooks SDK installed on the build machine.
Visual Studio is required for the Forms designer. Not part of build-release.bat.
Customer manual — raven/docs/8.0/
MkDocs with the Material theme, two sites: ayanova/ (main manual) and customer/
(customer portal). Each mkdocs.yml sets site_dir to build straight into the server's
wwwroot/docs.