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"
|
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "[resourceId('Microsoft.Network/networkSecurityGroups/securityRules', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), 'AllowDeveloperInboundYumoto')]",
|
"id": "[resourceId('Microsoft.Network/networkSecurityGroups/securityRules', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'), 'AllowYumotoHTTPSInbound')]",
|
||||||
"name": "AllowDeveloperInboundYumoto",
|
"name": "AllowYumotoHTTPSInbound",
|
||||||
"properties": {
|
"properties": {
|
||||||
"access": "Allow",
|
"access": "Allow",
|
||||||
"description": "開発チーム NDS 湯本の動作確認用",
|
"description": "NDS湯本 開発用アクセス用許可",
|
||||||
"destinationAddressPrefix": "*",
|
"destinationAddressPrefix": "*",
|
||||||
"destinationAddressPrefixes": [],
|
"destinationAddressPrefixes": [],
|
||||||
"destinationPortRange": "443",
|
"destinationPortRange": "443",
|
||||||
"destinationPortRanges": [],
|
"destinationPortRanges": [],
|
||||||
"direction": "Inbound",
|
"direction": "Inbound",
|
||||||
"priority": 101,
|
"priority": 120,
|
||||||
"protocol": "TCP",
|
"protocol": "TCP",
|
||||||
"sourceAddressPrefix": "180.39.76.100",
|
"sourceAddressPrefix": "180.39.76.100",
|
||||||
"sourceAddressPrefixes": [],
|
"sourceAddressPrefixes": [],
|
||||||
@ -1657,6 +1657,143 @@
|
|||||||
"sourcePortRanges": []
|
"sourcePortRanges": []
|
||||||
},
|
},
|
||||||
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
|
"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": [
|
"dependsOn": [
|
||||||
"[resourceId('Microsoft.Network/networkSecurityGroups', parameters('networkSecurityGroups_nsg_odms_gateway_dev_name'))]"
|
"[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": {
|
"properties": {
|
||||||
"access": "Allow",
|
"access": "Allow",
|
||||||
"description": "開発チーム NDS 湯本の動作確認用",
|
"description": "福永の動作確認用",
|
||||||
"destinationAddressPrefix": "*",
|
"destinationAddressPrefix": "*",
|
||||||
"destinationAddressPrefixes": [],
|
"destinationAddressPrefixes": [],
|
||||||
"destinationPortRange": "443",
|
"destinationPortRange": "443",
|
||||||
"destinationPortRanges": [],
|
"destinationPortRanges": [],
|
||||||
"direction": "Inbound",
|
"direction": "Inbound",
|
||||||
"priority": 101,
|
"priority": 124,
|
||||||
"protocol": "TCP",
|
"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": [],
|
"sourceAddressPrefixes": [],
|
||||||
"sourcePortRange": "*",
|
"sourcePortRange": "*",
|
||||||
"sourcePortRanges": []
|
"sourcePortRanges": []
|
||||||
@ -2005,6 +2277,29 @@
|
|||||||
},
|
},
|
||||||
"type": "Microsoft.Network/networkSecurityGroups/securityRules"
|
"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",
|
"apiVersion": "2023-05-01",
|
||||||
"dependsOn": [
|
"dependsOn": [
|
||||||
@ -11040,6 +11335,13 @@
|
|||||||
"*"
|
"*"
|
||||||
],
|
],
|
||||||
"service": "Microsoft.KeyVault"
|
"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')), '/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": [],
|
"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')), '/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": [],
|
"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"
|
"service": "Microsoft.KeyVault"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"locations": [
|
||||||
|
"japaneast",
|
||||||
|
"japanwest"
|
||||||
|
],
|
||||||
|
"service": "Microsoft.Storage"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|||||||
@ -13,6 +13,7 @@
|
|||||||
"name": "[parameters('namespaces_ntfns_odms_dev_name')]",
|
"name": "[parameters('namespaces_ntfns_odms_dev_name')]",
|
||||||
"properties": {
|
"properties": {
|
||||||
"namespaceType": "NotificationHub",
|
"namespaceType": "NotificationHub",
|
||||||
|
"networkAcls": {},
|
||||||
"provisioningState": "Succeeded",
|
"provisioningState": "Succeeded",
|
||||||
"publicNetworkAccess": "Enabled",
|
"publicNetworkAccess": "Enabled",
|
||||||
"status": "Created"
|
"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",
|
"matchVariable": "RequestArgNames",
|
||||||
"selector": "idToken",
|
"selector": "idToken",
|
||||||
"selectorMatchOperator": "Equals"
|
"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": [
|
"managedRuleSets": [
|
||||||
@ -936,7 +973,7 @@
|
|||||||
"direction": "Inbound",
|
"direction": "Inbound",
|
||||||
"priority": 902,
|
"priority": 902,
|
||||||
"protocol": "TCP",
|
"protocol": "TCP",
|
||||||
"sourceAddressPrefix": "125.193.161.194/32",
|
"sourceAddressPrefix": "126.227.61.88",
|
||||||
"sourceAddressPrefixes": [],
|
"sourceAddressPrefixes": [],
|
||||||
"sourcePortRange": "*",
|
"sourcePortRange": "*",
|
||||||
"sourcePortRanges": []
|
"sourcePortRanges": []
|
||||||
@ -1197,6 +1234,7 @@
|
|||||||
"name": "AllowMyIpAddressCustom8080Inbound.saito",
|
"name": "AllowMyIpAddressCustom8080Inbound.saito",
|
||||||
"properties": {
|
"properties": {
|
||||||
"access": "Allow",
|
"access": "Allow",
|
||||||
|
"description": "saitoƒeƒXƒg",
|
||||||
"destinationAddressPrefix": "*",
|
"destinationAddressPrefix": "*",
|
||||||
"destinationAddressPrefixes": [],
|
"destinationAddressPrefixes": [],
|
||||||
"destinationPortRange": "443",
|
"destinationPortRange": "443",
|
||||||
@ -1204,7 +1242,7 @@
|
|||||||
"direction": "Inbound",
|
"direction": "Inbound",
|
||||||
"priority": 999,
|
"priority": 999,
|
||||||
"protocol": "*",
|
"protocol": "*",
|
||||||
"sourceAddressPrefix": "220.215.171.117",
|
"sourceAddressPrefix": "220.215.194.33",
|
||||||
"sourceAddressPrefixes": [],
|
"sourceAddressPrefixes": [],
|
||||||
"sourcePortRange": "*",
|
"sourcePortRange": "*",
|
||||||
"sourcePortRanges": []
|
"sourcePortRanges": []
|
||||||
@ -1608,7 +1646,7 @@
|
|||||||
"direction": "Inbound",
|
"direction": "Inbound",
|
||||||
"priority": 902,
|
"priority": 902,
|
||||||
"protocol": "TCP",
|
"protocol": "TCP",
|
||||||
"sourceAddressPrefix": "125.193.161.194/32",
|
"sourceAddressPrefix": "126.227.61.88",
|
||||||
"sourceAddressPrefixes": [],
|
"sourceAddressPrefixes": [],
|
||||||
"sourcePortRange": "*",
|
"sourcePortRange": "*",
|
||||||
"sourcePortRanges": []
|
"sourcePortRanges": []
|
||||||
@ -2220,6 +2258,7 @@
|
|||||||
"name": "[concat(parameters('networkSecurityGroups_nsg_odms_gateway_stg_name'), '/AllowMyIpAddressCustom8080Inbound.saito')]",
|
"name": "[concat(parameters('networkSecurityGroups_nsg_odms_gateway_stg_name'), '/AllowMyIpAddressCustom8080Inbound.saito')]",
|
||||||
"properties": {
|
"properties": {
|
||||||
"access": "Allow",
|
"access": "Allow",
|
||||||
|
"description": "saitoƒeƒXƒg",
|
||||||
"destinationAddressPrefix": "*",
|
"destinationAddressPrefix": "*",
|
||||||
"destinationAddressPrefixes": [],
|
"destinationAddressPrefixes": [],
|
||||||
"destinationPortRange": "443",
|
"destinationPortRange": "443",
|
||||||
@ -2227,7 +2266,7 @@
|
|||||||
"direction": "Inbound",
|
"direction": "Inbound",
|
||||||
"priority": 999,
|
"priority": 999,
|
||||||
"protocol": "*",
|
"protocol": "*",
|
||||||
"sourceAddressPrefix": "220.215.171.117",
|
"sourceAddressPrefix": "220.215.194.33",
|
||||||
"sourceAddressPrefixes": [],
|
"sourceAddressPrefixes": [],
|
||||||
"sourcePortRange": "*",
|
"sourcePortRange": "*",
|
||||||
"sourcePortRanges": []
|
"sourcePortRanges": []
|
||||||
|
|||||||
@ -13,6 +13,7 @@
|
|||||||
"name": "[parameters('namespaces_ntfns_odms_stg_name')]",
|
"name": "[parameters('namespaces_ntfns_odms_stg_name')]",
|
||||||
"properties": {
|
"properties": {
|
||||||
"namespaceType": "NotificationHub",
|
"namespaceType": "NotificationHub",
|
||||||
|
"networkAcls": {},
|
||||||
"provisioningState": "Succeeded",
|
"provisioningState": "Succeeded",
|
||||||
"publicNetworkAccess": "Enabled",
|
"publicNetworkAccess": "Enabled",
|
||||||
"status": "Created"
|
"status": "Created"
|
||||||
|
|||||||
@ -204,6 +204,22 @@
|
|||||||
"*"
|
"*"
|
||||||
],
|
],
|
||||||
"maxAgeInSeconds": 28800
|
"maxAgeInSeconds": 28800
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allowedHeaders": [
|
||||||
|
"*"
|
||||||
|
],
|
||||||
|
"allowedMethods": [
|
||||||
|
"GET",
|
||||||
|
"OPTIONS"
|
||||||
|
],
|
||||||
|
"allowedOrigins": [
|
||||||
|
"https://20.210.206.188"
|
||||||
|
],
|
||||||
|
"exposedHeaders": [
|
||||||
|
"*"
|
||||||
|
],
|
||||||
|
"maxAgeInSeconds": 2880
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@ -269,6 +285,22 @@
|
|||||||
"*"
|
"*"
|
||||||
],
|
],
|
||||||
"maxAgeInSeconds": 28800
|
"maxAgeInSeconds": 28800
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allowedHeaders": [
|
||||||
|
"*"
|
||||||
|
],
|
||||||
|
"allowedMethods": [
|
||||||
|
"GET",
|
||||||
|
"OPTIONS"
|
||||||
|
],
|
||||||
|
"allowedOrigins": [
|
||||||
|
"https://20.210.206.188"
|
||||||
|
],
|
||||||
|
"exposedHeaders": [
|
||||||
|
"*"
|
||||||
|
],
|
||||||
|
"maxAgeInSeconds": 2880
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@ -334,6 +366,22 @@
|
|||||||
"*"
|
"*"
|
||||||
],
|
],
|
||||||
"maxAgeInSeconds": 28800
|
"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"
|
"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",
|
"apiVersion": "2023-01-01",
|
||||||
"dependsOn": [
|
"dependsOn": [
|
||||||
@ -2185,6 +2352,176 @@
|
|||||||
},
|
},
|
||||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
"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",
|
"apiVersion": "2023-01-01",
|
||||||
"dependsOn": [
|
"dependsOn": [
|
||||||
@ -2202,6 +2539,601 @@
|
|||||||
},
|
},
|
||||||
"type": "Microsoft.Storage/storageAccounts/blobServices/containers"
|
"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",
|
"apiVersion": "2023-01-01",
|
||||||
"dependsOn": [
|
"dependsOn": [
|
||||||
|
|||||||
@ -2,9 +2,13 @@
|
|||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<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" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>Vite App</title>
|
<title>ODMS Cloud</title>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<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 { Assignee, Task } from "api/api";
|
||||||
import { DictationState } from "./state";
|
import { DictationState } from "./state";
|
||||||
import {
|
import {
|
||||||
|
backupTasksAsync,
|
||||||
getSortColumnAsync,
|
getSortColumnAsync,
|
||||||
listBackupPopupTasksAsync,
|
listBackupPopupTasksAsync,
|
||||||
listTasksAsync,
|
listTasksAsync,
|
||||||
@ -46,6 +47,7 @@ const initialState: DictationState = {
|
|||||||
},
|
},
|
||||||
isLoading: true,
|
isLoading: true,
|
||||||
isBackupListLoading: false,
|
isBackupListLoading: false,
|
||||||
|
isDownloading: false,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -203,6 +205,15 @@ export const dictationSlice = createSlice({
|
|||||||
builder.addCase(listBackupPopupTasksAsync.rejected, (state) => {
|
builder.addCase(listBackupPopupTasksAsync.rejected, (state) => {
|
||||||
state.apps.isBackupListLoading = false;
|
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 { getTranslationID } from "translation";
|
||||||
import { openSnackbar } from "features/ui/uiSlice";
|
import { openSnackbar } from "features/ui/uiSlice";
|
||||||
import { getAccessToken } from "features/auth";
|
import { getAccessToken } from "features/auth";
|
||||||
|
import { BlobClient } from "@azure/storage-blob";
|
||||||
import {
|
import {
|
||||||
TasksResponse,
|
TasksResponse,
|
||||||
TasksApi,
|
TasksApi,
|
||||||
@ -11,6 +12,7 @@ import {
|
|||||||
GetTypistsResponse,
|
GetTypistsResponse,
|
||||||
GetTypistGroupsResponse,
|
GetTypistGroupsResponse,
|
||||||
Assignee,
|
Assignee,
|
||||||
|
FilesApi,
|
||||||
} from "../../api/api";
|
} from "../../api/api";
|
||||||
import { Configuration } from "../../api/configuration";
|
import { Configuration } from "../../api/configuration";
|
||||||
import { ErrorObject, createErrorObject } from "../../common/errors";
|
import { ErrorObject, createErrorObject } from "../../common/errors";
|
||||||
@ -22,6 +24,7 @@ import {
|
|||||||
SORTABLE_COLUMN,
|
SORTABLE_COLUMN,
|
||||||
SortableColumnType,
|
SortableColumnType,
|
||||||
} from "./constants";
|
} from "./constants";
|
||||||
|
import { BackupTask } from "./types";
|
||||||
|
|
||||||
export const listTasksAsync = createAsyncThunk<
|
export const listTasksAsync = createAsyncThunk<
|
||||||
TasksResponse,
|
TasksResponse,
|
||||||
@ -455,7 +458,7 @@ export const listBackupPopupTasksAsync = createAsyncThunk<
|
|||||||
BACKUP_POPUP_LIST_SIZE,
|
BACKUP_POPUP_LIST_SIZE,
|
||||||
offset,
|
offset,
|
||||||
BACKUP_POPUP_LIST_STATUS.join(","), // ステータスはFinished,Backupのみ
|
BACKUP_POPUP_LIST_STATUS.join(","), // ステータスはFinished,Backupのみ
|
||||||
DIRECTION.ASC,
|
DIRECTION.DESC,
|
||||||
SORTABLE_COLUMN.Status,
|
SORTABLE_COLUMN.Status,
|
||||||
{
|
{
|
||||||
headers: { authorization: `Bearer ${accessToken}` },
|
headers: { authorization: `Bearer ${accessToken}` },
|
||||||
@ -476,3 +479,96 @@ export const listBackupPopupTasksAsync = createAsyncThunk<
|
|||||||
return thunkApi.rejectWithValue({ error });
|
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) =>
|
export const selectIsBackupListLoading = (state: RootState) =>
|
||||||
state.dictation.apps.isBackupListLoading;
|
state.dictation.apps.isBackupListLoading;
|
||||||
|
|
||||||
|
export const selectIsDownloading = (state: RootState) =>
|
||||||
|
state.dictation.apps.isDownloading;
|
||||||
|
|||||||
@ -32,6 +32,7 @@ export interface Apps {
|
|||||||
};
|
};
|
||||||
isLoading: boolean;
|
isLoading: boolean;
|
||||||
isBackupListLoading: boolean;
|
isBackupListLoading: boolean;
|
||||||
|
isDownloading: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Backup {
|
export interface Backup {
|
||||||
|
|||||||
@ -3,6 +3,7 @@ import styles from "styles/app.module.scss";
|
|||||||
import { useDispatch, useSelector } from "react-redux";
|
import { useDispatch, useSelector } from "react-redux";
|
||||||
import {
|
import {
|
||||||
BACKUP_POPUP_LIST_SIZE,
|
BACKUP_POPUP_LIST_SIZE,
|
||||||
|
backupTasksAsync,
|
||||||
changeBackupTaskAllCheched,
|
changeBackupTaskAllCheched,
|
||||||
changeBackupTaskChecked,
|
changeBackupTaskChecked,
|
||||||
listBackupPopupTasksAsync,
|
listBackupPopupTasksAsync,
|
||||||
@ -11,6 +12,7 @@ import {
|
|||||||
selectBackupTotal,
|
selectBackupTotal,
|
||||||
selectCurrentBackupPage,
|
selectCurrentBackupPage,
|
||||||
selectIsBackupListLoading,
|
selectIsBackupListLoading,
|
||||||
|
selectIsDownloading,
|
||||||
selectTotalBackupPage,
|
selectTotalBackupPage,
|
||||||
} from "features/dictation";
|
} from "features/dictation";
|
||||||
import { AppDispatch } from "app/store";
|
import { AppDispatch } from "app/store";
|
||||||
@ -30,6 +32,7 @@ export const BackupPopup: React.FC<BackupPopupProps> = (props) => {
|
|||||||
const [t] = useTranslation();
|
const [t] = useTranslation();
|
||||||
|
|
||||||
const isBackupListLoading = useSelector(selectIsBackupListLoading);
|
const isBackupListLoading = useSelector(selectIsBackupListLoading);
|
||||||
|
const isDownloading = useSelector(selectIsDownloading);
|
||||||
|
|
||||||
const backupTasks = useSelector(selectBackupTasks);
|
const backupTasks = useSelector(selectBackupTasks);
|
||||||
|
|
||||||
@ -41,8 +44,11 @@ export const BackupPopup: React.FC<BackupPopupProps> = (props) => {
|
|||||||
|
|
||||||
// ポップアップを閉じる処理
|
// ポップアップを閉じる処理
|
||||||
const closePopup = useCallback(() => {
|
const closePopup = useCallback(() => {
|
||||||
|
if (isDownloading) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
onClose(false);
|
onClose(false);
|
||||||
}, [onClose]);
|
}, [onClose, isDownloading]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (isOpen) {
|
if (isOpen) {
|
||||||
@ -50,6 +56,33 @@ export const BackupPopup: React.FC<BackupPopupProps> = (props) => {
|
|||||||
}
|
}
|
||||||
}, [dispatch, isOpen]);
|
}, [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(() => {
|
const getFirstPage = useCallback(() => {
|
||||||
dispatch(listBackupPopupTasksAsync({ offset: 0 }));
|
dispatch(listBackupPopupTasksAsync({ offset: 0 }));
|
||||||
@ -75,7 +108,11 @@ export const BackupPopup: React.FC<BackupPopupProps> = (props) => {
|
|||||||
<div className={styles.modalBox}>
|
<div className={styles.modalBox}>
|
||||||
<p className={styles.modalTitle}>
|
<p className={styles.modalTitle}>
|
||||||
{t(getTranslationID("dictationPage.label.fileBackup"))}
|
{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" />
|
<img src={close} className={styles.modalTitleIcon} alt="close" />
|
||||||
</button>
|
</button>
|
||||||
</p>
|
</p>
|
||||||
@ -97,6 +134,7 @@ export const BackupPopup: React.FC<BackupPopupProps> = (props) => {
|
|||||||
})
|
})
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
disabled={isDownloading}
|
||||||
/>
|
/>
|
||||||
</th>
|
</th>
|
||||||
<th className={styles.noLine}>
|
<th className={styles.noLine}>
|
||||||
@ -133,6 +171,7 @@ export const BackupPopup: React.FC<BackupPopupProps> = (props) => {
|
|||||||
})
|
})
|
||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
|
disabled={isDownloading}
|
||||||
/>
|
/>
|
||||||
</td>
|
</td>
|
||||||
<td>{task.jobNumber}</td>
|
<td>{task.jobNumber}</td>
|
||||||
@ -208,13 +247,25 @@ export const BackupPopup: React.FC<BackupPopupProps> = (props) => {
|
|||||||
</dd>
|
</dd>
|
||||||
<dd className={`${styles.full} ${styles.alignCenter}`}>
|
<dd className={`${styles.full} ${styles.alignCenter}`}>
|
||||||
<input
|
<input
|
||||||
type="submit"
|
type="button"
|
||||||
name="submit"
|
name="submit"
|
||||||
value={t(
|
value={t(
|
||||||
getTranslationID("dictationPage.label.downloadForBackup")
|
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>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@ -32,7 +32,6 @@ import {
|
|||||||
playbackAsync,
|
playbackAsync,
|
||||||
cancelAsync,
|
cancelAsync,
|
||||||
} from "features/dictation";
|
} from "features/dictation";
|
||||||
import { selectUserName } from "features/login/index";
|
|
||||||
import { getTranslationID } from "translation";
|
import { getTranslationID } from "translation";
|
||||||
import { Task } from "api/api";
|
import { Task } from "api/api";
|
||||||
import { isAdminUser, isAuthorUser, isTypistUser } from "features/auth";
|
import { isAdminUser, isAuthorUser, isTypistUser } from "features/auth";
|
||||||
@ -75,9 +74,6 @@ const DictationPage: React.FC = (): JSX.Element => {
|
|||||||
[dispatch, setIsChangeTranscriptionistPopupOpen]
|
[dispatch, setIsChangeTranscriptionistPopupOpen]
|
||||||
);
|
);
|
||||||
|
|
||||||
// ログイン中のユーザ名
|
|
||||||
const myName = useSelector(selectUserName);
|
|
||||||
|
|
||||||
// 各カラムの表示/非表示
|
// 各カラムの表示/非表示
|
||||||
const displayColumn = useSelector(selectDisplayInfo);
|
const displayColumn = useSelector(selectDisplayInfo);
|
||||||
|
|
||||||
|
|||||||
@ -248,7 +248,15 @@ export const LicenseSummary: React.FC<LicenseSummaryProps> = (
|
|||||||
<dt>
|
<dt>
|
||||||
{t(getTranslationID("LicenseSummaryPage.label.shortage"))}
|
{t(getTranslationID("LicenseSummaryPage.label.shortage"))}
|
||||||
</dt>
|
</dt>
|
||||||
<dd>{licenseSummaryInfo.shortage}</dd>
|
<dd>
|
||||||
|
<span
|
||||||
|
className={
|
||||||
|
licenseSummaryInfo.shortage > 0 ? styles.isAlert : ""
|
||||||
|
}
|
||||||
|
>
|
||||||
|
{licenseSummaryInfo.shortage}
|
||||||
|
</span>
|
||||||
|
</dd>
|
||||||
<dt>
|
<dt>
|
||||||
{t(
|
{t(
|
||||||
getTranslationID("LicenseSummaryPage.label.storageSize")
|
getTranslationID("LicenseSummaryPage.label.storageSize")
|
||||||
|
|||||||
@ -385,9 +385,18 @@ const PartnerLicense: React.FC = (): JSX.Element => {
|
|||||||
</td>
|
</td>
|
||||||
<td>{ownPartnerLicenseInfo.issuedRequested}</td>
|
<td>{ownPartnerLicenseInfo.issuedRequested}</td>
|
||||||
<td>
|
<td>
|
||||||
{ownPartnerLicenseInfo.tier !== 1
|
<span
|
||||||
? ownPartnerLicenseInfo.shortage
|
className={
|
||||||
: "-"}
|
ownPartnerLicenseInfo.shortage > 0 &&
|
||||||
|
ownPartnerLicenseInfo.tier !== 1
|
||||||
|
? styles.isAlert
|
||||||
|
: ""
|
||||||
|
}
|
||||||
|
>
|
||||||
|
{ownPartnerLicenseInfo.tier !== 1
|
||||||
|
? ownPartnerLicenseInfo.shortage
|
||||||
|
: "-"}
|
||||||
|
</span>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
{ownPartnerLicenseInfo.tier !== 1
|
{ownPartnerLicenseInfo.tier !== 1
|
||||||
|
|||||||
@ -901,6 +901,9 @@ h3 + .brCrumb .tlIcon {
|
|||||||
text-align: right;
|
text-align: right;
|
||||||
word-break: break-all;
|
word-break: break-all;
|
||||||
}
|
}
|
||||||
|
.listVertical dd .isAlert {
|
||||||
|
color: #ff5a33;
|
||||||
|
}
|
||||||
.listDocument {
|
.listDocument {
|
||||||
margin-bottom: 3rem;
|
margin-bottom: 3rem;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -49,6 +49,7 @@ declare const classNames: {
|
|||||||
readonly formTrash: "formTrash";
|
readonly formTrash: "formTrash";
|
||||||
readonly listVertical: "listVertical";
|
readonly listVertical: "listVertical";
|
||||||
readonly listHeader: "listHeader";
|
readonly listHeader: "listHeader";
|
||||||
|
readonly isAlert: "isAlert";
|
||||||
readonly listDocument: "listDocument";
|
readonly listDocument: "listDocument";
|
||||||
readonly boxFlex: "boxFlex";
|
readonly boxFlex: "boxFlex";
|
||||||
readonly aru: "aru";
|
readonly aru: "aru";
|
||||||
@ -84,7 +85,6 @@ declare const classNames: {
|
|||||||
readonly widthSml: "widthSml";
|
readonly widthSml: "widthSml";
|
||||||
readonly widthMin: "widthMin";
|
readonly widthMin: "widthMin";
|
||||||
readonly snackbar: "snackbar";
|
readonly snackbar: "snackbar";
|
||||||
readonly isAlert: "isAlert";
|
|
||||||
readonly snackbarMessage: "snackbarMessage";
|
readonly snackbarMessage: "snackbarMessage";
|
||||||
readonly snackbarIcon: "snackbarIcon";
|
readonly snackbarIcon: "snackbarIcon";
|
||||||
readonly snackbarIconClose: "snackbarIconClose";
|
readonly snackbarIconClose: "snackbarIconClose";
|
||||||
|
|||||||
@ -532,4 +532,4 @@
|
|||||||
"button": "(de)Continue"
|
"button": "(de)Continue"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -532,4 +532,4 @@
|
|||||||
"button": "Continue"
|
"button": "Continue"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -532,4 +532,4 @@
|
|||||||
"button": "(es)Continue"
|
"button": "(es)Continue"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -532,4 +532,4 @@
|
|||||||
"button": "(fr)Continue"
|
"button": "(fr)Continue"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
29
dictation_function/package-lock.json
generated
29
dictation_function/package-lock.json
generated
@ -13,11 +13,13 @@
|
|||||||
"@sendgrid/mail": "^7.7.0",
|
"@sendgrid/mail": "^7.7.0",
|
||||||
"dotenv": "^16.0.3",
|
"dotenv": "^16.0.3",
|
||||||
"mysql2": "^2.3.3",
|
"mysql2": "^2.3.3",
|
||||||
|
"redis": "^3.1.2",
|
||||||
"typeorm": "^0.3.10"
|
"typeorm": "^0.3.10"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/jest": "^27.5.0",
|
"@types/jest": "^27.5.0",
|
||||||
"@types/node": "18.x",
|
"@types/node": "18.x",
|
||||||
|
"@types/redis": "^2.8.13",
|
||||||
"azure-functions-core-tools": "^4.x",
|
"azure-functions-core-tools": "^4.x",
|
||||||
"jest": "^28.0.3",
|
"jest": "^28.0.3",
|
||||||
"rimraf": "^5.0.0",
|
"rimraf": "^5.0.0",
|
||||||
@ -1989,6 +1991,15 @@
|
|||||||
"integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==",
|
"integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==",
|
||||||
"dev": true
|
"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": {
|
"node_modules/@types/stack-utils": {
|
||||||
"version": "2.0.2",
|
"version": "2.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.2.tgz",
|
||||||
@ -5252,9 +5263,9 @@
|
|||||||
"integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
|
"integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
|
||||||
},
|
},
|
||||||
"node_modules/lru-cache": {
|
"node_modules/lru-cache": {
|
||||||
"version": "10.0.1",
|
"version": "10.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz",
|
||||||
"integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==",
|
"integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "14 || >=16.14"
|
"node": "14 || >=16.14"
|
||||||
@ -6371,8 +6382,6 @@
|
|||||||
"version": "3.1.2",
|
"version": "3.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/redis/-/redis-3.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/redis/-/redis-3.1.2.tgz",
|
||||||
"integrity": "sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw==",
|
"integrity": "sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw==",
|
||||||
"optional": true,
|
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"denque": "^1.5.0",
|
"denque": "^1.5.0",
|
||||||
"redis-commands": "^1.7.0",
|
"redis-commands": "^1.7.0",
|
||||||
@ -6390,16 +6399,12 @@
|
|||||||
"node_modules/redis-commands": {
|
"node_modules/redis-commands": {
|
||||||
"version": "1.7.0",
|
"version": "1.7.0",
|
||||||
"resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz",
|
"resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz",
|
||||||
"integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==",
|
"integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ=="
|
||||||
"optional": true,
|
|
||||||
"peer": true
|
|
||||||
},
|
},
|
||||||
"node_modules/redis-errors": {
|
"node_modules/redis-errors": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz",
|
||||||
"integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==",
|
"integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==",
|
||||||
"optional": true,
|
|
||||||
"peer": true,
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=4"
|
"node": ">=4"
|
||||||
}
|
}
|
||||||
@ -6408,8 +6413,6 @@
|
|||||||
"version": "3.0.0",
|
"version": "3.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz",
|
||||||
"integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==",
|
"integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==",
|
||||||
"optional": true,
|
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"redis-errors": "^1.0.0"
|
"redis-errors": "^1.0.0"
|
||||||
},
|
},
|
||||||
@ -6421,8 +6424,6 @@
|
|||||||
"version": "1.5.1",
|
"version": "1.5.1",
|
||||||
"resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz",
|
"resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz",
|
||||||
"integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==",
|
"integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==",
|
||||||
"optional": true,
|
|
||||||
"peer": true,
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.10"
|
"node": ">=0.10"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,11 +18,13 @@
|
|||||||
"@sendgrid/mail": "^7.7.0",
|
"@sendgrid/mail": "^7.7.0",
|
||||||
"dotenv": "^16.0.3",
|
"dotenv": "^16.0.3",
|
||||||
"mysql2": "^2.3.3",
|
"mysql2": "^2.3.3",
|
||||||
|
"redis": "^3.1.2",
|
||||||
"typeorm": "^0.3.10"
|
"typeorm": "^0.3.10"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/jest": "^27.5.0",
|
"@types/jest": "^27.5.0",
|
||||||
"@types/node": "18.x",
|
"@types/node": "18.x",
|
||||||
|
"@types/redis": "^2.8.13",
|
||||||
"azure-functions-core-tools": "^4.x",
|
"azure-functions-core-tools": "^4.x",
|
||||||
"jest": "^28.0.3",
|
"jest": "^28.0.3",
|
||||||
"rimraf": "^5.0.0",
|
"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";
|
} from "../common/types/types";
|
||||||
import { createMailContentOfLicenseShortage } from "../sendgrid/mailContents/U103ShortageAlert";
|
import { createMailContentOfLicenseShortage } from "../sendgrid/mailContents/U103ShortageAlert";
|
||||||
import { createMailContentOfLicenseExpiringSoon } from "../sendgrid/mailContents/U104ExpiringSoonAlert";
|
import { createMailContentOfLicenseExpiringSoon } from "../sendgrid/mailContents/U104ExpiringSoonAlert";
|
||||||
import { AdB2cService } from "../adb2c/adb2c.service";
|
import { AdB2cService } from "../adb2c/adb2c";
|
||||||
import { SendGridService } from "../sendgrid/sendgrid.service";
|
import { SendGridService } from "../sendgrid/sendgrid";
|
||||||
import { getMailFrom } from "../common/getEnv/getEnv";
|
import { getMailFrom } from "../common/getEnv/getEnv";
|
||||||
|
|
||||||
export async function licenseAlertProcessing(
|
export async function licenseAlertProcessing(
|
||||||
@ -156,8 +156,12 @@ export async function licenseAlertProcessing(
|
|||||||
externalIds.push(x.secondaryAdminExternalId);
|
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から取得した情報にマージ
|
// ADB2Cから取得したメールアドレスをRDBから取得した情報にマージ
|
||||||
sendTargetAccounts.map((info) => {
|
sendTargetAccounts.map((info) => {
|
||||||
const primaryAdminUser = adb2cUsers.find(
|
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";
|
} from "../common/types/types";
|
||||||
import { AdB2cUser } from "../adb2c/types/types";
|
import { AdB2cUser } from "../adb2c/types/types";
|
||||||
import { ADB2C_SIGN_IN_TYPE } from "../constants";
|
import { ADB2C_SIGN_IN_TYPE } from "../constants";
|
||||||
import { SendGridService } from "../sendgrid/sendgrid.service";
|
import { SendGridService } from "../sendgrid/sendgrid";
|
||||||
import { AdB2cService } from "../adb2c/adb2c.service";
|
import { AdB2cService } from "../adb2c/adb2c";
|
||||||
import { InvocationContext } from "@azure/functions";
|
import { InvocationContext } from "@azure/functions";
|
||||||
|
|
||||||
describe("licenseAlert", () => {
|
describe("licenseAlert", () => {
|
||||||
@ -209,7 +209,10 @@ export class AdB2cServiceMock {
|
|||||||
* @param externalIds 外部ユーザーID
|
* @param externalIds 外部ユーザーID
|
||||||
* @returns ユーザ情報
|
* @returns ユーザ情報
|
||||||
*/
|
*/
|
||||||
async getUsers(externalIds: string[]): Promise<AdB2cUser[]> {
|
async getUsers(
|
||||||
|
context: InvocationContext,
|
||||||
|
externalIds: string[]
|
||||||
|
): Promise<AdB2cUser[]> {
|
||||||
const AdB2cMockUsers: AdB2cUser[] = [
|
const AdB2cMockUsers: AdB2cUser[] = [
|
||||||
{
|
{
|
||||||
id: "external_id1",
|
id: "external_id1",
|
||||||
|
|||||||
@ -139,6 +139,12 @@ export const LICENSE_EXPIRATION_THRESHOLD_DAYS = 14;
|
|||||||
*/
|
*/
|
||||||
export const LICENSE_EXPIRATION_DAYS = 365;
|
export const LICENSE_EXPIRATION_DAYS = 365;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* タイムゾーンを加味したライセンスの有効期間(8時間)
|
||||||
|
* @const {number}
|
||||||
|
*/
|
||||||
|
export const LICENSE_EXPIRATION_TIME_WITH_TIMEZONE = 8;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* カードライセンスの桁数
|
* カードライセンスの桁数
|
||||||
* @const {number}
|
* @const {number}
|
||||||
|
|||||||
@ -152,6 +152,10 @@ export class AccountsService {
|
|||||||
makeErrorResponse('E009999'),
|
makeErrorResponse('E009999'),
|
||||||
HttpStatus.INTERNAL_SERVER_ERROR,
|
HttpStatus.INTERNAL_SERVER_ERROR,
|
||||||
);
|
);
|
||||||
|
} finally {
|
||||||
|
this.logger.log(
|
||||||
|
`[OUT] [${context.getTrackingId()}] ${this.getLicenseSummary.name}`,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
@ -179,7 +183,7 @@ export class AccountsService {
|
|||||||
} | params: { ` +
|
} | params: { ` +
|
||||||
`dealerAccountId: ${dealerAccountId}, ` +
|
`dealerAccountId: ${dealerAccountId}, ` +
|
||||||
`role: ${role}, ` +
|
`role: ${role}, ` +
|
||||||
`acceptedEulaVersion: ${acceptedEulaVersion} }, ` +
|
`acceptedEulaVersion: ${acceptedEulaVersion}, ` +
|
||||||
`acceptedDpaVersion: ${acceptedDpaVersion} };`,
|
`acceptedDpaVersion: ${acceptedDpaVersion} };`,
|
||||||
);
|
);
|
||||||
try {
|
try {
|
||||||
@ -333,6 +337,11 @@ export class AccountsService {
|
|||||||
externalUserId: string,
|
externalUserId: string,
|
||||||
context: Context,
|
context: Context,
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
|
this.logger.log(
|
||||||
|
`[IN] [${context.getTrackingId()}] ${
|
||||||
|
this.createAccount.name
|
||||||
|
} | params: { ` + `externalUserId: ${externalUserId}};`,
|
||||||
|
);
|
||||||
try {
|
try {
|
||||||
await this.adB2cService.deleteUser(externalUserId, context);
|
await this.adB2cService.deleteUser(externalUserId, context);
|
||||||
this.logger.log(
|
this.logger.log(
|
||||||
@ -344,6 +353,10 @@ export class AccountsService {
|
|||||||
this.logger.error(
|
this.logger.error(
|
||||||
`${MANUAL_RECOVERY_REQUIRED} [${context.getTrackingId()}] Failed to delete externalUser: ${externalUserId}`,
|
`${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(
|
this.logger.error(
|
||||||
`${MANUAL_RECOVERY_REQUIRED} [${context.getTrackingId()}] Failed to delete account: ${accountId}, user: ${userId}`,
|
`${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(
|
this.logger.error(
|
||||||
`${MANUAL_RECOVERY_REQUIRED} [${context.getTrackingId()}] Failed to delete container: ${accountId}, country: ${country}`,
|
`${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'),
|
makeErrorResponse('E009999'),
|
||||||
HttpStatus.INTERNAL_SERVER_ERROR,
|
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 privateKey = getPrivateKey(this.configService);
|
||||||
|
|
||||||
// ユーザーのロールを設定
|
// ユーザーのロールを設定
|
||||||
const role = this.getUserRole(user.role);
|
const role = this.getUserRole(context, user.role);
|
||||||
|
|
||||||
const token = sign<RefreshToken>(
|
const token = sign<RefreshToken>(
|
||||||
{
|
{
|
||||||
@ -250,7 +250,7 @@ export class AuthService {
|
|||||||
const privateKey = getPrivateKey(this.configService);
|
const privateKey = getPrivateKey(this.configService);
|
||||||
|
|
||||||
// ユーザーのロールを設定
|
// ユーザーのロールを設定
|
||||||
const role = this.getUserRole(adminUser.role);
|
const role = this.getUserRole(context, adminUser.role);
|
||||||
|
|
||||||
const token = sign<RefreshToken>(
|
const token = sign<RefreshToken>(
|
||||||
{
|
{
|
||||||
@ -540,6 +540,7 @@ export class AuthService {
|
|||||||
case jwt.JsonWebTokenError:
|
case jwt.JsonWebTokenError:
|
||||||
// メッセージごとにエラーを判定しHTTPエラーを生成
|
// メッセージごとにエラーを判定しHTTPエラーを生成
|
||||||
throw this.makeHttpErrorFromJsonWebTokenErrorMessage(
|
throw this.makeHttpErrorFromJsonWebTokenErrorMessage(
|
||||||
|
context,
|
||||||
message,
|
message,
|
||||||
issuer,
|
issuer,
|
||||||
);
|
);
|
||||||
@ -561,6 +562,9 @@ export class AuthService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getPublicKeyFromJwk(context: Context, jwkKey: JwkSignKey): string {
|
getPublicKeyFromJwk(context: Context, jwkKey: JwkSignKey): string {
|
||||||
|
this.logger.log(
|
||||||
|
`[IN] [${context.getTrackingId()}] ${this.getPublicKeyFromJwk.name}`,
|
||||||
|
);
|
||||||
try {
|
try {
|
||||||
// JWK形式のJSONなのでJWTの公開鍵として使えるようにPEM形式に変換
|
// JWK形式のJSONなのでJWTの公開鍵として使えるようにPEM形式に変換
|
||||||
const publicKey = jwkToPem({
|
const publicKey = jwkToPem({
|
||||||
@ -584,53 +588,83 @@ export class AuthService {
|
|||||||
* JWT検証時のError、JsonWebTokenErrorをメッセージごとに仕分けてHTTPエラーを生成
|
* JWT検証時のError、JsonWebTokenErrorをメッセージごとに仕分けてHTTPエラーを生成
|
||||||
*/
|
*/
|
||||||
makeHttpErrorFromJsonWebTokenErrorMessage = (
|
makeHttpErrorFromJsonWebTokenErrorMessage = (
|
||||||
|
context: Context,
|
||||||
message: string,
|
message: string,
|
||||||
issuer: string,
|
issuer: string,
|
||||||
): Error => {
|
): Error => {
|
||||||
// 署名が不正
|
this.logger.log(
|
||||||
if (message === 'invalid signature') {
|
`[IN] [${context.getTrackingId()}] ${
|
||||||
return new HttpException(
|
this.makeHttpErrorFromJsonWebTokenErrorMessage.name
|
||||||
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,
|
|
||||||
);
|
);
|
||||||
|
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 => {
|
getUserRole = (context: Context, role: string): string => {
|
||||||
// ユーザーのロールを設定
|
this.logger.log(
|
||||||
// 万一不正なRoleが登録されていた場合、そのままDBの値を使用すると不正なロールのリフレッシュトークンが発行されるため、
|
`[IN] [${context.getTrackingId()}] ${this.getUserRole.name}`,
|
||||||
// ロールの設定値はDBに保存したRoleの値を直接トークンに入れないように定数で設定する
|
);
|
||||||
// ※none/author/typist以外はロールに設定されない
|
try {
|
||||||
if (role === USER_ROLES.NONE) {
|
// ユーザーのロールを設定
|
||||||
return USER_ROLES.NONE;
|
// 万一不正なRoleが登録されていた場合、そのままDBの値を使用すると不正なロールのリフレッシュトークンが発行されるため、
|
||||||
} else if (role === USER_ROLES.AUTHOR) {
|
// ロールの設定値はDBに保存したRoleの値を直接トークンに入れないように定数で設定する
|
||||||
return USER_ROLES.AUTHOR;
|
// ※none/author/typist以外はロールに設定されない
|
||||||
} else if (role === USER_ROLES.TYPIST) {
|
if (role === USER_ROLES.NONE) {
|
||||||
return USER_ROLES.TYPIST;
|
return USER_ROLES.NONE;
|
||||||
} else {
|
} else if (role === USER_ROLES.AUTHOR) {
|
||||||
throw new RoleUnexpectedError(
|
return USER_ROLES.AUTHOR;
|
||||||
`Role from DB is unexpected value. role=${role}`,
|
} 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()
|
@ApiBearerAuth()
|
||||||
@UseGuards(AuthGuard)
|
@UseGuards(AuthGuard)
|
||||||
@UseGuards(
|
@UseGuards(
|
||||||
RoleGuard.requireds({ roles: [USER_ROLES.AUTHOR, USER_ROLES.TYPIST] }),
|
RoleGuard.requireds({
|
||||||
|
roles: [ADMIN_ROLES.ADMIN, USER_ROLES.AUTHOR, USER_ROLES.TYPIST],
|
||||||
|
}),
|
||||||
)
|
)
|
||||||
async downloadLocation(
|
async downloadLocation(
|
||||||
@Req() req: Request,
|
@Req() req: Request,
|
||||||
|
|||||||
@ -376,6 +376,7 @@ export class FilesService {
|
|||||||
let country: string;
|
let country: string;
|
||||||
let isTypist: boolean;
|
let isTypist: boolean;
|
||||||
let authorId: string | undefined;
|
let authorId: string | undefined;
|
||||||
|
let isAdmin: boolean;
|
||||||
try {
|
try {
|
||||||
const user = await this.usersRepository.findUserByExternalId(externalId);
|
const user = await this.usersRepository.findUserByExternalId(externalId);
|
||||||
if (!user.account) {
|
if (!user.account) {
|
||||||
@ -399,6 +400,9 @@ export class FilesService {
|
|||||||
country = user.account.country;
|
country = user.account.country;
|
||||||
isTypist = user.role === USER_ROLES.TYPIST;
|
isTypist = user.role === USER_ROLES.TYPIST;
|
||||||
authorId = user.author_id ?? undefined;
|
authorId = user.author_id ?? undefined;
|
||||||
|
isAdmin =
|
||||||
|
user.account.primary_admin_user_id === user.id ||
|
||||||
|
user.account.secondary_admin_user_id === user.id;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
this.logger.error(`[${context.getTrackingId()}] error=${e}`);
|
this.logger.error(`[${context.getTrackingId()}] error=${e}`);
|
||||||
this.logger.log(
|
this.logger.log(
|
||||||
@ -426,9 +430,11 @@ export class FilesService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const status = isTypist
|
// ユーザーが管理者でないTypistの場合はステータスがIN_PROGRESSかPENDINGのタスクのみ取得できる
|
||||||
? [TASK_STATUS.IN_PROGRESS, TASK_STATUS.PENDING]
|
const status =
|
||||||
: Object.values(TASK_STATUS);
|
!isAdmin && isTypist
|
||||||
|
? [TASK_STATUS.IN_PROGRESS, TASK_STATUS.PENDING]
|
||||||
|
: Object.values(TASK_STATUS);
|
||||||
|
|
||||||
const task = await this.tasksRepository.getTaskAndAudioFile(
|
const task = await this.tasksRepository.getTaskAndAudioFile(
|
||||||
audioFileId,
|
audioFileId,
|
||||||
@ -445,18 +451,21 @@ export class FilesService {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ユーザーがAuthorの場合、自身が追加したタスクでない場合はエラー
|
// ユーザーがAdminの場合は特にチェックしない
|
||||||
if (!isTypist && file.author_id !== authorId) {
|
if (!isAdmin) {
|
||||||
throw new AuthorUserNotMatchError(
|
// ユーザーがAuthorの場合、自身が追加したタスクでない場合はエラー
|
||||||
`task author is not match. audio_file_id:${audioFileId}, task.file.author_id:${file.author_id}, authorId:${authorId}`,
|
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の場合、自身が担当したタスクでない場合はエラー
|
// ユーザーがTypistの場合、自身が担当したタスクでない場合はエラー
|
||||||
if (isTypist && task.typist_user_id !== userId) {
|
if (isTypist && task.typist_user_id !== userId) {
|
||||||
throw new AuthorUserNotMatchError(
|
throw new AuthorUserNotMatchError(
|
||||||
`task typist is not match. audio_file_id:${audioFileId}, task.typist_user_id:${task.typist_user_id}, userId:${userId}`,
|
`task typist is not match. audio_file_id:${audioFileId}, task.typist_user_id:${task.typist_user_id}, userId:${userId}`,
|
||||||
);
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const filePath = `${file.file_name}`;
|
const filePath = `${file.file_name}`;
|
||||||
|
|||||||
@ -12,7 +12,6 @@ import {
|
|||||||
import { LicensesRepositoryService } from '../../repositories/licenses/licenses.repository.service';
|
import { LicensesRepositoryService } from '../../repositories/licenses/licenses.repository.service';
|
||||||
import { UserNotFoundError } from '../../repositories/users/errors/types';
|
import { UserNotFoundError } from '../../repositories/users/errors/types';
|
||||||
import {
|
import {
|
||||||
DateWithZeroTime,
|
|
||||||
GetAllocatableLicensesResponse,
|
GetAllocatableLicensesResponse,
|
||||||
IssueCardLicensesResponse,
|
IssueCardLicensesResponse,
|
||||||
} from './types/types';
|
} from './types/types';
|
||||||
@ -113,6 +112,10 @@ export class LicensesService {
|
|||||||
HttpStatus.INTERNAL_SERVER_ERROR,
|
HttpStatus.INTERNAL_SERVER_ERROR,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
} finally {
|
||||||
|
this.logger.log(
|
||||||
|
`[OUT] [${context.getTrackingId()}] ${this.licenseOrders.name}`,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
async issueCardLicenseKeys(
|
async issueCardLicenseKeys(
|
||||||
@ -164,6 +167,10 @@ export class LicensesService {
|
|||||||
makeErrorResponse('E009999'),
|
makeErrorResponse('E009999'),
|
||||||
HttpStatus.INTERNAL_SERVER_ERROR,
|
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 {
|
import {
|
||||||
LICENSE_EXPIRATION_DAYS,
|
LICENSE_EXPIRATION_DAYS,
|
||||||
LICENSE_EXPIRATION_THRESHOLD_DAYS,
|
LICENSE_EXPIRATION_THRESHOLD_DAYS,
|
||||||
|
LICENSE_EXPIRATION_TIME_WITH_TIMEZONE,
|
||||||
TRIAL_LICENSE_EXPIRATION_DAYS,
|
TRIAL_LICENSE_EXPIRATION_DAYS,
|
||||||
} from '../../../constants';
|
} from '../../../constants';
|
||||||
|
|
||||||
@ -96,6 +97,8 @@ export class NewTrialLicenseExpirationDate extends Date {
|
|||||||
} else {
|
} else {
|
||||||
super(...(args as [string])); // 引数がある場合、引数をそのままDateクラスのコンストラクタに渡す
|
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.setDate(this.getDate() + TRIAL_LICENSE_EXPIRATION_DAYS);
|
||||||
this.setHours(23, 59, 59); // 時分秒を"23:59:59"に固定
|
this.setHours(23, 59, 59); // 時分秒を"23:59:59"に固定
|
||||||
this.setMilliseconds(0);
|
this.setMilliseconds(0);
|
||||||
@ -110,6 +113,8 @@ export class NewAllocatedLicenseExpirationDate extends Date {
|
|||||||
} else {
|
} else {
|
||||||
super(...(args as [string])); // 引数がある場合、引数をそのままDateクラスのコンストラクタに渡す
|
super(...(args as [string])); // 引数がある場合、引数をそのままDateクラスのコンストラクタに渡す
|
||||||
}
|
}
|
||||||
|
// タイムゾーンをカバーするために現在時刻に8時間を加算してから、365日後の日付を取得する
|
||||||
|
this.setHours(this.getHours() + LICENSE_EXPIRATION_TIME_WITH_TIMEZONE);
|
||||||
this.setDate(this.getDate() + LICENSE_EXPIRATION_DAYS);
|
this.setDate(this.getDate() + LICENSE_EXPIRATION_DAYS);
|
||||||
this.setHours(23, 59, 59); // 時分秒を"23:59:59"に固定
|
this.setHours(23, 59, 59); // 時分秒を"23:59:59"に固定
|
||||||
this.setMilliseconds(0);
|
this.setMilliseconds(0);
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
import { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common';
|
import { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common';
|
||||||
import { TasksRepositoryService } from '../../repositories/tasks/tasks.repository.service';
|
import { TasksRepositoryService } from '../../repositories/tasks/tasks.repository.service';
|
||||||
import { AccessToken } from '../../common/token';
|
|
||||||
import { Assignee, Task } from './types/types';
|
import { Assignee, Task } from './types/types';
|
||||||
import { Task as TaskEntity } from '../../repositories/tasks/entity/task.entity';
|
import { Task as TaskEntity } from '../../repositories/tasks/entity/task.entity';
|
||||||
import { createTasks } from './types/convert';
|
import { createTasks } from './types/convert';
|
||||||
@ -625,6 +624,10 @@ export class TasksService {
|
|||||||
...new Set(assigneesExternalIds.concat(typistExternalIds)),
|
...new Set(assigneesExternalIds.concat(typistExternalIds)),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
this.logger.log(
|
||||||
|
`[OUT] [${context.getTrackingId()}] ${this.getB2cUsers.name}`,
|
||||||
|
);
|
||||||
|
|
||||||
// B2Cからユーザー名を取得する
|
// B2Cからユーザー名を取得する
|
||||||
return await this.adB2cService.getUsers(context, distinctedExternalIds);
|
return await this.adB2cService.getUsers(context, distinctedExternalIds);
|
||||||
}
|
}
|
||||||
@ -769,5 +772,8 @@ export class TasksService {
|
|||||||
priority: file.priority === '00' ? 'Normal' : 'High',
|
priority: file.priority === '00' ? 'Normal' : 'High',
|
||||||
uploadedAt: file.uploaded_at.toISOString(),
|
uploadedAt: file.uploaded_at.toISOString(),
|
||||||
});
|
});
|
||||||
|
this.logger.log(
|
||||||
|
`[OUT] [${context.getTrackingId()}] ${this.sendNotify.name}`,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -117,6 +117,10 @@ export class UsersService {
|
|||||||
makeErrorResponse('E009999'),
|
makeErrorResponse('E009999'),
|
||||||
HttpStatus.INTERNAL_SERVER_ERROR,
|
HttpStatus.INTERNAL_SERVER_ERROR,
|
||||||
);
|
);
|
||||||
|
} finally {
|
||||||
|
this.logger.log(
|
||||||
|
`[OUT] [${context.getTrackingId()}] ${this.confirmUser.name}`,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -313,6 +317,11 @@ export class UsersService {
|
|||||||
// Azure AD B2Cに登録したユーザー情報を削除する
|
// Azure AD B2Cに登録したユーザー情報を削除する
|
||||||
// TODO 「タスク 2452: リトライ処理を入れる箇所を検討し、実装する」の候補
|
// TODO 「タスク 2452: リトライ処理を入れる箇所を検討し、実装する」の候補
|
||||||
private async deleteB2cUser(externalUserId: string, context: Context) {
|
private async deleteB2cUser(externalUserId: string, context: Context) {
|
||||||
|
this.logger.log(
|
||||||
|
`[IN] [${context.getTrackingId()}] ${
|
||||||
|
this.deleteB2cUser.name
|
||||||
|
} | params: { externalUserId: ${externalUserId} }`,
|
||||||
|
);
|
||||||
try {
|
try {
|
||||||
await this.adB2cService.deleteUser(externalUserId, context);
|
await this.adB2cService.deleteUser(externalUserId, context);
|
||||||
this.logger.log(
|
this.logger.log(
|
||||||
@ -323,11 +332,20 @@ export class UsersService {
|
|||||||
this.logger.error(
|
this.logger.error(
|
||||||
`${MANUAL_RECOVERY_REQUIRED} [${context.getTrackingId()}] Failed to delete externalUser: ${externalUserId}`,
|
`${MANUAL_RECOVERY_REQUIRED} [${context.getTrackingId()}] Failed to delete externalUser: ${externalUserId}`,
|
||||||
);
|
);
|
||||||
|
} finally {
|
||||||
|
this.logger.log(
|
||||||
|
`[OUT] [${context.getTrackingId()}] ${this.deleteB2cUser.name}`,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// DBに登録したユーザー情報を削除する
|
// DBに登録したユーザー情報を削除する
|
||||||
private async deleteUser(userId: number, context: Context) {
|
private async deleteUser(userId: number, context: Context) {
|
||||||
|
this.logger.log(
|
||||||
|
`[IN] [${context.getTrackingId()}] ${
|
||||||
|
this.deleteUser.name
|
||||||
|
} | params: { userId: ${userId} }`,
|
||||||
|
);
|
||||||
try {
|
try {
|
||||||
await this.usersRepository.deleteNormalUser(userId);
|
await this.usersRepository.deleteNormalUser(userId);
|
||||||
this.logger.log(`[${context.getTrackingId()}] delete user: ${userId}`);
|
this.logger.log(`[${context.getTrackingId()}] delete user: ${userId}`);
|
||||||
@ -336,6 +354,10 @@ export class UsersService {
|
|||||||
this.logger.error(
|
this.logger.error(
|
||||||
`${MANUAL_RECOVERY_REQUIRED} [${context.getTrackingId()}] Failed to delete user: ${userId}`,
|
`${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}, ` +
|
`encryption: ${encryption}, ` +
|
||||||
`prompt: ${prompt} };`,
|
`prompt: ${prompt} };`,
|
||||||
);
|
);
|
||||||
switch (role) {
|
try {
|
||||||
case USER_ROLES.NONE:
|
switch (role) {
|
||||||
case USER_ROLES.TYPIST:
|
case USER_ROLES.NONE:
|
||||||
return {
|
case USER_ROLES.TYPIST:
|
||||||
account_id: accountId,
|
return {
|
||||||
external_id: externalId,
|
account_id: accountId,
|
||||||
auto_renew: autoRenew,
|
external_id: externalId,
|
||||||
license_alert: licenseAlert,
|
auto_renew: autoRenew,
|
||||||
notification,
|
license_alert: licenseAlert,
|
||||||
role,
|
notification,
|
||||||
accepted_dpa_version: null,
|
role,
|
||||||
accepted_eula_version: null,
|
accepted_dpa_version: null,
|
||||||
encryption: false,
|
accepted_eula_version: null,
|
||||||
encryption_password: null,
|
encryption: false,
|
||||||
prompt: false,
|
encryption_password: null,
|
||||||
author_id: null,
|
prompt: false,
|
||||||
};
|
author_id: null,
|
||||||
case USER_ROLES.AUTHOR:
|
};
|
||||||
return {
|
case USER_ROLES.AUTHOR:
|
||||||
account_id: accountId,
|
return {
|
||||||
external_id: externalId,
|
account_id: accountId,
|
||||||
auto_renew: autoRenew,
|
external_id: externalId,
|
||||||
license_alert: licenseAlert,
|
auto_renew: autoRenew,
|
||||||
notification,
|
license_alert: licenseAlert,
|
||||||
role,
|
notification,
|
||||||
author_id: authorId ?? null,
|
role,
|
||||||
encryption: encryption ?? false,
|
author_id: authorId ?? null,
|
||||||
encryption_password: encryptionPassword ?? null,
|
encryption: encryption ?? false,
|
||||||
prompt: prompt ?? false,
|
encryption_password: encryptionPassword ?? null,
|
||||||
accepted_dpa_version: null,
|
prompt: prompt ?? false,
|
||||||
accepted_eula_version: null,
|
accepted_dpa_version: null,
|
||||||
};
|
accepted_eula_version: null,
|
||||||
default:
|
};
|
||||||
//不正なroleが指定された場合はログを出力してエラーを返す
|
default:
|
||||||
this.logger.error(
|
//不正なroleが指定された場合はログを出力してエラーを返す
|
||||||
`[${context.getTrackingId()}] [NOT IMPLEMENT] [RECOVER] role: ${role}`,
|
this.logger.error(
|
||||||
);
|
`[${context.getTrackingId()}] [NOT IMPLEMENT] [RECOVER] role: ${role}`,
|
||||||
throw new HttpException(
|
);
|
||||||
makeErrorResponse('E009999'),
|
throw new HttpException(
|
||||||
HttpStatus.INTERNAL_SERVER_ERROR,
|
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;
|
throw e;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SASの開始時刻より前に実行するとエラーになるため、開始時刻を15分前に設定
|
||||||
|
const startDate = new Date();
|
||||||
|
startDate.setTime(startDate.getTime() - 15 * 60 * 1000);
|
||||||
|
|
||||||
//SASの有効期限を設定
|
//SASの有効期限を設定
|
||||||
const expiryDate = new Date();
|
const expiryDate = new Date();
|
||||||
expiryDate.setHours(expiryDate.getHours() + this.sasTokenExpireHour);
|
expiryDate.setHours(expiryDate.getHours() + this.sasTokenExpireHour);
|
||||||
@ -382,7 +386,7 @@ export class BlobstorageService {
|
|||||||
containerName: containerClient.containerName,
|
containerName: containerClient.containerName,
|
||||||
blobName: blobClient.name,
|
blobName: blobClient.name,
|
||||||
permissions: permissions,
|
permissions: permissions,
|
||||||
startsOn: new Date(),
|
startsOn: startDate,
|
||||||
expiresOn: expiryDate,
|
expiresOn: expiryDate,
|
||||||
},
|
},
|
||||||
sharedKeyCredential,
|
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-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-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-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-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-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-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-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-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-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 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-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
|
az group export --name shared-template-rg --output json > configurations/azure/shared-template-rg.json
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user