145 lines
5.8 KiB
Markdown
145 lines
5.8 KiB
Markdown
# 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
|
||
|
||
```xml
|
||
<DefineConstants Condition=" '$(SUBSCRIPTION_BUILD)' == 'true' ">$(DefineConstants);SUBSCRIPTION_BUILD</DefineConstants>
|
||
```
|
||
|
||
```csharp
|
||
#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`.
|