Merge branch 'develop' into main
This commit is contained in:
commit
c4fecb9a0c
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
96
configurations/azure/dev-monitor-rg.json
Normal file
96
configurations/azure/dev-monitor-rg.json
Normal file
@ -0,0 +1,96 @@
|
||||
{
|
||||
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
|
||||
"contentVersion": "1.0.0.0",
|
||||
"parameters": {
|
||||
"actionGroups_ag_manual_recovery_alerts_odms_dev_name": {
|
||||
"type": "String"
|
||||
},
|
||||
"scheduledqueryrules_ManualRecoveryAlerts_name": {
|
||||
"type": "String"
|
||||
},
|
||||
"sites_app_odms_dictation_dev_externalid": {
|
||||
"type": "String"
|
||||
}
|
||||
},
|
||||
"resources": [
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"location": "Global",
|
||||
"name": "[parameters('actionGroups_ag_manual_recovery_alerts_odms_dev_name')]",
|
||||
"properties": {
|
||||
"armRoleReceivers": [],
|
||||
"automationRunbookReceivers": [],
|
||||
"azureAppPushReceivers": [],
|
||||
"azureFunctionReceivers": [],
|
||||
"emailReceivers": [
|
||||
{
|
||||
"emailAddress": "saito.k@nds-tyo.co.jp",
|
||||
"name": "テスト通知_-EmailAction-",
|
||||
"useCommonAlertSchema": false
|
||||
}
|
||||
],
|
||||
"enabled": true,
|
||||
"eventHubReceivers": [],
|
||||
"groupShortName": "手動復旧が必要なエラー",
|
||||
"itsmReceivers": [],
|
||||
"logicAppReceivers": [],
|
||||
"smsReceivers": [],
|
||||
"voiceReceivers": [],
|
||||
"webhookReceivers": []
|
||||
},
|
||||
"tags": {
|
||||
"Environment": "develop",
|
||||
"Project": "ODMS",
|
||||
"ms-resource-usage": "ManualRecoveryAlerts"
|
||||
},
|
||||
"type": "microsoft.insights/actionGroups"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-03-15-preview",
|
||||
"dependsOn": [
|
||||
"[resourceId('microsoft.insights/actionGroups', parameters('actionGroups_ag_manual_recovery_alerts_odms_dev_name'))]"
|
||||
],
|
||||
"location": "japaneast",
|
||||
"name": "[parameters('scheduledqueryrules_ManualRecoveryAlerts_name')]",
|
||||
"properties": {
|
||||
"actions": {
|
||||
"actionGroups": [
|
||||
"[resourceId('microsoft.insights/actionGroups', parameters('actionGroups_ag_manual_recovery_alerts_odms_dev_name'))]"
|
||||
],
|
||||
"actionProperties": {},
|
||||
"customProperties": {}
|
||||
},
|
||||
"autoMitigate": false,
|
||||
"criteria": {
|
||||
"allOf": [
|
||||
{
|
||||
"dimensions": [],
|
||||
"failingPeriods": {
|
||||
"minFailingPeriodsToAlert": 1,
|
||||
"numberOfEvaluationPeriods": 1
|
||||
},
|
||||
"operator": "GreaterThanOrEqual",
|
||||
"query": "AppServiceConsoleLogs | where Level == \"Error\" and ResultDescription contains \"[MANUAL_RECOVERY_REQUIRED]\"\n",
|
||||
"threshold": 1.0,
|
||||
"timeAggregation": "Count"
|
||||
}
|
||||
]
|
||||
},
|
||||
"description": "手動復旧が必要なエラーを検知し、設定されたメールアドレスに通知を行う",
|
||||
"displayName": "[parameters('scheduledqueryrules_ManualRecoveryAlerts_name')]",
|
||||
"enabled": true,
|
||||
"evaluationFrequency": "PT1M",
|
||||
"scopes": [
|
||||
"[parameters('sites_app_odms_dictation_dev_externalid')]"
|
||||
],
|
||||
"severity": 0,
|
||||
"targetResourceTypes": [
|
||||
"Microsoft.Web/sites"
|
||||
],
|
||||
"windowSize": "PT1M"
|
||||
},
|
||||
"type": "microsoft.insights/scheduledqueryrules"
|
||||
}
|
||||
],
|
||||
"variables": {}
|
||||
}
|
||||
@ -1639,17 +1639,17 @@
|
||||
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
|
||||
},
|
||||
{
|
||||
"id": "[resourceId('Microsoft.Network/networkSecurityGroups/securityRules', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), 'AllowDeveloperInboundYumoto')]",
|
||||
"name": "AllowDeveloperInboundYumoto",
|
||||
"id": "[resourceId('Microsoft.Network/networkSecurityGroups/securityRules', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), 'AllowYumotoHTTPSInbound')]",
|
||||
"name": "AllowYumotoHTTPSInbound",
|
||||
"properties": {
|
||||
"access": "Allow",
|
||||
"description": "開発チーム NDS 湯本の動作確認用",
|
||||
"description": "NDS湯本 開発用アクセス用許可",
|
||||
"destinationAddressPrefix": "*",
|
||||
"destinationAddressPrefixes": [],
|
||||
"destinationPortRange": "443",
|
||||
"destinationPortRanges": [],
|
||||
"direction": "Inbound",
|
||||
"priority": 101,
|
||||
"priority": 120,
|
||||
"protocol": "TCP",
|
||||
"sourceAddressPrefix": "180.39.76.100",
|
||||
"sourceAddressPrefixes": [],
|
||||
@ -1657,6 +1657,143 @@
|
||||
"sourcePortRanges": []
|
||||
},
|
||||
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
|
||||
},
|
||||
{
|
||||
"id": "[resourceId('Microsoft.Network/networkSecurityGroups/securityRules', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), 'AllowSaitoHTTPSInbound')]",
|
||||
"name": "AllowSaitoHTTPSInbound",
|
||||
"properties": {
|
||||
"access": "Allow",
|
||||
"description": "NDS斎藤_Dev環境確認用",
|
||||
"destinationAddressPrefix": "*",
|
||||
"destinationAddressPrefixes": [],
|
||||
"destinationPortRange": "443",
|
||||
"destinationPortRanges": [],
|
||||
"direction": "Inbound",
|
||||
"priority": 121,
|
||||
"protocol": "TCP",
|
||||
"sourceAddressPrefix": "220.215.248.24",
|
||||
"sourceAddressPrefixes": [],
|
||||
"sourcePortRange": "*",
|
||||
"sourcePortRanges": []
|
||||
},
|
||||
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
|
||||
},
|
||||
{
|
||||
"id": "[resourceId('Microsoft.Network/networkSecurityGroups/securityRules', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), 'AllowMakabeHTTPSInbound')]",
|
||||
"name": "AllowMakabeHTTPSInbound",
|
||||
"properties": {
|
||||
"access": "Allow",
|
||||
"description": "NDS真壁 開発用アクセス用許可",
|
||||
"destinationAddressPrefix": "*",
|
||||
"destinationAddressPrefixes": [],
|
||||
"destinationPortRange": "443",
|
||||
"destinationPortRanges": [],
|
||||
"direction": "Inbound",
|
||||
"priority": 122,
|
||||
"protocol": "TCP",
|
||||
"sourceAddressPrefix": "60.97.55.122",
|
||||
"sourceAddressPrefixes": [],
|
||||
"sourcePortRange": "*",
|
||||
"sourcePortRanges": []
|
||||
},
|
||||
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
|
||||
},
|
||||
{
|
||||
"id": "[resourceId('Microsoft.Network/networkSecurityGroups/securityRules', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), 'AllowIwataHTTPSInbound')]",
|
||||
"name": "AllowIwataHTTPSInbound",
|
||||
"properties": {
|
||||
"access": "Allow",
|
||||
"destinationAddressPrefix": "*",
|
||||
"destinationAddressPrefixes": [],
|
||||
"destinationPortRange": "443",
|
||||
"destinationPortRanges": [],
|
||||
"direction": "Inbound",
|
||||
"priority": 123,
|
||||
"protocol": "TCP",
|
||||
"sourceAddressPrefix": "126.227.61.88",
|
||||
"sourceAddressPrefixes": [],
|
||||
"sourcePortRange": "*",
|
||||
"sourcePortRanges": []
|
||||
},
|
||||
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
|
||||
},
|
||||
{
|
||||
"id": "[resourceId('Microsoft.Network/networkSecurityGroups/securityRules', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), 'AllowFukunagaHTTPSInbound')]",
|
||||
"name": "AllowFukunagaHTTPSInbound",
|
||||
"properties": {
|
||||
"access": "Allow",
|
||||
"description": "福永の動作確認用",
|
||||
"destinationAddressPrefix": "*",
|
||||
"destinationAddressPrefixes": [],
|
||||
"destinationPortRange": "443",
|
||||
"destinationPortRanges": [],
|
||||
"direction": "Inbound",
|
||||
"priority": 124,
|
||||
"protocol": "TCP",
|
||||
"sourceAddressPrefix": "221.252.90.222",
|
||||
"sourceAddressPrefixes": [],
|
||||
"sourcePortRange": "*",
|
||||
"sourcePortRanges": []
|
||||
},
|
||||
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
|
||||
},
|
||||
{
|
||||
"id": "[resourceId('Microsoft.Network/networkSecurityGroups/securityRules', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), 'AllowNDSHTTPSInbound')]",
|
||||
"name": "AllowNDSHTTPSInbound",
|
||||
"properties": {
|
||||
"access": "Allow",
|
||||
"description": "開発チームNDSからの動作確認用",
|
||||
"destinationAddressPrefix": "*",
|
||||
"destinationAddressPrefixes": [],
|
||||
"destinationPortRange": "443",
|
||||
"destinationPortRanges": [],
|
||||
"direction": "Inbound",
|
||||
"priority": 125,
|
||||
"protocol": "TCP",
|
||||
"sourceAddressPrefix": "118.238.231.215",
|
||||
"sourceAddressPrefixes": [],
|
||||
"sourcePortRange": "*",
|
||||
"sourcePortRanges": []
|
||||
},
|
||||
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
|
||||
},
|
||||
{
|
||||
"id": "[resourceId('Microsoft.Network/networkSecurityGroups/securityRules', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), 'AllowOuraHTTPSInbound')]",
|
||||
"name": "AllowOuraHTTPSInbound",
|
||||
"properties": {
|
||||
"access": "Allow",
|
||||
"destinationAddressPrefix": "*",
|
||||
"destinationAddressPrefixes": [],
|
||||
"destinationPortRange": "443",
|
||||
"destinationPortRanges": [],
|
||||
"direction": "Inbound",
|
||||
"priority": 127,
|
||||
"protocol": "TCP",
|
||||
"sourceAddressPrefix": "60.65.231.128",
|
||||
"sourceAddressPrefixes": [],
|
||||
"sourcePortRange": "*",
|
||||
"sourcePortRanges": []
|
||||
},
|
||||
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
|
||||
},
|
||||
{
|
||||
"id": "[resourceId('Microsoft.Network/networkSecurityGroups/securityRules', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), 'AllowMaruyamaHTTPSInbound')]",
|
||||
"name": "AllowMaruyamaHTTPSInbound",
|
||||
"properties": {
|
||||
"access": "Allow",
|
||||
"destinationAddressPrefix": "*",
|
||||
"destinationAddressPrefixes": [],
|
||||
"destinationPortRange": "443",
|
||||
"destinationPortRanges": [],
|
||||
"direction": "Inbound",
|
||||
"priority": 126,
|
||||
"protocol": "TCP",
|
||||
"sourceAddressPrefix": "61.87.49.72",
|
||||
"sourceAddressPrefixes": [],
|
||||
"sourcePortRange": "*",
|
||||
"sourcePortRanges": []
|
||||
},
|
||||
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
|
||||
}
|
||||
]
|
||||
},
|
||||
@ -1965,18 +2102,153 @@
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Network/networkSecurityGroups', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), '/AllowDeveloperInboundYumoto')]",
|
||||
"name": "[concat(parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), '/AllowFukunagaHTTPSInbound')]",
|
||||
"properties": {
|
||||
"access": "Allow",
|
||||
"description": "開発チーム NDS 湯本の動作確認用",
|
||||
"description": "福永の動作確認用",
|
||||
"destinationAddressPrefix": "*",
|
||||
"destinationAddressPrefixes": [],
|
||||
"destinationPortRange": "443",
|
||||
"destinationPortRanges": [],
|
||||
"direction": "Inbound",
|
||||
"priority": 101,
|
||||
"priority": 124,
|
||||
"protocol": "TCP",
|
||||
"sourceAddressPrefix": "180.39.76.100",
|
||||
"sourceAddressPrefix": "221.252.90.222",
|
||||
"sourceAddressPrefixes": [],
|
||||
"sourcePortRange": "*",
|
||||
"sourcePortRanges": []
|
||||
},
|
||||
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-05-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Network/networkSecurityGroups', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), '/AllowIwataHTTPSInbound')]",
|
||||
"properties": {
|
||||
"access": "Allow",
|
||||
"destinationAddressPrefix": "*",
|
||||
"destinationAddressPrefixes": [],
|
||||
"destinationPortRange": "443",
|
||||
"destinationPortRanges": [],
|
||||
"direction": "Inbound",
|
||||
"priority": 123,
|
||||
"protocol": "TCP",
|
||||
"sourceAddressPrefix": "126.227.61.88",
|
||||
"sourceAddressPrefixes": [],
|
||||
"sourcePortRange": "*",
|
||||
"sourcePortRanges": []
|
||||
},
|
||||
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-05-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Network/networkSecurityGroups', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), '/AllowMakabeHTTPSInbound')]",
|
||||
"properties": {
|
||||
"access": "Allow",
|
||||
"description": "NDS真壁 開発用アクセス用許可",
|
||||
"destinationAddressPrefix": "*",
|
||||
"destinationAddressPrefixes": [],
|
||||
"destinationPortRange": "443",
|
||||
"destinationPortRanges": [],
|
||||
"direction": "Inbound",
|
||||
"priority": 122,
|
||||
"protocol": "TCP",
|
||||
"sourceAddressPrefix": "60.97.55.122",
|
||||
"sourceAddressPrefixes": [],
|
||||
"sourcePortRange": "*",
|
||||
"sourcePortRanges": []
|
||||
},
|
||||
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-05-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Network/networkSecurityGroups', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), '/AllowMaruyamaHTTPSInbound')]",
|
||||
"properties": {
|
||||
"access": "Allow",
|
||||
"destinationAddressPrefix": "*",
|
||||
"destinationAddressPrefixes": [],
|
||||
"destinationPortRange": "443",
|
||||
"destinationPortRanges": [],
|
||||
"direction": "Inbound",
|
||||
"priority": 126,
|
||||
"protocol": "TCP",
|
||||
"sourceAddressPrefix": "61.87.49.72",
|
||||
"sourceAddressPrefixes": [],
|
||||
"sourcePortRange": "*",
|
||||
"sourcePortRanges": []
|
||||
},
|
||||
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-05-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Network/networkSecurityGroups', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), '/AllowNDSHTTPSInbound')]",
|
||||
"properties": {
|
||||
"access": "Allow",
|
||||
"description": "開発チームNDSからの動作確認用",
|
||||
"destinationAddressPrefix": "*",
|
||||
"destinationAddressPrefixes": [],
|
||||
"destinationPortRange": "443",
|
||||
"destinationPortRanges": [],
|
||||
"direction": "Inbound",
|
||||
"priority": 125,
|
||||
"protocol": "TCP",
|
||||
"sourceAddressPrefix": "118.238.231.215",
|
||||
"sourceAddressPrefixes": [],
|
||||
"sourcePortRange": "*",
|
||||
"sourcePortRanges": []
|
||||
},
|
||||
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-05-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Network/networkSecurityGroups', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), '/AllowOuraHTTPSInbound')]",
|
||||
"properties": {
|
||||
"access": "Allow",
|
||||
"destinationAddressPrefix": "*",
|
||||
"destinationAddressPrefixes": [],
|
||||
"destinationPortRange": "443",
|
||||
"destinationPortRanges": [],
|
||||
"direction": "Inbound",
|
||||
"priority": 127,
|
||||
"protocol": "TCP",
|
||||
"sourceAddressPrefix": "60.65.231.128",
|
||||
"sourceAddressPrefixes": [],
|
||||
"sourcePortRange": "*",
|
||||
"sourcePortRanges": []
|
||||
},
|
||||
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-05-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Network/networkSecurityGroups', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), '/AllowSaitoHTTPSInbound')]",
|
||||
"properties": {
|
||||
"access": "Allow",
|
||||
"description": "NDS斎藤_Dev環境確認用",
|
||||
"destinationAddressPrefix": "*",
|
||||
"destinationAddressPrefixes": [],
|
||||
"destinationPortRange": "443",
|
||||
"destinationPortRanges": [],
|
||||
"direction": "Inbound",
|
||||
"priority": 121,
|
||||
"protocol": "TCP",
|
||||
"sourceAddressPrefix": "220.215.248.24",
|
||||
"sourceAddressPrefixes": [],
|
||||
"sourcePortRange": "*",
|
||||
"sourcePortRanges": []
|
||||
@ -2005,6 +2277,29 @@
|
||||
},
|
||||
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-05-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Network/networkSecurityGroups', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), '/AllowYumotoHTTPSInbound')]",
|
||||
"properties": {
|
||||
"access": "Allow",
|
||||
"description": "NDS湯本 開発用アクセス用許可",
|
||||
"destinationAddressPrefix": "*",
|
||||
"destinationAddressPrefixes": [],
|
||||
"destinationPortRange": "443",
|
||||
"destinationPortRanges": [],
|
||||
"direction": "Inbound",
|
||||
"priority": 120,
|
||||
"protocol": "TCP",
|
||||
"sourceAddressPrefix": "180.39.76.100",
|
||||
"sourceAddressPrefixes": [],
|
||||
"sourcePortRange": "*",
|
||||
"sourcePortRanges": []
|
||||
},
|
||||
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-05-01",
|
||||
"dependsOn": [
|
||||
@ -11040,6 +11335,13 @@
|
||||
"*"
|
||||
],
|
||||
"service": "Microsoft.KeyVault"
|
||||
},
|
||||
{
|
||||
"locations": [
|
||||
"japaneast",
|
||||
"japanwest"
|
||||
],
|
||||
"service": "Microsoft.Storage"
|
||||
}
|
||||
]
|
||||
},
|
||||
@ -11213,6 +11515,25 @@
|
||||
"id": "[concat(resourceId('Microsoft.Network/applicationGateways', parameters('applicationGateways_agw_odms_webapp_dev_name')), '/sslCertificates/ca-odms-agw-dev')]"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "[concat(resourceId('Microsoft.Network/applicationGateways', parameters('applicationGateways_agw_odms_webapp_dev_name')), '/httpListeners/listener-odms-public-dev')]",
|
||||
"name": "listener-odms-public-dev",
|
||||
"properties": {
|
||||
"customErrorConfigurations": [],
|
||||
"frontendIPConfiguration": {
|
||||
"id": "[concat(resourceId('Microsoft.Network/applicationGateways', parameters('applicationGateways_agw_odms_webapp_dev_name')), '/frontendIPConfigurations/appGwPublicFrontendIpIPv4')]"
|
||||
},
|
||||
"frontendPort": {
|
||||
"id": "[concat(resourceId('Microsoft.Network/applicationGateways', parameters('applicationGateways_agw_odms_webapp_dev_name')), '/frontendPorts/port_443')]"
|
||||
},
|
||||
"hostNames": [],
|
||||
"protocol": "Https",
|
||||
"requireServerNameIndication": false,
|
||||
"sslCertificate": {
|
||||
"id": "[concat(resourceId('Microsoft.Network/applicationGateways', parameters('applicationGateways_agw_odms_webapp_dev_name')), '/sslCertificates/ca-odms-agw-dev')]"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"listeners": [],
|
||||
@ -11249,6 +11570,20 @@
|
||||
"id": "[concat(resourceId('Microsoft.Network/applicationGateways', parameters('applicationGateways_agw_odms_webapp_dev_name')), '/urlPathMaps/rule-odms-private-dev')]"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "[concat(resourceId('Microsoft.Network/applicationGateways', parameters('applicationGateways_agw_odms_webapp_dev_name')), '/requestRoutingRules/rule-odms-public-dev')]",
|
||||
"name": "rule-odms-public-dev",
|
||||
"properties": {
|
||||
"httpListener": {
|
||||
"id": "[concat(resourceId('Microsoft.Network/applicationGateways', parameters('applicationGateways_agw_odms_webapp_dev_name')), '/httpListeners/listener-odms-public-dev')]"
|
||||
},
|
||||
"priority": 2,
|
||||
"ruleType": "PathBasedRouting",
|
||||
"urlPathMap": {
|
||||
"id": "[concat(resourceId('Microsoft.Network/applicationGateways', parameters('applicationGateways_agw_odms_webapp_dev_name')), '/urlPathMaps/rule-odms-public-dev')]"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"rewriteRuleSets": [],
|
||||
@ -11300,6 +11635,35 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "[concat(resourceId('Microsoft.Network/applicationGateways', parameters('applicationGateways_agw_odms_webapp_dev_name')), '/urlPathMaps/rule-odms-public-dev')]",
|
||||
"name": "rule-odms-public-dev",
|
||||
"properties": {
|
||||
"defaultBackendAddressPool": {
|
||||
"id": "[concat(resourceId('Microsoft.Network/applicationGateways', parameters('applicationGateways_agw_odms_webapp_dev_name')), '/backendAddressPools/pool-odms-staapp-dev')]"
|
||||
},
|
||||
"defaultBackendHttpSettings": {
|
||||
"id": "[concat(resourceId('Microsoft.Network/applicationGateways', parameters('applicationGateways_agw_odms_webapp_dev_name')), '/backendHttpSettingsCollection/setting-odms-https-dev')]"
|
||||
},
|
||||
"pathRules": [
|
||||
{
|
||||
"id": "[concat(resourceId('Microsoft.Network/applicationGateways', parameters('applicationGateways_agw_odms_webapp_dev_name')), '/urlPathMaps/rule-odms-public-dev/pathRules/target-odms-app-dev')]",
|
||||
"name": "target-odms-app-dev",
|
||||
"properties": {
|
||||
"backendAddressPool": {
|
||||
"id": "[concat(resourceId('Microsoft.Network/applicationGateways', parameters('applicationGateways_agw_odms_webapp_dev_name')), '/backendAddressPools/pool-odms-app-dev')]"
|
||||
},
|
||||
"backendHttpSettings": {
|
||||
"id": "[concat(resourceId('Microsoft.Network/applicationGateways', parameters('applicationGateways_agw_odms_webapp_dev_name')), '/backendHttpSettingsCollection/setting-odms-https-dev')]"
|
||||
},
|
||||
"paths": [
|
||||
"/dictation/api/*"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
@ -11432,6 +11796,13 @@
|
||||
"*"
|
||||
],
|
||||
"service": "Microsoft.KeyVault"
|
||||
},
|
||||
{
|
||||
"locations": [
|
||||
"japaneast",
|
||||
"japanwest"
|
||||
],
|
||||
"service": "Microsoft.Storage"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
@ -13,6 +13,7 @@
|
||||
"name": "[parameters('namespaces_ntfns_odms_dev_name')]",
|
||||
"properties": {
|
||||
"namespaceType": "NotificationHub",
|
||||
"networkAcls": {},
|
||||
"provisioningState": "Succeeded",
|
||||
"publicNetworkAccess": "Enabled",
|
||||
"status": "Created"
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
39
configurations/azure/stg-monitor-rg.json
Normal file
39
configurations/azure/stg-monitor-rg.json
Normal file
@ -0,0 +1,39 @@
|
||||
{
|
||||
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
|
||||
"contentVersion": "1.0.0.0",
|
||||
"parameters": {
|
||||
"actionGroups__ag_manual_recovery_alerts_odms_stg_name": {
|
||||
"type": "String"
|
||||
}
|
||||
},
|
||||
"resources": [
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"location": "Global",
|
||||
"name": "[parameters('actionGroups__ag_manual_recovery_alerts_odms_stg_name')]",
|
||||
"properties": {
|
||||
"armRoleReceivers": [],
|
||||
"automationRunbookReceivers": [],
|
||||
"azureAppPushReceivers": [],
|
||||
"azureFunctionReceivers": [],
|
||||
"emailReceivers": [
|
||||
{
|
||||
"emailAddress": "saito.k@nds-tyo.co.jp",
|
||||
"name": "Alert Notification Address_-EmailAction-",
|
||||
"useCommonAlertSchema": false
|
||||
}
|
||||
],
|
||||
"enabled": true,
|
||||
"eventHubReceivers": [],
|
||||
"groupShortName": "Žè“®•œ‹ŒƒGƒ‰<C692>[",
|
||||
"itsmReceivers": [],
|
||||
"logicAppReceivers": [],
|
||||
"smsReceivers": [],
|
||||
"voiceReceivers": [],
|
||||
"webhookReceivers": []
|
||||
},
|
||||
"type": "microsoft.insights/actionGroups"
|
||||
}
|
||||
],
|
||||
"variables": {}
|
||||
}
|
||||
@ -586,6 +586,43 @@
|
||||
"matchVariable": "RequestArgNames",
|
||||
"selector": "idToken",
|
||||
"selectorMatchOperator": "Equals"
|
||||
},
|
||||
{
|
||||
"exclusionManagedRuleSets": [
|
||||
{
|
||||
"ruleGroups": [
|
||||
{
|
||||
"ruleGroupName": "REQUEST-920-PROTOCOL-ENFORCEMENT",
|
||||
"rules": [
|
||||
{
|
||||
"ruleId": "920230"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ruleGroupName": "REQUEST-931-APPLICATION-ATTACK-RFI",
|
||||
"rules": [
|
||||
{
|
||||
"ruleId": "931130"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ruleGroupName": "REQUEST-942-APPLICATION-ATTACK-SQLI",
|
||||
"rules": [
|
||||
{
|
||||
"ruleId": "942430"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"ruleSetType": "OWASP",
|
||||
"ruleSetVersion": "3.2"
|
||||
}
|
||||
],
|
||||
"matchVariable": "RequestArgValues",
|
||||
"selector": "handler",
|
||||
"selectorMatchOperator": "Equals"
|
||||
}
|
||||
],
|
||||
"managedRuleSets": [
|
||||
@ -936,7 +973,7 @@
|
||||
"direction": "Inbound",
|
||||
"priority": 902,
|
||||
"protocol": "TCP",
|
||||
"sourceAddressPrefix": "125.193.161.194/32",
|
||||
"sourceAddressPrefix": "126.227.61.88",
|
||||
"sourceAddressPrefixes": [],
|
||||
"sourcePortRange": "*",
|
||||
"sourcePortRanges": []
|
||||
@ -1197,6 +1234,7 @@
|
||||
"name": "AllowMyIpAddressCustom8080Inbound.saito",
|
||||
"properties": {
|
||||
"access": "Allow",
|
||||
"description": "saitoƒeƒXƒg",
|
||||
"destinationAddressPrefix": "*",
|
||||
"destinationAddressPrefixes": [],
|
||||
"destinationPortRange": "443",
|
||||
@ -1204,7 +1242,7 @@
|
||||
"direction": "Inbound",
|
||||
"priority": 999,
|
||||
"protocol": "*",
|
||||
"sourceAddressPrefix": "220.215.171.117",
|
||||
"sourceAddressPrefix": "220.215.194.33",
|
||||
"sourceAddressPrefixes": [],
|
||||
"sourcePortRange": "*",
|
||||
"sourcePortRanges": []
|
||||
@ -1608,7 +1646,7 @@
|
||||
"direction": "Inbound",
|
||||
"priority": 902,
|
||||
"protocol": "TCP",
|
||||
"sourceAddressPrefix": "125.193.161.194/32",
|
||||
"sourceAddressPrefix": "126.227.61.88",
|
||||
"sourceAddressPrefixes": [],
|
||||
"sourcePortRange": "*",
|
||||
"sourcePortRanges": []
|
||||
@ -2220,6 +2258,7 @@
|
||||
"name": "[concat(parameters('networkSecurityGroups_nsg_odms_gateway_stg_name'), '/AllowMyIpAddressCustom8080Inbound.saito')]",
|
||||
"properties": {
|
||||
"access": "Allow",
|
||||
"description": "saitoƒeƒXƒg",
|
||||
"destinationAddressPrefix": "*",
|
||||
"destinationAddressPrefixes": [],
|
||||
"destinationPortRange": "443",
|
||||
@ -2227,7 +2266,7 @@
|
||||
"direction": "Inbound",
|
||||
"priority": 999,
|
||||
"protocol": "*",
|
||||
"sourceAddressPrefix": "220.215.171.117",
|
||||
"sourceAddressPrefix": "220.215.194.33",
|
||||
"sourceAddressPrefixes": [],
|
||||
"sourcePortRange": "*",
|
||||
"sourcePortRanges": []
|
||||
|
||||
@ -13,6 +13,7 @@
|
||||
"name": "[parameters('namespaces_ntfns_odms_stg_name')]",
|
||||
"properties": {
|
||||
"namespaceType": "NotificationHub",
|
||||
"networkAcls": {},
|
||||
"provisioningState": "Succeeded",
|
||||
"publicNetworkAccess": "Enabled",
|
||||
"status": "Created"
|
||||
|
||||
@ -204,6 +204,22 @@
|
||||
"*"
|
||||
],
|
||||
"maxAgeInSeconds": 28800
|
||||
},
|
||||
{
|
||||
"allowedHeaders": [
|
||||
"*"
|
||||
],
|
||||
"allowedMethods": [
|
||||
"GET",
|
||||
"OPTIONS"
|
||||
],
|
||||
"allowedOrigins": [
|
||||
"https://20.210.206.188"
|
||||
],
|
||||
"exposedHeaders": [
|
||||
"*"
|
||||
],
|
||||
"maxAgeInSeconds": 2880
|
||||
}
|
||||
]
|
||||
},
|
||||
@ -269,6 +285,22 @@
|
||||
"*"
|
||||
],
|
||||
"maxAgeInSeconds": 28800
|
||||
},
|
||||
{
|
||||
"allowedHeaders": [
|
||||
"*"
|
||||
],
|
||||
"allowedMethods": [
|
||||
"GET",
|
||||
"OPTIONS"
|
||||
],
|
||||
"allowedOrigins": [
|
||||
"https://20.210.206.188"
|
||||
],
|
||||
"exposedHeaders": [
|
||||
"*"
|
||||
],
|
||||
"maxAgeInSeconds": 2880
|
||||
}
|
||||
]
|
||||
},
|
||||
@ -334,6 +366,22 @@
|
||||
"*"
|
||||
],
|
||||
"maxAgeInSeconds": 28800
|
||||
},
|
||||
{
|
||||
"allowedHeaders": [
|
||||
"*"
|
||||
],
|
||||
"allowedMethods": [
|
||||
"GET",
|
||||
"OPTIONS"
|
||||
],
|
||||
"allowedOrigins": [
|
||||
"https://20.210.206.188"
|
||||
],
|
||||
"exposedHeaders": [
|
||||
"*"
|
||||
],
|
||||
"maxAgeInSeconds": 2880
|
||||
}
|
||||
]
|
||||
},
|
||||
@ -2134,6 +2182,125 @@
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-193')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-194')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-195')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-196')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-197')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-198')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-199')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
@ -2185,6 +2352,176 @@
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-200')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-201')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-202')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-203')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-204')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-205')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-206')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-207')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-208')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-209')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
@ -2202,6 +2539,601 @@
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-210')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-211')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-212')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-213')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-214')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-215')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-216')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-217')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-218')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-219')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-220')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-221')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-222')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsaustg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsaustg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsaustg_name'), '/default/account-223')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsaustg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsaustg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsaustg_name'), '/default/account-224')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-225')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-226')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-227')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-228')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-229')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-230')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-231')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-232')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-233')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-234')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-235')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-236')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-237')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-238')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-239')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-240')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-241')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-242')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-243')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_saodmsusstg_name'), 'default')]",
|
||||
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_saodmsusstg_name'))]"
|
||||
],
|
||||
"name": "[concat(parameters('storageAccounts_saodmsusstg_name'), '/default/account-244')]",
|
||||
"properties": {
|
||||
"defaultEncryptionScope": "$account-encryption-key",
|
||||
"denyEncryptionScopeOverride": false,
|
||||
"immutableStorageWithVersioning": {
|
||||
"enabled": false
|
||||
},
|
||||
"publicAccess": "None"
|
||||
},
|
||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
||||
},
|
||||
{
|
||||
"apiVersion": "2023-01-01",
|
||||
"dependsOn": [
|
||||
|
||||
@ -2,9 +2,13 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" type="image/svg+xml" href="/src/favicon.svg" />
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/svg+xml"
|
||||
href="/src/assets/images/favicon.ico"
|
||||
/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Vite App</title>
|
||||
<title>ODMS Cloud</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
BIN
dictation_client/src/assets/images/favicon.ico
Normal file
BIN
dictation_client/src/assets/images/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.2 KiB |
@ -1,15 +0,0 @@
|
||||
<svg width="410" height="404" viewBox="0 0 410 404" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M399.641 59.5246L215.643 388.545C211.844 395.338 202.084 395.378 198.228 388.618L10.5817 59.5563C6.38087 52.1896 12.6802 43.2665 21.0281 44.7586L205.223 77.6824C206.398 77.8924 207.601 77.8904 208.776 77.6763L389.119 44.8058C397.439 43.2894 403.768 52.1434 399.641 59.5246Z" fill="url(#paint0_linear)"/>
|
||||
<path d="M292.965 1.5744L156.801 28.2552C154.563 28.6937 152.906 30.5903 152.771 32.8664L144.395 174.33C144.198 177.662 147.258 180.248 150.51 179.498L188.42 170.749C191.967 169.931 195.172 173.055 194.443 176.622L183.18 231.775C182.422 235.487 185.907 238.661 189.532 237.56L212.947 230.446C216.577 229.344 220.065 232.527 219.297 236.242L201.398 322.875C200.278 328.294 207.486 331.249 210.492 326.603L212.5 323.5L323.454 102.072C325.312 98.3645 322.108 94.137 318.036 94.9228L279.014 102.454C275.347 103.161 272.227 99.746 273.262 96.1583L298.731 7.86689C299.767 4.27314 296.636 0.855181 292.965 1.5744Z" fill="url(#paint1_linear)"/>
|
||||
<defs>
|
||||
<linearGradient id="paint0_linear" x1="6.00017" y1="32.9999" x2="235" y2="344" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#41D1FF"/>
|
||||
<stop offset="1" stop-color="#BD34FE"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint1_linear" x1="194.651" y1="8.81818" x2="236.076" y2="292.989" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#FFEA83"/>
|
||||
<stop offset="0.0833333" stop-color="#FFDD35"/>
|
||||
<stop offset="1" stop-color="#FFA800"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.5 KiB |
@ -2,6 +2,7 @@ import { PayloadAction, createSlice } from "@reduxjs/toolkit";
|
||||
import { Assignee, Task } from "api/api";
|
||||
import { DictationState } from "./state";
|
||||
import {
|
||||
backupTasksAsync,
|
||||
getSortColumnAsync,
|
||||
listBackupPopupTasksAsync,
|
||||
listTasksAsync,
|
||||
@ -46,6 +47,7 @@ const initialState: DictationState = {
|
||||
},
|
||||
isLoading: true,
|
||||
isBackupListLoading: false,
|
||||
isDownloading: false,
|
||||
},
|
||||
};
|
||||
|
||||
@ -203,6 +205,15 @@ export const dictationSlice = createSlice({
|
||||
builder.addCase(listBackupPopupTasksAsync.rejected, (state) => {
|
||||
state.apps.isBackupListLoading = false;
|
||||
});
|
||||
builder.addCase(backupTasksAsync.pending, (state) => {
|
||||
state.apps.isDownloading = true;
|
||||
});
|
||||
builder.addCase(backupTasksAsync.fulfilled, (state) => {
|
||||
state.apps.isDownloading = false;
|
||||
});
|
||||
builder.addCase(backupTasksAsync.rejected, (state) => {
|
||||
state.apps.isDownloading = false;
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@ -3,6 +3,7 @@ import type { RootState } from "app/store";
|
||||
import { getTranslationID } from "translation";
|
||||
import { openSnackbar } from "features/ui/uiSlice";
|
||||
import { getAccessToken } from "features/auth";
|
||||
import { BlobClient } from "@azure/storage-blob";
|
||||
import {
|
||||
TasksResponse,
|
||||
TasksApi,
|
||||
@ -11,6 +12,7 @@ import {
|
||||
GetTypistsResponse,
|
||||
GetTypistGroupsResponse,
|
||||
Assignee,
|
||||
FilesApi,
|
||||
} from "../../api/api";
|
||||
import { Configuration } from "../../api/configuration";
|
||||
import { ErrorObject, createErrorObject } from "../../common/errors";
|
||||
@ -22,6 +24,7 @@ import {
|
||||
SORTABLE_COLUMN,
|
||||
SortableColumnType,
|
||||
} from "./constants";
|
||||
import { BackupTask } from "./types";
|
||||
|
||||
export const listTasksAsync = createAsyncThunk<
|
||||
TasksResponse,
|
||||
@ -455,7 +458,7 @@ export const listBackupPopupTasksAsync = createAsyncThunk<
|
||||
BACKUP_POPUP_LIST_SIZE,
|
||||
offset,
|
||||
BACKUP_POPUP_LIST_STATUS.join(","), // ステータスはFinished,Backupのみ
|
||||
DIRECTION.ASC,
|
||||
DIRECTION.DESC,
|
||||
SORTABLE_COLUMN.Status,
|
||||
{
|
||||
headers: { authorization: `Bearer ${accessToken}` },
|
||||
@ -476,3 +479,96 @@ export const listBackupPopupTasksAsync = createAsyncThunk<
|
||||
return thunkApi.rejectWithValue({ error });
|
||||
}
|
||||
});
|
||||
|
||||
export const backupTasksAsync = createAsyncThunk<
|
||||
{
|
||||
// empty
|
||||
},
|
||||
{
|
||||
// パラメータ
|
||||
tasks: BackupTask[];
|
||||
},
|
||||
{
|
||||
// rejectした時の返却値の型
|
||||
rejectValue: {
|
||||
error: ErrorObject;
|
||||
};
|
||||
}
|
||||
>("dictations/backupTasksAsync", async (args, thunkApi) => {
|
||||
const { tasks } = args;
|
||||
|
||||
// apiのConfigurationを取得する
|
||||
const { getState } = thunkApi;
|
||||
const state = getState() as RootState;
|
||||
const { configuration } = state.auth;
|
||||
const accessToken = getAccessToken(state.auth);
|
||||
const config = new Configuration(configuration);
|
||||
const tasksApi = new TasksApi(config);
|
||||
const filesApi = new FilesApi(config);
|
||||
|
||||
try {
|
||||
// eslint-disable-next-line no-restricted-syntax
|
||||
for (const task of tasks) {
|
||||
if (task.checked) {
|
||||
// eslint-disable-next-line no-await-in-loop
|
||||
const { data } = await filesApi.downloadLocation(task.audioFileId, {
|
||||
headers: { authorization: `Bearer ${accessToken}` },
|
||||
});
|
||||
|
||||
const { url } = data;
|
||||
const { pathname } = new URL(url);
|
||||
|
||||
const paths = pathname.split("/").filter((p) => p !== "");
|
||||
if (paths.length < 2) {
|
||||
throw new Error("invalid path");
|
||||
}
|
||||
const blobName = paths[1];
|
||||
|
||||
// コンテナとBlobを取得
|
||||
const blobClient = new BlobClient(url);
|
||||
// Blobをダウンロード
|
||||
// eslint-disable-next-line no-await-in-loop
|
||||
const blobDownloadResponse = await blobClient.download();
|
||||
// eslint-disable-next-line no-await-in-loop
|
||||
const blobBody = await blobDownloadResponse.blobBody;
|
||||
|
||||
if (!blobBody) {
|
||||
throw new Error("invalid blobBody");
|
||||
}
|
||||
|
||||
// ダウンロードしたBlobをローカルに保存するリンクを作成してクリックする
|
||||
const blobURL = window.URL.createObjectURL(blobBody);
|
||||
const a = document.createElement("a");
|
||||
a.href = blobURL;
|
||||
a.download = blobName;
|
||||
document.body.appendChild(a);
|
||||
a.click();
|
||||
a.parentNode?.removeChild(a);
|
||||
|
||||
// eslint-disable-next-line no-await-in-loop
|
||||
await tasksApi.backup(task.audioFileId, {
|
||||
headers: { authorization: `Bearer ${accessToken}` },
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
thunkApi.dispatch(
|
||||
openSnackbar({
|
||||
level: "info",
|
||||
message: getTranslationID("common.message.success"),
|
||||
})
|
||||
);
|
||||
return {};
|
||||
} catch (e) {
|
||||
// e ⇒ errorObjectに変換"
|
||||
const error = createErrorObject(e);
|
||||
thunkApi.dispatch(
|
||||
openSnackbar({
|
||||
level: "error",
|
||||
message: getTranslationID("dictationPage.message.backupFailedError"),
|
||||
})
|
||||
);
|
||||
|
||||
return thunkApi.rejectWithValue({ error });
|
||||
}
|
||||
});
|
||||
|
||||
@ -68,3 +68,6 @@ export const selectBackupAllChecked = (state: RootState) => {
|
||||
|
||||
export const selectIsBackupListLoading = (state: RootState) =>
|
||||
state.dictation.apps.isBackupListLoading;
|
||||
|
||||
export const selectIsDownloading = (state: RootState) =>
|
||||
state.dictation.apps.isDownloading;
|
||||
|
||||
@ -32,6 +32,7 @@ export interface Apps {
|
||||
};
|
||||
isLoading: boolean;
|
||||
isBackupListLoading: boolean;
|
||||
isDownloading: boolean;
|
||||
}
|
||||
|
||||
export interface Backup {
|
||||
|
||||
@ -3,6 +3,7 @@ import styles from "styles/app.module.scss";
|
||||
import { useDispatch, useSelector } from "react-redux";
|
||||
import {
|
||||
BACKUP_POPUP_LIST_SIZE,
|
||||
backupTasksAsync,
|
||||
changeBackupTaskAllCheched,
|
||||
changeBackupTaskChecked,
|
||||
listBackupPopupTasksAsync,
|
||||
@ -11,6 +12,7 @@ import {
|
||||
selectBackupTotal,
|
||||
selectCurrentBackupPage,
|
||||
selectIsBackupListLoading,
|
||||
selectIsDownloading,
|
||||
selectTotalBackupPage,
|
||||
} from "features/dictation";
|
||||
import { AppDispatch } from "app/store";
|
||||
@ -30,6 +32,7 @@ export const BackupPopup: React.FC<BackupPopupProps> = (props) => {
|
||||
const [t] = useTranslation();
|
||||
|
||||
const isBackupListLoading = useSelector(selectIsBackupListLoading);
|
||||
const isDownloading = useSelector(selectIsDownloading);
|
||||
|
||||
const backupTasks = useSelector(selectBackupTasks);
|
||||
|
||||
@ -41,8 +44,11 @@ export const BackupPopup: React.FC<BackupPopupProps> = (props) => {
|
||||
|
||||
// ポップアップを閉じる処理
|
||||
const closePopup = useCallback(() => {
|
||||
if (isDownloading) {
|
||||
return;
|
||||
}
|
||||
onClose(false);
|
||||
}, [onClose]);
|
||||
}, [onClose, isDownloading]);
|
||||
|
||||
useEffect(() => {
|
||||
if (isOpen) {
|
||||
@ -50,6 +56,33 @@ export const BackupPopup: React.FC<BackupPopupProps> = (props) => {
|
||||
}
|
||||
}, [dispatch, isOpen]);
|
||||
|
||||
// ブラウザのウィンドウが閉じられようとしている場合に発火するイベントハンドラ
|
||||
const handleBeforeUnload = (e: BeforeUnloadEvent) => {
|
||||
// ファイルダウンロード中に閉じられようとしている場合、ダイアログを表示させる
|
||||
if (isDownloading) {
|
||||
e.preventDefault();
|
||||
// ChromeではreturnValueが必要
|
||||
e.returnValue = "";
|
||||
}
|
||||
};
|
||||
|
||||
// コンポーネントがマウントされた時にイベントハンドラを登録する
|
||||
useEffect(() => {
|
||||
window.addEventListener("beforeunload", handleBeforeUnload);
|
||||
// コンポーネントがアンマウントされるときにイベントハンドラを解除する
|
||||
return () => {
|
||||
window.removeEventListener("beforeunload", handleBeforeUnload);
|
||||
};
|
||||
});
|
||||
|
||||
// バックアップ処理
|
||||
const onBackup = useCallback(async () => {
|
||||
await dispatch(backupTasksAsync({ tasks: backupTasks }));
|
||||
|
||||
// バックアップ処理の終了後、バックアップ対象タスク一覧を再取得する
|
||||
dispatch(listBackupPopupTasksAsync({ offset: 0 }));
|
||||
}, [dispatch, backupTasks]);
|
||||
|
||||
// ページネーションの制御
|
||||
const getFirstPage = useCallback(() => {
|
||||
dispatch(listBackupPopupTasksAsync({ offset: 0 }));
|
||||
@ -75,7 +108,11 @@ export const BackupPopup: React.FC<BackupPopupProps> = (props) => {
|
||||
<div className={styles.modalBox}>
|
||||
<p className={styles.modalTitle}>
|
||||
{t(getTranslationID("dictationPage.label.fileBackup"))}
|
||||
<button type="button" onClick={closePopup}>
|
||||
<button
|
||||
type="button"
|
||||
onClick={closePopup}
|
||||
style={{ pointerEvents: isDownloading ? "none" : "auto" }}
|
||||
>
|
||||
<img src={close} className={styles.modalTitleIcon} alt="close" />
|
||||
</button>
|
||||
</p>
|
||||
@ -97,6 +134,7 @@ export const BackupPopup: React.FC<BackupPopupProps> = (props) => {
|
||||
})
|
||||
)
|
||||
}
|
||||
disabled={isDownloading}
|
||||
/>
|
||||
</th>
|
||||
<th className={styles.noLine}>
|
||||
@ -133,6 +171,7 @@ export const BackupPopup: React.FC<BackupPopupProps> = (props) => {
|
||||
})
|
||||
);
|
||||
}}
|
||||
disabled={isDownloading}
|
||||
/>
|
||||
</td>
|
||||
<td>{task.jobNumber}</td>
|
||||
@ -208,13 +247,25 @@ export const BackupPopup: React.FC<BackupPopupProps> = (props) => {
|
||||
</dd>
|
||||
<dd className={`${styles.full} ${styles.alignCenter}`}>
|
||||
<input
|
||||
type="submit"
|
||||
type="button"
|
||||
name="submit"
|
||||
value={t(
|
||||
getTranslationID("dictationPage.label.downloadForBackup")
|
||||
)}
|
||||
className={`${styles.formSubmit} ${styles.marginBtm1} ${styles.isActive}`}
|
||||
className={`${styles.formSubmit} ${styles.marginBtm1} ${
|
||||
isDownloading || backupTasks.every((x) => !x.checked)
|
||||
? ""
|
||||
: styles.isActive
|
||||
}`}
|
||||
onClick={onBackup}
|
||||
/>
|
||||
{isDownloading && (
|
||||
<img
|
||||
src={progress_activit}
|
||||
className={styles.icLoading}
|
||||
alt="Loading"
|
||||
/>
|
||||
)}
|
||||
</dd>
|
||||
</dl>
|
||||
</form>
|
||||
|
||||
@ -32,7 +32,6 @@ import {
|
||||
playbackAsync,
|
||||
cancelAsync,
|
||||
} from "features/dictation";
|
||||
import { selectUserName } from "features/login/index";
|
||||
import { getTranslationID } from "translation";
|
||||
import { Task } from "api/api";
|
||||
import { isAdminUser, isAuthorUser, isTypistUser } from "features/auth";
|
||||
@ -75,9 +74,6 @@ const DictationPage: React.FC = (): JSX.Element => {
|
||||
[dispatch, setIsChangeTranscriptionistPopupOpen]
|
||||
);
|
||||
|
||||
// ログイン中のユーザ名
|
||||
const myName = useSelector(selectUserName);
|
||||
|
||||
// 各カラムの表示/非表示
|
||||
const displayColumn = useSelector(selectDisplayInfo);
|
||||
|
||||
|
||||
@ -248,7 +248,15 @@ export const LicenseSummary: React.FC<LicenseSummaryProps> = (
|
||||
<dt>
|
||||
{t(getTranslationID("LicenseSummaryPage.label.shortage"))}
|
||||
</dt>
|
||||
<dd>{licenseSummaryInfo.shortage}</dd>
|
||||
<dd>
|
||||
<span
|
||||
className={
|
||||
licenseSummaryInfo.shortage > 0 ? styles.isAlert : ""
|
||||
}
|
||||
>
|
||||
{licenseSummaryInfo.shortage}
|
||||
</span>
|
||||
</dd>
|
||||
<dt>
|
||||
{t(
|
||||
getTranslationID("LicenseSummaryPage.label.storageSize")
|
||||
|
||||
@ -385,9 +385,18 @@ const PartnerLicense: React.FC = (): JSX.Element => {
|
||||
</td>
|
||||
<td>{ownPartnerLicenseInfo.issuedRequested}</td>
|
||||
<td>
|
||||
{ownPartnerLicenseInfo.tier !== 1
|
||||
? ownPartnerLicenseInfo.shortage
|
||||
: "-"}
|
||||
<span
|
||||
className={
|
||||
ownPartnerLicenseInfo.shortage > 0 &&
|
||||
ownPartnerLicenseInfo.tier !== 1
|
||||
? styles.isAlert
|
||||
: ""
|
||||
}
|
||||
>
|
||||
{ownPartnerLicenseInfo.tier !== 1
|
||||
? ownPartnerLicenseInfo.shortage
|
||||
: "-"}
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
{ownPartnerLicenseInfo.tier !== 1
|
||||
|
||||
@ -901,6 +901,9 @@ h3 + .brCrumb .tlIcon {
|
||||
text-align: right;
|
||||
word-break: break-all;
|
||||
}
|
||||
.listVertical dd .isAlert {
|
||||
color: #ff5a33;
|
||||
}
|
||||
.listDocument {
|
||||
margin-bottom: 3rem;
|
||||
}
|
||||
|
||||
@ -49,6 +49,7 @@ declare const classNames: {
|
||||
readonly formTrash: "formTrash";
|
||||
readonly listVertical: "listVertical";
|
||||
readonly listHeader: "listHeader";
|
||||
readonly isAlert: "isAlert";
|
||||
readonly listDocument: "listDocument";
|
||||
readonly boxFlex: "boxFlex";
|
||||
readonly aru: "aru";
|
||||
@ -84,7 +85,6 @@ declare const classNames: {
|
||||
readonly widthSml: "widthSml";
|
||||
readonly widthMin: "widthMin";
|
||||
readonly snackbar: "snackbar";
|
||||
readonly isAlert: "isAlert";
|
||||
readonly snackbarMessage: "snackbarMessage";
|
||||
readonly snackbarIcon: "snackbarIcon";
|
||||
readonly snackbarIconClose: "snackbarIconClose";
|
||||
|
||||
29
dictation_function/package-lock.json
generated
29
dictation_function/package-lock.json
generated
@ -13,11 +13,13 @@
|
||||
"@sendgrid/mail": "^7.7.0",
|
||||
"dotenv": "^16.0.3",
|
||||
"mysql2": "^2.3.3",
|
||||
"redis": "^3.1.2",
|
||||
"typeorm": "^0.3.10"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/jest": "^27.5.0",
|
||||
"@types/node": "18.x",
|
||||
"@types/redis": "^2.8.13",
|
||||
"azure-functions-core-tools": "^4.x",
|
||||
"jest": "^28.0.3",
|
||||
"rimraf": "^5.0.0",
|
||||
@ -1989,6 +1991,15 @@
|
||||
"integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/@types/redis": {
|
||||
"version": "2.8.32",
|
||||
"resolved": "https://registry.npmjs.org/@types/redis/-/redis-2.8.32.tgz",
|
||||
"integrity": "sha512-7jkMKxcGq9p242exlbsVzuJb57KqHRhNl4dHoQu2Y5v9bCAbtIXXH0R3HleSQW4CTOqpHIYUW3t6tpUj4BVQ+w==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@types/node": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/stack-utils": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.2.tgz",
|
||||
@ -5252,9 +5263,9 @@
|
||||
"integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
|
||||
},
|
||||
"node_modules/lru-cache": {
|
||||
"version": "10.0.1",
|
||||
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz",
|
||||
"integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==",
|
||||
"version": "10.1.0",
|
||||
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz",
|
||||
"integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": "14 || >=16.14"
|
||||
@ -6371,8 +6382,6 @@
|
||||
"version": "3.1.2",
|
||||
"resolved": "https://registry.npmjs.org/redis/-/redis-3.1.2.tgz",
|
||||
"integrity": "sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw==",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"denque": "^1.5.0",
|
||||
"redis-commands": "^1.7.0",
|
||||
@ -6390,16 +6399,12 @@
|
||||
"node_modules/redis-commands": {
|
||||
"version": "1.7.0",
|
||||
"resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz",
|
||||
"integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==",
|
||||
"optional": true,
|
||||
"peer": true
|
||||
"integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ=="
|
||||
},
|
||||
"node_modules/redis-errors": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz",
|
||||
"integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=4"
|
||||
}
|
||||
@ -6408,8 +6413,6 @@
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz",
|
||||
"integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"redis-errors": "^1.0.0"
|
||||
},
|
||||
@ -6421,8 +6424,6 @@
|
||||
"version": "1.5.1",
|
||||
"resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz",
|
||||
"integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=0.10"
|
||||
}
|
||||
|
||||
@ -18,11 +18,13 @@
|
||||
"@sendgrid/mail": "^7.7.0",
|
||||
"dotenv": "^16.0.3",
|
||||
"mysql2": "^2.3.3",
|
||||
"redis": "^3.1.2",
|
||||
"typeorm": "^0.3.10"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/jest": "^27.5.0",
|
||||
"@types/node": "18.x",
|
||||
"@types/redis": "^2.8.13",
|
||||
"azure-functions-core-tools": "^4.x",
|
||||
"jest": "^28.0.3",
|
||||
"rimraf": "^5.0.0",
|
||||
|
||||
@ -1,74 +0,0 @@
|
||||
import { ClientSecretCredential } from "@azure/identity";
|
||||
import { Client } from "@microsoft/microsoft-graph-client";
|
||||
import { TokenCredentialAuthenticationProvider } from "@microsoft/microsoft-graph-client/authProviders/azureTokenCredentials";
|
||||
import { AdB2cResponse, AdB2cUser } from "./types/types";
|
||||
import { error } from "console";
|
||||
|
||||
export class Adb2cTooManyRequestsError extends Error {}
|
||||
|
||||
export class AdB2cService {
|
||||
private graphClient: Client;
|
||||
|
||||
constructor() {
|
||||
// ADB2Cへの認証情報
|
||||
if (
|
||||
!process.env.ADB2C_TENANT_ID ||
|
||||
!process.env.ADB2C_CLIENT_ID ||
|
||||
!process.env.ADB2C_CLIENT_SECRET
|
||||
) {
|
||||
throw error;
|
||||
}
|
||||
const credential = new ClientSecretCredential(
|
||||
process.env.ADB2C_TENANT_ID,
|
||||
process.env.ADB2C_CLIENT_ID,
|
||||
process.env.ADB2C_CLIENT_SECRET
|
||||
);
|
||||
const authProvider = new TokenCredentialAuthenticationProvider(credential, {
|
||||
scopes: ["https://graph.microsoft.com/.default"],
|
||||
});
|
||||
|
||||
this.graphClient = Client.initWithMiddleware({ authProvider });
|
||||
}
|
||||
|
||||
/**
|
||||
* Azure AD B2Cからユーザ情報を取得する
|
||||
* @param externalIds 外部ユーザーID
|
||||
* @returns ユーザ情報
|
||||
*/
|
||||
async getUsers(externalIds: string[]): Promise<AdB2cUser[]> {
|
||||
const chunkExternalIds = splitArrayInChunksOfFifteen(externalIds);
|
||||
|
||||
try {
|
||||
const b2cUsers: AdB2cUser[] = [];
|
||||
for (let index = 0; index < chunkExternalIds.length; index++) {
|
||||
const element = chunkExternalIds[index];
|
||||
const res: AdB2cResponse = await this.graphClient
|
||||
.api(`users/`)
|
||||
.select(["id", "displayName", "identities"])
|
||||
.filter(`id in (${element.map((y) => `'${y}'`).join(",")})`)
|
||||
.get();
|
||||
|
||||
b2cUsers.push(...res.value);
|
||||
}
|
||||
|
||||
return b2cUsers;
|
||||
} catch (e) {
|
||||
const { statusCode } = e;
|
||||
if (statusCode === 429) {
|
||||
throw new Adb2cTooManyRequestsError();
|
||||
}
|
||||
|
||||
throw e;
|
||||
} finally {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const splitArrayInChunksOfFifteen = (arr: string[]): string[][] => {
|
||||
const result: string[][] = [];
|
||||
const chunkSize = 15; // SDKの制限数
|
||||
for (let i = 0; i < arr.length; i += chunkSize) {
|
||||
result.push(arr.slice(i, i + chunkSize));
|
||||
}
|
||||
return result;
|
||||
};
|
||||
147
dictation_function/src/adb2c/adb2c.ts
Normal file
147
dictation_function/src/adb2c/adb2c.ts
Normal file
@ -0,0 +1,147 @@
|
||||
import { ClientSecretCredential } from "@azure/identity";
|
||||
import { Client } from "@microsoft/microsoft-graph-client";
|
||||
import { TokenCredentialAuthenticationProvider } from "@microsoft/microsoft-graph-client/authProviders/azureTokenCredentials";
|
||||
import { AdB2cResponse, AdB2cUser } from "./types/types";
|
||||
import { error } from "console";
|
||||
import { makeADB2CKey, restoreAdB2cID } from "../common/cache";
|
||||
import { promisify } from "util";
|
||||
import { createRedisClient } from "../redis/redis";
|
||||
import { InvocationContext } from "@azure/functions";
|
||||
|
||||
export class Adb2cTooManyRequestsError extends Error {}
|
||||
|
||||
export class AdB2cService {
|
||||
private graphClient: Client;
|
||||
|
||||
constructor() {
|
||||
// ADB2Cへの認証情報
|
||||
if (
|
||||
!process.env.ADB2C_TENANT_ID ||
|
||||
!process.env.ADB2C_CLIENT_ID ||
|
||||
!process.env.ADB2C_CLIENT_SECRET ||
|
||||
!process.env.ADB2C_CACHE_TTL
|
||||
) {
|
||||
throw error;
|
||||
}
|
||||
const credential = new ClientSecretCredential(
|
||||
process.env.ADB2C_TENANT_ID,
|
||||
process.env.ADB2C_CLIENT_ID,
|
||||
process.env.ADB2C_CLIENT_SECRET
|
||||
);
|
||||
const authProvider = new TokenCredentialAuthenticationProvider(credential, {
|
||||
scopes: ["https://graph.microsoft.com/.default"],
|
||||
});
|
||||
|
||||
this.graphClient = Client.initWithMiddleware({ authProvider });
|
||||
}
|
||||
|
||||
/**
|
||||
* Azure AD B2Cからユーザ情報を取得する
|
||||
* @param externalIds 外部ユーザーID
|
||||
* @returns ユーザ情報
|
||||
*/
|
||||
async getUsers(
|
||||
context: InvocationContext,
|
||||
externalIds: string[]
|
||||
): Promise<AdB2cUser[] | undefined> {
|
||||
const redisClient = createRedisClient();
|
||||
try {
|
||||
const b2cUsers: AdB2cUser[] = [];
|
||||
const keys = externalIds.map((externalId) => makeADB2CKey(externalId));
|
||||
|
||||
// 取得対象が0件だとmgetがエラーとなるので、1件以上のときに処理
|
||||
if (keys.length !== 0) {
|
||||
// redisからキャッシュされているユーザーを取得
|
||||
let cacheUserObjects: {
|
||||
key: string;
|
||||
value: AdB2cUser;
|
||||
}[] = [];
|
||||
const mgetAsync = promisify(redisClient.mget).bind(redisClient);
|
||||
try {
|
||||
const values = await mgetAsync(...keys);
|
||||
cacheUserObjects = values.map((value, index) => ({
|
||||
key: keys[index],
|
||||
value: value ? JSON.parse(value) : null,
|
||||
}));
|
||||
context.log("mget Result:", cacheUserObjects);
|
||||
} catch (error) {
|
||||
context.error("mget Error:", error);
|
||||
}
|
||||
|
||||
// キャッシュ上に存在していれば、キャッシュから取得する
|
||||
const cachedUsers = cacheUserObjects.flatMap((x) =>
|
||||
x.value ? [x.value] : []
|
||||
);
|
||||
if (cachedUsers.length > 0) {
|
||||
context.log(
|
||||
`[CACHE HIT] ids: ${cachedUsers.map((x) => x.id).join(",")}`
|
||||
);
|
||||
}
|
||||
|
||||
// キャッシュ上に存在していなければ、ADB2Cから取得する
|
||||
const queryExternalIds = cacheUserObjects
|
||||
.filter((x) => x.value === null)
|
||||
.map((x) => restoreAdB2cID(x.key));
|
||||
const chunkExternalIds = splitArrayInChunksOfFifteen(queryExternalIds);
|
||||
|
||||
for (let index = 0; index < chunkExternalIds.length; index++) {
|
||||
const element = chunkExternalIds[index];
|
||||
const res: AdB2cResponse = await this.graphClient
|
||||
.api(`users/`)
|
||||
.select(["id", "displayName", "identities"])
|
||||
.filter(`id in (${element.map((y) => `'${y}'`).join(",")})`)
|
||||
.get();
|
||||
|
||||
b2cUsers.push(...res.value);
|
||||
|
||||
// 取得したユーザーをキャッシュに保存する
|
||||
const users = res.value.map((user) => {
|
||||
const key = makeADB2CKey(user.id);
|
||||
return {
|
||||
key: key,
|
||||
value: user,
|
||||
};
|
||||
});
|
||||
try {
|
||||
const setexAsync = promisify(redisClient.setex).bind(redisClient);
|
||||
const ttl = process.env.ADB2C_CACHE_TTL;
|
||||
users.map(async (x) => {
|
||||
await setexAsync(x.key, ttl, JSON.stringify(x.value));
|
||||
context.log(
|
||||
"setex Result:",
|
||||
`key:${x.key},ttl:${ttl},value:${JSON.stringify(x.value)}`
|
||||
);
|
||||
});
|
||||
} catch (error) {
|
||||
context.error("setex Error:", error);
|
||||
}
|
||||
|
||||
context.log(
|
||||
`[ADB2C GET] externalIds: ${res.value?.map((x) => x.id).join(",")}`
|
||||
);
|
||||
}
|
||||
|
||||
return [...cachedUsers, ...b2cUsers];
|
||||
} else {
|
||||
return undefined;
|
||||
}
|
||||
} catch (e) {
|
||||
const { statusCode } = e;
|
||||
if (statusCode === 429) {
|
||||
throw new Adb2cTooManyRequestsError();
|
||||
}
|
||||
throw e;
|
||||
} finally {
|
||||
redisClient.quit;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const splitArrayInChunksOfFifteen = (arr: string[]): string[][] => {
|
||||
const result: string[][] = [];
|
||||
const chunkSize = 15; // SDKの制限数
|
||||
for (let i = 0; i < arr.length; i += chunkSize) {
|
||||
result.push(arr.slice(i, i + chunkSize));
|
||||
}
|
||||
return result;
|
||||
};
|
||||
@ -16,8 +16,8 @@ import {
|
||||
} from "../common/types/types";
|
||||
import { createMailContentOfLicenseShortage } from "../sendgrid/mailContents/U103ShortageAlert";
|
||||
import { createMailContentOfLicenseExpiringSoon } from "../sendgrid/mailContents/U104ExpiringSoonAlert";
|
||||
import { AdB2cService } from "../adb2c/adb2c.service";
|
||||
import { SendGridService } from "../sendgrid/sendgrid.service";
|
||||
import { AdB2cService } from "../adb2c/adb2c";
|
||||
import { SendGridService } from "../sendgrid/sendgrid";
|
||||
import { getMailFrom } from "../common/getEnv/getEnv";
|
||||
|
||||
export async function licenseAlertProcessing(
|
||||
@ -156,8 +156,12 @@ export async function licenseAlertProcessing(
|
||||
externalIds.push(x.secondaryAdminExternalId);
|
||||
}
|
||||
});
|
||||
const adb2cUsers = await adb2c.getUsers(externalIds);
|
||||
|
||||
const adb2cUsers = await adb2c.getUsers(context, externalIds);
|
||||
if (!adb2cUsers) {
|
||||
context.log("Target user not found");
|
||||
context.log("[OUT]licenseAlertProcessing");
|
||||
return;
|
||||
}
|
||||
// ADB2Cから取得したメールアドレスをRDBから取得した情報にマージ
|
||||
sendTargetAccounts.map((info) => {
|
||||
const primaryAdminUser = adb2cUsers.find(
|
||||
|
||||
29
dictation_function/src/functions/redisTimerTest.ts
Normal file
29
dictation_function/src/functions/redisTimerTest.ts
Normal file
@ -0,0 +1,29 @@
|
||||
import { app, InvocationContext, Timer } from "@azure/functions";
|
||||
import * as dotenv from "dotenv";
|
||||
import { promisify } from "util";
|
||||
import { createRedisClient } from "../redis/redis";
|
||||
|
||||
export async function redisTimerTest(
|
||||
myTimer: Timer,
|
||||
context: InvocationContext
|
||||
): Promise<void> {
|
||||
context.log("---Timer function processed request.");
|
||||
|
||||
dotenv.config({ path: ".env" });
|
||||
dotenv.config({ path: ".env.local", override: true });
|
||||
|
||||
const redisClient = createRedisClient();
|
||||
const setAsync = promisify(redisClient.set).bind(redisClient);
|
||||
const getAsync = promisify(redisClient.get).bind(redisClient);
|
||||
|
||||
await setAsync("foo", "bar");
|
||||
const value = await getAsync("foo");
|
||||
context.log(`value=${value}`); // returns 'bar'
|
||||
|
||||
await redisClient.quit;
|
||||
}
|
||||
|
||||
app.timer("redisTimerTest", {
|
||||
schedule: "*/30 * * * * *",
|
||||
handler: redisTimerTest,
|
||||
});
|
||||
35
dictation_function/src/redis/redis.ts
Normal file
35
dictation_function/src/redis/redis.ts
Normal file
@ -0,0 +1,35 @@
|
||||
import { createClient, RedisClient } from "redis";
|
||||
import { error } from "console";
|
||||
|
||||
export const createRedisClient = (): RedisClient => {
|
||||
if (
|
||||
!process.env.REDIS_HOST ||
|
||||
!process.env.REDIS_PORT ||
|
||||
!process.env.REDIS_PASSWORD
|
||||
) {
|
||||
throw error("Required environment variables are not set.");
|
||||
}
|
||||
|
||||
const host = process.env.REDIS_HOST;
|
||||
const port = parseInt(process.env.REDIS_PORT, 10);
|
||||
const password = process.env.REDIS_PASSWORD;
|
||||
|
||||
let client: RedisClient;
|
||||
if (process.env.STAGE === "local") {
|
||||
client = createClient({
|
||||
host: host,
|
||||
port: port,
|
||||
password: password,
|
||||
});
|
||||
} else {
|
||||
client = createClient({
|
||||
url: `rediss://${host}:${port}`,
|
||||
password: password,
|
||||
tls: {},
|
||||
});
|
||||
}
|
||||
|
||||
client.on("error", (err) => console.log("Redis Client Error", err));
|
||||
|
||||
return client;
|
||||
};
|
||||
@ -10,8 +10,8 @@ import {
|
||||
} from "../common/types/types";
|
||||
import { AdB2cUser } from "../adb2c/types/types";
|
||||
import { ADB2C_SIGN_IN_TYPE } from "../constants";
|
||||
import { SendGridService } from "../sendgrid/sendgrid.service";
|
||||
import { AdB2cService } from "../adb2c/adb2c.service";
|
||||
import { SendGridService } from "../sendgrid/sendgrid";
|
||||
import { AdB2cService } from "../adb2c/adb2c";
|
||||
import { InvocationContext } from "@azure/functions";
|
||||
|
||||
describe("licenseAlert", () => {
|
||||
@ -209,7 +209,10 @@ export class AdB2cServiceMock {
|
||||
* @param externalIds 外部ユーザーID
|
||||
* @returns ユーザ情報
|
||||
*/
|
||||
async getUsers(externalIds: string[]): Promise<AdB2cUser[]> {
|
||||
async getUsers(
|
||||
context: InvocationContext,
|
||||
externalIds: string[]
|
||||
): Promise<AdB2cUser[]> {
|
||||
const AdB2cMockUsers: AdB2cUser[] = [
|
||||
{
|
||||
id: "external_id1",
|
||||
|
||||
@ -139,6 +139,12 @@ export const LICENSE_EXPIRATION_THRESHOLD_DAYS = 14;
|
||||
*/
|
||||
export const LICENSE_EXPIRATION_DAYS = 365;
|
||||
|
||||
/**
|
||||
* タイムゾーンを加味したライセンスの有効期間(8時間)
|
||||
* @const {number}
|
||||
*/
|
||||
export const LICENSE_EXPIRATION_TIME_WITH_TIMEZONE = 8;
|
||||
|
||||
/**
|
||||
* カードライセンスの桁数
|
||||
* @const {number}
|
||||
|
||||
@ -152,6 +152,10 @@ export class AccountsService {
|
||||
makeErrorResponse('E009999'),
|
||||
HttpStatus.INTERNAL_SERVER_ERROR,
|
||||
);
|
||||
} finally {
|
||||
this.logger.log(
|
||||
`[OUT] [${context.getTrackingId()}] ${this.getLicenseSummary.name}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
/**
|
||||
@ -179,7 +183,7 @@ export class AccountsService {
|
||||
} | params: { ` +
|
||||
`dealerAccountId: ${dealerAccountId}, ` +
|
||||
`role: ${role}, ` +
|
||||
`acceptedEulaVersion: ${acceptedEulaVersion} }, ` +
|
||||
`acceptedEulaVersion: ${acceptedEulaVersion}, ` +
|
||||
`acceptedDpaVersion: ${acceptedDpaVersion} };`,
|
||||
);
|
||||
try {
|
||||
@ -333,6 +337,11 @@ export class AccountsService {
|
||||
externalUserId: string,
|
||||
context: Context,
|
||||
): Promise<void> {
|
||||
this.logger.log(
|
||||
`[IN] [${context.getTrackingId()}] ${
|
||||
this.createAccount.name
|
||||
} | params: { ` + `externalUserId: ${externalUserId}};`,
|
||||
);
|
||||
try {
|
||||
await this.adB2cService.deleteUser(externalUserId, context);
|
||||
this.logger.log(
|
||||
@ -344,6 +353,10 @@ export class AccountsService {
|
||||
this.logger.error(
|
||||
`${MANUAL_RECOVERY_REQUIRED} [${context.getTrackingId()}] Failed to delete externalUser: ${externalUserId}`,
|
||||
);
|
||||
} finally {
|
||||
this.logger.log(
|
||||
`[OUT] [${context.getTrackingId()}] ${this.deleteAdB2cUser.name}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -368,6 +381,10 @@ export class AccountsService {
|
||||
this.logger.error(
|
||||
`${MANUAL_RECOVERY_REQUIRED} [${context.getTrackingId()}] Failed to delete account: ${accountId}, user: ${userId}`,
|
||||
);
|
||||
} finally {
|
||||
this.logger.log(
|
||||
`[OUT] [${context.getTrackingId()}] ${this.deleteAccount.name}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -396,6 +413,10 @@ export class AccountsService {
|
||||
this.logger.error(
|
||||
`${MANUAL_RECOVERY_REQUIRED} [${context.getTrackingId()}] Failed to delete container: ${accountId}, country: ${country}`,
|
||||
);
|
||||
} finally {
|
||||
this.logger.log(
|
||||
`[OUT] [${context.getTrackingId()}] ${this.deleteBlobContainer.name}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1184,6 +1205,10 @@ export class AccountsService {
|
||||
makeErrorResponse('E009999'),
|
||||
HttpStatus.INTERNAL_SERVER_ERROR,
|
||||
);
|
||||
} finally {
|
||||
this.logger.log(
|
||||
`[OUT] [${context.getTrackingId()}] ${this.createTypistGroup.name}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -119,7 +119,7 @@ export class AuthService {
|
||||
const privateKey = getPrivateKey(this.configService);
|
||||
|
||||
// ユーザーのロールを設定
|
||||
const role = this.getUserRole(user.role);
|
||||
const role = this.getUserRole(context, user.role);
|
||||
|
||||
const token = sign<RefreshToken>(
|
||||
{
|
||||
@ -250,7 +250,7 @@ export class AuthService {
|
||||
const privateKey = getPrivateKey(this.configService);
|
||||
|
||||
// ユーザーのロールを設定
|
||||
const role = this.getUserRole(adminUser.role);
|
||||
const role = this.getUserRole(context, adminUser.role);
|
||||
|
||||
const token = sign<RefreshToken>(
|
||||
{
|
||||
@ -540,6 +540,7 @@ export class AuthService {
|
||||
case jwt.JsonWebTokenError:
|
||||
// メッセージごとにエラーを判定しHTTPエラーを生成
|
||||
throw this.makeHttpErrorFromJsonWebTokenErrorMessage(
|
||||
context,
|
||||
message,
|
||||
issuer,
|
||||
);
|
||||
@ -561,6 +562,9 @@ export class AuthService {
|
||||
}
|
||||
|
||||
getPublicKeyFromJwk(context: Context, jwkKey: JwkSignKey): string {
|
||||
this.logger.log(
|
||||
`[IN] [${context.getTrackingId()}] ${this.getPublicKeyFromJwk.name}`,
|
||||
);
|
||||
try {
|
||||
// JWK形式のJSONなのでJWTの公開鍵として使えるようにPEM形式に変換
|
||||
const publicKey = jwkToPem({
|
||||
@ -584,53 +588,83 @@ export class AuthService {
|
||||
* JWT検証時のError、JsonWebTokenErrorをメッセージごとに仕分けてHTTPエラーを生成
|
||||
*/
|
||||
makeHttpErrorFromJsonWebTokenErrorMessage = (
|
||||
context: Context,
|
||||
message: string,
|
||||
issuer: string,
|
||||
): Error => {
|
||||
// 署名が不正
|
||||
if (message === 'invalid signature') {
|
||||
return new HttpException(
|
||||
makeErrorResponse('E000104'),
|
||||
HttpStatus.UNAUTHORIZED,
|
||||
);
|
||||
}
|
||||
// 想定発行元と異なる
|
||||
if (message === `jwt issuer invalid. expected: ${issuer}`) {
|
||||
return new HttpException(
|
||||
makeErrorResponse('E000105'),
|
||||
HttpStatus.UNAUTHORIZED,
|
||||
);
|
||||
}
|
||||
// アルゴリズムが想定と異なる
|
||||
if (message === 'invalid algorithm') {
|
||||
return new HttpException(
|
||||
makeErrorResponse('E000106'),
|
||||
HttpStatus.UNAUTHORIZED,
|
||||
);
|
||||
}
|
||||
// トークンの形式が不正
|
||||
return new HttpException(
|
||||
makeErrorResponse('E000101'),
|
||||
HttpStatus.UNAUTHORIZED,
|
||||
this.logger.log(
|
||||
`[IN] [${context.getTrackingId()}] ${
|
||||
this.makeHttpErrorFromJsonWebTokenErrorMessage.name
|
||||
}`,
|
||||
);
|
||||
try {
|
||||
// 署名が不正
|
||||
if (message === 'invalid signature') {
|
||||
return new HttpException(
|
||||
makeErrorResponse('E000104'),
|
||||
HttpStatus.UNAUTHORIZED,
|
||||
);
|
||||
}
|
||||
// 想定発行元と異なる
|
||||
if (message === `jwt issuer invalid. expected: ${issuer}`) {
|
||||
return new HttpException(
|
||||
makeErrorResponse('E000105'),
|
||||
HttpStatus.UNAUTHORIZED,
|
||||
);
|
||||
}
|
||||
// アルゴリズムが想定と異なる
|
||||
if (message === 'invalid algorithm') {
|
||||
return new HttpException(
|
||||
makeErrorResponse('E000106'),
|
||||
HttpStatus.UNAUTHORIZED,
|
||||
);
|
||||
}
|
||||
// トークンの形式が不正
|
||||
return new HttpException(
|
||||
makeErrorResponse('E000101'),
|
||||
HttpStatus.UNAUTHORIZED,
|
||||
);
|
||||
} catch (e) {
|
||||
this.logger.error(`[${context.getTrackingId()}] error=${e}`);
|
||||
throw e;
|
||||
} finally {
|
||||
this.logger.log(
|
||||
`[OUT] [${context.getTrackingId()}] ${
|
||||
this.makeHttpErrorFromJsonWebTokenErrorMessage.name
|
||||
}`,
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* トークンに設定するユーザーのロールを取得
|
||||
*/
|
||||
getUserRole = (role: string): string => {
|
||||
// ユーザーのロールを設定
|
||||
// 万一不正なRoleが登録されていた場合、そのままDBの値を使用すると不正なロールのリフレッシュトークンが発行されるため、
|
||||
// ロールの設定値はDBに保存したRoleの値を直接トークンに入れないように定数で設定する
|
||||
// ※none/author/typist以外はロールに設定されない
|
||||
if (role === USER_ROLES.NONE) {
|
||||
return USER_ROLES.NONE;
|
||||
} else if (role === USER_ROLES.AUTHOR) {
|
||||
return USER_ROLES.AUTHOR;
|
||||
} else if (role === USER_ROLES.TYPIST) {
|
||||
return USER_ROLES.TYPIST;
|
||||
} else {
|
||||
throw new RoleUnexpectedError(
|
||||
`Role from DB is unexpected value. role=${role}`,
|
||||
getUserRole = (context: Context, role: string): string => {
|
||||
this.logger.log(
|
||||
`[IN] [${context.getTrackingId()}] ${this.getUserRole.name}`,
|
||||
);
|
||||
try {
|
||||
// ユーザーのロールを設定
|
||||
// 万一不正なRoleが登録されていた場合、そのままDBの値を使用すると不正なロールのリフレッシュトークンが発行されるため、
|
||||
// ロールの設定値はDBに保存したRoleの値を直接トークンに入れないように定数で設定する
|
||||
// ※none/author/typist以外はロールに設定されない
|
||||
if (role === USER_ROLES.NONE) {
|
||||
return USER_ROLES.NONE;
|
||||
} else if (role === USER_ROLES.AUTHOR) {
|
||||
return USER_ROLES.AUTHOR;
|
||||
} else if (role === USER_ROLES.TYPIST) {
|
||||
return USER_ROLES.TYPIST;
|
||||
} else {
|
||||
throw new RoleUnexpectedError(
|
||||
`Role from DB is unexpected value. role=${role}`,
|
||||
);
|
||||
}
|
||||
} catch (e) {
|
||||
this.logger.error(`[${context.getTrackingId()}] error=${e}`);
|
||||
throw e;
|
||||
} finally {
|
||||
this.logger.log(
|
||||
`[OUT] [${context.getTrackingId()}] ${this.getUserRole.name}`,
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
@ -220,7 +220,9 @@ export class FilesController {
|
||||
@ApiBearerAuth()
|
||||
@UseGuards(AuthGuard)
|
||||
@UseGuards(
|
||||
RoleGuard.requireds({ roles: [USER_ROLES.AUTHOR, USER_ROLES.TYPIST] }),
|
||||
RoleGuard.requireds({
|
||||
roles: [ADMIN_ROLES.ADMIN, USER_ROLES.AUTHOR, USER_ROLES.TYPIST],
|
||||
}),
|
||||
)
|
||||
async downloadLocation(
|
||||
@Req() req: Request,
|
||||
|
||||
@ -376,6 +376,7 @@ export class FilesService {
|
||||
let country: string;
|
||||
let isTypist: boolean;
|
||||
let authorId: string | undefined;
|
||||
let isAdmin: boolean;
|
||||
try {
|
||||
const user = await this.usersRepository.findUserByExternalId(externalId);
|
||||
if (!user.account) {
|
||||
@ -399,6 +400,9 @@ export class FilesService {
|
||||
country = user.account.country;
|
||||
isTypist = user.role === USER_ROLES.TYPIST;
|
||||
authorId = user.author_id ?? undefined;
|
||||
isAdmin =
|
||||
user.account.primary_admin_user_id === user.id ||
|
||||
user.account.secondary_admin_user_id === user.id;
|
||||
} catch (e) {
|
||||
this.logger.error(`[${context.getTrackingId()}] error=${e}`);
|
||||
this.logger.log(
|
||||
@ -426,9 +430,11 @@ export class FilesService {
|
||||
}
|
||||
|
||||
try {
|
||||
const status = isTypist
|
||||
? [TASK_STATUS.IN_PROGRESS, TASK_STATUS.PENDING]
|
||||
: Object.values(TASK_STATUS);
|
||||
// ユーザーが管理者でないTypistの場合はステータスがIN_PROGRESSかPENDINGのタスクのみ取得できる
|
||||
const status =
|
||||
!isAdmin && isTypist
|
||||
? [TASK_STATUS.IN_PROGRESS, TASK_STATUS.PENDING]
|
||||
: Object.values(TASK_STATUS);
|
||||
|
||||
const task = await this.tasksRepository.getTaskAndAudioFile(
|
||||
audioFileId,
|
||||
@ -445,18 +451,21 @@ export class FilesService {
|
||||
);
|
||||
}
|
||||
|
||||
// ユーザーがAuthorの場合、自身が追加したタスクでない場合はエラー
|
||||
if (!isTypist && file.author_id !== authorId) {
|
||||
throw new AuthorUserNotMatchError(
|
||||
`task author is not match. audio_file_id:${audioFileId}, task.file.author_id:${file.author_id}, authorId:${authorId}`,
|
||||
);
|
||||
}
|
||||
// ユーザーがAdminの場合は特にチェックしない
|
||||
if (!isAdmin) {
|
||||
// ユーザーがAuthorの場合、自身が追加したタスクでない場合はエラー
|
||||
if (!isTypist && file.author_id !== authorId) {
|
||||
throw new AuthorUserNotMatchError(
|
||||
`task author is not match. audio_file_id:${audioFileId}, task.file.author_id:${file.author_id}, authorId:${authorId}`,
|
||||
);
|
||||
}
|
||||
|
||||
// ユーザーがTypistの場合、自身が担当したタスクでない場合はエラー
|
||||
if (isTypist && task.typist_user_id !== userId) {
|
||||
throw new AuthorUserNotMatchError(
|
||||
`task typist is not match. audio_file_id:${audioFileId}, task.typist_user_id:${task.typist_user_id}, userId:${userId}`,
|
||||
);
|
||||
// ユーザーがTypistの場合、自身が担当したタスクでない場合はエラー
|
||||
if (isTypist && task.typist_user_id !== userId) {
|
||||
throw new AuthorUserNotMatchError(
|
||||
`task typist is not match. audio_file_id:${audioFileId}, task.typist_user_id:${task.typist_user_id}, userId:${userId}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
const filePath = `${file.file_name}`;
|
||||
|
||||
@ -12,7 +12,6 @@ import {
|
||||
import { LicensesRepositoryService } from '../../repositories/licenses/licenses.repository.service';
|
||||
import { UserNotFoundError } from '../../repositories/users/errors/types';
|
||||
import {
|
||||
DateWithZeroTime,
|
||||
GetAllocatableLicensesResponse,
|
||||
IssueCardLicensesResponse,
|
||||
} from './types/types';
|
||||
@ -113,6 +112,10 @@ export class LicensesService {
|
||||
HttpStatus.INTERNAL_SERVER_ERROR,
|
||||
);
|
||||
}
|
||||
} finally {
|
||||
this.logger.log(
|
||||
`[OUT] [${context.getTrackingId()}] ${this.licenseOrders.name}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
async issueCardLicenseKeys(
|
||||
@ -164,6 +167,10 @@ export class LicensesService {
|
||||
makeErrorResponse('E009999'),
|
||||
HttpStatus.INTERNAL_SERVER_ERROR,
|
||||
);
|
||||
} finally {
|
||||
this.logger.log(
|
||||
`[OUT] [${context.getTrackingId()}] ${this.issueCardLicenseKeys.name}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -3,6 +3,7 @@ import { IsInt, Matches, Max, Min, Length } from 'class-validator';
|
||||
import {
|
||||
LICENSE_EXPIRATION_DAYS,
|
||||
LICENSE_EXPIRATION_THRESHOLD_DAYS,
|
||||
LICENSE_EXPIRATION_TIME_WITH_TIMEZONE,
|
||||
TRIAL_LICENSE_EXPIRATION_DAYS,
|
||||
} from '../../../constants';
|
||||
|
||||
@ -96,6 +97,8 @@ export class NewTrialLicenseExpirationDate extends Date {
|
||||
} else {
|
||||
super(...(args as [string])); // 引数がある場合、引数をそのままDateクラスのコンストラクタに渡す
|
||||
}
|
||||
// タイムゾーンをカバーするために現在時刻に8時間を加算してから、30日後の日付を取得する
|
||||
this.setHours(this.getHours() + LICENSE_EXPIRATION_TIME_WITH_TIMEZONE);
|
||||
this.setDate(this.getDate() + TRIAL_LICENSE_EXPIRATION_DAYS);
|
||||
this.setHours(23, 59, 59); // 時分秒を"23:59:59"に固定
|
||||
this.setMilliseconds(0);
|
||||
@ -110,6 +113,8 @@ export class NewAllocatedLicenseExpirationDate extends Date {
|
||||
} else {
|
||||
super(...(args as [string])); // 引数がある場合、引数をそのままDateクラスのコンストラクタに渡す
|
||||
}
|
||||
// タイムゾーンをカバーするために現在時刻に8時間を加算してから、365日後の日付を取得する
|
||||
this.setHours(this.getHours() + LICENSE_EXPIRATION_TIME_WITH_TIMEZONE);
|
||||
this.setDate(this.getDate() + LICENSE_EXPIRATION_DAYS);
|
||||
this.setHours(23, 59, 59); // 時分秒を"23:59:59"に固定
|
||||
this.setMilliseconds(0);
|
||||
|
||||
@ -1,6 +1,5 @@
|
||||
import { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common';
|
||||
import { TasksRepositoryService } from '../../repositories/tasks/tasks.repository.service';
|
||||
import { AccessToken } from '../../common/token';
|
||||
import { Assignee, Task } from './types/types';
|
||||
import { Task as TaskEntity } from '../../repositories/tasks/entity/task.entity';
|
||||
import { createTasks } from './types/convert';
|
||||
@ -625,6 +624,10 @@ export class TasksService {
|
||||
...new Set(assigneesExternalIds.concat(typistExternalIds)),
|
||||
];
|
||||
|
||||
this.logger.log(
|
||||
`[OUT] [${context.getTrackingId()}] ${this.getB2cUsers.name}`,
|
||||
);
|
||||
|
||||
// B2Cからユーザー名を取得する
|
||||
return await this.adB2cService.getUsers(context, distinctedExternalIds);
|
||||
}
|
||||
@ -769,5 +772,8 @@ export class TasksService {
|
||||
priority: file.priority === '00' ? 'Normal' : 'High',
|
||||
uploadedAt: file.uploaded_at.toISOString(),
|
||||
});
|
||||
this.logger.log(
|
||||
`[OUT] [${context.getTrackingId()}] ${this.sendNotify.name}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -117,6 +117,10 @@ export class UsersService {
|
||||
makeErrorResponse('E009999'),
|
||||
HttpStatus.INTERNAL_SERVER_ERROR,
|
||||
);
|
||||
} finally {
|
||||
this.logger.log(
|
||||
`[OUT] [${context.getTrackingId()}] ${this.confirmUser.name}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -313,6 +317,11 @@ export class UsersService {
|
||||
// Azure AD B2Cに登録したユーザー情報を削除する
|
||||
// TODO 「タスク 2452: リトライ処理を入れる箇所を検討し、実装する」の候補
|
||||
private async deleteB2cUser(externalUserId: string, context: Context) {
|
||||
this.logger.log(
|
||||
`[IN] [${context.getTrackingId()}] ${
|
||||
this.deleteB2cUser.name
|
||||
} | params: { externalUserId: ${externalUserId} }`,
|
||||
);
|
||||
try {
|
||||
await this.adB2cService.deleteUser(externalUserId, context);
|
||||
this.logger.log(
|
||||
@ -323,11 +332,20 @@ export class UsersService {
|
||||
this.logger.error(
|
||||
`${MANUAL_RECOVERY_REQUIRED} [${context.getTrackingId()}] Failed to delete externalUser: ${externalUserId}`,
|
||||
);
|
||||
} finally {
|
||||
this.logger.log(
|
||||
`[OUT] [${context.getTrackingId()}] ${this.deleteB2cUser.name}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// DBに登録したユーザー情報を削除する
|
||||
private async deleteUser(userId: number, context: Context) {
|
||||
this.logger.log(
|
||||
`[IN] [${context.getTrackingId()}] ${
|
||||
this.deleteUser.name
|
||||
} | params: { userId: ${userId} }`,
|
||||
);
|
||||
try {
|
||||
await this.usersRepository.deleteNormalUser(userId);
|
||||
this.logger.log(`[${context.getTrackingId()}] delete user: ${userId}`);
|
||||
@ -336,6 +354,10 @@ export class UsersService {
|
||||
this.logger.error(
|
||||
`${MANUAL_RECOVERY_REQUIRED} [${context.getTrackingId()}] Failed to delete user: ${userId}`,
|
||||
);
|
||||
} finally {
|
||||
this.logger.log(
|
||||
`[OUT] [${context.getTrackingId()}] ${this.deleteUser.name}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -368,47 +390,56 @@ export class UsersService {
|
||||
`encryption: ${encryption}, ` +
|
||||
`prompt: ${prompt} };`,
|
||||
);
|
||||
switch (role) {
|
||||
case USER_ROLES.NONE:
|
||||
case USER_ROLES.TYPIST:
|
||||
return {
|
||||
account_id: accountId,
|
||||
external_id: externalId,
|
||||
auto_renew: autoRenew,
|
||||
license_alert: licenseAlert,
|
||||
notification,
|
||||
role,
|
||||
accepted_dpa_version: null,
|
||||
accepted_eula_version: null,
|
||||
encryption: false,
|
||||
encryption_password: null,
|
||||
prompt: false,
|
||||
author_id: null,
|
||||
};
|
||||
case USER_ROLES.AUTHOR:
|
||||
return {
|
||||
account_id: accountId,
|
||||
external_id: externalId,
|
||||
auto_renew: autoRenew,
|
||||
license_alert: licenseAlert,
|
||||
notification,
|
||||
role,
|
||||
author_id: authorId ?? null,
|
||||
encryption: encryption ?? false,
|
||||
encryption_password: encryptionPassword ?? null,
|
||||
prompt: prompt ?? false,
|
||||
accepted_dpa_version: null,
|
||||
accepted_eula_version: null,
|
||||
};
|
||||
default:
|
||||
//不正なroleが指定された場合はログを出力してエラーを返す
|
||||
this.logger.error(
|
||||
`[${context.getTrackingId()}] [NOT IMPLEMENT] [RECOVER] role: ${role}`,
|
||||
);
|
||||
throw new HttpException(
|
||||
makeErrorResponse('E009999'),
|
||||
HttpStatus.INTERNAL_SERVER_ERROR,
|
||||
);
|
||||
try {
|
||||
switch (role) {
|
||||
case USER_ROLES.NONE:
|
||||
case USER_ROLES.TYPIST:
|
||||
return {
|
||||
account_id: accountId,
|
||||
external_id: externalId,
|
||||
auto_renew: autoRenew,
|
||||
license_alert: licenseAlert,
|
||||
notification,
|
||||
role,
|
||||
accepted_dpa_version: null,
|
||||
accepted_eula_version: null,
|
||||
encryption: false,
|
||||
encryption_password: null,
|
||||
prompt: false,
|
||||
author_id: null,
|
||||
};
|
||||
case USER_ROLES.AUTHOR:
|
||||
return {
|
||||
account_id: accountId,
|
||||
external_id: externalId,
|
||||
auto_renew: autoRenew,
|
||||
license_alert: licenseAlert,
|
||||
notification,
|
||||
role,
|
||||
author_id: authorId ?? null,
|
||||
encryption: encryption ?? false,
|
||||
encryption_password: encryptionPassword ?? null,
|
||||
prompt: prompt ?? false,
|
||||
accepted_dpa_version: null,
|
||||
accepted_eula_version: null,
|
||||
};
|
||||
default:
|
||||
//不正なroleが指定された場合はログを出力してエラーを返す
|
||||
this.logger.error(
|
||||
`[${context.getTrackingId()}] [NOT IMPLEMENT] [RECOVER] role: ${role}`,
|
||||
);
|
||||
throw new HttpException(
|
||||
makeErrorResponse('E009999'),
|
||||
HttpStatus.INTERNAL_SERVER_ERROR,
|
||||
);
|
||||
}
|
||||
} catch (e) {
|
||||
this.logger.error(`[${context.getTrackingId()}] error=${e}`);
|
||||
return e;
|
||||
} finally {
|
||||
this.logger.log(
|
||||
`[OUT] [${context.getTrackingId()}] ${this.createNewUserInfo.name}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -486,6 +517,12 @@ export class UsersService {
|
||||
);
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
this.logger.log(
|
||||
`[OUT] [${context.getTrackingId()}] ${
|
||||
this.confirmUserAndInitPassword.name
|
||||
}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -368,6 +368,10 @@ export class BlobstorageService {
|
||||
throw e;
|
||||
}
|
||||
|
||||
// SASの開始時刻より前に実行するとエラーになるため、開始時刻を15分前に設定
|
||||
const startDate = new Date();
|
||||
startDate.setTime(startDate.getTime() - 15 * 60 * 1000);
|
||||
|
||||
//SASの有効期限を設定
|
||||
const expiryDate = new Date();
|
||||
expiryDate.setHours(expiryDate.getHours() + this.sasTokenExpireHour);
|
||||
@ -382,7 +386,7 @@ export class BlobstorageService {
|
||||
containerName: containerClient.containerName,
|
||||
blobName: blobClient.name,
|
||||
permissions: permissions,
|
||||
startsOn: new Date(),
|
||||
startsOn: startDate,
|
||||
expiresOn: expiryDate,
|
||||
},
|
||||
sharedKeyCredential,
|
||||
|
||||
@ -5,12 +5,14 @@ az group export --name dev-database-rg --output json > configurations/azure/dev-
|
||||
az group export --name dev-network-rg --output json > configurations/azure/dev-network-rg.json && ^
|
||||
az group export --name dev-storage-rg --output json > configurations/azure/dev-storage-rg.json && ^
|
||||
az group export --name dev-notification-rg --output json > configurations/azure/dev-notification-rg.json && ^
|
||||
az group export --name dev-monitor-rg --output json > configurations/azure/dev-monitor-rg.json && ^
|
||||
az group export --name stg-azureADB2C-rg --output json > configurations/azure/stg-azureADB2C-rg.json && ^
|
||||
az group export --name stg-application-rg --output json > configurations/azure/stg-application-rg.json && ^
|
||||
az group export --name stg-database-rg --output json > configurations/azure/stg-database-rg.json && ^
|
||||
az group export --name stg-network-rg --output json > configurations/azure/stg-network-rg.json && ^
|
||||
az group export --name stg-storage-rg --output json > configurations/azure/stg-storage-rg.json && ^
|
||||
az group export --name stg-notification-rg --output json > configurations/azure/stg-notification-rg.json && ^
|
||||
az group export --name stg-monitor-rg --output json > configurations/azure/stg-monitor-rg.json && ^
|
||||
az group export --name maintenance-rg --output json > configurations/azure/maintenance-rg.json && ^
|
||||
az group export --name shared-sendGrid-rg --output json > configurations/azure/shared-sendGrid-rg.json && ^
|
||||
az group export --name shared-template-rg --output json > configurations/azure/shared-template-rg.json
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user