diff --git a/.editorconfig b/.editorconfig
index fbed962..cc25d6f 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -19,7 +19,7 @@ insert_final_newline = false
# Organize usings
dotnet_separate_import_directive_groups = true
-dotnet_sort_system_directives_first = false
+dotnet_sort_system_directives_first = true
file_header_template = unset
# this. and Me. preferences
@@ -249,4 +249,39 @@ dotnet_style_operator_placement_when_wrapping = beginning_of_line
tab_width = 4
indent_size = 4
end_of_line = crlf
-dotnet_style_prefer_collection_expression = when_types_loosely_match:suggestion
\ No newline at end of file
+dotnet_style_prefer_collection_expression = when_types_loosely_match:suggestion
+
+# Question
+
+csharp_style_inlined_variable_declaration = false
+csharp_style_prefer_primary_constructors = false
+dotnet_diagnostic.CA1510.severity = none # "Use 'ArgumentNullException.ThrowIfNull' instead of explicitly throwing a new exception instance
+dotnet_diagnostic.CA1806.severity = none # SendEmailWithValidArgsShouldSendMailThroughClient calls TryParse but does not explicitly
+dotnet_diagnostic.CA1827.severity = none # Count() is used where Any() could be used instead to improve performance
+dotnet_diagnostic.CA1829.severity = none # Use the property instead of Enumerable.Count()
+dotnet_diagnostic.CA1860.severity = none # Prefer comparing 'Count' to 0 rather than using 'Any()', both for clarity and for performance
+dotnet_diagnostic.CA2208.severity = none # Method .ctor passes
+dotnet_diagnostic.CA2208.severity = none # Method .ctor passes
+dotnet_diagnostic.CA2211.severity = none # Non-constant fields should not be visible
+dotnet_diagnostic.CA2253.severity = none # Named placeholders in the logging message template should not be comprised
+dotnet_diagnostic.CA2254.severity = none # The logging message template should not vary between calls to
+dotnet_diagnostic.CS1998.severity = none # This async method lacks 'await' operators and will run synchronously
+dotnet_diagnostic.CS8618.severity = none # Non-nullable field '_mockDalService' must contain a non-null value when exiting constructor
+dotnet_diagnostic.CS8625.severity = none # Cannot convert null literal to non-nullable reference type
+dotnet_diagnostic.IDE0005.severity = none # Using directive is unnecessary.
+dotnet_diagnostic.IDE0017.severity = none # Object initialization can be simplified
+dotnet_diagnostic.IDE0018.severity = none # Variable declaration can be inlined
+dotnet_diagnostic.IDE0028.severity = none # Collection initialization can be simplified
+dotnet_diagnostic.IDE0044.severity = none # Make field readonly
+dotnet_diagnostic.IDE0046.severity = none # 'if' statement can be simplified
+dotnet_diagnostic.IDE0052.severity = none # "Private member can be removed
+dotnet_diagnostic.IDE0270.severity = none # Null check can be simplified
+dotnet_diagnostic.IDE0290.severity = none # Use primary constructor
+dotnet_diagnostic.IDE1006.severity = none # Naming rule violation: These words must begin with upper case characters
+dotnet_diagnostic.IDE2000.severity = error # IDE2000: Allow multiple blank lines
+dotnet_diagnostic.NUnit2001.severity = none # Consider using the constraint model, Assert.That(expr, Is.False), instead of the classic model
+dotnet_diagnostic.NUnit2004.severity = none # Consider using the constraint model
+dotnet_diagnostic.NUnit2010.severity = none # Use Is.EqualTo constraint instead of direct comparison for better assertion messages in ca
+dotnet_style_coalesce_expression = false
+dotnet_style_object_initializer = false
+dotnet_style_prefer_conditional_expression_over_return = false
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index df733cb..d5545ad 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,4 +2,7 @@
bin
obj
TestResults
-Properties
\ No newline at end of file
+Properties
+
+/FabApprovalWorkerService/.vscode/.UserSecrets
+/FabApprovalWorkerServiceTests/.vscode/.UserSecrets
\ No newline at end of file
diff --git a/.vscode/format-report.json b/.vscode/format-report.json
new file mode 100644
index 0000000..0637a08
--- /dev/null
+++ b/.vscode/format-report.json
@@ -0,0 +1 @@
+[]
\ No newline at end of file
diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 0000000..15d9faa
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,30 @@
+{
+ // 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": [
+ {
+ "name": ".NET Core Launch (console)",
+ "type": "coreclr",
+ "request": "launch",
+ "preLaunchTask": "FabApprovalWorkerService-build",
+ "program": "${workspaceFolder}/FabApprovalWorkerService/bin/Debug/net8.0/win-x64/FabApprovalWorkerServiceTests.dll",
+ "args": [],
+ "cwd": "${workspaceFolder}",
+ "console": "integratedTerminal",
+ "stopAtEntry": false
+ },
+ {
+ "name": ".NET Core Attach",
+ "type": "coreclr",
+ "request": "attach"
+ },
+ {
+ "type": "node",
+ "request": "launch",
+ "name": "node Launch Current Opened File",
+ "program": "${file}"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..f05d843
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,424 @@
+{
+ "[markdown]": {
+ "editor.wordWrap": "off"
+ },
+ "files.exclude": {
+ "**/.git": false,
+ "**/node_modules": true
+ },
+ "files.watcherExclude": {
+ "**/node_modules": true
+ },
+ "cSpell.words": [
+ "abutton",
+ "accessibilities",
+ "accodingly",
+ "acknowledgmentby",
+ "Acks",
+ "actionsheet",
+ "Additonal",
+ "Addtional",
+ "againm",
+ "agendaview",
+ "Antlr",
+ "Appover",
+ "Appprrovers",
+ "Approvalog",
+ "Aprovers",
+ "Aproverslist",
+ "asax",
+ "aspnetmvc",
+ "Assignedto",
+ "Atachments",
+ "Attachemnt",
+ "Attachemnts",
+ "Attchment",
+ "auditee",
+ "Auditee",
+ "Auditees",
+ "automaically",
+ "Autthorized",
+ "beacuase",
+ "beforeunload",
+ "Belguim",
+ "bfound",
+ "bgcolor",
+ "Bies",
+ "binded",
+ "blackbackground",
+ "blackhover",
+ "blackpressed",
+ "blueenergy",
+ "blueopal",
+ "buttongroup",
+ "BYMRB",
+ "bytesgot",
+ "CAID",
+ "casection",
+ "CAXXXX",
+ "CCPCR",
+ "CCPCRB",
+ "cellspacing",
+ "Cheeso's",
+ "chkbx",
+ "Clib",
+ "colorpicker",
+ "columnmenu",
+ "columnsreorder",
+ "columnsresize",
+ "comming",
+ "Containmen",
+ "Copmments",
+ "correctiv",
+ "Correctivet",
+ "Creat",
+ "currentd",
+ "Cyle",
+ "dadada",
+ "darkbluehover",
+ "darkbluepressed",
+ "darkred",
+ "datafields",
+ "datasource",
+ "dataviz",
+ "datepicker",
+ "datetimepicker",
+ "dayview",
+ "Deletet",
+ "Delgation",
+ "DENITED",
+ "Deparmtent",
+ "departmentids",
+ "Descirption",
+ "devprog",
+ "dfeffc",
+ "Disp",
+ "Dispo",
+ "Dispoitio",
+ "Dispos",
+ "Dispositon",
+ "Dispostion",
+ "Dispostions",
+ "dispotypevalidation",
+ "Docbase",
+ "Documentum",
+ "Documetum",
+ "dont",
+ "downlaoded",
+ "draganddrop",
+ "dragcancel",
+ "dropdownlist",
+ "Eamils",
+ "ECNPCRB",
+ "Ecns",
+ "edmx",
+ "EECN",
+ "emai",
+ "emailparams",
+ "Emergrncy",
+ "energyblue",
+ "Eran",
+ "Esql",
+ "ETECN",
+ "EXCELOPENXML",
+ "existinglocation",
+ "Expando",
+ "extrafield",
+ "fadc",
+ "fbec",
+ "fcfdfd",
+ "fdff",
+ "fece",
+ "feeebd",
+ "ffdc",
+ "ffdd",
+ "fieldset",
+ "FILIPE",
+ "filtermenu",
+ "Fldr",
+ "flintstone",
+ "FLOWLOCS",
+ "FMEA",
+ "ftplib",
+ "FTPSPN",
+ "GETDATE",
+ "gitea",
+ "globaldocudms",
+ "glyphicons",
+ "groupable",
+ "Guids",
+ "halflings",
+ "Hexsize",
+ "highcontrast",
+ "Hmac",
+ "holdsteps",
+ "hostspecific",
+ "icenium",
+ "IECN",
+ "imagebrowser",
+ "IMRB",
+ "Infineon",
+ "Insertd",
+ "inverseicons",
+ "IPCRB",
+ "ISADMIN",
+ "islast",
+ "ISNULL",
+ "ITAR",
+ "jquery",
+ "jqueryval",
+ "jqwidgets",
+ "jqxbuttongroup",
+ "jqxbuttons",
+ "jqxcalendar",
+ "jqxchart",
+ "jqxcheckbox",
+ "jqxcolorpicker",
+ "jqxcombobox",
+ "jqxcore",
+ "jqxdata",
+ "jqxdatatable",
+ "jqxdatetimeinput",
+ "jqxdocking",
+ "jqxdockpanel",
+ "jqxdragdrop",
+ "jqxdropdownbutton",
+ "jqxdropdownlist",
+ "jqxexpander",
+ "jqxgauge",
+ "jqxgrid",
+ "jqxinput",
+ "jqxknockout",
+ "jqxlistbox",
+ "jqxlistmenu",
+ "jqxmaskedinput",
+ "jqxmenu",
+ "jqxnavigationbar",
+ "jqxnumberinput",
+ "jqxpanel",
+ "jqxpasswordinput",
+ "jqxprogressbar",
+ "jqxradiobutton",
+ "jqxrangeselector",
+ "jqxrating",
+ "jqxresponse",
+ "jqxscrollbar",
+ "jqxscrollview",
+ "jqxslider",
+ "jqxsplitter",
+ "jqxswitchbutton",
+ "jqxtabs",
+ "jqxtooltip",
+ "jqxtouch",
+ "jqxtree",
+ "jqxtreegrid",
+ "jqxtreemap",
+ "jqxvalidator",
+ "jqxwindow",
+ "kendogridcustom",
+ "kendoui",
+ "labelelement",
+ "labelledby",
+ "Leanred",
+ "lightgray",
+ "linkbutton",
+ "Linq",
+ "Listdiv",
+ "listview",
+ "Lnks",
+ "localfilename",
+ "loclist",
+ "logis",
+ "logtext",
+ "loopmis",
+ "lotdispo",
+ "LOTDISPSITION",
+ "Lotfile",
+ "lotlist",
+ "lotstatusoption",
+ "LTRIM",
+ "MADUREIRA",
+ "mailrelay",
+ "MDTM",
+ "meego",
+ "meetingid",
+ "menubutton",
+ "mesafi",
+ "metroblack",
+ "metrodark",
+ "miliseconds",
+ "modalview",
+ "modernizr",
+ "Modernizr",
+ "monthview",
+ "MRBIs",
+ "Mrbs",
+ "msecs",
+ "multipleextended",
+ "Navigatable",
+ "nbsp",
+ "newbase",
+ "newchange",
+ "newdi",
+ "newfilename",
+ "newsource",
+ "Newtonsoft",
+ "notications",
+ "Notifcation",
+ "Notifyf",
+ "NTLM",
+ "Nullcc",
+ "numerictextbox",
+ "objdata",
+ "OCAP",
+ "occured",
+ "odata",
+ "oldfilename",
+ "OLHOLD",
+ "onclick",
+ "onmousemove",
+ "OPDESC",
+ "OPENQUERY",
+ "Oper",
+ "operationslist",
+ "Orginator",
+ "Originatorname",
+ "Ouellette",
+ "Owin",
+ "pageable",
+ "Pageable",
+ "panelbar",
+ "parentid",
+ "parminput",
+ "parms",
+ "Parms",
+ "particula",
+ "pasv",
+ "PASV",
+ "PATINDEX",
+ "PCRB",
+ "PCRBID",
+ "pcrvalues",
+ "pdbonly",
+ "Preventitive",
+ "preventivet",
+ "Prevetative",
+ "proces",
+ "Processedl",
+ "procs",
+ "productfamilies",
+ "progess",
+ "progressbar",
+ "qrcode",
+ "Quanityt",
+ "rangebar",
+ "Recep",
+ "Recepient",
+ "recieved",
+ "recordlock",
+ "remotefilename",
+ "reorderable",
+ "reportform",
+ "reportslist",
+ "reportslistdiv",
+ "Reqquired",
+ "Reqs",
+ "Requiest",
+ "Responsibles",
+ "RETR",
+ "Revisioing",
+ "Revisioned",
+ "Revison",
+ "rgba",
+ "rkotian",
+ "RNFR",
+ "RNTO",
+ "Roless",
+ "roundbg",
+ "RTRIM",
+ "SAMDB",
+ "scroller",
+ "scrollview",
+ "seleced",
+ "selectionlog",
+ "Selectpart",
+ "sess",
+ "Sfisharepoint",
+ "shinyblack",
+ "showpassword",
+ "SIGNON",
+ "simpleparser",
+ "slddrw",
+ "sldprt",
+ "sortasc",
+ "sortascbutton",
+ "sortdesc",
+ "sortdescbutton",
+ "sortremove",
+ "sparkline",
+ "splitview",
+ "SPNMRB",
+ "SPNPDB",
+ "SSRS",
+ "Sssign",
+ "Staus",
+ "stylesheet",
+ "Submited",
+ "subrole",
+ "subroles",
+ "Succefully",
+ "Succesfully",
+ "sucessfully",
+ "SURP",
+ "Swashbuckle",
+ "SWRN",
+ "tabindex",
+ "tabstrip",
+ "Tahoma",
+ "taskcompleted",
+ "Tasklist",
+ "Taveler",
+ "TECN",
+ "TECNs",
+ "TEMIRWAP",
+ "tempecd",
+ "tempimplement",
+ "templabel",
+ "tempvalue",
+ "TEMSA",
+ "timepicker",
+ "Tobe",
+ "Toplevel",
+ "Totrav",
+ "trainingby",
+ "Traininglist",
+ "traininglistdiv",
+ "transanction",
+ "Trav",
+ "Traveller",
+ "Traverler",
+ "TRAVLELER",
+ "Travler",
+ "TREEVIEW",
+ "trigerred",
+ "ttinclude",
+ "Uhandled",
+ "Updat",
+ "Uplaod",
+ "Upto",
+ "userevents",
+ "userids",
+ "userlist",
+ "Validatable",
+ "valueelement",
+ "Variabls",
+ "Verdana",
+ "vgrid",
+ "viewmodel",
+ "vsdoc",
+ "whethere",
+ "windowsphone",
+ "Winsock",
+ "worlflow"
+ ]
+}
\ No newline at end of file
diff --git a/.vscode/spell.md b/.vscode/spell.md
new file mode 100644
index 0000000..84fa07b
--- /dev/null
+++ b/.vscode/spell.md
@@ -0,0 +1 @@
+# Spell
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
new file mode 100644
index 0000000..60cf160
--- /dev/null
+++ b/.vscode/tasks.json
@@ -0,0 +1,239 @@
+{
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "label": "FabApprovalWorkerService-User Secrets Init",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "user-secrets",
+ "-p",
+ "${workspaceFolder}/FabApprovalWorkerService/FabApprovalWorkerService.csproj",
+ "init"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "FabApprovalWorkerService-User Secrets Set",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "user-secrets",
+ "-p",
+ "${workspaceFolder}/FabApprovalWorkerService/FabApprovalWorkerService.csproj",
+ "set",
+ "_UserSecretsId",
+ "0c43f9aa-96e9-4298-967c-ed069d79e262"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "FabApprovalWorkerService-Format",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "format",
+ "--report",
+ ".vscode",
+ "--verbosity",
+ "detailed",
+ "--severity",
+ "warn"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "FabApprovalWorkerService-Format-Whitespaces",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "format",
+ "whitespace"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "FabApprovalWorkerService-build",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "build",
+ "${workspaceFolder}/FabApprovalWorkerService/FabApprovalWorkerService.csproj",
+ "/property:GenerateFullPaths=true",
+ "/consoleloggerparameters:NoSummary"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "FabApprovalWorkerService-publish",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "publish",
+ "${workspaceFolder}/FabApprovalWorkerService/FabApprovalWorkerService.csproj",
+ "/property:GenerateFullPaths=true",
+ "/consoleloggerparameters:NoSummary"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "FabApprovalWorkerService-watch",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "watch",
+ "run",
+ "--project",
+ "${workspaceFolder}/FabApprovalWorkerService/FabApprovalWorkerService.csproj"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "FabApprovalWorkerService-Publish AOT",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "publish",
+ "-r",
+ "win-x64",
+ "-c",
+ "Release",
+ "-p:PublishAot=true",
+ "${workspaceFolder}/FabApprovalWorkerService/FabApprovalWorkerService.csproj",
+ "/property:GenerateFullPaths=true",
+ "/consoleloggerparameters:NoSummary"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "FabApprovalWorkerServiceTests-User Secrets Init",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "user-secrets",
+ "-p",
+ "${workspaceFolder}/FabApprovalWorkerServiceTests/FabApprovalWorkerServiceTests.csproj",
+ "init"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "FabApprovalWorkerServiceTests-User Secrets Set",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "user-secrets",
+ "-p",
+ "${workspaceFolder}/FabApprovalWorkerServiceTests/FabApprovalWorkerServiceTests.csproj",
+ "set",
+ "_UserSecretsId",
+ "f445e6e0-784b-4dde-9ef0-2143e6e90b1b"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "FabApprovalWorkerServiceTests-Format",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "format",
+ "--report",
+ ".vscode",
+ "--verbosity",
+ "detailed",
+ "--severity",
+ "warn"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "FabApprovalWorkerServiceTests-Format-Whitespaces",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "format",
+ "whitespace"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "FabApprovalWorkerServiceTests-build",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "build",
+ "${workspaceFolder}/FabApprovalWorkerServiceTests/FabApprovalWorkerServiceTests.csproj",
+ "/property:GenerateFullPaths=true",
+ "/consoleloggerparameters:NoSummary"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "FabApprovalWorkerServiceTests-testDebug",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "test",
+ "${workspaceFolder}/FabApprovalWorkerServiceTests/FabApprovalWorkerServiceTests.csproj",
+ "/property:GenerateFullPaths=true",
+ "/consoleloggerparameters:NoSummary"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "FabApprovalWorkerServiceTests-testRelease",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "test",
+ "${workspaceFolder}/FabApprovalWorkerServiceTests/FabApprovalWorkerServiceTests.csproj",
+ "/property:GenerateFullPaths=true",
+ "/consoleloggerparameters:NoSummary",
+ "-c",
+ "Release"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "FabApprovalWorkerServiceTests-publish",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "publish",
+ "${workspaceFolder}/FabApprovalWorkerServiceTests/FabApprovalWorkerServiceTests.csproj",
+ "/property:GenerateFullPaths=true",
+ "/consoleloggerparameters:NoSummary"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "FabApprovalWorkerServiceTests-watch",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "watch",
+ "run",
+ "--project",
+ "${workspaceFolder}/FabApprovalWorkerServiceTests/FabApprovalWorkerServiceTests.csproj"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "FabApprovalWorkerServiceTests-Publish AOT",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "publish",
+ "-r",
+ "win-x64",
+ "-c",
+ "Release",
+ "-p:PublishAot=true",
+ "${workspaceFolder}/FabApprovalWorkerServiceTests/FabApprovalWorkerServiceTests.csproj",
+ "/property:GenerateFullPaths=true",
+ "/consoleloggerparameters:NoSummary"
+ ],
+ "problemMatcher": "$msCompile"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/.editorconfig b/FabApprovalWorkerService/.editorconfig
new file mode 100644
index 0000000..cc25d6f
--- /dev/null
+++ b/FabApprovalWorkerService/.editorconfig
@@ -0,0 +1,287 @@
+# Remove the line below if you want to inherit .editorconfig settings from higher directories
+root = true
+
+# C# files
+[*.cs]
+
+#### Core EditorConfig Options ####
+
+# Indentation and spacing
+indent_size = 4
+indent_style = space
+tab_width = 4
+
+# New line preferences
+end_of_line = crlf
+insert_final_newline = false
+
+#### .NET Coding Conventions ####
+
+# Organize usings
+dotnet_separate_import_directive_groups = true
+dotnet_sort_system_directives_first = true
+file_header_template = unset
+
+# this. and Me. preferences
+dotnet_style_qualification_for_event = false
+dotnet_style_qualification_for_field = false
+dotnet_style_qualification_for_method = false
+dotnet_style_qualification_for_property = false
+
+# Language keywords vs BCL types preferences
+dotnet_style_predefined_type_for_locals_parameters_members = true
+dotnet_style_predefined_type_for_member_access = true
+
+# Parentheses preferences
+dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:error
+dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:error
+dotnet_style_parentheses_in_other_operators = never_if_unnecessary
+dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:error
+
+# Modifier preferences
+dotnet_style_require_accessibility_modifiers = for_non_interface_members
+
+# Expression-level preferences
+dotnet_style_coalesce_expression = true
+dotnet_style_collection_initializer = true
+dotnet_style_explicit_tuple_names = true
+dotnet_style_namespace_match_folder = true
+dotnet_style_null_propagation = true
+dotnet_style_object_initializer = true
+dotnet_style_operator_placement_when_wrapping = beginning_of_line
+dotnet_style_prefer_auto_properties = true
+dotnet_style_prefer_collection_expression = when_types_loosely_match
+dotnet_style_prefer_compound_assignment = true
+dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion
+dotnet_style_prefer_conditional_expression_over_return = true:suggestion
+dotnet_style_prefer_foreach_explicit_cast_in_source = when_strongly_typed
+dotnet_style_prefer_inferred_anonymous_type_member_names = true
+dotnet_style_prefer_inferred_tuple_names = true
+dotnet_style_prefer_is_null_check_over_reference_equality_method = true
+dotnet_style_prefer_simplified_boolean_expressions = true
+dotnet_style_prefer_simplified_interpolation = true
+
+# Field preferences
+dotnet_style_readonly_field = true
+
+# Parameter preferences
+dotnet_code_quality_unused_parameters = all:error
+
+# Suppression preferences
+dotnet_remove_unnecessary_suppression_exclusions = none
+
+# New line preferences
+dotnet_style_allow_multiple_blank_lines_experimental = false:error
+dotnet_style_allow_statement_immediately_after_block_experimental = false:warning
+
+#### C# Coding Conventions ####
+
+# var preferences
+csharp_style_var_elsewhere = false:error
+csharp_style_var_for_built_in_types = false:error
+csharp_style_var_when_type_is_apparent = false:error
+
+# Expression-bodied members
+csharp_style_expression_bodied_accessors = true:silent
+csharp_style_expression_bodied_constructors = false:silent
+csharp_style_expression_bodied_indexers = true:silent
+csharp_style_expression_bodied_lambdas = true:silent
+csharp_style_expression_bodied_local_functions = false:silent
+csharp_style_expression_bodied_methods = false:silent
+csharp_style_expression_bodied_operators = false:silent
+csharp_style_expression_bodied_properties = true:silent
+
+# Pattern matching preferences
+csharp_style_pattern_matching_over_as_with_null_check = true
+csharp_style_pattern_matching_over_is_with_cast_check = true
+csharp_style_prefer_extended_property_pattern = true
+csharp_style_prefer_not_pattern = true
+csharp_style_prefer_pattern_matching = true
+csharp_style_prefer_switch_expression = true
+
+# Null-checking preferences
+csharp_style_conditional_delegate_call = true
+
+# Modifier preferences
+csharp_prefer_static_local_function = false
+csharp_preferred_modifier_order = public,private,protected,internal,file,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,required,volatile,async
+csharp_style_prefer_readonly_struct = true:warning
+csharp_style_prefer_readonly_struct_member = true
+
+# Code-block preferences
+csharp_prefer_braces = true:silent
+csharp_prefer_simple_using_statement = false:suggestion
+csharp_style_namespace_declarations = file_scoped:error
+csharp_style_prefer_method_group_conversion = true:suggestion
+csharp_style_prefer_primary_constructors = true:suggestion
+csharp_style_prefer_top_level_statements = true:error
+
+# Expression-level preferences
+csharp_prefer_simple_default_expression = true
+csharp_style_deconstructed_variable_declaration = false:suggestion
+csharp_style_implicit_object_creation_when_type_is_apparent = false
+csharp_style_inlined_variable_declaration = true:suggestion
+csharp_style_prefer_index_operator = false:error
+csharp_style_prefer_local_over_anonymous_function = true:error
+csharp_style_prefer_null_check_over_type_check = true
+csharp_style_prefer_range_operator = false:error
+csharp_style_prefer_tuple_swap = true
+csharp_style_prefer_utf8_string_literals = true
+csharp_style_throw_expression = true
+csharp_style_unused_value_assignment_preference = unused_local_variable
+csharp_style_unused_value_expression_statement_preference = unused_local_variable
+
+# 'using' directive preferences
+csharp_using_directive_placement = outside_namespace:error
+
+# New line preferences
+csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true
+csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true
+csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true
+csharp_style_allow_blank_lines_between_consecutive_braces_experimental = false:error
+csharp_style_allow_embedded_statements_on_same_line_experimental = true
+
+#### C# Formatting Rules ####
+
+# New line preferences
+csharp_new_line_before_catch = false
+csharp_new_line_before_else = false
+csharp_new_line_before_finally = false
+csharp_new_line_before_members_in_anonymous_types = true
+csharp_new_line_before_members_in_object_initializers = true
+csharp_new_line_before_open_brace = none
+csharp_new_line_between_query_expression_clauses = true
+
+# Indentation preferences
+csharp_indent_block_contents = true
+csharp_indent_braces = false
+csharp_indent_case_contents = true
+csharp_indent_case_contents_when_block = true
+csharp_indent_labels = one_less_than_current
+csharp_indent_switch_labels = true
+
+# Space preferences
+csharp_space_after_cast = false
+csharp_space_after_colon_in_inheritance_clause = true
+csharp_space_after_comma = true
+csharp_space_after_dot = false
+csharp_space_after_keywords_in_control_flow_statements = true
+csharp_space_after_semicolon_in_for_statement = true
+csharp_space_around_binary_operators = before_and_after
+csharp_space_around_declaration_statements = false
+csharp_space_before_colon_in_inheritance_clause = true
+csharp_space_before_comma = false
+csharp_space_before_dot = false
+csharp_space_before_open_square_brackets = false
+csharp_space_before_semicolon_in_for_statement = false
+csharp_space_between_empty_square_brackets = false
+csharp_space_between_method_call_empty_parameter_list_parentheses = false
+csharp_space_between_method_call_name_and_opening_parenthesis = false
+csharp_space_between_method_call_parameter_list_parentheses = false
+csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
+csharp_space_between_method_declaration_name_and_open_parenthesis = false
+csharp_space_between_method_declaration_parameter_list_parentheses = false
+csharp_space_between_parentheses = false
+csharp_space_between_square_brackets = false
+
+# Wrapping preferences
+csharp_preserve_single_line_blocks = true
+csharp_preserve_single_line_statements = true
+
+#### Naming styles ####
+
+# Naming rules
+
+dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion
+dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
+dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i
+
+dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion
+dotnet_naming_rule.types_should_be_pascal_case.symbols = types
+dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case
+
+dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion
+dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
+dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case
+
+# Symbol specifications
+
+dotnet_naming_symbols.interface.applicable_kinds = interface
+dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
+dotnet_naming_symbols.interface.required_modifiers =
+
+dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
+dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
+dotnet_naming_symbols.types.required_modifiers =
+
+dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
+dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
+dotnet_naming_symbols.non_field_members.required_modifiers =
+
+# Naming styles
+
+dotnet_naming_style.pascal_case.required_prefix =
+dotnet_naming_style.pascal_case.required_suffix =
+dotnet_naming_style.pascal_case.word_separator =
+dotnet_naming_style.pascal_case.capitalization = pascal_case
+
+dotnet_naming_style.begins_with_i.required_prefix = I
+dotnet_naming_style.begins_with_i.required_suffix =
+dotnet_naming_style.begins_with_i.word_separator =
+dotnet_naming_style.begins_with_i.capitalization = pascal_case
+
+[*.{cs,vb}]
+dotnet_style_coalesce_expression = true:suggestion
+dotnet_style_null_propagation = true:suggestion
+dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
+dotnet_style_prefer_auto_properties = true:silent
+dotnet_style_object_initializer = true:suggestion
+dotnet_style_collection_initializer = true:suggestion
+dotnet_style_prefer_simplified_boolean_expressions = true:suggestion
+dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion
+dotnet_style_prefer_conditional_expression_over_return = true:suggestion
+dotnet_style_explicit_tuple_names = true:suggestion
+dotnet_style_prefer_inferred_tuple_names = true:suggestion
+dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
+dotnet_style_prefer_compound_assignment = true:suggestion
+dotnet_style_prefer_simplified_interpolation = true:suggestion
+dotnet_style_operator_placement_when_wrapping = beginning_of_line
+tab_width = 4
+indent_size = 4
+end_of_line = crlf
+dotnet_style_prefer_collection_expression = when_types_loosely_match:suggestion
+
+# Question
+
+csharp_style_inlined_variable_declaration = false
+csharp_style_prefer_primary_constructors = false
+dotnet_diagnostic.CA1510.severity = none # "Use 'ArgumentNullException.ThrowIfNull' instead of explicitly throwing a new exception instance
+dotnet_diagnostic.CA1806.severity = none # SendEmailWithValidArgsShouldSendMailThroughClient calls TryParse but does not explicitly
+dotnet_diagnostic.CA1827.severity = none # Count() is used where Any() could be used instead to improve performance
+dotnet_diagnostic.CA1829.severity = none # Use the property instead of Enumerable.Count()
+dotnet_diagnostic.CA1860.severity = none # Prefer comparing 'Count' to 0 rather than using 'Any()', both for clarity and for performance
+dotnet_diagnostic.CA2208.severity = none # Method .ctor passes
+dotnet_diagnostic.CA2208.severity = none # Method .ctor passes
+dotnet_diagnostic.CA2211.severity = none # Non-constant fields should not be visible
+dotnet_diagnostic.CA2253.severity = none # Named placeholders in the logging message template should not be comprised
+dotnet_diagnostic.CA2254.severity = none # The logging message template should not vary between calls to
+dotnet_diagnostic.CS1998.severity = none # This async method lacks 'await' operators and will run synchronously
+dotnet_diagnostic.CS8618.severity = none # Non-nullable field '_mockDalService' must contain a non-null value when exiting constructor
+dotnet_diagnostic.CS8625.severity = none # Cannot convert null literal to non-nullable reference type
+dotnet_diagnostic.IDE0005.severity = none # Using directive is unnecessary.
+dotnet_diagnostic.IDE0017.severity = none # Object initialization can be simplified
+dotnet_diagnostic.IDE0018.severity = none # Variable declaration can be inlined
+dotnet_diagnostic.IDE0028.severity = none # Collection initialization can be simplified
+dotnet_diagnostic.IDE0044.severity = none # Make field readonly
+dotnet_diagnostic.IDE0046.severity = none # 'if' statement can be simplified
+dotnet_diagnostic.IDE0052.severity = none # "Private member can be removed
+dotnet_diagnostic.IDE0270.severity = none # Null check can be simplified
+dotnet_diagnostic.IDE0290.severity = none # Use primary constructor
+dotnet_diagnostic.IDE1006.severity = none # Naming rule violation: These words must begin with upper case characters
+dotnet_diagnostic.IDE2000.severity = error # IDE2000: Allow multiple blank lines
+dotnet_diagnostic.NUnit2001.severity = none # Consider using the constraint model, Assert.That(expr, Is.False), instead of the classic model
+dotnet_diagnostic.NUnit2004.severity = none # Consider using the constraint model
+dotnet_diagnostic.NUnit2010.severity = none # Use Is.EqualTo constraint instead of direct comparison for better assertion messages in ca
+dotnet_style_coalesce_expression = false
+dotnet_style_object_initializer = false
+dotnet_style_prefer_conditional_expression_over_return = false
\ No newline at end of file
diff --git a/FabApprovalWorkerService/.vscode/format-report.json b/FabApprovalWorkerService/.vscode/format-report.json
new file mode 100644
index 0000000..0637a08
--- /dev/null
+++ b/FabApprovalWorkerService/.vscode/format-report.json
@@ -0,0 +1 @@
+[]
\ No newline at end of file
diff --git a/FabApprovalWorkerService/.vscode/launch.json b/FabApprovalWorkerService/.vscode/launch.json
new file mode 100644
index 0000000..c549f2c
--- /dev/null
+++ b/FabApprovalWorkerService/.vscode/launch.json
@@ -0,0 +1,30 @@
+{
+ // 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": [
+ {
+ "name": ".NET Core Launch (console)",
+ "type": "coreclr",
+ "request": "launch",
+ "preLaunchTask": "build",
+ "program": "${workspaceFolder}/bin/Debug/net8.0/win-x64/FabApprovalWorkerService.dll",
+ "args": [],
+ "cwd": "${workspaceFolder}",
+ "console": "integratedTerminal",
+ "stopAtEntry": false
+ },
+ {
+ "name": ".NET Core Attach",
+ "type": "coreclr",
+ "request": "attach"
+ },
+ {
+ "type": "node",
+ "request": "launch",
+ "name": "node Launch Current Opened File",
+ "program": "${file}"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/.vscode/settings.json b/FabApprovalWorkerService/.vscode/settings.json
new file mode 100644
index 0000000..f05d843
--- /dev/null
+++ b/FabApprovalWorkerService/.vscode/settings.json
@@ -0,0 +1,424 @@
+{
+ "[markdown]": {
+ "editor.wordWrap": "off"
+ },
+ "files.exclude": {
+ "**/.git": false,
+ "**/node_modules": true
+ },
+ "files.watcherExclude": {
+ "**/node_modules": true
+ },
+ "cSpell.words": [
+ "abutton",
+ "accessibilities",
+ "accodingly",
+ "acknowledgmentby",
+ "Acks",
+ "actionsheet",
+ "Additonal",
+ "Addtional",
+ "againm",
+ "agendaview",
+ "Antlr",
+ "Appover",
+ "Appprrovers",
+ "Approvalog",
+ "Aprovers",
+ "Aproverslist",
+ "asax",
+ "aspnetmvc",
+ "Assignedto",
+ "Atachments",
+ "Attachemnt",
+ "Attachemnts",
+ "Attchment",
+ "auditee",
+ "Auditee",
+ "Auditees",
+ "automaically",
+ "Autthorized",
+ "beacuase",
+ "beforeunload",
+ "Belguim",
+ "bfound",
+ "bgcolor",
+ "Bies",
+ "binded",
+ "blackbackground",
+ "blackhover",
+ "blackpressed",
+ "blueenergy",
+ "blueopal",
+ "buttongroup",
+ "BYMRB",
+ "bytesgot",
+ "CAID",
+ "casection",
+ "CAXXXX",
+ "CCPCR",
+ "CCPCRB",
+ "cellspacing",
+ "Cheeso's",
+ "chkbx",
+ "Clib",
+ "colorpicker",
+ "columnmenu",
+ "columnsreorder",
+ "columnsresize",
+ "comming",
+ "Containmen",
+ "Copmments",
+ "correctiv",
+ "Correctivet",
+ "Creat",
+ "currentd",
+ "Cyle",
+ "dadada",
+ "darkbluehover",
+ "darkbluepressed",
+ "darkred",
+ "datafields",
+ "datasource",
+ "dataviz",
+ "datepicker",
+ "datetimepicker",
+ "dayview",
+ "Deletet",
+ "Delgation",
+ "DENITED",
+ "Deparmtent",
+ "departmentids",
+ "Descirption",
+ "devprog",
+ "dfeffc",
+ "Disp",
+ "Dispo",
+ "Dispoitio",
+ "Dispos",
+ "Dispositon",
+ "Dispostion",
+ "Dispostions",
+ "dispotypevalidation",
+ "Docbase",
+ "Documentum",
+ "Documetum",
+ "dont",
+ "downlaoded",
+ "draganddrop",
+ "dragcancel",
+ "dropdownlist",
+ "Eamils",
+ "ECNPCRB",
+ "Ecns",
+ "edmx",
+ "EECN",
+ "emai",
+ "emailparams",
+ "Emergrncy",
+ "energyblue",
+ "Eran",
+ "Esql",
+ "ETECN",
+ "EXCELOPENXML",
+ "existinglocation",
+ "Expando",
+ "extrafield",
+ "fadc",
+ "fbec",
+ "fcfdfd",
+ "fdff",
+ "fece",
+ "feeebd",
+ "ffdc",
+ "ffdd",
+ "fieldset",
+ "FILIPE",
+ "filtermenu",
+ "Fldr",
+ "flintstone",
+ "FLOWLOCS",
+ "FMEA",
+ "ftplib",
+ "FTPSPN",
+ "GETDATE",
+ "gitea",
+ "globaldocudms",
+ "glyphicons",
+ "groupable",
+ "Guids",
+ "halflings",
+ "Hexsize",
+ "highcontrast",
+ "Hmac",
+ "holdsteps",
+ "hostspecific",
+ "icenium",
+ "IECN",
+ "imagebrowser",
+ "IMRB",
+ "Infineon",
+ "Insertd",
+ "inverseicons",
+ "IPCRB",
+ "ISADMIN",
+ "islast",
+ "ISNULL",
+ "ITAR",
+ "jquery",
+ "jqueryval",
+ "jqwidgets",
+ "jqxbuttongroup",
+ "jqxbuttons",
+ "jqxcalendar",
+ "jqxchart",
+ "jqxcheckbox",
+ "jqxcolorpicker",
+ "jqxcombobox",
+ "jqxcore",
+ "jqxdata",
+ "jqxdatatable",
+ "jqxdatetimeinput",
+ "jqxdocking",
+ "jqxdockpanel",
+ "jqxdragdrop",
+ "jqxdropdownbutton",
+ "jqxdropdownlist",
+ "jqxexpander",
+ "jqxgauge",
+ "jqxgrid",
+ "jqxinput",
+ "jqxknockout",
+ "jqxlistbox",
+ "jqxlistmenu",
+ "jqxmaskedinput",
+ "jqxmenu",
+ "jqxnavigationbar",
+ "jqxnumberinput",
+ "jqxpanel",
+ "jqxpasswordinput",
+ "jqxprogressbar",
+ "jqxradiobutton",
+ "jqxrangeselector",
+ "jqxrating",
+ "jqxresponse",
+ "jqxscrollbar",
+ "jqxscrollview",
+ "jqxslider",
+ "jqxsplitter",
+ "jqxswitchbutton",
+ "jqxtabs",
+ "jqxtooltip",
+ "jqxtouch",
+ "jqxtree",
+ "jqxtreegrid",
+ "jqxtreemap",
+ "jqxvalidator",
+ "jqxwindow",
+ "kendogridcustom",
+ "kendoui",
+ "labelelement",
+ "labelledby",
+ "Leanred",
+ "lightgray",
+ "linkbutton",
+ "Linq",
+ "Listdiv",
+ "listview",
+ "Lnks",
+ "localfilename",
+ "loclist",
+ "logis",
+ "logtext",
+ "loopmis",
+ "lotdispo",
+ "LOTDISPSITION",
+ "Lotfile",
+ "lotlist",
+ "lotstatusoption",
+ "LTRIM",
+ "MADUREIRA",
+ "mailrelay",
+ "MDTM",
+ "meego",
+ "meetingid",
+ "menubutton",
+ "mesafi",
+ "metroblack",
+ "metrodark",
+ "miliseconds",
+ "modalview",
+ "modernizr",
+ "Modernizr",
+ "monthview",
+ "MRBIs",
+ "Mrbs",
+ "msecs",
+ "multipleextended",
+ "Navigatable",
+ "nbsp",
+ "newbase",
+ "newchange",
+ "newdi",
+ "newfilename",
+ "newsource",
+ "Newtonsoft",
+ "notications",
+ "Notifcation",
+ "Notifyf",
+ "NTLM",
+ "Nullcc",
+ "numerictextbox",
+ "objdata",
+ "OCAP",
+ "occured",
+ "odata",
+ "oldfilename",
+ "OLHOLD",
+ "onclick",
+ "onmousemove",
+ "OPDESC",
+ "OPENQUERY",
+ "Oper",
+ "operationslist",
+ "Orginator",
+ "Originatorname",
+ "Ouellette",
+ "Owin",
+ "pageable",
+ "Pageable",
+ "panelbar",
+ "parentid",
+ "parminput",
+ "parms",
+ "Parms",
+ "particula",
+ "pasv",
+ "PASV",
+ "PATINDEX",
+ "PCRB",
+ "PCRBID",
+ "pcrvalues",
+ "pdbonly",
+ "Preventitive",
+ "preventivet",
+ "Prevetative",
+ "proces",
+ "Processedl",
+ "procs",
+ "productfamilies",
+ "progess",
+ "progressbar",
+ "qrcode",
+ "Quanityt",
+ "rangebar",
+ "Recep",
+ "Recepient",
+ "recieved",
+ "recordlock",
+ "remotefilename",
+ "reorderable",
+ "reportform",
+ "reportslist",
+ "reportslistdiv",
+ "Reqquired",
+ "Reqs",
+ "Requiest",
+ "Responsibles",
+ "RETR",
+ "Revisioing",
+ "Revisioned",
+ "Revison",
+ "rgba",
+ "rkotian",
+ "RNFR",
+ "RNTO",
+ "Roless",
+ "roundbg",
+ "RTRIM",
+ "SAMDB",
+ "scroller",
+ "scrollview",
+ "seleced",
+ "selectionlog",
+ "Selectpart",
+ "sess",
+ "Sfisharepoint",
+ "shinyblack",
+ "showpassword",
+ "SIGNON",
+ "simpleparser",
+ "slddrw",
+ "sldprt",
+ "sortasc",
+ "sortascbutton",
+ "sortdesc",
+ "sortdescbutton",
+ "sortremove",
+ "sparkline",
+ "splitview",
+ "SPNMRB",
+ "SPNPDB",
+ "SSRS",
+ "Sssign",
+ "Staus",
+ "stylesheet",
+ "Submited",
+ "subrole",
+ "subroles",
+ "Succefully",
+ "Succesfully",
+ "sucessfully",
+ "SURP",
+ "Swashbuckle",
+ "SWRN",
+ "tabindex",
+ "tabstrip",
+ "Tahoma",
+ "taskcompleted",
+ "Tasklist",
+ "Taveler",
+ "TECN",
+ "TECNs",
+ "TEMIRWAP",
+ "tempecd",
+ "tempimplement",
+ "templabel",
+ "tempvalue",
+ "TEMSA",
+ "timepicker",
+ "Tobe",
+ "Toplevel",
+ "Totrav",
+ "trainingby",
+ "Traininglist",
+ "traininglistdiv",
+ "transanction",
+ "Trav",
+ "Traveller",
+ "Traverler",
+ "TRAVLELER",
+ "Travler",
+ "TREEVIEW",
+ "trigerred",
+ "ttinclude",
+ "Uhandled",
+ "Updat",
+ "Uplaod",
+ "Upto",
+ "userevents",
+ "userids",
+ "userlist",
+ "Validatable",
+ "valueelement",
+ "Variabls",
+ "Verdana",
+ "vgrid",
+ "viewmodel",
+ "vsdoc",
+ "whethere",
+ "windowsphone",
+ "Winsock",
+ "worlflow"
+ ]
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/.vscode/tasks.json b/FabApprovalWorkerService/.vscode/tasks.json
new file mode 100644
index 0000000..7f9d564
--- /dev/null
+++ b/FabApprovalWorkerService/.vscode/tasks.json
@@ -0,0 +1,109 @@
+{
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "label": "User Secrets Init",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "user-secrets",
+ "-p",
+ "${workspaceFolder}/FabApprovalWorkerService.csproj",
+ "init"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "User Secrets Set",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "user-secrets",
+ "-p",
+ "${workspaceFolder}/FabApprovalWorkerService.csproj",
+ "set",
+ "_UserSecretsId",
+ "e76dda63-1df3-422a-b758-1c057e5b1e25"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "Format",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "format",
+ "--report",
+ ".vscode",
+ "--verbosity",
+ "detailed",
+ "--severity",
+ "warn"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "Format-Whitespaces",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "format",
+ "whitespace"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "build",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "build",
+ "${workspaceFolder}/FabApprovalWorkerService.csproj",
+ "/property:GenerateFullPaths=true",
+ "/consoleloggerparameters:NoSummary"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "publish",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "publish",
+ "${workspaceFolder}/FabApprovalWorkerService.csproj",
+ "/property:GenerateFullPaths=true",
+ "/consoleloggerparameters:NoSummary"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "watch",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "watch",
+ "run",
+ "--project",
+ "${workspaceFolder}/FabApprovalWorkerService.csproj"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "Publish AOT",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "publish",
+ "-r",
+ "win-x64",
+ "-c",
+ "Release",
+ "-p:PublishAot=true",
+ "${workspaceFolder}/FabApprovalWorkerService.csproj",
+ "/property:GenerateFullPaths=true",
+ "/consoleloggerparameters:NoSummary"
+ ],
+ "problemMatcher": "$msCompile"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/Clients/SmtpClientWrapper.cs b/FabApprovalWorkerService/Clients/SmtpClientWrapper.cs
index 5f71cf2..eca2daa 100644
--- a/FabApprovalWorkerService/Clients/SmtpClientWrapper.cs
+++ b/FabApprovalWorkerService/Clients/SmtpClientWrapper.cs
@@ -17,4 +17,4 @@ public class SmtpClientWrapper : ISmtpClientWrapper {
public void Send(MailMessage message) {
_client.Send(message);
}
-}
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/FabApprovalWorkerService.csproj b/FabApprovalWorkerService/FabApprovalWorkerService.csproj
index ced7649..7a7d3d4 100644
--- a/FabApprovalWorkerService/FabApprovalWorkerService.csproj
+++ b/FabApprovalWorkerService/FabApprovalWorkerService.csproj
@@ -4,7 +4,7 @@
net8.0
enable
enable
- dotnet-FabApprovalWorkerService-e76dda63-1df3-422a-b758-1c057e5b1e25
+ e76dda63-1df3-422a-b758-1c057e5b1e25
true
True
Debug;Release;Staging
@@ -34,6 +34,7 @@
+
diff --git a/FabApprovalWorkerService/Models/AppSettings.cs b/FabApprovalWorkerService/Models/AppSettings.cs
new file mode 100644
index 0000000..90bf6c6
--- /dev/null
+++ b/FabApprovalWorkerService/Models/AppSettings.cs
@@ -0,0 +1,133 @@
+using System.Text.Json;
+using System.Text.Json.Serialization;
+
+namespace FabApprovalWorkerService.Models;
+
+public record AppSettings(string AsmHtrTrainingGroupName,
+ string CleansTrainingGroupName,
+ string EpiProTrainingGroupName,
+ string BaseUrl,
+ string Company,
+ string DbConnectionString,
+ string EnvironmentName,
+ bool ShouldSendEmail,
+ string WorkerServiceMonInResource,
+ string FqaTrainingGroupName,
+ string MonInSite,
+ string NewBaseUrl,
+ string OldBaseUrl,
+ string PackagingAndLabelingTrainingGroupName,
+ string SiProductionTrainingGroupName,
+ string UserCertificationRecordsFilePath,
+ string WorkingDirectoryName) {
+
+ public override string ToString() {
+ string result = JsonSerializer.Serialize(this, AppSettingsSourceGenerationContext.Default.AppSettings);
+ return result;
+ }
+
+ public static AppSettings Get(IConfigurationRoot configurationRoot) {
+ AppSettings? result;
+ try {
+#pragma warning disable IL3050, IL2026
+ result = configurationRoot.Get() ?? throw new Exception();
+#pragma warning restore IL3050, IL2026
+ } catch (Exception) {
+ List paths = [];
+ foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) {
+ if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider)
+ continue;
+ if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider)
+ continue;
+ paths.Add(physicalFileProvider.Root);
+ }
+
+ throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}");
+ }
+
+ return result;
+ }
+
+ internal static void SetEnvironmentVariables(HostApplicationBuilder builder) {
+ builder.Configuration.AddUserSecrets();
+ AppSettings appSettings = Get(builder.Configuration);
+ Environment.SetEnvironmentVariable("AsmHtrTrainingGroupName", appSettings.AsmHtrTrainingGroupName);
+ Environment.SetEnvironmentVariable("CleansTrainingGroupName", appSettings.CleansTrainingGroupName);
+ Environment.SetEnvironmentVariable("EpiProTrainingGroupName", appSettings.EpiProTrainingGroupName);
+ Environment.SetEnvironmentVariable("FabApprovalBaseUrl", appSettings.BaseUrl);
+ Environment.SetEnvironmentVariable("FabApprovalDbConnectionString", appSettings.DbConnectionString);
+ Environment.SetEnvironmentVariable("FabApprovalEnvironmentName", appSettings.EnvironmentName);
+ Environment.SetEnvironmentVariable("FabApprovalShouldSendEmail", appSettings.ShouldSendEmail.ToString());
+ Environment.SetEnvironmentVariable("FabApprovalWorkerServiceMonInResource", appSettings.WorkerServiceMonInResource);
+ Environment.SetEnvironmentVariable("FqaTrainingGroupName", appSettings.FqaTrainingGroupName);
+ Environment.SetEnvironmentVariable("MonInSite", appSettings.MonInSite);
+ Environment.SetEnvironmentVariable("NewFabApprovalBaseUrl", appSettings.NewBaseUrl);
+ Environment.SetEnvironmentVariable("OldFabApprovalUrl", appSettings.OldBaseUrl);
+ Environment.SetEnvironmentVariable("PackagingAndLabelingTrainingGroupName", appSettings.PackagingAndLabelingTrainingGroupName);
+ Environment.SetEnvironmentVariable("SiProductionTrainingGroupName", appSettings.SiProductionTrainingGroupName);
+ Environment.SetEnvironmentVariable("UserCertificationRecordsFilePath", appSettings.UserCertificationRecordsFilePath);
+ }
+
+ internal static AppSettings LoadEnvironmentVariables() {
+ AppSettings result;
+ try {
+ string asmHtrTrainingGroupName = Environment.GetEnvironmentVariable("AsmHtrTrainingGroupName") ??
+ throw new ArgumentNullException("AsmHtrTrainingGroupName environment variable not found");
+ string cleansTrainingGroupName = Environment.GetEnvironmentVariable("CleansTrainingGroupName") ??
+ throw new ArgumentNullException("CleansTrainingGroupName environment variable not found");
+ string epiProTrainingGroupName = Environment.GetEnvironmentVariable("EpiProTrainingGroupName") ??
+ throw new ArgumentNullException("EpiProTrainingGroupName environment variable not found");
+ string baseUrl = Environment.GetEnvironmentVariable("FabApprovalBaseUrl") ??
+ throw new ArgumentNullException("FabApprovalBaseUrl environment variable not found");
+ string dbConnectionString = Environment.GetEnvironmentVariable("FabApprovalDbConnectionString") ??
+ throw new ArgumentNullException("FabApprovalDbConnectionString environment variable not found");
+ string environmentName = Environment.GetEnvironmentVariable("FabApprovalEnvironmentName") ??
+ throw new ArgumentNullException("FabApprovalEnvironmentName environment variable not found");
+ if (!bool.TryParse(Environment.GetEnvironmentVariable("FabApprovalShouldSendEmail"), out bool shouldSendEmail))
+ throw new ArgumentNullException("FabApprovalShouldSendEmail environment variable not found");
+ string workerServiceMonInResource = Environment.GetEnvironmentVariable("FabApprovalWorkerServiceMonInResource") ??
+ throw new ArgumentNullException("FabApprovalWorkerServiceMonInResource environment variable not found");
+ string fqaTrainingGroupName = Environment.GetEnvironmentVariable("FqaTrainingGroupName") ??
+ throw new ArgumentNullException("FqaTrainingGroupName environment variable not found");
+ string monInSite = Environment.GetEnvironmentVariable("MonInSite") ??
+ throw new ArgumentNullException("MonInSite environment variable not found");
+ string newBaseUrl = Environment.GetEnvironmentVariable("NewFabApprovalBaseUrl") ??
+ throw new ArgumentNullException("NewFabApprovalBaseUrl environment variable not found");
+ string oldBaseUrl = Environment.GetEnvironmentVariable("OldFabApprovalUrl") ??
+ throw new ArgumentNullException("OldFabApprovalUrl environment variable not found");
+ string packagingAndLabelingTrainingGroupName = Environment.GetEnvironmentVariable("PackagingAndLabelingTrainingGroupName") ??
+ throw new ArgumentNullException("PackagingAndLabelingTrainingGroupName environment variable not found");
+ string siProductionTrainingGroupName = Environment.GetEnvironmentVariable("SiProductionTrainingGroupName") ??
+ throw new ArgumentNullException("SiProductionTrainingGroupName environment variable not found");
+ string userCertificationRecordsFilePath = Environment.GetEnvironmentVariable("UserCertificationRecordsFilePath") ??
+ throw new ArgumentNullException("UserCertificationRecordsFilePath environment variable not found");
+ result = new(AsmHtrTrainingGroupName: asmHtrTrainingGroupName,
+ CleansTrainingGroupName: cleansTrainingGroupName,
+ EpiProTrainingGroupName: epiProTrainingGroupName,
+ BaseUrl: baseUrl,
+ Company: "Infineon Technologies Americas Corp.",
+ DbConnectionString: dbConnectionString,
+ EnvironmentName: environmentName,
+ ShouldSendEmail: shouldSendEmail,
+ WorkerServiceMonInResource: workerServiceMonInResource,
+ FqaTrainingGroupName: fqaTrainingGroupName,
+ MonInSite: monInSite,
+ NewBaseUrl: newBaseUrl,
+ OldBaseUrl: oldBaseUrl,
+ PackagingAndLabelingTrainingGroupName: packagingAndLabelingTrainingGroupName,
+ SiProductionTrainingGroupName: siProductionTrainingGroupName,
+ UserCertificationRecordsFilePath: userCertificationRecordsFilePath,
+ WorkingDirectoryName: "IFXApps");
+ } catch (Exception ex) {
+ NLog.LogManager.GetCurrentClassLogger().Error($"Unable to load environment variables, because {ex.Message}");
+ throw;
+ }
+
+ return result;
+ }
+}
+
+[JsonSourceGenerationOptions(WriteIndented = true)]
+[JsonSerializable(typeof(AppSettings))]
+internal partial class AppSettingsSourceGenerationContext : JsonSerializerContext {
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/Models/Approval.cs b/FabApprovalWorkerService/Models/Approval.cs
index df12e54..d6dd519 100644
--- a/FabApprovalWorkerService/Models/Approval.cs
+++ b/FabApprovalWorkerService/Models/Approval.cs
@@ -19,4 +19,4 @@ public class Approval {
public int Step { get; set; } = 1;
public string SubRoleCategoryItem { get; set; } = "";
public int TaskID { get; set; }
-}
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/Models/CorrectiveAction.cs b/FabApprovalWorkerService/Models/CorrectiveAction.cs
index 1edd596..ed76dfb 100644
--- a/FabApprovalWorkerService/Models/CorrectiveAction.cs
+++ b/FabApprovalWorkerService/Models/CorrectiveAction.cs
@@ -1,10 +1,10 @@
namespace FabApprovalWorkerService.Models;
public class CorrectiveAction {
- public required int CANo { get; set; }
+ public required int CANo { get; set; }
public bool ApprovalStatus { get; set; }
public DateTime FollowUpDate { get; set; }
public DateTime ClosedDate { get; set; }
public int QAID { get; set; }
public required string CATitle { get; set; }
-}
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/Models/ECN.cs b/FabApprovalWorkerService/Models/ECN.cs
index 78b4926..b328b57 100644
--- a/FabApprovalWorkerService/Models/ECN.cs
+++ b/FabApprovalWorkerService/Models/ECN.cs
@@ -12,4 +12,4 @@ public class ECN {
public required int OriginatorID { get; set; }
public required string Title { get; set; }
public DateTime CloseDate { get; set; } = DateTime.MaxValue;
-}
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/Models/MRB.cs b/FabApprovalWorkerService/Models/MRB.cs
index 7b07761..5a8002b 100644
--- a/FabApprovalWorkerService/Models/MRB.cs
+++ b/FabApprovalWorkerService/Models/MRB.cs
@@ -26,4 +26,4 @@ public class MRB {
public required string Status { get; set; }
public string Tool { get; set; } = "";
public string Category { get; set; } = string.Empty;
-}
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/Models/OOOTemp.cs b/FabApprovalWorkerService/Models/OOOTemp.cs
index 868f7af..579ee7f 100644
--- a/FabApprovalWorkerService/Models/OOOTemp.cs
+++ b/FabApprovalWorkerService/Models/OOOTemp.cs
@@ -7,4 +7,4 @@ public class OOOTemp {
public required DateTime OOOStartDate { get; set; }
public required DateTime OOOExpirationDate { get; set; }
public bool Processed { get; set; } = false;
-}
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/Models/PCRB.cs b/FabApprovalWorkerService/Models/PCRB.cs
index 6b7df52..a3853ab 100644
--- a/FabApprovalWorkerService/Models/PCRB.cs
+++ b/FabApprovalWorkerService/Models/PCRB.cs
@@ -15,4 +15,4 @@ public class PCRB {
public DateTime InsertTimeStamp { get; set; } = DateTimeUtilities.MIN_DT;
public DateTime LastUpdateDate { get; set; } = DateTimeUtilities.MIN_DT;
public DateTime ClosedDate { get; set; } = DateTimeUtilities.MAX_DT;
-}
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/Models/TrainingAssignment.cs b/FabApprovalWorkerService/Models/TrainingAssignment.cs
index e01cbf5..1dbe9d4 100644
--- a/FabApprovalWorkerService/Models/TrainingAssignment.cs
+++ b/FabApprovalWorkerService/Models/TrainingAssignment.cs
@@ -12,5 +12,5 @@ public class TrainingAssignment {
public bool status { get; set; } = false;
public bool Deleted { get; set; } = false;
public DateTime DeletedDate { get; set; }
- public DateTime LastNotification { get; set; }
-}
+ public DateTime LastNotification { get; set; }
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/Models/User.cs b/FabApprovalWorkerService/Models/User.cs
index 9a87700..9700c4a 100644
--- a/FabApprovalWorkerService/Models/User.cs
+++ b/FabApprovalWorkerService/Models/User.cs
@@ -1,7 +1,7 @@
using Dapper.Contrib.Extensions;
namespace FabApprovalWorkerService.Models;
-[Table ("Users")]
+[Table("Users")]
public class User {
[Key]
public required int UserID { get; set; }
@@ -16,7 +16,7 @@ public class User {
public DateTime OOOStartDate { get; set; }
public DateTime OOOExpirationDate { get; set; }
public int DelegatedTo { get; set; }
- public required bool CanViewITAR { get; set; }
+ public required bool CanViewITAR { get; set; }
public required bool IsManager { get; set; }
public bool IsCleansCertified { get; set; } = false;
public bool IsAnyLevelCertified { get; set; } = false;
@@ -25,4 +25,4 @@ public class User {
public bool IsFqaCertified { get; set; } = false;
public bool IsFqaAssessmentCertified { get; set; } = false;
public bool IsActive { get; set; } = false;
-}
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/Models/UserSubRole.cs b/FabApprovalWorkerService/Models/UserSubRole.cs
index 6a79453..2a78b71 100644
--- a/FabApprovalWorkerService/Models/UserSubRole.cs
+++ b/FabApprovalWorkerService/Models/UserSubRole.cs
@@ -5,4 +5,4 @@ public class UserSubRole {
public required int UserID { get; set; }
public required int SubRoleID { get; set; }
public bool Delegated { get; set; } = false;
-}
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/Program.cs b/FabApprovalWorkerService/Program.cs
index 44aaff6..bf9f91b 100644
--- a/FabApprovalWorkerService/Program.cs
+++ b/FabApprovalWorkerService/Program.cs
@@ -1,4 +1,8 @@
+using System.Diagnostics;
+using System.Net.Mail;
+
using FabApprovalWorkerService.Clients;
+using FabApprovalWorkerService.Models;
using FabApprovalWorkerService.Services;
using FabApprovalWorkerService.Workers;
@@ -6,8 +10,6 @@ using NLog.Extensions.Logging;
using Quartz;
-using System.Net.Mail;
-
HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
builder.Logging.ClearProviders();
@@ -16,10 +18,20 @@ builder.Logging.AddNLog();
builder.Services.AddHttpClient();
+if (Debugger.IsAttached) {
+ string? asmHtrTrainingGroupName = Environment.GetEnvironmentVariable("AsmHtrTrainingGroupName");
+ if (string.IsNullOrEmpty(asmHtrTrainingGroupName)) {
+ AppSettings.SetEnvironmentVariables(builder);
+ }
+}
+
+AppSettings appSettings = AppSettings.LoadEnvironmentVariables();
+builder.Services.AddSingleton(_ => appSettings);
+
builder.Services.AddScoped();
builder.Services.AddScoped();
builder.Services.AddScoped();
-builder.Services.AddScoped((serviceProvider) => {
+builder.Services.AddScoped((serviceProvider) => {
return new SmtpClient("mailrelay-external.infineon.com");
});
builder.Services.AddScoped();
@@ -126,4 +138,7 @@ builder.Services.AddHostedService();
IHost app = builder.Build();
-app.Run();
+if (Debugger.IsAttached)
+ app.Services.GetRequiredService();
+
+app.Run();
\ No newline at end of file
diff --git a/FabApprovalWorkerService/Services/ApprovalService.cs b/FabApprovalWorkerService/Services/ApprovalService.cs
index 4ea8d6f..af13b0d 100644
--- a/FabApprovalWorkerService/Services/ApprovalService.cs
+++ b/FabApprovalWorkerService/Services/ApprovalService.cs
@@ -1,7 +1,7 @@
-using FabApprovalWorkerService.Models;
-using FabApprovalWorkerService.Utilities;
+using System.Text;
-using System.Text;
+using FabApprovalWorkerService.Models;
+using FabApprovalWorkerService.Utilities;
namespace FabApprovalWorkerService.Services;
@@ -63,4 +63,4 @@ public class ApprovalService : IApprovalService {
throw;
}
}
-}
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/Services/CorrectiveActionService.cs b/FabApprovalWorkerService/Services/CorrectiveActionService.cs
index 9403d81..68dcbf6 100644
--- a/FabApprovalWorkerService/Services/CorrectiveActionService.cs
+++ b/FabApprovalWorkerService/Services/CorrectiveActionService.cs
@@ -1,7 +1,7 @@
-using FabApprovalWorkerService.Models;
-using FabApprovalWorkerService.Utilities;
+using System.Text;
-using System.Text;
+using FabApprovalWorkerService.Models;
+using FabApprovalWorkerService.Utilities;
namespace FabApprovalWorkerService.Services;
@@ -106,4 +106,4 @@ public class CorrectiveActionService : ICorrectiveActionService {
throw;
}
}
-}
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/Services/DalService.cs b/FabApprovalWorkerService/Services/DalService.cs
index 414480f..4261057 100644
--- a/FabApprovalWorkerService/Services/DalService.cs
+++ b/FabApprovalWorkerService/Services/DalService.cs
@@ -1,6 +1,6 @@
-using Dapper;
+using System.Data;
-using System.Data;
+using Dapper;
namespace FabApprovalWorkerService.Services;
@@ -28,7 +28,7 @@ public class DalService : IDalService {
int remainingRetries = RETRIES;
bool queryWasSuccessful = false;
- Exception exception = null;
+ Exception? exception = null;
IEnumerable result = new List();
while (!queryWasSuccessful && remainingRetries > 0) {
int backoffSeconds = (RETRIES - remainingRetries--) * BACKOFF_SECONDS_INTERVAL;
@@ -60,7 +60,7 @@ public class DalService : IDalService {
int remainingRetries = RETRIES;
bool queryWasSuccessful = false;
- Exception exception = null;
+ Exception? exception = null;
int rowsAffected = 0;
while (!queryWasSuccessful && remainingRetries > 0) {
int backoffSeconds = (RETRIES - remainingRetries--) * BACKOFF_SECONDS_INTERVAL;
@@ -86,4 +86,4 @@ public class DalService : IDalService {
return rowsAffected;
}
-}
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/Services/DbConnectionService.cs b/FabApprovalWorkerService/Services/DbConnectionService.cs
index b5e1ba5..0490972 100644
--- a/FabApprovalWorkerService/Services/DbConnectionService.cs
+++ b/FabApprovalWorkerService/Services/DbConnectionService.cs
@@ -1,7 +1,8 @@
-using Microsoft.Data.SqlClient;
-using Microsoft.Data.Sqlite;
+using System.Data;
-using System.Data;
+using FabApprovalWorkerService.Models;
+
+using Microsoft.Data.SqlClient;
namespace FabApprovalWorkerService.Services;
@@ -10,17 +11,13 @@ public interface IDbConnectionService {
}
public class DbConnectionService : IDbConnectionService {
- private readonly string _envName;
private readonly string _dbConnectionString;
- public DbConnectionService() {
- _envName = Environment.GetEnvironmentVariable("FabApprovalEnvironmentName") ??
- throw new ArgumentNullException("FabApprovalEnvironmentName environment variable not found");
- _dbConnectionString = Environment.GetEnvironmentVariable("FabApprovalDbConnectionString") ??
- throw new ArgumentNullException("FabApprovalDbConnectionString environment variable not found");
+ public DbConnectionService(AppSettings appSettings) {
+ _dbConnectionString = appSettings.DbConnectionString;
}
public IDbConnection GetConnection() {
return new SqlConnection(_dbConnectionString);
}
-}
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/Services/ECNService.cs b/FabApprovalWorkerService/Services/ECNService.cs
index 03a3bce..3be1de4 100644
--- a/FabApprovalWorkerService/Services/ECNService.cs
+++ b/FabApprovalWorkerService/Services/ECNService.cs
@@ -1,7 +1,7 @@
-using FabApprovalWorkerService.Models;
-using FabApprovalWorkerService.Utilities;
+using System.Text;
-using System.Text;
+using FabApprovalWorkerService.Models;
+using FabApprovalWorkerService.Utilities;
namespace FabApprovalWorkerService.Services;
@@ -185,4 +185,4 @@ public class ECNService : IECNService {
throw;
}
}
-}
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/Services/MRBService.cs b/FabApprovalWorkerService/Services/MRBService.cs
index 3b1dfeb..5384b3e 100644
--- a/FabApprovalWorkerService/Services/MRBService.cs
+++ b/FabApprovalWorkerService/Services/MRBService.cs
@@ -1,7 +1,7 @@
-using FabApprovalWorkerService.Models;
-using FabApprovalWorkerService.Utilities;
+using System.Text;
-using System.Text;
+using FabApprovalWorkerService.Models;
+using FabApprovalWorkerService.Utilities;
namespace FabApprovalWorkerService.Services;
@@ -56,4 +56,4 @@ public class MRBService : IMRBService {
throw;
}
}
-}
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/Services/MonInClient.cs b/FabApprovalWorkerService/Services/MonInClient.cs
index 17dc33a..185db8a 100644
--- a/FabApprovalWorkerService/Services/MonInClient.cs
+++ b/FabApprovalWorkerService/Services/MonInClient.cs
@@ -1,4 +1,6 @@
-using Infineon.Monitoring.MonA;
+using FabApprovalWorkerService.Models;
+
+using Infineon.Monitoring.MonA;
namespace FabApprovalWorkerService.Services;
@@ -13,13 +15,11 @@ public class MonInClient : IMonInClient {
private readonly string _site;
private readonly string _resource;
- public MonInClient(ILogger logger) {
+ public MonInClient(ILogger logger, AppSettings appSettings) {
_logger = logger ??
throw new ArgumentNullException("ILogger not injected");
- _site = Environment.GetEnvironmentVariable("MonInSite") ??
- throw new ArgumentNullException("MonInSite environment variable not found");
- _resource = Environment.GetEnvironmentVariable("FabApprovalWorkerServiceMonInResource") ??
- throw new ArgumentNullException("FabApprovalWorkerServiceMonInResource environment variable not found");
+ _site = appSettings.MonInSite;
+ _resource = appSettings.WorkerServiceMonInResource;
}
public void PostMetric(string metricName, double metricValue) {
@@ -55,4 +55,4 @@ public class MonInClient : IMonInClient {
ex.Message);
}
}
-}
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/Services/PCRBService.cs b/FabApprovalWorkerService/Services/PCRBService.cs
index acf9503..80ef617 100644
--- a/FabApprovalWorkerService/Services/PCRBService.cs
+++ b/FabApprovalWorkerService/Services/PCRBService.cs
@@ -1,7 +1,7 @@
-using FabApprovalWorkerService.Models;
-using FabApprovalWorkerService.Utilities;
+using System.Text;
-using System.Text;
+using FabApprovalWorkerService.Models;
+using FabApprovalWorkerService.Utilities;
namespace FabApprovalWorkerService.Services;
@@ -57,4 +57,4 @@ public class PCRBService : IPCRBService {
throw;
}
}
-}
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/Services/SmtpService.cs b/FabApprovalWorkerService/Services/SmtpService.cs
index f03f8d1..738d70d 100644
--- a/FabApprovalWorkerService/Services/SmtpService.cs
+++ b/FabApprovalWorkerService/Services/SmtpService.cs
@@ -1,9 +1,10 @@
-using FabApprovalWorkerService.Clients;
+using System.Net.Mail;
+
+using FabApprovalWorkerService.Clients;
+using FabApprovalWorkerService.Models;
using Microsoft.IdentityModel.Tokens;
-using System.Net.Mail;
-
namespace FabApprovalWorkerService.Services;
public interface ISmtpService {
@@ -15,13 +16,19 @@ public class SmtpService : ISmtpService {
private ISmtpClientWrapper _smtpClient;
private bool _shouldSendEmail;
- public SmtpService(ILogger logger, ISmtpClientWrapper smtpClient) {
+ public SmtpService(ILogger logger,
+ ISmtpClientWrapper smtpClient,
+ AppSettings? appSettings = null) {
_logger = logger ??
throw new ArgumentNullException("ILogger not injected");
_smtpClient = smtpClient ??
throw new ArgumentNullException("SmtpClient not injected");
- if (!Boolean.TryParse(Environment.GetEnvironmentVariable("FabApprovalShouldSendEmail"), out _shouldSendEmail))
- throw new ArgumentNullException("FabApprovalShouldSendEmail environment variable not found");
+ if (appSettings is not null)
+ _shouldSendEmail = appSettings.ShouldSendEmail;
+ else {
+ if (!bool.TryParse(Environment.GetEnvironmentVariable("FabApprovalShouldSendEmail"), out _shouldSendEmail))
+ throw new ArgumentNullException("FabApprovalShouldSendEmail environment variable not found");
+ }
}
public async Task SendEmail(IEnumerable recipients,
@@ -32,7 +39,7 @@ public class SmtpService : ISmtpService {
if (ccRecipients is null) throw new ArgumentNullException("ccRecipients cannot be null!");
if (subject.IsNullOrEmpty()) throw new ArgumentNullException("subject cannot be null or empty!");
if (body.IsNullOrEmpty()) throw new ArgumentNullException("body cannot be null or empty!");
-
+
return await Task.Run(() => {
int maxRetries = 3;
int backoffSeconds = 30;
@@ -76,4 +83,4 @@ public class SmtpService : ISmtpService {
return messageWasSent;
});
}
-}
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/Services/TrainingService.cs b/FabApprovalWorkerService/Services/TrainingService.cs
index 9cb21df..a9b9f3d 100644
--- a/FabApprovalWorkerService/Services/TrainingService.cs
+++ b/FabApprovalWorkerService/Services/TrainingService.cs
@@ -1,8 +1,8 @@
-using FabApprovalWorkerService.Models;
-
-using System.Text;
+using System.Text;
using System.Text.Json;
+using FabApprovalWorkerService.Models;
+
namespace FabApprovalWorkerService.Services;
public interface ITrainingService {
@@ -30,20 +30,25 @@ public class TrainingService : ITrainingService {
private readonly string _userCertRecordsFilePath;
- public TrainingService(ILogger logger, IDalService dalService, IUserService userService) {
+ public TrainingService(ILogger logger,
+ IDalService dalService,
+ IUserService userService,
+ AppSettings? appSettings = null) {
_logger = logger ??
throw new ArgumentNullException("ILogger not injected");
_dalService = dalService ??
throw new ArgumentNullException("IDalService not injected");
_userService = userService ??
throw new ArgumentNullException("IUserService not injected");
- _userCertRecordsFilePath = Environment.GetEnvironmentVariable("UserCertificationRecordsFilePath") ??
- throw new ArgumentNullException("UserCertificationRecordsFilePath environment variable not found");
+ _userCertRecordsFilePath = appSettings is not null
+ ? appSettings.UserCertificationRecordsFilePath
+ : Environment.GetEnvironmentVariable("UserCertificationRecordsFilePath") ??
+ throw new ArgumentNullException("UserCertificationRecordsFilePath environment variable not found");
}
public async Task DeleteDocAssignment(int trainingAssignmentId) {
if (trainingAssignmentId <= 0) throw new ArgumentException($"Invalid training assignment id: {trainingAssignmentId}");
-
+
try {
_logger.LogInformation($"Attempting to delete training doc assignments for training assignment {trainingAssignmentId}");
@@ -84,7 +89,7 @@ public class TrainingService : ITrainingService {
}
public async Task DeleteTrainingAssignmentById(int trainingAssignmentId) {
- if (trainingAssignmentId <= 0)
+ if (trainingAssignmentId <= 0)
throw new ArgumentException($"Invalid training assignment id: {trainingAssignmentId}");
try {
@@ -341,4 +346,4 @@ public class TrainingService : ITrainingService {
throw;
}
}
-}
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/Services/UserService.cs b/FabApprovalWorkerService/Services/UserService.cs
index 56bb7ee..7dbaa8c 100644
--- a/FabApprovalWorkerService/Services/UserService.cs
+++ b/FabApprovalWorkerService/Services/UserService.cs
@@ -1,9 +1,9 @@
-using FabApprovalWorkerService.Models;
+using System.Text;
+
+using FabApprovalWorkerService.Models;
using Microsoft.IdentityModel.Tokens;
-using System.Text;
-
namespace FabApprovalWorkerService.Services;
public interface IUserService {
@@ -417,4 +417,4 @@ public class UserService : IUserService {
throw;
}
}
-}
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/Services/WindowsService.cs b/FabApprovalWorkerService/Services/WindowsService.cs
index 16bc93a..149c79b 100644
--- a/FabApprovalWorkerService/Services/WindowsService.cs
+++ b/FabApprovalWorkerService/Services/WindowsService.cs
@@ -39,4 +39,4 @@ public class WindowsService : BackgroundService {
Environment.Exit(1);
}
}
-}
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/Workers/ApprovalNotificationWorker.cs b/FabApprovalWorkerService/Workers/ApprovalNotificationWorker.cs
index 5403722..deef297 100644
--- a/FabApprovalWorkerService/Workers/ApprovalNotificationWorker.cs
+++ b/FabApprovalWorkerService/Workers/ApprovalNotificationWorker.cs
@@ -1,13 +1,13 @@
-using FabApprovalWorkerService.Models;
+using System.Net.Mail;
+using System.Text;
+
+using FabApprovalWorkerService.Models;
using FabApprovalWorkerService.Services;
using Infineon.Monitoring.MonA;
using Quartz;
-using System.Net.Mail;
-using System.Text;
-
namespace FabApprovalWorkerService.Workers;
public class ApprovalNotificationWorker : IJob {
@@ -31,7 +31,8 @@ public class ApprovalNotificationWorker : IJob {
IPCRBService pcrbService,
ISmtpService smtpService,
IMonInClient monInClient,
- IUserService userService) {
+ IUserService userService,
+ AppSettings appSettings) {
_logger = logger ?? throw new ArgumentNullException("ILogger not injected");
_approvalService = approvalService ?? throw new ArgumentNullException("IApprovalService not injected");
_ecnService = ecnService ?? throw new ArgumentNullException("IECNService not injected");
@@ -41,10 +42,8 @@ public class ApprovalNotificationWorker : IJob {
_smtpService = smtpService ?? throw new ArgumentNullException("ISmtpService not injected");
_monInClient = monInClient ?? throw new ArgumentNullException("IMonInClient not injected");
_userService = userService ?? throw new ArgumentNullException("IUserService not injected");
- _oldFabApprovalBaseUrl = Environment.GetEnvironmentVariable("OldFabApprovalUrl") ??
- throw new ArgumentNullException("OldFabApprovalUrl environment variable not found");
- _newFabApprovalBaseUrl = Environment.GetEnvironmentVariable("NewFabApprovalBaseUrl") ??
- throw new ArgumentNullException("NewFabApprovalBaseUrl environment variable not found");
+ _oldFabApprovalBaseUrl = appSettings.OldBaseUrl;
+ _newFabApprovalBaseUrl = appSettings.NewBaseUrl;
}
public async Task Execute(IJobExecutionContext context) {
@@ -116,8 +115,8 @@ public class ApprovalNotificationWorker : IJob {
if (issueAndUserIds.Contains($"{approval.IssueID}{approval.UserID}")) {
approval.NotifyDate = DateTime.Now;
await _approvalService.UpdateApproval(approval);
- } else if ((isEcn || isCa || isMrb || isPcrb) &&
- !string.IsNullOrWhiteSpace(title) &&
+ } else if ((isEcn || isCa || isMrb || isPcrb) &&
+ !string.IsNullOrWhiteSpace(title) &&
!string.IsNullOrWhiteSpace(url) &&
!issueAndUserIds.Contains($"{approval.IssueID}{approval.UserID}")) {
@@ -167,4 +166,4 @@ public class ApprovalNotificationWorker : IJob {
}
}
}
-}
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/Workers/CAFollowUpWorker.cs b/FabApprovalWorkerService/Workers/CAFollowUpWorker.cs
index c1a7fbc..7de77ee 100644
--- a/FabApprovalWorkerService/Workers/CAFollowUpWorker.cs
+++ b/FabApprovalWorkerService/Workers/CAFollowUpWorker.cs
@@ -1,13 +1,13 @@
-using FabApprovalWorkerService.Models;
+using System.Net.Mail;
+using System.Text;
+
+using FabApprovalWorkerService.Models;
using FabApprovalWorkerService.Services;
using Infineon.Monitoring.MonA;
using Quartz;
-using System.Net.Mail;
-using System.Text;
-
namespace FabApprovalWorkerService.Workers;
public class CAFollowUpWorker : IJob {
@@ -22,14 +22,14 @@ public class CAFollowUpWorker : IJob {
ICorrectiveActionService caService,
IUserService userService,
ISmtpService smtpService,
- IMonInClient monInClient) {
+ IMonInClient monInClient,
+ AppSettings appSettings) {
_logger = logger ?? throw new ArgumentNullException("ILogger not injected");
_caService = caService ?? throw new ArgumentNullException("ICorrectiveActionService not injected");
_userService = userService ?? throw new ArgumentNullException("IUserService not injected");
_smtpService = smtpService ?? throw new ArgumentNullException("ISmtpService not injected");
_monInClient = monInClient ?? throw new ArgumentNullException("IMonInClient not injected");
- _baseUrl = Environment.GetEnvironmentVariable("FabApprovalBaseUrl") ??
- throw new ArgumentNullException("FabApprovalBaseUrl environment variable not found");
+ _baseUrl = appSettings.BaseUrl;
}
public async Task Execute(IJobExecutionContext context) {
@@ -45,7 +45,7 @@ public class CAFollowUpWorker : IJob {
.ToList();
foreach (CorrectiveAction ca in followUpCAs) {
await _caService.CreateCorrectiveActionFollowUpApproval(ca.CANo, ca.QAID);
-
+
string qaEmail = await _userService.GetUserEmail(ca.QAID);
IEnumerable recipients = new List() {
new MailAddress(qaEmail)
@@ -84,4 +84,4 @@ public class CAFollowUpWorker : IJob {
}
}
}
-}
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/Workers/CertificationTrainingGroupWorker.cs b/FabApprovalWorkerService/Workers/CertificationTrainingGroupWorker.cs
index 20d5934..ad6b0ee 100644
--- a/FabApprovalWorkerService/Workers/CertificationTrainingGroupWorker.cs
+++ b/FabApprovalWorkerService/Workers/CertificationTrainingGroupWorker.cs
@@ -1,3 +1,5 @@
+using System.Text;
+
using FabApprovalWorkerService.Models;
using FabApprovalWorkerService.Services;
@@ -5,14 +7,12 @@ using Infineon.Monitoring.MonA;
using Quartz;
-using System.Text;
-
namespace FabApprovalWorkerService.Workers;
public class CertificationTrainingGroupWorker : IJob {
private static readonly int MAX_RETRIES = 3;
private static readonly int BACKOFF_SECONDS = 30;
-
+
private readonly ILogger _logger;
private readonly ITrainingService _trainingService;
private readonly IUserService _userService;
@@ -26,25 +26,20 @@ public class CertificationTrainingGroupWorker : IJob {
private readonly string _packagingAndLabelingTrainingGroupName;
public CertificationTrainingGroupWorker(ILogger logger,
- ITrainingService trainingService,
- IUserService userService,
- IMonInClient monInClient) {
+ ITrainingService trainingService,
+ IUserService userService,
+ IMonInClient monInClient,
+ AppSettings appSettings) {
_logger = logger ?? throw new ArgumentNullException("ILogger not injected");
_trainingService = trainingService ?? throw new ArgumentNullException("ITrainingService not injected");
_userService = userService ?? throw new ArgumentNullException("IUserService not injected");
_monInClient = monInClient ?? throw new ArgumentNullException("IMonInClient not injected");
- _siProductionGroupName = Environment.GetEnvironmentVariable("SiProductionTrainingGroupName") ??
- throw new ArgumentNullException("SiProductionTrainingGroupName environment variable not found");
- _asmHtrTrainingGroupName = Environment.GetEnvironmentVariable("AsmHtrTrainingGroupName") ??
- throw new ArgumentNullException("AsmHtrTrainingGroupName environment variable not found");
- _cleansTrainingGroupName = Environment.GetEnvironmentVariable("CleansTrainingGroupName") ??
- throw new ArgumentNullException("CleansTrainingGroupName environment variable not found");
- _epiProTrainingGroupName = Environment.GetEnvironmentVariable("EpiProTrainingGroupName") ??
- throw new ArgumentNullException("EpiProTrainingGroupName environment variable not found");
- _fqaTrainingGroupName = Environment.GetEnvironmentVariable("FqaTrainingGroupName") ??
- throw new ArgumentNullException("FqaTrainingGroupName environment variable not found");
- _packagingAndLabelingTrainingGroupName = Environment.GetEnvironmentVariable("PackagingAndLabelingTrainingGroupName") ??
- throw new ArgumentNullException("PackagingAndLabelingTrainingGroupName environment variable not found");
+ _fqaTrainingGroupName = appSettings.FqaTrainingGroupName;
+ _asmHtrTrainingGroupName = appSettings.AsmHtrTrainingGroupName;
+ _cleansTrainingGroupName = appSettings.CleansTrainingGroupName;
+ _epiProTrainingGroupName = appSettings.EpiProTrainingGroupName;
+ _siProductionGroupName = appSettings.SiProductionTrainingGroupName;
+ _packagingAndLabelingTrainingGroupName = appSettings.PackagingAndLabelingTrainingGroupName;
}
public async Task Execute(IJobExecutionContext context) {
@@ -93,10 +88,11 @@ public class CertificationTrainingGroupWorker : IJob {
_logger.LogInformation($"Processing cert record {{{record}}}");
if (record is not null) {
- User user = null;
+ User? user;
try {
user = await _userService.GetUserByEmail(record.Email);
} catch (Exception ex) {
+ user = null;
StringBuilder errMsgBuilder = new();
errMsgBuilder.Append($"An exception occurred when attempting to get user for email {record.Email}. ");
errMsgBuilder.Append($"Exception: {ex.Message}");
diff --git a/FabApprovalWorkerService/Workers/ExpiredOOOStatusWorker.cs b/FabApprovalWorkerService/Workers/ExpiredOOOStatusWorker.cs
index f304288..555bf80 100644
--- a/FabApprovalWorkerService/Workers/ExpiredOOOStatusWorker.cs
+++ b/FabApprovalWorkerService/Workers/ExpiredOOOStatusWorker.cs
@@ -1,12 +1,12 @@
-using FabApprovalWorkerService.Models;
+using System.Text;
+
+using FabApprovalWorkerService.Models;
using FabApprovalWorkerService.Services;
using Infineon.Monitoring.MonA;
using Quartz;
-using System.Text;
-
namespace FabApprovalWorkerService.Workers;
public sealed class ExpiredOOOStatusWorker : IJob {
@@ -43,7 +43,7 @@ public sealed class ExpiredOOOStatusWorker : IJob {
List expiredOOOUsers = await _userService.GetAllExpiredOOOUsersAsync();
_logger.LogInformation($"There are {expiredOOOUsers.Count()} OOO users expiring");
-
+
foreach (User user in expiredOOOUsers) {
bool approvalsRemoved = await _userService.RemoveDelegatedApprovalsForUser(user.UserID, user.DelegatedTo);
bool subRolesRemoved = await _userService.RemoveDelegatedUserSubRoles(user.UserID, user.DelegatedTo);
@@ -61,7 +61,7 @@ public sealed class ExpiredOOOStatusWorker : IJob {
errMsgBuilder.Append($"OOO flag removed: {oooFlagRemoved}");
throw new Exception(errMsgBuilder.ToString());
}
- }
+ }
} catch (Exception ex) {
StringBuilder errMsgBuilder = new();
errMsgBuilder.Append("An exception occurred when attempting to remove OOO status for users with OOO expired ");
@@ -80,4 +80,4 @@ public sealed class ExpiredOOOStatusWorker : IJob {
}
}
}
-}
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/Workers/ExpiredTECNWorker.cs b/FabApprovalWorkerService/Workers/ExpiredTECNWorker.cs
index b6029ca..25cfeba 100644
--- a/FabApprovalWorkerService/Workers/ExpiredTECNWorker.cs
+++ b/FabApprovalWorkerService/Workers/ExpiredTECNWorker.cs
@@ -1,14 +1,13 @@
-using FabApprovalWorkerService.Models;
+using System.Net.Mail;
+using System.Text;
+
+using FabApprovalWorkerService.Models;
using FabApprovalWorkerService.Services;
using Infineon.Monitoring.MonA;
using Quartz;
-using System.Net.Mail;
-
-using System.Text;
-
namespace FabApprovalWorkerService.Workers;
public class ExpiredTECNWorker : IJob {
private readonly ILogger _logger;
@@ -24,7 +23,8 @@ public class ExpiredTECNWorker : IJob {
ITrainingService trainingService,
IUserService userService,
ISmtpService smtpService,
- IMonInClient monInClient) {
+ IMonInClient monInClient,
+ AppSettings appSettings) {
_logger = logger ??
throw new ArgumentNullException("ILogger not injected");
_ecnService = ecnService ??
@@ -37,8 +37,7 @@ public class ExpiredTECNWorker : IJob {
throw new ArgumentNullException("ISmtpService not injected");
_monInClient = monInClient ??
throw new ArgumentNullException("IMonInClient not injected");
- _baseUrl = Environment.GetEnvironmentVariable("FabApprovalBaseUrl") ??
- throw new ArgumentNullException("FabApprovalBaseUrl environment variable not found");
+ _baseUrl = appSettings.BaseUrl;
}
public async Task Execute(IJobExecutionContext context) {
@@ -61,14 +60,14 @@ public class ExpiredTECNWorker : IJob {
foreach (ECN ecn in expiredEcns) {
List trainingIds = (await _trainingService.GetTrainingIdsForECN(ecn.ECNNumber)).ToList();
-
+
foreach (int trainingId in trainingIds) {
await _trainingService.DeleteTrainingAssignmentsByTrainingId(trainingId);
-
- List trainingAssignmentIds =
+
+ List trainingAssignmentIds =
(await _trainingService.GetTrainingAssignmentIdsForTraining(trainingId)).ToList();
- foreach (int assignmentId in trainingAssignmentIds) {
+ foreach (int assignmentId in trainingAssignmentIds) {
await _trainingService.DeleteDocAssignment(assignmentId);
}
@@ -76,8 +75,8 @@ public class ExpiredTECNWorker : IJob {
}
string recipientEmail = await _userService.GetUserEmail(ecn.OriginatorID);
- List recipientEamils = new List() {
- new MailAddress(recipientEmail)
+ List recipientEamils = new List() {
+ new MailAddress(recipientEmail)
};
string subject = "Notice of Expired TECN";
@@ -108,4 +107,4 @@ public class ExpiredTECNWorker : IJob {
}
}
}
-}
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/Workers/ExpiringTECNWorker.cs b/FabApprovalWorkerService/Workers/ExpiringTECNWorker.cs
index 4190bfa..bb61d95 100644
--- a/FabApprovalWorkerService/Workers/ExpiringTECNWorker.cs
+++ b/FabApprovalWorkerService/Workers/ExpiringTECNWorker.cs
@@ -1,13 +1,13 @@
-using FabApprovalWorkerService.Models;
+using System.Net.Mail;
+using System.Text;
+
+using FabApprovalWorkerService.Models;
using FabApprovalWorkerService.Services;
using Infineon.Monitoring.MonA;
using Quartz;
-using System.Net.Mail;
-using System.Text;
-
namespace FabApprovalWorkerService.Workers;
public class ExpiringTECNWorker : IJob {
@@ -22,7 +22,8 @@ public class ExpiringTECNWorker : IJob {
IMonInClient monInClient,
IUserService userService,
IECNService ecnService,
- ISmtpService smtpService) {
+ ISmtpService smtpService,
+ AppSettings appSettings) {
_logger = logger ??
throw new ArgumentNullException("ILogger not injected");
_monInClient = monInClient ??
@@ -33,8 +34,7 @@ public class ExpiringTECNWorker : IJob {
throw new ArgumentNullException("IECNService not injected");
_smtpService = smtpService ??
throw new ArgumentNullException("ISmtpService not injected");
- _baseUrl = Environment.GetEnvironmentVariable("FabApprovalBaseUrl") ??
- throw new ArgumentNullException("FabApprovalBaseUrl environment variable not found");
+ _baseUrl = appSettings.BaseUrl;
}
public async Task Execute(IJobExecutionContext context) {
@@ -57,8 +57,8 @@ public class ExpiringTECNWorker : IJob {
foreach (ECN eCN in expiringTECNs) {
string recipientEmail = await _userService.GetUserEmail(eCN.OriginatorID);
MailAddress recipientAddress = new MailAddress(recipientEmail);
- List recipientList = new () { recipientAddress };
-
+ List recipientList = new() { recipientAddress };
+
List ccRecipientList = new();
foreach (string email in tecnNotificationUserEmails) {
ccRecipientList.Add(new MailAddress(email));
@@ -94,4 +94,4 @@ public class ExpiringTECNWorker : IJob {
}
}
}
-}
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/Workers/PendingOOOStatusWorker.cs b/FabApprovalWorkerService/Workers/PendingOOOStatusWorker.cs
index dc9e11d..6d7377e 100644
--- a/FabApprovalWorkerService/Workers/PendingOOOStatusWorker.cs
+++ b/FabApprovalWorkerService/Workers/PendingOOOStatusWorker.cs
@@ -1,12 +1,12 @@
-using FabApprovalWorkerService.Models;
+using System.Text;
+
+using FabApprovalWorkerService.Models;
using FabApprovalWorkerService.Services;
using Infineon.Monitoring.MonA;
using Quartz;
-using System.Text;
-
namespace FabApprovalWorkerService.Workers;
public sealed class PendingOOOStatusWorker : IJob {
@@ -43,7 +43,7 @@ public sealed class PendingOOOStatusWorker : IJob {
List pendingOOOUsers = await _userService.GetAllPendingOOOUsersAsync();
_logger.LogInformation($"There are {pendingOOOUsers.Count()} pending OOO users");
-
+
foreach (OOOTemp oooTemp in pendingOOOUsers) {
bool userAlreadyOOO = await _userService.IsUserAlreadyOOO(oooTemp.OOOUserID);
bool delegateAlreadyADelegate = await _userService.IsDelegatorAlreadyDelegatedTo(oooTemp.DelegatedTo);
@@ -84,4 +84,4 @@ public sealed class PendingOOOStatusWorker : IJob {
}
}
}
-}
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/Workers/TrainingNotificationWorker.cs b/FabApprovalWorkerService/Workers/TrainingNotificationWorker.cs
index 7ad4d47..9e30c13 100644
--- a/FabApprovalWorkerService/Workers/TrainingNotificationWorker.cs
+++ b/FabApprovalWorkerService/Workers/TrainingNotificationWorker.cs
@@ -1,13 +1,13 @@
-using FabApprovalWorkerService.Models;
+using System.Net.Mail;
+using System.Text;
+
+using FabApprovalWorkerService.Models;
using FabApprovalWorkerService.Services;
using Infineon.Monitoring.MonA;
using Quartz;
-using System.Net.Mail;
-using System.Text;
-
namespace FabApprovalWorkerService.Workers;
public class TrainingNotificationWorker : IJob {
@@ -24,15 +24,15 @@ public class TrainingNotificationWorker : IJob {
IUserService userService,
IECNService ecnService,
ISmtpService smtpService,
- IMonInClient monInClient) {
+ IMonInClient monInClient,
+ AppSettings appSettings) {
_logger = logger ?? throw new ArgumentNullException("ILogger not injected");
_trainingService = trainingService ?? throw new ArgumentNullException("ITrainingService not injected");
_userService = userService ?? throw new ArgumentNullException("IUserService not injected");
_ecnService = ecnService ?? throw new ArgumentNullException("IECNService not injected");
_smtpService = smtpService ?? throw new ArgumentNullException("ISmtpService not injected");
_monInClient = monInClient ?? throw new ArgumentNullException("IMonInClient not injected");
- _baseUrl = Environment.GetEnvironmentVariable("FabApprovalBaseUrl") ??
- throw new ArgumentNullException("FabApprovalBaseUrl environment variable not found");
+ _baseUrl = appSettings.BaseUrl;
}
public async Task Execute(IJobExecutionContext context) {
@@ -67,7 +67,7 @@ public class TrainingNotificationWorker : IJob {
_logger.LogInformation($"User {user.UserID} is inactive. Cancelling all training.");
IEnumerable userTrainingAssignmentIds = await _trainingService.GetTrainingAssignmentIdsByUserId(user.UserID);
-
+
foreach (int trainingAssignmentId in userTrainingAssignmentIds) {
await _trainingService.DeleteTrainingAssignmentById(trainingAssignmentId);
await _trainingService.DeleteDocAssignment(trainingAssignmentId);
@@ -124,7 +124,7 @@ public class TrainingNotificationWorker : IJob {
};
IEnumerable ccRecipients = new List();
-
+
StringBuilder bodyBuilder = new();
bodyBuilder.Append("Hello, you have open training assignments in Fab Approval. This is a reminder to ");
bodyBuilder.Append("finish your training assignments.
View your open training assignments ");
@@ -134,4 +134,4 @@ public class TrainingNotificationWorker : IJob {
await _smtpService.SendEmail(recipients, ccRecipients, subject, bodyBuilder.ToString());
}
-}
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerService/appsettings.Development.json b/FabApprovalWorkerService/appsettings.Development.json
deleted file mode 100644
index 1797133..0000000
--- a/FabApprovalWorkerService/appsettings.Development.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-
-}
diff --git a/FabApprovalWorkerService/appsettings.json b/FabApprovalWorkerService/appsettings.json
deleted file mode 100644
index 1797133..0000000
--- a/FabApprovalWorkerService/appsettings.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-
-}
diff --git a/FabApprovalWorkerServiceTests/.editorconfig b/FabApprovalWorkerServiceTests/.editorconfig
new file mode 100644
index 0000000..cc25d6f
--- /dev/null
+++ b/FabApprovalWorkerServiceTests/.editorconfig
@@ -0,0 +1,287 @@
+# Remove the line below if you want to inherit .editorconfig settings from higher directories
+root = true
+
+# C# files
+[*.cs]
+
+#### Core EditorConfig Options ####
+
+# Indentation and spacing
+indent_size = 4
+indent_style = space
+tab_width = 4
+
+# New line preferences
+end_of_line = crlf
+insert_final_newline = false
+
+#### .NET Coding Conventions ####
+
+# Organize usings
+dotnet_separate_import_directive_groups = true
+dotnet_sort_system_directives_first = true
+file_header_template = unset
+
+# this. and Me. preferences
+dotnet_style_qualification_for_event = false
+dotnet_style_qualification_for_field = false
+dotnet_style_qualification_for_method = false
+dotnet_style_qualification_for_property = false
+
+# Language keywords vs BCL types preferences
+dotnet_style_predefined_type_for_locals_parameters_members = true
+dotnet_style_predefined_type_for_member_access = true
+
+# Parentheses preferences
+dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:error
+dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:error
+dotnet_style_parentheses_in_other_operators = never_if_unnecessary
+dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:error
+
+# Modifier preferences
+dotnet_style_require_accessibility_modifiers = for_non_interface_members
+
+# Expression-level preferences
+dotnet_style_coalesce_expression = true
+dotnet_style_collection_initializer = true
+dotnet_style_explicit_tuple_names = true
+dotnet_style_namespace_match_folder = true
+dotnet_style_null_propagation = true
+dotnet_style_object_initializer = true
+dotnet_style_operator_placement_when_wrapping = beginning_of_line
+dotnet_style_prefer_auto_properties = true
+dotnet_style_prefer_collection_expression = when_types_loosely_match
+dotnet_style_prefer_compound_assignment = true
+dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion
+dotnet_style_prefer_conditional_expression_over_return = true:suggestion
+dotnet_style_prefer_foreach_explicit_cast_in_source = when_strongly_typed
+dotnet_style_prefer_inferred_anonymous_type_member_names = true
+dotnet_style_prefer_inferred_tuple_names = true
+dotnet_style_prefer_is_null_check_over_reference_equality_method = true
+dotnet_style_prefer_simplified_boolean_expressions = true
+dotnet_style_prefer_simplified_interpolation = true
+
+# Field preferences
+dotnet_style_readonly_field = true
+
+# Parameter preferences
+dotnet_code_quality_unused_parameters = all:error
+
+# Suppression preferences
+dotnet_remove_unnecessary_suppression_exclusions = none
+
+# New line preferences
+dotnet_style_allow_multiple_blank_lines_experimental = false:error
+dotnet_style_allow_statement_immediately_after_block_experimental = false:warning
+
+#### C# Coding Conventions ####
+
+# var preferences
+csharp_style_var_elsewhere = false:error
+csharp_style_var_for_built_in_types = false:error
+csharp_style_var_when_type_is_apparent = false:error
+
+# Expression-bodied members
+csharp_style_expression_bodied_accessors = true:silent
+csharp_style_expression_bodied_constructors = false:silent
+csharp_style_expression_bodied_indexers = true:silent
+csharp_style_expression_bodied_lambdas = true:silent
+csharp_style_expression_bodied_local_functions = false:silent
+csharp_style_expression_bodied_methods = false:silent
+csharp_style_expression_bodied_operators = false:silent
+csharp_style_expression_bodied_properties = true:silent
+
+# Pattern matching preferences
+csharp_style_pattern_matching_over_as_with_null_check = true
+csharp_style_pattern_matching_over_is_with_cast_check = true
+csharp_style_prefer_extended_property_pattern = true
+csharp_style_prefer_not_pattern = true
+csharp_style_prefer_pattern_matching = true
+csharp_style_prefer_switch_expression = true
+
+# Null-checking preferences
+csharp_style_conditional_delegate_call = true
+
+# Modifier preferences
+csharp_prefer_static_local_function = false
+csharp_preferred_modifier_order = public,private,protected,internal,file,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,required,volatile,async
+csharp_style_prefer_readonly_struct = true:warning
+csharp_style_prefer_readonly_struct_member = true
+
+# Code-block preferences
+csharp_prefer_braces = true:silent
+csharp_prefer_simple_using_statement = false:suggestion
+csharp_style_namespace_declarations = file_scoped:error
+csharp_style_prefer_method_group_conversion = true:suggestion
+csharp_style_prefer_primary_constructors = true:suggestion
+csharp_style_prefer_top_level_statements = true:error
+
+# Expression-level preferences
+csharp_prefer_simple_default_expression = true
+csharp_style_deconstructed_variable_declaration = false:suggestion
+csharp_style_implicit_object_creation_when_type_is_apparent = false
+csharp_style_inlined_variable_declaration = true:suggestion
+csharp_style_prefer_index_operator = false:error
+csharp_style_prefer_local_over_anonymous_function = true:error
+csharp_style_prefer_null_check_over_type_check = true
+csharp_style_prefer_range_operator = false:error
+csharp_style_prefer_tuple_swap = true
+csharp_style_prefer_utf8_string_literals = true
+csharp_style_throw_expression = true
+csharp_style_unused_value_assignment_preference = unused_local_variable
+csharp_style_unused_value_expression_statement_preference = unused_local_variable
+
+# 'using' directive preferences
+csharp_using_directive_placement = outside_namespace:error
+
+# New line preferences
+csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true
+csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true
+csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true
+csharp_style_allow_blank_lines_between_consecutive_braces_experimental = false:error
+csharp_style_allow_embedded_statements_on_same_line_experimental = true
+
+#### C# Formatting Rules ####
+
+# New line preferences
+csharp_new_line_before_catch = false
+csharp_new_line_before_else = false
+csharp_new_line_before_finally = false
+csharp_new_line_before_members_in_anonymous_types = true
+csharp_new_line_before_members_in_object_initializers = true
+csharp_new_line_before_open_brace = none
+csharp_new_line_between_query_expression_clauses = true
+
+# Indentation preferences
+csharp_indent_block_contents = true
+csharp_indent_braces = false
+csharp_indent_case_contents = true
+csharp_indent_case_contents_when_block = true
+csharp_indent_labels = one_less_than_current
+csharp_indent_switch_labels = true
+
+# Space preferences
+csharp_space_after_cast = false
+csharp_space_after_colon_in_inheritance_clause = true
+csharp_space_after_comma = true
+csharp_space_after_dot = false
+csharp_space_after_keywords_in_control_flow_statements = true
+csharp_space_after_semicolon_in_for_statement = true
+csharp_space_around_binary_operators = before_and_after
+csharp_space_around_declaration_statements = false
+csharp_space_before_colon_in_inheritance_clause = true
+csharp_space_before_comma = false
+csharp_space_before_dot = false
+csharp_space_before_open_square_brackets = false
+csharp_space_before_semicolon_in_for_statement = false
+csharp_space_between_empty_square_brackets = false
+csharp_space_between_method_call_empty_parameter_list_parentheses = false
+csharp_space_between_method_call_name_and_opening_parenthesis = false
+csharp_space_between_method_call_parameter_list_parentheses = false
+csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
+csharp_space_between_method_declaration_name_and_open_parenthesis = false
+csharp_space_between_method_declaration_parameter_list_parentheses = false
+csharp_space_between_parentheses = false
+csharp_space_between_square_brackets = false
+
+# Wrapping preferences
+csharp_preserve_single_line_blocks = true
+csharp_preserve_single_line_statements = true
+
+#### Naming styles ####
+
+# Naming rules
+
+dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion
+dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
+dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i
+
+dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion
+dotnet_naming_rule.types_should_be_pascal_case.symbols = types
+dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case
+
+dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion
+dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
+dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case
+
+# Symbol specifications
+
+dotnet_naming_symbols.interface.applicable_kinds = interface
+dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
+dotnet_naming_symbols.interface.required_modifiers =
+
+dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
+dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
+dotnet_naming_symbols.types.required_modifiers =
+
+dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
+dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
+dotnet_naming_symbols.non_field_members.required_modifiers =
+
+# Naming styles
+
+dotnet_naming_style.pascal_case.required_prefix =
+dotnet_naming_style.pascal_case.required_suffix =
+dotnet_naming_style.pascal_case.word_separator =
+dotnet_naming_style.pascal_case.capitalization = pascal_case
+
+dotnet_naming_style.begins_with_i.required_prefix = I
+dotnet_naming_style.begins_with_i.required_suffix =
+dotnet_naming_style.begins_with_i.word_separator =
+dotnet_naming_style.begins_with_i.capitalization = pascal_case
+
+[*.{cs,vb}]
+dotnet_style_coalesce_expression = true:suggestion
+dotnet_style_null_propagation = true:suggestion
+dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
+dotnet_style_prefer_auto_properties = true:silent
+dotnet_style_object_initializer = true:suggestion
+dotnet_style_collection_initializer = true:suggestion
+dotnet_style_prefer_simplified_boolean_expressions = true:suggestion
+dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion
+dotnet_style_prefer_conditional_expression_over_return = true:suggestion
+dotnet_style_explicit_tuple_names = true:suggestion
+dotnet_style_prefer_inferred_tuple_names = true:suggestion
+dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
+dotnet_style_prefer_compound_assignment = true:suggestion
+dotnet_style_prefer_simplified_interpolation = true:suggestion
+dotnet_style_operator_placement_when_wrapping = beginning_of_line
+tab_width = 4
+indent_size = 4
+end_of_line = crlf
+dotnet_style_prefer_collection_expression = when_types_loosely_match:suggestion
+
+# Question
+
+csharp_style_inlined_variable_declaration = false
+csharp_style_prefer_primary_constructors = false
+dotnet_diagnostic.CA1510.severity = none # "Use 'ArgumentNullException.ThrowIfNull' instead of explicitly throwing a new exception instance
+dotnet_diagnostic.CA1806.severity = none # SendEmailWithValidArgsShouldSendMailThroughClient calls TryParse but does not explicitly
+dotnet_diagnostic.CA1827.severity = none # Count() is used where Any() could be used instead to improve performance
+dotnet_diagnostic.CA1829.severity = none # Use the property instead of Enumerable.Count()
+dotnet_diagnostic.CA1860.severity = none # Prefer comparing 'Count' to 0 rather than using 'Any()', both for clarity and for performance
+dotnet_diagnostic.CA2208.severity = none # Method .ctor passes
+dotnet_diagnostic.CA2208.severity = none # Method .ctor passes
+dotnet_diagnostic.CA2211.severity = none # Non-constant fields should not be visible
+dotnet_diagnostic.CA2253.severity = none # Named placeholders in the logging message template should not be comprised
+dotnet_diagnostic.CA2254.severity = none # The logging message template should not vary between calls to
+dotnet_diagnostic.CS1998.severity = none # This async method lacks 'await' operators and will run synchronously
+dotnet_diagnostic.CS8618.severity = none # Non-nullable field '_mockDalService' must contain a non-null value when exiting constructor
+dotnet_diagnostic.CS8625.severity = none # Cannot convert null literal to non-nullable reference type
+dotnet_diagnostic.IDE0005.severity = none # Using directive is unnecessary.
+dotnet_diagnostic.IDE0017.severity = none # Object initialization can be simplified
+dotnet_diagnostic.IDE0018.severity = none # Variable declaration can be inlined
+dotnet_diagnostic.IDE0028.severity = none # Collection initialization can be simplified
+dotnet_diagnostic.IDE0044.severity = none # Make field readonly
+dotnet_diagnostic.IDE0046.severity = none # 'if' statement can be simplified
+dotnet_diagnostic.IDE0052.severity = none # "Private member can be removed
+dotnet_diagnostic.IDE0270.severity = none # Null check can be simplified
+dotnet_diagnostic.IDE0290.severity = none # Use primary constructor
+dotnet_diagnostic.IDE1006.severity = none # Naming rule violation: These words must begin with upper case characters
+dotnet_diagnostic.IDE2000.severity = error # IDE2000: Allow multiple blank lines
+dotnet_diagnostic.NUnit2001.severity = none # Consider using the constraint model, Assert.That(expr, Is.False), instead of the classic model
+dotnet_diagnostic.NUnit2004.severity = none # Consider using the constraint model
+dotnet_diagnostic.NUnit2010.severity = none # Use Is.EqualTo constraint instead of direct comparison for better assertion messages in ca
+dotnet_style_coalesce_expression = false
+dotnet_style_object_initializer = false
+dotnet_style_prefer_conditional_expression_over_return = false
\ No newline at end of file
diff --git a/FabApprovalWorkerServiceTests/.vscode/format-report.json b/FabApprovalWorkerServiceTests/.vscode/format-report.json
new file mode 100644
index 0000000..0637a08
--- /dev/null
+++ b/FabApprovalWorkerServiceTests/.vscode/format-report.json
@@ -0,0 +1 @@
+[]
\ No newline at end of file
diff --git a/FabApprovalWorkerServiceTests/.vscode/launch.json b/FabApprovalWorkerServiceTests/.vscode/launch.json
new file mode 100644
index 0000000..aff00e5
--- /dev/null
+++ b/FabApprovalWorkerServiceTests/.vscode/launch.json
@@ -0,0 +1,30 @@
+{
+ // 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": [
+ {
+ "name": ".NET Core Launch (console)",
+ "type": "coreclr",
+ "request": "launch",
+ "preLaunchTask": "build",
+ "program": "${workspaceFolder}/bin/Debug/net8.0/win-x64/FabApprovalWorkerServiceTests.dll",
+ "args": [],
+ "cwd": "${workspaceFolder}",
+ "console": "integratedTerminal",
+ "stopAtEntry": false
+ },
+ {
+ "name": ".NET Core Attach",
+ "type": "coreclr",
+ "request": "attach"
+ },
+ {
+ "type": "node",
+ "request": "launch",
+ "name": "node Launch Current Opened File",
+ "program": "${file}"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerServiceTests/.vscode/mklink.md b/FabApprovalWorkerServiceTests/.vscode/mklink.md
new file mode 100644
index 0000000..ca22e31
--- /dev/null
+++ b/FabApprovalWorkerServiceTests/.vscode/mklink.md
@@ -0,0 +1,5 @@
+# mklink
+
+```bash 1731705389065 = 638673021890650000 = Fri Nov 15 2024 14:16:28 GMT-0700 (Mountain Standard Time)
+mklink /J "L:\DevOps\Mesa_FI\FabApprovalWorkerService\FabApprovalWorkerServiceTests\.vscode\.UserSecrets" "C:\Users\phares\AppData\Roaming\Microsoft\UserSecrets\f445e6e0-784b-4dde-9ef0-2143e6e90b1b"
+```
diff --git a/FabApprovalWorkerServiceTests/.vscode/settings.json b/FabApprovalWorkerServiceTests/.vscode/settings.json
new file mode 100644
index 0000000..f05d843
--- /dev/null
+++ b/FabApprovalWorkerServiceTests/.vscode/settings.json
@@ -0,0 +1,424 @@
+{
+ "[markdown]": {
+ "editor.wordWrap": "off"
+ },
+ "files.exclude": {
+ "**/.git": false,
+ "**/node_modules": true
+ },
+ "files.watcherExclude": {
+ "**/node_modules": true
+ },
+ "cSpell.words": [
+ "abutton",
+ "accessibilities",
+ "accodingly",
+ "acknowledgmentby",
+ "Acks",
+ "actionsheet",
+ "Additonal",
+ "Addtional",
+ "againm",
+ "agendaview",
+ "Antlr",
+ "Appover",
+ "Appprrovers",
+ "Approvalog",
+ "Aprovers",
+ "Aproverslist",
+ "asax",
+ "aspnetmvc",
+ "Assignedto",
+ "Atachments",
+ "Attachemnt",
+ "Attachemnts",
+ "Attchment",
+ "auditee",
+ "Auditee",
+ "Auditees",
+ "automaically",
+ "Autthorized",
+ "beacuase",
+ "beforeunload",
+ "Belguim",
+ "bfound",
+ "bgcolor",
+ "Bies",
+ "binded",
+ "blackbackground",
+ "blackhover",
+ "blackpressed",
+ "blueenergy",
+ "blueopal",
+ "buttongroup",
+ "BYMRB",
+ "bytesgot",
+ "CAID",
+ "casection",
+ "CAXXXX",
+ "CCPCR",
+ "CCPCRB",
+ "cellspacing",
+ "Cheeso's",
+ "chkbx",
+ "Clib",
+ "colorpicker",
+ "columnmenu",
+ "columnsreorder",
+ "columnsresize",
+ "comming",
+ "Containmen",
+ "Copmments",
+ "correctiv",
+ "Correctivet",
+ "Creat",
+ "currentd",
+ "Cyle",
+ "dadada",
+ "darkbluehover",
+ "darkbluepressed",
+ "darkred",
+ "datafields",
+ "datasource",
+ "dataviz",
+ "datepicker",
+ "datetimepicker",
+ "dayview",
+ "Deletet",
+ "Delgation",
+ "DENITED",
+ "Deparmtent",
+ "departmentids",
+ "Descirption",
+ "devprog",
+ "dfeffc",
+ "Disp",
+ "Dispo",
+ "Dispoitio",
+ "Dispos",
+ "Dispositon",
+ "Dispostion",
+ "Dispostions",
+ "dispotypevalidation",
+ "Docbase",
+ "Documentum",
+ "Documetum",
+ "dont",
+ "downlaoded",
+ "draganddrop",
+ "dragcancel",
+ "dropdownlist",
+ "Eamils",
+ "ECNPCRB",
+ "Ecns",
+ "edmx",
+ "EECN",
+ "emai",
+ "emailparams",
+ "Emergrncy",
+ "energyblue",
+ "Eran",
+ "Esql",
+ "ETECN",
+ "EXCELOPENXML",
+ "existinglocation",
+ "Expando",
+ "extrafield",
+ "fadc",
+ "fbec",
+ "fcfdfd",
+ "fdff",
+ "fece",
+ "feeebd",
+ "ffdc",
+ "ffdd",
+ "fieldset",
+ "FILIPE",
+ "filtermenu",
+ "Fldr",
+ "flintstone",
+ "FLOWLOCS",
+ "FMEA",
+ "ftplib",
+ "FTPSPN",
+ "GETDATE",
+ "gitea",
+ "globaldocudms",
+ "glyphicons",
+ "groupable",
+ "Guids",
+ "halflings",
+ "Hexsize",
+ "highcontrast",
+ "Hmac",
+ "holdsteps",
+ "hostspecific",
+ "icenium",
+ "IECN",
+ "imagebrowser",
+ "IMRB",
+ "Infineon",
+ "Insertd",
+ "inverseicons",
+ "IPCRB",
+ "ISADMIN",
+ "islast",
+ "ISNULL",
+ "ITAR",
+ "jquery",
+ "jqueryval",
+ "jqwidgets",
+ "jqxbuttongroup",
+ "jqxbuttons",
+ "jqxcalendar",
+ "jqxchart",
+ "jqxcheckbox",
+ "jqxcolorpicker",
+ "jqxcombobox",
+ "jqxcore",
+ "jqxdata",
+ "jqxdatatable",
+ "jqxdatetimeinput",
+ "jqxdocking",
+ "jqxdockpanel",
+ "jqxdragdrop",
+ "jqxdropdownbutton",
+ "jqxdropdownlist",
+ "jqxexpander",
+ "jqxgauge",
+ "jqxgrid",
+ "jqxinput",
+ "jqxknockout",
+ "jqxlistbox",
+ "jqxlistmenu",
+ "jqxmaskedinput",
+ "jqxmenu",
+ "jqxnavigationbar",
+ "jqxnumberinput",
+ "jqxpanel",
+ "jqxpasswordinput",
+ "jqxprogressbar",
+ "jqxradiobutton",
+ "jqxrangeselector",
+ "jqxrating",
+ "jqxresponse",
+ "jqxscrollbar",
+ "jqxscrollview",
+ "jqxslider",
+ "jqxsplitter",
+ "jqxswitchbutton",
+ "jqxtabs",
+ "jqxtooltip",
+ "jqxtouch",
+ "jqxtree",
+ "jqxtreegrid",
+ "jqxtreemap",
+ "jqxvalidator",
+ "jqxwindow",
+ "kendogridcustom",
+ "kendoui",
+ "labelelement",
+ "labelledby",
+ "Leanred",
+ "lightgray",
+ "linkbutton",
+ "Linq",
+ "Listdiv",
+ "listview",
+ "Lnks",
+ "localfilename",
+ "loclist",
+ "logis",
+ "logtext",
+ "loopmis",
+ "lotdispo",
+ "LOTDISPSITION",
+ "Lotfile",
+ "lotlist",
+ "lotstatusoption",
+ "LTRIM",
+ "MADUREIRA",
+ "mailrelay",
+ "MDTM",
+ "meego",
+ "meetingid",
+ "menubutton",
+ "mesafi",
+ "metroblack",
+ "metrodark",
+ "miliseconds",
+ "modalview",
+ "modernizr",
+ "Modernizr",
+ "monthview",
+ "MRBIs",
+ "Mrbs",
+ "msecs",
+ "multipleextended",
+ "Navigatable",
+ "nbsp",
+ "newbase",
+ "newchange",
+ "newdi",
+ "newfilename",
+ "newsource",
+ "Newtonsoft",
+ "notications",
+ "Notifcation",
+ "Notifyf",
+ "NTLM",
+ "Nullcc",
+ "numerictextbox",
+ "objdata",
+ "OCAP",
+ "occured",
+ "odata",
+ "oldfilename",
+ "OLHOLD",
+ "onclick",
+ "onmousemove",
+ "OPDESC",
+ "OPENQUERY",
+ "Oper",
+ "operationslist",
+ "Orginator",
+ "Originatorname",
+ "Ouellette",
+ "Owin",
+ "pageable",
+ "Pageable",
+ "panelbar",
+ "parentid",
+ "parminput",
+ "parms",
+ "Parms",
+ "particula",
+ "pasv",
+ "PASV",
+ "PATINDEX",
+ "PCRB",
+ "PCRBID",
+ "pcrvalues",
+ "pdbonly",
+ "Preventitive",
+ "preventivet",
+ "Prevetative",
+ "proces",
+ "Processedl",
+ "procs",
+ "productfamilies",
+ "progess",
+ "progressbar",
+ "qrcode",
+ "Quanityt",
+ "rangebar",
+ "Recep",
+ "Recepient",
+ "recieved",
+ "recordlock",
+ "remotefilename",
+ "reorderable",
+ "reportform",
+ "reportslist",
+ "reportslistdiv",
+ "Reqquired",
+ "Reqs",
+ "Requiest",
+ "Responsibles",
+ "RETR",
+ "Revisioing",
+ "Revisioned",
+ "Revison",
+ "rgba",
+ "rkotian",
+ "RNFR",
+ "RNTO",
+ "Roless",
+ "roundbg",
+ "RTRIM",
+ "SAMDB",
+ "scroller",
+ "scrollview",
+ "seleced",
+ "selectionlog",
+ "Selectpart",
+ "sess",
+ "Sfisharepoint",
+ "shinyblack",
+ "showpassword",
+ "SIGNON",
+ "simpleparser",
+ "slddrw",
+ "sldprt",
+ "sortasc",
+ "sortascbutton",
+ "sortdesc",
+ "sortdescbutton",
+ "sortremove",
+ "sparkline",
+ "splitview",
+ "SPNMRB",
+ "SPNPDB",
+ "SSRS",
+ "Sssign",
+ "Staus",
+ "stylesheet",
+ "Submited",
+ "subrole",
+ "subroles",
+ "Succefully",
+ "Succesfully",
+ "sucessfully",
+ "SURP",
+ "Swashbuckle",
+ "SWRN",
+ "tabindex",
+ "tabstrip",
+ "Tahoma",
+ "taskcompleted",
+ "Tasklist",
+ "Taveler",
+ "TECN",
+ "TECNs",
+ "TEMIRWAP",
+ "tempecd",
+ "tempimplement",
+ "templabel",
+ "tempvalue",
+ "TEMSA",
+ "timepicker",
+ "Tobe",
+ "Toplevel",
+ "Totrav",
+ "trainingby",
+ "Traininglist",
+ "traininglistdiv",
+ "transanction",
+ "Trav",
+ "Traveller",
+ "Traverler",
+ "TRAVLELER",
+ "Travler",
+ "TREEVIEW",
+ "trigerred",
+ "ttinclude",
+ "Uhandled",
+ "Updat",
+ "Uplaod",
+ "Upto",
+ "userevents",
+ "userids",
+ "userlist",
+ "Validatable",
+ "valueelement",
+ "Variabls",
+ "Verdana",
+ "vgrid",
+ "viewmodel",
+ "vsdoc",
+ "whethere",
+ "windowsphone",
+ "Winsock",
+ "worlflow"
+ ]
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerServiceTests/.vscode/tasks.json b/FabApprovalWorkerServiceTests/.vscode/tasks.json
new file mode 100644
index 0000000..469c075
--- /dev/null
+++ b/FabApprovalWorkerServiceTests/.vscode/tasks.json
@@ -0,0 +1,135 @@
+{
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "label": "User Secrets Init",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "user-secrets",
+ "-p",
+ "${workspaceFolder}/FabApprovalWorkerServiceTests.csproj",
+ "init"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "User Secrets Set",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "user-secrets",
+ "-p",
+ "${workspaceFolder}/FabApprovalWorkerServiceTests.csproj",
+ "set",
+ "_UserSecretsId",
+ "f445e6e0-784b-4dde-9ef0-2143e6e90b1b"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "Format",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "format",
+ "--report",
+ ".vscode",
+ "--verbosity",
+ "detailed",
+ "--severity",
+ "warn"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "Format-Whitespaces",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "format",
+ "whitespace"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "build",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "build",
+ "${workspaceFolder}/FabApprovalWorkerServiceTests.csproj",
+ "/property:GenerateFullPaths=true",
+ "/consoleloggerparameters:NoSummary"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "testDebug",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "test",
+ "${workspaceFolder}/FabApprovalWorkerServiceTests.csproj",
+ "/property:GenerateFullPaths=true",
+ "/consoleloggerparameters:NoSummary"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "testRelease",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "test",
+ "${workspaceFolder}/FabApprovalWorkerServiceTests.csproj",
+ "/property:GenerateFullPaths=true",
+ "/consoleloggerparameters:NoSummary",
+ "-c",
+ "Release"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "publish",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "publish",
+ "${workspaceFolder}/FabApprovalWorkerServiceTests.csproj",
+ "/property:GenerateFullPaths=true",
+ "/consoleloggerparameters:NoSummary"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "watch",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "watch",
+ "run",
+ "--project",
+ "${workspaceFolder}/FabApprovalWorkerServiceTests.csproj"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "Publish AOT",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "publish",
+ "-r",
+ "win-x64",
+ "-c",
+ "Release",
+ "-p:PublishAot=true",
+ "${workspaceFolder}/FabApprovalWorkerServiceTests.csproj",
+ "/property:GenerateFullPaths=true",
+ "/consoleloggerparameters:NoSummary"
+ ],
+ "problemMatcher": "$msCompile"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerServiceTests/CorrectiveActionServiceTests.cs b/FabApprovalWorkerServiceTests/CorrectiveActionServiceTests.cs
index 8d5de80..d6b9031 100644
--- a/FabApprovalWorkerServiceTests/CorrectiveActionServiceTests.cs
+++ b/FabApprovalWorkerServiceTests/CorrectiveActionServiceTests.cs
@@ -40,7 +40,7 @@ public class CorrectiveActionServiceTests {
[Test]
public async Task GetCorrectiveActionsWithFollowUpInFiveDaysShouldReturnExpectedCAs() {
- IEnumerable expectedCAs = new List() {
+ IEnumerable expectedCAs = new List() {
new CorrectiveAction() {
CANo = 1,
CATitle = "title"
@@ -98,4 +98,4 @@ public class CorrectiveActionServiceTests {
_mockDalService.Verify(d => d.ExecuteAsync(It.IsAny()), Times.Once());
}
-}
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerServiceTests/ECNServiceTests.cs b/FabApprovalWorkerServiceTests/ECNServiceTests.cs
index 9d83f41..472cc26 100644
--- a/FabApprovalWorkerServiceTests/ECNServiceTests.cs
+++ b/FabApprovalWorkerServiceTests/ECNServiceTests.cs
@@ -74,7 +74,7 @@ internal class ECNServiceTests {
[Test]
public async Task GetExpiringTECNsWithNoExtensionFromDbShouldReturnSameResults() {
- IEnumerable ecns = new List() {
+ IEnumerable ecns = new List() {
new ECN() {
ECNNumber = 1,
OriginatorID = 1,
@@ -225,7 +225,7 @@ internal class ECNServiceTests {
[Test]
public async Task GetTECNNotificationUserEmailsShouldReturnExpectedUserEmails() {
- IEnumerable userEmails = new List() {
+ IEnumerable userEmails = new List() {
"fake1@email.com",
"fake2@email.com"
};
@@ -270,7 +270,7 @@ internal class ECNServiceTests {
[Test]
public async Task GetEcnByNumberShouldReturnExpectedEcn() {
- IEnumerable expectedEcns = new List() {
+ IEnumerable expectedEcns = new List() {
new ECN() {
ECNNumber = 1,
OriginatorID = 1,
@@ -433,4 +433,4 @@ internal class ECNServiceTests {
Assert.True(isExpired);
}
-}
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerServiceTests/FabApprovalWorkerServiceTests.csproj b/FabApprovalWorkerServiceTests/FabApprovalWorkerServiceTests.csproj
index 778f1b8..f444d5b 100644
--- a/FabApprovalWorkerServiceTests/FabApprovalWorkerServiceTests.csproj
+++ b/FabApprovalWorkerServiceTests/FabApprovalWorkerServiceTests.csproj
@@ -1,15 +1,13 @@
-
-
+
net8.0
enable
enable
-
false
true
Debug;Release;Staging
+ f445e6e0-784b-4dde-9ef0-2143e6e90b1b
-
@@ -19,13 +17,10 @@
-
-
-
-
+
\ No newline at end of file
diff --git a/FabApprovalWorkerServiceTests/SmtpServiceTests.cs b/FabApprovalWorkerServiceTests/SmtpServiceTests.cs
index c5e669d..c3c44b6 100644
--- a/FabApprovalWorkerServiceTests/SmtpServiceTests.cs
+++ b/FabApprovalWorkerServiceTests/SmtpServiceTests.cs
@@ -1,12 +1,12 @@
-using FabApprovalWorkerService.Clients;
+using System.Net.Mail;
+
+using FabApprovalWorkerService.Clients;
using FabApprovalWorkerService.Services;
using Microsoft.Extensions.Logging;
using Moq;
-using System.Net.Mail;
-
namespace FabApprovalWorkerServiceTests;
internal class SmtpServiceTests {
private static readonly List ADDRESS_LIST = new List() {
@@ -48,7 +48,7 @@ internal class SmtpServiceTests {
_smtpService = new SmtpService(_mockLogger.Object, _mockSmtpClient.Object);
Assert.ThrowsAsync(async Task () => {
- await _smtpService.SendEmail(new List (), ADDRESS_LIST, "subject", "body");
+ await _smtpService.SendEmail(new List(), ADDRESS_LIST, "subject", "body");
});
}
@@ -100,13 +100,13 @@ internal class SmtpServiceTests {
[Test]
public async Task SendEmailWithValidArgsShouldSendMailThroughClient() {
_smtpService = new SmtpService(_mockLogger.Object, _mockSmtpClient.Object);
-
+
Assert.True(await _smtpService.SendEmail(ADDRESS_LIST, ADDRESS_LIST, "subject", "body"));
bool shouldSendEmail = false;
- Boolean.TryParse(Environment.GetEnvironmentVariable("FabApprovalShouldSendEmail"), out shouldSendEmail);
+ bool.TryParse(Environment.GetEnvironmentVariable("FabApprovalShouldSendEmail"), out shouldSendEmail);
if (shouldSendEmail)
_mockSmtpClient.Verify(s => s.Send(It.IsAny()));
}
-}
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerServiceTests/TrainingServiceTests.cs b/FabApprovalWorkerServiceTests/TrainingServiceTests.cs
index d454283..65a80ab 100644
--- a/FabApprovalWorkerServiceTests/TrainingServiceTests.cs
+++ b/FabApprovalWorkerServiceTests/TrainingServiceTests.cs
@@ -156,7 +156,7 @@ public class TrainingServiceTests {
public void MarkTrainingAsCompleteWithInvalidIdShouldThrowException() {
_trainingService = new TrainingService(_mockLogger.Object, _mockDalService.Object, _mockUserService.Object);
- Assert.ThrowsAsync(async Task() => await _trainingService.MarkTrainingAsComplete(-1));
+ Assert.ThrowsAsync(async Task () => await _trainingService.MarkTrainingAsComplete(-1));
}
[Test]
@@ -181,7 +181,7 @@ public class TrainingServiceTests {
[Test]
public async Task GetActiveTrainingAssignmentsShouldReturnExpectedAssignments() {
- IEnumerable expectedAssignments = new List() {
+ IEnumerable expectedAssignments = new List() {
new TrainingAssignment() {
ID = 1,
TrainingID = 1,
@@ -217,7 +217,7 @@ public class TrainingServiceTests {
_trainingService = new TrainingService(_mockLogger.Object, _mockDalService.Object, _mockUserService.Object);
- Assert.ThrowsAsync(async Task() => await _trainingService.GetActiveTrainingAssignments());
+ Assert.ThrowsAsync(async Task () => await _trainingService.GetActiveTrainingAssignments());
}
[Test]
@@ -341,4 +341,4 @@ public class TrainingServiceTests {
Assert.That(expectedIds, Is.EquivalentTo(actualIds));
}
-}
+}
\ No newline at end of file
diff --git a/FabApprovalWorkerServiceTests/UserServiceTests.cs b/FabApprovalWorkerServiceTests/UserServiceTests.cs
index 7954a6a..114f6aa 100644
--- a/FabApprovalWorkerServiceTests/UserServiceTests.cs
+++ b/FabApprovalWorkerServiceTests/UserServiceTests.cs
@@ -77,9 +77,9 @@ internal class UserServiceTests {
_userService = new UserService(MOCK_LOGGER, _mockDalService.Object);
- Assert.ThrowsAsync(async Task() => await _userService.GetAllExpiredOOOUsersAsync());
+ Assert.ThrowsAsync(async Task () => await _userService.GetAllExpiredOOOUsersAsync());
}
-
+
[Test]
public async Task GetAllExpiredOOOUsersShouldReturnMockUsers() {
_mockDalService.Setup(d => d.QueryAsync(It.IsAny())).Returns(Task.FromResult(MOCK_USERS));
@@ -99,7 +99,7 @@ internal class UserServiceTests {
Assert.ThrowsAsync(async Task () => await _userService.GetAllPendingOOOUsersAsync());
}
-
+
[Test]
public async Task GetAllPendingOOOUsersShouldReturnMockOOOTemps() {
_mockDalService.Setup(d => d.QueryAsync(It.IsAny())).Returns(Task.FromResult(MOCK_OOO_TEMPS));
@@ -157,7 +157,7 @@ internal class UserServiceTests {
_userService = new UserService(MOCK_LOGGER, _mockDalService.Object);
- Assert.ThrowsAsync(async Task() => await _userService.IsDelegatorAlreadyDelegatedTo(2));
+ Assert.ThrowsAsync(async Task () => await _userService.IsDelegatorAlreadyDelegatedTo(2));
}
[Test]
@@ -195,7 +195,7 @@ internal class UserServiceTests {
[Test]
public async Task InsertDelegatedRolesWithValidUserIdShouldReturnTrue() {
- IEnumerable userSubRoles = new List() {
+ IEnumerable userSubRoles = new List() {
new UserSubRole() {
UserSubRoleID = 1,
UserID = 1,
@@ -274,7 +274,7 @@ internal class UserServiceTests {
[Test]
public async Task RemoveDelegatedUserSubRolesWithValidParamsShouldReturnTrue() {
- IEnumerable roleIds = new List() {1, 2};
+ IEnumerable roleIds = new List() { 1, 2 };
_mockDalService.Setup(d => d.QueryAsync(It.IsAny())).Returns(Task.FromResult(roleIds));
_mockDalService.Setup(d => d.ExecuteAsync(It.IsAny())).Returns(Task.FromResult(1));
@@ -337,7 +337,7 @@ internal class UserServiceTests {
[Test]
public async Task FlagUserAsOOOWithValidOOOTempShouldReturnTrue() {
- OOOTemp oooTemp = new OOOTemp() {
+ OOOTemp oooTemp = new OOOTemp() {
ID = 1,
OOOUserID = 1,
OOOStartDate = DateTime.Now,
@@ -434,7 +434,7 @@ internal class UserServiceTests {
public void GetUserEmailWithInvalidUserIdShouldThrowException() {
_userService = new UserService(MOCK_LOGGER, _mockDalService.Object);
- Assert.ThrowsAsync(async Task() => await _userService.GetUserEmail(-1));
+ Assert.ThrowsAsync(async Task () => await _userService.GetUserEmail(-1));
}
[Test]
@@ -443,7 +443,7 @@ internal class UserServiceTests {
_userService = new UserService(MOCK_LOGGER, _mockDalService.Object);
- Assert.ThrowsAsync(async Task() => await _userService.GetUserEmail(3));
+ Assert.ThrowsAsync(async Task () => await _userService.GetUserEmail(3));
}
[Test]
@@ -483,12 +483,12 @@ internal class UserServiceTests {
_mockDalService.Setup(d => d.QueryAsync(It.IsAny())).Returns(Task.FromResult(emptyUsers));
- Assert.ThrowsAsync(async Task() => await _userService.GetUserById(5));
+ Assert.ThrowsAsync(async Task () => await _userService.GetUserById(5));
}
[Test]
public async Task GetUserByIdShouldReturnExpectedUser() {
- IEnumerable expectedUsers = new List() {
+ IEnumerable expectedUsers = new List() {
new User() {
UserID = 1,
LoginID = "id",