Merged PR 512: ADB2Cユーザが一括で削除できないことに対する対応優先度の数値根拠だし

## 概要
[Task2831: ADB2Cユーザが一括で削除できないことに対する対応優先度の数値根拠だし](https://paruru.nds-tyo.co.jp:8443/tfs/ReciproCollection/fa4924a4-d079-4fab-9fb5-a9a11eb205f0/_workitems/edit/2831)

- 元PBI or タスクへのリンク(内容・目的などはそちらにあるはず)
- 何をどう変更したか、追加したライブラリなど
削除処理の同期化、エラー出力の追加
- このPull Requestでの対象/対象外
- 影響範囲(他の機能にも影響があるか)

## レビューポイント
- 特にレビューしてほしい箇所
- 軽微なものや自明なものは記載不要
- 修正範囲が大きい場合などに記載
- 全体的にや仕様を満たしているか等は本当に必要な時のみ記載

## UIの変更
- Before/Afterのスクショなど
- スクショ置き場

## 動作確認状況
- ユニットテスト

## 補足
- 相談、参考資料などがあれば
This commit is contained in:
masaaki 2023-10-26 09:19:03 +00:00
parent f4347ff5c0
commit f3dde1874d
2 changed files with 38 additions and 6 deletions

View File

@ -6,8 +6,9 @@ import { ConfigService } from '@nestjs/config';
import axios from 'axios';
import { Aadb2cUser, B2cMetadata, JwkSignKey } from '../../common/token';
import { AdB2cResponse, AdB2cUser } from './types/types';
import { isPromiseRejectedResult } from './utils/utils';
import { Context } from '../../common/log';
import { ADB2C_SIGN_IN_TYPE } from '../../constants';
import { ADB2C_SIGN_IN_TYPE, MANUAL_RECOVERY_REQUIRED } from '../../constants';
export type ConflictError = {
reason: 'email';
@ -267,12 +268,33 @@ export class AdB2cService {
);
try {
// 複数ユーザーを一括削除する方法が不明なため、rate limitの懸念があるのを承知のうえ単一削除の繰り返しで実装
// TODO 一括削除する方法が判明したら修正する
// https://learn.microsoft.com/en-us/graph/api/user-delete?view=graph-rest-1.0&tabs=javascript#example
// 複数ユーザーを一括削除する方法がないため、1人ずつで削除を行うrate limitに大きな影響がないこと確認済
const results = await Promise.allSettled(
externalIds.map(
async (x) => await this.graphClient.api(`users/${x}`).delete(),
),
);
// 失敗したプロミスを抽出
const failedPromises = results.filter(
(result) => result.status === 'rejected',
);
// 失敗したプロミスのエラーをログに記録
failedPromises.forEach((result, index) => {
const failedId = externalIds[index];
if (isPromiseRejectedResult(result)) {
const error = result.reason.toString();
this.logger.error(
`${MANUAL_RECOVERY_REQUIRED}[${context.trackingId}] Failed to delete user ${failedId}: ${error}`,
);
} else {
this.logger.error(
`${MANUAL_RECOVERY_REQUIRED}[${context.trackingId}] Failed to delete user ${failedId}`,
);
}
});
} catch (e) {
this.logger.error(`error=${e}`);
throw e;

View File

@ -0,0 +1,10 @@
export const isPromiseRejectedResult = (
data: unknown,
): data is PromiseRejectedResult => {
return (
data !== null &&
typeof data === 'object' &&
'status' in data &&
'reason' in data
);
};