Viewer to Server
| @ -83,6 +83,7 @@ dotnet_diagnostic.IDE0001.severity = warning # IDE0001: Simplify name | ||||
| dotnet_diagnostic.IDE0004.severity = warning # IDE0004: Cast is redundant. | ||||
| dotnet_diagnostic.IDE0002.severity = warning # Simplify (member access) - System.Version.Equals("1", "2"); Version.Equals("1", "2"); | ||||
| dotnet_diagnostic.IDE0005.severity = warning # Using directive is unnecessary | ||||
| dotnet_diagnostic.IDE0031.severity = warning # Use null propagation (IDE0031) | ||||
| dotnet_diagnostic.IDE0047.severity = warning # IDE0047: Parentheses can be removed | ||||
| dotnet_diagnostic.IDE0049.severity = warning # Use language keywords instead of framework type names for type references (IDE0049) | ||||
| dotnet_diagnostic.IDE0060.severity = warning # IDE0060: Remove unused parameter | ||||
|  | ||||
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						| @ -52,7 +52,7 @@ BenchmarkDotNet.Artifacts/ | ||||
| project.lock.json | ||||
| project.fragment.lock.json | ||||
| artifacts/ | ||||
| **/Properties/launchSettings.json | ||||
| # **/Properties/launchSettings.json | ||||
|  | ||||
| # StyleCop | ||||
| StyleCopReport.xml | ||||
|  | ||||
							
								
								
									
										266
									
								
								.groovy
									
									
									
									
									
								
							
							
						
						| @ -1,266 +0,0 @@ | ||||
| #!/usr/bin/env groovy | ||||
| /* groovylint-disable CompileStatic, ConsecutiveStringConcatenation, DuplicateNumberLiteral, DuplicateStringLiteral, LineLength, NestedBlockDepth, NoDef, VariableTypeRequired */ | ||||
| import groovy.transform.Field | ||||
|  | ||||
| @Field String _DDrive = 'D:/' | ||||
| @Field String _ExePath = '...' | ||||
| @Field String _NGINXFile = '...' | ||||
| @Field String _PortNumber = '...' | ||||
| @Field String _AssemblyName = '...' | ||||
| @Field String _AgentDevelopment = '' | ||||
| @Field String _NetVersion = 'net6.0' | ||||
| @Field String _GitCommitSeven = '...' | ||||
| @Field String _TargetLocation = '...' | ||||
| @Field String _FirstBeforePlus = '5000' | ||||
| @Field String _GitName = 'OI-Metrology' | ||||
| @Field String _MonARessource = 'OI_Metrology' | ||||
| @Field String _WorkingDirectoryName = 'IFXApps' | ||||
| @Field String _DDriveNet = "${_DDrive}${_NetVersion}" | ||||
| @Field String _AgentStaging = 'messa010ec-ecfisysadmin' | ||||
| @Field String _AgentProduction = 'messa010ec-ecfisysadmin' | ||||
| @Field String _CredentialsId = 'Metrology-Username-Password' | ||||
| @Field String _Company = 'Infineon Technologies Americas Corp.' | ||||
| @Field String _ProgramFilesDotnet = 'C:/program files/dotnet/dotnet.exe' | ||||
|  | ||||
| pipeline { | ||||
|     agent { | ||||
|         label env.JENKINS_ENVIRONMENT == 'Development' ? _AgentDevelopment : env.JENKINS_ENVIRONMENT == 'Staging' ? _AgentStaging : env.JENKINS_ENVIRONMENT == 'Production' ? _AgentProduction : 'Else' | ||||
|     } | ||||
|     parameters { | ||||
|         string(name: 'MONA_SUFFIX', defaultValue: env.JENKINS_ENVIRONMENT == 'Development' ? '_IFX' : '_EC', description: 'MonA Suffix') | ||||
|         string(name: 'GIT_SERVER', defaultValue: env.JENKINS_ENVIRONMENT == 'Development' ? 'mestsa003.infineon.com' : 'mestsa07ec.ec.local', description: 'git server') | ||||
|         string(name: 'DEFAULT_FILE_SERVER', defaultValue: env.JENKINS_ENVIRONMENT == 'Development' ? 'messv02ecc1_ec_local' : 'messv02ecc1.ec.local', description: 'Default file server...') | ||||
|         string(name: 'PROJECT_DIRECTORY', defaultValue: 'Archive', description: 'Archive|Viewer') | ||||
|     } | ||||
|     stages { | ||||
|         stage('Git') { | ||||
|             steps { | ||||
|                 bat(returnStatus: true, script: 'git init') | ||||
|                 bat(returnStatus: true, script: 'git remote add origin \\\\' + params.GIT_SERVER + '\\Git\\' + _GitName + '.git') | ||||
|                 bat(returnStatus: true, script: 'git pull origin master') | ||||
|             } | ||||
|         } | ||||
|         stage('Setup') { | ||||
|             steps { | ||||
|                 script { | ||||
|                     _AssemblyName = "${env.JOB_NAME}-${env.PROJECT_DIRECTORY}" | ||||
|                     _GitCommitSeven = '1234567' | ||||
|                     // _GitCommitSeven = env.GIT_COMMIT.substring(0, 7) | ||||
|                     dir(env.PROJECT_DIRECTORY) { | ||||
|                         def files = findFiles(glob: '*.csproj') | ||||
|                         if (files.length != 1) { | ||||
|                             error("Build failed because couldn't find a *.csproj file") | ||||
|                         } | ||||
|                         echo """ | ||||
|                             ${files[0].name} | ||||
|                             ${files[0].path} | ||||
|                             ${files[0].directory} | ||||
|                             ${files[0].length} | ||||
|                             ${files[0].lastModified} | ||||
|                             """ | ||||
|                         _AssemblyName = files[0].name.split('[.]csproj')[0] | ||||
|                     } | ||||
|                     _TargetLocation = "\\\\${params.DEFAULT_FILE_SERVER}\\EC_EAFRepository\\${env.JENKINS_ENVIRONMENT}\\DeploymentStorage\\Adaptation_${_AssemblyName}" | ||||
|                     withCredentials([usernamePassword(credentialsId: _CredentialsId, passwordVariable: 'password', usernameVariable: 'username')]) { | ||||
|                         dir("C:/Users/${username}/AppData/Local/IFXApps/nginx-1.20.1/conf/includes") { | ||||
|                             _NGINXFile = "C:/Users/${username}/AppData/Local/IFXApps/nginx-1.20.1/conf/includes/${_AssemblyName}.conf" | ||||
|                             def files = findFiles(glob: "${_AssemblyName}.conf") | ||||
|                             if (files.length != 1) { | ||||
|                                 writeFile(file: _NGINXFile, text: "location / { proxy_pass http://localhost:${_FirstBeforePlus}; }") | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         stage('Read NGINX') { | ||||
|             steps { | ||||
|                 script { | ||||
|                     String text = readFile(file: _NGINXFile) | ||||
|                     String check = text == null ? _FirstBeforePlus : text.split(';')[0] | ||||
|                     String[] segments = check.split(':') | ||||
|                     if (segments.length != 3) { | ||||
|                         _PortNumber = check | ||||
|                     } | ||||
|                     else { | ||||
|                         _PortNumber = (segments[2].toInteger() + 2).toString() | ||||
|                     } | ||||
|                     _ExePath = "${_DDriveNet}/${_GitCommitSeven}-${env.BUILD_NUMBER}-${_PortNumber}-${env.JOB_NAME}-${env.PROJECT_DIRECTORY}/${_AssemblyName}.exe" | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         stage('Info') { | ||||
|             steps { | ||||
|                 // echo "GIT_URL_N - ${env.GIT_URL_N}" | ||||
|                 // echo "BRANCH_NAME ${env.BRANCH_NAME}" | ||||
|                 // echo "DEPLOY_VERSION ${env.DEPLOY_VERSION}" | ||||
|                 // echo "GIT_AUTHOR_NAME ${env.GIT_AUTHOR_NAME}" | ||||
|                 // echo "GIT_LOCAL_BRANCH ${env.GIT_LOCAL_BRANCH}" | ||||
|                 // echo "GIT_COMMITTER_EMAIL ${env.GIT_COMMITTER_EMAIL}" | ||||
|                 // echo "GIT_PREVIOUS_COMMIT ${env.GIT_PREVIOUS_COMMIT}" | ||||
|                 // echo "GIT_PREVIOUS_SUCCESSFUL_COMMIT ${env.GIT_PREVIOUS_SUCCESSFUL_COMMIT}" | ||||
|                 echo "_AssemblyName ${_AssemblyName}" // ... | ||||
|                 echo "_ExePath ${_ExePath}" // ... | ||||
|                 echo "_PortNumber ${_PortNumber}" // ... | ||||
|                 echo "BUILD_NUMBER ${env.BUILD_NUMBER}" // 11 | ||||
|                 echo "DEFAULT_FILE_SERVER ${params.DEFAULT_FILE_SERVER}" // 11 | ||||
|                 echo "GIT_BRANCH ${env.GIT_BRANCH}" // origin/master | ||||
|                 echo "GIT_COMMIT ${env.GIT_COMMIT}" // 73b814069f2cf0173a62a8228815a9bc9ba93c41 | ||||
|                 echo "GIT_SERVER ${params.GIT_SERVER}" // ... | ||||
|                 echo "GIT_URL ${env.GIT_URL}" // D:\ProgramData\Git\....git | ||||
|                 echo "JENKINS_ENVIRONMENT ${env.JENKINS_ENVIRONMENT}" // 11 | ||||
|                 echo "JENKINS_URL ${env.JENKINS_URL}" // http://localhost:8080/ | ||||
|                 echo "JOB_NAME ${env.JOB_NAME}" // ... | ||||
|                 echo "PROJECT_DIRECTORY ${env.PROJECT_DIRECTORY}" // ... | ||||
|                 echo "WORKSPACE ${env.WORKSPACE}" // D:\.jenkins\_\... | ||||
|             } | ||||
|         } | ||||
|         // stage('Restore') { | ||||
|         //     steps { | ||||
|         //         bat(returnStatus: true, script: 'dotnet --info') | ||||
|         //     } | ||||
|         // } | ||||
|         stage('Safe storage of app secrets') { | ||||
|             steps { | ||||
|                 withCredentials([usernamePassword(credentialsId: _CredentialsId, passwordVariable: 'password', usernameVariable: 'username')]) { | ||||
|                     dir(env.PROJECT_DIRECTORY) { | ||||
|                         bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + | ||||
|                             'user-secrets init') | ||||
|                         bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + | ||||
|                             'user-secrets set "Company" "' + _Company + '"') | ||||
|                         bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + | ||||
|                             'user-secrets set "ServiceUser" "' + username + '"') | ||||
|                         bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + | ||||
|                             'user-secrets set "BuildNumber" "' + env.BUILD_NUMBER + '"') | ||||
|                         bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + | ||||
|                             'user-secrets set "GitCommitSeven" "' + _GitCommitSeven + '"') | ||||
|                         bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + | ||||
|                             'user-secrets set "Server" "' + params.DEFAULT_FILE_SERVER + '"') | ||||
|                         bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + | ||||
|                             'user-secrets set "URLs" "' + 'http://localhost:' + _PortNumber) | ||||
|                         bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + | ||||
|                             'user-secrets set "WorkingDirectoryName" "' + _WorkingDirectoryName + '"') | ||||
|                         bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + | ||||
|                             'user-secrets set "MonARessource" "' + _MonARessource + '_' + env.PROJECT_DIRECTORY + env.MONA_SUFFIX + '"') | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         // stage('Core Build (packagemanagement.eu.infineon.com)') { | ||||
|         //     steps { | ||||
|         //         echo "Build number is ${currentBuild.number}" | ||||
|         //         dir(env.PROJECT_DIRECTORY) { | ||||
|         //             bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + | ||||
|         //                 'build --runtime win-x64 --self-contained --verbosity quiet --source ' + | ||||
|         //                 'https://packagemanagement.eu.infineon.com:4430/api/v2/') | ||||
|         //         } | ||||
|         //     } | ||||
|         // } | ||||
|         stage('Core Build') { | ||||
|             steps { | ||||
|                 echo "Build number is ${currentBuild.number}" | ||||
|                 dir(env.PROJECT_DIRECTORY) { | ||||
|                     bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + | ||||
|                         'build --runtime win-x64 --self-contained --verbosity quiet') | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         stage('Commit Id') { | ||||
|             steps { | ||||
|                 dir(env.PROJECT_DIRECTORY) { | ||||
|                     writeFile(file: 'bin/Debug/' + _NetVersion + "/win-x64/${env.GIT_COMMIT}-${env.BUILD_NUMBER}.txt", text: "${env.GIT_URL}") | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         // stage('Test') { | ||||
|         //     options { | ||||
|         //         timeout(time: 10, unit: 'MINUTES') | ||||
|         //     } | ||||
|         //     steps { | ||||
|         //         dir(env.PROJECT_DIRECTORY) { | ||||
|         //             bat('dotnet --info') | ||||
|         //         } | ||||
|         //     } | ||||
|         // } | ||||
|         // stage('Version') { | ||||
|         //     steps { | ||||
|         //         bat('dotnet --info') | ||||
|         //     } | ||||
|         // } | ||||
|         stage('Package') { | ||||
|             steps { | ||||
|                 dir(env.PROJECT_DIRECTORY) { | ||||
|                     fileOperations([fileZipOperation(folderPath: 'bin/Debug/' + _NetVersion + '/win-x64', outputFolderPath: "${_DDriveNet}/${_GitCommitSeven}-${env.BUILD_NUMBER}-${_PortNumber}-${env.JOB_NAME}-${env.PROJECT_DIRECTORY}-Debug")]) | ||||
|                     fileOperations([fileCopyOperation(excludes: '', flattenFiles: true, includes: "${_AssemblyName}*", renameFiles: false, sourceCaptureExpression: '', targetLocation: "${_DDriveNet}/${_GitCommitSeven}-${env.BUILD_NUMBER}-${_PortNumber}-${env.JOB_NAME}-${env.PROJECT_DIRECTORY}-Debug", targetNameExpression: '')]) | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         stage('Publish') { | ||||
|             steps { | ||||
|                 dir(env.PROJECT_DIRECTORY) { | ||||
|                     bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + | ||||
|                         'publish --configuration Release --runtime win-x64 --verbosity quiet ' + | ||||
|                         "--self-contained true --p:Version=6.0.202-${_GitCommitSeven}-${env.BUILD_NUMBER} -o " + | ||||
|                         '"' + "${_DDriveNet}/${_GitCommitSeven}-${env.BUILD_NUMBER}-${_PortNumber}-${env.JOB_NAME}-${env.PROJECT_DIRECTORY}" + '"') | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         stage('Service') { | ||||
|             steps { | ||||
|                 withCredentials([usernamePassword(credentialsId: _CredentialsId, passwordVariable: 'password', usernameVariable: 'username')]) { | ||||
|                     bat(returnStatus: true, script: 'sc create "' + "${env.JOB_NAME}-${env.PROJECT_DIRECTORY}-${_PortNumber}" + '" ' + | ||||
|                         'start= delayed-auto DisplayName="' + "${env.JOB_NAME}-${env.PROJECT_DIRECTORY}-${_PortNumber}" + '" ' + | ||||
|                         'binPath= "' + _ExePath + '" ' + | ||||
|                         'obj= "' + "${env.USERDOMAIN}\\${username}" + '" password= "' + password + '"') | ||||
|                     bat(returnStatus: true, script: 'sc start "' + "${env.JOB_NAME}-${env.PROJECT_DIRECTORY}-${_PortNumber}" + '"') | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         stage('Upadate NGINX') { | ||||
|             steps { | ||||
|                 writeFile(file: _NGINXFile, text: "location / { proxy_pass http://localhost:${_PortNumber}; }") | ||||
|             } | ||||
|         } | ||||
|         stage('NGINX Test and Reload') { | ||||
|             steps { | ||||
|                 withCredentials([usernamePassword(credentialsId: _CredentialsId, passwordVariable: 'password', usernameVariable: 'username')]) { | ||||
|                     dir("C:/Users/${username}/AppData/Local/IFXApps/nginx-1.20.1") { | ||||
|                         script { | ||||
|                             int returnStatus = bat(returnStatus: true, script: 'nginx.exe -t') | ||||
|                             println("returnStatus ################ ${returnStatus} ####################") | ||||
|                             if (returnStatus == 0) { | ||||
|                                 bat(returnStatus: true, script: 'nginx.exe -s reload') | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         // stage('Force Fail') { | ||||
|         //     steps { | ||||
|         //         error("Build failed because of this and that..") | ||||
|         //     } | ||||
|         // } | ||||
|         // stage('Copy Files to: file-share') { | ||||
|         //     steps { | ||||
|         //         dir(env.PROJECT_DIRECTORY + '/bin/Debug/' + _NetVersion + '/win-x64') { | ||||
|         //             fileOperations([fileCopyOperation(excludes: '', flattenFiles: true, includes: "${_AssemblyName}*.txt", renameFiles: false, sourceCaptureExpression: '', targetLocation: _TargetLocation, targetNameExpression: '')]) | ||||
|         //             fileOperations([fileCopyOperation(excludes: '', flattenFiles: true, includes: "${_AssemblyName}*.dll", renameFiles: false, sourceCaptureExpression: '', targetLocation: _TargetLocation, targetNameExpression: '')]) | ||||
|         //             fileOperations([fileCopyOperation(excludes: '', flattenFiles: true, includes: "${_AssemblyName}*.exe", renameFiles: false, sourceCaptureExpression: '', targetLocation: _TargetLocation, targetNameExpression: '')]) | ||||
|         //             fileOperations([fileCopyOperation(excludes: '', flattenFiles: true, includes: "${_AssemblyName}*.pdb", renameFiles: false, sourceCaptureExpression: '', targetLocation: _TargetLocation, targetNameExpression: '')]) | ||||
|         //         } | ||||
|         //     } | ||||
|         // } | ||||
|     } | ||||
|     post { | ||||
|         always { | ||||
|             dir(env.PROJECT_DIRECTORY + '/bin') { | ||||
|                 deleteDir() | ||||
|             } | ||||
|             dir(env.PROJECT_DIRECTORY + '/obj') { | ||||
|                 deleteDir() | ||||
|             } | ||||
|             // cleanWs() | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										53
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
								
							
							
						
						| @ -5,27 +5,68 @@ | ||||
|             // Use IntelliSense to find out which attributes exist for C# debugging | ||||
|             // Use hover for the description of the existing attributes | ||||
|             // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md | ||||
|             "name": ".NET Core Launch (web)", | ||||
|             "name": ".NET Core Launch (web) - Server", | ||||
|             "type": "coreclr", | ||||
|             "request": "launch", | ||||
|             "preLaunchTask": "build", | ||||
|             "preLaunchTask": "buildServer", | ||||
|             // If you have changed target frameworks, make sure to update the program path. | ||||
|             "program": "${workspaceFolder}/Archive/bin/Debug/net6.0/win-x64/Archive.dll", | ||||
|             "program": "${workspaceFolder}/Server/bin/Debug/net7.0/win-x64/OI.Metrology.Server.dll", | ||||
|             "args": [], | ||||
|             "cwd": "${workspaceFolder}", | ||||
|             "cwd": "${workspaceFolder}/Server", | ||||
|             "stopAtEntry": false, | ||||
|             // Enable launching a web browser when ASP.NET Core starts. For more information: https://aka.ms/VSCode-CS-LaunchJson-WebBrowser | ||||
|             "serverReadyAction": { | ||||
|                 "action": "openExternally", | ||||
|                 "pattern": "\\bNow listening on:\\s+(https?://\\S+)" | ||||
|                 "pattern": "\\bNow listening on:\\s+(https?://\\S+)", | ||||
|                 "uriFormat": "%s/swagger/index.html" | ||||
|             }, | ||||
|             "env": { | ||||
|                 "ASPNETCORE_ENVIRONMENT": "Development" | ||||
|             }, | ||||
|             "sourceFileMap": { | ||||
|                 "/Views": "${workspaceFolder}/Archive/Views" | ||||
|                 "/Views": "${workspaceFolder}/Server/Views" | ||||
|             } | ||||
|         }, | ||||
|         { | ||||
|             "name": ".NET Core Attach - Server", | ||||
|             "type": "coreclr", | ||||
|             "request": "attach", | ||||
|             "preLaunchTask": "watchServer", | ||||
|             "processName": "OI.Metrology.Server.exe" | ||||
|         }, | ||||
|         { | ||||
|             // Use IntelliSense to find out which attributes exist for C# debugging | ||||
|             // Use hover for the description of the existing attributes | ||||
|             // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md | ||||
|             "name": ".NET Core Launch (web) - ClientHub", | ||||
|             "type": "coreclr", | ||||
|             "request": "launch", | ||||
|             "preLaunchTask": "buildClientHub", | ||||
|             // If you have changed target frameworks, make sure to update the program path. | ||||
|             "program": "${workspaceFolder}/ClientHub/bin/Debug/net7.0/win-x64/OI.Metrology.ClientHub.dll", | ||||
|             "args": [], | ||||
|             "cwd": "${workspaceFolder}/ClientHub", | ||||
|             "stopAtEntry": false, | ||||
|             // Enable launching a web browser when ASP.NET Core starts. For more information: https://aka.ms/VSCode-CS-LaunchJson-WebBrowser | ||||
|             "serverReadyAction": { | ||||
|                 "action": "openExternally", | ||||
|                 "pattern": "\\bNow listening on:\\s+(https?://\\S+)", | ||||
|                 "uriFormat": "%s/swagger/index.html" | ||||
|             }, | ||||
|             "env": { | ||||
|                 "ASPNETCORE_ENVIRONMENT": "Development" | ||||
|             }, | ||||
|             "sourceFileMap": { | ||||
|                 "/Views": "${workspaceFolder}/ClientHub/Views" | ||||
|             } | ||||
|         }, | ||||
|         { | ||||
|             "name": ".NET Core Attach - ClientHub", | ||||
|             "type": "coreclr", | ||||
|             "request": "attach", | ||||
|             "preLaunchTask": "watchClientHub", | ||||
|             "processName": "OI.Metrology.ClientHub.exe" | ||||
|         }, | ||||
|         { | ||||
|             "name": ".NET Core Attach", | ||||
|             "type": "coreclr", | ||||
|  | ||||
							
								
								
									
										104
									
								
								.vscode/tasks.json
									
									
									
									
										vendored
									
									
								
							
							
						
						| @ -2,40 +2,132 @@ | ||||
|     "version": "2.0.0", | ||||
|     "tasks": [ | ||||
|         { | ||||
|             "label": "build", | ||||
|             "label": "buildServer", | ||||
|             "command": "dotnet", | ||||
|             "type": "process", | ||||
|             "args": [ | ||||
|                 "build", | ||||
|                 "${workspaceFolder}/Archive/Archive.csproj", | ||||
|                 "${workspaceFolder}/Server/OI.Metrology.Server.csproj", | ||||
|                 "/property:GenerateFullPaths=true", | ||||
|                 "/consoleloggerparameters:NoSummary" | ||||
|             ], | ||||
|             "problemMatcher": "$msCompile" | ||||
|         }, | ||||
|         { | ||||
|             "label": "publish", | ||||
|             "label": "publishServer", | ||||
|             "command": "dotnet", | ||||
|             "type": "process", | ||||
|             "args": [ | ||||
|                 "publish", | ||||
|                 "${workspaceFolder}/Archive/Archive.csproj", | ||||
|                 "${workspaceFolder}/Server/OI.Metrology.Server.csproj", | ||||
|                 "/property:GenerateFullPaths=true", | ||||
|                 "/consoleloggerparameters:NoSummary" | ||||
|             ], | ||||
|             "problemMatcher": "$msCompile" | ||||
|         }, | ||||
|         { | ||||
|             "label": "watch", | ||||
|             "label": "old-watch", | ||||
|             "command": "dotnet", | ||||
|             "type": "process", | ||||
|             "args": [ | ||||
|                 "watch", | ||||
|                 "run", | ||||
|                 "--project", | ||||
|                 "${workspaceFolder}/Archive/Archive.csproj" | ||||
|                 "${workspaceFolder}/Server/OI.Metrology.Server.csproj" | ||||
|             ], | ||||
|             "problemMatcher": "$msCompile" | ||||
|         }, | ||||
|         { | ||||
|             "label": "watchServer", | ||||
|             "command": "dotnet", | ||||
|             "type": "process", | ||||
|             "args": [ | ||||
|                 "watch", | ||||
|                 "--launch-profile", | ||||
|                 "http", | ||||
|                 "run", | ||||
|                 "--project", | ||||
|                 "${workspaceFolder}/Server/OI.Metrology.Server.csproj", | ||||
|                 "--verbose" | ||||
|             ], | ||||
|             "isBackground": true, | ||||
|             "dependsOn": [ | ||||
|                 "build" | ||||
|             ], | ||||
|             "problemMatcher": { | ||||
|                 "fileLocation": "relative", | ||||
|                 "pattern": { | ||||
|                     "regexp": "^([^\\s].*)\\((\\d+|\\d+,\\d+|\\d+,\\d+,\\d+,\\d+)\\):\\s+(error|warning|info)\\s+(TS\\d+)\\s*:\\s*(.*)$", | ||||
|                     "file": 1, | ||||
|                     "location": 2, | ||||
|                     "severity": 3, | ||||
|                     "code": 4, | ||||
|                     "message": 5 | ||||
|                 }, | ||||
|                 "background": { | ||||
|                     "activeOnStart": true, | ||||
|                     "beginsPattern": "^.*Shutdown requested.*", | ||||
|                     "endsPattern": "^.*Application started.*" | ||||
|                 } | ||||
|             } | ||||
|         }, | ||||
|         { | ||||
|             "label": "buildClientHub", | ||||
|             "command": "dotnet", | ||||
|             "type": "process", | ||||
|             "args": [ | ||||
|                 "build", | ||||
|                 "${workspaceFolder}/ClientHub/OI.Metrology.ClientHub.csproj", | ||||
|                 "/property:GenerateFullPaths=true", | ||||
|                 "/consoleloggerparameters:NoSummary" | ||||
|             ], | ||||
|             "problemMatcher": "$msCompile" | ||||
|         }, | ||||
|         { | ||||
|             "label": "publishClientHub", | ||||
|             "command": "dotnet", | ||||
|             "type": "process", | ||||
|             "args": [ | ||||
|                 "publish", | ||||
|                 "${workspaceFolder}/ClientHub/OI.Metrology.ClientHub.csproj", | ||||
|                 "/property:GenerateFullPaths=true", | ||||
|                 "/consoleloggerparameters:NoSummary" | ||||
|             ], | ||||
|             "problemMatcher": "$msCompile" | ||||
|         }, | ||||
|         { | ||||
|             "label": "watchClientHub", | ||||
|             "command": "dotnet", | ||||
|             "type": "process", | ||||
|             "args": [ | ||||
|                 "watch", | ||||
|                 "--launch-profile", | ||||
|                 "http", | ||||
|                 "run", | ||||
|                 "--project", | ||||
|                 "${workspaceFolder}/ClientHub/OI.Metrology.ClientHub.csproj", | ||||
|                 "--verbose" | ||||
|             ], | ||||
|             "isBackground": true, | ||||
|             "dependsOn": [ | ||||
|                 "build" | ||||
|             ], | ||||
|             "problemMatcher": { | ||||
|                 "fileLocation": "relative", | ||||
|                 "pattern": { | ||||
|                     "regexp": "^([^\\s].*)\\((\\d+|\\d+,\\d+|\\d+,\\d+,\\d+,\\d+)\\):\\s+(error|warning|info)\\s+(TS\\d+)\\s*:\\s*(.*)$", | ||||
|                     "file": 1, | ||||
|                     "location": 2, | ||||
|                     "severity": 3, | ||||
|                     "code": 4, | ||||
|                     "message": 5 | ||||
|                 }, | ||||
|                 "background": { | ||||
|                     "activeOnStart": true, | ||||
|                     "beginsPattern": "^.*Shutdown requested.*", | ||||
|                     "endsPattern": "^.*Application started.*" | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     ] | ||||
| } | ||||
							
								
								
									
										243
									
								
								Archive/.editorconfig
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,243 @@ | ||||
| [*.cs] | ||||
| 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 | ||||
| csharp_new_line_before_catch = true | ||||
| csharp_new_line_before_else = true | ||||
| csharp_new_line_before_finally = true | ||||
| csharp_new_line_before_members_in_anonymous_types = true | ||||
| csharp_new_line_before_members_in_object_initializers = true | ||||
| csharp_new_line_before_open_brace = all | ||||
| csharp_new_line_between_query_expression_clauses = true | ||||
| csharp_prefer_braces = false | ||||
| csharp_prefer_simple_default_expression = true:warning | ||||
| csharp_prefer_simple_using_statement = true:warning | ||||
| csharp_prefer_static_local_function = true:warning | ||||
| csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async | ||||
| csharp_preserve_single_line_blocks = true | ||||
| csharp_preserve_single_line_statements = false | ||||
| 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 | ||||
| csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true | ||||
| csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true | ||||
| csharp_style_allow_embedded_statements_on_same_line_experimental = true | ||||
| csharp_style_conditional_delegate_call = true | ||||
| csharp_style_deconstructed_variable_declaration = false | ||||
| csharp_style_expression_bodied_accessors = when_on_single_line:warning | ||||
| csharp_style_expression_bodied_constructors = when_on_single_line:warning | ||||
| csharp_style_expression_bodied_indexers = when_on_single_line:warning | ||||
| csharp_style_expression_bodied_lambdas = when_on_single_line:warning | ||||
| csharp_style_expression_bodied_local_functions = when_on_single_line:warning | ||||
| csharp_style_expression_bodied_methods = when_on_single_line:warning | ||||
| csharp_style_expression_bodied_operators = when_on_single_line:warning | ||||
| csharp_style_expression_bodied_properties = when_on_single_line:warning | ||||
| csharp_style_implicit_object_creation_when_type_is_apparent = true:warning | ||||
| csharp_style_inlined_variable_declaration = false | ||||
| csharp_style_namespace_declarations = file_scoped:warning | ||||
| csharp_style_pattern_local_over_anonymous_function = true:warning | ||||
| csharp_style_pattern_matching_over_as_with_null_check = true:warning | ||||
| csharp_style_pattern_matching_over_is_with_cast_check = true:warning | ||||
| csharp_style_prefer_index_operator = false:warning | ||||
| csharp_style_prefer_not_pattern = true:warning | ||||
| csharp_style_prefer_null_check_over_type_check = true | ||||
| csharp_style_prefer_pattern_matching = true:warning | ||||
| csharp_style_prefer_range_operator = false:warning | ||||
| csharp_style_prefer_switch_expression = true:warning | ||||
| csharp_style_throw_expression = true | ||||
| csharp_style_unused_value_assignment_preference = discard_variable:warning | ||||
| csharp_style_unused_value_expression_statement_preference = discard_variable:warning | ||||
| csharp_style_var_elsewhere = false:warning | ||||
| csharp_style_var_for_built_in_types = false:warning | ||||
| csharp_style_var_when_type_is_apparent = false:warning | ||||
| csharp_using_directive_placement = outside_namespace | ||||
| dotnet_code_quality_unused_parameters = all | ||||
| dotnet_code_quality_unused_parameters = non_public # IDE0060: Remove unused parameter | ||||
| dotnet_code_quality.CAXXXX.api_surface = private, internal | ||||
| dotnet_diagnostic.CA1825.severity = warning # CA1823: Avoid zero-length array allocations | ||||
| dotnet_diagnostic.CA1829.severity = warning # CA1829: Use Length/Count property instead of Count() when available | ||||
| dotnet_diagnostic.CA1834.severity = warning # CA1834: Consider using 'StringBuilder.Append(char)' when applicable | ||||
| dotnet_diagnostic.IDE0001.severity = warning # IDE0001: Simplify name | ||||
| dotnet_diagnostic.IDE0002.severity = warning # Simplify (member access) - System.Version.Equals("1", "2"); Version.Equals("1", "2"); | ||||
| dotnet_diagnostic.IDE0005.severity = warning # Using directive is unnecessary | ||||
| dotnet_diagnostic.IDE0047.severity = warning # IDE0047: Parentheses can be removed | ||||
| dotnet_diagnostic.IDE0060.severity = warning # IDE0060: Remove unused parameter | ||||
| dotnet_naming_rule.abstract_method_should_be_pascal_case.severity = warning | ||||
| dotnet_naming_rule.abstract_method_should_be_pascal_case.style = pascal_case | ||||
| dotnet_naming_rule.abstract_method_should_be_pascal_case.symbols = abstract_method | ||||
| dotnet_naming_rule.class_should_be_pascal_case.severity = warning | ||||
| dotnet_naming_rule.class_should_be_pascal_case.style = pascal_case | ||||
| dotnet_naming_rule.class_should_be_pascal_case.symbols = class | ||||
| dotnet_naming_rule.delegate_should_be_pascal_case.severity = warning | ||||
| dotnet_naming_rule.delegate_should_be_pascal_case.style = pascal_case | ||||
| dotnet_naming_rule.delegate_should_be_pascal_case.symbols = delegate | ||||
| dotnet_naming_rule.enum_should_be_pascal_case.severity = warning | ||||
| dotnet_naming_rule.enum_should_be_pascal_case.style = pascal_case | ||||
| dotnet_naming_rule.enum_should_be_pascal_case.symbols = enum | ||||
| dotnet_naming_rule.event_should_be_pascal_case.severity = warning | ||||
| dotnet_naming_rule.event_should_be_pascal_case.style = pascal_case | ||||
| dotnet_naming_rule.event_should_be_pascal_case.symbols = event | ||||
| dotnet_naming_rule.interface_should_be_begins_with_i.severity = warning | ||||
| dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i | ||||
| dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface | ||||
| dotnet_naming_rule.method_should_be_pascal_case.severity = warning | ||||
| dotnet_naming_rule.method_should_be_pascal_case.style = pascal_case | ||||
| dotnet_naming_rule.method_should_be_pascal_case.symbols = method | ||||
| dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = warning | ||||
| dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case | ||||
| dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members | ||||
| dotnet_naming_rule.private_method_should_be_pascal_case.severity = warning | ||||
| dotnet_naming_rule.private_method_should_be_pascal_case.style = pascal_case | ||||
| dotnet_naming_rule.private_method_should_be_pascal_case.symbols = private_method | ||||
| dotnet_naming_rule.private_or_internal_field_should_be_private_of_internal_field.severity = warning | ||||
| dotnet_naming_rule.private_or_internal_field_should_be_private_of_internal_field.style = private_of_internal_field | ||||
| dotnet_naming_rule.private_or_internal_field_should_be_private_of_internal_field.symbols = private_or_internal_field | ||||
| dotnet_naming_rule.private_or_internal_static_field_should_be_private_of_internal_field.severity = warning | ||||
| dotnet_naming_rule.private_or_internal_static_field_should_be_private_of_internal_field.style = private_of_internal_field | ||||
| dotnet_naming_rule.private_or_internal_static_field_should_be_private_of_internal_field.symbols = private_or_internal_static_field | ||||
| dotnet_naming_rule.property_should_be_pascal_case.severity = warning | ||||
| dotnet_naming_rule.property_should_be_pascal_case.style = pascal_case | ||||
| dotnet_naming_rule.property_should_be_pascal_case.symbols = property | ||||
| dotnet_naming_rule.public_or_protected_field_should_be_private_of_internal_field.severity = warning | ||||
| dotnet_naming_rule.public_or_protected_field_should_be_private_of_internal_field.style = private_of_internal_field | ||||
| dotnet_naming_rule.public_or_protected_field_should_be_private_of_internal_field.symbols = public_or_protected_field | ||||
| dotnet_naming_rule.static_field_should_be_pascal_case.severity = warning | ||||
| dotnet_naming_rule.static_field_should_be_pascal_case.style = pascal_case | ||||
| dotnet_naming_rule.static_field_should_be_pascal_case.symbols = static_field | ||||
| dotnet_naming_rule.static_method_should_be_pascal_case.severity = warning | ||||
| dotnet_naming_rule.static_method_should_be_pascal_case.style = pascal_case | ||||
| dotnet_naming_rule.static_method_should_be_pascal_case.symbols = static_method | ||||
| dotnet_naming_rule.struct_should_be_pascal_case.severity = warning | ||||
| dotnet_naming_rule.struct_should_be_pascal_case.style = pascal_case | ||||
| dotnet_naming_rule.struct_should_be_pascal_case.symbols = struct | ||||
| dotnet_naming_rule.types_should_be_pascal_case.severity = warning | ||||
| dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case | ||||
| dotnet_naming_rule.types_should_be_pascal_case.symbols = types | ||||
| dotnet_naming_style.begins_with_i.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.pascal_case.capitalization = pascal_case | ||||
| dotnet_naming_style.pascal_case.required_prefix =  | ||||
| dotnet_naming_style.pascal_case.required_suffix =  | ||||
| dotnet_naming_style.pascal_case.word_separator =  | ||||
| dotnet_naming_style.private_of_internal_field.capitalization = pascal_case | ||||
| dotnet_naming_style.private_of_internal_field.required_prefix = _ | ||||
| dotnet_naming_style.private_of_internal_field.required_suffix =  | ||||
| dotnet_naming_style.private_of_internal_field.word_separator =  | ||||
| dotnet_naming_symbols.abstract_method.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected | ||||
| dotnet_naming_symbols.abstract_method.applicable_kinds = method | ||||
| dotnet_naming_symbols.abstract_method.required_modifiers = abstract | ||||
| dotnet_naming_symbols.class.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected | ||||
| dotnet_naming_symbols.class.applicable_kinds = class | ||||
| dotnet_naming_symbols.class.required_modifiers =  | ||||
| dotnet_naming_symbols.delegate.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected | ||||
| dotnet_naming_symbols.delegate.applicable_kinds = delegate | ||||
| dotnet_naming_symbols.delegate.required_modifiers =  | ||||
| dotnet_naming_symbols.enum.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected | ||||
| dotnet_naming_symbols.enum.applicable_kinds = enum | ||||
| dotnet_naming_symbols.enum.required_modifiers =  | ||||
| dotnet_naming_symbols.event.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected | ||||
| dotnet_naming_symbols.event.applicable_kinds = event | ||||
| dotnet_naming_symbols.event.required_modifiers =  | ||||
| dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected | ||||
| dotnet_naming_symbols.interface.applicable_kinds = interface | ||||
| dotnet_naming_symbols.interface.required_modifiers =  | ||||
| dotnet_naming_symbols.method.applicable_accessibilities = public | ||||
| dotnet_naming_symbols.method.applicable_kinds = method | ||||
| dotnet_naming_symbols.method.required_modifiers =  | ||||
| dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected | ||||
| dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method | ||||
| dotnet_naming_symbols.non_field_members.required_modifiers =  | ||||
| dotnet_naming_symbols.private_method.applicable_accessibilities = private | ||||
| dotnet_naming_symbols.private_method.applicable_kinds = method | ||||
| dotnet_naming_symbols.private_method.required_modifiers =  | ||||
| dotnet_naming_symbols.private_or_internal_field.applicable_accessibilities = internal, private, private_protected | ||||
| dotnet_naming_symbols.private_or_internal_field.applicable_kinds = field | ||||
| dotnet_naming_symbols.private_or_internal_field.required_modifiers =  | ||||
| dotnet_naming_symbols.private_or_internal_static_field.applicable_accessibilities = internal, private, private_protected | ||||
| dotnet_naming_symbols.private_or_internal_static_field.applicable_kinds = field | ||||
| dotnet_naming_symbols.private_or_internal_static_field.required_modifiers = static | ||||
| dotnet_naming_symbols.property.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected | ||||
| dotnet_naming_symbols.property.applicable_kinds = property | ||||
| dotnet_naming_symbols.property.required_modifiers =  | ||||
| dotnet_naming_symbols.public_or_protected_field.applicable_accessibilities = public, protected | ||||
| dotnet_naming_symbols.public_or_protected_field.applicable_kinds = field | ||||
| dotnet_naming_symbols.public_or_protected_field.required_modifiers =  | ||||
| dotnet_naming_symbols.static_field.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected | ||||
| dotnet_naming_symbols.static_field.applicable_kinds = field | ||||
| dotnet_naming_symbols.static_field.required_modifiers = static | ||||
| dotnet_naming_symbols.static_method.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected | ||||
| dotnet_naming_symbols.static_method.applicable_kinds = method | ||||
| dotnet_naming_symbols.static_method.required_modifiers = static | ||||
| dotnet_naming_symbols.struct.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected | ||||
| dotnet_naming_symbols.struct.applicable_kinds = struct | ||||
| dotnet_naming_symbols.struct.required_modifiers =  | ||||
| dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected | ||||
| dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum | ||||
| dotnet_naming_symbols.types.required_modifiers =  | ||||
| dotnet_remove_unnecessary_suppression_exclusions = 0 | ||||
| dotnet_separate_import_directive_groups = false | ||||
| dotnet_sort_system_directives_first = false | ||||
| dotnet_style_allow_multiple_blank_lines_experimental = false:warning | ||||
| dotnet_style_allow_statement_immediately_after_block_experimental = true | ||||
| dotnet_style_coalesce_expression = true | ||||
| dotnet_style_collection_initializer = true:warning | ||||
| dotnet_style_explicit_tuple_names = true:warning | ||||
| dotnet_style_namespace_match_folder = true | ||||
| dotnet_style_null_propagation = true:warning | ||||
| dotnet_style_object_initializer = true:warning | ||||
| dotnet_style_operator_placement_when_wrapping = beginning_of_line | ||||
| dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity | ||||
| dotnet_style_parentheses_in_other_binary_operators = always_for_clarity | ||||
| dotnet_style_parentheses_in_other_operators = never_if_unnecessary | ||||
| dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity | ||||
| dotnet_style_predefined_type_for_locals_parameters_members = true | ||||
| dotnet_style_predefined_type_for_member_access = true | ||||
| dotnet_style_prefer_auto_properties = true:warning | ||||
| dotnet_style_prefer_compound_assignment = true:warning | ||||
| dotnet_style_prefer_conditional_expression_over_assignment = false | ||||
| dotnet_style_prefer_conditional_expression_over_return = false | ||||
| dotnet_style_prefer_inferred_anonymous_type_member_names = true:warning | ||||
| dotnet_style_prefer_inferred_tuple_names = true:warning | ||||
| dotnet_style_prefer_is_null_check_over_reference_equality_method = true:warning | ||||
| dotnet_style_prefer_simplified_boolean_expressions = true:warning | ||||
| dotnet_style_prefer_simplified_interpolation = true | ||||
| dotnet_style_qualification_for_event = false:error | ||||
| dotnet_style_qualification_for_field = false | ||||
| dotnet_style_qualification_for_method = false:error | ||||
| dotnet_style_qualification_for_property = false:error | ||||
| dotnet_style_readonly_field = true:warning | ||||
| dotnet_style_require_accessibility_modifiers = for_non_interface_members | ||||
| end_of_line = crlf | ||||
| file_header_template = unset | ||||
| indent_size = 4 | ||||
| indent_style = space | ||||
| insert_final_newline = false | ||||
| root = true | ||||
| tab_width = 4 | ||||
| # https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1822 | ||||
| # https://github.com/dotnet/aspnetcore/blob/main/.editorconfig | ||||
| # https://github.com/dotnet/project-system/blob/main/.editorconfig | ||||
| @ -1,6 +1,6 @@ | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
| using OI.Metrology.Shared.DataModels; | ||||
| using OI.Metrology.Shared.Repositories; | ||||
| using OI.Metrology.Shared.Models.Stateless; | ||||
| using OI.Metrology.Shared.Services; | ||||
| using System; | ||||
| using System.IO; | ||||
| @ -8,13 +8,13 @@ using System.IO; | ||||
| namespace OI.Metrology.Archive.ApiControllers; | ||||
| public class AttachmentsController : Controller | ||||
| { | ||||
|     private readonly IMetrologyRepo _Repo; | ||||
|     private readonly IAttachmentsService _AttachmentsService; | ||||
|     private readonly IMetrologyRepository _MetrologyRepository; | ||||
|  | ||||
|     public AttachmentsController(IMetrologyRepo repo, IAttachmentsService attachmentsService) | ||||
|     public AttachmentsController(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService) | ||||
|     { | ||||
|         _Repo = repo; | ||||
|         _AttachmentsService = attachmentsService; | ||||
|         _MetrologyRepository = metrologyRepository; | ||||
|     } | ||||
|  | ||||
|     // this endpoint was created in hope that it would make retrieving attachments to display in OpenInsight easier | ||||
| @ -27,7 +27,7 @@ public class AttachmentsController : Controller | ||||
|         string title, | ||||
|         string filename) | ||||
|     { | ||||
|         ToolType tt = _Repo.GetToolTypeByName(toolTypeName); | ||||
|         ToolType tt = _MetrologyRepository.GetToolTypeByName(toolTypeName); | ||||
|  | ||||
|         bool header = !string.Equals(tabletype.Trim(), "data", StringComparison.OrdinalIgnoreCase); | ||||
|  | ||||
|  | ||||
| @ -1,17 +1,17 @@ | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
|  | ||||
| namespace OI.Metrology.Archive.ApiContollers; | ||||
| namespace OI.Metrology.Archive.ApiControllers; | ||||
|  | ||||
| using OI.Metrology.Shared.Repositories; | ||||
| using OI.Metrology.Shared.Models.Stateless; | ||||
| using System.Text.Json; | ||||
|  | ||||
| // this controller is for the Awaiting Dispo functionality | ||||
|  | ||||
| public class AwaitingDispoController : Controller | ||||
| { | ||||
|     private readonly IMetrologyRepo _Repo; | ||||
|     private readonly IMetrologyRepository _MetrologyRepository; | ||||
|  | ||||
|     public AwaitingDispoController(IMetrologyRepo repo) => _Repo = repo; | ||||
|     public AwaitingDispoController(IMetrologyRepository metrologyRepository) => _MetrologyRepository = metrologyRepository; | ||||
|  | ||||
|     // returns the data to show in the Awaiting Dispo grid | ||||
|     // marked no-cache, just-in-case since igniteUI automatically adds a query string parameter to prevent caching | ||||
| @ -21,7 +21,7 @@ public class AwaitingDispoController : Controller | ||||
|     { | ||||
|         var r = new | ||||
|         { | ||||
|             Results = _Repo.GetAwaitingDispo() | ||||
|             Results = _MetrologyRepository.GetAwaitingDisposition() | ||||
|         }; | ||||
|         return Json(r, new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true }); | ||||
|     } | ||||
| @ -30,7 +30,7 @@ public class AwaitingDispoController : Controller | ||||
|     [HttpPost("/api/awaitingdispo/markasreviewed")] | ||||
|     public IActionResult MarkAsReviewed([FromQuery] long headerid, [FromQuery] int tooltypeid) | ||||
|     { | ||||
|         _ = _Repo.UpdateReviewDate(tooltypeid, headerid, false); | ||||
|         _ = _MetrologyRepository.UpdateReviewDate(tooltypeid, headerid, false); | ||||
|         return Ok(); | ||||
|     } | ||||
|  | ||||
| @ -38,7 +38,7 @@ public class AwaitingDispoController : Controller | ||||
|     [HttpPost("/api/awaitingdispo/markasawaiting")] | ||||
|     public IActionResult MarkAsAwaiting([FromQuery] long headerid, [FromQuery] int tooltypeid) | ||||
|     { | ||||
|         if (_Repo.UpdateReviewDate(tooltypeid, headerid, true) <= 1) | ||||
|         if (_MetrologyRepository.UpdateReviewDate(tooltypeid, headerid, true) <= 1) | ||||
|             return Ok(); | ||||
|         else | ||||
|             return StatusCode(444); | ||||
|  | ||||
| @ -4,30 +4,30 @@ using Microsoft.Extensions.Logging; | ||||
| using Newtonsoft.Json.Linq; | ||||
| using OI.Metrology.Archive.Models; | ||||
| using OI.Metrology.Shared.DataModels; | ||||
| using OI.Metrology.Shared.Repositories; | ||||
| using OI.Metrology.Shared.Models.Stateless; | ||||
| using OI.Metrology.Shared.Services; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
|  | ||||
| namespace OI.Metrology.Archive.ApiContollers; | ||||
| namespace OI.Metrology.Archive.ApiControllers; | ||||
|  | ||||
| [ApiController] | ||||
| public class InboundController : ControllerBase | ||||
| { | ||||
|     private readonly ILogger _Logger; | ||||
|     private readonly IMetrologyRepo _Repo; | ||||
|     private readonly AppSettings _AppSettings; | ||||
|     private readonly IAttachmentsService _AttachmentService; | ||||
|     private readonly IInboundDataService _InboundDataService; | ||||
|     private readonly IMetrologyRepository _MetrologyRepository; | ||||
|  | ||||
|     public InboundController(AppSettings appSettings, ILogger<InboundController> logger, IMetrologyRepo repo, IInboundDataService inboundDataService, IAttachmentsService attachmentService) | ||||
|     public InboundController(AppSettings appSettings, ILogger<InboundController> logger, IMetrologyRepository metrologyRepository, IInboundDataService inboundDataService, IAttachmentsService attachmentService) | ||||
|     { | ||||
|         _Repo = repo; | ||||
|         _Logger = logger; | ||||
|         _AppSettings = appSettings; | ||||
|         _AttachmentService = attachmentService; | ||||
|         _InboundDataService = inboundDataService; | ||||
|         _MetrologyRepository = metrologyRepository; | ||||
|     } | ||||
|  | ||||
|     // this class represents the API response back to the client | ||||
| @ -61,9 +61,9 @@ public class InboundController : ControllerBase | ||||
|             return Unauthorized(r); | ||||
|         } | ||||
|  | ||||
|         ToolType toolType = _Repo.GetToolTypeByName(tooltype); | ||||
|         ToolType toolType = _MetrologyRepository.GetToolTypeByName(tooltype); | ||||
|  | ||||
|         if (toolType == null) | ||||
|         if (toolType is null) | ||||
|         { | ||||
|             r.Errors.Add("Invalid tool type: " + tooltype); | ||||
|             return BadRequest(r); | ||||
| @ -71,9 +71,9 @@ public class InboundController : ControllerBase | ||||
|  | ||||
|         // get metadata | ||||
|  | ||||
|         List<ToolTypeMetadata> metaData = _Repo.GetToolTypeMetadataByToolTypeID(toolType.ID).ToList(); | ||||
|         List<ToolTypeMetadata> metaData = _MetrologyRepository.GetToolTypeMetadataByToolTypeID(toolType.ID).ToList(); | ||||
|  | ||||
|         if (metaData == null) | ||||
|         if (metaData is null) | ||||
|         { | ||||
|             r.Errors.Add("Invalid metadata for tool type: " + tooltype); | ||||
|             return BadRequest(r); | ||||
| @ -81,7 +81,7 @@ public class InboundController : ControllerBase | ||||
|  | ||||
|         // validate fields | ||||
|  | ||||
|         if (jsonbody != null) | ||||
|         if (jsonbody is not null) | ||||
|             _InboundDataService.ValidateJSONFields(jsonbody, 0, metaData, r.Errors, r.Warnings); | ||||
|         else | ||||
|             r.Errors.Add("Invalid json"); | ||||
| @ -118,12 +118,12 @@ public class InboundController : ControllerBase | ||||
|             return Unauthorized("Remote IP is not on allowed list"); | ||||
|         } | ||||
|  | ||||
|         ToolType toolType = _Repo.GetToolTypeByName(tooltype); | ||||
|         ToolType toolType = _MetrologyRepository.GetToolTypeByName(tooltype); | ||||
|  | ||||
|         if (toolType == null) | ||||
|         if (toolType is null) | ||||
|             return BadRequest($"Invalid tool type: {tooltype}"); | ||||
|  | ||||
|         if (Request.Form == null) | ||||
|         if (Request.Form is null) | ||||
|             return BadRequest($"Invalid form"); | ||||
|  | ||||
|         if (Request.Form.Files.Count != 1) | ||||
|  | ||||
							
								
								
									
										99
									
								
								Archive/ApiControllers/ReactorsController.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,99 @@ | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
| using System.Linq; | ||||
|  | ||||
| namespace OI.Metrology.Archive.ApiControllers; | ||||
|  | ||||
| using OI.Metrology.Archive.Models; | ||||
| using OI.Metrology.Shared.Models.Stateless; | ||||
| using System.Text.Json; | ||||
|  | ||||
| public class ReactorsController : Controller | ||||
| { | ||||
|  | ||||
|     private readonly AppSettings _AppSettings; | ||||
|     private readonly IMetrologyRepository _MetrologyRepository; | ||||
|  | ||||
|     public ReactorsController(AppSettings appSettings, IMetrologyRepository metrologyRepository) | ||||
|     { | ||||
|         _AppSettings = appSettings; | ||||
|         _MetrologyRepository = metrologyRepository; | ||||
|     } | ||||
|  | ||||
|     private static int[] EvenReactors() | ||||
|     { | ||||
|         int[] results = new int[] { | ||||
|             20, | ||||
|             22, | ||||
|             24, | ||||
|             26, | ||||
|             28, | ||||
|             30, | ||||
|             32, | ||||
|             34, | ||||
|             36, | ||||
|             38, | ||||
|             40, | ||||
|             42, | ||||
|             44, | ||||
|             46, | ||||
|             48, | ||||
|             50, | ||||
|             52, | ||||
|             54, | ||||
|             56, | ||||
|             58, | ||||
|             60, | ||||
|             62, | ||||
|             64, | ||||
|             66, | ||||
|             68, | ||||
|             70, | ||||
|             72, | ||||
|             74 | ||||
|         }; | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     private static int[] OddReactors() | ||||
|     { | ||||
|         int[] results = new int[] { | ||||
|             21, | ||||
|             23, | ||||
|             25, | ||||
|             27, | ||||
|             29, | ||||
|             31, | ||||
|             33, | ||||
|             35, | ||||
|             37, | ||||
|             39, | ||||
|             41, | ||||
|             43, | ||||
|             45, | ||||
|             47, | ||||
|             49, | ||||
|             51, | ||||
|             53, | ||||
|             55, | ||||
|             57, | ||||
|             59, | ||||
|             61, | ||||
|             63, | ||||
|             65, | ||||
|             73, | ||||
|             75, | ||||
|             77, | ||||
|             79 | ||||
|         }; | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     [HttpGet("/api/reactors/{even}")] | ||||
|     public IActionResult Index(bool even) | ||||
|     { | ||||
|         int[] n = even ? EvenReactors() : OddReactors(); | ||||
|         var r = n.Select(l => new { Name = $"R{l}", Id = l }); | ||||
|         return Json(r, new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true }); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @ -4,11 +4,11 @@ using System; | ||||
| using System.IO; | ||||
| using System.Linq; | ||||
|  | ||||
| namespace OI.Metrology.Archive.ApiContollers; | ||||
| namespace OI.Metrology.Archive.ApiControllers; | ||||
|  | ||||
| using OI.Metrology.Archive.Models; | ||||
| using OI.Metrology.Shared.DataModels; | ||||
| using OI.Metrology.Shared.Repositories; | ||||
| using OI.Metrology.Shared.Models.Stateless; | ||||
| using OI.Metrology.Shared.Services; | ||||
| using System.Collections.Generic; | ||||
| using System.Text.Json; | ||||
| @ -21,15 +21,15 @@ public class ToolTypesController : Controller | ||||
|     // it is named after the /api/tooltypes prefix | ||||
|     // the URL pattern is RESTful and the tool type is the root of every request | ||||
|  | ||||
|     private readonly IMetrologyRepo _Repo; | ||||
|     private readonly AppSettings _AppSettings; | ||||
|     private readonly IAttachmentsService _AttachmentsService; | ||||
|     private readonly IMetrologyRepository _MetrologyRepository; | ||||
|  | ||||
|     public ToolTypesController(AppSettings appSettings, IMetrologyRepo repo, IAttachmentsService attachmentsService) | ||||
|     public ToolTypesController(AppSettings appSettings, IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService) | ||||
|     { | ||||
|         _Repo = repo; | ||||
|         _AppSettings = appSettings; | ||||
|         _AttachmentsService = attachmentsService; | ||||
|         _MetrologyRepository = metrologyRepository; | ||||
|     } | ||||
|  | ||||
|     // Get a list of tooltypes, returns just Name and ID | ||||
| @ -38,7 +38,7 @@ public class ToolTypesController : Controller | ||||
|     { | ||||
|         var r = new | ||||
|         { | ||||
|             Results = _Repo.GetToolTypes().Select(tt => new { tt.ToolTypeName, tt.ID }) | ||||
|             Results = _MetrologyRepository.GetToolTypes().Select(tt => new { tt.ToolTypeName, tt.ID }) | ||||
|         }; | ||||
|         return Json(r, new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true }); | ||||
|     } | ||||
| @ -48,8 +48,8 @@ public class ToolTypesController : Controller | ||||
|     [HttpGet("/api/tooltypes/{id}")] | ||||
|     public IActionResult GetToolTypeMetadata(int id, string sortby = "") | ||||
|     { | ||||
|         ToolType tt = _Repo.GetToolTypeByID(id); | ||||
|         IEnumerable<ToolTypeMetadata> md = _Repo.GetToolTypeMetadataByToolTypeID(id); | ||||
|         ToolType tt = _MetrologyRepository.GetToolTypeByID(id); | ||||
|         IEnumerable<ToolTypeMetadata> md = _MetrologyRepository.GetToolTypeMetadataByToolTypeID(id); | ||||
|  | ||||
|         if (string.Equals(sortby, "grid", StringComparison.OrdinalIgnoreCase)) | ||||
|             md = md.OrderBy(f => f.GridDisplayOrder).ToList(); | ||||
| @ -80,7 +80,7 @@ public class ToolTypesController : Controller | ||||
|     { | ||||
|         long totalRecs; | ||||
|  | ||||
|         System.Data.DataTable dt = _Repo.GetHeaders(id, datebegin, dateend, page, pagesize, headerid, out totalRecs); | ||||
|         System.Data.DataTable dt = _MetrologyRepository.GetHeaders(id, datebegin, dateend, page, pagesize, headerid, out totalRecs); | ||||
|  | ||||
|         var r = new | ||||
|         { | ||||
| @ -101,7 +101,7 @@ public class ToolTypesController : Controller | ||||
|     { | ||||
|         long totalRecs; | ||||
|  | ||||
|         IEnumerable<HeaderCommon> dt = _Repo.GetHeaderTitles(id, page, pagesize, out totalRecs); | ||||
|         IEnumerable<HeaderCommon> dt = _MetrologyRepository.GetHeaderTitles(id, page, pagesize, out totalRecs); | ||||
|  | ||||
|         var r = new | ||||
|         { | ||||
| @ -121,7 +121,7 @@ public class ToolTypesController : Controller | ||||
|     { | ||||
|         var r = new | ||||
|         { | ||||
|             Results = _Repo.GetHeaderFields(id, headerid).Select(x => new { Column = x.Key, x.Value }).ToList() | ||||
|             Results = _MetrologyRepository.GetHeaderFields(id, headerid).Select(x => new { Column = x.Key, x.Value }).ToList() | ||||
|         }; | ||||
|         string json = JsonConvert.SerializeObject(r); | ||||
|  | ||||
| @ -137,7 +137,7 @@ public class ToolTypesController : Controller | ||||
|  | ||||
|         var r = new | ||||
|         { | ||||
|             Results = _Repo.GetDataSharePoint(id, title) | ||||
|             Results = _MetrologyRepository.GetDataSharePoint(id, title) | ||||
|         }; | ||||
|         string json = JsonConvert.SerializeObject(r); | ||||
|  | ||||
| @ -152,7 +152,7 @@ public class ToolTypesController : Controller | ||||
|  | ||||
|         var r = new | ||||
|         { | ||||
|             Results = _Repo.GetData(id, headerid) | ||||
|             Results = _MetrologyRepository.GetData(id, headerid) | ||||
|         }; | ||||
|         string json = JsonConvert.SerializeObject(r); | ||||
|  | ||||
| @ -168,7 +168,7 @@ public class ToolTypesController : Controller | ||||
|         string filename) | ||||
|     { | ||||
|  | ||||
|         ToolType tt = _Repo.GetToolTypeByID(toolTypeId); | ||||
|         ToolType tt = _MetrologyRepository.GetToolTypeByID(toolTypeId); | ||||
|  | ||||
|         bool header = !string.Equals(tabletype.Trim(), "data", StringComparison.OrdinalIgnoreCase); | ||||
|  | ||||
| @ -191,7 +191,7 @@ public class ToolTypesController : Controller | ||||
|     public IActionResult OIExport(int toolTypeId, long headerid) | ||||
|     { | ||||
|         // Call the export stored procedure | ||||
|         System.Data.DataSet ds = _Repo.GetOIExportData(toolTypeId, headerid); | ||||
|         System.Data.DataSet ds = _MetrologyRepository.GetOIExportData(toolTypeId, headerid); | ||||
|  | ||||
|         try | ||||
|         { | ||||
| @ -213,7 +213,7 @@ public class ToolTypesController : Controller | ||||
|  | ||||
|             foreach (object o in ds.Tables[1].Rows[0].ItemArray) | ||||
|             { | ||||
|                 if ((o != null) && (!Convert.IsDBNull(o))) | ||||
|                 if ((o is not null) && (!Convert.IsDBNull(o))) | ||||
|                     _ = sb.Append(Convert.ToString(o)); | ||||
|                 _ = sb.Append('\t'); | ||||
|             } | ||||
| @ -223,7 +223,7 @@ public class ToolTypesController : Controller | ||||
|             { | ||||
|                 foreach (object o in dr.ItemArray) | ||||
|                 { | ||||
|                     if ((o != null) && (!Convert.IsDBNull(o))) | ||||
|                     if ((o is not null) && (!Convert.IsDBNull(o))) | ||||
|                         _ = sb.Append(Convert.ToString(o)); | ||||
|                     _ = sb.Append('\t'); | ||||
|                 } | ||||
|  | ||||
| @ -15,7 +15,7 @@ public class ErrorHandlerController : Controller | ||||
|     public IActionResult Index() | ||||
|     { | ||||
|         IExceptionHandlerFeature error = HttpContext.Features.Get<IExceptionHandlerFeature>(); | ||||
|         if (error == null) | ||||
|         if (error is null) | ||||
|         { | ||||
|             return Redirect("~/"); | ||||
|         } | ||||
| @ -24,7 +24,7 @@ public class ErrorHandlerController : Controller | ||||
|             _Logger.LogError("Unhandled exception: " + error.Error.ToString()); | ||||
|             dynamic r = new | ||||
|             { | ||||
|                 Message = error.Error == null ? "Error" : error.Error.Message | ||||
|                 Message = error.Error is null ? "Error" : error.Error.Message | ||||
|             }; | ||||
|             return StatusCode(StatusCodes.Status500InternalServerError, r); | ||||
|         } | ||||
|  | ||||
| @ -4,7 +4,7 @@ using Microsoft.AspNetCore.Mvc.Filters; | ||||
| using Microsoft.Extensions.Logging; | ||||
| using OI.Metrology.Archive.Models; | ||||
| using OI.Metrology.Shared.DataModels; | ||||
| using OI.Metrology.Shared.Repositories; | ||||
| using OI.Metrology.Shared.Models.Stateless; | ||||
| using OI.Metrology.Shared.ViewModels; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| @ -17,14 +17,14 @@ public class ExportController : Controller | ||||
| { | ||||
|     private readonly ILogger _Logger; | ||||
|     private readonly bool _IsTestDatabase; | ||||
|     private readonly IMetrologyRepo _Repo; | ||||
|     private readonly AppSettings _AppSettings; | ||||
|     private readonly IMetrologyRepository _MetrologyRepository; | ||||
|  | ||||
|     public ExportController(AppSettings appSettings, ILogger<ExportController> logger, IMetrologyRepo repo) | ||||
|     public ExportController(AppSettings appSettings, ILogger<ExportController> logger, IMetrologyRepository metrologyRepository) | ||||
|     { | ||||
|         _Repo = repo; | ||||
|         _Logger = logger; | ||||
|         _AppSettings = appSettings; | ||||
|         _MetrologyRepository = metrologyRepository; | ||||
|         _IsTestDatabase = appSettings.ConnectionString.Contains("test", StringComparison.InvariantCultureIgnoreCase); | ||||
|     } | ||||
|  | ||||
| @ -40,7 +40,6 @@ public class ExportController : Controller | ||||
|     { | ||||
|         Export model = new() | ||||
|         { | ||||
|             ToolType = "", | ||||
|             StartTime = DateTime.Now.AddMonths(-1), | ||||
|             EndTime = DateTime.Now | ||||
|         }; | ||||
| @ -60,7 +59,7 @@ public class ExportController : Controller | ||||
|         { | ||||
|             if (model.StartTime > model.EndTime) | ||||
|                 ModelState.AddModelError("EndTime", "End time must be after start time"); | ||||
|             IEnumerable<ToolType> toolTypes = _Repo.GetToolTypes(); | ||||
|             IEnumerable<ToolType> toolTypes = _MetrologyRepository.GetToolTypes(); | ||||
|             toolType = toolTypes.Where(tt => tt.ID.ToString() == model.ToolType).SingleOrDefault(); | ||||
|             if (toolType is null) | ||||
|                 ModelState.AddModelError("ToolType", "Invalid selection"); | ||||
| @ -94,7 +93,7 @@ public class ExportController : Controller | ||||
|         string fileName = string.Format("Export_{0}_{1:yyyyMMddHHmm}_to_{2:yyyyMMddHHmm}.csv", toolTypeName, startTime, endTime); | ||||
|         StringBuilder sb = new(); | ||||
|  | ||||
|         System.Data.DataTable dt = _Repo.ExportData(spName, startTime, endTime); | ||||
|         System.Data.DataTable dt = _MetrologyRepository.ExportData(spName, startTime, endTime); | ||||
|  | ||||
|         _ = sb.AppendLine(GetColumnHeaders(dt)); | ||||
|  | ||||
|  | ||||
| @ -1,6 +1,7 @@ | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
| using Microsoft.AspNetCore.Mvc.Filters; | ||||
| using OI.Metrology.Archive.Models; | ||||
| using OI.Metrology.Shared.Models.Stateless; | ||||
| using OI.Metrology.Shared.Repositories; | ||||
| using OI.Metrology.Shared.ViewModels; | ||||
| using System; | ||||
| @ -13,12 +14,12 @@ public class PagesController : Controller | ||||
| { | ||||
|     private readonly bool _IsTestDatabase; | ||||
|     private readonly IRdsMaxRepo _RdsMaxRepo; | ||||
|     private readonly IMetrologyRepo _MetrologyRepo; | ||||
|     private readonly IMetrologyRepository _MetrologyRepo; | ||||
|  | ||||
|     public PagesController(AppSettings appSettings, IMetrologyRepo metrologyRepo, IRdsMaxRepo rdsMaxRepo) | ||||
|     public PagesController(AppSettings appSettings, IMetrologyRepository metrologyRepository, IRdsMaxRepo rdsMaxRepo) | ||||
|     { | ||||
|         _RdsMaxRepo = rdsMaxRepo; | ||||
|         _MetrologyRepo = metrologyRepo; | ||||
|         _MetrologyRepo = metrologyRepository; | ||||
|         _IsTestDatabase = appSettings.ConnectionString.Contains("test", StringComparison.InvariantCultureIgnoreCase); | ||||
|     } | ||||
|  | ||||
| @ -122,4 +123,9 @@ public class PagesController : Controller | ||||
|         return View(results); | ||||
|     } | ||||
|  | ||||
|     [HttpGet] | ||||
|     [Route("/Reactor")] | ||||
|     [Route("/Metrology/Reactor")] | ||||
|     public IActionResult Reactor() => View(new RunInfo()); | ||||
|  | ||||
| } | ||||
| @ -1,61 +1,24 @@ | ||||
| using System.Text.Json; | ||||
| using System.Text.Json.Serialization; | ||||
|  | ||||
| namespace OI.Metrology.Archive.Models; | ||||
|  | ||||
| public class AppSettings | ||||
| public record AppSettings(string ApiLoggingContentTypes, | ||||
|                           string ApiLoggingPathPrefixes, | ||||
|                           string ApiLogPath, | ||||
|                           string AttachmentPath, | ||||
|                           string BuildNumber, | ||||
|                           string Company, | ||||
|                           string ConnectionString, | ||||
|                           string GitCommitSeven, | ||||
|                           string InboundApiAllowedIPList, | ||||
|                           string MonAResource, | ||||
|                           string MonASite, | ||||
|                           string Oi2SqlConnectionString, | ||||
|                           string OIExportPath, | ||||
|                           string URLs, | ||||
|                           string WorkingDirectoryName) | ||||
| { | ||||
|  | ||||
|     public string ApiLoggingContentTypes { init; get; } | ||||
|     public string ApiLoggingPathPrefixes { init; get; } | ||||
|     public string ApiLogPath { init; get; } | ||||
|     public string AttachmentPath { init; get; } | ||||
|     public string BuildNumber { init; get; } | ||||
|     public string Company { init; get; } | ||||
|     public string ConnectionString { init; get; } | ||||
|     public string GitCommitSeven { init; get; } | ||||
|     public string InboundApiAllowedIPList { init; get; } | ||||
|     public string MonAResource { init; get; } | ||||
|     public string MonASite { init; get; } | ||||
|     public string OIExportPath { init; get; } | ||||
|     public string Oi2SqlConnectionString { init; get; } | ||||
|     public string URLs { init; get; } | ||||
|     public string WorkingDirectoryName { init; get; } | ||||
|  | ||||
|     [JsonConstructor] | ||||
|     public AppSettings(string apiLoggingContentTypes, | ||||
|                        string apiLoggingPathPrefixes, | ||||
|                        string apiLogPath, | ||||
|                        string attachmentPath, | ||||
|                        string buildNumber, | ||||
|                        string company, | ||||
|                        string connectionString, | ||||
|                        string gitCommitSeven, | ||||
|                        string inboundApiAllowedIPList, | ||||
|                        string monAResource, | ||||
|                        string monASite, | ||||
|                        string oi2SqlConnectionString, | ||||
|                        string oiExportPath, | ||||
|                        string urls, | ||||
|                        string workingDirectoryName) | ||||
|     { | ||||
|         ApiLoggingContentTypes = apiLoggingContentTypes; | ||||
|         ApiLoggingPathPrefixes = apiLoggingPathPrefixes; | ||||
|         ApiLogPath = apiLogPath; | ||||
|         AttachmentPath = attachmentPath; | ||||
|         BuildNumber = buildNumber; | ||||
|         Company = company; | ||||
|         ConnectionString = connectionString; | ||||
|         GitCommitSeven = gitCommitSeven; | ||||
|         InboundApiAllowedIPList = inboundApiAllowedIPList; | ||||
|         MonAResource = monAResource; | ||||
|         MonASite = monASite; | ||||
|         Oi2SqlConnectionString = oi2SqlConnectionString; | ||||
|         OIExportPath = oiExportPath; | ||||
|         URLs = urls; | ||||
|         WorkingDirectoryName = workingDirectoryName; | ||||
|     } | ||||
|  | ||||
|     public override string ToString() | ||||
|     { | ||||
|         string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true }); | ||||
|  | ||||
| @ -1,4 +1,5 @@ | ||||
| using Microsoft.Extensions.Configuration; | ||||
| using System; | ||||
| using System.ComponentModel.DataAnnotations; | ||||
| using System.Text.Json; | ||||
|  | ||||
| @ -36,6 +37,38 @@ public class AppSettings | ||||
|     private static Models.AppSettings Get(AppSettings appSettings) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
|         if (appSettings is null) | ||||
|             throw new NullReferenceException(nameof(appSettings)); | ||||
|         if (appSettings.ApiLoggingContentTypes is null) | ||||
|             throw new NullReferenceException(nameof(ApiLoggingContentTypes)); | ||||
|         if (appSettings.ApiLoggingPathPrefixes is null) | ||||
|             throw new NullReferenceException(nameof(ApiLoggingPathPrefixes)); | ||||
|         if (appSettings.ApiLogPath is null) | ||||
|             throw new NullReferenceException(nameof(ApiLogPath)); | ||||
|         if (appSettings.AttachmentPath is null) | ||||
|             throw new NullReferenceException(nameof(AttachmentPath)); | ||||
|         if (appSettings.BuildNumber is null) | ||||
|             throw new NullReferenceException(nameof(BuildNumber)); | ||||
|         if (appSettings.Company is null) | ||||
|             throw new NullReferenceException(nameof(Company)); | ||||
|         if (appSettings.ConnectionString is null) | ||||
|             throw new NullReferenceException(nameof(ConnectionString)); | ||||
|         if (appSettings.GitCommitSeven is null) | ||||
|             throw new NullReferenceException(nameof(GitCommitSeven)); | ||||
|         if (appSettings.InboundApiAllowedIPList is null) | ||||
|             throw new NullReferenceException(nameof(InboundApiAllowedIPList)); | ||||
|         if (appSettings.MonAResource is null) | ||||
|             throw new NullReferenceException(nameof(MonAResource)); | ||||
|         if (appSettings.MonASite is null) | ||||
|             throw new NullReferenceException(nameof(MonASite)); | ||||
|         if (appSettings.Oi2SqlConnectionString is null) | ||||
|             throw new NullReferenceException(nameof(Oi2SqlConnectionString)); | ||||
|         if (appSettings.OIExportPath is null) | ||||
|             throw new NullReferenceException(nameof(OIExportPath)); | ||||
|         if (appSettings.URLs is null) | ||||
|             throw new NullReferenceException(nameof(URLs)); | ||||
|         if (appSettings.WorkingDirectoryName is null) | ||||
|             throw new NullReferenceException(nameof(WorkingDirectoryName)); | ||||
|         result = new( | ||||
|             appSettings.ApiLoggingContentTypes, | ||||
|             appSettings.ApiLoggingPathPrefixes, | ||||
|  | ||||
| @ -12,8 +12,11 @@ | ||||
|         <Nullable>disable</Nullable> | ||||
|         <OutputType>Exe</OutputType> | ||||
|         <RuntimeIdentifier>win-x64</RuntimeIdentifier> | ||||
|         <TargetFramework>net6.0</TargetFramework> | ||||
|         <TargetFramework>net7.0</TargetFramework> | ||||
|     </PropertyGroup> | ||||
|     <ItemGroup> | ||||
|         <InternalsVisibleTo Include="Tests" /> | ||||
|     </ItemGroup> | ||||
|     <ItemGroup> | ||||
|         <Compile Remove="logs\**" /> | ||||
|         <Content Remove="logs\**" /> | ||||
| @ -26,28 +29,22 @@ | ||||
|     <ItemGroup> | ||||
|         <PackageReference Include="Dapper" Version="2.0.123" /> | ||||
|         <PackageReference Include="EntityFramework" Version="6.4.4" /> | ||||
|         <PackageReference Include="jQuery" Version="3.6.0" /> | ||||
|         <PackageReference Include="Newtonsoft.Json" Version="13.0.1" /> | ||||
|     </ItemGroup> | ||||
|     <ItemGroup> | ||||
|         <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="6.0.1" /> | ||||
|         <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="6.0.1" /> | ||||
|         <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.0" /> | ||||
|         <PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.1" /> | ||||
|     </ItemGroup> | ||||
|     <ItemGroup> | ||||
|         <PackageReference Include="Serilog.AspNetCore" Version="5.0.0" /> | ||||
|         <PackageReference Include="Serilog.AspNetCore.Ingestion" Version="1.0.0-dev-00021" /> | ||||
|         <PackageReference Include="Serilog.Settings.Configuration" Version="3.3.0" /> | ||||
|         <PackageReference Include="Serilog.Sinks.Console" Version="4.0.1" /> | ||||
|         <PackageReference Include="jQuery" Version="3.6.3" /> | ||||
|         <PackageReference Include="Newtonsoft.Json" Version="13.0.2" /> | ||||
|         <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="7.0.0" /> | ||||
|         <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="7.0.0" /> | ||||
|         <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="7.0.0" /> | ||||
|         <PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.0" /> | ||||
|         <PackageReference Include="Serilog.AspNetCore" Version="6.1.0" /> | ||||
|         <PackageReference Include="Serilog.AspNetCore.Ingestion" Version="1.0.0-dev-00032" /> | ||||
|         <PackageReference Include="Serilog.Settings.Configuration" Version="3.4.0" /> | ||||
|         <PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" /> | ||||
|         <PackageReference Include="Serilog.Sinks.File" Version="5.0.0" /> | ||||
|         <PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" /> | ||||
|         <PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" /> | ||||
|         <PackageReference Include="System.Data.SqlClient" Version="4.8.5" /> | ||||
|     </ItemGroup> | ||||
|     <ItemGroup> | ||||
|         <PackageReference Include="System.Data.SqlClient" Version="4.8.3" /> | ||||
|     </ItemGroup> | ||||
|     <ItemGroup> | ||||
|         <ProjectReference Include="..\Shared\Shared.csproj" /> | ||||
|         <ProjectReference Include="..\Shared\OI.Metrology.Shared.csproj" /> | ||||
|     </ItemGroup> | ||||
|     <ItemGroup> | ||||
|         <Folder Include="moves\" /> | ||||
| @ -9,6 +9,7 @@ using OI.Metrology.Archive.Models; | ||||
| using OI.Metrology.Archive.Repositories; | ||||
| using OI.Metrology.Archive.Services; | ||||
| using OI.Metrology.Shared.Models; | ||||
| using OI.Metrology.Shared.Models.Stateless; | ||||
| using OI.Metrology.Shared.Repositories; | ||||
| using OI.Metrology.Shared.Services; | ||||
| using Serilog; | ||||
| @ -21,6 +22,8 @@ namespace OI.Metrology.Archive; | ||||
| public class Program | ||||
| { | ||||
|  | ||||
|     internal readonly AppSettings _AppSettings; | ||||
|  | ||||
|     private static (string, WebApplicationOptions) Get(string[] args) | ||||
|     { | ||||
|         string webRootPath; | ||||
| @ -50,10 +53,10 @@ public class Program | ||||
|         (string assemblyName, WebApplicationOptions _) = Get(args); | ||||
|         WebApplicationBuilder webApplicationBuilder = WebApplication.CreateBuilder(args); | ||||
|         _ = webApplicationBuilder.Configuration.AddUserSecrets<Program>(); | ||||
|         AppSettings appSettings = Models.Binder.AppSettings.Get(webApplicationBuilder.Configuration); | ||||
|         if (string.IsNullOrEmpty(appSettings.WorkingDirectoryName)) | ||||
|         AppSettings _AppSettings = Models.Binder.AppSettings.Get(webApplicationBuilder.Configuration); | ||||
|         if (string.IsNullOrEmpty(_AppSettings.WorkingDirectoryName)) | ||||
|             throw new Exception("Working directory name must have a value!"); | ||||
|         string workingDirectory = IWorkingDirectory.GetWorkingDirectory(assemblyName, appSettings.WorkingDirectoryName); | ||||
|         string workingDirectory = IWorkingDirectory.GetWorkingDirectory(assemblyName, _AppSettings.WorkingDirectoryName); | ||||
|         Environment.SetEnvironmentVariable(nameof(workingDirectory), workingDirectory); | ||||
|         _ = ConfigurationLoggerConfigurationExtensions.Configuration(loggerConfiguration.ReadFrom, webApplicationBuilder.Configuration); | ||||
|         _ = SerilogHostBuilderExtensions.UseSerilog(webApplicationBuilder.Host); | ||||
| @ -63,13 +66,13 @@ public class Program | ||||
|         { | ||||
|             _ = webApplicationBuilder.Services.Configure<ApiBehaviorOptions>(options => options.SuppressModelStateInvalidFilter = true); | ||||
|             _ = webApplicationBuilder.Services.AddControllersWithViews(); | ||||
|             _ = new MetrologyRepo(new SQLDbConnectionFactory(appSettings), null); | ||||
|             _ = new MetrologyRepository(new SQLDbConnectionFactory(_AppSettings), null); | ||||
|             _ = webApplicationBuilder.Services.AddDistributedMemoryCache(); | ||||
|             _ = webApplicationBuilder.Services.AddMemoryCache(); | ||||
|             _ = webApplicationBuilder.Services.AddSingleton<AppSettings, AppSettings>(_ => appSettings); | ||||
|             _ = webApplicationBuilder.Services.AddSingleton<AppSettings, AppSettings>(_ => _AppSettings); | ||||
|             _ = webApplicationBuilder.Services.AddScoped<IAttachmentsService, AttachmentsService>(); | ||||
|             _ = webApplicationBuilder.Services.AddScoped<IInboundDataService, InboundDataService>(); | ||||
|             _ = webApplicationBuilder.Services.AddScoped<IMetrologyRepo, MetrologyRepo>(); | ||||
|             _ = webApplicationBuilder.Services.AddScoped<IMetrologyRepository, MetrologyRepository>(); | ||||
|             _ = webApplicationBuilder.Services.AddScoped<IRdsMaxRepo, RdsMaxRepo>(); | ||||
|             _ = webApplicationBuilder.Services.AddSingleton<IDbConnectionFactory, SQLDbConnectionFactory>(); | ||||
|             _ = webApplicationBuilder.Services.AddSwaggerGen(); | ||||
| @ -85,8 +88,10 @@ public class Program | ||||
|                 _ = webApplicationBuilder.Services.AddSingleton<IHostLifetime, WindowsServiceLifetime>(); | ||||
|                 _ = webApplicationBuilder.Logging.AddEventLog(settings => | ||||
|                 { | ||||
| #pragma warning disable CA1416 | ||||
|                     if (string.IsNullOrEmpty(settings.SourceName)) | ||||
|                         settings.SourceName = webApplicationBuilder.Environment.ApplicationName; | ||||
| #pragma warning restore | ||||
|                 }); | ||||
|             } | ||||
|             WebApplication webApplication = webApplicationBuilder.Build(); | ||||
| @ -97,7 +102,7 @@ public class Program | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 if (string.IsNullOrEmpty(appSettings.URLs)) | ||||
|                 if (string.IsNullOrEmpty(_AppSettings.URLs)) | ||||
|                 { | ||||
|                     Environment.ExitCode = -1; | ||||
|                     webApplication.Lifetime.StopApplication(); | ||||
|  | ||||
| @ -2,6 +2,7 @@ | ||||
| using Microsoft.Extensions.Caching.Memory; | ||||
| using Newtonsoft.Json.Linq; | ||||
| using OI.Metrology.Shared.DataModels; | ||||
| using OI.Metrology.Shared.Models.Stateless; | ||||
| using OI.Metrology.Shared.Repositories; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| @ -12,12 +13,12 @@ using System.Transactions; | ||||
|  | ||||
| namespace OI.Metrology.Archive.Repositories; | ||||
|  | ||||
| public class MetrologyRepo : IMetrologyRepo | ||||
| public class MetrologyRepository : IMetrologyRepository | ||||
| { | ||||
|     private readonly IDbConnectionFactory _DBConnectionFactory; | ||||
|     private readonly IMemoryCache _Cache; | ||||
|  | ||||
|     public MetrologyRepo(IDbConnectionFactory dbConnectionFactory, IMemoryCache memoryCache) | ||||
|     public MetrologyRepository(IDbConnectionFactory dbConnectionFactory, IMemoryCache memoryCache) | ||||
|     { | ||||
|         _DBConnectionFactory = dbConnectionFactory; | ||||
|         _Cache = memoryCache; | ||||
| @ -28,20 +29,6 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|     protected DbProviderFactory GetDbProviderFactory(IDbConnection conn) => | ||||
|         DbProviderFactories.GetFactory(conn.GetType().Namespace); | ||||
|  | ||||
|     public bool IsTestDatabase() | ||||
|     { | ||||
|         int c = 0; | ||||
|         using (DbConnection conn = GetDbConnection()) | ||||
|         { | ||||
|             c = conn.Query<int>( | ||||
|                 "SELECT COUNT(*) " + | ||||
|                 "FROM Configuration " + | ||||
|                 "WHERE KeyName = 'TestDatabase' " + | ||||
|                 "AND ValueString = '1'").FirstOrDefault(); | ||||
|         } | ||||
|         return c > 0; | ||||
|     } | ||||
|  | ||||
|     public TransactionScope StartTransaction() => new(); | ||||
|  | ||||
|     protected void CacheItem(string key, object v) | ||||
| @ -136,10 +123,10 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|             // build field map | ||||
|             foreach (ToolTypeMetadata f in fields) | ||||
|             { | ||||
|                 if ((f.ApiName != null) && f.ApiName.Contains('\\')) | ||||
|                 if ((f.ApiName is not null) && f.ApiName.Contains('\\')) | ||||
|                 { | ||||
|                     string n = f.ApiName.Split('\\')[0].Trim().ToUpper(); | ||||
|                     if (containerField == null) | ||||
|                     if (containerField is null) | ||||
|                         containerField = n; | ||||
|                     else if (!string.Equals(containerField, n)) | ||||
|                         throw new Exception("Only one container field is allowed"); | ||||
| @ -153,7 +140,7 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             if (containerField == null) | ||||
|             if (containerField is null) | ||||
|             { | ||||
|                 // No container field, just  insert a single row | ||||
|  | ||||
| @ -164,7 +151,7 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|                 // Find the container field in the json | ||||
|                 JProperty contJP = jsonrow.Children<JProperty>().Where(c => string.Equals(c.Name.Trim(), containerField, StringComparison.OrdinalIgnoreCase)).SingleOrDefault(); | ||||
|  | ||||
|                 if ((contJP != null) && (contJP.Value is JArray array)) | ||||
|                 if ((contJP is not null) && (contJP.Value is JArray array)) | ||||
|                 { | ||||
|                     JArray contRows = array; | ||||
|  | ||||
| @ -227,14 +214,13 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|                 parmnumber += 1; | ||||
|  | ||||
|                 object sqlValue = ((JValue)jp.Value).Value; | ||||
|                 if (sqlValue == null) | ||||
|                     sqlValue = DBNull.Value; | ||||
|                 sqlValue ??= DBNull.Value; | ||||
|  | ||||
|                 AddParameter(cmd, parmname, sqlValue); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if ((containerrow != null) && (containerFieldmap != null)) | ||||
|         if ((containerrow is not null) && (containerFieldmap is not null)) | ||||
|         { | ||||
|  | ||||
|             foreach (JProperty jp in containerrow.Children<JProperty>()) | ||||
| @ -251,8 +237,7 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|                     parmnumber += 1; | ||||
|  | ||||
|                     object sqlValue = ((JValue)jp.Value).Value; | ||||
|                     if (sqlValue == null) | ||||
|                         sqlValue = DBNull.Value; | ||||
|                     sqlValue ??= DBNull.Value; | ||||
|  | ||||
|                     AddParameter(cmd, parmname, sqlValue); | ||||
|                 } | ||||
| @ -266,7 +251,7 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|         cmd.CommandText = columns.TrimEnd(',') + parms.TrimEnd(',') + ";SELECT SCOPE_IDENTITY();"; | ||||
|  | ||||
|         object o = cmd.ExecuteScalar(); | ||||
|         if ((o == null) || Convert.IsDBNull(o)) | ||||
|         if ((o is null) || Convert.IsDBNull(o)) | ||||
|             throw new Exception("Unexpected query result"); | ||||
|         return Convert.ToInt64(o); | ||||
|     } | ||||
| @ -306,7 +291,7 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|             { | ||||
|                 if (!firstField) | ||||
|                     _ = sb.Append(','); | ||||
|                 if (f.GridAttributes != null && f.GridAttributes.Contains("isNull")) | ||||
|                 if (f.GridAttributes is not null && f.GridAttributes.Contains("isNull")) | ||||
|                 { | ||||
|                     _ = sb.AppendFormat("{0}", "ISNULL(" + f.ColumnName + ", '')[" + f.ColumnName + "]"); | ||||
|                 } | ||||
| @ -324,11 +309,11 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|     public DataTable GetHeaders(int toolTypeId, DateTime? startTime, DateTime? endTime, int? pageNo, int? pageSize, long? headerId, out long totalRecords) | ||||
|     { | ||||
|         ToolType tt = GetToolTypeByID(toolTypeId); | ||||
|         if (tt == null) | ||||
|         if (tt is null) | ||||
|             throw new Exception("Invalid tool type ID"); | ||||
|  | ||||
|         IEnumerable<ToolTypeMetadata> md = GetToolTypeMetadataByToolTypeID(toolTypeId); | ||||
|         if (md == null) | ||||
|         if (md is null) | ||||
|             throw new Exception("Invalid tool type metadata"); | ||||
|  | ||||
|         DataTable dt = new(); | ||||
| @ -420,11 +405,11 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|     public DataTable GetData(int toolTypeId, long headerid) | ||||
|     { | ||||
|         ToolType tt = GetToolTypeByID(toolTypeId); | ||||
|         if (tt == null) | ||||
|         if (tt is null) | ||||
|             throw new Exception("Invalid tool type ID"); | ||||
|  | ||||
|         IEnumerable<ToolTypeMetadata> md = GetToolTypeMetadataByToolTypeID(toolTypeId); | ||||
|         if (md == null) | ||||
|         if (md is null) | ||||
|             throw new Exception("Invalid tool type metadata"); | ||||
|  | ||||
|         DataTable dt = new(); | ||||
| @ -531,11 +516,11 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|     public DataTable GetDataSharePoint(int toolTypeId, string headerid) | ||||
|     { | ||||
|         ToolType tt = GetToolTypeByID(toolTypeId); | ||||
|         if (tt == null) | ||||
|         if (tt is null) | ||||
|             throw new Exception("Invalid tool type ID"); | ||||
|  | ||||
|         IEnumerable<ToolTypeMetadata> md = GetToolTypeMetadataByToolTypeID(toolTypeId); | ||||
|         if (md == null) | ||||
|         if (md is null) | ||||
|             throw new Exception("Invalid tool type metadata"); | ||||
|  | ||||
|         DataTable dt = new(); | ||||
| @ -626,7 +611,7 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|     public Guid GetHeaderAttachmentID(int toolTypeId, long headerId) | ||||
|     { | ||||
|         ToolType tt = GetToolTypeByID(toolTypeId); | ||||
|         if (tt == null) | ||||
|         if (tt is null) | ||||
|             throw new Exception("Invalid tool type ID"); | ||||
|  | ||||
|         using DbConnection conn = GetDbConnection(); | ||||
| @ -639,7 +624,7 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|     public Guid GetDataAttachmentID(int toolTypeId, long headerId, string title) | ||||
|     { | ||||
|         ToolType tt = GetToolTypeByID(toolTypeId); | ||||
|         if (tt == null) | ||||
|         if (tt is null) | ||||
|             throw new Exception("Invalid tool type ID"); | ||||
|  | ||||
|         using DbConnection conn = GetDbConnection(); | ||||
| @ -658,7 +643,7 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|     public DataSet GetOIExportData(int toolTypeId, long headerid) | ||||
|     { | ||||
|         ToolType tt = GetToolTypeByID(toolTypeId); | ||||
|         if (tt == null) | ||||
|         if (tt is null) | ||||
|             throw new Exception("Invalid tool type ID"); | ||||
|  | ||||
|         if (string.IsNullOrWhiteSpace(tt.OIExportSPName)) | ||||
| @ -684,10 +669,13 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|         return ds; | ||||
|     } | ||||
|  | ||||
|     public IEnumerable<HeaderCommon> GetHeaderTitles(int toolTypeId, int? pageNo, int? pageSize, out long totalRecords) | ||||
|     public HeaderCommon[] GetHeaderTitles(int? toolTypeId, int? pageNo, int? pageSize, out long totalRecords) | ||||
|     { | ||||
|         ToolType tt = GetToolTypeByID(toolTypeId); | ||||
|         if (tt == null) | ||||
|         if (toolTypeId is null) | ||||
|             throw new Exception("Invalid tool type ID"); | ||||
|  | ||||
|         ToolType tt = GetToolTypeByID(toolTypeId.Value); | ||||
|         if (tt is null) | ||||
|             throw new Exception("Invalid tool type ID"); | ||||
|  | ||||
|         DbConnection conn = GetDbConnection(); | ||||
| @ -695,17 +683,17 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|         { | ||||
|             string sql = $"SELECT ID, InsertDate, AttachmentID, Title, [Date] FROM {tt.HeaderTableName} ORDER BY [Date] DESC "; | ||||
|  | ||||
|             IEnumerable<HeaderCommon> headers; | ||||
|             HeaderCommon[] headers; | ||||
|  | ||||
|             if (pageNo.HasValue && pageSize.HasValue) | ||||
|             { | ||||
|                 sql += "OFFSET @PageNum * @PageSize ROWS FETCH NEXT @PageSize ROWS ONLY"; | ||||
|  | ||||
|                 headers = conn.Query<HeaderCommon>(sql, param: new { PageNum = pageNo.Value, PageSize = pageSize.Value }).ToList(); | ||||
|                 headers = conn.Query<HeaderCommon>(sql, param: new { PageNum = pageNo.Value, PageSize = pageSize.Value }).ToArray(); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 headers = conn.Query<HeaderCommon>(sql).ToList(); | ||||
|                 headers = conn.Query<HeaderCommon>(sql).ToArray(); | ||||
|             } | ||||
|  | ||||
|             sql = $"SELECT COUNT(*) FROM [{tt.HeaderTableName}] "; | ||||
| @ -719,11 +707,11 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|     public IEnumerable<KeyValuePair<string, string>> GetHeaderFields(int toolTypeId, long headerid) | ||||
|     { | ||||
|         ToolType tt = GetToolTypeByID(toolTypeId); | ||||
|         if (tt == null) | ||||
|         if (tt is null) | ||||
|             throw new Exception("Invalid tool type ID"); | ||||
|  | ||||
|         IEnumerable<ToolTypeMetadata> md = GetToolTypeMetadataByToolTypeID(toolTypeId); | ||||
|         if (md == null) | ||||
|         if (md is null) | ||||
|             throw new Exception("Invalid tool type metadata"); | ||||
|  | ||||
|         List<KeyValuePair<string, string>> r = new(); | ||||
| @ -751,10 +739,10 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|             foreach (ToolTypeMetadata m in md.Where(m => m.Header == true && m.TableDisplayOrder > 0).OrderBy(m => m.TableDisplayOrder)) | ||||
|             { | ||||
|                 string v = ""; | ||||
|                 if (dr != null) | ||||
|                 if (dr is not null) | ||||
|                 { | ||||
|                     object o = dr[m.ColumnName]; | ||||
|                     if (o != null && !Convert.IsDBNull(o)) | ||||
|                     if (o is not null && !Convert.IsDBNull(o)) | ||||
|                         v = Convert.ToString(o); | ||||
|                 } | ||||
|                 KeyValuePair<string, string> kvp = new(m.DisplayTitle, v); | ||||
| @ -764,16 +752,16 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|         return r; | ||||
|     } | ||||
|  | ||||
|     public IEnumerable<AwaitingDispo> GetAwaitingDispo() | ||||
|     public IEnumerable<AwaitingDisposition> GetAwaitingDisposition() | ||||
|     { | ||||
|         using DbConnection conn = GetDbConnection(); | ||||
|         return conn.Query<AwaitingDispo>("GetAwaitingDispo", commandType: CommandType.StoredProcedure); | ||||
|         return conn.Query<AwaitingDisposition>("GetAwaitingDispo", commandType: CommandType.StoredProcedure); | ||||
|     } | ||||
|     // Jonathan changed this to remove the reviewDate update on the database. | ||||
|     public int UpdateReviewDate(int toolTypeId, long headerId, bool clearDate) | ||||
|     { | ||||
|         ToolType tt = GetToolTypeByID(toolTypeId); | ||||
|         if (tt == null) | ||||
|         if (tt is null) | ||||
|             throw new Exception("Invalid tool type ID"); | ||||
|  | ||||
|         using DbConnection conn = GetDbConnection(); | ||||
| @ -794,7 +782,7 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|     public Guid GetHeaderAttachmentIDByTitle(int toolTypeId, string title) | ||||
|     { | ||||
|         ToolType tt = GetToolTypeByID(toolTypeId); | ||||
|         if (tt == null) | ||||
|         if (tt is null) | ||||
|             throw new Exception("Invalid tool type ID"); | ||||
|  | ||||
|         using DbConnection conn = GetDbConnection(); | ||||
| @ -806,7 +794,7 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|     public Guid GetDataAttachmentIDByTitle(int toolTypeId, string title) | ||||
|     { | ||||
|         ToolType tt = GetToolTypeByID(toolTypeId); | ||||
|         if (tt == null) | ||||
|         if (tt is null) | ||||
|             throw new Exception("Invalid tool type ID"); | ||||
|  | ||||
|         using DbConnection conn = GetDbConnection(); | ||||
| @ -815,8 +803,8 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|         return conn.ExecuteScalar<Guid>(sql, param: new { Title = title }); | ||||
|     } | ||||
|  | ||||
|     string IMetrologyRepo.GetHeaderInsertDate(int toolTypeId, long headerId) => throw new NotImplementedException(); | ||||
|     void IMetrologyRepo.SetHeaderDirName(string tableName, long headerId, string dateDir) => throw new NotImplementedException(); | ||||
|     string IMetrologyRepo.GetDataInsertDate(int toolTypeId, long headerId, string title) => throw new NotImplementedException(); | ||||
|     void IMetrologyRepo.SetDataDirName(string tableName, long headerId, string title, string dateDir) => throw new NotImplementedException(); | ||||
|     string IMetrologyRepository.GetHeaderInsertDate(int toolTypeId, long headerId) => throw new NotImplementedException(); | ||||
|     void IMetrologyRepository.SetHeaderDirName(string tableName, long headerId, string dateDir) => throw new NotImplementedException(); | ||||
|     string IMetrologyRepository.GetDataInsertDate(int toolTypeId, long headerId, string title) => throw new NotImplementedException(); | ||||
|     void IMetrologyRepository.SetDataDirName(string tableName, long headerId, string title, string dateDir) => throw new NotImplementedException(); | ||||
| } | ||||
| @ -6,27 +6,27 @@ namespace OI.Metrology.Archive.Services; | ||||
|  | ||||
| using OI.Metrology.Archive.Models; | ||||
| using OI.Metrology.Shared.DataModels; | ||||
| using OI.Metrology.Shared.Repositories; | ||||
| using OI.Metrology.Shared.Models.Stateless; | ||||
| using OI.Metrology.Shared.Services; | ||||
| using System.Data.SqlClient; | ||||
|  | ||||
| public class AttachmentsService : IAttachmentsService | ||||
| { | ||||
|  | ||||
|     private readonly IMetrologyRepo _Repo; | ||||
|     private readonly AppSettings _AppSettings; | ||||
|     private readonly IMetrologyRepository _MetrologyRepository; | ||||
|  | ||||
|     public AttachmentsService(AppSettings appSettings, IMetrologyRepo repo) | ||||
|     public AttachmentsService(AppSettings appSettings, IMetrologyRepository metrologyRepository) | ||||
|     { | ||||
|         _Repo = repo; | ||||
|         _AppSettings = appSettings; | ||||
|         _MetrologyRepository = metrologyRepository; | ||||
|     } | ||||
|     protected Stream GetAttachmentStream(string tableName, Guid attachmentId, string filename) | ||||
|     { | ||||
|         if (attachmentId.Equals(Guid.Empty)) | ||||
|             throw new Exception("No attachments found"); | ||||
|  | ||||
|         DateTime insertDate = Convert.ToDateTime(_Repo.GetAttachmentInsertDateByGUID(tableName, attachmentId)); | ||||
|         DateTime insertDate = Convert.ToDateTime(_MetrologyRepository.GetAttachmentInsertDateByGUID(tableName, attachmentId)); | ||||
|         int year = insertDate.Year; | ||||
|         DateTime d = insertDate; | ||||
|         CultureInfo cul = CultureInfo.CurrentCulture; | ||||
| @ -63,7 +63,7 @@ public class AttachmentsService : IAttachmentsService | ||||
|  | ||||
|     public Stream GetAttachmentStreamByTitle(ToolType toolType, bool header, string title, string filename) | ||||
|     { | ||||
|         if (toolType == null) | ||||
|         if (toolType is null) | ||||
|             throw new Exception("Invalid tool type"); | ||||
|  | ||||
|         string queryString = "SELECT * FROM " + toolType.DataTableName + " WHERE AttachmentId = @attachmentId"; | ||||
| @ -103,19 +103,19 @@ public class AttachmentsService : IAttachmentsService | ||||
|         if (header) | ||||
|         { | ||||
|             tableName = toolType.HeaderTableName; | ||||
|             attachmentId = _Repo.GetHeaderAttachmentIDByTitle(toolType.ID, title); | ||||
|             attachmentId = _MetrologyRepository.GetHeaderAttachmentIDByTitle(toolType.ID, title); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             tableName = toolType.DataTableName; | ||||
|             attachmentId = _Repo.GetDataAttachmentIDByTitle(toolType.ID, title); | ||||
|             attachmentId = _MetrologyRepository.GetDataAttachmentIDByTitle(toolType.ID, title); | ||||
|         } | ||||
|         return GetAttachmentStream(tableName, attachmentId, filename); | ||||
|     } | ||||
|  | ||||
|     public Stream GetAttachmentStreamByAttachmentId(ToolType toolType, bool header, Guid attachmentId, string filename) | ||||
|     { | ||||
|         if (toolType == null) | ||||
|         if (toolType is null) | ||||
|             throw new Exception("Invalid tool type"); | ||||
|         string tableName; | ||||
|         if (header) | ||||
| @ -126,7 +126,7 @@ public class AttachmentsService : IAttachmentsService | ||||
|     } | ||||
|     public Stream GetAttachmentStreamByAttachmentIdArchive(ToolType toolType, bool header, Guid attachmentId, string filename) | ||||
|     { | ||||
|         if (toolType == null) | ||||
|         if (toolType is null) | ||||
|             throw new Exception("Invalid tool type"); | ||||
|         string tableName; | ||||
|         if (header) | ||||
| @ -139,21 +139,21 @@ public class AttachmentsService : IAttachmentsService | ||||
|  | ||||
|     private void SaveAttachment(ToolType toolType, long headerId, string dataUniqueId, string filename, Microsoft.AspNetCore.Http.IFormFile uploadedFile) | ||||
|     { | ||||
|         if (toolType == null) | ||||
|         if (toolType is null) | ||||
|             throw new Exception("Invalid tool type"); | ||||
|  | ||||
|         using System.Transactions.TransactionScope trans = _Repo.StartTransaction(); | ||||
|         using System.Transactions.TransactionScope trans = _MetrologyRepository.StartTransaction(); | ||||
|         Guid attachmentId = Guid.Empty; | ||||
|         string tableName = ""; | ||||
|  | ||||
|         if (string.IsNullOrWhiteSpace(dataUniqueId)) | ||||
|         { | ||||
|             attachmentId = _Repo.GetHeaderAttachmentID(toolType.ID, headerId); | ||||
|             attachmentId = _MetrologyRepository.GetHeaderAttachmentID(toolType.ID, headerId); | ||||
|             tableName = toolType.HeaderTableName; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             attachmentId = _Repo.GetDataAttachmentID(toolType.ID, headerId, dataUniqueId); | ||||
|             attachmentId = _MetrologyRepository.GetDataAttachmentID(toolType.ID, headerId, dataUniqueId); | ||||
|             tableName = toolType.DataTableName; | ||||
|         } | ||||
|         if (Equals(attachmentId, Guid.Empty)) | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| using Newtonsoft.Json.Linq; | ||||
| using OI.Metrology.Shared.DataModels; | ||||
| using OI.Metrology.Shared.Repositories; | ||||
| using OI.Metrology.Shared.Models.Stateless; | ||||
| using OI.Metrology.Shared.Services; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| @ -10,9 +10,9 @@ namespace OI.Metrology.Archive.Services; | ||||
|  | ||||
| public class InboundDataService : IInboundDataService | ||||
| { | ||||
|     private readonly IMetrologyRepo _Repo; | ||||
|     private readonly IMetrologyRepository _MetrologyRepository; | ||||
|  | ||||
|     public InboundDataService(IMetrologyRepo repo) => _Repo = repo; | ||||
|     public InboundDataService(IMetrologyRepository metrologyRepository) => _MetrologyRepository = metrologyRepository; | ||||
|  | ||||
|     public long DoSQLInsert(JToken jsonbody, ToolType toolType, List<ToolTypeMetadata> metaData) | ||||
|     { | ||||
| @ -37,11 +37,11 @@ public class InboundDataService : IInboundDataService | ||||
|  | ||||
|         long headerId = 0; | ||||
|  | ||||
|         using (System.Transactions.TransactionScope transScope = _Repo.StartTransaction()) | ||||
|         using (System.Transactions.TransactionScope transScope = _MetrologyRepository.StartTransaction()) | ||||
|         { | ||||
|             try | ||||
|             { | ||||
|                 _Repo.PurgeExistingData(toolType.ID, uniqueId); | ||||
|                 _MetrologyRepository.PurgeExistingData(toolType.ID, uniqueId); | ||||
|             } | ||||
|             catch (Exception ex) | ||||
|             { | ||||
| @ -50,7 +50,7 @@ public class InboundDataService : IInboundDataService | ||||
|  | ||||
|             try | ||||
|             { | ||||
|                 headerId = _Repo.InsertToolDataJSON(jsonbody, -1, metaData, toolType.HeaderTableName); | ||||
|                 headerId = _MetrologyRepository.InsertToolDataJSON(jsonbody, -1, metaData, toolType.HeaderTableName); | ||||
|             } | ||||
|             catch (Exception ex) | ||||
|             { | ||||
| @ -60,11 +60,11 @@ public class InboundDataService : IInboundDataService | ||||
|             int detailrow = 1; | ||||
|             try | ||||
|             { | ||||
|                 if (detailsArray != null) | ||||
|                 if (detailsArray is not null) | ||||
|                 { | ||||
|                     foreach (JToken detail in detailsArray) | ||||
|                     { | ||||
|                         _ = _Repo.InsertToolDataJSON(detail, headerId, metaData, toolType.DataTableName); | ||||
|                         _ = _MetrologyRepository.InsertToolDataJSON(detail, headerId, metaData, toolType.DataTableName); | ||||
|                         detailrow += 1; | ||||
|                     } | ||||
|                 } | ||||
| @ -133,7 +133,7 @@ public class InboundDataService : IInboundDataService | ||||
|  | ||||
|                     if (jp.First is JArray array) | ||||
|                         detailsArray = array; | ||||
|                     else if ((jp.First is JValue value) && (value.Value == null)) | ||||
|                     else if ((jp.First is JValue value) && (value.Value is null)) | ||||
|                         detailsArray = null; | ||||
|                     else | ||||
|                         errors.Add("Invalid details field"); | ||||
| @ -169,7 +169,7 @@ public class InboundDataService : IInboundDataService | ||||
|         } | ||||
|  | ||||
|         // if a Details container if found, process it by recursion | ||||
|         if (detailsArray != null) | ||||
|         if (detailsArray is not null) | ||||
|         { | ||||
|             int i = 1; | ||||
|             foreach (JToken detail in detailsArray) | ||||
| @ -189,7 +189,7 @@ public class InboundDataService : IInboundDataService | ||||
|         { | ||||
|             // get the json data for this container field, ex: Points | ||||
|             JProperty contJP = jsonbody.Children<JProperty>().Where(jp => string.Equals(jp.Name, containerField, StringComparison.OrdinalIgnoreCase)).SingleOrDefault(); | ||||
|             if ((contJP != null) && (contJP.Value is JArray array)) | ||||
|             if ((contJP is not null) && (contJP.Value is JArray array)) | ||||
|             { | ||||
|                 JArray contJPArray = array; | ||||
|  | ||||
|  | ||||
| @ -1,111 +1,81 @@ | ||||
| @model OI.Metrology.Shared.ViewModels.RunInfo | ||||
| @{ | ||||
|     ViewData["Title"] = "Run Information"; | ||||
|     ViewData["Title"] = "Reactor"; | ||||
| } | ||||
| <style> | ||||
|     #HeaderGridDiv, | ||||
|     #RunGridDiv, | ||||
|     #DetailsGridDiv { | ||||
|         font-size: 12px; | ||||
|     } | ||||
| </style> | ||||
| 
 | ||||
| <h4>Run Information</h4> | ||||
| <h4>Reactor</h4> | ||||
| 
 | ||||
| <form class="form-inline mb-4"> | ||||
|     <div class="form-group"> | ||||
|         <label for="ToolType">Tool Type</label> | ||||
|         <div class="form-control" id="ToolType"></div> | ||||
|     <div class="form-group" id="EvenReactorDiv"> | ||||
|         <button for="EvenReactor">Even Reactor</button> | ||||
|         <label for="EvenReactor">Even Reactor</label> | ||||
|         <div class="form-control" id="EvenReactor" hidden></div> | ||||
|     </div> | ||||
|     <div class="form-group"> | ||||
|         <label for="StartDate">Start Time</label> | ||||
|         <div class="form-control mb-2 mr-sm-2" id="StartDate"></div> | ||||
|         <div class="form-control mb-2 mr-sm-2" id="StartTime"></div> | ||||
|     </div> | ||||
|     <div class="form-group"> | ||||
|         <label for="EndDate">End Time</label> | ||||
|         <div class="form-control mb-2 mr-sm-2" id="EndDate"></div> | ||||
|         <div class="form-control mb-2 mr-sm-2" id="EndTime"></div> | ||||
|     <div class="form-group" id="OddReactorDiv"> | ||||
|         <button for="OddReactor">Odd Reactor</button> | ||||
|         <label for="OddReactor">Odd Reactor</label> | ||||
|         <div class="form-control" id="OddReactor" hidden></div> | ||||
|     </div>   | ||||
|     <div class="form-group"> | ||||
|         <input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" /> | ||||
|         <input class="btn btn-primary" type="button" value="Load Runs" id="LoadRunsButton" /> | ||||
|     </div>   | ||||
|     <div class="form-group"> | ||||
|         <label class="form-check-label" for="chkAutoRefresh"> | ||||
|             Auto-Refresh | ||||
|         </label> | ||||
|         <input class="form-check-input" type="checkbox" id="chkAutoRefresh"> | ||||
|     </div> | ||||
| </form> | ||||
| 
 | ||||
| <div style="height: 300px;" id="HeaderGridDiv"> | ||||
|     <span id="ToolTypeID" hidden></span> | ||||
|     <table id="HeaderGrid"></table> | ||||
| <div style="height: 300px;" id="RunGridDiv"> | ||||
|     <span id="EvenReactorID" hidden></span> | ||||
|     <span id="OddReactorID" hidden></span> | ||||
|     <table id="RunGrid"></table> | ||||
| </div> | ||||
| 
 | ||||
| <div class="row" style="margin-top: 10px; margin-bottom: 20px;"> | ||||
|     <div class="col-xs-1"> | ||||
|         <input type="button" class="btn" id="GetDataButton" value="Get Data" disabled /> | ||||
|     </div> | ||||
|     <div class="col-xs-1"> | ||||
|         <input type="button" class="btn" id="ReviewButton" value="Review" disabled /> | ||||
|     </div> | ||||
| </div> | ||||
| 
 | ||||
| <div id="DetailsDiv" hidden> | ||||
| 
 | ||||
|     <span id="HeaderId" hidden></span> | ||||
|     <span id="HeaderAttachmentId" hidden></span> | ||||
|     <div style="padding-bottom: 20px;" id="DetailsGridDiv"> | ||||
|         <table id="DetailsGrid"></table> | ||||
|     </div> | ||||
| 
 | ||||
|     <div id="ExportDiv" style="margin-top: 10px;" hidden> | ||||
|         <input type="button" value="Send to OpenInsight" id="OIExportButton" /> | ||||
|         <span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span> | ||||
|     </div> | ||||
| 
 | ||||
|     <p style="text-align: center; margin-top: 20px;"> | ||||
|         <iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;" hidden></iframe> | ||||
|         <iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe> | ||||
|     </p> | ||||
| 
 | ||||
| </div> | ||||
| 
 | ||||
| <script> | ||||
| 
 | ||||
|     var toolType = null; | ||||
|     var toolTypeMetaData = null; | ||||
|     var EvenReactor = null; | ||||
|     var OddReactor = null; | ||||
| 
 | ||||
|     function LoadHeaderGrid() { | ||||
|     function LoadRunGrid() { | ||||
| 
 | ||||
|         var toolTypeID = $("#ToolType").igCombo("value"); | ||||
|         var EvenReactorID = $("#EvenReactor").igCombo("value"); | ||||
| 
 | ||||
|         $("#ToolTypeID").text(toolTypeID); | ||||
|         $("#EvenReactorID").text(EvenReactorID); | ||||
| 
 | ||||
|         HideDetailsDiv(); | ||||
|         DisableHeaderButtons(); | ||||
| 
 | ||||
|         $("#HeaderId").text(""); | ||||
|         $("#HeaderAttachmentId").text(""); | ||||
|         $("#HeaderDate").text(""); | ||||
|         $("#SPHeaderID").text(""); | ||||
| 
 | ||||
|         var gridCreated = $("#HeaderGrid").data("igGrid"); | ||||
|         var gridCreated = $("#RunGrid").data("igGrid"); | ||||
|         if (gridCreated) | ||||
|             $("#HeaderGrid").igGrid("destroy"); | ||||
|             $("#RunGrid").igGrid("destroy"); | ||||
| 
 | ||||
|         $.ajax({ | ||||
|             type: "GET", | ||||
|             url: "@Url.Content("~/api/tooltypes/")" + toolTypeID + "?sortby=grid", | ||||
|             url: "@Url.Content("~/api/EvenReactors/")" + EvenReactorID + "?sortby=grid", | ||||
|             success: function (r) { | ||||
|                 if ((r.Results == null) || (r.Results.ToolType == null) || (r.Results.Metadata == null)) | ||||
|                     ShowErrorMessage("Invalid tool type: " + toolTypeID); | ||||
|                 if ((r.Results == null) || (r.Results.EvenReactor == null) || (r.Results.Metadata == null)) | ||||
|                     ShowErrorMessage("Invalid Even Reactor: " + EvenReactorID); | ||||
|                 else { | ||||
|                     toolType = r.Results.ToolType; | ||||
|                     toolTypeMetaData = r.Results.Metadata; | ||||
|                     EvenReactor = r.Results.EvenReactor; | ||||
|                     EvenReactorMetaData = r.Results.Metadata; | ||||
|                     RequestHeaderData(); | ||||
|                 } | ||||
|             }, | ||||
|             error: function (e) { | ||||
|                 DisplayWSMessage("error", "There was an error getting tooltype info.", e); | ||||
|                 DisplayWSMessage("error", "There was an error getting EvenReactor info.", e); | ||||
|             } | ||||
|         }); | ||||
| 
 | ||||
| @ -130,21 +100,20 @@ | ||||
|         $("#DetailsDiv").prop("hidden", false); | ||||
| 
 | ||||
|         $("#ExportDiv").prop("hidden", true); | ||||
|         if ((toolType != null) && (toolType.OIExportSPName != null) && (toolType.OIExportSPName.length > 0)) { | ||||
|         if ((EvenReactor != null) && (EvenReactor.OIExportSPName != null) && (EvenReactor.OIExportSPName.length > 0)) { | ||||
|             $("#ExportDiv").prop("hidden", false); | ||||
|             $("#OIExportButton").prop("disabled", false); | ||||
|             $("#OIExportResult").text(''); | ||||
|         } | ||||
| 
 | ||||
|         $("#DataAttachmentFrame").prop("hidden", true); | ||||
|         $("#HeaderAttachmentFrame").prop("hidden", true); | ||||
|         if (toolType != null) { | ||||
|         if (EvenReactor != null) { | ||||
|             var visibleFrames = 0; | ||||
|             if (toolType.DisplayDataAttachment && toolType.DisplayDataAttachment.length > 0) { | ||||
|             if (EvenReactor.DisplayDataAttachment && EvenReactor.DisplayDataAttachment.length > 0) { | ||||
|                 visibleFrames += 1; | ||||
|                 $("#DataAttachmentFrame").prop("hidden", false); | ||||
|             } | ||||
|             if (toolType.DisplayHeaderAttachment && toolType.DisplayHeaderAttachment.length > 0) { | ||||
|             if (EvenReactor.DisplayHeaderAttachment && EvenReactor.DisplayHeaderAttachment.length > 0) { | ||||
|                 visibleFrames += 1; | ||||
|                 $("#HeaderAttachmentFrame").prop("hidden", false); | ||||
|             } | ||||
| @ -167,6 +136,8 @@ | ||||
|             $("#HeaderId").text(ui.row.id); | ||||
|             var rowData = ui.owner.grid.dataSource.dataView()[ui.row.index]; | ||||
|             $("#HeaderAttachmentId").text(rowData.AttachmentID); | ||||
|             $("#HeaderDate").text(rowData.Date); | ||||
|             $("#SPHeaderID").text(rowData.Title); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| @ -180,73 +151,65 @@ | ||||
| 
 | ||||
|         if (ui.row.index >= 0) { | ||||
|             var rowData = ui.owner.grid.dataSource.dataView()[ui.row.index]; | ||||
|             var toolTypeID = $("#ToolTypeID").text(); | ||||
|             var attachmentUrlBase = '@Url.Content("~/api/tooltypes/")' + toolTypeID; | ||||
|             var EvenReactorID = $("#EvenReactorID").text(); | ||||
|             var attachmentUrlBase = '@Url.Content("~/api/EvenReactors/")' + EvenReactorID; | ||||
|             var attachmentId = rowData.AttachmentID; | ||||
| 
 | ||||
|             var test = rowData.date | ||||
|             if ((attachmentId == null) || (attachmentId === '')) | ||||
|                 return; | ||||
| 
 | ||||
|             if ((toolType.DisplayDataAttachment == null) || (toolType.DisplayDataAttachment === '')) | ||||
|             if ((EvenReactor.DisplayDataAttachment == null) || (EvenReactor.DisplayDataAttachment === '')) | ||||
|                 return; | ||||
| 
 | ||||
|             $("#DataAttachmentFrame").prop("src", attachmentUrlBase + "/data/files/" + attachmentId + "/" + toolType.DisplayDataAttachment); | ||||
| 
 | ||||
|             $("#DataAttachmentFrame").prop("src", attachmentUrlBase + "/data/files/" + attachmentId + "/" + EvenReactor.DisplayDataAttachment); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     function LoadHeaderAttachment() { | ||||
|         var toolTypeID = $("#ToolTypeID").text(); | ||||
|         var EvenReactorID = $("#EvenReactorID").text(); | ||||
|         var attachmentUrlBase = '@Url.Content("~/api/EvenReactors/")' + EvenReactorID; | ||||
|         var attachmentId = $("#HeaderAttachmentId").text(); | ||||
|         var attachmentUrlBase = '@Url.Content("~/api/tooltypes/")' + toolTypeID; | ||||
|         if ((attachmentId == null) || (attachmentId === '') || (toolType.DisplayHeaderAttachment == null) || (toolType.DisplayHeaderAttachment === '')) { | ||||
|         var dateToUse = new Date($("#HeaderDate").text()); | ||||
|         var month = dateToUse.getMonth + 1; | ||||
|         var year = dateToUse.getFullYear; | ||||
|         if ((attachmentId == null) || (attachmentId === '') || (EvenReactor.DisplayHeaderAttachment == null) || (EvenReactor.DisplayHeaderAttachment === '')) { | ||||
|             $("#HeaderAttachmentFrame").prop("src", ""); | ||||
|         } else { | ||||
|             $("#HeaderAttachmentFrame").prop("src", attachmentUrlBase + "/header/files/" + attachmentId + "/" + toolType.DisplayHeaderAttachment); | ||||
|             $("#HeaderAttachmentFrame").prop("src", attachmentUrlBase + "/header/files/" + attachmentId + "/" + EvenReactor.DisplayHeaderAttachment + "?date=" + dateToUse); | ||||
|         } | ||||
| 
 | ||||
|         $("#DataAttachmentFrame").prop("src", ""); | ||||
|     } | ||||
| 
 | ||||
|     function MarkAsReviewed() { | ||||
| 
 | ||||
|         var toolTypeId = $("#ToolTypeID").text(); | ||||
|         var headerId = $("#HeaderId").text(); | ||||
| 
 | ||||
|         $.ajax({ | ||||
|             type: "POST", | ||||
|             url: "@Url.Content("~/api/awaitingdispo/markasreviewed")?tooltypeid=" + toolTypeId + "&headerid=" + headerId, | ||||
|             success: function () { | ||||
|             }, | ||||
|             error: function (e, ajaxOptions, ex) { | ||||
|                 DisplayWSMessage("error", "There was an error marking header as reviewed.", e, ex); | ||||
|                 $("#ReviewButton").prop("disabled", false); | ||||
|             } | ||||
|         }); | ||||
|     function CheckDate() { | ||||
|         var date = new Date($("#HeaderDate").text()); | ||||
|         return date; | ||||
|     } | ||||
| 
 | ||||
|     function LoadDetails() { | ||||
| 
 | ||||
|         ShowDetailsDiv(); | ||||
| 
 | ||||
|         LoadHeaderAttachment(); | ||||
| 
 | ||||
|         var dateToUse = $("#HeaderDate").text(); | ||||
|         var gridCreated = $("#DetailsGrid").data("igGrid"); | ||||
|         if (gridCreated) | ||||
|             $("#DetailsGrid").igGrid("destroy"); | ||||
| 
 | ||||
|         var dateID = Date.parse($("#HeaderDate").text()); | ||||
|         var cutoffDt = Date.parse('2019-07-08') | ||||
|         var headerId = $("#HeaderId").text(); | ||||
|         var toolTypeID = $("#ToolTypeID").text(); | ||||
| 
 | ||||
|         var detailsURL = "@Url.Content("~/api/tooltypes/")" + toolTypeID + "/headers/" + headerId + "/data"; | ||||
| 
 | ||||
|         var EvenReactorID = $("#EvenReactorID").text(); | ||||
|         var spHeaderID = $("#SPHeaderID").text(); | ||||
|         if (dateID < cutoffDt) { | ||||
|             detailsURL = "@Url.Content("~/api/EvenReactors/")" + EvenReactorID + "/headers/" + spHeaderID + "/data/isSharePoint"; | ||||
|         } | ||||
|         else { | ||||
|             var detailsURL = "@Url.Content("~/api/EvenReactors/")" + EvenReactorID + "/headers/" + headerId + "/data"; | ||||
|         } | ||||
|         var gridColumns = [ | ||||
|             { key: "AttachmentID", dataType: "string", hidden: true }, | ||||
|             { key: "Title", dataType: "string", hidden: true }, | ||||
|         ]; | ||||
| 
 | ||||
|         for (var i = 0; i < toolTypeMetaData.length; i++) { | ||||
|             var f = toolTypeMetaData[i]; | ||||
|         for (var i = 0; i < EvenReactorMetaData.length; i++) { | ||||
|             var f = EvenReactorMetaData[i]; | ||||
|             if ((f.Header == false) && (f.GridDisplayOrder > 0)) { | ||||
|                 var col = { | ||||
|                     key: f.ColumnName, | ||||
| @ -264,6 +227,7 @@ | ||||
|                 gridColumns.push(col); | ||||
|             } | ||||
|         } | ||||
|         var date = EvenReactorMetaData[2]; | ||||
| 
 | ||||
|         var gridParms = { | ||||
|             autoGenerateColumns: false, | ||||
| @ -275,13 +239,11 @@ | ||||
|             ], | ||||
|             columns: gridColumns, | ||||
|             dataSource: detailsURL, | ||||
|             responseDataKey: "Results", | ||||
|             dataBound: MarkAsReviewed, | ||||
| 
 | ||||
|             responseDataKey: "Results" | ||||
|         }; | ||||
| 
 | ||||
|         if ((toolType != null) && (toolType.DataGridAttributes != null)) { | ||||
|             jQuery.extend(gridParms, JSON.parse(toolType.DataGridAttributes)); | ||||
|         if ((EvenReactor != null) && (EvenReactor.DataGridAttributes != null)) { | ||||
|             jQuery.extend(gridParms, JSON.parse(EvenReactor.DataGridAttributes)); | ||||
|         } | ||||
| 
 | ||||
|         $("#DetailsGrid").igGrid(gridParms); | ||||
| @ -315,7 +277,7 @@ | ||||
|             initialHeaderId = -1; | ||||
|         } | ||||
| 
 | ||||
|         var headerURL = "@Url.Content("~/api/tooltypes/")" + toolType.ID + "/headers?" + $.param(parms); | ||||
|         var headerURL = "@Url.Content("~/api/EvenReactors/")" + EvenReactor.ID + "/headers?" + $.param(parms); | ||||
| 
 | ||||
|         var gridColumns = [ | ||||
|             { key: "ID", dataType: "number", hidden: true }, | ||||
| @ -323,8 +285,8 @@ | ||||
|             { key: "Title", dataType: "string", hidden: true }, | ||||
|         ]; | ||||
| 
 | ||||
|         for (var i = 0; i < toolTypeMetaData.length; i++) { | ||||
|             var f = toolTypeMetaData[i]; | ||||
|         for (var i = 0; i < EvenReactorMetaData.length; i++) { | ||||
|             var f = EvenReactorMetaData[i]; | ||||
|             if ((f.Header == true) && (f.GridDisplayOrder > 0)) { | ||||
|                 var col = { | ||||
|                     key: f.ColumnName, | ||||
| @ -360,123 +322,56 @@ | ||||
|             responseDataKey: "Results", | ||||
|         }; | ||||
| 
 | ||||
|         if ((toolType != null) && (toolType.HeaderGridAttributes != null)) { | ||||
|             jQuery.extend(gridParms, JSON.parse(toolType.HeaderGridAttributes)); | ||||
|         if ((EvenReactor != null) && (EvenReactor.RunGridAttributes != null)) { | ||||
|             jQuery.extend(gridParms, JSON.parse(EvenReactor.RunGridAttributes)); | ||||
|         } | ||||
| 
 | ||||
|         $("#HeaderGrid").igGrid(gridParms); | ||||
|         $("#RunGrid").igGrid(gridParms); | ||||
| 
 | ||||
|         if (headerId > 0) { | ||||
|             LoadDetails(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     function ReviewButton() { | ||||
| 
 | ||||
|         var toolTypeId = $("#ToolTypeID").text(); | ||||
|         var headerId = parseInt($("#HeaderId").text()); | ||||
| 
 | ||||
|         $("#ReviewButton").prop("disabled", true); | ||||
|         $.ajax({ | ||||
|             type: "POST", | ||||
|             url: "@Url.Content("~/api/awaitingdispo/markasawaiting")?tooltypeid=" + toolTypeId + "&headerid=" + headerId, | ||||
|             success: function (e) { | ||||
|                 DisplayWSMessage("info", "Marked as awaiting disposition", e); | ||||
|                 $("#ReviewButton").prop("disabled", false); | ||||
|             }, | ||||
|             error: function (e, ajaxOptions, ex) { | ||||
|                 DisplayWSMessage("error", "There was an error marking header as awaiting disposition.", e, ex); | ||||
|                 $("#ReviewButton").prop("disabled", false); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     function OIExportButton() { | ||||
| 
 | ||||
|         var headerId = $("#HeaderId").text(); | ||||
|         var toolTypeID = $("#ToolTypeID").text(); | ||||
| 
 | ||||
|         $("#OIExportButton").prop("disabled", true); | ||||
| 
 | ||||
|         $.ajax({ | ||||
|             type: "POST", | ||||
|             url: "@Url.Content("~/api/tooltypes/")" + toolTypeID + "/headers/" + headerId + "/oiexport", | ||||
|             success: function (r) { | ||||
|                 $("#OIExportResult").text("Exported!"); | ||||
|             }, | ||||
|             error: function (e, ajaxOptions, ex) { | ||||
|                 DisplayWSMessage("error", "There was an error exporting.", e, ex); | ||||
|                 $("#OIExportButton").prop("disabled", false); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     function SetInitialDateTimes() { | ||||
| 
 | ||||
|         var startTime = new Date(Date.now() - 6 * 60 * 60 * 1000);//6 hours back from now | ||||
| 
 | ||||
|         $("#StartDate").igDatePicker({ | ||||
|             dateInputFormat: "date", | ||||
|             value: startTime, | ||||
|             width: 125 | ||||
|         }); | ||||
| 
 | ||||
|         $("#StartTime").igTimePicker({ | ||||
|             dateInputFormat: "time", | ||||
|             value: startTime, | ||||
|             width: 110 | ||||
|         }); | ||||
| 
 | ||||
|         var endTime = new Date(Date.now()); | ||||
| 
 | ||||
|         $("#EndDate").igDatePicker({ | ||||
|             dateInputFormat: "date", | ||||
|             value: endTime, | ||||
|             width: 125 | ||||
|         }); | ||||
| 
 | ||||
|         $("#EndTime").igTimePicker({ | ||||
|             dateInputFormat: "time", | ||||
|             value: endTime, | ||||
|             width: 110 | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     $(document).ready(function () { | ||||
| 
 | ||||
|         $("#ToolType").igCombo({ | ||||
|             dataSource: '@Url.Content("~/api/tooltypes")', | ||||
|         $("#EvenReactor").igCombo({ | ||||
|             dataSource: '@Url.Content("~/api/reactors/true")', | ||||
|             responseDataKey: "Results", | ||||
|             textKey: "ToolTypeName", | ||||
|             valueKey: "ID", | ||||
|             textKey: "Name", | ||||
|             valueKey: "Id", | ||||
|             mode: "dropdown", | ||||
|             width: 150, | ||||
|             itemsRendered: function (evt, ui) { | ||||
|                 LoadHeaderGrid(); | ||||
|                 LoadRunGrid(); | ||||
|             }, | ||||
|             selectionChanged: LoadHeaderGrid, | ||||
|             initialSelectedItems: [{ value: @Model.ToolTypeID }] | ||||
|             selectionChanged: LoadRunGrid, | ||||
|             initialSelectedItems: [{ value: @Model.HeaderID }] | ||||
|         }); | ||||
| 
 | ||||
|         SetInitialDateTimes(); | ||||
|         $("#OddReactor").igCombo({ | ||||
|             dataSource: '@Url.Content("~/api/reactors/false")', | ||||
|             responseDataKey: "Results", | ||||
|             textKey: "Name", | ||||
|             valueKey: "Id", | ||||
|             mode: "dropdown", | ||||
|             width: 150, | ||||
|             itemsRendered: function (evt, ui) { | ||||
|                 LoadRunGrid(); | ||||
|             }, | ||||
|             selectionChanged: LoadRunGrid, | ||||
|             initialSelectedItems: [{ value: @Model.HeaderID }] | ||||
|         }); | ||||
| 
 | ||||
|         $("#HeaderGrid").on("dblclick", "tr", LoadDetails); | ||||
|         $("#EvenReactorDiv").prop("hidden", true); | ||||
|         $("#OddReactorDiv").prop("hidden", true); | ||||
| 
 | ||||
|         $("#LoadHeadersButton").click(LoadHeaderGrid); | ||||
|         $("#RunGrid").on("dblclick", "tr", LoadDetails); | ||||
| 
 | ||||
|         $("#LoadRunsButton").click(LoadRunGrid); | ||||
| 
 | ||||
|         $("#GetDataButton").click(LoadDetails); | ||||
| 
 | ||||
|         $("#ReviewButton").click(ReviewButton); | ||||
| 
 | ||||
|         $("#OIExportButton").click(OIExportButton); | ||||
| 
 | ||||
|         setInterval(function () { | ||||
|             if ($("#chkAutoRefresh").is(':checked')) { | ||||
|                 SetInitialDateTimes(); | ||||
|                 $("#LoadHeadersButton").click(); | ||||
|             } | ||||
|         }, 180000); | ||||
| 
 | ||||
|     }); | ||||
| 
 | ||||
| </script> | ||||
							
								
								
									
										266
									
								
								Jenkinsfile
									
									
									
									
										vendored
									
									
								
							
							
						
						| @ -1,266 +0,0 @@ | ||||
| #!/usr/bin/env groovy | ||||
| /* groovylint-disable CompileStatic, ConsecutiveStringConcatenation, DuplicateNumberLiteral, DuplicateStringLiteral, LineLength, NestedBlockDepth, NoDef, VariableTypeRequired */ | ||||
| import groovy.transform.Field | ||||
|  | ||||
| @Field String _DDrive = 'D:/' | ||||
| @Field String _ExePath = '...' | ||||
| @Field String _NGINXFile = '...' | ||||
| @Field String _PortNumber = '...' | ||||
| @Field String _AssemblyName = '...' | ||||
| @Field String _AgentDevelopment = '' | ||||
| @Field String _NetVersion = 'net6.0' | ||||
| @Field String _GitCommitSeven = '...' | ||||
| @Field String _TargetLocation = '...' | ||||
| @Field String _FirstBeforePlus = '5000' | ||||
| @Field String _GitName = 'OI-Metrology' | ||||
| @Field String _MonARessource = 'OI_Metrology' | ||||
| @Field String _WorkingDirectoryName = 'IFXApps' | ||||
| @Field String _DDriveNet = "${_DDrive}${_NetVersion}" | ||||
| @Field String _AgentStaging = 'messa010ec-ecfisysadmin' | ||||
| @Field String _AgentProduction = 'messa010ec-ecfisysadmin' | ||||
| @Field String _CredentialsId = 'Metrology-Username-Password' | ||||
| @Field String _Company = 'Infineon Technologies Americas Corp.' | ||||
| @Field String _ProgramFilesDotnet = 'C:/program files/dotnet/dotnet.exe' | ||||
|  | ||||
| pipeline { | ||||
|     agent { | ||||
|         label env.JENKINS_ENVIRONMENT == 'Development' ? _AgentDevelopment : env.JENKINS_ENVIRONMENT == 'Staging' ? _AgentStaging : env.JENKINS_ENVIRONMENT == 'Production' ? _AgentProduction : 'Else' | ||||
|     } | ||||
|     parameters { | ||||
|         string(name: 'MONA_SUFFIX', defaultValue: env.JENKINS_ENVIRONMENT == 'Development' ? '_IFX' : '_EC', description: 'MonA Suffix') | ||||
|         string(name: 'GIT_SERVER', defaultValue: env.JENKINS_ENVIRONMENT == 'Development' ? 'mestsa003.infineon.com' : 'mestsa07ec.ec.local', description: 'git server') | ||||
|         string(name: 'DEFAULT_FILE_SERVER', defaultValue: env.JENKINS_ENVIRONMENT == 'Development' ? 'messv02ecc1_ec_local' : 'messv02ecc1.ec.local', description: 'Default file server...') | ||||
|         string(name: 'PROJECT_DIRECTORY', defaultValue: 'Archive', description: 'Archive|Viewer') | ||||
|     } | ||||
|     stages { | ||||
|         // stage('Git') { | ||||
|         //     steps { | ||||
|         //         bat(returnStatus: true, script: 'git init') | ||||
|         //         bat(returnStatus: true, script: 'git remote add origin \\\\' + params.GIT_SERVER + '\\Git\\' + _GitName + '.git') | ||||
|         //         bat(returnStatus: true, script: 'git pull origin master') | ||||
|         //     } | ||||
|         // } | ||||
|         stage('Setup') { | ||||
|             steps { | ||||
|                 script { | ||||
|                     _AssemblyName = "${env.JOB_NAME}-${env.PROJECT_DIRECTORY}" | ||||
|                     // _GitCommitSeven = '1234567' | ||||
|                     _GitCommitSeven = env.GIT_COMMIT.substring(0, 7) | ||||
|                     dir(env.PROJECT_DIRECTORY) { | ||||
|                         def files = findFiles(glob: '*.csproj') | ||||
|                         if (files.length != 1) { | ||||
|                             error("Build failed because couldn't find a *.csproj file") | ||||
|                         } | ||||
|                         echo """ | ||||
|                             ${files[0].name} | ||||
|                             ${files[0].path} | ||||
|                             ${files[0].directory} | ||||
|                             ${files[0].length} | ||||
|                             ${files[0].lastModified} | ||||
|                             """ | ||||
|                         _AssemblyName = files[0].name.split('[.]csproj')[0] | ||||
|                     } | ||||
|                     _TargetLocation = "\\\\${params.DEFAULT_FILE_SERVER}\\EC_EAFRepository\\${env.JENKINS_ENVIRONMENT}\\DeploymentStorage\\Adaptation_${_AssemblyName}" | ||||
|                     withCredentials([usernamePassword(credentialsId: _CredentialsId, passwordVariable: 'password', usernameVariable: 'username')]) { | ||||
|                         dir("C:/Users/${username}/AppData/Local/IFXApps/nginx-1.20.1/conf/includes") { | ||||
|                             _NGINXFile = "C:/Users/${username}/AppData/Local/IFXApps/nginx-1.20.1/conf/includes/${_AssemblyName}.conf" | ||||
|                             def files = findFiles(glob: "${_AssemblyName}.conf") | ||||
|                             if (files.length != 1) { | ||||
|                                 writeFile(file: _NGINXFile, text: "location / { proxy_pass http://localhost:${_FirstBeforePlus}; }") | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         stage('Read NGINX') { | ||||
|             steps { | ||||
|                 script { | ||||
|                     String text = readFile(file: _NGINXFile) | ||||
|                     String check = text == null ? _FirstBeforePlus : text.split(';')[0] | ||||
|                     String[] segments = check.split(':') | ||||
|                     if (segments.length != 3) { | ||||
|                         _PortNumber = check | ||||
|                     } | ||||
|                     else { | ||||
|                         _PortNumber = (segments[2].toInteger() + 2).toString() | ||||
|                     } | ||||
|                     _ExePath = "${_DDriveNet}/${_GitCommitSeven}-${env.BUILD_NUMBER}-${_PortNumber}-${env.JOB_NAME}-${env.PROJECT_DIRECTORY}/${_AssemblyName}.exe" | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         stage('Info') { | ||||
|             steps { | ||||
|                 // echo "GIT_URL_N - ${env.GIT_URL_N}" | ||||
|                 // echo "BRANCH_NAME ${env.BRANCH_NAME}" | ||||
|                 // echo "DEPLOY_VERSION ${env.DEPLOY_VERSION}" | ||||
|                 // echo "GIT_AUTHOR_NAME ${env.GIT_AUTHOR_NAME}" | ||||
|                 // echo "GIT_LOCAL_BRANCH ${env.GIT_LOCAL_BRANCH}" | ||||
|                 // echo "GIT_COMMITTER_EMAIL ${env.GIT_COMMITTER_EMAIL}" | ||||
|                 // echo "GIT_PREVIOUS_COMMIT ${env.GIT_PREVIOUS_COMMIT}" | ||||
|                 // echo "GIT_PREVIOUS_SUCCESSFUL_COMMIT ${env.GIT_PREVIOUS_SUCCESSFUL_COMMIT}" | ||||
|                 echo "_AssemblyName ${_AssemblyName}" // ... | ||||
|                 echo "_ExePath ${_ExePath}" // ... | ||||
|                 echo "_PortNumber ${_PortNumber}" // ... | ||||
|                 echo "BUILD_NUMBER ${env.BUILD_NUMBER}" // 11 | ||||
|                 echo "DEFAULT_FILE_SERVER ${params.DEFAULT_FILE_SERVER}" // 11 | ||||
|                 echo "GIT_BRANCH ${env.GIT_BRANCH}" // origin/master | ||||
|                 echo "GIT_COMMIT ${env.GIT_COMMIT}" // 73b814069f2cf0173a62a8228815a9bc9ba93c41 | ||||
|                 echo "GIT_SERVER ${params.GIT_SERVER}" // ... | ||||
|                 echo "GIT_URL ${env.GIT_URL}" // D:\ProgramData\Git\....git | ||||
|                 echo "JENKINS_ENVIRONMENT ${env.JENKINS_ENVIRONMENT}" // 11 | ||||
|                 echo "JENKINS_URL ${env.JENKINS_URL}" // http://localhost:8080/ | ||||
|                 echo "JOB_NAME ${env.JOB_NAME}" // ... | ||||
|                 echo "PROJECT_DIRECTORY ${env.PROJECT_DIRECTORY}" // ... | ||||
|                 echo "WORKSPACE ${env.WORKSPACE}" // D:\.jenkins\_\... | ||||
|             } | ||||
|         } | ||||
|         // stage('Restore') { | ||||
|         //     steps { | ||||
|         //         bat(returnStatus: true, script: 'dotnet --info') | ||||
|         //     } | ||||
|         // } | ||||
|         stage('Safe storage of app secrets') { | ||||
|             steps { | ||||
|                 withCredentials([usernamePassword(credentialsId: _CredentialsId, passwordVariable: 'password', usernameVariable: 'username')]) { | ||||
|                     dir(env.PROJECT_DIRECTORY) { | ||||
|                         bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + | ||||
|                             'user-secrets init') | ||||
|                         bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + | ||||
|                             'user-secrets set "Company" "' + _Company + '"') | ||||
|                         bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + | ||||
|                             'user-secrets set "ServiceUser" "' + username + '"') | ||||
|                         bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + | ||||
|                             'user-secrets set "BuildNumber" "' + env.BUILD_NUMBER + '"') | ||||
|                         bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + | ||||
|                             'user-secrets set "GitCommitSeven" "' + _GitCommitSeven + '"') | ||||
|                         bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + | ||||
|                             'user-secrets set "Server" "' + params.DEFAULT_FILE_SERVER + '"') | ||||
|                         bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + | ||||
|                             'user-secrets set "URLs" "' + 'http://localhost:' + _PortNumber) | ||||
|                         bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + | ||||
|                             'user-secrets set "WorkingDirectoryName" "' + _WorkingDirectoryName + '"') | ||||
|                         bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + | ||||
|                             'user-secrets set "MonARessource" "' + _MonARessource + '_' + env.PROJECT_DIRECTORY + env.MONA_SUFFIX + '"') | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         // stage('Core Build (packagemanagement.eu.infineon.com)') { | ||||
|         //     steps { | ||||
|         //         echo "Build number is ${currentBuild.number}" | ||||
|         //         dir(env.PROJECT_DIRECTORY) { | ||||
|         //             bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + | ||||
|         //                 'build --runtime win-x64 --self-contained --verbosity quiet --source ' + | ||||
|         //                 'https://packagemanagement.eu.infineon.com:4430/api/v2/') | ||||
|         //         } | ||||
|         //     } | ||||
|         // } | ||||
|         stage('Core Build') { | ||||
|             steps { | ||||
|                 echo "Build number is ${currentBuild.number}" | ||||
|                 dir(env.PROJECT_DIRECTORY) { | ||||
|                     bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + | ||||
|                         'build --runtime win-x64 --self-contained --verbosity quiet') | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         stage('Commit Id') { | ||||
|             steps { | ||||
|                 dir(env.PROJECT_DIRECTORY) { | ||||
|                     writeFile(file: 'bin/Debug/' + _NetVersion + "/win-x64/${env.GIT_COMMIT}-${env.BUILD_NUMBER}.txt", text: "${env.GIT_URL}") | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         // stage('Test') { | ||||
|         //     options { | ||||
|         //         timeout(time: 10, unit: 'MINUTES') | ||||
|         //     } | ||||
|         //     steps { | ||||
|         //         dir(env.PROJECT_DIRECTORY) { | ||||
|         //             bat('dotnet --info') | ||||
|         //         } | ||||
|         //     } | ||||
|         // } | ||||
|         // stage('Version') { | ||||
|         //     steps { | ||||
|         //         bat('dotnet --info') | ||||
|         //     } | ||||
|         // } | ||||
|         stage('Package') { | ||||
|             steps { | ||||
|                 dir(env.PROJECT_DIRECTORY) { | ||||
|                     fileOperations([fileZipOperation(folderPath: 'bin/Debug/' + _NetVersion + '/win-x64', outputFolderPath: "${_DDriveNet}/${_GitCommitSeven}-${env.BUILD_NUMBER}-${_PortNumber}-${env.JOB_NAME}-${env.PROJECT_DIRECTORY}-Debug")]) | ||||
|                     fileOperations([fileCopyOperation(excludes: '', flattenFiles: true, includes: "${_AssemblyName}*", renameFiles: false, sourceCaptureExpression: '', targetLocation: "${_DDriveNet}/${_GitCommitSeven}-${env.BUILD_NUMBER}-${_PortNumber}-${env.JOB_NAME}-${env.PROJECT_DIRECTORY}-Debug", targetNameExpression: '')]) | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         stage('Publish') { | ||||
|             steps { | ||||
|                 dir(env.PROJECT_DIRECTORY) { | ||||
|                     bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' + | ||||
|                         'publish --configuration Release --runtime win-x64 --verbosity quiet ' + | ||||
|                         "--self-contained true --p:Version=6.0.202-${_GitCommitSeven}-${env.BUILD_NUMBER} -o " + | ||||
|                         '"' + "${_DDriveNet}/${_GitCommitSeven}-${env.BUILD_NUMBER}-${_PortNumber}-${env.JOB_NAME}-${env.PROJECT_DIRECTORY}" + '"') | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         stage('Service') { | ||||
|             steps { | ||||
|                 withCredentials([usernamePassword(credentialsId: _CredentialsId, passwordVariable: 'password', usernameVariable: 'username')]) { | ||||
|                     bat(returnStatus: true, script: 'sc create "' + "${env.JOB_NAME}-${env.PROJECT_DIRECTORY}-${_PortNumber}" + '" ' + | ||||
|                         'start= delayed-auto DisplayName="' + "${env.JOB_NAME}-${env.PROJECT_DIRECTORY}-${_PortNumber}" + '" ' + | ||||
|                         'binPath= "' + _ExePath + '" ' + | ||||
|                         'obj= "' + "${env.USERDOMAIN}\\${username}" + '" password= "' + password + '"') | ||||
|                     bat(returnStatus: true, script: 'sc start "' + "${env.JOB_NAME}-${env.PROJECT_DIRECTORY}-${_PortNumber}" + '"') | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         stage('Upadate NGINX') { | ||||
|             steps { | ||||
|                 writeFile(file: _NGINXFile, text: "location / { proxy_pass http://localhost:${_PortNumber}; }") | ||||
|             } | ||||
|         } | ||||
|         stage('NGINX Test and Reload') { | ||||
|             steps { | ||||
|                 withCredentials([usernamePassword(credentialsId: _CredentialsId, passwordVariable: 'password', usernameVariable: 'username')]) { | ||||
|                     dir("C:/Users/${username}/AppData/Local/IFXApps/nginx-1.20.1") { | ||||
|                         script { | ||||
|                             int returnStatus = bat(returnStatus: true, script: 'nginx.exe -t') | ||||
|                             println("returnStatus ################ ${returnStatus} ####################") | ||||
|                             if (returnStatus == 0) { | ||||
|                                 bat(returnStatus: true, script: 'nginx.exe -s reload') | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         // stage('Force Fail') { | ||||
|         //     steps { | ||||
|         //         error("Build failed because of this and that..") | ||||
|         //     } | ||||
|         // } | ||||
|         // stage('Copy Files to: file-share') { | ||||
|         //     steps { | ||||
|         //         dir(env.PROJECT_DIRECTORY + '/bin/Debug/' + _NetVersion + '/win-x64') { | ||||
|         //             fileOperations([fileCopyOperation(excludes: '', flattenFiles: true, includes: "${_AssemblyName}*.txt", renameFiles: false, sourceCaptureExpression: '', targetLocation: _TargetLocation, targetNameExpression: '')]) | ||||
|         //             fileOperations([fileCopyOperation(excludes: '', flattenFiles: true, includes: "${_AssemblyName}*.dll", renameFiles: false, sourceCaptureExpression: '', targetLocation: _TargetLocation, targetNameExpression: '')]) | ||||
|         //             fileOperations([fileCopyOperation(excludes: '', flattenFiles: true, includes: "${_AssemblyName}*.exe", renameFiles: false, sourceCaptureExpression: '', targetLocation: _TargetLocation, targetNameExpression: '')]) | ||||
|         //             fileOperations([fileCopyOperation(excludes: '', flattenFiles: true, includes: "${_AssemblyName}*.pdb", renameFiles: false, sourceCaptureExpression: '', targetLocation: _TargetLocation, targetNameExpression: '')]) | ||||
|         //         } | ||||
|         //     } | ||||
|         // } | ||||
|     } | ||||
|     post { | ||||
|         always { | ||||
|             dir(env.PROJECT_DIRECTORY + '/bin') { | ||||
|                 deleteDir() | ||||
|             } | ||||
|             dir(env.PROJECT_DIRECTORY + '/obj') { | ||||
|                 deleteDir() | ||||
|             } | ||||
|             cleanWs() | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -3,13 +3,13 @@ Microsoft Visual Studio Solution File, Format Version 12.00 | ||||
| # Visual Studio Version 16 | ||||
| VisualStudioVersion = 16.0.30114.105 | ||||
| MinimumVisualStudioVersion = 10.0.40219.1 | ||||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Archive", "Archive\Archive.csproj", "{D02BA20E-0ACE-4D1C-9132-90773AF3CF5A}" | ||||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Archive", "Archive\OI.Metrology.Archive.csproj", "{D02BA20E-0ACE-4D1C-9132-90773AF3CF5A}" | ||||
| EndProject | ||||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Shared", "Shared\Shared.csproj", "{A807EAE3-7DCB-4E5E-BE54-0D7410D18B3E}" | ||||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Shared", "Shared\OI.Metrology.Shared.csproj", "{A807EAE3-7DCB-4E5E-BE54-0D7410D18B3E}" | ||||
| EndProject | ||||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Viewer", "Viewer\Viewer.csproj", "{25C86DF8-EC1A-4D4B-AD4E-6561174824B9}" | ||||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Server", "Server\OI.Metrology.Server.csproj", "{25C86DF8-EC1A-4D4B-AD4E-6561174824B9}" | ||||
| EndProject | ||||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests", "Tests\Tests.csproj", "{B67FB8C4-402E-4D53-90A6-90F6FDB9D082}" | ||||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests", "Tests\OI.Metrology.Tests.csproj", "{B67FB8C4-402E-4D53-90A6-90F6FDB9D082}" | ||||
| EndProject | ||||
| Global | ||||
| 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||
|  | ||||
| @ -10,14 +10,15 @@ | ||||
|             "request": "launch", | ||||
|             "preLaunchTask": "build", | ||||
|             // If you have changed target frameworks, make sure to update the program path. | ||||
|             "program": "${workspaceFolder}/bin/Debug/net6.0/win-x64/Archive.dll", | ||||
|             "program": "${workspaceFolder}/bin/Debug/net7.0/win-x64/OI.Metrology.Server.dll", | ||||
|             "args": [], | ||||
|             "cwd": "${workspaceFolder}", | ||||
|             "stopAtEntry": false, | ||||
|             // Enable launching a web browser when ASP.NET Core starts. For more information: https://aka.ms/VSCode-CS-LaunchJson-WebBrowser | ||||
|             "serverReadyAction": { | ||||
|                 "action": "openExternally", | ||||
|                 "pattern": "\\bNow listening on:\\s+(https?://\\S+)" | ||||
|                 "pattern": "\\bNow listening on:\\s+(https?://\\S+)", | ||||
|                 "uriFormat": "%s/swagger/index.html" | ||||
|             }, | ||||
|             "env": { | ||||
|                 "ASPNETCORE_ENVIRONMENT": "Development" | ||||
| @ -30,7 +31,8 @@ | ||||
|             "name": ".NET Core Attach", | ||||
|             "type": "coreclr", | ||||
|             "request": "attach", | ||||
|             "processName": "Archive" | ||||
|             "preLaunchTask": "watch", | ||||
|             "processName": "OI.Metrology.Server.exe" | ||||
|         } | ||||
|     ] | ||||
| } | ||||
							
								
								
									
										75
									
								
								Server/.vscode/tasks.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,75 @@ | ||||
| { | ||||
|     "version": "2.0.0", | ||||
|     "tasks": [ | ||||
|         { | ||||
|             "label": "build", | ||||
|             "command": "dotnet", | ||||
|             "type": "process", | ||||
|             "args": [ | ||||
|                 "build", | ||||
|                 "${workspaceFolder}/OI.Metrology.Server.csproj", | ||||
|                 "/property:GenerateFullPaths=true", | ||||
|                 "/consoleloggerparameters:NoSummary" | ||||
|             ], | ||||
|             "problemMatcher": "$msCompile" | ||||
|         }, | ||||
|         { | ||||
|             "label": "publish", | ||||
|             "command": "dotnet", | ||||
|             "type": "process", | ||||
|             "args": [ | ||||
|                 "publish", | ||||
|                 "${workspaceFolder}/OI.Metrology.Server.csproj", | ||||
|                 "/property:GenerateFullPaths=true", | ||||
|                 "/consoleloggerparameters:NoSummary" | ||||
|             ], | ||||
|             "problemMatcher": "$msCompile" | ||||
|         }, | ||||
|         { | ||||
|             "label": "old-watch", | ||||
|             "command": "dotnet", | ||||
|             "type": "process", | ||||
|             "args": [ | ||||
|                 "watch", | ||||
|                 "run", | ||||
|                 "--project", | ||||
|                 "${workspaceFolder}/OI.Metrology.Server.csproj" | ||||
|             ], | ||||
|             "problemMatcher": "$msCompile" | ||||
|         }, | ||||
|         { | ||||
|             "label": "watch", | ||||
|             "command": "dotnet", | ||||
|             "type": "process", | ||||
|             "args": [ | ||||
|                 "watch", | ||||
|                 "--launch-profile", | ||||
|                 "http", | ||||
|                 "run", | ||||
|                 "--project", | ||||
|                 "${workspaceFolder}/OI.Metrology.Server.csproj", | ||||
|                 "--verbose" | ||||
|             ], | ||||
|             "isBackground": true, | ||||
|             "dependsOn": [ | ||||
|                 "build" | ||||
|             ], | ||||
|             "problemMatcher": { | ||||
|                 "fileLocation": "relative", | ||||
|                 "pattern": { | ||||
|                     "regexp": "^([^\\s].*)\\((\\d+|\\d+,\\d+|\\d+,\\d+,\\d+,\\d+)\\):\\s+(error|warning|info)\\s+(TS\\d+)\\s*:\\s*(.*)$", | ||||
|                     "file": 1, | ||||
|                     "location": 2, | ||||
|                     "severity": 3, | ||||
|                     "code": 4, | ||||
|                     "message": 5 | ||||
|                 }, | ||||
|                 "background": { | ||||
|                     "activeOnStart": true, | ||||
|                     "beginsPattern": "^.*Shutdown requested.*", | ||||
|                     "endsPattern": "^.*Application started.*" | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     ] | ||||
| } | ||||
							
								
								
									
										23
									
								
								Server/ApiControllers/AppSettingsController.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,23 @@ | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
| using OI.Metrology.Shared.Models.Stateless; | ||||
|  | ||||
| namespace OI.Metrology.Server.ApiControllers; | ||||
|  | ||||
| [ApiController] | ||||
| [Route("api/[controller]")] | ||||
| public class AppSettingsController : ControllerBase, IAppSettingsController<ActionResult> | ||||
| { | ||||
|  | ||||
|     private readonly IAppSettingsRepository<Models.Binder.AppSettings> _AppSettingsRepository; | ||||
|  | ||||
|     public AppSettingsController(IAppSettingsRepository<Models.Binder.AppSettings> AppSettingsRepository) => _AppSettingsRepository = AppSettingsRepository; | ||||
|  | ||||
|     [HttpGet(nameof(IAppSettingsController<ActionResult>.Action.App))] | ||||
|     public ActionResult GetAppSettings() => | ||||
|         Ok(_AppSettingsRepository.GetAppSettings()); | ||||
|  | ||||
|     [HttpGet(nameof(IAppSettingsController<ActionResult>.Action.DevOps))] | ||||
|     public ActionResult GetBuildNumberAndGitCommitSeven() => | ||||
|          Ok(_AppSettingsRepository.GetBuildNumberAndGitCommitSeven()); | ||||
|  | ||||
| } | ||||
| @ -1,50 +1,39 @@ | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
| using OI.Metrology.Shared.DataModels; | ||||
| using OI.Metrology.Shared.Repositories; | ||||
| using OI.Metrology.Shared.Models.Stateless; | ||||
| using OI.Metrology.Shared.Services; | ||||
| using System; | ||||
| using System.IO; | ||||
| 
 | ||||
| namespace OI.Metrology.Viewer.ApiControllers; | ||||
| namespace OI.Metrology.Server.ApiControllers; | ||||
| 
 | ||||
| public class AttachmentsController : Controller | ||||
| { | ||||
|     private readonly IMetrologyRepo _Repo; | ||||
|     private readonly IAttachmentsService _AttachmentsService; | ||||
| 
 | ||||
|     public AttachmentsController(IMetrologyRepo repo, IAttachmentsService attachmentsService) | ||||
|     private readonly IAttachmentsService _AttachmentsService; | ||||
|     private readonly IMetrologyRepository _MetrologyRepository; | ||||
| 
 | ||||
|     public AttachmentsController(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService) | ||||
|     { | ||||
|         _Repo = repo; | ||||
|         _AttachmentsService = attachmentsService; | ||||
|         _MetrologyRepository = metrologyRepository; | ||||
|     } | ||||
| 
 | ||||
|     // this endpoint was created in hope that it would make retrieving attachments to display in OpenInsight easier | ||||
|     // url would be like /api/attachments/mercuryprobe/header/HgProbe_66-232268-4329_20180620052640032/data.pdf | ||||
| 
 | ||||
|     [HttpGet("/api/attachments/{toolTypeName}/{tabletype}/{title}/{filename}")] | ||||
|     public IActionResult GetAttachment( | ||||
|         string toolTypeName, | ||||
|         string tabletype, | ||||
|         string title, | ||||
|         string filename) | ||||
|     public IActionResult GetAttachment(string toolTypeName, string tabletype, string title, string filename) | ||||
|     { | ||||
|         ToolType tt = _Repo.GetToolTypeByName(toolTypeName); | ||||
| 
 | ||||
|         ToolType tt = _MetrologyRepository.GetToolTypeByName(toolTypeName); | ||||
|         bool header = !string.Equals(tabletype.Trim(), "data", StringComparison.OrdinalIgnoreCase); | ||||
| 
 | ||||
|         try | ||||
|         { | ||||
|             string contenttype = "application/pdf"; | ||||
|             if (filename.ToLower().TrimEnd().EndsWith(".txt")) | ||||
|                 contenttype = "text/plain"; | ||||
| 
 | ||||
|             Stream fs = _AttachmentsService.GetAttachmentStreamByTitle(tt, header, title, filename); | ||||
|             return File(fs, contenttype); | ||||
|         } | ||||
|         catch (Exception ex) | ||||
|         { | ||||
|             return Content(ex.Message); | ||||
|         } | ||||
| 
 | ||||
|         catch (Exception ex) { return Content(ex.Message); } | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -1,37 +1,31 @@ | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
| 
 | ||||
| namespace OI.Metrology.Viewer.ApiContollers; | ||||
| namespace OI.Metrology.Server.ApiControllers; | ||||
| 
 | ||||
| using OI.Metrology.Shared.Repositories; | ||||
| using OI.Metrology.Shared.Models.Stateless; | ||||
| using System.Text.Json; | ||||
| 
 | ||||
| // this controller is for the Awaiting Dispo functionality | ||||
| 
 | ||||
| public class AwaitingDispoController : Controller | ||||
| [Route("api/[controller]")]
 | ||||
| public class AwaitingDispoController : Controller, IAwaitingDispoController<IActionResult> | ||||
| { | ||||
|     private readonly IMetrologyRepo _Repo; | ||||
| 
 | ||||
|     public AwaitingDispoController(IMetrologyRepo repo) => _Repo = repo; | ||||
|     private readonly IMetrologyRepository _MetrologyRepository; | ||||
|     public AwaitingDispoController(IMetrologyRepository metrologyRepository) => | ||||
|         _MetrologyRepository = metrologyRepository; | ||||
| 
 | ||||
|     // returns the data to show in the Awaiting Dispo grid | ||||
|     // marked no-cache, just-in-case since igniteUI automatically adds a query string parameter to prevent caching | ||||
|     [HttpGet("/api/awaitingdispo")] | ||||
|     [HttpGet] | ||||
|     [ResponseCache(NoStore = true)] | ||||
|     public IActionResult Index() | ||||
|     { | ||||
| 
 | ||||
|         var r = new | ||||
|         { | ||||
|             Results = _Repo.GetAwaitingDispo() | ||||
|         }; | ||||
|         return Json(r, new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true }); | ||||
|     } | ||||
|     public IActionResult Index() => | ||||
|         Json(_MetrologyRepository.GetAwaitingDisposition(), new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true }); | ||||
| 
 | ||||
|     // this endpoint is used to set the ReviewDate column, causing the header to no longer show in Awaiting Dispo     | ||||
|     [HttpPost("/api/awaitingdispo/markasreviewed")] | ||||
|     public IActionResult MarkAsReviewed([FromQuery] long headerid, [FromQuery] int tooltypeid) | ||||
|     { | ||||
|         _ = _Repo.UpdateReviewDate(tooltypeid, headerid, false); | ||||
|         _ = _MetrologyRepository.UpdateReviewDate(tooltypeid, headerid, false); | ||||
|         return Ok(); | ||||
|     } | ||||
| 
 | ||||
| @ -39,7 +33,7 @@ public class AwaitingDispoController : Controller | ||||
|     [HttpPost("/api/awaitingdispo/markasawaiting")] | ||||
|     public IActionResult MarkAsAwaiting([FromQuery] long headerid, [FromQuery] int tooltypeid) | ||||
|     { | ||||
|         if (_Repo.UpdateReviewDate(tooltypeid, headerid, true) <= 1) | ||||
|         if (_MetrologyRepository.UpdateReviewDate(tooltypeid, headerid, true) <= 1) | ||||
|             return Ok(); | ||||
|         else | ||||
|             return StatusCode(444); | ||||
							
								
								
									
										29
									
								
								Server/ApiControllers/ClientSettingsController.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,29 @@ | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
| using OI.Metrology.Shared.Models.Stateless; | ||||
|  | ||||
| namespace OI.Metrology.Server.ApiControllers; | ||||
|  | ||||
| [ApiController] | ||||
| [Route("api/[controller]")] | ||||
| public class ClientSettingsController : ControllerBase, IClientSettingsController<ActionResult> | ||||
| { | ||||
|  | ||||
|     private readonly IClientSettingsRepository _ClientSettingsRepository; | ||||
|  | ||||
|     public ClientSettingsController(IClientSettingsRepository clientSettingsRepository) => _ClientSettingsRepository = clientSettingsRepository; | ||||
|  | ||||
|     [HttpGet(nameof(IClientSettingsController<ActionResult>.Action.Client))] | ||||
|     public ActionResult GetClientSettings() | ||||
|     { | ||||
|         List<string> results = _ClientSettingsRepository.GetClientSettings(Request.HttpContext.Connection?.RemoteIpAddress); | ||||
|         return Ok(results); | ||||
|     } | ||||
|  | ||||
|     [HttpGet(nameof(IClientSettingsController<ActionResult>.Action.IP))] | ||||
|     public ActionResult GetIpAddress() | ||||
|     { | ||||
|         string result = _ClientSettingsRepository.GetIpAddress(Request.HttpContext.Connection?.RemoteIpAddress); | ||||
|         return Ok(result); | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										78
									
								
								Server/ApiControllers/InboundController.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,78 @@ | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
| using Newtonsoft.Json.Linq; | ||||
| using OI.Metrology.Server.Models; | ||||
| using OI.Metrology.Shared.Models; | ||||
| using OI.Metrology.Shared.Models.Stateless; | ||||
| using OI.Metrology.Shared.Services; | ||||
| using System.Net; | ||||
|  | ||||
| namespace OI.Metrology.Server.ApiControllers; | ||||
|  | ||||
| [ApiController] | ||||
| [Route("api/[controller]")] | ||||
| public partial class InboundController : ControllerBase, IInboundController<IActionResult> | ||||
| { | ||||
|  | ||||
|     private readonly ILogger _Logger; | ||||
|     private readonly AppSettings _AppSettings; | ||||
|     private readonly IInboundRepository _InboundRepository; | ||||
|     private readonly IAttachmentsService _AttachmentsService; | ||||
|     private readonly IInboundDataService _InboundDataService; | ||||
|     private readonly IMetrologyRepository _MetrologyRepository; | ||||
|  | ||||
|     public InboundController(AppSettings appSettings, ILogger<InboundController> logger, IMetrologyRepository metrologyRepository, IInboundRepository inboundRepository, IInboundDataService inboundDataService, IAttachmentsService attachmentsService) | ||||
|     { | ||||
|         _Logger = logger; | ||||
|         _AppSettings = appSettings; | ||||
|         _InboundRepository = inboundRepository; | ||||
|         _AttachmentsService = attachmentsService; | ||||
|         _InboundDataService = inboundDataService; | ||||
|         _MetrologyRepository = metrologyRepository; | ||||
|     } | ||||
|  | ||||
|     [HttpPost] | ||||
|     [Route("{tooltype}")] | ||||
|     public IActionResult Data(string tooltype, [FromBody] JToken jsonbody) | ||||
|     { | ||||
|         IPAddress? remoteIP = HttpContext.Connection.RemoteIpAddress; | ||||
|         if (!_InboundRepository.IsIPAddressAllowed(_AppSettings.InboundApiAllowedIPList, remoteIP)) | ||||
|         { | ||||
|             _Logger.LogInformation($"Rejected remote IP: {remoteIP}"); | ||||
|             return Unauthorized("Remote IP is not on allowed list"); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             DataResponse dataResponse = _InboundRepository.Data(_MetrologyRepository, _InboundDataService, tooltype, jsonbody); | ||||
|             if (!dataResponse.Errors.Any()) | ||||
|                 return Ok(dataResponse); | ||||
|             else | ||||
|                 return BadRequest(dataResponse); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     [HttpPost] | ||||
|     [Route("{tooltype}/attachment")] | ||||
|     public IActionResult AttachFile(string tooltype, [FromQuery] long headerid, [FromQuery] string datauniqueid = "") | ||||
|     { | ||||
|         IPAddress? remoteIP = HttpContext.Connection.RemoteIpAddress; | ||||
|         if (!_InboundRepository.IsIPAddressAllowed(_AppSettings.InboundApiAllowedIPList, remoteIP)) | ||||
|         { | ||||
|             _Logger.LogInformation($"Rejected remote IP: {remoteIP}"); | ||||
|             return Unauthorized("Remote IP is not on allowed list"); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             if (Request.Form is null) | ||||
|                 return BadRequest($"Invalid form"); | ||||
|             if (Request.Form.Files.Count != 1) | ||||
|                 return BadRequest($"Invalid file count"); | ||||
|             IFormFile formFile = Request.Form.Files[0]; | ||||
|             string? message = _InboundRepository.AttachFile(_MetrologyRepository, _AttachmentsService, tooltype, headerid, datauniqueid, formFile.FileName, formFile); | ||||
|             if (message is null) | ||||
|                 return Ok(); | ||||
|             else | ||||
|                 return BadRequest(message); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										33
									
								
								Server/ApiControllers/PinController.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,33 @@ | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
|  | ||||
| namespace OI.Metrology.Server.ApiControllers; | ||||
|  | ||||
| using OI.Metrology.Shared.Models.Stateless; | ||||
| using System.Text.Json; | ||||
|  | ||||
| [Route("api/[controller]")] | ||||
| public class PinController : Controller, IPinController<IActionResult> | ||||
| { | ||||
|  | ||||
|     private readonly IPinRepository _PinRepository; | ||||
|     private readonly IMetrologyRepository _MetrologyRepository; | ||||
|  | ||||
|     public PinController(ILogger<InboundController> logger, IMetrologyRepository metrologyRepository, IPinRepository pinRepository) | ||||
|     { | ||||
|         _MetrologyRepository = metrologyRepository; | ||||
|         _PinRepository = pinRepository; | ||||
|     } | ||||
|  | ||||
|     [HttpPost("{toolTypeId}/markAsPinned")] | ||||
|     public IActionResult MarkAsPinned(Shared.DataModels.HeaderCommon headerCommon) | ||||
|     { | ||||
|         _PinRepository.SetPinnedTable(headerCommon); | ||||
|         return Ok(); | ||||
|     } | ||||
|  | ||||
|     [HttpGet] | ||||
|     [Route("{toolTypeId}/pinned")] | ||||
|     public IActionResult GetPinnedTable(int toolTypeId, string? biorad_id = null, string? cde_id = null, string? rds = null) => | ||||
|         Json(_PinRepository.GetPinnedTable(_MetrologyRepository, toolTypeId, biorad_id, cde_id, rds), new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true }); | ||||
|  | ||||
| } | ||||
							
								
								
									
										46
									
								
								Server/ApiControllers/ServiceShopOrderController.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,46 @@ | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
| using OI.Metrology.Shared.Models.Stateless; | ||||
|  | ||||
| namespace OI.Metrology.Server.ApiControllers; | ||||
|  | ||||
| [ApiController] | ||||
| [Route("api/[controller]")] | ||||
| public class ServiceShopOrderController : ControllerBase, IServiceShopOrderController<ActionResult> | ||||
| { | ||||
|  | ||||
|     private readonly IServiceShopOrderRepository _ServiceShopOrderRepository; | ||||
|  | ||||
|     public ServiceShopOrderController(IServiceShopOrderRepository ServiceShopOrderRepository) => _ServiceShopOrderRepository = ServiceShopOrderRepository; | ||||
|  | ||||
|     [HttpGet(nameof(IServiceShopOrderController<ActionResult>.Action.All))] | ||||
|     public async Task<ActionResult> GetAllServiceShopOrders() | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             Shared.ViewModels.ServiceShopOrder[] results = await _ServiceShopOrderRepository.GetAllServiceShopOrders(); | ||||
|             return Ok(results); | ||||
|         } | ||||
|         catch (Exception) | ||||
|         { | ||||
|             return StatusCode(StatusCodes.Status500InternalServerError, | ||||
|                 "Error retrieving data from the database"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     [HttpGet] | ||||
|     [Route("{id}")] | ||||
|     public async Task<ActionResult> GetServiceShopOrders(string id) | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             Shared.ViewModels.ServiceShopOrder[] results = await _ServiceShopOrderRepository.GetServiceShopOrders(id); | ||||
|             return Ok(results); | ||||
|         } | ||||
|         catch (Exception) | ||||
|         { | ||||
|             return StatusCode(StatusCodes.Status500InternalServerError, | ||||
|                 "Error retrieving data from the database"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										110
									
								
								Server/ApiControllers/ToolTypesController.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,110 @@ | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
| using Newtonsoft.Json; | ||||
|  | ||||
| namespace OI.Metrology.Server.ApiControllers; | ||||
|  | ||||
| using OI.Metrology.Server.Models; | ||||
| using OI.Metrology.Shared.Models.Stateless; | ||||
| using OI.Metrology.Shared.Services; | ||||
| using System.Data; | ||||
| using System.Text.Json; | ||||
|  | ||||
| [Route("api/[controller]")] | ||||
| public class ToolTypesController : Controller, IToolTypesController<IActionResult> | ||||
| { | ||||
|     // this controller powers the bulk of the UI | ||||
|     // it is named after the /api/tooltypes prefix | ||||
|     // the URL pattern is RESTful and the tool type is the root of every request | ||||
|  | ||||
|     private readonly AppSettings _AppSettings; | ||||
|     private readonly IMetrologyRepository _MetrologyRepo; | ||||
|     private readonly IAttachmentsService _AttachmentsService; | ||||
|     private readonly IToolTypesRepository _ToolTypesRepository; | ||||
|  | ||||
|     public ToolTypesController(AppSettings appSettings, IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService, IToolTypesRepository toolTypesRepository) | ||||
|     { | ||||
|         _AppSettings = appSettings; | ||||
|         _MetrologyRepo = metrologyRepository; | ||||
|         _AttachmentsService = attachmentsService; | ||||
|         _ToolTypesRepository = toolTypesRepository; | ||||
|     } | ||||
|  | ||||
|     [HttpGet] | ||||
|     public IActionResult Index() => | ||||
|         Json(_ToolTypesRepository.Index(_MetrologyRepo), new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true }); | ||||
|  | ||||
|     [HttpGet] | ||||
|     [Route("{id}")] | ||||
|     public IActionResult GetToolTypeMetadata(int id, string sortby = "") => | ||||
|         Json(_ToolTypesRepository.GetToolTypeMetadata(_MetrologyRepo, id, sortby), new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true }); | ||||
|  | ||||
|     [HttpGet] | ||||
|     [Route("{id}/headers")] | ||||
|     public IActionResult GetHeaders(int id, [FromQuery] DateTime? datebegin, [FromQuery] DateTime? dateend, [FromQuery] int? page, [FromQuery] int? pagesize, [FromQuery] long? headerid) | ||||
|     { | ||||
|         Shared.DataModels.Result<DataTable> r = _ToolTypesRepository.GetHeaders(_MetrologyRepo, id, datebegin, dateend, page, pagesize, headerid); | ||||
|         string json = JsonConvert.SerializeObject(r); | ||||
|         return Content(json); | ||||
|     } | ||||
|  | ||||
|     [HttpGet] | ||||
|     [Route("{id}/headertitles")] | ||||
|     public IActionResult GetHeaderTitles(int id, [FromQuery] int? page, [FromQuery] int? pagesize) => | ||||
|         Json(_ToolTypesRepository.GetHeaderTitles(_MetrologyRepo, id, page, pagesize), new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true }); | ||||
|  | ||||
|     [HttpGet] | ||||
|     [Route("{id}/headers/{headerid}/fields")] | ||||
|     public IActionResult GetHeaderFields(int id, long headerid) => | ||||
|         Json(_ToolTypesRepository.GetHeaderFields(_MetrologyRepo, id, headerid), new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true }); | ||||
|  | ||||
|     [HttpGet] | ||||
|     [Route("{id}/headers/{headerid}/data")] | ||||
|     public IActionResult GetData(int id, long headerid) | ||||
|     { | ||||
|         Shared.DataModels.Result<DataTable> r = _ToolTypesRepository.GetData(_MetrologyRepo, id, headerid); | ||||
|         string json = JsonConvert.SerializeObject(r); | ||||
|         return Content(json); | ||||
|     } | ||||
|  | ||||
|     [HttpGet] | ||||
|     [Route("{toolTypeId}/export")] | ||||
|     public IActionResult GetExportData(int toolTypeId, [FromQuery] DateTime? datebegin, [FromQuery] DateTime? dateend) | ||||
|     { | ||||
|         Shared.DataModels.Result<DataTable> r = _ToolTypesRepository.GetExportData(_MetrologyRepo, toolTypeId, datebegin, dateend); | ||||
|         string json = JsonConvert.SerializeObject(r); | ||||
|         return Content(json); | ||||
|     } | ||||
|  | ||||
|     [HttpGet] | ||||
|     [Route("{toolTypeId}/csv")] | ||||
|     public IActionResult GetCSVExport(int toolTypeId, [FromQuery] DateTime? datebegin, [FromQuery] DateTime? dateend, [FromQuery] string? filename) | ||||
|     { | ||||
|         byte[] r = _ToolTypesRepository.GetCSVExport(_MetrologyRepo, toolTypeId, datebegin, dateend); | ||||
|         return File(r, "application/octet-stream", filename); | ||||
|     } | ||||
|  | ||||
|     [HttpGet] | ||||
|     [Route("{toolTypeId}/{tabletype}/files/{attachmentId}/{filename}")] | ||||
|     public IActionResult GetAttachment(int toolTypeId, string tabletype, string attachmentId, string filename) | ||||
|     { | ||||
|         (string? message, string? contenttype, Stream? stream) = _ToolTypesRepository.GetAttachment(_MetrologyRepo, _AttachmentsService, toolTypeId, tabletype, attachmentId, filename); | ||||
|         if (message is not null) | ||||
|             return Content(message); | ||||
|         else if (contenttype is not null && stream is not null) | ||||
|             return File(stream, contenttype); | ||||
|         else | ||||
|             throw new Exception(); | ||||
|     } | ||||
|  | ||||
|     [HttpPost] | ||||
|     [Route("{toolTypeId}/headers/{headerid}/oiexport")] | ||||
|     public IActionResult OIExport(int toolTypeId, long headerid) | ||||
|     { | ||||
|         Exception? exception = _ToolTypesRepository.OIExport(_MetrologyRepo, _AppSettings.OIExportPath, toolTypeId, headerid); | ||||
|         if (exception is null) | ||||
|             return Ok(new { Message = "OK" }); | ||||
|         else | ||||
|             return BadRequest(JsonConvert.SerializeObject(new { exception.Message })); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @ -1,13 +1,7 @@ | ||||
| using Microsoft.AspNetCore.Builder; | ||||
| using Microsoft.AspNetCore.Http; | ||||
| using OI.Metrology.Viewer.Models; | ||||
| using System; | ||||
| using System.IO; | ||||
| using System.Linq; | ||||
| using OI.Metrology.Server.Models; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| 
 | ||||
| namespace OI.Metrology.Viewer; | ||||
| namespace OI.Metrology.Server; | ||||
| 
 | ||||
| // You may need to install the Microsoft.AspNetCore.Http.Abstractions package into your project | ||||
| public class ApiLoggingMiddleware | ||||
| @ -43,7 +37,8 @@ public class ApiLoggingMiddleware | ||||
|                     else | ||||
|                     { | ||||
|                         // if there are content type filters configured, only log is the request begins with one of them | ||||
|                         doLogging = _AppSettings.ApiLoggingContentTypes.Split(';').Any(ct => httpContext.Request.ContentType.StartsWith(ct)); | ||||
|                         string? contentType = httpContext.Request.ContentType; | ||||
|                         doLogging = contentType is not null && _AppSettings.ApiLoggingContentTypes.Split(';').Any(ct => contentType.StartsWith(ct)); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
| @ -1,9 +1,7 @@ | ||||
| using Microsoft.AspNetCore.Diagnostics; | ||||
| using Microsoft.AspNetCore.Http; | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
| using Microsoft.Extensions.Logging; | ||||
| 
 | ||||
| namespace OI.Metrology.Viewer.Controllers; | ||||
| namespace OI.Metrology.Server.Controllers; | ||||
| 
 | ||||
| [Route("/error")] | ||||
| public class ErrorHandlerController : Controller | ||||
| @ -14,8 +12,8 @@ public class ErrorHandlerController : Controller | ||||
| 
 | ||||
|     public IActionResult Index() | ||||
|     { | ||||
|         IExceptionHandlerFeature error = HttpContext.Features.Get<IExceptionHandlerFeature>(); | ||||
|         if (error == null) | ||||
|         IExceptionHandlerFeature? error = HttpContext.Features.Get<IExceptionHandlerFeature>(); | ||||
|         if (error is null) | ||||
|         { | ||||
|             return Redirect("~/"); | ||||
|         } | ||||
| @ -24,7 +22,7 @@ public class ErrorHandlerController : Controller | ||||
|             _Logger.LogError("Unhandled exception: " + error.Error.ToString()); | ||||
|             dynamic r = new | ||||
|             { | ||||
|                 Message = error.Error == null ? "Error" : error.Error.Message | ||||
|                 Message = error.Error is null ? "Error" : error.Error.Message | ||||
|             }; | ||||
|             return StatusCode(StatusCodes.Status500InternalServerError, r); | ||||
|         } | ||||
| @ -1,31 +1,30 @@ | ||||
| using Infineon.Monitoring.MonA; | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
| using Microsoft.AspNetCore.Mvc.Filters; | ||||
| using Microsoft.Extensions.Logging; | ||||
| using OI.Metrology.Server.Models; | ||||
| using OI.Metrology.Shared.DataModels; | ||||
| using OI.Metrology.Shared.Repositories; | ||||
| using OI.Metrology.Shared.Models.Stateless; | ||||
| using OI.Metrology.Shared.ViewModels; | ||||
| using OI.Metrology.Viewer.Models; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| 
 | ||||
| namespace OI.Metrology.Viewer.Controllers; | ||||
| namespace OI.Metrology.Server.Controllers; | ||||
| 
 | ||||
| public class ExportController : Controller | ||||
| { | ||||
| 
 | ||||
|     private readonly string _ApiUrl; | ||||
|     private readonly ILogger _Logger; | ||||
|     private readonly bool _IsTestDatabase; | ||||
|     private readonly IMetrologyRepo _Repo; | ||||
|     private readonly AppSettings _AppSettings; | ||||
|     private readonly IMetrologyRepository _MetrologyRepository; | ||||
| 
 | ||||
|     public ExportController(AppSettings appSettings, ILogger<ExportController> logger, IMetrologyRepo repo) | ||||
|     public ExportController(AppSettings appSettings, ILogger<ExportController> logger, IMetrologyRepository metrologyRepository) | ||||
|     { | ||||
|         _Repo = repo; | ||||
|         _Logger = logger; | ||||
|         _AppSettings = appSettings; | ||||
|         _MetrologyRepository = metrologyRepository; | ||||
|         _IsTestDatabase = appSettings.ConnectionString.Contains("test", StringComparison.InvariantCultureIgnoreCase); | ||||
|         _ApiUrl = string.IsNullOrEmpty(appSettings.ApiUrl) ? Url.Content("~/") : appSettings.ApiUrl[0] == '~' ? Url.Content(appSettings.ApiUrl) : appSettings.ApiUrl; | ||||
|     } | ||||
| 
 | ||||
|     public override void OnActionExecuted(ActionExecutedContext context) | ||||
| @ -33,18 +32,19 @@ public class ExportController : Controller | ||||
|         base.OnActionExecuted(context); | ||||
|         ViewBag.IsTestDatabase = _IsTestDatabase; | ||||
|     } | ||||
| 
 | ||||
|     [HttpGet] | ||||
|     [Route("/Export")] | ||||
|     public ActionResult Index() | ||||
|     { | ||||
|         Export model = new() | ||||
|         { | ||||
|             ToolType = "", | ||||
|             StartTime = DateTime.Now.AddMonths(-1), | ||||
|             EndTime = DateTime.Now | ||||
|         }; | ||||
|         MonIn monIn = MonIn.GetInstance(); | ||||
|         _ = monIn.SendStatus(_AppSettings.MonASite, _AppSettings.MonAResource, "Heartbeat", State.Up); | ||||
|         ViewBag.ApiUrl = _ApiUrl; | ||||
|         return View(model); | ||||
|     } | ||||
| 
 | ||||
| @ -52,14 +52,14 @@ public class ExportController : Controller | ||||
|     [Route("/ExportData")] | ||||
|     public ActionResult ExportData(Export model) | ||||
|     { | ||||
|         ToolType toolType = null; | ||||
|         ToolType? toolType = null; | ||||
|         if (string.IsNullOrEmpty(model.ToolType)) | ||||
|             ModelState.AddModelError("Exception", "Invalid selection"); | ||||
|         else | ||||
|         { | ||||
|             if (model.StartTime > model.EndTime) | ||||
|                 ModelState.AddModelError("EndTime", "End time must be after start time"); | ||||
|             IEnumerable<ToolType> toolTypes = _Repo.GetToolTypes(); | ||||
|             IEnumerable<ToolType> toolTypes = _MetrologyRepository.GetToolTypes(); | ||||
|             toolType = toolTypes.Where(tt => tt.ID.ToString() == model.ToolType).SingleOrDefault(); | ||||
|             if (toolType is null) | ||||
|                 ModelState.AddModelError("ToolType", "Invalid selection"); | ||||
| @ -73,7 +73,7 @@ public class ExportController : Controller | ||||
|                 DateTime startDT = model.StartDate.Date.Add(model.StartTime.TimeOfDay); | ||||
|                 DateTime endDT = model.EndDate.Date.Add(model.EndTime.TimeOfDay); | ||||
| 
 | ||||
|                 return DoCSVExport(toolType.ToolTypeName, toolType.ExportSPName, startDT, endDT); | ||||
|                 return DoCSVExport(toolType?.ToolTypeName, toolType?.ExportSPName, startDT, endDT); | ||||
|             } | ||||
|             catch (Exception ex) | ||||
|             { | ||||
| @ -81,27 +81,25 @@ public class ExportController : Controller | ||||
|                 ModelState.AddModelError("Exception", ex.Message); | ||||
|                 string errorMessage = $"Error exporting: {ex}"; | ||||
|                 _Logger.LogError(message: errorMessage); | ||||
|                 MonIn monIn = MonIn.GetInstance(); | ||||
|                 _ = monIn.SendStatus(_AppSettings.MonASite, _AppSettings.MonAResource, "Heartbeat", State.Warning); | ||||
|             } | ||||
|         } | ||||
|         ViewBag.ApiUrl = _ApiUrl; | ||||
|         return View("Index", model); | ||||
|     } | ||||
| 
 | ||||
|     protected ActionResult DoCSVExport(string toolTypeName, string spName, DateTime startTime, DateTime endTime) | ||||
|     protected ActionResult DoCSVExport(string? toolTypeName, string? spName, DateTime startTime, DateTime endTime) | ||||
|     { | ||||
|         string fileName = string.Format("Export_{0}_{1:yyyyMMddHHmm}_to_{2:yyyyMMddHHmm}.csv", toolTypeName, startTime, endTime); | ||||
|         StringBuilder sb = new(); | ||||
| 
 | ||||
|         System.Data.DataTable dt = _Repo.ExportData(spName, startTime, endTime); | ||||
| 
 | ||||
|         if (spName is null) | ||||
|             throw new NullReferenceException(nameof(spName)); | ||||
|         System.Data.DataTable dt = _MetrologyRepository.ExportData(spName, startTime, endTime); | ||||
|         _ = sb.AppendLine(GetColumnHeaders(dt)); | ||||
| 
 | ||||
|         foreach (System.Data.DataRow dr in dt.Rows) | ||||
|         { | ||||
|             _ = sb.AppendLine(GetRowData(dr)); | ||||
|         } | ||||
| 
 | ||||
|         byte[] contents = Encoding.UTF8.GetBytes(sb.ToString()); | ||||
| 
 | ||||
|         return File(contents, "application/octet-stream", fileName); | ||||
|     } | ||||
| 
 | ||||
| @ -112,10 +110,13 @@ public class ExportController : Controller | ||||
|         { | ||||
|             if (i > 0) | ||||
|                 _ = r.Append(','); | ||||
| 
 | ||||
|             object v = dr[i]; | ||||
|             if (!Convert.IsDBNull(v)) | ||||
|                 _ = r.Append(FormatForCSV(Convert.ToString(v))); | ||||
|             { | ||||
|                 string? c = Convert.ToString(v); | ||||
|                 if (c is not null) | ||||
|                     _ = r.Append(FormatForCSV(c)); | ||||
|             } | ||||
|         } | ||||
|         return r.ToString(); | ||||
|     } | ||||
| @ -135,16 +136,13 @@ public class ExportController : Controller | ||||
| 
 | ||||
|     protected static string FormatForCSV(string v) | ||||
|     { | ||||
|         StringBuilder r = new(v.Length + 2); | ||||
| 
 | ||||
|         bool doubleQuoted = false; | ||||
| 
 | ||||
|         StringBuilder r = new(v.Length + 2); | ||||
|         if (v.StartsWith(' ') || v.EndsWith(' ') || v.Contains(',') || v.Contains('"')) | ||||
|         { | ||||
|             _ = r.Append('"'); | ||||
|             doubleQuoted = true; | ||||
|         } | ||||
| 
 | ||||
|         foreach (char c in v) | ||||
|         { | ||||
|             _ = c switch | ||||
| @ -154,10 +152,8 @@ public class ExportController : Controller | ||||
|                 _ => r.Append(c), | ||||
|             }; | ||||
|         } | ||||
| 
 | ||||
|         if (doubleQuoted) | ||||
|             _ = r.Append('"'); | ||||
| 
 | ||||
|         return r.ToString(); | ||||
|     } | ||||
| 
 | ||||
| @ -1,21 +1,23 @@ | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
| using Microsoft.AspNetCore.Mvc.Filters; | ||||
| using OI.Metrology.Shared.Repositories; | ||||
| using OI.Metrology.Server.Models; | ||||
| using OI.Metrology.Shared.Models.Stateless; | ||||
| using OI.Metrology.Shared.ViewModels; | ||||
| using OI.Metrology.Viewer.Models; | ||||
| using System; | ||||
| 
 | ||||
| namespace OI.Metrology.Viewer.Controllers; | ||||
| namespace OI.Metrology.Server.Controllers; | ||||
| 
 | ||||
| public class PagesController : Controller | ||||
| { | ||||
|     private readonly IMetrologyRepo _Repo; | ||||
|     private readonly bool _IsTestDatabase; | ||||
| 
 | ||||
|     public PagesController(AppSettings appSettings, IMetrologyRepo repo) | ||||
|     private readonly string _ApiUrl; | ||||
|     private readonly bool _IsTestDatabase; | ||||
|     private readonly IMetrologyRepository _MetrologyRepository; | ||||
| 
 | ||||
|     public PagesController(AppSettings appSettings, IMetrologyRepository metrologyRepository) | ||||
|     { | ||||
|         _Repo = repo; | ||||
|         _MetrologyRepository = metrologyRepository; | ||||
|         _IsTestDatabase = appSettings.ConnectionString.Contains("test", StringComparison.InvariantCultureIgnoreCase); | ||||
|         _ApiUrl = string.IsNullOrEmpty(appSettings.ApiUrl) ? Url.Content("~/") : appSettings.ApiUrl[0] == '~' ? Url.Content(appSettings.ApiUrl) : appSettings.ApiUrl; | ||||
|     } | ||||
| 
 | ||||
|     public override void OnActionExecuted(ActionExecutedContext context) | ||||
| @ -26,14 +28,20 @@ public class PagesController : Controller | ||||
| 
 | ||||
|     [HttpGet] | ||||
|     [Route("/")] | ||||
|     public IActionResult Index() => | ||||
|         View("AwaitingDispo"); | ||||
|     public IActionResult Index() | ||||
|     { | ||||
|         ViewBag.ApiUrl = _ApiUrl; | ||||
|         return View("AwaitingDispo"); | ||||
|     } | ||||
| 
 | ||||
|     [HttpGet] | ||||
|     [Route("/AwaitingDispo")] | ||||
|     [Route("/Metrology/AwaitingDispo")] | ||||
|     public IActionResult AwaitingDispo() => | ||||
|         View(); | ||||
|     public IActionResult AwaitingDispo() | ||||
|     { | ||||
|         ViewBag.ApiUrl = _ApiUrl; | ||||
|         return View(); | ||||
|     } | ||||
| 
 | ||||
|     [HttpGet] | ||||
|     [Route("/RunInfo")] | ||||
| @ -48,16 +56,20 @@ public class PagesController : Controller | ||||
|         }; | ||||
|         if (headerid > 0) | ||||
|         { | ||||
|             m.HeaderAttachmentID = _Repo.GetHeaderAttachmentID(tooltypeid, headerid); | ||||
|             m.HeaderAttachmentID = _MetrologyRepository.GetHeaderAttachmentID(tooltypeid, headerid); | ||||
|         } | ||||
|         ViewBag.ApiUrl = _ApiUrl; | ||||
|         return View(m); | ||||
|     } | ||||
| 
 | ||||
|     [HttpGet] | ||||
|     [Route("/RunHeaders")] | ||||
|     [Route("/Metrology/RunHeaders")] | ||||
|     public IActionResult RunHeaders() => | ||||
|         View(); | ||||
|     public IActionResult RunHeaders() | ||||
|     { | ||||
|         ViewBag.ApiUrl = _ApiUrl; | ||||
|         return View(); | ||||
|     } | ||||
| 
 | ||||
|     [HttpGet] | ||||
|     [Route("/Crash")] | ||||
							
								
								
									
										8035
									
								
								Server/Data/Mike/service-shop.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										1
									
								
								Server/Data/Tests/GetAllServiceShopOrdersApi.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										1
									
								
								Server/Data/Tests/GetAppSettingsApi.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1 @@ | ||||
| ["application/json","/api/inbound","D:\\Metrology\\MetrologyAPILogs","\\\\messv02ecc1.ec.local\\EC_Metrology_Si\\MetrologyAttachments","1","Infineon Technologies Americas Corp.","Data Source=MESSAD1001\\TEST1,59583;Integrated Security=True;Initial Catalog=Metrology;","1234567","","True","False","OI_Metrology_Viewer_IFX","auc","Data Source=MESSAD1001\\TEST1,59583;Initial Catalog=LSL2SQL;Persist Security Info=True;User ID=srpadmin;Password=0okm9ijn;","\\\\openinsight-db-srv.na.infineon.com\\apps\\Metrology\\Data","https://localhost:7130;http://localhost:5126","IFXApps"] | ||||
							
								
								
									
										1742
									
								
								Server/Data/Tests/GetAwaitingDispositionApi.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1 @@ | ||||
| 1-1234567 | ||||
							
								
								
									
										1
									
								
								Server/Data/Tests/GetClientSettingsApi.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1 @@ | ||||
| ["remoteIpAddress"] | ||||
							
								
								
									
										1
									
								
								Server/Data/Tests/GetDataApi.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										1
									
								
								Server/Data/Tests/GetExportDataApi.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1 @@ | ||||
| {"Results":[],"TotalRows":0} | ||||
							
								
								
									
										89
									
								
								Server/Data/Tests/GetHeaderFieldsApi.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,89 @@ | ||||
| { | ||||
|   "Results": [ | ||||
|     { | ||||
|       "Column": "ID", | ||||
|       "Value": "1" | ||||
|     }, | ||||
|     { | ||||
|       "Column": "InsertDate", | ||||
|       "Value": "9/12/2019 4:02:17 PM" | ||||
|     }, | ||||
|     { | ||||
|       "Column": "Title", | ||||
|       "Value": "Bio-RadQS400MEPI_99-999999-9999.1_201909121559040648" | ||||
|     }, | ||||
|     { | ||||
|       "Column": "Recipe", | ||||
|       "Value": "6in_thick" | ||||
|     }, | ||||
|     { | ||||
|       "Column": "Date", | ||||
|       "Value": "9/12/2019 3:59:05 PM" | ||||
|     }, | ||||
|     { | ||||
|       "Column": "Operator", | ||||
|       "Value": "" | ||||
|     }, | ||||
|     { | ||||
|       "Column": "Batch", | ||||
|       "Value": "BIORAD #4" | ||||
|     }, | ||||
|     { | ||||
|       "Column": "Cassette", | ||||
|       "Value": "" | ||||
|     }, | ||||
|     { | ||||
|       "Column": "Wafer", | ||||
|       "Value": "99-999999-9999.1" | ||||
|     }, | ||||
|     { | ||||
|       "Column": "Mean Thickness", | ||||
|       "Value": "114.785" | ||||
|     }, | ||||
|     { | ||||
|       "Column": "RV Thickness", | ||||
|       "Value": "0.0000" | ||||
|     }, | ||||
|     { | ||||
|       "Column": "Status", | ||||
|       "Value": "PASS" | ||||
|     }, | ||||
|     { | ||||
|       "Column": "Std Dev", | ||||
|       "Value": "1.1047" | ||||
|     }, | ||||
|     { | ||||
|       "Column": "SentToMetrology", | ||||
|       "Value": "True" | ||||
|     }, | ||||
|     { | ||||
|       "Column": "SentToSPC", | ||||
|       "Value": "False" | ||||
|     }, | ||||
|     { | ||||
|       "Column": "Reactor", | ||||
|       "Value": "99" | ||||
|     }, | ||||
|     { | ||||
|       "Column": "RDS", | ||||
|       "Value": "999999" | ||||
|     }, | ||||
|     { | ||||
|       "Column": "PSN", | ||||
|       "Value": "9999" | ||||
|     }, | ||||
|     { | ||||
|       "Column": "Path", | ||||
|       "Value": "" | ||||
|     }, | ||||
|     { | ||||
|       "Column": "Layer", | ||||
|       "Value": "1" | ||||
|     }, | ||||
|     { | ||||
|       "Column": "Zone", | ||||
|       "Value": "" | ||||
|     } | ||||
|   ], | ||||
|   "TotalRows": 21 | ||||
| } | ||||
							
								
								
									
										21
									
								
								Server/Data/Tests/GetHeaderTitlesApi.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,21 @@ | ||||
| { | ||||
|   "Results": [ | ||||
|     { | ||||
|       "ID": 2, | ||||
|       "InsertDate": "2019-09-12T16:24:18.617", | ||||
|       "AttachmentID": "00000000-0000-0000-0000-000000000000", | ||||
|       "Title": "Bio-RadQS400MEPI_99-999999-9999.1_201909121623333616", | ||||
|       "Recipe": null, | ||||
|       "Date": "2019-09-12T16:23:43" | ||||
|     }, | ||||
|     { | ||||
|       "ID": 1, | ||||
|       "InsertDate": "2019-09-12T16:02:17.253", | ||||
|       "AttachmentID": "00000000-0000-0000-0000-000000000000", | ||||
|       "Title": "Bio-RadQS400MEPI_99-999999-9999.1_201909121559040648", | ||||
|       "Recipe": null, | ||||
|       "Date": "2019-09-12T15:59:05" | ||||
|     } | ||||
|   ], | ||||
|   "TotalRows": 2 | ||||
| } | ||||
							
								
								
									
										1
									
								
								Server/Data/Tests/GetHeadersApi.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1 @@ | ||||
| {"Results":[{"Batch":"BIORAD #4","Cassette":"","Date":"2019-09-12T16:23:43","ID":2,"InsertDate":"2019-09-12T16:24:18.617","Layer":"1","Mean Thickness":"114.785","Operator":"","Path":null,"PSN":"9999","RDS":"999999","Reactor":"99","Recipe":"6in_thick","RV Thickness":"0.0000","SentToMetrology":false,"SentToSPC":false,"Status":"PASS","Std Dev":"1.1047","Title":"Bio-RadQS400MEPI_99-999999-9999.1_201909121623333616","Wafer":"99-999999-9999.1","Zone":null,"AttachmentID":null},{"Batch":"BIORAD #4","Cassette":"","Date":"2019-09-12T15:59:05","ID":1,"InsertDate":"2019-09-12T16:02:17.253","Layer":"1","Mean Thickness":"114.785","Operator":"","Path":null,"PSN":"9999","RDS":"999999","Reactor":"99","Recipe":"6in_thick","RV Thickness":"0.0000","SentToMetrology":true,"SentToSPC":false,"Status":"PASS","Std Dev":"1.1047","Title":"Bio-RadQS400MEPI_99-999999-9999.1_201909121559040648","Wafer":"99-999999-9999.1","Zone":null,"AttachmentID":null}],"TotalRows":2} | ||||
							
								
								
									
										0
									
								
								Server/Data/Tests/GetIpAddressApi.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										6
									
								
								Server/Data/Tests/GetPinnedTableApi.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,6 @@ | ||||
| { | ||||
|     { | ||||
|         "Results": [], | ||||
|         "TotalRows": 0 | ||||
|     } | ||||
| } | ||||
							
								
								
									
										334
									
								
								Server/Data/Tests/GetToolTypeMetadataApi.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,334 @@ | ||||
| { | ||||
|   "Results": { | ||||
|     "ToolType": { | ||||
|       "ID": 1, | ||||
|       "ToolTypeName": "BioRad", | ||||
|       "HasHeaderAttachments": false, | ||||
|       "HasDataAttachments": false, | ||||
|       "HeaderTableName": "BioRadRunHeader", | ||||
|       "DataTableName": "BioRadRunData", | ||||
|       "ExportSPName": "Export_BioRad", | ||||
|       "HeaderGridAttributes": null, | ||||
|       "DataGridAttributes": null, | ||||
|       "DataGridSortBy": "LEN(Position), Position", | ||||
|       "DataGridStatsColumn": "Thickness", | ||||
|       "DataGridStatsStdDevType": " ", | ||||
|       "DisplayHeaderAttachment": null, | ||||
|       "DisplayDataAttachment": null, | ||||
|       "OIExportSPName": "OIExport_BioRad" | ||||
|     }, | ||||
|     "Metadata": [ | ||||
|       { | ||||
|         "ToolTypeID": 1, | ||||
|         "Header": false, | ||||
|         "ApiName": null, | ||||
|         "ColumnName": "ID", | ||||
|         "DisplayTitle": "ID", | ||||
|         "GridDisplayOrder": 3, | ||||
|         "GridAttributes": "{ \u0022dataType\u0022: \u0022number\u0022, \u0022hidden\u0022: \u0022true\u0022 }", | ||||
|         "TableDisplayOrder": 1 | ||||
|       }, | ||||
|       { | ||||
|         "ToolTypeID": 1, | ||||
|         "Header": false, | ||||
|         "ApiName": null, | ||||
|         "ColumnName": "InsertDate", | ||||
|         "DisplayTitle": "InsertDate", | ||||
|         "GridDisplayOrder": 0, | ||||
|         "GridAttributes": null, | ||||
|         "TableDisplayOrder": 2 | ||||
|       }, | ||||
|       { | ||||
|         "ToolTypeID": 1, | ||||
|         "Header": false, | ||||
|         "ApiName": "Position", | ||||
|         "ColumnName": "Position", | ||||
|         "DisplayTitle": "Position", | ||||
|         "GridDisplayOrder": 1, | ||||
|         "GridAttributes": null, | ||||
|         "TableDisplayOrder": 4 | ||||
|       }, | ||||
|       { | ||||
|         "ToolTypeID": 1, | ||||
|         "Header": false, | ||||
|         "ApiName": "HeaderUniqueId", | ||||
|         "ColumnName": "Run Header", | ||||
|         "DisplayTitle": "Run Header", | ||||
|         "GridDisplayOrder": 0, | ||||
|         "GridAttributes": null, | ||||
|         "TableDisplayOrder": 6 | ||||
|       }, | ||||
|       { | ||||
|         "ToolTypeID": 1, | ||||
|         "Header": false, | ||||
|         "ApiName": "Thickness", | ||||
|         "ColumnName": "Thickness", | ||||
|         "DisplayTitle": "Thickness", | ||||
|         "GridDisplayOrder": 2, | ||||
|         "GridAttributes": null, | ||||
|         "TableDisplayOrder": 5 | ||||
|       }, | ||||
|       { | ||||
|         "ToolTypeID": 1, | ||||
|         "Header": false, | ||||
|         "ApiName": "UniqueId", | ||||
|         "ColumnName": "Title", | ||||
|         "DisplayTitle": "Title", | ||||
|         "GridDisplayOrder": 0, | ||||
|         "GridAttributes": null, | ||||
|         "TableDisplayOrder": 3 | ||||
|       }, | ||||
|       { | ||||
|         "ToolTypeID": 1, | ||||
|         "Header": true, | ||||
|         "ApiName": "Batch", | ||||
|         "ColumnName": "Batch", | ||||
|         "DisplayTitle": "Batch", | ||||
|         "GridDisplayOrder": 0, | ||||
|         "GridAttributes": null, | ||||
|         "TableDisplayOrder": 7 | ||||
|       }, | ||||
|       { | ||||
|         "ToolTypeID": 1, | ||||
|         "Header": true, | ||||
|         "ApiName": "Cassette", | ||||
|         "ColumnName": "Cassette", | ||||
|         "DisplayTitle": "Cassette", | ||||
|         "GridDisplayOrder": 0, | ||||
|         "GridAttributes": null, | ||||
|         "TableDisplayOrder": 8 | ||||
|       }, | ||||
|       { | ||||
|         "ToolTypeID": 1, | ||||
|         "Header": true, | ||||
|         "ApiName": "Date", | ||||
|         "ColumnName": "Date", | ||||
|         "DisplayTitle": "Date", | ||||
|         "GridDisplayOrder": 1, | ||||
|         "GridAttributes": "{ \u0022dataType\u0022: \u0022date\u0022, \u0022format\u0022: \u0022dateTime\u0022 }", | ||||
|         "TableDisplayOrder": 5 | ||||
|       }, | ||||
|       { | ||||
|         "ToolTypeID": 1, | ||||
|         "Header": true, | ||||
|         "ApiName": null, | ||||
|         "ColumnName": "ID", | ||||
|         "DisplayTitle": "ID", | ||||
|         "GridDisplayOrder": 0, | ||||
|         "GridAttributes": null, | ||||
|         "TableDisplayOrder": 1 | ||||
|       }, | ||||
|       { | ||||
|         "ToolTypeID": 1, | ||||
|         "Header": true, | ||||
|         "ApiName": null, | ||||
|         "ColumnName": "InsertDate", | ||||
|         "DisplayTitle": "InsertDate", | ||||
|         "GridDisplayOrder": 0, | ||||
|         "GridAttributes": null, | ||||
|         "TableDisplayOrder": 2 | ||||
|       }, | ||||
|       { | ||||
|         "ToolTypeID": 1, | ||||
|         "Header": true, | ||||
|         "ApiName": "Layer", | ||||
|         "ColumnName": "Layer", | ||||
|         "DisplayTitle": "Layer", | ||||
|         "GridDisplayOrder": 5, | ||||
|         "GridAttributes": null, | ||||
|         "TableDisplayOrder": 20 | ||||
|       }, | ||||
|       { | ||||
|         "ToolTypeID": 1, | ||||
|         "Header": true, | ||||
|         "ApiName": "MeanThickness", | ||||
|         "ColumnName": "Mean Thickness", | ||||
|         "DisplayTitle": "Mean Thickness", | ||||
|         "GridDisplayOrder": 0, | ||||
|         "GridAttributes": null, | ||||
|         "TableDisplayOrder": 10 | ||||
|       }, | ||||
|       { | ||||
|         "ToolTypeID": 1, | ||||
|         "Header": true, | ||||
|         "ApiName": "Op", | ||||
|         "ColumnName": "Operator", | ||||
|         "DisplayTitle": "Operator", | ||||
|         "GridDisplayOrder": 8, | ||||
|         "GridAttributes": null, | ||||
|         "TableDisplayOrder": 6 | ||||
|       }, | ||||
|       { | ||||
|         "ToolTypeID": 1, | ||||
|         "Header": true, | ||||
|         "ApiName": "FilePath", | ||||
|         "ColumnName": "Path", | ||||
|         "DisplayTitle": "Path", | ||||
|         "GridDisplayOrder": 0, | ||||
|         "GridAttributes": null, | ||||
|         "TableDisplayOrder": 19 | ||||
|       }, | ||||
|       { | ||||
|         "ToolTypeID": 1, | ||||
|         "Header": true, | ||||
|         "ApiName": "PSN", | ||||
|         "ColumnName": "PSN", | ||||
|         "DisplayTitle": "PSN", | ||||
|         "GridDisplayOrder": 4, | ||||
|         "GridAttributes": null, | ||||
|         "TableDisplayOrder": 18 | ||||
|       }, | ||||
|       { | ||||
|         "ToolTypeID": 1, | ||||
|         "Header": true, | ||||
|         "ApiName": "RDS", | ||||
|         "ColumnName": "RDS", | ||||
|         "DisplayTitle": "RDS", | ||||
|         "GridDisplayOrder": 3, | ||||
|         "GridAttributes": null, | ||||
|         "TableDisplayOrder": 17 | ||||
|       }, | ||||
|       { | ||||
|         "ToolTypeID": 1, | ||||
|         "Header": true, | ||||
|         "ApiName": "Reactor", | ||||
|         "ColumnName": "Reactor", | ||||
|         "DisplayTitle": "Reactor", | ||||
|         "GridDisplayOrder": 2, | ||||
|         "GridAttributes": null, | ||||
|         "TableDisplayOrder": 16 | ||||
|       }, | ||||
|       { | ||||
|         "ToolTypeID": 1, | ||||
|         "Header": true, | ||||
|         "ApiName": "Recipe", | ||||
|         "ColumnName": "Recipe", | ||||
|         "DisplayTitle": "Recipe", | ||||
|         "GridDisplayOrder": 7, | ||||
|         "GridAttributes": null, | ||||
|         "TableDisplayOrder": 4 | ||||
|       }, | ||||
|       { | ||||
|         "ToolTypeID": 1, | ||||
|         "Header": true, | ||||
|         "ApiName": "RVThickness", | ||||
|         "ColumnName": "RV Thickness", | ||||
|         "DisplayTitle": "RV Thickness", | ||||
|         "GridDisplayOrder": 0, | ||||
|         "GridAttributes": null, | ||||
|         "TableDisplayOrder": 11 | ||||
|       }, | ||||
|       { | ||||
|         "ToolTypeID": 1, | ||||
|         "Header": true, | ||||
|         "ApiName": "SentToMetrology", | ||||
|         "ColumnName": "SentToMetrology", | ||||
|         "DisplayTitle": "SentToMetrology", | ||||
|         "GridDisplayOrder": 9, | ||||
|         "GridAttributes": "{ \u0022dataType:\u0022: \u0022bool\u0022, \u0022formatter\u0022: \u0022boolToYesNo\u0022 }", | ||||
|         "TableDisplayOrder": 14 | ||||
|       }, | ||||
|       { | ||||
|         "ToolTypeID": 1, | ||||
|         "Header": true, | ||||
|         "ApiName": "SentToSPC", | ||||
|         "ColumnName": "SentToSPC", | ||||
|         "DisplayTitle": "SentToSPC", | ||||
|         "GridDisplayOrder": 10, | ||||
|         "GridAttributes": "{ \u0022dataType:\u0022: \u0022bool\u0022, \u0022formatter\u0022: \u0022boolToYesNo\u0022 }", | ||||
|         "TableDisplayOrder": 15 | ||||
|       }, | ||||
|       { | ||||
|         "ToolTypeID": 1, | ||||
|         "Header": true, | ||||
|         "ApiName": "PassFail", | ||||
|         "ColumnName": "Status", | ||||
|         "DisplayTitle": "Status", | ||||
|         "GridDisplayOrder": 0, | ||||
|         "GridAttributes": null, | ||||
|         "TableDisplayOrder": 12 | ||||
|       }, | ||||
|       { | ||||
|         "ToolTypeID": 1, | ||||
|         "Header": true, | ||||
|         "ApiName": "StdDev", | ||||
|         "ColumnName": "Std Dev", | ||||
|         "DisplayTitle": "Std Dev", | ||||
|         "GridDisplayOrder": 0, | ||||
|         "GridAttributes": null, | ||||
|         "TableDisplayOrder": 13 | ||||
|       }, | ||||
|       { | ||||
|         "ToolTypeID": 1, | ||||
|         "Header": true, | ||||
|         "ApiName": "UniqueId", | ||||
|         "ColumnName": "Title", | ||||
|         "DisplayTitle": "Title", | ||||
|         "GridDisplayOrder": 0, | ||||
|         "GridAttributes": null, | ||||
|         "TableDisplayOrder": 3 | ||||
|       }, | ||||
|       { | ||||
|         "ToolTypeID": 1, | ||||
|         "Header": true, | ||||
|         "ApiName": "Wafer", | ||||
|         "ColumnName": "Wafer", | ||||
|         "DisplayTitle": "Wafer", | ||||
|         "GridDisplayOrder": 0, | ||||
|         "GridAttributes": null, | ||||
|         "TableDisplayOrder": 9 | ||||
|       }, | ||||
|       { | ||||
|         "ToolTypeID": 1, | ||||
|         "Header": true, | ||||
|         "ApiName": "Zone", | ||||
|         "ColumnName": "Zone", | ||||
|         "DisplayTitle": "Zone", | ||||
|         "GridDisplayOrder": 0, | ||||
|         "GridAttributes": null, | ||||
|         "TableDisplayOrder": 21 | ||||
|       }, | ||||
|       { | ||||
|         "ToolTypeID": 1, | ||||
|         "Header": false, | ||||
|         "ApiName": null, | ||||
|         "ColumnName": "AttachmentID", | ||||
|         "DisplayTitle": "AttachmentID", | ||||
|         "GridDisplayOrder": 0, | ||||
|         "GridAttributes": null, | ||||
|         "TableDisplayOrder": 0 | ||||
|       }, | ||||
|       { | ||||
|         "ToolTypeID": 1, | ||||
|         "Header": true, | ||||
|         "ApiName": null, | ||||
|         "ColumnName": "AttachmentID", | ||||
|         "DisplayTitle": "AttachmentID", | ||||
|         "GridDisplayOrder": 0, | ||||
|         "GridAttributes": null, | ||||
|         "TableDisplayOrder": 0 | ||||
|       }, | ||||
|       { | ||||
|         "ToolTypeID": 1, | ||||
|         "Header": true, | ||||
|         "ApiName": "Id", | ||||
|         "ColumnName": null, | ||||
|         "DisplayTitle": "Ignore", | ||||
|         "GridDisplayOrder": -1, | ||||
|         "GridAttributes": null, | ||||
|         "TableDisplayOrder": -1 | ||||
|       }, | ||||
|       { | ||||
|         "ToolTypeID": 1, | ||||
|         "Header": true, | ||||
|         "ApiName": "Title", | ||||
|         "ColumnName": null, | ||||
|         "DisplayTitle": "Ignore", | ||||
|         "GridDisplayOrder": -1, | ||||
|         "GridAttributes": null, | ||||
|         "TableDisplayOrder": -1 | ||||
|       } | ||||
|     ] | ||||
|   }, | ||||
|   "TotalRows": 31 | ||||
| } | ||||
							
								
								
									
										29
									
								
								Server/Data/Tests/IndexApi.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,29 @@ | ||||
| { | ||||
|   "Results": [ | ||||
|     { | ||||
|       "ToolTypeName": "BioRad", | ||||
|       "ID": 1 | ||||
|     }, | ||||
|     { | ||||
|       "ToolTypeName": "CDE", | ||||
|       "ID": 2 | ||||
|     }, | ||||
|     { | ||||
|       "ToolTypeName": "Tencor", | ||||
|       "ID": 3 | ||||
|     }, | ||||
|     { | ||||
|       "ToolTypeName": "MercuryProbe", | ||||
|       "ID": 4 | ||||
|     }, | ||||
|     { | ||||
|       "ToolTypeName": "StratusBioRad", | ||||
|       "ID": 5 | ||||
|     }, | ||||
|     { | ||||
|       "ToolTypeName": "TencorSP1", | ||||
|       "ID": 6 | ||||
|     } | ||||
|   ], | ||||
|   "TotalRows": 6 | ||||
| } | ||||
							
								
								
									
										32
									
								
								Server/Models/AppSettings.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,32 @@ | ||||
| using System.Text.Json; | ||||
|  | ||||
| namespace OI.Metrology.Server.Models; | ||||
|  | ||||
| public record AppSettings(string ApiLoggingContentTypes, | ||||
|                           string ApiLoggingPathPrefixes, | ||||
|                           string ApiLogPath, | ||||
|                           string ApiUrl, | ||||
|                           string AttachmentPath, | ||||
|                           string BuildNumber, | ||||
|                           string Company, | ||||
|                           string ConnectionString, | ||||
|                           string GitCommitSeven, | ||||
|                           string InboundApiAllowedIPList, | ||||
|                           bool IsDevelopment, | ||||
|                           bool IsStaging, | ||||
|                           string MockRoot, | ||||
|                           string MonAResource, | ||||
|                           string MonASite, | ||||
|                           string OI2SqlConnectionString, | ||||
|                           string OIExportPath, | ||||
|                           string URLs, | ||||
|                           string WorkingDirectoryName) | ||||
| { | ||||
|  | ||||
|     public override string ToString() | ||||
|     { | ||||
|         string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true }); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										113
									
								
								Server/Models/Binder/AppSettings.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,113 @@ | ||||
| using System.ComponentModel.DataAnnotations; | ||||
| using System.Text.Json; | ||||
|  | ||||
| namespace OI.Metrology.Server.Models.Binder; | ||||
|  | ||||
| public class AppSettings | ||||
| { | ||||
|  | ||||
| #nullable disable | ||||
|  | ||||
|     [Display(Name = "Api Logging Content Types"), Required] public string ApiLoggingContentTypes { get; set; } | ||||
|     [Display(Name = "Api Logging Path Prefixes"), Required] public string ApiLoggingPathPrefixes { get; set; } | ||||
|     [Display(Name = "Api Log Path"), Required] public string ApiLogPath { get; set; } | ||||
|     [Display(Name = "Api URL"), Required] public string ApiUrl { get; set; } | ||||
|     [Display(Name = "Attachment Path"), Required] public string AttachmentPath { get; set; } | ||||
|     [Display(Name = "Build Number"), Required] public string BuildNumber { get; set; } | ||||
|     [Display(Name = "Company"), Required] public string Company { get; set; } | ||||
|     [Display(Name = "Connection String"), Required] public string ConnectionString { get; set; } | ||||
|     [Display(Name = "Git Commit Seven"), Required] public string GitCommitSeven { get; set; } | ||||
|     [Display(Name = "Inbound Api Allowed IP List"), Required] public string InboundApiAllowedIPList { get; set; } | ||||
|     [Display(Name = "Is Development"), Required] public bool? IsDevelopment { get; set; } | ||||
|     [Display(Name = "Is Staging"), Required] public bool? IsStaging { get; set; } | ||||
|     [Display(Name = "Mock Root"), Required] public string MockRoot { get; set; } | ||||
|     [Display(Name = "MonA Resource"), Required] public string MonAResource { get; set; } | ||||
|     [Display(Name = "MonA Site"), Required] public string MonASite { get; set; } | ||||
|     [Display(Name = "Oi 2 Sql Connection String"), Required] public string Oi2SqlConnectionString { get; set; } | ||||
|     [Display(Name = "OI Export Path"), Required] public string OIExportPath { get; set; } | ||||
|     [Display(Name = "URLs"), Required] public string URLs { get; set; } | ||||
|     [Display(Name = "Working Directory Name"), Required] public string WorkingDirectoryName { get; set; } | ||||
|  | ||||
| #nullable restore | ||||
|  | ||||
|     public override string ToString() | ||||
|     { | ||||
|         string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true }); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static Models.AppSettings Get(AppSettings? appSettings) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
|         if (appSettings is null) | ||||
|             throw new NullReferenceException(nameof(appSettings)); | ||||
|         if (appSettings.ApiLoggingContentTypes is null) | ||||
|             throw new NullReferenceException(nameof(ApiLoggingContentTypes)); | ||||
|         if (appSettings.ApiLoggingPathPrefixes is null) | ||||
|             throw new NullReferenceException(nameof(ApiLoggingPathPrefixes)); | ||||
|         if (appSettings.ApiLogPath is null) | ||||
|             throw new NullReferenceException(nameof(ApiLogPath)); | ||||
|         if (appSettings.ApiUrl is null) | ||||
|             throw new NullReferenceException(nameof(ApiUrl)); | ||||
|         if (appSettings.AttachmentPath is null) | ||||
|             throw new NullReferenceException(nameof(AttachmentPath)); | ||||
|         if (appSettings.BuildNumber is null) | ||||
|             throw new NullReferenceException(nameof(BuildNumber)); | ||||
|         if (appSettings.Company is null) | ||||
|             throw new NullReferenceException(nameof(Company)); | ||||
|         if (appSettings.ConnectionString is null) | ||||
|             throw new NullReferenceException(nameof(ConnectionString)); | ||||
|         if (appSettings.GitCommitSeven is null) | ||||
|             throw new NullReferenceException(nameof(GitCommitSeven)); | ||||
|         if (appSettings.InboundApiAllowedIPList is null) | ||||
|             throw new NullReferenceException(nameof(InboundApiAllowedIPList)); | ||||
|         if (appSettings.IsDevelopment is null) | ||||
|             throw new NullReferenceException(nameof(IsDevelopment)); | ||||
|         if (appSettings.IsStaging is null) | ||||
|             throw new NullReferenceException(nameof(IsStaging)); | ||||
|         if (appSettings.MockRoot is null) | ||||
|             throw new NullReferenceException(nameof(MockRoot)); | ||||
|         if (appSettings.MonAResource is null) | ||||
|             throw new NullReferenceException(nameof(MonAResource)); | ||||
|         if (appSettings.MonASite is null) | ||||
|             throw new NullReferenceException(nameof(MonASite)); | ||||
|         if (appSettings.Oi2SqlConnectionString is null) | ||||
|             throw new NullReferenceException(nameof(Oi2SqlConnectionString)); | ||||
|         if (appSettings.OIExportPath is null) | ||||
|             throw new NullReferenceException(nameof(OIExportPath)); | ||||
|         if (appSettings.URLs is null) | ||||
|             throw new NullReferenceException(nameof(URLs)); | ||||
|         if (appSettings.WorkingDirectoryName is null) | ||||
|             throw new NullReferenceException(nameof(WorkingDirectoryName)); | ||||
|         result = new( | ||||
|             appSettings.ApiLoggingContentTypes, | ||||
|             appSettings.ApiLoggingPathPrefixes, | ||||
|             appSettings.ApiLogPath, | ||||
|             appSettings.ApiUrl, | ||||
|             appSettings.AttachmentPath, | ||||
|             appSettings.BuildNumber, | ||||
|             appSettings.Company, | ||||
|             appSettings.ConnectionString, | ||||
|             appSettings.GitCommitSeven, | ||||
|             appSettings.InboundApiAllowedIPList, | ||||
|             appSettings.IsDevelopment.Value, | ||||
|             appSettings.IsStaging.Value, | ||||
|             appSettings.MockRoot, | ||||
|             appSettings.MonAResource, | ||||
|             appSettings.MonASite, | ||||
|             appSettings.Oi2SqlConnectionString, | ||||
|             appSettings.OIExportPath, | ||||
|             appSettings.URLs, | ||||
|             appSettings.WorkingDirectoryName); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     public static Models.AppSettings Get(IConfigurationRoot configurationRoot) | ||||
|     { | ||||
|         Models.AppSettings result; | ||||
|         AppSettings? appSettings = configurationRoot.Get<AppSettings>(); | ||||
|         result = Get(appSettings); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										110
									
								
								Server/OI.Metrology.Server.csproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,110 @@ | ||||
| <Project Sdk="Microsoft.NET.Sdk.Web"> | ||||
|     <PropertyGroup Label="Globals"> | ||||
|         <SccProjectName>SAK</SccProjectName> | ||||
|         <SccProvider>SAK</SccProvider> | ||||
|         <SccAuxPath>SAK</SccAuxPath> | ||||
|         <SccLocalPath>SAK</SccLocalPath> | ||||
|     </PropertyGroup> | ||||
|     <PropertyGroup> | ||||
|         <ImplicitUsings>enable</ImplicitUsings> | ||||
|         <IsPackable>false</IsPackable> | ||||
|         <LangVersion>10.0</LangVersion> | ||||
|         <Nullable>enable</Nullable> | ||||
|         <OutputType>Exe</OutputType> | ||||
|         <RuntimeIdentifier>win-x64</RuntimeIdentifier> | ||||
|         <TargetFramework>net7.0</TargetFramework> | ||||
|     </PropertyGroup> | ||||
|     <ItemGroup> | ||||
|         <Compile Remove="logs\**" /> | ||||
|         <Content Remove="logs\**" /> | ||||
|         <EmbeddedResource Remove="logs\**" /> | ||||
|         <None Remove="logs\**" /> | ||||
|     </ItemGroup> | ||||
|     <ItemGroup> | ||||
|         <Content Remove="compilerconfig.json" /> | ||||
|     </ItemGroup> | ||||
|     <ItemGroup> | ||||
|         <PackageReference Include="Dapper" Version="2.0.123" /> | ||||
|         <PackageReference Include="EntityFramework" Version="6.4.4" /> | ||||
|         <PackageReference Include="jQuery" Version="3.6.3" /> | ||||
|         <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="7.0.2" /> | ||||
|         <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="7.0.0" /> | ||||
|         <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="7.0.0" /> | ||||
|         <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="7.0.0" /> | ||||
|         <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" /> | ||||
|         <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="7.0.0" /> | ||||
|         <PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.0" /> | ||||
|         <PackageReference Include="Newtonsoft.Json" Version="13.0.2" /> | ||||
|         <PackageReference Include="Serilog.AspNetCore.Ingestion" Version="1.0.0-dev-00032" /> | ||||
|         <PackageReference Include="Serilog.AspNetCore" Version="6.1.0" /> | ||||
|         <PackageReference Include="Serilog.Settings.Configuration" Version="3.4.0" /> | ||||
|         <PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" /> | ||||
|         <PackageReference Include="Serilog.Sinks.File" Version="5.0.0" /> | ||||
|         <PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" /> | ||||
|         <PackageReference Include="System.Data.SqlClient" Version="4.8.5" /> | ||||
|     </ItemGroup> | ||||
|     <ItemGroup> | ||||
|         <ProjectReference Include="..\Shared\OI.Metrology.Shared.csproj" /> | ||||
|     </ItemGroup> | ||||
|     <ItemGroup> | ||||
|         <Folder Include="moves\" /> | ||||
|         <Folder Include="wwwroot\images\" /> | ||||
|         <Folder Include="wwwroot\styles\" /> | ||||
|     </ItemGroup> | ||||
|     <ItemGroup> | ||||
|         <None Include="compilerconfig.json" /> | ||||
|     </ItemGroup> | ||||
|     <ItemGroup> | ||||
|         <None Include="appsettings.json"> | ||||
|             <CopyToOutputDirectory>Always</CopyToOutputDirectory> | ||||
|         </None> | ||||
|         <None Include="appsettings.Development.json"> | ||||
|             <CopyToOutputDirectory>Always</CopyToOutputDirectory> | ||||
|         </None> | ||||
|         <None Include="Data\Mike\service-shop.json"> | ||||
|             <CopyToOutputDirectory>Always</CopyToOutputDirectory> | ||||
|         </None> | ||||
|         <None Include="Data\Tests\GetAllServiceShopOrdersApi.json"> | ||||
|             <CopyToOutputDirectory>Always</CopyToOutputDirectory> | ||||
|         </None> | ||||
|         <None Include="Data\Tests\GetAppSettingsApi.json"> | ||||
|             <CopyToOutputDirectory>Always</CopyToOutputDirectory> | ||||
|         </None> | ||||
|         <None Include="Data\Tests\GetAwaitingDispositionApi.json"> | ||||
|             <CopyToOutputDirectory>Always</CopyToOutputDirectory> | ||||
|         </None> | ||||
|         <None Include="Data\Tests\GetBuildNumberAndGitCommitSevenApi.json"> | ||||
|             <CopyToOutputDirectory>Always</CopyToOutputDirectory> | ||||
|         </None> | ||||
|         <None Include="Data\Tests\GetClientSettingsApi.json"> | ||||
|             <CopyToOutputDirectory>Always</CopyToOutputDirectory> | ||||
|         </None> | ||||
|         <None Include="Data\Tests\GetDataApi.json"> | ||||
|             <CopyToOutputDirectory>Always</CopyToOutputDirectory> | ||||
|         </None> | ||||
|         <None Include="Data\Tests\GetExportDataApi.json"> | ||||
|             <CopyToOutputDirectory>Always</CopyToOutputDirectory> | ||||
|         </None> | ||||
|         <None Include="Data\Tests\GetHeaderFieldsApi.json"> | ||||
|             <CopyToOutputDirectory>Always</CopyToOutputDirectory> | ||||
|         </None> | ||||
|         <None Include="Data\Tests\GetHeadersApi.json"> | ||||
|             <CopyToOutputDirectory>Always</CopyToOutputDirectory> | ||||
|         </None> | ||||
|         <None Include="Data\Tests\GetHeaderTitlesApi.json"> | ||||
|             <CopyToOutputDirectory>Always</CopyToOutputDirectory> | ||||
|         </None> | ||||
|         <None Include="Data\Tests\GetIpAddressApi.json"> | ||||
|             <CopyToOutputDirectory>Always</CopyToOutputDirectory> | ||||
|         </None> | ||||
|         <None Include="Data\Tests\GetPinnedTableApi.json"> | ||||
|             <CopyToOutputDirectory>Always</CopyToOutputDirectory> | ||||
|         </None> | ||||
|         <None Include="Data\Tests\GetToolTypeMetadataApi.json"> | ||||
|             <CopyToOutputDirectory>Always</CopyToOutputDirectory> | ||||
|         </None> | ||||
|         <None Include="Data\Tests\IndexApi.json"> | ||||
|             <CopyToOutputDirectory>Always</CopyToOutputDirectory> | ||||
|         </None> | ||||
|     </ItemGroup> | ||||
| </Project> | ||||
| @ -1,22 +1,17 @@ | ||||
| using Microsoft.AspNetCore.Builder; | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
| using Microsoft.Extensions.Configuration; | ||||
| using Microsoft.Extensions.DependencyInjection; | ||||
| using Microsoft.Extensions.Hosting; | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
| using Microsoft.Extensions.Hosting.WindowsServices; | ||||
| using Microsoft.Extensions.Logging; | ||||
| using OI.Metrology.Server.Models; | ||||
| using OI.Metrology.Server.Repositories; | ||||
| using OI.Metrology.Server.Repository; | ||||
| using OI.Metrology.Server.Services; | ||||
| using OI.Metrology.Shared.Models; | ||||
| using OI.Metrology.Shared.Models.Stateless; | ||||
| using OI.Metrology.Shared.Repositories; | ||||
| using OI.Metrology.Shared.Services; | ||||
| using OI.Metrology.Viewer.Models; | ||||
| using OI.Metrology.Viewer.Repositories; | ||||
| using OI.Metrology.Viewer.Services; | ||||
| using Serilog; | ||||
| using System; | ||||
| using System.IO; | ||||
| using System.Reflection; | ||||
| 
 | ||||
| namespace OI.Metrology.Viewer; | ||||
| namespace OI.Metrology.Server; | ||||
| 
 | ||||
| public class Program | ||||
| { | ||||
| @ -25,7 +20,7 @@ public class Program | ||||
|     { | ||||
|         string webRootPath; | ||||
|         Assembly assembly = Assembly.GetExecutingAssembly(); | ||||
|         string assemblyName = assembly.GetName()?.Name; | ||||
|         string? assemblyName = assembly.GetName()?.Name; | ||||
|         if (string.IsNullOrEmpty(assemblyName)) | ||||
|             throw new Exception(); | ||||
|         string baseAssemblyName = assemblyName.Split('.')[0]; | ||||
| @ -63,14 +58,26 @@ public class Program | ||||
|         { | ||||
|             _ = webApplicationBuilder.Services.Configure<ApiBehaviorOptions>(options => options.SuppressModelStateInvalidFilter = true); | ||||
|             _ = webApplicationBuilder.Services.AddControllersWithViews(); | ||||
|             _ = new MetrologyRepo(new SQLDbConnectionFactory(appSettings), null); | ||||
|             _ = webApplicationBuilder.Services.AddDistributedMemoryCache(); | ||||
|             _ = webApplicationBuilder.Services.AddMemoryCache(); | ||||
|             _ = webApplicationBuilder.Services.AddSingleton<AppSettings, AppSettings>(_ => appSettings); | ||||
| 
 | ||||
|             AppSettingsRepository appSettingsRepository = new(appSettings); | ||||
|             SQLDbConnectionFactory sqlDbConnectionFactory = new(appSettings); | ||||
|             ClientSettingsRepository clientSettingsRepository = new(appSettings); | ||||
| 
 | ||||
|             _ = webApplicationBuilder.Services.AddSingleton(_ => appSettings); | ||||
|             _ = webApplicationBuilder.Services.AddSingleton<IInboundRepository, InboundRepository>(); | ||||
|             _ = webApplicationBuilder.Services.AddSingleton<IClientSettingsRepository>(_ => clientSettingsRepository); | ||||
|             _ = webApplicationBuilder.Services.AddSingleton<IServiceShopOrderRepository, ServiceShopOrderRepository>(); | ||||
|             _ = webApplicationBuilder.Services.AddSingleton<IPinRepository, PinRepository>(_ => new(appSettings.MockRoot)); | ||||
|             _ = webApplicationBuilder.Services.AddSingleton<IDbConnectionFactory, SQLDbConnectionFactory>(_ => sqlDbConnectionFactory); | ||||
|             _ = webApplicationBuilder.Services.AddSingleton<IToolTypesRepository, ToolTypesRepository>(_ => new(appSettings.MockRoot)); | ||||
|             _ = webApplicationBuilder.Services.AddSingleton<IAppSettingsRepository<Models.Binder.AppSettings>>(_ => appSettingsRepository); | ||||
| 
 | ||||
|             _ = webApplicationBuilder.Services.AddScoped<IAttachmentsService, AttachmentsService>(); | ||||
|             _ = webApplicationBuilder.Services.AddScoped<IInboundDataService, InboundDataService>(); | ||||
|             _ = webApplicationBuilder.Services.AddScoped<IMetrologyRepo, MetrologyRepo>(); | ||||
|             _ = webApplicationBuilder.Services.AddSingleton<IDbConnectionFactory, SQLDbConnectionFactory>(); | ||||
|             _ = webApplicationBuilder.Services.AddScoped<IMetrologyRepository, MetrologyRepository>(); | ||||
| 
 | ||||
|             _ = webApplicationBuilder.Services.AddSwaggerGen(); | ||||
|             _ = webApplicationBuilder.Services.AddSession(sessionOptions => | ||||
|                 { | ||||
| @ -84,14 +91,18 @@ public class Program | ||||
|                 _ = webApplicationBuilder.Services.AddSingleton<IHostLifetime, WindowsServiceLifetime>(); | ||||
|                 _ = webApplicationBuilder.Logging.AddEventLog(settings => | ||||
|                 { | ||||
| #pragma warning disable CA1416 | ||||
|                     if (string.IsNullOrEmpty(settings.SourceName)) | ||||
|                         settings.SourceName = webApplicationBuilder.Environment.ApplicationName; | ||||
| #pragma warning restore | ||||
|                 }); | ||||
|             } | ||||
|             WebApplication webApplication = webApplicationBuilder.Build(); | ||||
|             _ = webApplication.UseCors(corsPolicyBuilder => corsPolicyBuilder.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod()); | ||||
|             if (!webApplicationBuilder.Environment.IsDevelopment()) | ||||
|             { | ||||
|                 _ = webApplication.UseExceptionHandler("/Error"); | ||||
|                 _ = webApplication.UseHttpsRedirection(); | ||||
|                 _ = webApplication.UseHsts(); | ||||
|             } | ||||
|             else | ||||
| @ -102,7 +113,7 @@ public class Program | ||||
|                     webApplication.Lifetime.StopApplication(); | ||||
|                 } | ||||
|                 _ = webApplication.UseSwagger(); | ||||
|                 _ = webApplication.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Viewer V1")); | ||||
|                 _ = webApplication.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Server V1")); | ||||
|             } | ||||
|             _ = webApplication.Lifetime.ApplicationStopped.Register(Log.CloseAndFlush); | ||||
|             _ = ApplicationBuilderSerilogClientExtensions.UseSerilogIngestion(webApplication); | ||||
| @ -110,7 +121,6 @@ public class Program | ||||
|             _ = webApplication.UseFileServer(enableDirectoryBrowsing: true); | ||||
|             _ = webApplication.UseStaticFiles(); | ||||
|             _ = webApplication.UseSession(); | ||||
|             _ = webApplication.UseHttpsRedirection(); | ||||
|             _ = webApplication.UseMiddleware<ApiLoggingMiddleware>(); | ||||
|             _ = webApplication.MapControllers(); | ||||
|             log.Information("Starting Web Application"); | ||||
							
								
								
									
										31
									
								
								Server/Properties/launchSettings.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,31 @@ | ||||
| { | ||||
|   "profiles": { | ||||
|     "http": { | ||||
|       "commandName": "Project", | ||||
|       "dotnetRunMessages": true, | ||||
|       "launchBrowser": false, | ||||
|       "applicationUrl": "http://localhost:5126", | ||||
|       "environmentVariables": { | ||||
|         "ASPNETCORE_ENVIRONMENT": "Development" | ||||
|       } | ||||
|     }, | ||||
|     "https": { | ||||
|       "commandName": "Project", | ||||
|       "dotnetRunMessages": true, | ||||
|       "launchBrowser": false, | ||||
|       "applicationUrl": "https://localhost:7130;http://localhost:5126", | ||||
|       "environmentVariables": { | ||||
|         "ASPNETCORE_ENVIRONMENT": "Development" | ||||
|       } | ||||
|     }, | ||||
|     "https-prod": { | ||||
|       "commandName": "Project", | ||||
|       "dotnetRunMessages": true, | ||||
|       "launchBrowser": false, | ||||
|       "applicationUrl": "https://localhost:7130;http://localhost:5126", | ||||
|       "environmentVariables": { | ||||
|         "ASPNETCORE_ENVIRONMENT": "Production" | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										36
									
								
								Server/Repositories/AppSettingsRepository.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,36 @@ | ||||
| using OI.Metrology.Server.Models; | ||||
| using OI.Metrology.Shared.Models.Stateless; | ||||
|  | ||||
| namespace OI.Metrology.Server.Repository; | ||||
|  | ||||
| public class AppSettingsRepository : IAppSettingsRepository<Models.Binder.AppSettings> | ||||
| { | ||||
|  | ||||
|     private readonly AppSettings _AppSettings; | ||||
|  | ||||
|     public AppSettingsRepository(AppSettings appSettings) => _AppSettings = appSettings; | ||||
|  | ||||
|     internal Models.Binder.AppSettings GetAppSettings() | ||||
|     { | ||||
|         Models.Binder.AppSettings result = new() | ||||
|         { | ||||
|             BuildNumber = _AppSettings.BuildNumber, | ||||
|             Company = _AppSettings.Company, | ||||
|             GitCommitSeven = _AppSettings.GitCommitSeven, | ||||
|             IsDevelopment = _AppSettings.IsDevelopment, | ||||
|             IsStaging = _AppSettings.IsStaging, | ||||
|         }; | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     Models.Binder.AppSettings IAppSettingsRepository<Models.Binder.AppSettings>.GetAppSettings() => GetAppSettings(); | ||||
|  | ||||
|     internal string GetBuildNumberAndGitCommitSeven() | ||||
|     { | ||||
|         string result = string.Concat(_AppSettings.BuildNumber, '-', _AppSettings.GitCommitSeven); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     string IAppSettingsRepository<Models.Binder.AppSettings>.GetBuildNumberAndGitCommitSeven() => GetBuildNumberAndGitCommitSeven(); | ||||
|  | ||||
| } | ||||
							
								
								
									
										36
									
								
								Server/Repositories/ClientSettingsRepository.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,36 @@ | ||||
| using OI.Metrology.Server.Models; | ||||
| using OI.Metrology.Shared.Models.Stateless; | ||||
| using System.Net; | ||||
|  | ||||
| namespace OI.Metrology.Server.Repository; | ||||
|  | ||||
| public class ClientSettingsRepository : IClientSettingsRepository | ||||
| { | ||||
|  | ||||
|     private readonly AppSettings _AppSettings; | ||||
|  | ||||
|     public ClientSettingsRepository(AppSettings appSettings) => _AppSettings = appSettings; | ||||
|  | ||||
|     internal List<string> GetClientSettings(IPAddress? remoteIpAddress) | ||||
|     { | ||||
|         List<string> results = new(); | ||||
|         if (remoteIpAddress is null) | ||||
|             results.Add(nameof(remoteIpAddress)); | ||||
|         else | ||||
|             results.Add(remoteIpAddress.ToString()); | ||||
|         if (!_AppSettings.IsDevelopment) | ||||
|             throw new Exception("Shouldn't expose!"); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     List<string> IClientSettingsRepository.GetClientSettings(IPAddress? remoteIpAddress) => GetClientSettings(remoteIpAddress); | ||||
|  | ||||
|     internal static string GetIpAddress(IPAddress? remoteIpAddress) | ||||
|     { | ||||
|         string result = remoteIpAddress is null ? string.Empty : remoteIpAddress.ToString(); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     string IClientSettingsRepository.GetIpAddress(IPAddress? remoteIpAddress) => GetIpAddress(remoteIpAddress); | ||||
|  | ||||
| } | ||||
							
								
								
									
										88
									
								
								Server/Repositories/InboundRepository.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,88 @@ | ||||
| using Newtonsoft.Json.Linq; | ||||
| using OI.Metrology.Shared.DataModels; | ||||
| using OI.Metrology.Shared.Models; | ||||
| using OI.Metrology.Shared.Models.Stateless; | ||||
| using OI.Metrology.Shared.Services; | ||||
| using System.Net; | ||||
|  | ||||
| namespace OI.Metrology.Server.Repository; | ||||
|  | ||||
| public class InboundRepository : IInboundRepository | ||||
| { | ||||
|  | ||||
|     private readonly Serilog.ILogger _Log; | ||||
|  | ||||
|     public InboundRepository() => _Log = Serilog.Log.ForContext<InboundRepository>(); | ||||
|  | ||||
|     bool IInboundRepository.IsIPAddressAllowed(string inboundApiAllowedIPList, IPAddress? remoteIP) | ||||
|     { | ||||
|         if (string.IsNullOrWhiteSpace(inboundApiAllowedIPList)) | ||||
|             return true; | ||||
|         if (remoteIP is null) | ||||
|             return false; | ||||
|         byte[] remoteIPBytes = remoteIP.GetAddressBytes(); | ||||
|         string[] allowedIPs = inboundApiAllowedIPList.Split(';'); | ||||
|         foreach (string ip in allowedIPs) | ||||
|         { | ||||
|             IPAddress? parsedIP; | ||||
|             if (IPAddress.TryParse(ip, out parsedIP)) | ||||
|             { | ||||
|                 if (parsedIP.GetAddressBytes().SequenceEqual(remoteIPBytes)) | ||||
|                     return true; | ||||
|             } | ||||
|         } | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     // this is the main endpoint, it accepts a JSON message that contains both the header and data records together | ||||
|     // tooltype is the ToolTypeName column from the ToolType table | ||||
|     // JToken is how you can accept a JSON message without deserialization. | ||||
|     // Using "string" doesn't work because ASP.NET Core will expect a json encoded string, not give you the actual string. | ||||
|     DataResponse IInboundRepository.Data(IMetrologyRepository metrologyRepository, IInboundDataService inboundDataService, string tooltype, JToken jsonbody) | ||||
|     { | ||||
|         DataResponse result = new(); | ||||
|         ToolType? toolType = metrologyRepository.GetToolTypeByName(tooltype); | ||||
|         if (toolType is null) | ||||
|             result.Errors.Add("Invalid tool type: " + tooltype); | ||||
|         else | ||||
|         { | ||||
|             List<ToolTypeMetadata> metaData = metrologyRepository.GetToolTypeMetadataByToolTypeID(toolType.ID).ToList(); | ||||
|             if (metaData is null) | ||||
|                 result.Errors.Add("Invalid metadata for tool type: " + tooltype); | ||||
|             else if (jsonbody is null) | ||||
|                 result.Errors.Add("Invalid json"); | ||||
|             else | ||||
|                 inboundDataService.ValidateJSONFields(jsonbody, 0, metaData, result.Errors, result.Warnings); | ||||
|             if (metaData is not null && jsonbody is not null && !result.Errors.Any()) | ||||
|             { | ||||
|                 try | ||||
|                 { | ||||
|                     result.HeaderID = inboundDataService.DoSQLInsert(jsonbody, toolType, metaData); | ||||
|                     result.Success = result.HeaderID > 0; | ||||
|                 } | ||||
|                 catch (Exception ex) { result.Errors.Add(ex.Message); } | ||||
|             } | ||||
|         } | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     // this is the endpoint for attaching a field.  It is not JSON, it is form-data/multipart like an HTML form because that's the normal way. | ||||
|     // header ID is the ID value from the Header table | ||||
|     // datauniqueid is the Title value from the Data/Detail table | ||||
|     string? IInboundRepository.AttachFile(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService, string tooltype, long headerid, string datauniqueid, string fileName, object uploadedFile) | ||||
|     { | ||||
|         string? result = null; | ||||
|         ToolType toolType = metrologyRepository.GetToolTypeByName(tooltype); | ||||
|         if (toolType is null) | ||||
|             result = $"Invalid tool type: {tooltype}"; | ||||
|         string filename = Path.GetFileName(fileName); | ||||
|         if (string.IsNullOrWhiteSpace(filename)) | ||||
|             result = "Empty filename"; | ||||
|         if (filename.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0) | ||||
|             result = "Invalid filename"; | ||||
|         if (result is null && toolType is not null) | ||||
|             attachmentsService.SaveAttachment(toolType, headerid, datauniqueid, filename, uploadedFile); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @ -1,25 +1,29 @@ | ||||
| using Dapper; | ||||
| using Microsoft.Extensions.Caching.Memory; | ||||
| using Newtonsoft.Json.Linq; | ||||
| using OI.Metrology.Server.Models; | ||||
| using OI.Metrology.Shared.DataModels; | ||||
| using OI.Metrology.Shared.Models.Stateless; | ||||
| using OI.Metrology.Shared.Repositories; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Data; | ||||
| using System.Data.Common; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Transactions; | ||||
| 
 | ||||
| namespace OI.Metrology.Viewer.Repositories; | ||||
| #pragma warning disable CS8600, CS8602, CS8603, CS8604, CS8625 | ||||
| 
 | ||||
| public class MetrologyRepo : IMetrologyRepo | ||||
| namespace OI.Metrology.Server.Repositories; | ||||
| 
 | ||||
| public class MetrologyRepository : IMetrologyRepository | ||||
| { | ||||
|     private readonly string _MockRoot; | ||||
|     private readonly IMemoryCache _Cache; | ||||
|     private readonly IDbConnectionFactory _DBConnectionFactory; | ||||
| 
 | ||||
|     public MetrologyRepo(IDbConnectionFactory dbConnectionFactory, IMemoryCache memoryCache) | ||||
|     public MetrologyRepository(AppSettings appSettings, IDbConnectionFactory dbConnectionFactory, IMemoryCache memoryCache) | ||||
|     { | ||||
|         _Cache = memoryCache; | ||||
|         _MockRoot = appSettings.MockRoot; | ||||
|         _DBConnectionFactory = dbConnectionFactory; | ||||
|     } | ||||
| 
 | ||||
| @ -28,21 +32,7 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|     protected DbProviderFactory GetDbProviderFactory(IDbConnection conn) => | ||||
|         DbProviderFactories.GetFactory(conn.GetType().Namespace); | ||||
| 
 | ||||
|     public bool IsTestDatabase() | ||||
|     { | ||||
|         int c = 0; | ||||
|         using (DbConnection conn = GetDbConnection()) | ||||
|         { | ||||
|             c = conn.Query<int>( | ||||
|                 "SELECT COUNT(*) " + | ||||
|                 "FROM Configuration " + | ||||
|                 "WHERE KeyName = 'TestDatabase' " + | ||||
|                 "AND ValueString = '1'").FirstOrDefault(); | ||||
|         } | ||||
|         return c > 0; | ||||
|     } | ||||
| 
 | ||||
|     public TransactionScope StartTransaction() => new(); | ||||
|     internal static TransactionScope StartTransaction() => new(); | ||||
| 
 | ||||
|     protected void CacheItem(string key, object v) | ||||
|     { | ||||
| @ -51,7 +41,7 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|         _ = _Cache.Set(key, v, new MemoryCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromHours(1))); | ||||
|     } | ||||
| 
 | ||||
|     public IEnumerable<ToolType> GetToolTypes() | ||||
|     internal IEnumerable<ToolType> GetToolTypes() | ||||
|     { | ||||
|         IEnumerable<ToolType> cached; | ||||
|         string cacheKey = "GetToolTypes"; | ||||
| @ -66,7 +56,7 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|         return r; | ||||
|     } | ||||
| 
 | ||||
|     public ToolType GetToolTypeByName(string name) | ||||
|     internal ToolType GetToolTypeByName(string name) | ||||
|     { | ||||
|         ToolType cached; | ||||
|         string cacheKey = "GetToolTypeByName_" + name; | ||||
| @ -83,7 +73,7 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|         return r; | ||||
|     } | ||||
| 
 | ||||
|     public ToolType GetToolTypeByID(int id) | ||||
|     internal ToolType GetToolTypeByID(int id) | ||||
|     { | ||||
|         ToolType cached; | ||||
|         string cacheKey = "GetToolTypeByID_" + id.ToString(); | ||||
| @ -100,7 +90,7 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|         return r; | ||||
|     } | ||||
| 
 | ||||
|     public IEnumerable<ToolTypeMetadata> GetToolTypeMetadataByToolTypeID(int id) | ||||
|     internal IEnumerable<ToolTypeMetadata> GetToolTypeMetadataByToolTypeID(int id) | ||||
|     { | ||||
|         IEnumerable<ToolTypeMetadata> cached; | ||||
|         string cacheKey = "GetToolTypeMetadataByToolTypeID_" + id.ToString(); | ||||
| @ -117,7 +107,7 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|         return r; | ||||
|     } | ||||
| 
 | ||||
|     public long InsertToolDataJSON(JToken jsonrow, long headerId, List<ToolTypeMetadata> metaData, string tableName) | ||||
|     internal long InsertToolDataJSON(JToken jsonrow, long headerId, List<ToolTypeMetadata> metaData, string tableName) | ||||
|     { | ||||
|         long r = -1; | ||||
|         using (DbConnection conn = GetDbConnection()) | ||||
| @ -139,10 +129,10 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|             // build field map | ||||
|             foreach (ToolTypeMetadata f in fields) | ||||
|             { | ||||
|                 if ((f.ApiName != null) && f.ApiName.Contains('\\')) | ||||
|                 if ((f.ApiName is not null) && f.ApiName.Contains('\\')) | ||||
|                 { | ||||
|                     string n = f.ApiName.Split('\\')[0].Trim().ToUpper(); | ||||
|                     if (containerField == null) | ||||
|                     if (containerField is null) | ||||
|                         containerField = n; | ||||
|                     else if (!string.Equals(containerField, n)) | ||||
|                         throw new Exception("Only one container field is allowed"); | ||||
| @ -156,7 +146,7 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             if (containerField == null) | ||||
|             if (containerField is null) | ||||
|             { | ||||
|                 // No container field, just  insert a single row | ||||
| 
 | ||||
| @ -167,7 +157,7 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|                 // Find the container field in the json | ||||
|                 JProperty contJP = jsonrow.Children<JProperty>().Where(c => string.Equals(c.Name.Trim(), containerField, StringComparison.OrdinalIgnoreCase)).SingleOrDefault(); | ||||
| 
 | ||||
|                 if ((contJP != null) && (contJP.Value is JArray array)) | ||||
|                 if ((contJP is not null) && (contJP.Value is JArray array)) | ||||
|                 { | ||||
|                     JArray contRows = array; | ||||
| 
 | ||||
| @ -220,42 +210,40 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|         { | ||||
|             string apifield = jp.Name.Trim().ToUpper(); | ||||
| 
 | ||||
|             if (fieldmap.ContainsKey(apifield)) | ||||
|             if (fieldmap.TryGetValue(apifield, out string value)) | ||||
|             { | ||||
|                 string parmname = string.Format("@p{0}", parmnumber); | ||||
| 
 | ||||
|                 columns += string.Format("[{0}],", fieldmap[apifield]); | ||||
|                 columns += string.Format("[{0}],", value); | ||||
|                 parms += parmname; | ||||
|                 parms += ","; | ||||
|                 parmnumber += 1; | ||||
| 
 | ||||
|                 object sqlValue = ((JValue)jp.Value).Value; | ||||
|                 if (sqlValue == null) | ||||
|                     sqlValue = DBNull.Value; | ||||
|                 sqlValue ??= DBNull.Value; | ||||
| 
 | ||||
|                 AddParameter(cmd, parmname, sqlValue); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         if ((containerrow != null) && (containerFieldmap != null)) | ||||
|         if ((containerrow is not null) && (containerFieldmap is not null)) | ||||
|         { | ||||
| 
 | ||||
|             foreach (JProperty jp in containerrow.Children<JProperty>()) | ||||
|             { | ||||
|                 string apifield = jp.Name.Trim().ToUpper(); | ||||
| 
 | ||||
|                 if (containerFieldmap.ContainsKey(apifield)) | ||||
|                 if (containerFieldmap.TryGetValue(apifield, out string value)) | ||||
|                 { | ||||
|                     string parmname = string.Format("@p{0}", parmnumber); | ||||
| 
 | ||||
|                     columns += string.Format("[{0}],", containerFieldmap[apifield]); | ||||
|                     columns += string.Format("[{0}],", value); | ||||
|                     parms += parmname; | ||||
|                     parms += ","; | ||||
|                     parmnumber += 1; | ||||
| 
 | ||||
|                     object sqlValue = ((JValue)jp.Value).Value; | ||||
|                     if (sqlValue == null) | ||||
|                         sqlValue = DBNull.Value; | ||||
|                     sqlValue ??= DBNull.Value; | ||||
| 
 | ||||
|                     AddParameter(cmd, parmname, sqlValue); | ||||
|                 } | ||||
| @ -269,12 +257,12 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|         cmd.CommandText = columns.TrimEnd(',') + parms.TrimEnd(',') + ";SELECT SCOPE_IDENTITY();"; | ||||
| 
 | ||||
|         object o = cmd.ExecuteScalar(); | ||||
|         if ((o == null) || Convert.IsDBNull(o)) | ||||
|         if ((o is null) || Convert.IsDBNull(o)) | ||||
|             throw new Exception("Unexpected query result"); | ||||
|         return Convert.ToInt64(o); | ||||
|     } | ||||
| 
 | ||||
|     public DataTable ExportData(string spName, DateTime startTime, DateTime endTime) | ||||
|     internal DataTable ExportData(string spName, DateTime startTime, DateTime endTime) | ||||
|     { | ||||
|         DataTable dt = new(); | ||||
|         DateTime endTimeLocal = endTime.ToLocalTime(); | ||||
| @ -300,7 +288,7 @@ public class MetrologyRepo : IMetrologyRepo | ||||
| 
 | ||||
|     protected string FormDynamicSelectQuery(IEnumerable<ToolTypeMetadata> fields, string tableName) | ||||
|     { | ||||
|         System.Text.StringBuilder sb = new(); | ||||
|         StringBuilder sb = new(); | ||||
|         _ = sb.Append("SELECT "); | ||||
|         bool firstField = true; | ||||
|         foreach (ToolTypeMetadata f in fields) | ||||
| @ -309,7 +297,7 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|             { | ||||
|                 if (!firstField) | ||||
|                     _ = sb.Append(','); | ||||
|                 if (f.GridAttributes != null && f.GridAttributes.Contains("isNull")) | ||||
|                 if (f.GridAttributes is not null && f.GridAttributes.Contains("isNull")) | ||||
|                 { | ||||
|                     _ = sb.AppendFormat("{0}", "ISNULL(" + f.ColumnName + ", '')[" + f.ColumnName + "]"); | ||||
|                 } | ||||
| @ -324,20 +312,20 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|         return sb.ToString(); | ||||
|     } | ||||
| 
 | ||||
|     public DataTable GetHeaders(int toolTypeId, DateTime? startTime, DateTime? endTime, int? pageNo, int? pageSize, long? headerId, out long totalRecords) | ||||
|     internal DataTable GetHeaders(int toolTypeId, DateTime? startTime, DateTime? endTime, int? pageNo, int? pageSize, long? headerId, out long totalRecords) | ||||
|     { | ||||
|         ToolType tt = GetToolTypeByID(toolTypeId); | ||||
|         if (tt == null) | ||||
|         if (tt is null) | ||||
|             throw new Exception("Invalid tool type ID"); | ||||
| 
 | ||||
|         IEnumerable<ToolTypeMetadata> md = GetToolTypeMetadataByToolTypeID(toolTypeId); | ||||
|         if (md == null) | ||||
|         if (md is null) | ||||
|             throw new Exception("Invalid tool type metadata"); | ||||
| 
 | ||||
|         DataTable dt = new(); | ||||
|         using (DbConnection conn = GetDbConnection()) | ||||
|         { | ||||
|             System.Text.StringBuilder sb = new(); | ||||
|             StringBuilder sb = new(); | ||||
|             _ = sb.Append( | ||||
|                 FormDynamicSelectQuery( | ||||
|                     md.Where(m => m.Header == true).ToList(), | ||||
| @ -417,20 +405,20 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|         return dt; | ||||
|     } | ||||
| 
 | ||||
|     public DataTable GetData(int toolTypeId, long headerid) | ||||
|     internal DataTable GetData(int toolTypeId, long headerid) | ||||
|     { | ||||
|         ToolType tt = GetToolTypeByID(toolTypeId); | ||||
|         if (tt == null) | ||||
|         if (tt is null) | ||||
|             throw new Exception("Invalid tool type ID"); | ||||
| 
 | ||||
|         IEnumerable<ToolTypeMetadata> md = GetToolTypeMetadataByToolTypeID(toolTypeId); | ||||
|         if (md == null) | ||||
|         if (md is null) | ||||
|             throw new Exception("Invalid tool type metadata"); | ||||
| 
 | ||||
|         DataTable dt = new(); | ||||
|         using (DbConnection conn = GetDbConnection()) | ||||
|         { | ||||
|             System.Text.StringBuilder sb = new(); | ||||
|             StringBuilder sb = new(); | ||||
|             _ = sb.Append( | ||||
|                 FormDynamicSelectQuery( | ||||
|                     md.Where(m => m.Header == false).OrderBy(m => m.GridDisplayOrder).ToList(), | ||||
| @ -512,10 +500,10 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|         return dt; | ||||
|     } | ||||
| 
 | ||||
|     public Guid GetHeaderAttachmentID(int toolTypeId, long headerId) | ||||
|     internal Guid GetHeaderAttachmentID(int toolTypeId, long headerId) | ||||
|     { | ||||
|         ToolType tt = GetToolTypeByID(toolTypeId); | ||||
|         if (tt == null) | ||||
|         if (tt is null) | ||||
|             throw new Exception("Invalid tool type ID"); | ||||
| 
 | ||||
|         using DbConnection conn = GetDbConnection(); | ||||
| @ -524,10 +512,10 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|             $"SELECT AttachmentID FROM [{tt.HeaderTableName}] WHERE ID = @HeaderID"; | ||||
|         return conn.ExecuteScalar<Guid>(sql, param: new { HeaderID = headerId }); | ||||
|     } | ||||
|     public string GetHeaderInsertDate(int toolTypeId, long headerId) | ||||
|     internal string GetHeaderInsertDate(int toolTypeId, long headerId) | ||||
|     { | ||||
|         ToolType tt = GetToolTypeByID(toolTypeId); | ||||
|         if (tt == null) | ||||
|         if (tt is null) | ||||
|             throw new Exception("Invalid tool type ID"); | ||||
| 
 | ||||
|         using DbConnection conn = GetDbConnection(); | ||||
| @ -535,7 +523,7 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|             $"SELECT CONVERT(varchar, case when [InsertDate] < [Date] or [Date] is null then [InsertDate] else [Date] end, 120) d FROM[{tt.HeaderTableName}] where ID = @HeaderID"; | ||||
|         return conn.ExecuteScalar<string>(sql, param: new { HeaderID = headerId }); | ||||
|     } | ||||
|     public string GetAttachmentInsertDateByGUID(string tableName, Guid attachmentId) | ||||
|     internal string GetAttachmentInsertDateByGUID(string tableName, Guid attachmentId) | ||||
|     { | ||||
|         using DbConnection conn = GetDbConnection(); | ||||
|         string sql = ""; | ||||
| @ -550,16 +538,16 @@ public class MetrologyRepo : IMetrologyRepo | ||||
| 
 | ||||
|         return conn.ExecuteScalar<string>(sql, param: new { AttachmentID = attachmentId }); | ||||
|     } | ||||
|     public void SetHeaderDirName(string tableName, long headerId, string dateDir) | ||||
|     internal void SetHeaderDirName(string tableName, long headerId, string dateDir) | ||||
|     { | ||||
|         using DbConnection conn = GetDbConnection(); | ||||
|         _ = conn.Execute($"UPDATE [{tableName}] SET AttachDirName = @AttachDirName WHERE ID = @HeaderID;", new { HeaderID = headerId, AttachDirName = dateDir }); | ||||
|     } | ||||
| 
 | ||||
|     public Guid GetDataAttachmentID(int toolTypeId, long headerId, string title) | ||||
|     internal Guid GetDataAttachmentID(int toolTypeId, long headerId, string title) | ||||
|     { | ||||
|         ToolType tt = GetToolTypeByID(toolTypeId); | ||||
|         if (tt == null) | ||||
|         if (tt is null) | ||||
|             throw new Exception("Invalid tool type ID"); | ||||
| 
 | ||||
|         using DbConnection conn = GetDbConnection(); | ||||
| @ -569,10 +557,10 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|         return conn.ExecuteScalar<Guid>(sql, param: new { HeaderID = headerId, Title = title }); | ||||
|     } | ||||
|     // J Ouellette Added | ||||
|     public string GetDataInsertDate(int toolTypeId, long headerId, string title) | ||||
|     internal string GetDataInsertDate(int toolTypeId, long headerId, string title) | ||||
|     { | ||||
|         ToolType tt = GetToolTypeByID(toolTypeId); | ||||
|         if (tt == null) | ||||
|         if (tt is null) | ||||
|             throw new Exception("Invalid tool type ID"); | ||||
| 
 | ||||
|         using DbConnection conn = GetDbConnection(); | ||||
| @ -588,7 +576,7 @@ public class MetrologyRepo : IMetrologyRepo | ||||
| 
 | ||||
|         return conn.ExecuteScalar<string>(sql, param: new { HeaderID = headerId, Title = title }); | ||||
|     } | ||||
|     public void SetDataDirName(string tableName, long headerId, string title, string dateDir) | ||||
|     internal void SetDataDirName(string tableName, long headerId, string title, string dateDir) | ||||
|     { | ||||
|         using DbConnection conn = GetDbConnection(); | ||||
|         string sql = | ||||
| @ -596,16 +584,16 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|         _ = conn.Execute(sql, param: new { HeaderID = headerId, Title = title, AttachDirName = dateDir }); | ||||
|     } | ||||
| 
 | ||||
|     public void PurgeExistingData(int toolTypeId, string title) | ||||
|     internal void PurgeExistingData(int toolTypeId, string title) | ||||
|     { | ||||
|         using DbConnection conn = GetDbConnection(); | ||||
|         _ = conn.Execute("PurgeExistingData", param: new { ToolTypeID = toolTypeId, Title = title }, commandType: CommandType.StoredProcedure); | ||||
|     } | ||||
| 
 | ||||
|     public DataSet GetOIExportData(int toolTypeId, long headerid) | ||||
|     internal DataSet GetOIExportData(int toolTypeId, long headerid) | ||||
|     { | ||||
|         ToolType tt = GetToolTypeByID(toolTypeId); | ||||
|         if (tt == null) | ||||
|         if (tt is null) | ||||
|             throw new Exception("Invalid tool type ID"); | ||||
| 
 | ||||
|         if (string.IsNullOrWhiteSpace(tt.OIExportSPName)) | ||||
| @ -631,26 +619,60 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|         return ds; | ||||
|     } | ||||
| 
 | ||||
|     public IEnumerable<HeaderCommon> GetHeaderTitles(int toolTypeId, int? pageNo, int? pageSize, out long totalRecords) | ||||
|     private HeaderCommon[] GetHeaderTitles() | ||||
|     { | ||||
|         ToolType tt = GetToolTypeByID(toolTypeId); | ||||
|         if (tt == null) | ||||
|         IEnumerable<HeaderCommon> results; | ||||
|         ToolType[] toolTypes = GetToolTypes().ToArray(); | ||||
| 
 | ||||
|         if (!toolTypes.Any() || toolTypes.FirstOrDefault() is null) | ||||
|             throw new Exception("Invalid tool type ID"); | ||||
| 
 | ||||
|         ToolType tt; | ||||
|         StringBuilder stringBuilder = new(); | ||||
|         using DbConnection conn = GetDbConnection(); | ||||
|         _ = stringBuilder.Append(" SELECT * FROM ( "); | ||||
|         for (int i = 0; i < toolTypes.Length; i++) | ||||
|         { | ||||
|             tt = toolTypes[i]; | ||||
|             _ = stringBuilder.Append($" SELECT ID, InsertDate, AttachmentID, Title, [Date], {tt.ID} AS ToolTypeID, '{tt.ToolTypeName}' AS ToolTypeName, Reactor, RDS, PSN FROM {tt.HeaderTableName} "); | ||||
|             if (i != toolTypes.Length - 1) | ||||
|                 _ = stringBuilder.Append(" UNION ALL "); | ||||
|         } | ||||
|         _ = stringBuilder.Append(" ) AS A ORDER BY A.[Date] DESC "); | ||||
|         results = conn.Query<HeaderCommon>(stringBuilder.ToString()).ToArray(); | ||||
| 
 | ||||
|         return results.ToArray(); | ||||
|     } | ||||
| 
 | ||||
|     internal HeaderCommon[] GetHeaderTitles(int? toolTypeId, int? pageNo, int? pageSize, out long totalRecords) | ||||
|     { | ||||
|         HeaderCommon[] headers; | ||||
|         if (toolTypeId is not null && (pageNo is not null || pageSize is not null)) | ||||
|             throw new Exception(); | ||||
| 
 | ||||
|         if (toolTypeId is null) | ||||
|         { | ||||
|             headers = GetHeaderTitles(); | ||||
|             totalRecords = headers.Length; | ||||
|             return headers; | ||||
|         } | ||||
| 
 | ||||
|         ToolType tt = GetToolTypeByID(toolTypeId.Value); | ||||
|         if (tt is null) | ||||
|             throw new Exception("Invalid tool type ID"); | ||||
| 
 | ||||
|         using DbConnection conn = GetDbConnection(); | ||||
|         string sql = $"SELECT ID, InsertDate, AttachmentID, Title, [Date] FROM {tt.HeaderTableName} ORDER BY [Date] DESC "; | ||||
| 
 | ||||
|         IEnumerable<HeaderCommon> headers; | ||||
|         string sql = $"SELECT ID, InsertDate, AttachmentID, Title, [Date], {tt.ID} AS ToolTypeID, '{tt.ToolTypeName}' AS ToolTypeName, Reactor, RDS, PSN FROM {tt.HeaderTableName} ORDER BY [Date] DESC "; | ||||
| 
 | ||||
|         if (pageNo.HasValue && pageSize.HasValue) | ||||
|         { | ||||
|             sql += "OFFSET @PageNum * @PageSize ROWS FETCH NEXT @PageSize ROWS ONLY"; | ||||
| 
 | ||||
|             headers = conn.Query<HeaderCommon>(sql, param: new { PageNum = pageNo.Value, PageSize = pageSize.Value }).ToList(); | ||||
|             headers = conn.Query<HeaderCommon>(sql, param: new { PageNum = pageNo.Value, PageSize = pageSize.Value }).ToArray(); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             headers = conn.Query<HeaderCommon>(sql).ToList(); | ||||
|             headers = conn.Query<HeaderCommon>(sql).ToArray(); | ||||
|         } | ||||
| 
 | ||||
|         sql = $"SELECT COUNT(*) FROM [{tt.HeaderTableName}] "; | ||||
| @ -660,14 +682,14 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|         return headers; | ||||
|     } | ||||
| 
 | ||||
|     public IEnumerable<KeyValuePair<string, string>> GetHeaderFields(int toolTypeId, long headerid) | ||||
|     internal IEnumerable<KeyValuePair<string, string>> GetHeaderFields(int toolTypeId, long headerid) | ||||
|     { | ||||
|         ToolType tt = GetToolTypeByID(toolTypeId); | ||||
|         if (tt == null) | ||||
|         if (tt is null) | ||||
|             throw new Exception("Invalid tool type ID"); | ||||
| 
 | ||||
|         IEnumerable<ToolTypeMetadata> md = GetToolTypeMetadataByToolTypeID(toolTypeId); | ||||
|         if (md == null) | ||||
|         if (md is null) | ||||
|             throw new Exception("Invalid tool type metadata"); | ||||
| 
 | ||||
|         List<KeyValuePair<string, string>> r = new(); | ||||
| @ -694,10 +716,10 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|             foreach (ToolTypeMetadata m in md.Where(m => m.Header == true && m.TableDisplayOrder > 0).OrderBy(m => m.TableDisplayOrder)) | ||||
|             { | ||||
|                 string v = ""; | ||||
|                 if (dr != null) | ||||
|                 if (dr is not null) | ||||
|                 { | ||||
|                     object o = dr[m.ColumnName]; | ||||
|                     if (o != null && !Convert.IsDBNull(o)) | ||||
|                     if (o is not null && !Convert.IsDBNull(o)) | ||||
|                         v = Convert.ToString(o); | ||||
|                 } | ||||
|                 KeyValuePair<string, string> kvp = new(m.DisplayTitle, v); | ||||
| @ -707,16 +729,28 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|         return r; | ||||
|     } | ||||
| 
 | ||||
|     public IEnumerable<AwaitingDispo> GetAwaitingDispo() | ||||
|     internal IEnumerable<AwaitingDisposition> GetAwaitingDisposition() | ||||
|     { | ||||
|         using DbConnection conn = GetDbConnection(); | ||||
|         return conn.Query<AwaitingDispo>("GetAwaitingDispo", commandType: CommandType.StoredProcedure); | ||||
|         IEnumerable<AwaitingDisposition>? r; | ||||
|         if (!string.IsNullOrEmpty(_MockRoot)) | ||||
|         { | ||||
|             string json = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), "GetAwaitingDispositionApi.json")); | ||||
|             r = System.Text.Json.JsonSerializer.Deserialize<IEnumerable<AwaitingDisposition>>(json); | ||||
|             if (r is null) | ||||
|                 throw new NullReferenceException(nameof(r)); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             using DbConnection conn = GetDbConnection(); | ||||
|             r = conn.Query<AwaitingDisposition>("GetAwaitingDispo", commandType: CommandType.StoredProcedure); | ||||
|         } | ||||
|         return r; | ||||
|     } | ||||
| 
 | ||||
|     public int UpdateReviewDate(int toolTypeId, long headerId, bool clearDate) | ||||
|     internal int UpdateReviewDate(int toolTypeId, long headerId, bool clearDate) | ||||
|     { | ||||
|         ToolType tt = GetToolTypeByID(toolTypeId); | ||||
|         if (tt == null) | ||||
|         if (tt is null) | ||||
|             throw new Exception("Invalid tool type ID"); | ||||
| 
 | ||||
|         using DbConnection conn = GetDbConnection(); | ||||
| @ -735,10 +769,10 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public Guid GetHeaderAttachmentIDByTitle(int toolTypeId, string title) | ||||
|     internal Guid GetHeaderAttachmentIDByTitle(int toolTypeId, string title) | ||||
|     { | ||||
|         ToolType tt = GetToolTypeByID(toolTypeId); | ||||
|         if (tt == null) | ||||
|         if (tt is null) | ||||
|             throw new Exception("Invalid tool type ID"); | ||||
| 
 | ||||
|         using DbConnection conn = GetDbConnection(); | ||||
| @ -747,10 +781,10 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|         return conn.ExecuteScalar<Guid>(sql, param: new { Title = title }); | ||||
|     } | ||||
| 
 | ||||
|     public Guid GetDataAttachmentIDByTitle(int toolTypeId, string title) | ||||
|     internal Guid GetDataAttachmentIDByTitle(int toolTypeId, string title) | ||||
|     { | ||||
|         ToolType tt = GetToolTypeByID(toolTypeId); | ||||
|         if (tt == null) | ||||
|         if (tt is null) | ||||
|             throw new Exception("Invalid tool type ID"); | ||||
| 
 | ||||
|         using DbConnection conn = GetDbConnection(); | ||||
| @ -759,5 +793,31 @@ public class MetrologyRepo : IMetrologyRepo | ||||
|         return conn.ExecuteScalar<Guid>(sql, param: new { Title = title }); | ||||
|     } | ||||
| 
 | ||||
|     DataTable IMetrologyRepo.GetDataSharePoint(int toolTypeId, string headerId) => throw new NotImplementedException(); | ||||
|     DataTable IMetrologyRepository.GetDataSharePoint(int toolTypeId, string headerId) => throw new NotImplementedException(); | ||||
| 
 | ||||
|     IEnumerable<ToolType> IMetrologyRepository.GetToolTypes() => GetToolTypes(); | ||||
|     ToolType IMetrologyRepository.GetToolTypeByName(string name) => GetToolTypeByName(name); | ||||
|     ToolType IMetrologyRepository.GetToolTypeByID(int id) => GetToolTypeByID(id); | ||||
|     IEnumerable<ToolTypeMetadata> IMetrologyRepository.GetToolTypeMetadataByToolTypeID(int id) => GetToolTypeMetadataByToolTypeID(id); | ||||
|     TransactionScope IMetrologyRepository.StartTransaction() => StartTransaction(); | ||||
|     void IMetrologyRepository.PurgeExistingData(int toolTypeId, string title) => PurgeExistingData(toolTypeId, title); | ||||
|     long IMetrologyRepository.InsertToolDataJSON(JToken jsonbody, long headerId, List<ToolTypeMetadata> metaData, string tableName) => InsertToolDataJSON(jsonbody, headerId, metaData, tableName); | ||||
|     DataTable IMetrologyRepository.ExportData(string spName, DateTime startTime, DateTime endTime) => ExportData(spName, startTime, endTime); | ||||
|     DataTable IMetrologyRepository.GetHeaders(int toolTypeId, DateTime? startTime, DateTime? endTime, int? pageNo, int? pageSize, long? headerid, out long totalRecords) => GetHeaders(toolTypeId, startTime, endTime, pageNo, pageSize, headerid, out totalRecords); | ||||
|     DataTable IMetrologyRepository.GetData(int toolTypeId, long headerId) => GetData(toolTypeId, headerId); | ||||
|     HeaderCommon[] IMetrologyRepository.GetHeaderTitles(int? toolTypeId, int? pageNo, int? pageSize, out long totalRecords) => GetHeaderTitles(toolTypeId, pageNo, pageSize, out totalRecords); | ||||
|     Guid IMetrologyRepository.GetHeaderAttachmentIDByTitle(int toolTypeId, string title) => GetHeaderAttachmentIDByTitle(toolTypeId, title); | ||||
|     Guid IMetrologyRepository.GetDataAttachmentIDByTitle(int toolTypeId, string title) => GetDataAttachmentIDByTitle(toolTypeId, title); | ||||
|     Guid IMetrologyRepository.GetHeaderAttachmentID(int toolTypeId, long headerId) => GetHeaderAttachmentID(toolTypeId, headerId); | ||||
|     string IMetrologyRepository.GetHeaderInsertDate(int toolTypeId, long headerId) => GetHeaderInsertDate(toolTypeId, headerId); | ||||
|     string IMetrologyRepository.GetAttachmentInsertDateByGUID(string tableName, Guid attachmentId) => GetAttachmentInsertDateByGUID(tableName, attachmentId); | ||||
|     void IMetrologyRepository.SetHeaderDirName(string tableName, long headerId, string dateDir) => SetHeaderDirName(tableName, headerId, dateDir); | ||||
|     Guid IMetrologyRepository.GetDataAttachmentID(int toolTypeId, long headerId, string title) => GetDataAttachmentID(toolTypeId, headerId, title); | ||||
|     string IMetrologyRepository.GetDataInsertDate(int toolTypeId, long headerId, string title) => GetDataInsertDate(toolTypeId, headerId, title); | ||||
|     void IMetrologyRepository.SetDataDirName(string tableName, long headerId, string title, string dateDir) => SetDataDirName(tableName, headerId, title, dateDir); | ||||
|     DataSet IMetrologyRepository.GetOIExportData(int toolTypeId, long headerid) => GetOIExportData(toolTypeId, headerid); | ||||
|     IEnumerable<KeyValuePair<string, string>> IMetrologyRepository.GetHeaderFields(int toolTypeId, long headerid) => GetHeaderFields(toolTypeId, headerid); | ||||
|     IEnumerable<AwaitingDisposition> IMetrologyRepository.GetAwaitingDisposition() => GetAwaitingDisposition(); | ||||
|     int IMetrologyRepository.UpdateReviewDate(int toolTypeId, long headerId, bool clearDate) => UpdateReviewDate(toolTypeId, headerId, clearDate); | ||||
| 
 | ||||
| } | ||||
							
								
								
									
										120
									
								
								Server/Repositories/PinRepository.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,120 @@ | ||||
| using OI.Metrology.Shared.DataModels; | ||||
| using OI.Metrology.Shared.Models.Stateless; | ||||
| using System.Text.Json; | ||||
|  | ||||
| namespace OI.Metrology.Server.Repository; | ||||
|  | ||||
| public class PinRepository : IPinRepository | ||||
| { | ||||
|  | ||||
|     private readonly string _MockRoot; | ||||
|     private readonly Serilog.ILogger _Log; | ||||
|     private readonly Dictionary<string, Dictionary<long, HeaderCommon>> _RdsToHeaderCommonCollection; | ||||
|  | ||||
|     public PinRepository(string mockRoot) | ||||
|     { | ||||
|         _MockRoot = mockRoot; | ||||
|         _RdsToHeaderCommonCollection = new(); | ||||
|         _Log = Serilog.Log.ForContext<PinRepository>(); | ||||
|     } | ||||
|  | ||||
|     void IPinRepository.SetPinnedTable(HeaderCommon headerCommon) | ||||
|     { | ||||
|         Dictionary<long, HeaderCommon>? toolIdToHeader; | ||||
|         if (!string.IsNullOrEmpty(headerCommon.RDS)) | ||||
|         { | ||||
|             if (!_RdsToHeaderCommonCollection.TryGetValue(headerCommon.RDS, out toolIdToHeader)) | ||||
|             { | ||||
|                 _RdsToHeaderCommonCollection.Add(headerCommon.RDS, new()); | ||||
|                 if (!_RdsToHeaderCommonCollection.TryGetValue(headerCommon.RDS, out toolIdToHeader)) | ||||
|                     throw new Exception(); | ||||
|             } | ||||
|             if (toolIdToHeader.ContainsKey(headerCommon.ToolTypeID)) | ||||
|                 toolIdToHeader[headerCommon.ToolTypeID] = headerCommon; | ||||
|             else | ||||
|                 toolIdToHeader.Add(headerCommon.ToolTypeID, headerCommon); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private (HeaderCommon?, HeaderCommon?) GetBoth(string rds, long bioRadId, long cdeId) | ||||
|     { | ||||
|         Dictionary<long, HeaderCommon>? toolIdToHeader; | ||||
|         if (!_RdsToHeaderCommonCollection.TryGetValue(rds, out toolIdToHeader)) | ||||
|         { | ||||
|             _RdsToHeaderCommonCollection.Add(rds, new()); | ||||
|             if (!_RdsToHeaderCommonCollection.TryGetValue(rds, out toolIdToHeader)) | ||||
|                 throw new Exception(); | ||||
|         } | ||||
|         _ = toolIdToHeader.TryGetValue(cdeId, out HeaderCommon? cdeHeader); | ||||
|         _ = toolIdToHeader.TryGetValue(bioRadId, out HeaderCommon? bioRadHeader); | ||||
|         return new(bioRadHeader, cdeHeader); | ||||
|     } | ||||
|  | ||||
|     private static Pinned? GetPinned(IMetrologyRepository metrologyRepository, HeaderCommon headerCommon, int points, int column) | ||||
|     { | ||||
|         Pinned? result; | ||||
|         List<string> values; | ||||
|         System.Data.DataTable dataTable = metrologyRepository.GetData((int)headerCommon.ToolTypeID, headerCommon.ID); | ||||
|         if (dataTable.Rows.Count <= points || dataTable.Columns.Count <= column) | ||||
|             result = null; | ||||
|         else | ||||
|         { | ||||
|             values = new(); | ||||
|             for (int i = 0; i < dataTable.Rows.Count - 1; i++) | ||||
|             { | ||||
|                 if (dataTable.Rows[i]?.ItemArray[column] is null) | ||||
|                     break; | ||||
|                 values.Add(string.Concat(dataTable.Rows[i].ItemArray[column])); | ||||
|             } | ||||
|             if (values.Count <= points) | ||||
|                 result = null; | ||||
|             else | ||||
|                 result = new(headerCommon, values); | ||||
|         } | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     Result<Pinned[]> IPinRepository.GetPinnedTable(IMetrologyRepository metrologyRepository, int id, string? biorad_id, string? cde_id, string? rds) | ||||
|     { | ||||
|         Result<Pinned[]>? r; | ||||
|         if (!string.IsNullOrEmpty(_MockRoot)) | ||||
|         { | ||||
|             string json = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), "GetPinnedTableApi.json")); | ||||
|             r = JsonSerializer.Deserialize<Result<Pinned[]>>(json); | ||||
|             if (r is null) | ||||
|                 throw new NullReferenceException(nameof(r)); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             if (string.IsNullOrEmpty(rds) || !long.TryParse(biorad_id, out long bioRadId) || !long.TryParse(cde_id, out long cdeId)) | ||||
|                 r = new() { Results = Array.Empty<Pinned>(), TotalRows = 0 }; | ||||
|             else | ||||
|             { | ||||
|                 const int points = 9; | ||||
|                 List<Pinned> results = new(); | ||||
|                 (HeaderCommon? bioRadHeader, HeaderCommon? cdeHeader) = GetBoth(rds, bioRadId, cdeId); | ||||
|                 if (bioRadHeader is not null) | ||||
|                 { | ||||
|                     const int thickness = 5; | ||||
|                     Pinned? pinned = GetPinned(metrologyRepository, bioRadHeader, points, column: thickness); | ||||
|                     if (pinned is not null) | ||||
|                         results.Add(pinned); | ||||
|                 } | ||||
|                 if (cdeHeader is not null) | ||||
|                 { | ||||
|                     const int rs = 6; | ||||
|                     Pinned? pinned = GetPinned(metrologyRepository, cdeHeader, points, column: rs); | ||||
|                     if (pinned is not null) | ||||
|                         results.Add(pinned); | ||||
|                 } | ||||
|                 r = new() | ||||
|                 { | ||||
|                     Results = results.ToArray(), | ||||
|                     TotalRows = results.Count, | ||||
|                 }; | ||||
|             } | ||||
|         } | ||||
|         return r; | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										56
									
								
								Server/Repositories/ServiceShopOrderRepository.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,56 @@ | ||||
| using OI.Metrology.Shared.Models.Stateless; | ||||
| using OI.Metrology.Shared.ViewModels; | ||||
| using Serilog.Context; | ||||
| using System.Text.Json; | ||||
|  | ||||
| namespace OI.Metrology.Server.Repository; | ||||
|  | ||||
| public class ServiceShopOrderRepository : IServiceShopOrderRepository | ||||
| { | ||||
|  | ||||
|     private readonly Serilog.ILogger _Log; | ||||
|  | ||||
|     public ServiceShopOrderRepository() => _Log = Serilog.Log.ForContext<ServiceShopOrderRepository>(); | ||||
|  | ||||
|     private static ServiceShopOrder[] GetServiceShopOrders(Shared.Models.ServiceShop? serviceShop) | ||||
|     { | ||||
|         ServiceShopOrder[] result = IServiceShopOrder.GetServiceShopOrders(serviceShop); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static Shared.Models.ServiceShop? GetServiceShopOrders() | ||||
|     { | ||||
|         Shared.Models.ServiceShop? result; | ||||
|         string jsonFile; | ||||
|         string checkDirectory = Path.Combine(AppContext.BaseDirectory, "Data/Mike"); | ||||
|         if (Directory.Exists(checkDirectory)) | ||||
|             jsonFile = Path.Combine(checkDirectory, "service-shop.json"); | ||||
|         else | ||||
|             jsonFile = Path.Combine(AppContext.BaseDirectory, "service-shop.json"); | ||||
|         string json = File.ReadAllText(jsonFile); | ||||
|         result = JsonSerializer.Deserialize<Shared.Models.ServiceShop>(json); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     async Task<ServiceShopOrder[]> IServiceShopOrderRepository.GetAllServiceShopOrders() | ||||
|     { | ||||
|         ServiceShopOrder[] results; | ||||
|         string? methodName = IMethodName.GetActualAsyncMethodName(); | ||||
|         using (LogContext.PushProperty("MethodName", methodName)) | ||||
|         { | ||||
|             _Log.Debug("() => ..."); | ||||
|             Shared.Models.ServiceShop? serviceShop = await Task.Run(GetServiceShopOrders); | ||||
|             results = GetServiceShopOrders(serviceShop); | ||||
|         } | ||||
|         return results.ToArray(); | ||||
|     } | ||||
|  | ||||
|     async Task<ServiceShopOrder[]> IServiceShopOrderRepository.GetServiceShopOrders(string id) | ||||
|     { | ||||
|         ServiceShopOrder[] results; | ||||
|         Shared.Models.ServiceShop? serviceShop = await Task.Run(GetServiceShopOrders); | ||||
|         results = GetServiceShopOrders(serviceShop).Where(l => l.Id == id).ToArray(); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										340
									
								
								Server/Repositories/ToolTypesRepository.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,340 @@ | ||||
| using OI.Metrology.Shared.DataModels; | ||||
| using OI.Metrology.Shared.Models.Stateless; | ||||
| using OI.Metrology.Shared.Services; | ||||
| using System.Data; | ||||
| using System.Text; | ||||
| using System.Text.Json; | ||||
|  | ||||
| namespace OI.Metrology.Server.Repository; | ||||
|  | ||||
| public class ToolTypesRepository : IToolTypesRepository | ||||
| { | ||||
|  | ||||
|     private readonly string _MockRoot; | ||||
|     private readonly Serilog.ILogger _Log; | ||||
|  | ||||
|     public ToolTypesRepository(string mockRoot) | ||||
|     { | ||||
|         _MockRoot = mockRoot; | ||||
|         _Log = Serilog.Log.ForContext<ToolTypesRepository>(); | ||||
|     } | ||||
|  | ||||
|     // Get a list of tooltypes, returns just Name and ID | ||||
|     Result<ToolTypeNameId[]> IToolTypesRepository.Index(IMetrologyRepository metrologyRepository) | ||||
|     { | ||||
|         Result<ToolTypeNameId[]>? r; | ||||
|         if (!string.IsNullOrEmpty(_MockRoot)) | ||||
|         { | ||||
|             string json = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), "IndexApi.json")); | ||||
|             r = JsonSerializer.Deserialize<Result<ToolTypeNameId[]>>(json); | ||||
|             if (r is null) | ||||
|                 throw new NullReferenceException(nameof(r)); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             ToolTypeNameId[] toolTypeNameIdCollection = metrologyRepository.GetToolTypes().Select(tt => new ToolTypeNameId() { ToolTypeName = tt.ToolTypeName, ID = tt.ID }).ToArray(); | ||||
|             r = new() | ||||
|             { | ||||
|                 Results = toolTypeNameIdCollection, | ||||
|                 TotalRows = toolTypeNameIdCollection.Length, | ||||
|             }; | ||||
|         } | ||||
|         return r; | ||||
|     } | ||||
|  | ||||
|     // Gets the metadata for a tooltype, accepts a parameter which sorts the results | ||||
|     // This is used to setup the grid displays on the UI | ||||
|     Result<ToolTypeMetadataResult> IToolTypesRepository.GetToolTypeMetadata(IMetrologyRepository metrologyRepository, int id, string sortby) | ||||
|     { | ||||
|         Result<ToolTypeMetadataResult>? r; | ||||
|         if (!string.IsNullOrEmpty(_MockRoot)) | ||||
|         { | ||||
|             string json = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), "GetToolTypeMetadataApi.json")); | ||||
|             r = JsonSerializer.Deserialize<Result<ToolTypeMetadataResult>>(json); | ||||
|             if (r is null) | ||||
|                 throw new NullReferenceException(nameof(r)); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             ToolType tt = metrologyRepository.GetToolTypeByID(id); | ||||
|             IEnumerable<ToolTypeMetadata> md = metrologyRepository.GetToolTypeMetadataByToolTypeID(id); | ||||
|  | ||||
|             if (string.Equals(sortby, "grid", StringComparison.OrdinalIgnoreCase)) | ||||
|                 md = md.OrderBy(f => f.GridDisplayOrder).ToList(); | ||||
|             if (string.Equals(sortby, "table", StringComparison.OrdinalIgnoreCase)) | ||||
|                 md = md.OrderBy(f => f.GridDisplayOrder).ToList(); | ||||
|  | ||||
|             ToolTypeMetadataResult toolTypeMetadataResult = new(tt, md.ToArray()); | ||||
|             int totalRows = toolTypeMetadataResult.Metadata is not null ? toolTypeMetadataResult.Metadata.Length : 0; | ||||
|             r = new() | ||||
|             { | ||||
|                 Results = toolTypeMetadataResult, | ||||
|                 TotalRows = totalRows, | ||||
|             }; | ||||
|         } | ||||
|         return r; | ||||
|     } | ||||
|  | ||||
|     // Gets headers, request/response format is to allow paging with igniteUI | ||||
|     // The headerid parameter is used for navigating directly to a header, when the button is clicked in Awaiting Dispo | ||||
|     Result<DataTable> IToolTypesRepository.GetHeaders(IMetrologyRepository metrologyRepository, int id, DateTime? datebegin, DateTime? dateend, int? page, int? pagesize, long? headerid) | ||||
|     { | ||||
|         Result<DataTable>? r; | ||||
|         if (!string.IsNullOrEmpty(_MockRoot)) | ||||
|         { | ||||
|             string json = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), "GetHeadersApi.json")); | ||||
|             r = Newtonsoft.Json.JsonConvert.DeserializeObject<Result<DataTable>>(json); | ||||
|             if (r is null) | ||||
|                 throw new NullReferenceException(nameof(r)); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             long totalRecs; | ||||
|             DataTable dataTable = metrologyRepository.GetHeaders(id, datebegin, dateend, page, pagesize, headerid, out totalRecs); | ||||
|             r = new() | ||||
|             { | ||||
|                 Results = dataTable, | ||||
|                 TotalRows = totalRecs, | ||||
|             }; | ||||
|         } | ||||
|         return r; | ||||
|     } | ||||
|  | ||||
|     // Gets header titles, used in the Run Headers UI | ||||
|     Result<HeaderCommon[]> IToolTypesRepository.GetHeaderTitles(IMetrologyRepository metrologyRepository, int id, int? page, int? pagesize) | ||||
|     { | ||||
|         Result<HeaderCommon[]>? r; | ||||
|         if (!string.IsNullOrEmpty(_MockRoot)) | ||||
|         { | ||||
|             string json = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), "GetHeaderTitlesApi.json")); | ||||
|             r = JsonSerializer.Deserialize<Result<HeaderCommon[]>>(json); | ||||
|             if (r is null) | ||||
|                 throw new NullReferenceException(nameof(r)); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             long totalRecs; | ||||
|             int? toolTypeId = id > -1 ? id : null; | ||||
|             HeaderCommon[] headerCommonCollection = metrologyRepository.GetHeaderTitles(toolTypeId, page, pagesize, out totalRecs).ToArray(); | ||||
|             r = new() | ||||
|             { | ||||
|                 Results = headerCommonCollection, | ||||
|                 TotalRows = totalRecs, | ||||
|             }; | ||||
|         } | ||||
|         return r; | ||||
|     } | ||||
|  | ||||
|     // Get all of the fields for a header, used with the Run Header UI | ||||
|     Result<ColumnValue[]> IToolTypesRepository.GetHeaderFields(IMetrologyRepository metrologyRepository, int id, long headerid) | ||||
|     { | ||||
|         Result<ColumnValue[]>? r; | ||||
|         if (!string.IsNullOrEmpty(_MockRoot)) | ||||
|         { | ||||
|             string json = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), "GetHeaderFieldsApi.json")); | ||||
|             r = JsonSerializer.Deserialize<Result<ColumnValue[]>>(json); | ||||
|             if (r is null) | ||||
|                 throw new NullReferenceException(nameof(r)); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             ColumnValue[] columnValueCollection = metrologyRepository.GetHeaderFields(id, headerid).Select(x => new ColumnValue() { Column = x.Key, Value = x.Value }).ToArray(); | ||||
|             r = new() | ||||
|             { | ||||
|                 Results = columnValueCollection, | ||||
|                 TotalRows = columnValueCollection.Length, | ||||
|             }; | ||||
|         } | ||||
|         return r; | ||||
|     } | ||||
|  | ||||
|     // Get the data for a header, used with the Run Info UI | ||||
|     Result<DataTable> IToolTypesRepository.GetData(IMetrologyRepository metrologyRepository, int id, long headerid) | ||||
|     { | ||||
|         Result<DataTable>? r; | ||||
|         if (!string.IsNullOrEmpty(_MockRoot)) | ||||
|         { | ||||
|             string json = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), "GetDataApi.json")); | ||||
|             r = Newtonsoft.Json.JsonConvert.DeserializeObject<Result<DataTable>>(json); | ||||
|             if (r is null) | ||||
|                 throw new NullReferenceException(nameof(r)); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             DataTable dataTable = metrologyRepository.GetData(id, headerid); | ||||
|             r = new() | ||||
|             { | ||||
|                 Results = dataTable, | ||||
|                 TotalRows = dataTable.Rows.Count, | ||||
|             }; | ||||
|         } | ||||
|         return r; | ||||
|     } | ||||
|  | ||||
|     // Display an attachment, used for Run Info - note it is by tool type ID and attachment GUID, so it is best for internal use | ||||
|     (string?, string?, Stream?) IToolTypesRepository.GetAttachment(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService, int toolTypeId, string tabletype, string attachmentId, string filename) | ||||
|     { | ||||
|         Stream? stream = null; | ||||
|         string? message = null; | ||||
|         Guid attachmentIdParsed; | ||||
|         string? contenttype = null; | ||||
|         ToolType tt = metrologyRepository.GetToolTypeByID(toolTypeId); | ||||
|         bool header = !string.Equals(tabletype.Trim(), "data", StringComparison.OrdinalIgnoreCase); | ||||
|         if (!Guid.TryParse(attachmentId, out attachmentIdParsed)) | ||||
|             message = "Invalid attachment id"; | ||||
|         else | ||||
|         { | ||||
|             try | ||||
|             { | ||||
|                 // figure out what content type to use.  this is very simple because there are only two types being used | ||||
|                 contenttype = "application/pdf"; | ||||
|                 if (filename.ToLower().TrimEnd().EndsWith(".txt")) | ||||
|                     contenttype = "text/plain"; | ||||
|                 // Get attachment stream and feed it to the client | ||||
|                 stream = attachmentsService.GetAttachmentStreamByAttachmentId(tt, header, attachmentIdParsed, filename); | ||||
|             } | ||||
|             catch (Exception ex) { message = ex.Message; } | ||||
|         } | ||||
|         return new(message, contenttype, stream); | ||||
|     } | ||||
|  | ||||
|     // This endpoint triggers writing of the OI Export file | ||||
|     Exception? IToolTypesRepository.OIExport(IMetrologyRepository metrologyRepository, string oiExportPath, int toolTypeId, long headerid) | ||||
|     { | ||||
|         Exception? result = null; | ||||
|         // Call the export stored procedure | ||||
|         _Log.Debug($"Exporting to <{oiExportPath}>"); | ||||
|         DataSet ds = metrologyRepository.GetOIExportData(toolTypeId, headerid); | ||||
|         try | ||||
|         { | ||||
|             // The SP must return 3 result tables | ||||
|             if (ds.Tables.Count != 3) | ||||
|                 throw new Exception("Error exporting, invalid results"); | ||||
|             // The first table has just one row, which is the export filename | ||||
|             if (ds.Tables[0].Rows.Count != 1) | ||||
|                 throw new Exception("Error exporting, invalid filename"); | ||||
|             string? filename = Convert.ToString(ds.Tables[0].Rows[0][0]); | ||||
|             // The second table has the header data | ||||
|             if (ds.Tables[1].Rows.Count != 1) | ||||
|                 throw new Exception("Error exporting, invalid header data"); | ||||
|             StringBuilder sb = new(); | ||||
|             foreach (object? o in ds.Tables[1].Rows[0].ItemArray) | ||||
|             { | ||||
|                 if ((o is not null) && (!Convert.IsDBNull(o))) | ||||
|                     _ = sb.Append(Convert.ToString(o)); | ||||
|                 _ = sb.Append('\t'); | ||||
|             } | ||||
|             // The third table has the detail data | ||||
|             foreach (DataRow dr in ds.Tables[2].Rows) | ||||
|             { | ||||
|                 foreach (object? o in dr.ItemArray) | ||||
|                 { | ||||
|                     if ((o is not null) && (!Convert.IsDBNull(o))) | ||||
|                         _ = sb.Append(Convert.ToString(o)); | ||||
|                     _ = sb.Append('\t'); | ||||
|                 } | ||||
|             } | ||||
|             _ = sb.AppendLine(); | ||||
|             // The output file will only have one line, the header columns are output first | ||||
|             // Then each detail rows has it's columns appended | ||||
|             // H1, H2, H3, D1.1, D1.2, D1.3, D2.1, D2.2, D2.3, etc | ||||
|             // Write the file | ||||
|             File.WriteAllText(Path.Join(oiExportPath, filename), sb.ToString()); | ||||
|         } | ||||
|         catch (Exception ex) { result = ex; } | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     Result<DataTable> IToolTypesRepository.GetExportData(IMetrologyRepository metrologyRepository, int toolTypeId, DateTime? datebegin, DateTime? dateend) | ||||
|     { | ||||
|         Result<DataTable>? r; | ||||
|         if (!string.IsNullOrEmpty(_MockRoot)) | ||||
|         { | ||||
|             string json = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), "GetExportDataApi.json")); | ||||
|             r = Newtonsoft.Json.JsonConvert.DeserializeObject<Result<DataTable>>(json); | ||||
|             if (r is null) | ||||
|                 throw new NullReferenceException(nameof(r)); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             dateend ??= DateTime.Now; | ||||
|             datebegin ??= dateend.Value.AddMonths(-1); | ||||
|             ToolType tt = metrologyRepository.GetToolTypeByID(toolTypeId); | ||||
|             if (string.IsNullOrEmpty(tt.ExportSPName)) | ||||
|                 throw new NullReferenceException(nameof(tt.ExportSPName)); | ||||
|             DataTable dataTable = metrologyRepository.ExportData(tt.ExportSPName, datebegin.Value, dateend.Value); | ||||
|             r = new() | ||||
|             { | ||||
|                 Results = dataTable, | ||||
|                 TotalRows = dataTable.Rows.Count, | ||||
|             }; | ||||
|         } | ||||
|         return r; | ||||
|     } | ||||
|  | ||||
|     protected static string GetRowData(DataRow dr) | ||||
|     { | ||||
|         StringBuilder result = new(); | ||||
|         for (int i = 0; i < dr.Table.Columns.Count; i++) | ||||
|         { | ||||
|             if (i > 0) | ||||
|                 _ = result.Append(','); | ||||
|             object v = dr[i]; | ||||
|             if (v is not null && !Convert.IsDBNull(v)) | ||||
|                 _ = result.Append(FormatForCSV(string.Concat(Convert.ToString(v)))); | ||||
|         } | ||||
|         return result.ToString(); | ||||
|     } | ||||
|  | ||||
|     protected static string GetColumnHeaders(DataTable dataTable) | ||||
|     { | ||||
|         StringBuilder result = new(); | ||||
|         for (int i = 0; i < dataTable.Columns.Count; i++) | ||||
|         { | ||||
|             if (i > 0) | ||||
|                 _ = result.Append(','); | ||||
|             _ = result.Append(FormatForCSV(dataTable.Columns[i].ColumnName.TrimEnd('_'))); | ||||
|         } | ||||
|         return result.ToString(); | ||||
|     } | ||||
|  | ||||
|     protected static string FormatForCSV(string v) | ||||
|     { | ||||
|         StringBuilder result = new(v.Length + 2); | ||||
|         bool doubleQuoted = false; | ||||
|         if (v.StartsWith(' ') || v.EndsWith(' ') || v.Contains(',') || v.Contains('"')) | ||||
|         { | ||||
|             _ = result.Append('"'); | ||||
|             doubleQuoted = true; | ||||
|         } | ||||
|         foreach (char c in v) | ||||
|         { | ||||
|             _ = c switch | ||||
|             { | ||||
|                 '\r' or '\n' => result.Append(' '), | ||||
|                 '"' => result.Append("\"\""), | ||||
|                 _ => result.Append(c), | ||||
|             }; | ||||
|         } | ||||
|         if (doubleQuoted) | ||||
|             _ = result.Append('"'); | ||||
|         return result.ToString(); | ||||
|     } | ||||
|  | ||||
|     byte[] IToolTypesRepository.GetCSVExport(IMetrologyRepository metrologyRepository, int toolTypeId, DateTime? datebegin, DateTime? dateend) | ||||
|     { | ||||
|         byte[] results; | ||||
|         Result<DataTable> result; | ||||
|         IToolTypesRepository repository = this; | ||||
|         result = repository.GetExportData(metrologyRepository, toolTypeId, datebegin, dateend); | ||||
|         if (result.Results is null) | ||||
|             throw new NullReferenceException(nameof(result.Results)); | ||||
|         StringBuilder stringBuilder = new(); | ||||
|         _ = stringBuilder.AppendLine(GetColumnHeaders(result.Results)); | ||||
|         foreach (DataRow dr in result.Results.Rows) | ||||
|             _ = stringBuilder.AppendLine(GetRowData(dr)); | ||||
|         results = Encoding.UTF8.GetBytes(stringBuilder.ToString()); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @ -1,32 +1,32 @@ | ||||
| using System; | ||||
| using System.Globalization; | ||||
| using System.IO; | ||||
| using System.Globalization; | ||||
| 
 | ||||
| namespace OI.Metrology.Viewer.Services; | ||||
| namespace OI.Metrology.Server.Services; | ||||
| 
 | ||||
| using OI.Metrology.Server.Models; | ||||
| using OI.Metrology.Shared.DataModels; | ||||
| using OI.Metrology.Shared.Repositories; | ||||
| using OI.Metrology.Shared.Models.Stateless; | ||||
| using OI.Metrology.Shared.Services; | ||||
| using OI.Metrology.Viewer.Models; | ||||
| 
 | ||||
| public class AttachmentsService : IAttachmentsService | ||||
| { | ||||
|     private readonly AppSettings _AppSettings; | ||||
|     private readonly IMetrologyRepository _MetrologyRepository; | ||||
| 
 | ||||
|     private readonly IMetrologyRepo _Repo; | ||||
| 
 | ||||
|     public AttachmentsService(AppSettings appSettings, IMetrologyRepo repo) | ||||
|     public AttachmentsService(AppSettings appSettings, IMetrologyRepository metrologyRepository) | ||||
|     { | ||||
|         _AppSettings = appSettings; | ||||
|         _Repo = repo; | ||||
|         _MetrologyRepository = metrologyRepository; | ||||
|     } | ||||
| 
 | ||||
|     protected Stream GetAttachmentStream(string tableName, Guid attachmentId, string filename) | ||||
|     protected Stream GetAttachmentStream(string? tableName, Guid attachmentId, string filename) | ||||
|     { | ||||
|         if (attachmentId.Equals(Guid.Empty)) | ||||
|             throw new Exception("No attachments found"); | ||||
| 
 | ||||
|         DateTime insertDate = Convert.ToDateTime(_Repo.GetAttachmentInsertDateByGUID(tableName, attachmentId)); | ||||
|         if (tableName is null) | ||||
|             throw new NullReferenceException(nameof(tableName)); | ||||
| 
 | ||||
|         DateTime insertDate = Convert.ToDateTime(_MetrologyRepository.GetAttachmentInsertDateByGUID(tableName, attachmentId)); | ||||
|         int year = insertDate.Year; | ||||
|         DateTime d = insertDate; | ||||
|         CultureInfo cul = CultureInfo.CurrentCulture; | ||||
| @ -50,28 +50,28 @@ public class AttachmentsService : IAttachmentsService | ||||
| 
 | ||||
|     public Stream GetAttachmentStreamByTitle(ToolType toolType, bool header, string title, string filename) | ||||
|     { | ||||
|         if (toolType == null) | ||||
|         if (toolType is null) | ||||
|             throw new Exception("Invalid tool type"); | ||||
|         Guid attachmentId; | ||||
|         string tableName; | ||||
|         string? tableName; | ||||
|         if (header) | ||||
|         { | ||||
|             tableName = toolType.HeaderTableName; | ||||
|             attachmentId = _Repo.GetHeaderAttachmentIDByTitle(toolType.ID, title); | ||||
|             attachmentId = _MetrologyRepository.GetHeaderAttachmentIDByTitle(toolType.ID, title); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             tableName = toolType.DataTableName; | ||||
|             attachmentId = _Repo.GetDataAttachmentIDByTitle(toolType.ID, title); | ||||
|             attachmentId = _MetrologyRepository.GetDataAttachmentIDByTitle(toolType.ID, title); | ||||
|         } | ||||
|         return GetAttachmentStream(tableName, attachmentId, filename); | ||||
|     } | ||||
| 
 | ||||
|     public Stream GetAttachmentStreamByAttachmentId(ToolType toolType, bool header, Guid attachmentId, string filename) | ||||
|     { | ||||
|         if (toolType == null) | ||||
|         if (toolType is null) | ||||
|             throw new Exception("Invalid tool type"); | ||||
|         string tableName; | ||||
|         string? tableName; | ||||
|         if (header) | ||||
|             tableName = toolType.HeaderTableName; | ||||
|         else | ||||
| @ -79,27 +79,27 @@ public class AttachmentsService : IAttachmentsService | ||||
|         return GetAttachmentStream(tableName, attachmentId, filename); | ||||
|     } | ||||
| 
 | ||||
|     private void SaveAttachment(ToolType toolType, long headerId, string dataUniqueId, string filename, Microsoft.AspNetCore.Http.IFormFile uploadedFile) | ||||
|     private void SaveAttachment(ToolType toolType, long headerId, string dataUniqueId, string filename, IFormFile uploadedFile) | ||||
|     { | ||||
|         if (toolType == null) | ||||
|         if (toolType is null) | ||||
|             throw new Exception("Invalid tool type"); | ||||
| 
 | ||||
|         using System.Transactions.TransactionScope trans = _Repo.StartTransaction(); | ||||
|         using System.Transactions.TransactionScope trans = _MetrologyRepository.StartTransaction(); | ||||
|         Guid attachmentId = Guid.Empty; | ||||
|         DateTime insertDate = new(); | ||||
|         string tableName = ""; | ||||
|         string? tableName = ""; | ||||
| 
 | ||||
|         if (string.IsNullOrWhiteSpace(dataUniqueId)) | ||||
|         { | ||||
|             attachmentId = _Repo.GetHeaderAttachmentID(toolType.ID, headerId); | ||||
|             insertDate = Convert.ToDateTime(_Repo.GetHeaderInsertDate(toolType.ID, headerId)); | ||||
|             attachmentId = _MetrologyRepository.GetHeaderAttachmentID(toolType.ID, headerId); | ||||
|             insertDate = Convert.ToDateTime(_MetrologyRepository.GetHeaderInsertDate(toolType.ID, headerId)); | ||||
|             tableName = toolType.HeaderTableName; | ||||
| 
 | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             attachmentId = _Repo.GetDataAttachmentID(toolType.ID, headerId, dataUniqueId); | ||||
|             insertDate = Convert.ToDateTime(_Repo.GetDataInsertDate(toolType.ID, headerId, dataUniqueId)); | ||||
|             attachmentId = _MetrologyRepository.GetDataAttachmentID(toolType.ID, headerId, dataUniqueId); | ||||
|             insertDate = Convert.ToDateTime(_MetrologyRepository.GetDataInsertDate(toolType.ID, headerId, dataUniqueId)); | ||||
|             // Get Date for new directory name | ||||
|             tableName = toolType.DataTableName; | ||||
| 
 | ||||
| @ -131,7 +131,7 @@ public class AttachmentsService : IAttachmentsService | ||||
| 
 | ||||
|     public void SaveAttachment(ToolType toolType, long headerId, string dataUniqueId, string filename, object uploadedFile) | ||||
|     { | ||||
|         Microsoft.AspNetCore.Http.IFormFile formFile = (Microsoft.AspNetCore.Http.IFormFile)uploadedFile; | ||||
|         IFormFile formFile = (IFormFile)uploadedFile; | ||||
|         SaveAttachment(toolType, headerId, dataUniqueId, filename, formFile); | ||||
|     } | ||||
| 
 | ||||
| @ -1,18 +1,17 @@ | ||||
| using Newtonsoft.Json.Linq; | ||||
| using OI.Metrology.Shared.DataModels; | ||||
| using OI.Metrology.Shared.Repositories; | ||||
| using OI.Metrology.Shared.Models.Stateless; | ||||
| using OI.Metrology.Shared.Services; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| 
 | ||||
| namespace OI.Metrology.Viewer.Services; | ||||
| #pragma warning disable CS8600, CS8602, CS8603, CS8604, CS8625 | ||||
| 
 | ||||
| namespace OI.Metrology.Server.Services; | ||||
| 
 | ||||
| public class InboundDataService : IInboundDataService | ||||
| { | ||||
|     private readonly IMetrologyRepo _Repo; | ||||
|     private readonly IMetrologyRepository _MetrologyRepository; | ||||
| 
 | ||||
|     public InboundDataService(IMetrologyRepo repo) => _Repo = repo; | ||||
|     public InboundDataService(IMetrologyRepository metrologyRepository) => _MetrologyRepository = metrologyRepository; | ||||
| 
 | ||||
|     public long DoSQLInsert(JToken jsonbody, ToolType toolType, List<ToolTypeMetadata> metaData) | ||||
|     { | ||||
| @ -37,11 +36,11 @@ public class InboundDataService : IInboundDataService | ||||
| 
 | ||||
|         long headerId = 0; | ||||
| 
 | ||||
|         using (System.Transactions.TransactionScope transScope = _Repo.StartTransaction()) | ||||
|         using (System.Transactions.TransactionScope transScope = _MetrologyRepository.StartTransaction()) | ||||
|         { | ||||
|             try | ||||
|             { | ||||
|                 _Repo.PurgeExistingData(toolType.ID, uniqueId); | ||||
|                 _MetrologyRepository.PurgeExistingData(toolType.ID, uniqueId); | ||||
|             } | ||||
|             catch (Exception ex) | ||||
|             { | ||||
| @ -50,7 +49,7 @@ public class InboundDataService : IInboundDataService | ||||
| 
 | ||||
|             try | ||||
|             { | ||||
|                 headerId = _Repo.InsertToolDataJSON(jsonbody, -1, metaData, toolType.HeaderTableName); | ||||
|                 headerId = _MetrologyRepository.InsertToolDataJSON(jsonbody, -1, metaData, toolType.HeaderTableName); | ||||
|             } | ||||
|             catch (Exception ex) | ||||
|             { | ||||
| @ -60,11 +59,11 @@ public class InboundDataService : IInboundDataService | ||||
|             int detailrow = 1; | ||||
|             try | ||||
|             { | ||||
|                 if (detailsArray != null) | ||||
|                 if (detailsArray is not null) | ||||
|                 { | ||||
|                     foreach (JToken detail in detailsArray) | ||||
|                     { | ||||
|                         _ = _Repo.InsertToolDataJSON(detail, headerId, metaData, toolType.DataTableName); | ||||
|                         _ = _MetrologyRepository.InsertToolDataJSON(detail, headerId, metaData, toolType.DataTableName); | ||||
|                         detailrow += 1; | ||||
|                     } | ||||
|                 } | ||||
| @ -133,7 +132,7 @@ public class InboundDataService : IInboundDataService | ||||
| 
 | ||||
|                     if (jp.First is JArray array) | ||||
|                         detailsArray = array; | ||||
|                     else if ((jp.First is JValue value) && (value.Value == null)) | ||||
|                     else if ((jp.First is JValue value) && (value.Value is null)) | ||||
|                         detailsArray = null; | ||||
|                     else | ||||
|                         errors.Add("Invalid details field"); | ||||
| @ -169,7 +168,7 @@ public class InboundDataService : IInboundDataService | ||||
|         } | ||||
| 
 | ||||
|         // if a Details container if found, process it by recursion | ||||
|         if (detailsArray != null) | ||||
|         if (detailsArray is not null) | ||||
|         { | ||||
|             int i = 1; | ||||
|             foreach (JToken detail in detailsArray) | ||||
| @ -189,7 +188,7 @@ public class InboundDataService : IInboundDataService | ||||
|         { | ||||
|             // get the json data for this container field, ex: Points | ||||
|             JProperty contJP = jsonbody.Children<JProperty>().Where(jp => string.Equals(jp.Name, containerField, StringComparison.OrdinalIgnoreCase)).SingleOrDefault(); | ||||
|             if ((contJP != null) && (contJP.Value is JArray array)) | ||||
|             if ((contJP is not null) && (contJP.Value is JArray array)) | ||||
|             { | ||||
|                 JArray contJPArray = array; | ||||
| 
 | ||||
| @ -1,10 +1,11 @@ | ||||
| using OI.Metrology.Shared.Repositories; | ||||
| using OI.Metrology.Viewer.Models; | ||||
| using System; | ||||
| using OI.Metrology.Server.Models; | ||||
| using OI.Metrology.Shared.Repositories; | ||||
| using System.Data.Common; | ||||
| using System.Data.SqlClient; | ||||
| 
 | ||||
| namespace OI.Metrology.Viewer.Repositories; | ||||
| #pragma warning disable CS8600, CS8602, CS8603, CS8604, CS8625 | ||||
| 
 | ||||
| namespace OI.Metrology.Server.Services; | ||||
| 
 | ||||
| public class SQLDbConnectionFactory : IDbConnectionFactory | ||||
| { | ||||
| @ -47,9 +47,11 @@ | ||||
| <script> | ||||
| 
 | ||||
|     $(document).ready(function () { | ||||
| 
 | ||||
|          | ||||
|         var apiUrl = "@ViewBag.ApiUrl"; | ||||
|          | ||||
|         $("#ToolType").igCombo({ | ||||
|             dataSource: '@Url.Content("~/api/tooltypes")', | ||||
|             dataSource: apiUrl + '/tooltypes', | ||||
|             responseDataKey: "Results", | ||||
|             textKey: "ToolTypeName", | ||||
|             valueKey: "ID", | ||||
							
								
								
									
										28
									
								
								Server/Views/Pages/AwaitingDispo.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,28 @@ | ||||
| @{ | ||||
|     ViewData["Title"] = "Awaiting Disposition"; | ||||
| } | ||||
|  | ||||
| <h4>Awaiting Disposition</h4> | ||||
|  | ||||
| <div style="height: 450px;"> | ||||
|     <table id="grid"></table> | ||||
| </div> | ||||
|  | ||||
| <div class="row" style="margin-top: 10px; margin-bottom: 20px;"> | ||||
|     <div class="col-xs-1"> | ||||
|         <input type="button" id="OpenButton" value="Open" /> | ||||
|     </div> | ||||
|     <div class="col-xs-1"> | ||||
|         <input type="button" id="RefreshButton" value="Refresh" /> | ||||
|     </div> | ||||
| </div> | ||||
|  | ||||
| <script> | ||||
|  | ||||
|     $(document).ready(function () { | ||||
|  | ||||
|         initAwaitingDisposition("@ViewBag.ApiUrl"); | ||||
|  | ||||
|     }); | ||||
|  | ||||
| </script> | ||||
							
								
								
									
										57
									
								
								Server/Views/Pages/RunHeaders.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,57 @@ | ||||
| @{ | ||||
|     ViewData["Title"] = "Run Headers"; | ||||
| } | ||||
|  | ||||
| <style> | ||||
|     html, | ||||
|     body { | ||||
|         height: 100%; | ||||
|     } | ||||
|  | ||||
|     div.container-fluid { | ||||
|         height: 90%; | ||||
|     } | ||||
|  | ||||
|     #HeaderGrid, | ||||
|     #FieldsGrid { | ||||
|         font-size: 12px; | ||||
|     } | ||||
|  | ||||
|     .FieldTitle { | ||||
|         font-weight: bold; | ||||
|     } | ||||
| </style> | ||||
|  | ||||
| <h4>Run Headers</h4> | ||||
|  | ||||
| <table> | ||||
|     <tr> | ||||
|         <td> | ||||
|             <label for="ToolType">Tool Type:</label> | ||||
|         </td> | ||||
|         <td> | ||||
|             <div id="ToolType"></div> | ||||
|         </td> | ||||
|     </tr> | ||||
| </table> | ||||
|  | ||||
| <table width="100%" height="80%"> | ||||
|     <tr> | ||||
|         <td width="50%"> | ||||
|             <table id="HeaderGrid"></table> | ||||
|         </td> | ||||
|         <td width="50%"> | ||||
|             <table id="FieldsGrid"></table> | ||||
|         </td> | ||||
|     </tr> | ||||
| </table> | ||||
|  | ||||
| <script> | ||||
|  | ||||
|     $(document).ready(function () { | ||||
|  | ||||
|         initRunHeaders("@ViewBag.ApiUrl"); | ||||
|  | ||||
|     }); | ||||
|  | ||||
| </script> | ||||
							
								
								
									
										85
									
								
								Server/Views/Pages/RunInfo.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,85 @@ | ||||
| @model OI.Metrology.Shared.ViewModels.RunInfo | ||||
| @{ | ||||
|     ViewData["Title"] = "Run Information"; | ||||
| } | ||||
| <style> | ||||
|     #HeaderGridDiv, | ||||
|     #DetailsGridDiv { | ||||
|         font-size: 12px; | ||||
|     } | ||||
| </style> | ||||
|  | ||||
| <h4>Run Information</h4> | ||||
|  | ||||
| <form class="form-inline mb-4"> | ||||
|     <div class="form-group"> | ||||
|         <label for="ToolType">Tool Type</label> | ||||
|         <div class="form-control" id="ToolType"></div> | ||||
|     </div> | ||||
|     <div class="form-group"> | ||||
|         <label for="StartDate">Start Time</label> | ||||
|         <div class="form-control mb-2 mr-sm-2" id="StartDate"></div> | ||||
|         <div class="form-control mb-2 mr-sm-2" id="StartTime"></div> | ||||
|     </div> | ||||
|     <div class="form-group"> | ||||
|         <label for="EndDate">End Time</label> | ||||
|         <div class="form-control mb-2 mr-sm-2" id="EndDate"></div> | ||||
|         <div class="form-control mb-2 mr-sm-2" id="EndTime"></div> | ||||
|     </div>   | ||||
|     <div class="form-group"> | ||||
|         <input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" /> | ||||
|     </div>   | ||||
|     <div class="form-group"> | ||||
|         <label class="form-check-label" for="chkAutoRefresh"> | ||||
|             Auto-Refresh | ||||
|         </label> | ||||
|         <input class="form-check-input" type="checkbox" id="chkAutoRefresh"> | ||||
|     </div> | ||||
| </form> | ||||
|  | ||||
| <div style="height: 300px;" id="HeaderGridDiv"> | ||||
|     <span id="ToolTypeID" hidden></span> | ||||
|     <table id="HeaderGrid"></table> | ||||
| </div> | ||||
|  | ||||
| <div class="row" style="margin-top: 10px; margin-bottom: 20px;"> | ||||
|     <div class="col-xs-1"> | ||||
|         <input type="button" class="btn" id="GetDataButton" value="Get Data" disabled /> | ||||
|     </div> | ||||
|     <div class="col-xs-1"> | ||||
|         <input type="button" class="btn" id="ReviewButton" value="Review" disabled /> | ||||
|     </div> | ||||
|     <div class="col-xs-1"> | ||||
|         <input type="button" class="btn" id="PinButton" value="Pin" disabled /> | ||||
|     </div> | ||||
| </div> | ||||
|  | ||||
| <div id="DetailsDiv" hidden> | ||||
|  | ||||
|     <span id="HeaderId" hidden></span> | ||||
|     <span id="HeaderAttachmentId" hidden></span> | ||||
|     <div style="padding-bottom: 20px;" id="DetailsGridDiv"> | ||||
|         <table id="DetailsGrid"></table> | ||||
|     </div> | ||||
|  | ||||
|     <div id="ExportDiv" style="margin-top: 10px;" hidden> | ||||
|         <input type="button" value="Send to OpenInsight" id="OIExportButton" /> | ||||
|         <span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span> | ||||
|     </div> | ||||
|  | ||||
|     <p style="text-align: center; margin-top: 20px;"> | ||||
|         <iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;" hidden></iframe> | ||||
|         <iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe> | ||||
|     </p> | ||||
|  | ||||
| </div> | ||||
|  | ||||
| <script> | ||||
|  | ||||
|     $(document).ready(function () { | ||||
|  | ||||
|         initRunInfo("@ViewBag.ApiUrl", "@Model.ToolTypeID", "@Model.HeaderID", "@Model.HeaderAttachmentID"); | ||||
|  | ||||
|     }); | ||||
|  | ||||
| </script> | ||||
| @ -21,6 +21,7 @@ | ||||
|     <script src="~/igniteui/js/infragistics.dv.js" type="text/javascript" asp-append-version="true"></script> | ||||
| 
 | ||||
|     <script src="~/js/common.js" type="text/javascript" asp-append-version="true"></script> | ||||
|     <script src="~/js/site.js" type="text/javascript" asp-append-version="true"></script> | ||||
|     <script> | ||||
|         $(document).ready(function () { | ||||
|             if (location.pathname == "/") { | ||||
| @ -73,7 +74,7 @@ | ||||
|                     <li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li> | ||||
|                 </ul> | ||||
|                 <p class="navbar-text navbar-right"> | ||||
|                     @User.Identity.Name | ||||
|                     @User.Identity?.Name | ||||
|                 </p> | ||||
|             </div> | ||||
|         </div> | ||||
| @ -1,26 +1,15 @@ | ||||
| { | ||||
|   "AllowedHosts": "*", | ||||
|   "ApiLoggingContentTypes": "application/json", | ||||
|   "ApiLoggingPathPrefixes": "/api/inbound", | ||||
|   "ApiLogPath": "D:\\Metrology\\MetrologyAPILogs", | ||||
|   "AttachmentPath": "\\\\messv02ecc1.ec.local\\EC_Metrology_Si\\MetrologyAttachments", | ||||
|   "BuildNumber": "1",   | ||||
|   "Company": "Infineon Technologies Americas Corp.", | ||||
|   "ConnectionString": "Data Source=messv01ec.ec.local\\PROD1,53959;Integrated Security=True;Initial Catalog=Metrology;", | ||||
|   "GitCommitSeven": "1234567", | ||||
|   "Logging": { | ||||
|     "LogLevel": { | ||||
|       "Default": "Information", | ||||
|       "Microsoft": "Warning", | ||||
|       "Log4netProvider": "Debug", | ||||
|       "Microsoft.Hosting.Lifetime": "Information" | ||||
|     } | ||||
|   }, | ||||
|   "InboundApiAllowedIPList": "", | ||||
|   "xApiUrl": "http://messa010ec.ec.local:50301/api", | ||||
|   "ApiUrl": "http://localhost:5126/api", | ||||
|   "xxxApiUrl": "http://localhost:50301/api", | ||||
|   "xxxxApiUrl": "http://messa010ec.ec.local:50301/api", | ||||
|   "ConnectionString": "Data Source=MESSAD1001\\TEST1,59583;Integrated Security=True;Initial Catalog=Metrology;", | ||||
|   "xConnectionString": "Data Source=messv01ec.ec.local\\PROD1,53959;Integrated Security=True;Initial Catalog=Metrology;", | ||||
|   "IsDevelopment": true, | ||||
|   "xMockRoot": "/Data/Tests", | ||||
|   "MockRoot": "", | ||||
|   "MonAResource": "OI_Metrology_Viewer_IFX", | ||||
|   "MonASite": "auc", | ||||
|   "Oi2SqlConnectionString": "Data Source=messv01ec.ec.local\\PROD1,53959;Initial Catalog=LSL2SQL;Persist Security Info=True;User ID=srpadmin;Password=0okm9ijn;", | ||||
|   "OIExportPath": "\\\\openinsight-db-srv.na.infineon.com\\apps\\Metrology\\Data", | ||||
|   "Oi2SqlConnectionString": "Data Source=MESSAD1001\\TEST1,59583;Initial Catalog=LSL2SQL;Persist Security Info=True;User ID=srpadmin;Password=0okm9ijn;", | ||||
|   "Serilog": { | ||||
|     "Using": [ | ||||
|       "Serilog.Sinks.Console", | ||||
| @ -58,6 +47,5 @@ | ||||
|       "Application": "Sample" | ||||
|     } | ||||
|   }, | ||||
|   "URLs": "https://localhost:7130;http://localhost:5126", | ||||
|   "WorkingDirectoryName": "IFXApps" | ||||
|   "URLs": "https://localhost:7130;http://localhost:5126" | ||||
| } | ||||
| @ -2,6 +2,7 @@ | ||||
|   "AllowedHosts": "*", | ||||
|   "ApiLoggingContentTypes": "application/json", | ||||
|   "ApiLoggingPathPrefixes": "/api/inbound", | ||||
|   "ApiUrl": "~/api", | ||||
|   "ApiLogPath": "D:\\Metrology\\MetrologyAPILogs", | ||||
|   "AttachmentPath": "\\\\messv02ecc1.ec.local\\EC_Metrology_Si\\MetrologyAttachments", | ||||
|   "BuildNumber": "1",   | ||||
| @ -17,6 +18,9 @@ | ||||
|     } | ||||
|   }, | ||||
|   "InboundApiAllowedIPList": "", | ||||
|   "IsDevelopment": false, | ||||
|   "IsStaging": false, | ||||
|   "MockRoot": "", | ||||
|   "MonAResource": "OI_Metrology_Viewer_EC", | ||||
|   "MonASite": "auc", | ||||
|   "Oi2SqlConnectionString": "Data Source=messv01ec.ec.local\\PROD1,53959;Initial Catalog=LSL2SQL;Persist Security Info=True;User ID=srpadmin;Password=0okm9ijn;", | ||||
| @ -26,7 +30,7 @@ | ||||
|       "Serilog.Sinks.Console", | ||||
|       "Serilog.Sinks.File" | ||||
|     ], | ||||
|     "MinimumLevel": "Debug", | ||||
|     "MinimumLevel": "Information", | ||||
|     "WriteTo": [ | ||||
|       { | ||||
|         "Name": "Debug", | ||||
| Before Width: | Height: | Size: 272 KiB After Width: | Height: | Size: 272 KiB | 
| Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 63 KiB | 
| Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB | 
| Before Width: | Height: | Size: 210 B After Width: | Height: | Size: 210 B | 
| Before Width: | Height: | Size: 225 B After Width: | Height: | Size: 225 B | 
| Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 54 KiB | 
| Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB | 
| Before Width: | Height: | Size: 418 B After Width: | Height: | Size: 418 B | 
| Before Width: | Height: | Size: 985 B After Width: | Height: | Size: 985 B | 
| Before Width: | Height: | Size: 964 B After Width: | Height: | Size: 964 B | 
| Before Width: | Height: | Size: 486 B After Width: | Height: | Size: 486 B | 
| Before Width: | Height: | Size: 483 B After Width: | Height: | Size: 483 B | 
| Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 3.9 KiB | 
| Before Width: | Height: | Size: 6.0 KiB After Width: | Height: | Size: 6.0 KiB |