サブドメイン構造¶
概要¶
DDDSシステムは、4つのサブドメインで構成され、各サブドメインが異なる役割と権限を持つマルチテナント構成になっています。
サブドメイン一覧¶
1. hdqrs(本部)¶
URL: https://hdqrs.example.com/
ブランチ定数: APP_HEAD
対象ユーザー: - 本部管理者 - アカウント種別: ACC_TYPE_HQ
主要機能: - アクセスログ管理 - アカウント管理(コーディネータ、移植施設) - 調査票管理 - BOX API連携 - EDCシステム連携 - バッチ処理 - システム全体の監視
コントローラ:
application/controllers/headquarter/
├── AccessLog.php # アクセスログ閲覧
├── AccountHistory.php # アカウント履歴
├── CordinatorManage.php # コーディネータ管理
├── TransplantManage.php # 移植施設管理
├── TransplantSurvey.php # 調査票管理
└── cron/ # バッチ処理
特徴: - システム全体の管理権限 - 全施設のデータ閲覧可能 - 外部システム連携のハブ機能
2. brnch(コーディネータ)¶
URL: https://brnch.example.com/
ブランチ定数: APP_CORDINATOR
対象ユーザー: - 現地コーディネータ - アカウント種別: ACC_TYPE_CO
主要機能: - ドナー情報登録 - ドナー情報編集 - ドナーファイルアップロード - ドナーファイルダウンロード - プレビュー機能
コントローラ:
application/controllers/cordinator/
├── DonorList.php # ドナー一覧
├── DonorRegist.php # ドナー登録
├── DonorEdit.php # ドナー編集
├── DonorPreview.php # プレビュー
├── FileUpload.php # ファイルアップロード
└── FileDownload.php # ファイルダウンロード
特徴: - ドナー情報の入力・管理に特化 - 所属地域のデータのみアクセス可能 - シンプルなUI(入力業務重視)
3. ddds(移植施設 - 死体移植中心)¶
URL: https://ddds.example.com/
ブランチ定数: APP_TRANSPLANT
対象ユーザー: - 移植施設ユーザー - アカウント種別: ACC_TYPE_TP - 所属区分: 1(移植施設)、4(学会)
主要機能: - 死体移植管理(cadavericTransplant) - 検索 - 詳細表示 - 新規登録 - CSV/PDFエクスポート - 生体移植管理(livingDonorTransplant) - 検索 - 受者・ドナー情報入力 - CSV/PDFエクスポート - 調査票(reportTransplant) - 検索・出力
コントローラ:
application/controllers/common/
├── Auth.php # 認証
├── CadavericTransplant.php # 死体移植
├── LivingDonorTransplant.php # 生体移植
├── ReportTransplant.php # 調査票
└── Menu.php # メニュー
application/controllers/transplant/
├── Menu.php # メニュー(移植施設用)
└── FacilityItem.php # 施設項目
アクセス制御:
// Auth.php line 136-139
if ($this->branch === APP_TRANSPLANT &&
$this->domain !== 'ddds' &&
in_array($account->institution_kubun, [
INSTITUTION_KUBUN_LIVING_DONOR,
INSTITUTION_KUBUN_MANAGEMENT
])){
// 生体専用施設・学会はdddsからのみアクセス可能
}
特徴: - 死体移植と生体移植の両方を扱う - 自施設のデータのみアクセス可能 - 学会ユーザー(institution_kubun=4)もアクセス可能
4. tracer(移植施設 - 生体移植専用)¶
URL: https://tracer.example.com/
ブランチ定数: APP_TRANSLIVE
ドメイン定数: TR_2FA_DOMAIN
対象ユーザー: - 移植施設ユーザー(生体移植) - アカウント種別: ACC_TYPE_TP - 所属区分: 3(生体移植専用施設)
主要機能: - 生体移植管理(livingDonorTransplant) - 検索 - 受者・ドナー情報入力 - CSV/PDFエクスポート - 調査票(reportTransplant) - 検索・出力
コントローラ:
application/controllers/common/
├── Auth.php # 認証(2FA対応)
├── LivingDonorTransplant.php # 生体移植
└── ReportTransplant.php # 調査票
セキュリティ: - 2要素認証(2FA)必須 - Cookieベースのトークン管理 - 生体移植データのみアクセス可能
メンテナンス制御:
特徴: - 生体移植専用のサブドメイン - 2要素認証でセキュリティ強化 - データ移行時のメンテナンス機能実装済み
サブドメイン比較表¶
| 項目 | hdqrs | brnch | ddds | tracer |
|---|---|---|---|---|
| ブランチ | APP_HEAD | APP_CORDINATOR | APP_TRANSPLANT | APP_TRANSLIVE |
| 主要対象 | 本部 | コーディネータ | 移植施設 | 移植施設(生体) |
| アカウント種別 | ACC_TYPE_HQ | ACC_TYPE_CO | ACC_TYPE_TP | ACC_TYPE_TP |
| 所属区分 | - | - | 1, 4 | 3 |
| 2FA | なし | なし | なし | あり |
| 死体移植 | 閲覧のみ | ✗ | ✓ | ✗ |
| 生体移植 | 閲覧のみ | ✗ | ✓ | ✓ |
| ドナー登録 | ✗ | ✓ | ✗ | ✗ |
| 管理機能 | ✓ | ✗ | ✗ | ✗ |
| BOX連携 | ✓ | ✗ | ✗ | ✗ |
| メンテナンスモード | - | - | 生体機能のみ | 全体 |
サブドメイン判定ロジック¶
設定ファイル¶
application/config/MY_Config.php:
class MY_Config extends CI_Config
{
public function __construct()
{
parent::__construct();
// サーバー名からブランチ判定
$serverName = $_SERVER['SERVER_NAME'] ?? '';
if (strpos($serverName, 'hdqrs') === 0) {
$this->config['branch'] = APP_HEAD;
} elseif (strpos($serverName, 'brnch') === 0) {
$this->config['branch'] = APP_CORDINATOR;
} elseif (strpos($serverName, 'ddds') === 0) {
$this->config['branch'] = APP_TRANSPLANT;
} elseif (strpos($serverName, 'tracer') === 0) {
$this->config['branch'] = APP_TRANSLIVE;
} else {
$this->config['branch'] = APP_TRANSPLANT; // デフォルト
}
}
}
ルーティング¶
application/config/routes.php:
$branch = config_item('branch');
switch ($branch) {
case APP_HEAD:
$route['default_controller'] = 'headquarter/menu';
break;
case APP_CORDINATOR:
$route['default_controller'] = 'cordinator/donorList';
break;
case APP_TRANSPLANT:
case APP_TRANSLIVE:
$route['default_controller'] = 'transplant/menu';
break;
}
フック処理¶
application/config/hooks.php:
$branch = config_item('branch');
switch ($branch) {
case APP_HEAD:
$hook['post_controller_constructor'][] = [
'class' => 'Headquarter_MyClasses',
'function' => 'loginCheck',
'filename' => 'Headquarter_MyClasses.php',
'filepath' => 'hooks'
];
break;
case APP_CORDINATOR:
$hook['post_controller_constructor'][] = [
'class' => 'Cordinator_MyClasses',
'function' => 'loginCheck',
'filename' => 'Cordinator_MyClasses.php',
'filepath' => 'hooks'
];
break;
// ... 以下同様
}
データアクセス制御¶
施設別データ制御¶
各サブドメインは、ログインユーザーの所属施設に基づいてデータアクセスを制御します。
例: 移植施設の検索:
// application/models/TIshokuKihonLiv.php
public function search($conditions, $account) {
$this->db->where('SISETU_CD', $account->SISETU_CD);
// 自施設のデータのみ検索
}
例: 本部の検索:
// application/controllers/headquarter/AccessLog.php
public function index() {
// 全施設のデータを検索可能
$logs = $this->AccessLogTbl->getAll();
}