## 概要 [Task3569: データ削除ツール作成+動作確認](https://paruru.nds-tyo.co.jp:8443/tfs/ReciproCollection/fa4924a4-d079-4fab-9fb5-a9a11eb205f0/_workitems/edit/3569) - データ削除ツールを実装しました。 - Blobストレージからのコンテナ削除 - ADB2Cからのユーザー削除 - DBの全削除 - Auto Incrementの設定 ## レビューポイント - Blobストレージの削除対象の取得に問題はないでしょうか? - 3つのリージョン内のすべてのコンテナを取得してから、取得したコンテナを全削除するようにしています。 - ADB2Cの削除対象の取得に問題はないでしょうか? - ローカルアカウントなユーザーのみを取得してから、取得したユーザーを全削除するようにしています。 - フォルダ構成に違和感はないでしょうか? ## UIの変更 - [Task3569](https://ndstokyo.sharepoint.com/:f:/r/sites/Piranha/Shared%20Documents/General/OMDS/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88/Task3569?csf=1&web=1&e=wU1st1) ## 動作確認状況 - ローカルで確認 - DB操作のみ確認しています。Azureリソースの削除についてはdevelop環境で改めて実施します。
58 lines
2.5 KiB
TypeScript
58 lines
2.5 KiB
TypeScript
import { ValueTransformer } from 'typeorm';
|
|
|
|
// DBのbigint型をnumber型に変換するためのtransformer
|
|
// DBのBigInt型をそのまま扱うと、JSのNumber型の最大値を超えると誤差が発生するため、本来はNumber型に変換すべきではないが、
|
|
// 影響範囲を最小限に抑えるため、Number型に変換する。使用するのはAutoIncrementされるIDのみの想定のため、
|
|
// Number.MAX_SAFE_INTEGERより大きい値は現実的には発生しない想定で変換する。
|
|
export const bigintTransformer: ValueTransformer = {
|
|
from: (value: any): number | null => {
|
|
// valueがnullであればそのまま返す
|
|
if (value === null) {
|
|
return value;
|
|
}
|
|
// valueがnumber型かどうかを判定
|
|
// 利用DBによってはbigint型であってもnumber型で返ってくる場合があるため、number型の場合はそのまま返す(sqliteの場合)
|
|
if (typeof value === 'number') {
|
|
return value;
|
|
}
|
|
// valueが文字列かどうかを判定
|
|
if (typeof value !== 'string') {
|
|
throw new Error(`${value} is not string.`);
|
|
}
|
|
// 数値に変換可能な文字列かどうかを判定
|
|
if (Number.isNaN(parseInt(value))) {
|
|
throw new Error(`${value} is not int.`);
|
|
}
|
|
|
|
// 文字列ならbigintに変換
|
|
// valueが整数でない場合は値が丸められてしまうが、TypeORMのEntityの定義上、整数を表す文字列以外はありえないため、少数点は考慮しない
|
|
const bigIntValue = BigInt(value);
|
|
// bigIntValueがNumber.MAX_SAFE_INTEGERより大きいかどうかを判定
|
|
if (bigIntValue > Number.MAX_SAFE_INTEGER) {
|
|
throw new Error(`${value} is greater than ${Number.MAX_SAFE_INTEGER}.`);
|
|
}
|
|
// number型で表現できる整数であればnumber型に変換して返す
|
|
return Number(bigIntValue);
|
|
},
|
|
to: (value: any): string | null | undefined => {
|
|
// valueがnullまたはundefinedであればそのまま返す
|
|
if (value === null || value === undefined) {
|
|
return value;
|
|
}
|
|
// valueがnumber型かどうかを判定
|
|
if (typeof value !== 'number') {
|
|
throw new Error(`${value} is not number.`);
|
|
}
|
|
|
|
// valueがNumber.MAX_SAFE_INTEGERより大きいかどうかを判定
|
|
if (value > Number.MAX_SAFE_INTEGER) {
|
|
throw new Error(`value is greater than ${Number.MAX_SAFE_INTEGER}.`);
|
|
}
|
|
// valueが整数かどうかを判定
|
|
if (!Number.isInteger(value)) {
|
|
throw new Error(`${value} is not integer.`);
|
|
}
|
|
return value.toString();
|
|
},
|
|
};
|