Initial commit

This commit is contained in:
Colin Dawson 2026-01-20 21:50:10 +00:00
parent 75fae0580d
commit 5aa0151c59
2083 changed files with 163617 additions and 0 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

BIN
.vs/eSuite/v17/.suo Normal file

Binary file not shown.

View File

@ -0,0 +1,37 @@
{
"Version": 1,
"WorkspaceRootPath": "C:\\Users\\me\\OneDrive\\Code\\Sun\\e-suite\\",
"Documents": [
{
"AbsoluteMoniker": "D:0:0:{4A704FA7-4E3A-4CFA-B043-434A0C49AF89}|e-suite.API\\eSuite.API\\eSuite.API.csproj|c:\\users\\me\\onedrive\\code\\sun\\e-suite\\e-suite.api\\esuite.api\\dependencyinjection\\coreregistrationmodule.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4A704FA7-4E3A-4CFA-B043-434A0C49AF89}|e-suite.API\\eSuite.API\\eSuite.API.csproj|solutionrelative:e-suite.api\\esuite.api\\dependencyinjection\\coreregistrationmodule.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
}
],
"DocumentGroupContainers": [
{
"Orientation": 1,
"VerticalTabListWidth": 256,
"DocumentGroups": [
{
"DockedHeight": 200,
"SelectedChildIndex": 0,
"Children": [
{
"$type": "Document",
"DocumentIndex": 0,
"Title": "CoreRegistrationModule.cs",
"DocumentMoniker": "C:\\Users\\me\\OneDrive\\Code\\Sun\\e-suite\\e-suite.API\\eSuite.API\\DependencyInjection\\CoreRegistrationModule.cs",
"RelativeDocumentMoniker": "e-suite.API\\eSuite.API\\DependencyInjection\\CoreRegistrationModule.cs",
"ToolTip": "C:\\Users\\me\\OneDrive\\Code\\Sun\\e-suite\\e-suite.API\\eSuite.API\\DependencyInjection\\CoreRegistrationModule.cs",
"RelativeToolTip": "e-suite.API\\eSuite.API\\DependencyInjection\\CoreRegistrationModule.cs",
"ViewState": "AgIAABIAAAAAAAAAAAAAwCMAAABIAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2024-12-26T13:06:45.739Z",
"EditorCaption": ""
}
]
}
]
}
]
}

View File

@ -0,0 +1,37 @@
{
"Version": 1,
"WorkspaceRootPath": "C:\\Users\\me\\OneDrive\\Code\\Sun\\e-suite\\",
"Documents": [
{
"AbsoluteMoniker": "D:0:0:{4A704FA7-4E3A-4CFA-B043-434A0C49AF89}|e-suite.API\\eSuite.API\\eSuite.API.csproj|c:\\users\\me\\onedrive\\code\\sun\\e-suite\\e-suite.api\\esuite.api\\dependencyinjection\\coreregistrationmodule.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4A704FA7-4E3A-4CFA-B043-434A0C49AF89}|e-suite.API\\eSuite.API\\eSuite.API.csproj|solutionrelative:e-suite.api\\esuite.api\\dependencyinjection\\coreregistrationmodule.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
}
],
"DocumentGroupContainers": [
{
"Orientation": 1,
"VerticalTabListWidth": 256,
"DocumentGroups": [
{
"DockedHeight": 200,
"SelectedChildIndex": 0,
"Children": [
{
"$type": "Document",
"DocumentIndex": 0,
"Title": "CoreRegistrationModule.cs",
"DocumentMoniker": "C:\\Users\\me\\OneDrive\\Code\\Sun\\e-suite\\e-suite.API\\eSuite.API\\DependencyInjection\\CoreRegistrationModule.cs",
"RelativeDocumentMoniker": "e-suite.API\\eSuite.API\\DependencyInjection\\CoreRegistrationModule.cs",
"ToolTip": "C:\\Users\\me\\OneDrive\\Code\\Sun\\e-suite\\e-suite.API\\eSuite.API\\DependencyInjection\\CoreRegistrationModule.cs",
"RelativeToolTip": "e-suite.API\\eSuite.API\\DependencyInjection\\CoreRegistrationModule.cs",
"ViewState": "AgIAABIAAAAAAAAAAAAAwCMAAABIAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2024-12-26T13:06:45.739Z",
"EditorCaption": ""
}
]
}
]
}
]
}

Binary file not shown.

BIN
.vs/eSuite/v18/.suo Normal file

Binary file not shown.

View File

@ -0,0 +1,215 @@
{
"Version": 1,
"WorkspaceRootPath": "C:\\Users\\me\\OneDrive\\Code\\Sun\\e-suite\\",
"Documents": [
{
"AbsoluteMoniker": "D:0:0:{974467C0-14E3-D020-066A-74EDE1567927}|e-suite.API.Common\\e-suite.API.Common\\e-suite.API.Common.csproj|c:\\users\\me\\onedrive\\code\\sun\\e-suite\\e-suite.api.common\\e-suite.api.common\\models\\readperformancereportsummary.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{974467C0-14E3-D020-066A-74EDE1567927}|e-suite.API.Common\\e-suite.API.Common\\e-suite.API.Common.csproj|solutionrelative:e-suite.api.common\\e-suite.api.common\\models\\readperformancereportsummary.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{974467C0-14E3-D020-066A-74EDE1567927}|e-suite.API.Common\\e-suite.API.Common\\e-suite.API.Common.csproj|c:\\users\\me\\onedrive\\code\\sun\\e-suite\\e-suite.api.common\\e-suite.api.common\\models\\readperformancereport.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{974467C0-14E3-D020-066A-74EDE1567927}|e-suite.API.Common\\e-suite.API.Common\\e-suite.API.Common.csproj|solutionrelative:e-suite.api.common\\e-suite.api.common\\models\\readperformancereport.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{7DC1F493-76A5-3740-E774-C8DAA51ED83A}|e-suite.API.Common\\e-suite.API.Common.UnitTests\\e-suite.API.Common.UnitTests.csproj|c:\\users\\me\\onedrive\\code\\sun\\e-suite\\e-suite.api.common\\e-suite.api.common.unittests\\dtoautotester.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{7DC1F493-76A5-3740-E774-C8DAA51ED83A}|e-suite.API.Common\\e-suite.API.Common.UnitTests\\e-suite.API.Common.UnitTests.csproj|solutionrelative:e-suite.api.common\\e-suite.api.common.unittests\\dtoautotester.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{4A704FA7-4E3A-4CFA-B043-434A0C49AF89}|e-suite.API\\eSuite.API\\eSuite.API.csproj|c:\\users\\me\\onedrive\\code\\sun\\e-suite\\e-suite.api\\esuite.api\\swagger\\swaggerextension.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4A704FA7-4E3A-4CFA-B043-434A0C49AF89}|e-suite.API\\eSuite.API\\eSuite.API.csproj|solutionrelative:e-suite.api\\esuite.api\\swagger\\swaggerextension.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{4A704FA7-4E3A-4CFA-B043-434A0C49AF89}|e-suite.API\\eSuite.API\\eSuite.API.csproj|c:\\users\\me\\onedrive\\code\\sun\\e-suite\\e-suite.api\\esuite.api\\swagger\\hasallowanonymousoperationsfilter.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4A704FA7-4E3A-4CFA-B043-434A0C49AF89}|e-suite.API\\eSuite.API\\eSuite.API.csproj|solutionrelative:e-suite.api\\esuite.api\\swagger\\hasallowanonymousoperationsfilter.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{CE69D868-8B81-B043-A340-E8F23683C0A2}|e-suite.Modules.SpecificationManager\\e-suite.Modules.SpecificationManager.UnitTests\\e-suite.Modules.SpecificationManager.UnitTests.csproj|c:\\users\\me\\onedrive\\code\\sun\\e-suite\\e-suite.modules.specificationmanager\\e-suite.modules.specificationmanager.unittests\\helpers\\fakeformrepository.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{CE69D868-8B81-B043-A340-E8F23683C0A2}|e-suite.Modules.SpecificationManager\\e-suite.Modules.SpecificationManager.UnitTests\\e-suite.Modules.SpecificationManager.UnitTests.csproj|solutionrelative:e-suite.modules.specificationmanager\\e-suite.modules.specificationmanager.unittests\\helpers\\fakeformrepository.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{B612A69B-3F3A-C33C-77F5-DE6A915E4E7D}|e-suite.Modules.OrganisationManager\\e-Suite.Modules.OrganisationManger.UnitTests\\e-suite.Modules.OrganisationsManager.UnitTests.csproj|c:\\users\\me\\onedrive\\code\\sun\\e-suite\\e-suite.modules.organisationmanager\\e-suite.modules.organisationmanger.unittests\\repository\\fakeorganisationmanagerrepository.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{B612A69B-3F3A-C33C-77F5-DE6A915E4E7D}|e-suite.Modules.OrganisationManager\\e-Suite.Modules.OrganisationManger.UnitTests\\e-suite.Modules.OrganisationsManager.UnitTests.csproj|solutionrelative:e-suite.modules.organisationmanager\\e-suite.modules.organisationmanger.unittests\\repository\\fakeorganisationmanagerrepository.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{5419EC24-755C-4D26-A6F1-90F478734EC3}|e-suite.MessageProcessor\\e-suite.MessageProcessor\\e-suite.MessageProcessor.csproj|c:\\users\\me\\onedrive\\code\\sun\\e-suite\\e-suite.messageprocessor\\e-suite.messageprocessor\\dependencyinjection\\coreregistrationmodule.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{5419EC24-755C-4D26-A6F1-90F478734EC3}|e-suite.MessageProcessor\\e-suite.MessageProcessor\\e-suite.MessageProcessor.csproj|solutionrelative:e-suite.messageprocessor\\e-suite.messageprocessor\\dependencyinjection\\coreregistrationmodule.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{F3A13EA7-AB5F-977E-3F71-82C5341119CD}|e-suite.Modules.FormsManager\\e_suite.Modules.Form.ManagerUnitTest\\e_suite.Modules.FormsManagerUnitTests.csproj|c:\\users\\me\\onedrive\\code\\sun\\e-suite\\e-suite.modules.formsmanager\\e_suite.modules.form.managerunittest\\fakeformsrepository.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{F3A13EA7-AB5F-977E-3F71-82C5341119CD}|e-suite.Modules.FormsManager\\e_suite.Modules.Form.ManagerUnitTest\\e_suite.Modules.FormsManagerUnitTests.csproj|solutionrelative:e-suite.modules.formsmanager\\e_suite.modules.form.managerunittest\\fakeformsrepository.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{73E50199-E462-B108-664A-1921E56D60A7}|e-suite.Modules.CustomFieldsManager\\e_suite.Modules.CusomFieldManagerUnitTest\\e_suite.Modules.CustomFieldManagerUnitTests.csproj|c:\\users\\me\\onedrive\\code\\sun\\e-suite\\e-suite.modules.customfieldsmanager\\e_suite.modules.cusomfieldmanagerunittest\\fakecustomfieldrepository.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{73E50199-E462-B108-664A-1921E56D60A7}|e-suite.Modules.CustomFieldsManager\\e_suite.Modules.CusomFieldManagerUnitTest\\e_suite.Modules.CustomFieldManagerUnitTests.csproj|solutionrelative:e-suite.modules.customfieldsmanager\\e_suite.modules.cusomfieldmanagerunittest\\fakecustomfieldrepository.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{A3A65D33-B1BA-4F89-4567-B45103987C1E}|e-suite.Service.EFlowSync\\e-suite.Service.EFlowSync.UnitTests\\e-suite.Service.EFlowSync.UnitTests.csproj|c:\\users\\me\\onedrive\\code\\sun\\e-suite\\e-suite.service.eflowsync\\e-suite.service.eflowsync.unittests\\fakerepositories\\fakeformsrepository.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{A3A65D33-B1BA-4F89-4567-B45103987C1E}|e-suite.Service.EFlowSync\\e-suite.Service.EFlowSync.UnitTests\\e-suite.Service.EFlowSync.UnitTests.csproj|solutionrelative:e-suite.service.eflowsync\\e-suite.service.eflowsync.unittests\\fakerepositories\\fakeformsrepository.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
}
],
"DocumentGroupContainers": [
{
"Orientation": 1,
"VerticalTabListWidth": 256,
"DocumentGroups": [
{
"DockedHeight": 200,
"SelectedChildIndex": 0,
"Children": [
{
"$type": "Document",
"DocumentIndex": 0,
"Title": "ReadPerformanceReportSummary.cs",
"DocumentMoniker": "C:\\Users\\me\\OneDrive\\Code\\Sun\\e-suite\\e-suite.API.Common\\e-suite.API.Common\\models\\ReadPerformanceReportSummary.cs",
"RelativeDocumentMoniker": "e-suite.API.Common\\e-suite.API.Common\\models\\ReadPerformanceReportSummary.cs",
"ToolTip": "C:\\Users\\me\\OneDrive\\Code\\Sun\\e-suite\\e-suite.API.Common\\e-suite.API.Common\\models\\ReadPerformanceReportSummary.cs",
"RelativeToolTip": "e-suite.API.Common\\e-suite.API.Common\\models\\ReadPerformanceReportSummary.cs",
"ViewState": "AgIAAAQAAAAAAAAAAAAzwAgAAAAiAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-01-20T14:46:44.514Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 1,
"Title": "ReadPerformanceReport.cs",
"DocumentMoniker": "C:\\Users\\me\\OneDrive\\Code\\Sun\\e-suite\\e-suite.API.Common\\e-suite.API.Common\\models\\ReadPerformanceReport.cs",
"RelativeDocumentMoniker": "e-suite.API.Common\\e-suite.API.Common\\models\\ReadPerformanceReport.cs",
"ToolTip": "C:\\Users\\me\\OneDrive\\Code\\Sun\\e-suite\\e-suite.API.Common\\e-suite.API.Common\\models\\ReadPerformanceReport.cs",
"RelativeToolTip": "e-suite.API.Common\\e-suite.API.Common\\models\\ReadPerformanceReport.cs",
"ViewState": "AgIAAAUAAAAAAAAAAAAAAAoAAAAhAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-01-20T14:44:45.87Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 2,
"Title": "DtoAutoTester.cs",
"DocumentMoniker": "C:\\Users\\me\\OneDrive\\Code\\Sun\\e-suite\\e-suite.API.Common\\e-suite.API.Common.UnitTests\\DtoAutoTester.cs",
"RelativeDocumentMoniker": "e-suite.API.Common\\e-suite.API.Common.UnitTests\\DtoAutoTester.cs",
"ToolTip": "C:\\Users\\me\\OneDrive\\Code\\Sun\\e-suite\\e-suite.API.Common\\e-suite.API.Common.UnitTests\\DtoAutoTester.cs",
"RelativeToolTip": "e-suite.API.Common\\e-suite.API.Common.UnitTests\\DtoAutoTester.cs",
"ViewState": "AgIAAAcAAAAAAAAAAAA8wBMAAAAJAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-01-20T14:44:17.876Z",
"EditorCaption": ""
},
{
"$type": "Bookmark",
"Name": "ST:0:0:{6da21f7a-58db-45ce-8a78-22e8ff00cb95}"
},
{
"$type": "Bookmark",
"Name": "ST:0:0:{4e0252e6-905c-4466-b94e-c0b946fda83c}"
},
{
"$type": "Document",
"DocumentIndex": 3,
"Title": "SwaggerExtension.cs",
"DocumentMoniker": "C:\\Users\\me\\OneDrive\\Code\\Sun\\e-suite\\e-suite.API\\eSuite.API\\Swagger\\SwaggerExtension.cs",
"RelativeDocumentMoniker": "e-suite.API\\eSuite.API\\Swagger\\SwaggerExtension.cs",
"ToolTip": "C:\\Users\\me\\OneDrive\\Code\\Sun\\e-suite\\e-suite.API\\eSuite.API\\Swagger\\SwaggerExtension.cs",
"RelativeToolTip": "e-suite.API\\eSuite.API\\Swagger\\SwaggerExtension.cs",
"ViewState": "AgIAACUAAAAAAAAAAAAQwAEAAAAXAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-01-20T14:39:00.498Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 4,
"Title": "HasAllowAnonymousOperationsFilter.cs",
"DocumentMoniker": "C:\\Users\\me\\OneDrive\\Code\\Sun\\e-suite\\e-suite.API\\eSuite.API\\Swagger\\HasAllowAnonymousOperationsFilter.cs",
"RelativeDocumentMoniker": "e-suite.API\\eSuite.API\\Swagger\\HasAllowAnonymousOperationsFilter.cs",
"ToolTip": "C:\\Users\\me\\OneDrive\\Code\\Sun\\e-suite\\e-suite.API\\eSuite.API\\Swagger\\HasAllowAnonymousOperationsFilter.cs",
"RelativeToolTip": "e-suite.API\\eSuite.API\\Swagger\\HasAllowAnonymousOperationsFilter.cs",
"ViewState": "AgIAAAkAAAAAAAAAAAA7wBwAAAAJAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-01-20T14:38:02.181Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 5,
"Title": "FakeFormRepository.cs",
"DocumentMoniker": "C:\\Users\\me\\OneDrive\\Code\\Sun\\e-suite\\e-suite.Modules.SpecificationManager\\e-suite.Modules.SpecificationManager.UnitTests\\Helpers\\FakeFormRepository.cs",
"RelativeDocumentMoniker": "e-suite.Modules.SpecificationManager\\e-suite.Modules.SpecificationManager.UnitTests\\Helpers\\FakeFormRepository.cs",
"ToolTip": "C:\\Users\\me\\OneDrive\\Code\\Sun\\e-suite\\e-suite.Modules.SpecificationManager\\e-suite.Modules.SpecificationManager.UnitTests\\Helpers\\FakeFormRepository.cs",
"RelativeToolTip": "e-suite.Modules.SpecificationManager\\e-suite.Modules.SpecificationManager.UnitTests\\Helpers\\FakeFormRepository.cs",
"ViewState": "AgIAAGEAAAAAAAAAAAAqwGwAAAAsAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-01-20T14:37:50.818Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 6,
"Title": "FakeOrganisationManagerRepository.cs",
"DocumentMoniker": "C:\\Users\\me\\OneDrive\\Code\\Sun\\e-suite\\e-suite.Modules.OrganisationManager\\e-Suite.Modules.OrganisationManger.UnitTests\\Repository\\FakeOrganisationManagerRepository.cs",
"RelativeDocumentMoniker": "e-suite.Modules.OrganisationManager\\e-Suite.Modules.OrganisationManger.UnitTests\\Repository\\FakeOrganisationManagerRepository.cs",
"ToolTip": "C:\\Users\\me\\OneDrive\\Code\\Sun\\e-suite\\e-suite.Modules.OrganisationManager\\e-Suite.Modules.OrganisationManger.UnitTests\\Repository\\FakeOrganisationManagerRepository.cs",
"RelativeToolTip": "e-suite.Modules.OrganisationManager\\e-Suite.Modules.OrganisationManger.UnitTests\\Repository\\FakeOrganisationManagerRepository.cs",
"ViewState": "AgIAAA8AAAAAAAAAAAASwBgAAABFAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-01-20T14:37:42.769Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 7,
"Title": "CoreRegistrationModule.cs",
"DocumentMoniker": "C:\\Users\\me\\OneDrive\\Code\\Sun\\e-suite\\e-suite.MessageProcessor\\e-suite.MessageProcessor\\DependencyInjection\\CoreRegistrationModule.cs",
"RelativeDocumentMoniker": "e-suite.MessageProcessor\\e-suite.MessageProcessor\\DependencyInjection\\CoreRegistrationModule.cs",
"ToolTip": "C:\\Users\\me\\OneDrive\\Code\\Sun\\e-suite\\e-suite.MessageProcessor\\e-suite.MessageProcessor\\DependencyInjection\\CoreRegistrationModule.cs",
"RelativeToolTip": "e-suite.MessageProcessor\\e-suite.MessageProcessor\\DependencyInjection\\CoreRegistrationModule.cs",
"ViewState": "AgIAACkAAAAAAAAAAAASwDIAAAATAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-01-20T14:36:59.391Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 8,
"Title": "FakeFormsRepository.cs",
"DocumentMoniker": "C:\\Users\\me\\OneDrive\\Code\\Sun\\e-suite\\e-suite.Modules.FormsManager\\e_suite.Modules.Form.ManagerUnitTest\\FakeFormsRepository.cs",
"RelativeDocumentMoniker": "e-suite.Modules.FormsManager\\e_suite.Modules.Form.ManagerUnitTest\\FakeFormsRepository.cs",
"ToolTip": "C:\\Users\\me\\OneDrive\\Code\\Sun\\e-suite\\e-suite.Modules.FormsManager\\e_suite.Modules.Form.ManagerUnitTest\\FakeFormsRepository.cs",
"RelativeToolTip": "e-suite.Modules.FormsManager\\e_suite.Modules.Form.ManagerUnitTest\\FakeFormsRepository.cs",
"ViewState": "AgIAABMAAAAAAAAAAAASwBwAAABVAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-01-20T14:36:51.024Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 9,
"Title": "FakeCustomFieldRepository.cs",
"DocumentMoniker": "C:\\Users\\me\\OneDrive\\Code\\Sun\\e-suite\\e-suite.Modules.CustomFieldsManager\\e_suite.Modules.CusomFieldManagerUnitTest\\FakeCustomFieldRepository.cs",
"RelativeDocumentMoniker": "e-suite.Modules.CustomFieldsManager\\e_suite.Modules.CusomFieldManagerUnitTest\\FakeCustomFieldRepository.cs",
"ToolTip": "C:\\Users\\me\\OneDrive\\Code\\Sun\\e-suite\\e-suite.Modules.CustomFieldsManager\\e_suite.Modules.CusomFieldManagerUnitTest\\FakeCustomFieldRepository.cs",
"RelativeToolTip": "e-suite.Modules.CustomFieldsManager\\e_suite.Modules.CusomFieldManagerUnitTest\\FakeCustomFieldRepository.cs",
"ViewState": "AgIAAA0AAAAAAAAAAIAzwBYAAAA8AAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-01-20T14:36:43.076Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 10,
"Title": "FakeFormsRepository.cs",
"DocumentMoniker": "C:\\Users\\me\\OneDrive\\Code\\Sun\\e-suite\\e-suite.Service.EFlowSync\\e-suite.Service.EFlowSync.UnitTests\\FakeRepositories\\FakeFormsRepository.cs",
"RelativeDocumentMoniker": "e-suite.Service.EFlowSync\\e-suite.Service.EFlowSync.UnitTests\\FakeRepositories\\FakeFormsRepository.cs",
"ToolTip": "C:\\Users\\me\\OneDrive\\Code\\Sun\\e-suite\\e-suite.Service.EFlowSync\\e-suite.Service.EFlowSync.UnitTests\\FakeRepositories\\FakeFormsRepository.cs",
"RelativeToolTip": "e-suite.Service.EFlowSync\\e-suite.Service.EFlowSync.UnitTests\\FakeRepositories\\FakeFormsRepository.cs",
"ViewState": "AgIAABMAAAAAAAAAAIAxwBsAAABUAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-01-20T14:36:09.899Z",
"EditorCaption": ""
}
]
}
]
}
]
}

View File

@ -0,0 +1,23 @@
{
"Version": 1,
"WorkspaceRootPath": "C:\\Users\\me\\OneDrive\\Code\\Sun\\e-suite\\",
"Documents": [],
"DocumentGroupContainers": [
{
"Orientation": 1,
"VerticalTabListWidth": 256,
"DocumentGroups": [
{
"DockedHeight": 200,
"SelectedChildIndex": -1,
"Children": [
{
"$type": "Bookmark",
"Name": "ST:0:0:{4e0252e6-905c-4466-b94e-c0b946fda83c}"
}
]
}
]
}
]
}

BIN
.vs/eSuite/v18/fileList.bin Normal file

Binary file not shown.

15
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,15 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "pwa-chrome",
"request": "launch",
"name": "Launch Chrome against localhost",
"url": "http://localhost:8080",
"webRoot": "${workspaceFolder}"
}
]
}

View File

@ -0,0 +1,89 @@
Sigma Airlock
Database:
airlock
Internal IP:
172.27.18.45
External IP:
87.224.57.13
Username:
e-suite.18.45
Password:
s2f$yuSbVAd;&rXNUeP'@Z
******************************************************
Sigma Printer checklist
Database:
external crom
Internal IP:
172.27.17.228
External IP:
87.224.57.32
Username:
e-suite.service.228
Password:
Y2:y`4Q#Su+cm/LK!Vv~8<
******************************************************
Sigma web live
Database:
si6ma
Internal IP:
172.27.18.22
External IP:
87.224.57.12
Username:
e-suite-18-22
Password:
J]v6mjL#Cf3^E;?4as5cQ
******************************************************
Webstore
Database:
ftpu
Internal IP:
172.27.18.63
External IP:
87.224.57.9
Username:
e-suite.18.63
Password:
f9X{,W%3E8$`VR"Y>=vLqM

1
e-suite.API.Common/.gitattributes vendored Normal file
View File

@ -0,0 +1 @@
* -crlf

201
e-suite.API.Common/.gitignore vendored Normal file
View File

@ -0,0 +1,201 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
# User-specific files
*.suo
*.user
*.sln.docstates
# Build results
[Dd]ebug/
[Rr]elease/
x64/
[Bb]in/
[Oo]bj/
# New VS2015 folders
.vs/
# Enable "build/" folder in the NuGet Packages folder since NuGet packages use it for MSBuild targets
!packages/*/build/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
*_i.c
*_p.c
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.log
*.scc
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opensdf
*.sdf
*.cachefile
# Visual Studio profiler
*.psess
*.vsp
*.vspx
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# NCrunch
*.ncrunch*
.*crunch*.local.xml
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# NuGet Packages Directory
packages/
# Compare files
*.orig
# Windows Azure Build Output
csx
*.build.csdef
# Windows Store app package directory
AppPackages/
# Others
sql/
*.Cache
ClientBin/
[Ss]tyle[Cc]op.*
~$*
*~
*.dbmdl
*.pfx
*.publishsettings
*.swp
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file to a newer
# Visual Studio version. Backup files are not needed, because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# SQL Server files
App_Data/*.mdf
App_Data/*.ldf
# =========================
# Windows detritus
# =========================
# Windows image file caches
Thumbs.db
ehthumbs.db
# Folder config file
Desktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Mac crap
.DS_Store
# TeX files
Documentation/*.aux
Documentation/*.out
Documentation/*.pdf
Documentation/*.idx
Documentation/*.toc
Documentation/*.gz
# image resizer cache
imagecache/
*.DotSettings
# TypeScript mapping files
*.js.map
# Exclude all Typescript-generated JS files
src/Sunrise.Web.Customer/App/*.js
src/Sunrise.Web.Customer/App/**/*.js
src/Sunrise.Web.Customer/App/**/*.js
src/Sunrise.Web.Customer/Views/**/*.js
src/Sunrise.Web.Customer/Areas/**/*.js
src/Sunrise.Web.Support/Views/**/*.js
*.GhostDoc.user.dic
*.GhostDoc.xml
/TestResult.xml
*.VisualState.xml
artifacts/
/src/Sunrise.Web.Customer/Scripts/typings
# Db project
src/Sunrise.Database/*.jfm
src/Sunrise.Database/Sunrise.Database.jfm
/src/Sunrise.Database/*.jfm
/src/Sunrise.Database/Sunrise.Database.jfm
/src/Sunrise.Web.Customer/node_modules
# node modules
node_modules
.eslintrc
#NCrunch folders
_NCrunch*/
src/Sunrise.Web.FrontEnd/.eslintrc.js
src/Sunrise.Web.FrontEnd/.prettierrc
src/Sunrise.Web.FrontEnd/.vscode/settings.json
src/Sunrise.Web.Customer/Content/bundles/vendor.js

View File

@ -0,0 +1,68 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- File name extension must be .runsettings -->
<RunSettings>
<DataCollectionRunSettings>
<DataCollectors>
<DataCollector friendlyName="Code Coverage" uri="datacollector://Microsoft/CodeCoverage/2.0" assemblyQualifiedName="Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollector, Microsoft.VisualStudio.TraceCollector, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<Configuration>
<CodeCoverage>
<!--
Additional paths to search for .pdb (symbol) files. Symbols must be found for modules to be instrumented.
If .pdb files are in the same folder as the .dll or .exe files, they are automatically found. Otherwise, specify them here.
Note that searching for symbols increases code coverage runtime. So keep this small and local.
-->
<!--
<SymbolSearchPaths>
<Path>C:\Users\User\Documents\Visual Studio 2012\Projects\ProjectX\bin\Debug</Path>
<Path>\\mybuildshare\builds\ProjectX</Path>
</SymbolSearchPaths>
-->
<!--
About include/exclude lists:
Empty "Include" clauses imply all; empty "Exclude" clauses imply none.
Each element in the list is a regular expression (ECMAScript syntax). See /visualstudio/ide/using-regular-expressions-in-visual-studio.
An item must first match at least one entry in the include list to be included.
Included items must then not match any entries in the exclude list to remain included.
-->
<!-- Match assembly file paths: -->
<ModulePaths>
<Include>
<ModulePath>.*\.dll$</ModulePath>
<ModulePath>.*\.exe$</ModulePath>
</Include>
<Exclude>
<ModulePath>.*moq.dll</ModulePath>
<ModulePath>.*nunit3.testadapter.dll</ModulePath>
</Exclude>
<!-- Specifies additional list of directories where binaries static native instrumentation should be searched. -->
<IncludeDirectories>
<Directory Recursive="true">C:\b59fb11c-1611-4562-9a2b-c35719da65d3</Directory>
</IncludeDirectories>
</ModulePaths>
<!-- We recommend you do not change the following values: -->
<!-- Set this to True to collect coverage information for functions marked with the "SecuritySafeCritical" attribute. Instead of writing directly into a memory location from such functions, code coverage inserts a probe that redirects to another function, which in turns writes into memory. -->
<UseVerifiableInstrumentation>True</UseVerifiableInstrumentation>
<!-- When set to True, collects coverage information from child processes that are launched with low-level ACLs, for example, UWP apps. -->
<AllowLowIntegrityProcesses>True</AllowLowIntegrityProcesses>
<!-- When set to True, collects coverage information from child processes that are launched by test or production code. -->
<CollectFromChildProcesses>True</CollectFromChildProcesses>
<!-- When set to True, restarts the IIS process and collects coverage information from it. -->
<CollectAspDotNet>False</CollectAspDotNet>
<!-- When set to True, static native instrumentation will be enabled. -->
<EnableStaticNativeInstrumentation>True</EnableStaticNativeInstrumentation>
<!-- When set to True, dynamic native instrumentation will be enabled. -->
<EnableDynamicNativeInstrumentation>True</EnableDynamicNativeInstrumentation>
<!-- When set to True, instrumented binaries on disk are removed and original files are restored. -->
<EnableStaticNativeInstrumentationRestore>True</EnableStaticNativeInstrumentationRestore>
</CodeCoverage>
</Configuration>
</DataCollector>
</DataCollectors>
</DataCollectionRunSettings>
</RunSettings>

View File

@ -0,0 +1,20 @@
# Introduction
TODO: Give a short introduction of your project. Let this section explain the objectives or the motivation behind this project.
# Getting Started
TODO: Guide users through getting your code up and running on their own system. In this section you can talk about:
1. Installation process
2. Software dependencies
3. Latest releases
4. API references
# Build and Test
TODO: Describe and show how to build your code and run the tests.
# Contribute
TODO: Explain how other users and developers can contribute to make your code better.
If you want to learn more about creating good readme files then refer the following [guidelines](https://docs.microsoft.com/en-us/azure/devops/repos/git/create-a-readme?view=azure-devops). You can also seek inspiration from the below readme files:
- [ASP.NET Core](https://github.com/aspnet/Home)
- [Visual Studio Code](https://github.com/Microsoft/vscode)
- [Chakra Core](https://github.com/Microsoft/ChakraCore)

View File

@ -0,0 +1,136 @@
# ASP.NET Core (.NET Framework)
# Build and test ASP.NET Core projects targeting the full .NET Framework.
# Add steps that publish symbols, save build artifacts, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/dotnet-core
#name: $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)$(prerelease) # NOTE: rev resets when the default retention period expires
name: $(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)$(prerelease) # NOTE: rev resets when the default retention period expires
trigger:
branches:
include:
- '*'
pool:
vmImage: 'windows-latest'
variables:
solution: '**/*.sln'
nugetProject: 'e-suite.API.Common/e-suite.API.Common.csproj'
buildPlatform: 'Any CPU'
buildConfiguration: 'Release'
${{ if eq(variables['Build.SourceBranchName'], 'master') }}:
prerelease: ''
${{ elseif eq(variables['Build.SourceBranchName'], 'develop') }}:
prerelease: '-beta'
${{ else }}:
prerelease: '-alpha'
steps:
- task: NuGetToolInstaller@1
displayName: 'Install Nuget'
- task: NuGetCommand@2
displayName: 'Nuget Restore'
inputs:
restoreSolution: '$(solution)'
feedsToUse: config
includeNuGetOrg: true
packagesdirectory: '..\packages'
- task: VSBuild@1
displayName: 'Build Solution'
inputs:
solution: '$(solution)'
msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:DesktopBuildPackageLocation="$(build.artifactStagingDirectory)\WebApp.zip" /p:DeployIisAppPath="Default Web Site"'
platform: '$(buildPlatform)'
configuration: '$(buildConfiguration)'
- task: VSTest@2
displayName: 'Run Tests'
inputs:
testAssemblyVer2: |
**\*Tests.dll
!**\obj\**
runOnlyImpactedTests: false
runInParallel: true
codeCoverageEnabled: true
runSettingsFile: .runsettings
platform: '$(BuildPlatform)'
configuration: '$(BuildConfiguration)'
- task: BuildQualityChecks@9
displayName: 'Check build quality'
inputs:
# ===== Warnings Policy Inputs =====
checkWarnings: true # Optional
warningFailOption: fixed # Optional; Valid values: build, fixed
warningThreshold: '0' # Optional
#forceFewerWarnings: false # Optional
#allowWarningVariance: false # Optional
#warningVariance: # Required if allowWarningVariance = true
#showStatistics: false # Optional
#evaluateTaskWarnings: true # Optional
#warningTaskSelectors: '/^((vs|ms)build|ant(\s+.+)?|gradle(w)?(\s+.+)?|grunt|gulp|maven(\s+.+)?|xamarin(android|ios)|xcode(\s+.+)?|cmake|build\s+.+)$/i' # Optional (alias: warningTaskFilters)
#warningSelectors: # Optional (alias: warningFilters)
#inclusiveSelection: false # Optional (alias: inclusiveFiltering)
#evaluateFileWarnings: false # Optional
#warningFilesFolder: # Optional
#warningFiles: # Required if evaluateFileWarnings = true
#fileWarningSelectors: # Required if evaluateFileWarnings = true (alias: warningFileFilters)
#warningFilesArtifact: # Required if evaluateFileWarnings = true and (warningFailOption = build or showStatistics = true)
# ===== Code Coverage Policy Inputs =====
checkCoverage: true # Optional
coverageFailOption: fixed # Optional; Valid values: build, fixed
coverageType: lines # Optional; Valid values: blocks, lines, branches, custom
#customCoverageType: # Required if coverageType = custom
#treat0of0as100: false # Optional
coverageThreshold: '80' # Optional
forceCoverageImprovement: true # Optional
#coverageUpperThreshold: '80' # Optional
#ignoreDecreaseAboveUpperThreshold: true # Optional
#useUncoveredElements: false # Optional
#allowCoverageVariance: false # Optional
#coverageVariance: # Required if allowCoverageVariance = true
#coverageDeltaType: percentage # Optional; Valid values: absolute, percentage
#coveragePrecision: '4' # Optional
#buildConfiguration: # Optional
#buildPlatform: # Optional
#explicitSelector: false # Optional (alias: explicitFilter)
# ===== Baseline Inputs =====
#includePartiallySucceeded: true # Optional
#fallbackOnPRTargetBranch: true # Optional
#baseDefinitionSelector: # Ignored - only used by UI editor
#baseDefinitionId: # Optional
#baseRepoId: # Ignored - only used by UI editor
#baseBranchRef: # Optional
# ===== Reporting Inputs =====
#runTitle: # Optional
#fileAnalysisTitle: # Optional
# ===== Advanced Inputs =====
#disableCertCheck: false # Optional
#createBuildIssues: true # Optional
- task: DotNetCoreCLI@2
displayName: "Package Nuget Artifact"
condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))
inputs:
command: 'pack'
arguments: '--configuration $(buildConfiguration)'
packagesToPack: '$(nugetProject)'
nobuild: true
versionEnvVar: 'build.BuildNumber'
versioningScheme: 'byEnvVar'
#versioningScheme: byBuildNumber # https://docs.microsoft.com/en-us/azure/devops/pipelines/tasks/build/dotnet-core-cli?view=azure-devops#yaml-snippet
- task: NuGetCommand@2
displayName: 'Publish Nuget Artifact'
condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))
inputs:
command: 'push'
feedsToUse: 'select'
packagesToPush: '$(Build.ArtifactStagingDirectory)/**/*.nupkg;!$(Build.ArtifactStagingDirectory)/**/*.symbols.nupkg'
nuGetFeedType: 'internal'
publishVstsFeed: 'e-suite/e-suite'
versioningScheme: 'off'
allowPackageConflicts: true

View File

@ -0,0 +1,43 @@
using e_suite.API.Common.models;
using eSuite.Core.Miscellaneous;
using NUnit.Framework;
namespace e_suite.API.Common.UnitTests;
[TestFixture]
public class CustomFieldValueExtensionsUnitTests
{
[Test]
public void test()
{
//Arrange
var values = new List<CustomFieldValues>();
values.Add(new CustomFieldValues
{
Id = new GeneralIdRef
{
Id = 666,
Guid = new Guid("c8564cb3-9d42-4a56-8b0d-df1792cd6c4a")
},
Values = new List<CustomFieldValue>
{
new()
{
Value = "Hello",
DisplayValue = "Hello Display"
}
}
});
//Act
var results = values.ToCustomFieldsValues();
//Assert
Assert.That(results.Count, Is.EqualTo(1));
Assert.That(results[0].Id.Id, Is.EqualTo(666));
Assert.That(results[0].Id.Guid, Is.EqualTo(new Guid("c8564cb3-9d42-4a56-8b0d-df1792cd6c4a")));
Assert.That(results[0].Values.Count, Is.EqualTo(1));
Assert.That(results[0].Values[0].Value, Is.EqualTo("Hello"));
Assert.That(results[0].Values[0].DisplayValue, Is.EqualTo("Hello Display"));
}
}

View File

@ -0,0 +1,102 @@
using System.Reflection;
using e_suite.API.Common.models;
using NUnit.Framework;
namespace e_suite.API.Common.UnitTests;
[TestFixture]
public class DtoAutoTester
{
[Test]
public void RunTests()
{
var modelsList = new List<Type>();
var assembly = Assembly.GetAssembly(typeof(AddRoleSecurityAccess));
var allTypes = assembly!.GetTypes().Where( x => x.Namespace == "e_suite.API.Common.models");
foreach (var type in allTypes)
{
RunTestsOnClass(type);
}
}
private static void RunTestsOnClass(Type type)
{
if (type.IsAbstract)
return; //Nothing to test here, as abstract classes do not get created.
if (type.DeclaringType != null)
return; //types that have a declaring type are doing something funky, and I don't want to test them directly.
//Create an instance of the object to play with.
var instance = Activator.CreateInstance(type);
var allProperties = type.GetProperties();
foreach (var property in allProperties)
{
if (property.CanWrite)
TestCanWrite(property, instance);
if (property.CanRead)
TestCanRead(property, instance);
}
}
private static void TestCanRead(PropertyInfo property, object? instance)
{
try
{
var result = property.GetValue(instance);
}
catch(Exception ex)
{
Assert.Fail(ex.Message);
}
}
private static void TestCanWrite(PropertyInfo property, object? instance)
{
var propertyType = property.PropertyType;
if (propertyType.IsInterface)
{
try
{
var actualPropertyType = GetTypeForInterface(propertyType);
var writeValue = Activator.CreateInstance(actualPropertyType!);
property.SetValue(instance, writeValue, null);
}
catch (Exception ex)
{
Assert.Fail(ex.ToString());
}
}
else if (propertyType != typeof(string))
{
try
{
var writeValue = Activator.CreateInstance(property.PropertyType);
property.SetValue(instance, writeValue, null);
}
catch (Exception ex)
{
Assert.Fail(ex.ToString());
}
}
}
private static Type? GetTypeForInterface(Type propertyType)
{
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
var alltypes = assemblies
.SelectMany(s => s.GetTypes()).ToList();
var actualPropertyType = alltypes
.FirstOrDefault(p => p.GetInterfaces().Any(x => x == propertyType));
return actualPropertyType;
}
}

View File

@ -0,0 +1,22 @@
using e_suite.API.Common.exceptions;
using e_suite.API.Common.UnitTests.helper;
using NUnit.Framework;
namespace e_suite.API.Common.UnitTests;
[TestFixture]
public class ExceptionUnitTests
{
[TestCase(typeof(ExistsException))]
[TestCase(typeof(InvalidEmailException))]
[TestCase(typeof(InvalidReferenceObjectId))]
[TestCase(typeof(MaximumRangeException))]
[TestCase(typeof(MinimumRangeException))]
[TestCase(typeof(NotFoundException))]
[TestCase(typeof(TokenInvalidException))]
[TestCase(typeof(WeakPasswordException))]
public void ExistsException_PerformExcpetionTests(Type testcase)
{
ExceptionTester.PerformTestSuite(testcase);
}
}

View File

@ -0,0 +1,164 @@
using System.ComponentModel.DataAnnotations;
using e_suite.API.Common.models;
using eSuite.Core.Miscellaneous;
using eSuite.Core.Sequences;
using NUnit.Framework;
namespace SequenceManager.UnitTests;
[TestFixture]
public class ValidateUnitTests
{
[Test]
public void Validate_MissingNumericPlaceholder_FailValidation()
{
// Arrange
var sequence = new Sequence
{
GeneralIdRef = new GeneralIdRef { Guid = Guid.NewGuid() },
Increment = 1,
Name = "Sequence name",
Pattern = "{DD}",
RolloverType = Rollover.Day,
Seed = 1
};
var context = new ValidationContext(sequence);
// Act
var results = sequence.Validate(context).ToList();
// Assert
Assert.That(results.Count, Is.EqualTo(1));
Assert.That(results[0].MemberNames.Count(), Is.EqualTo(1));
Assert.That(results[0].MemberNames.ToList()[0], Is.EqualTo(nameof(Sequence.Pattern)));
Assert.That(results[0].ErrorMessage, Is.EqualTo("At minimum all patterns must contain one numeric value (i.e. [0])"));
}
[Test]
public void Validate_MissingYearPlaceholder_FailValidation()
{
// Arrange
var sequence = new Sequence
{
GeneralIdRef = new GeneralIdRef { Guid = Guid.NewGuid() },
Increment = 1,
Name = "Sequence name",
Pattern = "Order-[000]",
RolloverType = Rollover.Year,
Seed = 1
};
var context = new ValidationContext(sequence);
// Act
var results = sequence.Validate(context).ToList();
// Asserts
Assert.That(results.Count, Is.EqualTo(1));
Assert.That(results[0].MemberNames.Count(), Is.EqualTo(1));
Assert.That(results[0].MemberNames.ToList()[0], Is.EqualTo(nameof(Sequence.Pattern)));
Assert.That(results[0].ErrorMessage, Is.EqualTo("When the rollover type is set to 'Annual', then the pattern must include either a {YY} or {YYYY} placeholder"));
}
[Test]
public void Validate_MissingMonthPlaceholder_FailValidation()
{
// Arrange
var sequence = new Sequence
{
GeneralIdRef = new GeneralIdRef { Guid = Guid.NewGuid() },
Increment = 1,
Name = "Sequence name",
Pattern = "Order-[000]",
RolloverType = Rollover.Month,
Seed = 1
};
var context = new ValidationContext(sequence);
// Act
var results = sequence.Validate(context).ToList();
// Asserts
Assert.That(results.Count, Is.EqualTo(1));
Assert.That(results[0].MemberNames.Count(), Is.EqualTo(1));
Assert.That(results[0].MemberNames.ToList()[0], Is.EqualTo(nameof(Sequence.Pattern)));
Assert.That(results[0].ErrorMessage, Is.EqualTo("When the rollover type is set to 'Monthly', then the pattern must include either a {MM} placeholder"));
}
[Test]
public void Validate_MissingDayPlaceholder_FailValidation()
{
// Arrange
var sequence = new Sequence
{
GeneralIdRef = new GeneralIdRef { Guid = Guid.NewGuid() },
Increment = 1,
Name = "Sequence name",
Pattern = "Order-[000]",
RolloverType = Rollover.Day,
Seed = 1
};
var context = new ValidationContext(sequence);
// Act
var results = sequence.Validate(context).ToList();
// Asserts
Assert.That(results.Count, Is.EqualTo(1));
Assert.That(results[0].MemberNames.Count(), Is.EqualTo(1));
Assert.That(results[0].MemberNames.ToList()[0], Is.EqualTo(nameof(Sequence.Pattern)));
Assert.That(results[0].ErrorMessage, Is.EqualTo("When the rollover type is set to 'Daily', then the pattern must include either a {DD} placeholder"));
}
[Test]
public void Validate_Validation_Pass()
{
// Arrange
var sequence = new Sequence
{
GeneralIdRef = new GeneralIdRef { Guid = Guid.NewGuid() },
Increment = 1,
Name = "Sequence name",
Pattern = "Order [0000] from {DD}-{MM}-{YYYY}",
RolloverType = Rollover.Day,
Seed = 1
};
var context = new ValidationContext(sequence);
// Act
var results = sequence.Validate(context).ToList();
// Assert
Assert.That(results.Count, Is.EqualTo(0));
}
[Test]
public void Validate_Increment0_Fails()
{
// Arrange
var sequence = new Sequence
{
GeneralIdRef = new GeneralIdRef { Guid = Guid.NewGuid() },
Increment = 0,
Name = "Sequence name",
Pattern = "Order [0000] from {DD}-{MM}-{YYYY}",
RolloverType = Rollover.Day,
Seed = 1
};
var context = new ValidationContext(sequence);
// Act
var results = sequence.Validate(context).ToList();
// Assert
Assert.That(results.Count, Is.EqualTo(1));
Assert.That(results[0].MemberNames.Count(), Is.EqualTo(1));
Assert.That(results[0].MemberNames.ToList()[0], Is.EqualTo(nameof(Sequence.Increment)));
Assert.That(results[0].ErrorMessage, Is.EqualTo("Increment can not be 0"));
}
}

View File

@ -0,0 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<RootNamespace>e_suite.API.Common.UnitTests</RootNamespace>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
<PackageReference Include="NUnit" Version="4.4.0" />
<PackageReference Include="NUnit3TestAdapter" Version="6.1.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\e-suite.API.Common\e-suite.API.Common.csproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,57 @@
using NUnit.Framework;
namespace e_suite.API.Common.UnitTests.helper;
public static class ExceptionTester
{
public static void PerformTestSuite(Type exceptionUnderTest)
{
Assert.That(exceptionUnderTest, Is.Not.Null);
Assert.That(InheritsFrom<Exception>(exceptionUnderTest), Is.True);
Assert.That(CreateInstanceWithNoMessage(exceptionUnderTest), Is.True);
Assert.That(CreateInstanceWithMessage(exceptionUnderTest), Is.True);
Assert.That(CreateInstanceWithMessageAndInnerException(exceptionUnderTest), Is.True);
}
private static bool CreateInstanceWithMessageAndInnerException(Type exceptionUnderTest)
{
var innerException = new Exception("InnerException");
var newInstance = (Exception)Activator.CreateInstance(exceptionUnderTest, "Test", innerException)!;
Assert.That(newInstance, Is.Not.Null);
Assert.That(newInstance?.InnerException, Is.EqualTo(innerException));
return newInstance?.GetType() == exceptionUnderTest;
}
private static bool CreateInstanceWithMessage(Type exceptionUnderTest)
{
var newInstance = Activator.CreateInstance(exceptionUnderTest, "Test");
Assert.That(newInstance, Is.Not.Null);
return newInstance?.GetType() == exceptionUnderTest;
}
private static bool CreateInstanceWithNoMessage(Type exceptionUnderTest)
{
var newInstance = Activator.CreateInstance(exceptionUnderTest);
Assert.That(newInstance, Is.Not.Null);
return newInstance?.GetType() == exceptionUnderTest;
}
private static bool InheritsFrom<T>(Type exceptionUnderTest)
{
var typeUnderTest = exceptionUnderTest;
while (typeUnderTest != null)
{
if (typeUnderTest == typeof(T))
{
return true;
}
typeUnderTest = typeUnderTest.BaseType;
}
return false;
}
}

View File

@ -0,0 +1,39 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.4.33213.308
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "e-suite.API.Common", "e-suite.API.Common\e-suite.API.Common.csproj", "{B83BC836-F72F-4109-ABEF-6DBFB0D32CF3}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Test", "Test", "{E3CF6121-8D87-4C4B-A3EE-73AE78F92DF4}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UnitTests", "UnitTests", "{D4A0A029-718D-436F-AECE-F04CCD4FDD65}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "e-suite.API.Common.UnitTests", "e-suite.API.Common.UnitTests\e-suite.API.Common.UnitTests.csproj", "{4D647593-4BEA-4ACB-A886-82491D703E52}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{B83BC836-F72F-4109-ABEF-6DBFB0D32CF3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B83BC836-F72F-4109-ABEF-6DBFB0D32CF3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B83BC836-F72F-4109-ABEF-6DBFB0D32CF3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B83BC836-F72F-4109-ABEF-6DBFB0D32CF3}.Release|Any CPU.Build.0 = Release|Any CPU
{4D647593-4BEA-4ACB-A886-82491D703E52}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4D647593-4BEA-4ACB-A886-82491D703E52}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4D647593-4BEA-4ACB-A886-82491D703E52}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4D647593-4BEA-4ACB-A886-82491D703E52}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{D4A0A029-718D-436F-AECE-F04CCD4FDD65} = {E3CF6121-8D87-4C4B-A3EE-73AE78F92DF4}
{4D647593-4BEA-4ACB-A886-82491D703E52} = {D4A0A029-718D-436F-AECE-F04CCD4FDD65}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {63B8E197-C2CC-44D5-8FE3-4DB963DB9D2B}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,10 @@
using e_suite.API.Common.models;
using e_suite.Utilities.Pagination;
namespace e_suite.API.Common;
public interface IAuditLog
{
Task<IPaginatedData<AuditLogEntry>> GetAuditLogEntries(Paging paging, string? logEntry, bool primaryOnly,
CancellationToken cancellationToken);
}

View File

@ -0,0 +1,12 @@
using e_suite.API.Common.models;
using e_suite.Database.Audit;
using e_suite.Utilities.Pagination;
namespace e_suite.API.Common;
public interface IBlockedIPsManager
{
Task<IPaginatedData<BlockedIPs>> GetBlockedIPs(Paging paging, CancellationToken cancellationToken);
Task UnblockIPAddress(AuditUserDetails auditUserDetails, string ipaddress, CancellationToken cancellationToken);
}

View File

@ -0,0 +1,12 @@
using e_suite.API.Common.models;
using e_suite.Database.Audit;
using eSuite.Core.Miscellaneous;
namespace e_suite.API.Common;
public interface IContactsManager
{
Task CreateContact(AuditUserDetails auditUserDetails, CreateContact createContactDto, CancellationToken cancellationToken);
Task EditContact(AuditUserDetails auditUserDetails, EditContact editContactDto, CancellationToken cancellationToken);
Task<ReadContact> GetContact(GeneralIdRef generalIdRef, CancellationToken cancellationToken);
}

View File

@ -0,0 +1,18 @@
using e_suite.API.Common.models;
using e_suite.Database.Core.Models;
using e_suite.Database.Core.Tables.CustomFields;
using e_suite.Database.Core.Tables.Domain;
using e_suite.Database.Core.Tables.Forms;
using e_suite.Database.Core.Tables.Glossaries;
using eSuite.Core.Miscellaneous;
namespace e_suite.API.Common;
public interface ICustomFieldHelper
{
Task<CustomFieldDefinition> TranslateToCustomFieldDefinitionAsync(CustomField customField, CancellationToken cancellationToken);
Task<FormTemplate?> GetFormTemplateByGeneralRefIdAsync(IGeneralIdRef idRef, CancellationToken cancellationToken);
Task<Glossary?> GetGlossaryByGeneralRefIdAsync(IGeneralIdRef idRef, CancellationToken cancellationToken);
Task<Domain?> GetDomainByGeneralRefIdAsync(IGeneralIdRef idRef, CancellationToken cancellationToken);
Task<List<CustomFieldValues>> CustomFieldValuesList(IEnumerable<ICustomFieldValue> enumerableCustomFieldValues, CancellationToken cancellationToken);
}

View File

@ -0,0 +1,19 @@
using e_suite.API.Common.models;
using e_suite.Database.Audit;
using e_suite.Utilities.Pagination;
using eSuite.Core.Miscellaneous;
namespace e_suite.API.Common;
public interface ICustomFieldManager
{
Task<IPaginatedData<CustomFieldDefinition>> GetFieldsAsync(Paging paging, CancellationToken cancellationToken);
Task CreateFieldAsync(AuditUserDetails auditUserDetails, CreateCustomField custimField, CancellationToken cancellationToken);
Task EditFieldAsync(AuditUserDetails auditUserDetails, EditCustomFields custimField, CancellationToken cancellationToken);
Task<CustomFieldDefinition> GetFieldAsync(IGeneralIdRef id, CancellationToken cancellationToken);
Task<CustomFieldDefinition> GetFieldAsync(string name, CancellationToken cancellationToken);
Task DeleteFieldAsync(AuditUserDetails auditUserDetails, IGeneralIdRef id, CancellationToken cancellationToken);
}

View File

@ -0,0 +1,11 @@
using e_suite.API.Common.models;
using e_suite.Database.Audit;
using e_suite.Database.Core.Tables.CustomFields;
namespace e_suite.API.Common;
public interface ICustomFieldValidator
{
Task<IEnumerable<ValidatedCustomFieldValue>> ValidateFields(AuditUserDetails auditUserDetails, IEnumerable<CustomFieldValues> customFieldValues,
IReadOnlyCollection<CustomField> customFields, CancellationToken cancellationToken);
}

View File

@ -0,0 +1,18 @@
using e_suite.API.Common.models;
using e_suite.Database.Audit;
using e_suite.Utilities.Pagination;
using eSuite.Core.Miscellaneous;
namespace e_suite.API.Common;
public interface IDomainManager
{
public Task<IPaginatedData<GetDomain>> GetDomainsAsync(Paging paging, CancellationToken cancellationToken);
public Task<GetDomain> GetDomainAsync(IGeneralIdRef generalIdRef, CancellationToken cancellationToken);
public Task CreateDomainAsync(AuditUserDetails auditUserDetails, CreateDomain createDomain, CancellationToken cancellationToken);
public Task EditDomainAsync(AuditUserDetails auditUserDetails, EditDomain editDomain, CancellationToken cancellationToken);
public Task DeleteDomainAsync(AuditUserDetails auditUserDetails, IGeneralIdRef generalIdRef, CancellationToken cancellationToken);
}

View File

@ -0,0 +1,8 @@
using eSuite.Core.Miscellaneous;
namespace e_suite.API.Common;
public interface IEFlowSync
{
Task SyncEFlowPrinterCategories(List<GeneralIdRef> fullMessageDomains);
}

View File

@ -0,0 +1,11 @@
using e_suite.API.Common.models;
using e_suite.Utilities.Pagination;
namespace e_suite.API.Common;
public interface IExceptionLogManager
{
Task<long> LogException(Exception ex, string application, string supportingArgs, CancellationToken cancellationToken);
Task<IPaginatedData<ExceptionLog>> GetExceptionLogs(Paging paging, CancellationToken cancellationToken);
}

View File

@ -0,0 +1,27 @@
using e_suite.API.Common.models;
using e_suite.Database.Audit;
using e_suite.Utilities.Pagination;
using eSuite.Core.Miscellaneous;
namespace e_suite.API.Common;
public interface IFormsManager
{
Task CreateFormTemplateAsync(AuditUserDetails auditUserDetails, CreateFormTemplate createFormTemplate, CancellationToken cancellationToken);
Task EditFormTemplateAsync(AuditUserDetails auditUserDetails, EditFormTemplate editFormTemplate, CancellationToken cancellationToken);
Task<GetFormTemplate> GetFormTemplateAsync(IGeneralIdRef generalIdRef, CancellationToken cancellationToken);
Task<IPaginatedData<GetFormTemplate>> GetFormTemplatesAsync(Paging paging, CancellationToken cancellationToken);
Task DeleteFormTemplateAsync(AuditUserDetails auditUserDetails, IGeneralIdRef generalIdRef, CancellationToken cancellationToken);
Task<GeneralIdRef> CreateFormInstanceAsync(AuditUserDetails auditUserDetails, CreateFormInstance createFormInstance, CancellationToken cancellationToken);
Task CreateFormInstancesAsync(AuditUserDetails auditUserDetails, IEnumerable<CreateFormInstance> createFormInstance, CancellationToken cancellationToken);
Task<ReadFormInstance?> GetFormInstanceAsync(GeneralIdRef generalIdRef, CancellationToken cancellationToken);
Task<List<ReadFormInstance>> GetFormInstanceAsync(IEnumerable<GeneralIdRef> generalIdRefs, CancellationToken cancellationToken);
Task EditFormInstanceAsync(AuditUserDetails auditUserDetails, EditFormInstance editFormInstance, CancellationToken cancellationToken);
Task EditFormInstanceAsync(AuditUserDetails auditUserDetails, IEnumerable<EditFormInstance> editFormInstances, CancellationToken cancellationToken);
}

View File

@ -0,0 +1,14 @@
using e_suite.API.Common.models;
using e_suite.Database.Audit;
using eSuite.Core.Miscellaneous;
namespace e_suite.API.Common;
public interface IGlossariesManager
{
Task AddGlossaryItem(AuditUserDetails auditUserDetails, NewGlossaryItem glossaryItem, CancellationToken cancellationToken);
Task AddGlossaryItems(AuditUserDetails auditUserDetails, IEnumerable<NewGlossaryItem> glossaryItems, CancellationToken cancellationToken);
Task DeleteGlossaryItem(AuditUserDetails auditUserDetails, GeneralIdRef generalIdRef, CancellationToken cancellationToken);
Task<GlossaryItem?> GetGlossaryItem(AuditUserDetails auditUserDetails, GeneralIdRef generalIdRef, CancellationToken cancellationToken);
Task UpdateGlossaryItem(AuditUserDetails auditUserDetails, EditGlossaryItem editGlossaryItem, CancellationToken cancellationToken);
}

View File

@ -0,0 +1,14 @@
using e_suite.API.Common.models;
using e_suite.Database.Audit;
using e_suite.Utilities.Pagination;
using eSuite.Core.MailService;
using eSuite.Core.Miscellaneous;
namespace e_suite.API.Common;
public interface IMailTemplateManager
{
Task<IPaginatedData<MailTemplateType>> GetMailTemplateTypes(Paging paging, CancellationToken cancellationToken);
Task<GetMailTemplate> GetMailTemplate( IGeneralIdRef domain, MailType mailType, CancellationToken cancellationToken);
Task PostMailTemplate(PostMailTemplate mailTemplate, AuditUserDetails auditUserDetails, CancellationToken cancellationToken );
}

View File

@ -0,0 +1,17 @@
using e_suite.API.Common.models;
using e_suite.Database.Audit;
using e_suite.Database.Core.Tables.Printer;
using e_suite.Utilities.Pagination;
using eSuite.Core.Miscellaneous;
namespace e_suite.API.Common;
public interface IOrganisationsManager
{
Task<PaginatedData<ReadOrganisation>> GetOrganisationList(Paging paging, CancellationToken cancellationToken);
Task AddOrganisation(AuditUserDetails auditUserDetails, CreateOrganisation addOrganisationDto, bool triggerEFlowSync, CancellationToken cancellationToken);
Task DeleteOrganisation(AuditUserDetails auditUserDetails, GeneralIdRef generalIdRef, bool triggerEFlowSync, CancellationToken cancellationToken);
Task EditOrganisation(AuditUserDetails auditUserDetails, EditOrganisation editOrganisationDto, bool triggerEFlowSync, CancellationToken cancellationToken);
Task<Organisation?> GetOrganisation(GeneralIdRef generalIdRef, CancellationToken cancellationToken);
}

View File

@ -0,0 +1,6 @@
namespace e_suite.API.Common;
public interface IPerformanceMaintenance
{
Task ClearOldPerformanceData();
}

View File

@ -0,0 +1,5 @@
namespace e_suite.API.Common;
public interface IPerformanceManager
{
}

View File

@ -0,0 +1,29 @@
using e_suite.API.Common.models;
using e_suite.Database.Audit;
using e_suite.Database.Core.Tables.UserManager;
using e_suite.Utilities.Pagination;
using eSuite.Core.Miscellaneous;
using eSuite.Core.Security;
namespace e_suite.API.Common;
public interface IRoleManager
{
Task<IPaginatedData<ReadRole>> GetRoles(Paging paging, IGeneralIdRef domain, CancellationToken cancellationToken);
Task<ReadRole> GetRole(IGeneralIdRef generalIdRef, CancellationToken cancellationToken);
Task CreateRole(AuditUserDetails auditUserDetails, CreateRole sequence, CancellationToken cancellationToken);
Task DeleteRole(AuditUserDetails auditUserDetails, IGeneralIdRef generalIdRef, CancellationToken cancellationToken);
Task EditRole(AuditUserDetails auditUserDetails, EditRole editSequence, CancellationToken cancellationToken);
Task<IPaginatedData<RoleUser>> GetRoleUsers(Paging paging, GeneralIdRef roleId, CancellationToken cancellationToken);
Task AddRoleUser(AuditUserDetails auditUserDetails, UserRoleIds userRole, CancellationToken cancellationToken);
Task DeleteRoleUser(AuditUserDetails auditUserDetails, UserRoleIds userRole, CancellationToken cancellationToken);
Task<IPaginatedData<GetSecurityAccess>>GetAccessList(Paging paging, CancellationToken cancellationToken);
Task<IPaginatedData<GetRoleSecurityAccess>> GetRoleAccess(Paging paging, CancellationToken cancellationToken);
Task AddRoleSecurityAccess(AuditUserDetails auditUserDetails, AddRoleSecurityAccess accessToAdd, CancellationToken cancellationToken);
Task DeleteRoleSecurityAccess(AuditUserDetails auditUserDetails, DeleteRoleSecurityAccess accessToRemove, CancellationToken cancellationToken);
Task<bool> HasAnyAccess(long? userId, SecurityAccess accessKey);
Task CheckHasDomainAccess(long userId, IGeneralIdRef? specificDomain, SecurityAccess accessKey, CancellationToken cancellationToken);
IEnumerable<GetSecurityAccess> GetMyUserAccess(User user);
}

View File

@ -0,0 +1,17 @@
using e_suite.API.Common.models;
using e_suite.Database.Audit;
using e_suite.Utilities.Pagination;
using eSuite.Core.Miscellaneous;
namespace e_suite.API.Common;
public interface ISequenceManager
{
Task<Sequence> GetSequence(IGeneralIdRef generalIdRef, CancellationToken cancellationToken);
Task CreateSequence(AuditUserDetails auditUserDetails, NewSequence sequence, CancellationToken cancellationToken);
Task DeleteSequence(AuditUserDetails auditUserDetails, IGeneralIdRef generalIdRef, CancellationToken cancellationToken);
Task EditSequence(AuditUserDetails auditUserDetails, Sequence editSequence, CancellationToken cancellationToken);
Task<IPaginatedData<ReadSequence>> GetSequences(Paging paging, CancellationToken cancellationToken);
Task<IEnumerable<string>> NextValue(AuditUserDetails auditUserDetails, IGeneralIdRef generalIdRef, CancellationToken cancellationToken);
Task<IEnumerable<string>> NextValue(AuditUserDetails auditUserDetails, IGeneralIdRef generalIdRef, int number, CancellationToken cancellationToken);
}

View File

@ -0,0 +1,8 @@
namespace e_suite.API.Common;
public interface ISigmaImporter
{
Task ImportGMGProfiles();
Task ImportPrintSpecifications();
}

View File

@ -0,0 +1,20 @@
using e_suite.API.Common.models;
using e_suite.Database.Audit;
using e_suite.Utilities.Pagination;
using eSuite.Core.Miscellaneous;
namespace e_suite.API.Common;
public interface ISiteManager
{
Task<IPaginatedData<ReadSite>> GetSites(Paging paging, CancellationToken cancellationToken);
Task<ReadSite> GetSite(IGeneralIdRef generalIdRef, CancellationToken cancellationToken);
Task<ReadSite> GetSiteByName(IGeneralIdRef organisationGeneralIdRef, string siteName, CancellationToken cancellationToken);
Task<ReadSite> GetSiteBySigmaId(long sigmaId, CancellationToken cancellationToken);
Task CreateSite(AuditUserDetails auditUserDetails, CreateSite site, bool triggerEFlowSync, CancellationToken cancellationToken);
Task CreateSites(AuditUserDetails auditUserDetails, IEnumerable<CreateSite> sites, bool triggerEFlowSync, CancellationToken cancellationToken);
Task EditSite(AuditUserDetails auditUserDetails, EditSite site, bool triggerEFlowSync, CancellationToken cancellationToken);
Task DeleteSite(AuditUserDetails auditUserDetails, IGeneralIdRef generalIdRef, bool triggerEFlowSync, CancellationToken cancellationToken);
}

View File

@ -0,0 +1,18 @@
using e_suite.API.Common.models;
using e_suite.Database.Audit;
using e_suite.Utilities.Pagination;
using eSuite.Core.Miscellaneous;
namespace e_suite.API.Common;
public interface ISpecificationManager
{
Task<GeneralIdRef?> GetTemplateForPrintSpec(GeneralIdRef generalIdRef, CancellationToken cancellationToken);
Task<IPaginatedData<ReadSpecification>> GetSpecifications(Paging paging, CancellationToken cancellationToken);
Task<ReadSpecification?> GetSpecification(GeneralIdRef generalIdRef, CancellationToken cancellationToken);
Task CreateSpecification(AuditUserDetails auditUserDetails, CreateSpecification create, bool triggerEFlowSync, CancellationToken cancellationToken);
Task CreateSpecification(AuditUserDetails auditUserDetails, IEnumerable<CreateSpecification> create, bool triggerEFlowSync, CancellationToken cancellationToken);
Task DeleteSpecification(AuditUserDetails auditUserDetails, GeneralIdRef generalIdRef, bool triggerEFlowSync, CancellationToken cancellationToken);
Task EditSpecification(AuditUserDetails auditUserDetails, EditSpecification edit, bool triggerEFlowSync, CancellationToken cancellationToken);
Task EditSpecification(AuditUserDetails auditUserDetails, IEnumerable<EditSpecification> items, bool triggerEFlowSync, CancellationToken cancellationToken);
}

View File

@ -0,0 +1,15 @@
using e_suite.API.Common.models;
using e_suite.Database.Audit;
using e_suite.Utilities.Pagination;
using eSuite.Core.Miscellaneous;
namespace e_suite.API.Common;
public interface ISsoManager
{
Task<IPaginatedData<ReadSsoProvider>> GetSsoProvidersAsync(Paging paging, CancellationToken cancellationToken);
Task<ReadSsoProvider> GetSsoProviderAsync(IGeneralIdRef generalIdRef, CancellationToken cancellationToken);
Task AddSsoProviderAsync(AuditUserDetails auditUserDetails, CreateSsoProvider ssoProvider, CancellationToken cancellationToken);
Task EditSsoProviderAsync(AuditUserDetails auditUserDetails, EditSsoProvider ssoProvider, CancellationToken cancellationToken);
Task RemoveSsoProviderAsync( AuditUserDetails auditUserDetails, IGeneralIdRef generalIdRef, CancellationToken cancellationToken);
}

View File

@ -0,0 +1,37 @@
using e_suite.API.Common.models;
using e_suite.Database.Audit;
using e_suite.Database.Core.Models;
using e_suite.Database.Core.Tables.UserManager;
using e_suite.Utilities.Pagination;
using eSuite.Core.Miscellaneous;
namespace e_suite.API.Common;
public interface IUserManager
{
Task<LoginResponse> Login(Login login, CancellationToken cancellationToken = default!);
Task<LoginResponse> LoginSso(long ssoId, string ssoUserId, CancellationToken cancellationToken = default!);
Task ForgotPassword(string email, CancellationToken cancellationToken = default!);
Task CreateUser(AuditUserDetails auditUserDetails, UserRegistration userRegistration, CancellationToken cancellationToken = default!);
Task<LoginResponse> RefreshToken(string email, CancellationToken cancellationToken = default!);
Task<LoginResponse> RefreshToken(IGeneralIdRef id, CancellationToken cancellationToken = default!);
Task<User> CompleteEmailAction(EmailActionToken token, CancellationToken cancellationToken = default!);
Task DeactivateUser(AuditUserDetails auditUserDetails, string email, CancellationToken cancellationToken = default!);
Task DeactivateUser(AuditUserDetails auditUserDetails, GeneralIdRef generalIdRef, CancellationToken cancellationToken = default!);
Task<UserProfile> GetProfile(string email, CancellationToken cancellationToken = default!);
Task UpdateProfile(AuditUserDetails auditUserDetails, string email, UpdatedUserProfile userProfile, CancellationToken cancellationToken = default!);
public Task<IPaginatedData<GetUser>> GetUsersAsync(Paging paging, CancellationToken cancellationToken);
Task<GetUser?> GetUserAsync(GeneralIdRef generalIdRef, CancellationToken cancellationToken);
Task<User> GetUserByEmailAsync(string email, CancellationToken cancellationToken);
Task EditUser(AuditUserDetails auditUserDetails, EditUser user, CancellationToken cancellationToken);
Task ResendConfirmEmail(AuditUserDetails auditUserDetails, GeneralIdRef generalIdRef, CancellationToken cancellationToken);
Task<string> GetCurrentEmailActionUrl(string emailAddress, EmailUserActionType emailUserActionType, CancellationToken cancellationToken );
Task<SsoProvider?> GetSsoProviderForEmail(string loginEmail, CancellationToken cancellationToken);
Task<SsoProvider?> GetSsoProviderById(long ssoProviderId, CancellationToken cancellationToken);
Task LinkSsoProfileToUser(AuditUserDetails auditUserDetails, User user, long ssoId, string ssoUserId, bool setEmailConfirmed, CancellationToken cancellationToken);
Task TurnOfSsoForUser(AuditUserDetails auditUserDetails, GeneralIdRef generalIdRef, CancellationToken cancellationToken);
Task<Guid> CreateSingleUseGuid(AuditUserDetails auditUserDetails, GeneralIdRef generalIdRef, CancellationToken cancellationToken);
Task<User?> GetUserWithSingleUseGuid(Guid guid, CancellationToken cancellationToken);
Task SetAuthentication( AuditUserDetails auditUserDetails, UserAuthenticationDetails userAuthenticationDetails, bool setEmailConfirmed, CancellationToken cancellationToken );
}

View File

@ -0,0 +1,7 @@
namespace e_suite.API.Common;
public interface IUserManagerMaintenance
{
Task ClearOldEmailActions();
Task ClearOldSingleUserGuids();
}

View File

@ -0,0 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<RootNamespace>e_suite.API.Common</RootNamespace>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="10.0.2" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\e-suite.Database.Core\e-suite.Database.Core\e-suite.Database.Core.csproj" />
<ProjectReference Include="..\..\e-suite.Utilities.Pagination\e-suite.Utilities.Pagination\e-suite.Utilities.Pagination.csproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,23 @@
namespace e_suite.API.Common.exceptions;
public class EmailNotConfirmedException : Exception
{
public EmailNotConfirmedException()
{
}
public EmailNotConfirmedException(string? message)
: base(message)
{
}
// Creates a new Exception. All derived classes should
// provide this constructor.
// Note: the stack trace is not started until the exception
// is thrown
//
public EmailNotConfirmedException(string? message, Exception? innerException)
: base(message, innerException)
{
}
}

View File

@ -0,0 +1,24 @@
namespace e_suite.API.Common.exceptions;
public class ExistsException : Exception
{
public ExistsException()
{
}
public ExistsException(string? message)
: base(message)
{
}
// Creates a new Exception. All derived classes should
// provide this constructor.
// Note: the stack trace is not started until the exception
// is thrown
//
public ExistsException(string? message, Exception? innerException)
: base(message, innerException)
{
}
}

View File

@ -0,0 +1,25 @@
namespace e_suite.API.Common.exceptions;
public class InvalidEmailException : Exception
{
public InvalidEmailException()
{
}
public InvalidEmailException(string? message)
: base(message)
{
}
// Creates a new Exception. All derived classes should
// provide this constructor.
// Note: the stack trace is not started until the exception
// is thrown
//
public InvalidEmailException(string? message, Exception? innerException)
: base(message, innerException)
{
}
}

View File

@ -0,0 +1,16 @@
namespace e_suite.API.Common.exceptions;
public class InvalidReferenceObjectId : Exception
{
public InvalidReferenceObjectId()
{
}
public InvalidReferenceObjectId(string? message) : base(message)
{
}
public InvalidReferenceObjectId(string? message, Exception? innerException) : base(message, innerException)
{
}
}

View File

@ -0,0 +1,24 @@
namespace e_suite.API.Common.exceptions;
public class MaximumRangeException : Exception
{
public MaximumRangeException() : base()
{
}
public MaximumRangeException(string? message)
: base(message)
{
}
// Creates a new Exception. All derived classes should
// provide this constructor.
// Note: the stack trace is not started until the exception
// is thrown
//
public MaximumRangeException(string? message, Exception? innerException)
: base(message, innerException)
{
}
}

View File

@ -0,0 +1,24 @@
namespace e_suite.API.Common.exceptions;
public class MinimumRangeException : Exception
{
public MinimumRangeException() : base()
{
}
public MinimumRangeException(string? message)
: base(message)
{
}
// Creates a new Exception. All derived classes should
// provide this constructor.
// Note: the stack trace is not started until the exception
// is thrown
//
public MinimumRangeException(string? message, Exception? innerException)
: base(message, innerException)
{
}
}

View File

@ -0,0 +1,24 @@
namespace e_suite.API.Common.exceptions;
public class NotFoundException : Exception
{
public NotFoundException()
{
}
public NotFoundException(string? message)
: base(message)
{
}
// Creates a new Exception. All derived classes should
// provide this constructor.
// Note: the stack trace is not started until the exception
// is thrown
//
public NotFoundException(string? message, Exception? innerException)
: base(message, innerException)
{
}
}

View File

@ -0,0 +1,25 @@
namespace e_suite.API.Common.exceptions;
public class TokenInvalidException : Exception
{
public TokenInvalidException()
{
}
public TokenInvalidException(string? message)
: base(message)
{
}
// Creates a new Exception. All derived classes should
// provide this constructor.
// Note: the stack trace is not started until the exception
// is thrown
//
public TokenInvalidException(string? message, Exception? innerException)
: base(message, innerException)
{
}
}

View File

@ -0,0 +1,23 @@
namespace e_suite.API.Common.exceptions;
public class WeakPasswordException : Exception
{
public WeakPasswordException()
{
}
public WeakPasswordException(string? message)
: base(message)
{
}
// Creates a new Exception. All derived classes should
// provide this constructor.
// Note: the stack trace is not started until the exception
// is thrown
//
public WeakPasswordException(string? message, Exception? innerException)
: base(message, innerException)
{
}
}

View File

@ -0,0 +1,16 @@
using Microsoft.Extensions.Configuration;
namespace e_suite.API.Common.extensions;
public static class ConfigurationHelper
{
public static T? GetConfigValue<T>(this IConfiguration configuration, string environmentVariable, string key, T defaultValue)
{
var envVariable = Environment.GetEnvironmentVariable(environmentVariable);
if (!string.IsNullOrWhiteSpace(envVariable))
return (T?)Convert.ChangeType(envVariable, typeof(T));
return configuration.GetValue(key, defaultValue);
}
}

View File

@ -0,0 +1,16 @@
#pragma warning disable IDE0130 // Namespace does not match folder structure
namespace System;
#pragma warning restore IDE0130 // Namespace does not match folder structure
public static class ObjectExtensions
{
public static T DeepClone<T>(this T obj)
{
using var stream = new MemoryStream();
var serializer = new Xml.Serialization.XmlSerializer(typeof(T));
serializer.Serialize(stream, obj);
stream.Position = 0;
return (T)serializer.Deserialize(stream)!;
}
}

View File

@ -0,0 +1,10 @@
using eSuite.Core.Miscellaneous;
using eSuite.Core.Security;
namespace e_suite.API.Common.models;
public class AddRoleSecurityAccess
{
public GeneralIdRef RoleId { get; set; } = null!;
public List<SecurityAccess> SecurityAccess { get; set; } = null!;
}

View File

@ -0,0 +1,27 @@
using e_suite.Database.Audit.Models;
namespace e_suite.API.Common.models;
public class AuditLogEntry : IId
{
public long Id { get; set; }
public long UserId { get; set; }
public string UserDisplayName { get; set; } = string.Empty;
public string Type { get; set; } = string.Empty;
public DateTimeOffset DateTime { get; set; }
public string Fields { get; set; } = string.Empty;
public string Comment { get; set; } = string.Empty;
public string EntityName { get; set; } = string.Empty;
public string PrimaryKey { get; set; } = string.Empty;
public string EntityDisplayName { get; set; } = string.Empty;
public string DisplayName { get; set; } = string.Empty;
}

View File

@ -0,0 +1,12 @@
using System.Text.Json.Serialization;
namespace e_suite.API.Common.models;
public class AuditParams
{
[JsonPropertyName("entityName")]
public string EntityName { get; set; } = string.Empty;
[JsonPropertyName("primaryKey")]
public string PrimaryKey { get; set; } = string.Empty;
}

View File

@ -0,0 +1,13 @@
namespace e_suite.API.Common.models;
public class BlockedIPs
{
public string IPAddress { get; set; } = string.Empty;
public int NumberOfAttempts { get; set; }
public DateTimeOffset BlockedAt { get; set; }
public int UnblockedIn { get; set; }
}

View File

@ -0,0 +1,12 @@
using System.Text.Json.Serialization;
namespace e_suite.API.Common.models;
public class CreateContact
{
[JsonPropertyName("guid")]
public Guid? Guid { get; set; }
[JsonPropertyName("jCard")]
public string JCard { get; set; } = string.Empty;
}

View File

@ -0,0 +1,12 @@
using System.Text.Json.Serialization;
using e_suite.API.Common.models.@base;
namespace e_suite.API.Common.models;
public class CreateCustomField : CustomFieldBase
{
[JsonPropertyName("guid")]
public Guid? Guid { get; set; } = System.Guid.NewGuid();
}

View File

@ -0,0 +1,10 @@
using System.Text.Json.Serialization;
using e_suite.API.Common.models.@base;
namespace e_suite.API.Common.models;
public class CreateDomain : DomainBase
{
[JsonPropertyName("guid")]
public Guid? Guid { get; set; }
}

View File

@ -0,0 +1,19 @@
using System.Text.Json.Serialization;
using eSuite.Core.Miscellaneous;
namespace e_suite.API.Common.models;
public class CreateFormInstance
{
[JsonPropertyName("templateId")]
public GeneralIdRef TemplateId { get; set; } = null!;
[JsonPropertyName("version")]
public long Version { get; set; }
[JsonPropertyName("customFieldValues")]
public List<CustomFieldValues> CustomFieldValues { get; set; } = new();
[JsonPropertyName("guid")]
public Guid? Guid { get; set; }
}

View File

@ -0,0 +1,17 @@
using System.ComponentModel.DataAnnotations;
using System.Text.Json.Serialization;
namespace e_suite.API.Common.models;
public class CreateFormTemplate
{
[JsonPropertyName("name")]
[Required]
public string Name { get; set; } = string.Empty;
[JsonPropertyName("definition")]
public string Definition { get; set; } = string.Empty;
[JsonPropertyName("guid")]
public Guid? Guid { get; set; }
}

View File

@ -0,0 +1,20 @@
using System.ComponentModel.DataAnnotations;
using System.Text.Json.Serialization;
using e_suite.Database.Core.Models;
namespace e_suite.API.Common.models;
public class CreateOrganisation
{
[JsonPropertyName("guid")]
public Guid? Guid { get; set; }
[JsonPropertyName("name")]
[Required]
public string Name { get; set; } = string.Empty;
[JsonPropertyName("address")]
[Required]
public string Address { get; set; } = string.Empty;
[JsonPropertyName("status")]
[Required]
public OrganisationStatus Status { get; set; }
}

View File

@ -0,0 +1,13 @@
using e_suite.API.Common.models.@base;
using eSuite.Core.Miscellaneous;
namespace e_suite.API.Common.models;
public class CreateRole : RoleBase
{
public Guid? Guid { get; set; }
public bool IsSuperUser { get; set; }
public bool IsAdministrator { get; set; }
public bool CanDelete { get; set; } = true;
public GeneralIdRef DomainId { get; set; } = null!;
}

View File

@ -0,0 +1,8 @@
using e_suite.API.Common.models.@base;
namespace e_suite.API.Common.models;
public class CreateSite : SiteBase
{
public Guid? Guid { get; set; }
}

View File

@ -0,0 +1,8 @@
using e_suite.API.Common.models.@base;
namespace e_suite.API.Common.models;
public class CreateSpecification : SpecificationBase
{
public Guid? Guid { get; set; }
}

View File

@ -0,0 +1,8 @@
using e_suite.API.Common.models.@base;
namespace e_suite.API.Common.models;
public class CreateSsoProvider : SsoProviderBase
{
public Guid? Guid { get; set; }
}

View File

@ -0,0 +1,15 @@
using System.Text.Json.Serialization;
namespace e_suite.API.Common.models;
public class CustomFieldValue
{
/// <summary>
/// Value can be either a string or a GeneralRefId
/// </summary>
[JsonPropertyName("value")]
public object Value { get; set; } = null!;
[JsonPropertyName("displayValue")]
public string? DisplayValue { get; set; }
}

View File

@ -0,0 +1,28 @@
using eSuite.Core.Miscellaneous;
namespace e_suite.API.Common.models;
public static class CustomFieldValueExtensions
{
public static List<CustomFieldValues> ToCustomFieldsValues(this IEnumerable<CustomFieldValues> values)
{
var items = new Dictionary<GeneralIdRef, CustomFieldValues>();
foreach (var value in values)
{
if (!items.ContainsKey(value.Id))
{
var newCustomFieldValues = new CustomFieldValues
{
Id = value.Id
};
newCustomFieldValues.Values.AddRange(value.Values);
items.Add(value.Id, newCustomFieldValues);
}
}
var result = new List<CustomFieldValues>();
result.AddRange(items.Values);
return result;
}
}

View File

@ -0,0 +1,14 @@
using System.Text.Json.Serialization;
using eSuite.Core.Miscellaneous;
namespace e_suite.API.Common.models;
public class CustomFieldValues
{
[JsonPropertyName("id")]
public GeneralIdRef Id { get; set; } = new();
[JsonPropertyName("values")]
public List<CustomFieldValue> Values { get; set; } = new();
}

View File

@ -0,0 +1,10 @@
using eSuite.Core.Miscellaneous;
using eSuite.Core.Security;
namespace e_suite.API.Common.models;
public class DeleteRoleSecurityAccess
{
public GeneralIdRef RoleId { get; set; } = null!;
public List<SecurityAccess> SecurityAccess { get; set; } = null!;
}

View File

@ -0,0 +1,9 @@
using eSuite.Core.Miscellaneous;
namespace e_suite.API.Common.models;
public class EditContact
{
public GeneralIdRef GeneralIdRef { get; set; } = null!;
public string JCard { get; set; } = string.Empty;
}

View File

@ -0,0 +1,12 @@
using System.Text.Json.Serialization;
using e_suite.API.Common.models.@base;
using eSuite.Core.Miscellaneous;
namespace e_suite.API.Common.models;
public class EditCustomFields : CustomFieldBase
{
[JsonPropertyName("id")]
public GeneralIdRef Id { get; set; } = new GeneralIdRef();
}

View File

@ -0,0 +1,13 @@
using System.ComponentModel.DataAnnotations;
using System.Text.Json.Serialization;
using e_suite.API.Common.models.@base;
using eSuite.Core.Miscellaneous;
namespace e_suite.API.Common.models;
public class EditDomain : DomainBase
{
[Required]
[JsonPropertyName("id")]
public GeneralIdRef Id { get; set; } = new GeneralIdRef();
}

View File

@ -0,0 +1,36 @@
using System.Text.Json.Serialization;
using e_suite.Database.Core.Extensions;
using eSuite.Core.Miscellaneous;
namespace e_suite.API.Common.models;
public class EditFormInstance
{
public EditFormInstance()
{
}
public EditFormInstance(ReadFormInstance readFormInstance)
{
FormInstanceId = readFormInstance.ToGeneralIdRef()!;
TemplateId = readFormInstance.TemplateId;
Version = readFormInstance.Version;
foreach (var values in readFormInstance.CustomFieldValues)
{
CustomFieldValues.Add(values.DeepClone());
}
}
[JsonPropertyName("formInstanceId")]
public GeneralIdRef FormInstanceId { get; set; } = null!;
[JsonPropertyName("templateId")]
public GeneralIdRef TemplateId { get; set; } = null!;
[JsonPropertyName("version")]
public long Version { get; set; }
[JsonPropertyName("customFieldValues")]
public List<CustomFieldValues> CustomFieldValues { get; set; } = [];
}

View File

@ -0,0 +1,18 @@
using System.ComponentModel.DataAnnotations;
using System.Text.Json.Serialization;
using eSuite.Core.Miscellaneous;
namespace e_suite.API.Common.models;
public class EditFormTemplate
{
[Required]
[JsonPropertyName("id")]
public GeneralIdRef Id { get; set; } = new GeneralIdRef();
[JsonPropertyName("name")]
public string Name { get; set; } = string.Empty;
[JsonPropertyName("definition")]
public string Definition { get; set; } = string.Empty;
}

View File

@ -0,0 +1,10 @@
using System.Text.Json.Serialization;
using eSuite.Core.Miscellaneous;
namespace e_suite.API.Common.models;
public class EditGlossaryItem : EditableGlossaryItem
{
[JsonPropertyName("id")]
public GeneralIdRef Id { get; set; } = null!;
}

View File

@ -0,0 +1,12 @@
using e_suite.Database.Core.Models;
using eSuite.Core.Miscellaneous;
namespace e_suite.API.Common.models;
public class EditOrganisation
{
public GeneralIdRef GeneralIdRef { get; set; } = null!;
public string Name { get; set; } = string.Empty;
public string Address { get; set; } = string.Empty;
public OrganisationStatus Status { get; set; }
}

View File

@ -0,0 +1,9 @@
using e_suite.API.Common.models.@base;
using eSuite.Core.Miscellaneous;
namespace e_suite.API.Common.models;
public class EditRole : RoleBase
{
public GeneralIdRef GeneralIdRef { get; set; } = null!;
}

View File

@ -0,0 +1,9 @@
using e_suite.API.Common.models.@base;
using eSuite.Core.Miscellaneous;
namespace e_suite.API.Common.models;
public class EditSite : SiteBase
{
public GeneralIdRef Id { get; set; } = null!;
}

View File

@ -0,0 +1,9 @@
using e_suite.API.Common.models.@base;
using eSuite.Core.Miscellaneous;
namespace e_suite.API.Common.models;
public class EditSpecification : SpecificationBase
{
public GeneralIdRef Id { get; set; } = null!;
}

Some files were not shown because too many files have changed in this diff Show More