Files
raven/devdocs/modernization/CODEBASE-REFERENCE.md

5.8 KiB
Raw Blame History

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 Email
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.