MOR-PLN-028 Version 1 Last Review Date: March, 2025
Portal - Codebase Overview
1. Overview
2.
3. Solution Project List
The following is a list of the projects within the 'PMMS' solution, with a brief description.
| Solution | Folder | Project | Description |
|---|---|---|---|
| PMMS | Business Layer | PMMS.Business.CQRS | |
| PMMS | Business Layer | PMMS.Business.Portal | Business Logic Layer |
| PMMS | Common | EntityFramework.DynamicFilters | Used for declaring security filters on classes in complex ways. Replaces RLS as RLS didn't perform well. |
| PMMS | Common | PMMS.AuditLogShipping | |
| PMMS | Common | PMMS.Common | |
| PMMS | Common | PMMS.Core | |
| PMMS | Common | PMMS.Files | |
| PMMS | Common | PMMS.Notifications | |
| PMMS | Common | TrackerEnabledDbContext | |
| PMMS | Common | TrackerEnabledDbContext.Common | |
| PMMS | Presentation Layer / Functions | PMMS.Functions.ImageResize | |
| PMMS | Presentation Layer / Functions | PMMS.Functions.Integrations.Publisher | |
| PMMS | Presentation Layer / Functions | PMMS.Functions.Integrations.Subscriber | |
| PMMS | Presentation Layer / Functions | PMMS.Functions.Services | |
| PMMS | Presentation Layer / Functions | PMMS.Functions.v3 | |
| PMMS | Presentation Layer / Webjobs | PMMS.WebJobs.BulkAssignment | |
| PMMS | Presentation Layer / Webjobs | PMMS.WebJobs.Emailing | |
| PMMS | Presentation Layer / Webjobs | PMMS.WebJobs.Hangfire | |
| PMMS | Presentation Layer / Webjobs | PMMS.WebJobs.LogShipping | |
| PMMS | Presentation Layer / Webjobs | PMMS.WebJobs.NotificationDistribution | |
| PMMS | Presentation Layer / Webjobs | PMMS.WebJobs.RaiseQueuedWorkOrders | |
| PMMS | Presentation Layer / Webjobs | PMMS.WebJobs.TimerTriggered | |
| PMMS | Presentation Layer / Webs | PMMS.Web.ClientPortalApi | UI Layer - Most API Logic |
| PMMS | Presentation Layer / Webs | PMMS.Web.TenantPortalMVC | UI Layer - Serves Frontend Applicaiton. File downloads |
| PMMS | Presentation Layer | PMMS.Web.Common | Shared elements |
| PMMS | Service Layer | PMMS.Services.DataAccess | Data Access Layer |
| PMMS | Solution Items / Auth0 | various files | Storage of Hooks and Rules used within Auth0 |
| PMMS | Solution Items | various files | Pipeline YAML and configuration |
| PMMS | Testing | PMMS.Business.AuditLog.Tests | |
| PMMS | Testing | PMMS.Business.Portal.Tests | |
| PMMS | Testing | PMMS.Integrations.Tests | |
| PMMS | Testing | PMMS.Notifications.Tests | |
| PMMS | Testing | PMMS.QA.Selenium.Common | |
| PMMS | Testing | PMMS.Web.ClientPortalApi.Tests | |
| PMMS | Testing | PMMS.Web.Selenium.Tests | |
| PMMS | Testing | PMMS.Web.TenantPortalMvc.Tests | |
| PMMS | Testing | PMMS.Web.Test.Common | |
| PMMS | Tools | CodeGen | |
| PMMS | Tools | ScriptDb |
4.
Webjobs
Offloaded functions that run asynchronously
TimerTriggered
contains 10-15 webjobs that run on a timer trigger
Log Shipping
In the context of this app referes to producing raw audit logs that produces data for Change Log sections.
Hangfire
Chron Scheduling system used for triggering integration events. Applies only to some Integration Actions Isn't used for Webhook events as these are action triggered.
Emailing
Handles delivery of emails
Functions
Can be hosted in linux machines (cheaper)
Integrations Publisher
Takes integration event and fans them out into multiple events, where each event has an integration event.
Integration Subscriber
Receives the fan-outed events and processes the event, such as invoking an API
Functions v3
v3 refers to functions framework Should be upgraded. There is a task for this on the board.
Generates PDF's with puppeteer
Data Access Layer
model set up translates into entity model for sql server holds the generatesd dto's (data transfer objects)
Tools Codegen All codegen tempaltes are here outputs generated files to different projects
3 ditinct APIs Odata DTO API (internal) not acessible to externals. Used as replacement to OData Public API. REST(also DTO) extenstion to internal API.
Agglomerates code generated hierarchical index of all the properties in a domain class that can cause changes to either that class or a class that contains objects of that class.
Example: If you have a Work Request, and you have documents associated with the Work Request.
When a document is changed, you may want to trigger a change on the Work Request. So a way was needed
During the Log Shipping process,