# 医療アプリのバックエンドとデータベース

> 医療アプリのバックエンドとそのデータベースが処理する必要があるもの、Anpheros がマネージドヘルスケアデータベースとして提供する部分、バックエンドに残るもの、接続する 3 つの方法、および Webhook で同期を維持する方法について説明します。

Source: https://developers.anpheros.com/ja/guides/medical-app-backend

**医療アプリのバックエンドとは、ヘルスケアアプリケーションのサーバーサイドのことです。患者データを保存し、誰がそれを見るかを強制し、変更履歴を保持し、ラボ、クリニック、その他のサービスと通信します。** Anpheros を使用すると、そのバックエンドの医療関連部分、つまり各患者の記録、その履歴、同意、出所、監査、ラボインポート、およびイベントを保持するヘルスケアデータベースは、プラットフォームによって API 経由で提供されます。お客様自身のバックエンドは、製品固有のもののみを保持します。

## 医療バックエンドが処理する必要があること

| 責任 | 医療分野で難しい理由 | Anpheros では |
|---|---|---|
| 医療データモデル | 数十種類のデータがあり、それぞれに標準コードがある | HL7 FHIR R4、26 のリソースタイプ、LOINC / ICD-10 / ATC / UCUM |
| バージョン管理 | 医療データは修正されるもので、サイレントに上書きされることはない | すべての更新は新しいバージョン。条件付き更新には `If-Match` |
| ドキュメント | 元のドキュメントは変更されず、追跡可能でなければならない | 不変のオリジナル（SHA-256）、顧客管理キーで暗号化された EU ストレージ |
| アクセス制御 | 患者ごと、アプリケーションごと、データタイプごとに | プロジェクト分離、ペアワイズ ID、カテゴリフィルタ付き OAuth スコープ |
| 同意 | 患者が決定し、気が変わる可能性がある | 30〜365 日間の付与、取り消し可能、FHIR `Consent` としてミラーリング |
| 監査 | 患者や規制当局が誰が何を見たか尋ねる | すべての読み書きがログに記録され、患者に表示される |
| プロベナンス | 検査室からの値は、患者が入力した値ではない | すべての書き込みに、作成者タイプ、組織、実務家、ソースシステム |
| 統合 | 検査室は CSV、HL7 v2、JSON を送信し、アプリはイベントを必要とする | 検査室インポート、FHIR トランザクション、署名付き Webhook |
| 安全なリトライ | 重複した投薬や結果は臨床上のエラーとなる | すべての作成時に `Idempotency-Key` |
| テストデータ | 本物の患者を開発に含めることは決してできない | 合成患者を含むサンドボックスデータベース |

## バックエンドに残るもの

- **ユーザーとアカウント**、および各ユーザーと Anpheros 患者 ID（プロジェクトが認識するペアワイズ ID）のマッピング。
- **製品データ**（医療情報以外）：設定、サブスクリプション、コンテンツ、リマインダーのスケジュール。
- **ビジネスルール**：どのスタッフが製品内でどの患者を見ることができるか。
- **API キー**：モバイルアプリやウェブアプリ内に絶対に含めてはならないもの。

## 接続方法 3 つ

**1. バックエンドで API キーを管理する（最も一般的）。** アプリがバックエンドを呼び出し、バックエンドが `sk_live_` キーを使用して Anpheros を呼び出し、プロジェクトで作成された患者を表示します。

```ts
import { Anpheros, apiKey } from '@anpheros/sdk';
const anpheros = new Anpheros({ auth: apiKey(process.env.ANPHEROS_KEY!) });

// GET /api/me/vitals in your backend, after your own authentication
export async function myVitals(user: { anpherosPatientId: string }) {
  const page = await anpheros.observations.list(user.anpherosPatientId, { category: 'vital-signs', limit: 50 });
  return page.data;
}
```

**2. アプリが OAuth を使用して患者の代理として動作する。** すでに Anpheros レコードを持つユーザーの場合、モバイルアプリまたは Web アプリは PKCE を使用した *公開* OAuth クライアントとなります。ユーザーはホストされたページで同意し、アプリは 30 分間有効なアクセストークンと、その 1 つのレコードに対するローテーション可能なリフレッシュトークンを受け取ります。SDK はこのフローを実装します（`OAuthFlow`）。

**3. サーバー間連携パートナー。** 機密クライアント（サーバーに保存されたシークレットを持つ）は、認可コードフロー、またはプロジェクトに対する API キーのように動作する `client_credentials` を使用できます。

## バックエンドの同期を維持する

ポーリングの代わりにWebhookを購読してください。配信は署名済み（`Anpheros-Signature`、タイムスタンプとボディに対するHMAC-SHA256）、少なくとも1回、そして順不同の可能性があります。イベントIDで重複排除し、古いバージョンは無視してください。

```ts
import { verifyWebhookSignature } from '@anpheros/sdk';

app.post('/anpheros/hook', express.raw({ type: 'application/json' }), async (req, res) => {
  const ok = await verifyWebhookSignature({ secret: process.env.ANPHEROS_WEBHOOK_SECRET!, header: req.header('anpheros-signature'), body: req.body });
  if (!ok) return res.status(400).end();
  const event = JSON.parse(req.body.toString());   // ids and versions only — read the resource if you need it
  res.status(204).end();
});
```

## エラーと制限の処理

- `404` は、レコードが存在しないことの証明ではなく、「あなたには見えない」ものとして扱ってください。
- `403` は、認証情報は存在するが、この操作はできない可能性があることを意味します — スコープが欠落しているか、他の組織によってリソースが書き込まれた場合などです。
- `429` は `Retry-After` と共に発生します。SDK は、`5xx` の場合と同様に、自動的に待機して再試行します。
- サポートのために、失敗した呼び出しの `Anpheros-Request-Id` を保持してください。

[エラー](https://developers.anpheros.com/ja/guides/errors) · [制限とレート制限](https://developers.anpheros.com/ja/guides/limits)

## よくある質問

### 医療アプリにはどのデータベースを使用すべきですか？
医療データを標準化され、バージョン管理された形式で保持し、患者ごとにアクセスを制御できるデータベースを使用してください。Anpheros は HL7 FHIR R4 上に構築されたマネージドヘルスケアデータベースです。各患者のレコードはバージョン管理され、検索可能であり、すべての書き込みには来歴が付随し、アプリケーションはレコードを作成したか、患者が同意した場合にのみ患者を表示できます。製品のその他のデータ（アカウント、請求、コンテンツ）は、独自のデータベースに保存してください。独自のテーブルを設計する場合のトレードオフについては、[FHIR vs. カスタム医療データベース](https://developers.anpheros.com/ja/guides/fhir-vs-custom-database) を参照してください。

### 医療アプリ向けの無料データベースはありますか？
はい。Anpheros のサンドボックスは無料です。Google でサインインし、ワンクリックでキーを取得すると、プロジェクトごとに 30 人の合成患者と 1 日あたり最大 10,000 件の書き込みが利用できます。本番環境は月額 €99 から 2,500 人の患者に対応しており、最初の月は無料です。本番環境へのアクセスは、署名済みのデータ処理契約を持つ検証済みの組織に限られます。[料金](https://developers.anpheros.com/ja/guides/pricing) を参照してください。

### 無料サンドボックスに実際の患者データを保存できますか？
いいえ。サンドボックスは合成データ専用です。各サンドボックスプロジェクトには独自の合成患者が用意されており、サンドボックスキーは本番環境に到達できません。実際の患者レコードは、本番環境プロジェクトに保存する必要があります。

## 関連情報

- [FHIR vs. カスタム医療データベース](https://developers.anpheros.com/ja/guides/fhir-vs-custom-database): 独自のテーブルを設計する場合と FHIR を使用する場合
- [TypeScript でヘルスケア API を構築する方法](https://developers.anpheros.com/ja/guides/healthcare-api-typescript): Express を使用したステップバイステップチュートリアル
- [Flutter でヘルスケアアプリを構築する方法](https://developers.anpheros.com/ja/guides/healthcare-app-flutter): Dart SDK を使用したステップバイステップチュートリアル
- [ヘルスケアソフトウェア開発](https://developers.anpheros.com/ja/guides/healthcare-software)
- [ヘルスケアアプリの構築](https://developers.anpheros.com/ja/guides/build-a-healthcare-app)
- [アーキテクチャ](https://developers.anpheros.com/ja/guides/architecture)
- [医療データ API](https://developers.anpheros.com/ja/guides/medical-data-api)
- [SDK](https://developers.anpheros.com/ja/guides/sdks)
