リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: カスタムマッピング
ピンの共有リンク(スナップショットURL)生成機能の追加
## 1. 目的
小規模チームが特定のピン情報を外部メンバーや関係者にすばやく共有できるよう、個々のピン詳細ページへの「読み取り専用の共有リンク」を生成する機能を追加する。合言葉認証なしでもアクセスできる時限トークン付きURLにより、アカウントを持たない相手にもピン情報を安全に伝達できる。
## 2. 具体的な仕様
### 2-1. DBスキーマ追加
```sql
CREATE TABLE pin_share_tokens (
id INT AUTO_INCREMENT PRIMARY KEY,
pin_id INT NOT NULL,
token CHAR(64) NOT NULL UNIQUE, -- bin2hex(random_bytes(32))
expires_at DATETIME NOT NULL, -- 生成時から72時間後
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (pin_id) REFERENCES pins(id) ON DELETE CASCADE
);
```
### 2-2. 共有リンク生成
- **トリガー箇所**: ピン詳細ポップアップ(Leafletのポップアップ内)および詳細モーダルに「🔗 共有リンクを生成」ボタンを追加。
- **動作**:
1. ログイン済みユーザー(合言葉認証済みセッション)のみボタンを表示。
2. ボタン押下でAjax(fetch)により`/share/generate.php`へPOST(pin_id送信)。
3. サーバー側で`random_bytes(32)`のトークンを生成し`pin_share_tokens`テーブルへ挿入、有効期限72時間を設定。
4. レスポンスとして生成URL(`https://ドメイン/share/view.php?token=xxx`)を返す。
5. クライアント側でURLをテキストフィールドに表示し「コピー」ボタン(`navigator.clipboard.writeText`)を隣接配置。
- **同一ピンの既存有効トークン**: 再生成時は古いトークンをDELETEしてから新規生成(1ピン1トークン運用)。
### 2-3. 共有ビューページ(`/share/view.php`)
- 認証不要でアクセス可能(セッションチェックをスキップ)。
- トークンをGETパラメータで受け取り、`pin_share_tokens`と`pins`を結合して情報を取得。
- **表示内容**(読み取り専用):
- ピン名、カテゴリ、タグ、カスタム項目の値、星評価の平均、添付写真(サムネイル)
- 小型LeafletマップでピンのみをCDN経由で表示(既存の地図コードを流用)
- 有効期限の残り時間(例:「あと47時間有効」)
- **期限切れ・無効トークン**: 404相当のメッセージページを返す。
- 編集履歴・レビュー投稿フォーム・管理UIは一切表示しない。
### 2-4. 期限切れトークンの自動削除
- `generate.php`の処理冒頭で`DELETE FROM pin_share_tokens WHERE expires_at < NOW()`を実行し、都度クリーンアップ(cronなし運用)。
### 2-5. UI/UXデザイン
- 共有ビューはヘッダーに「👁 読み取り専用 ― カスタムマッピングで表示中」のバナーを表示。
- スマホ対応: テキストフィールド+コピーボタンはflex横並びで幅100%。
- 日本語・英語両対応: ボタンラベル「共有リンクを生成 / Generate Share Link」、バナー文言も両言語に対応。
## 3. 既存機能との整合
- 合言葉認証のセッション管理ロジックは変更しない。共有ビューのみセッションチェックを免除するが、既存の全ページのチェックには影響しない。
- `pins`テーブルや既存のカテゴリ・タグ・カスタム項目テーブルはREADのみ使用し、構造変更なし。
- CSV/JSONエクスポート、クラスタリング、ルート表示などの既存機能は共有ビューに含めないため干渉しない。
- 新規ファイルは`/share/`ディレクトリ以下に分離し、既存ファイルへの変更は詳細モーダルのHTMLに「共有リンクを生成」ボタンを追加するのみ。
小規模チームが特定のピン情報を外部メンバーや関係者にすばやく共有できるよう、個々のピン詳細ページへの「読み取り専用の共有リンク」を生成する機能を追加する。合言葉認証なしでもアクセスできる時限トークン付きURLにより、アカウントを持たない相手にもピン情報を安全に伝達できる。
## 2. 具体的な仕様
### 2-1. DBスキーマ追加
```sql
CREATE TABLE pin_share_tokens (
id INT AUTO_INCREMENT PRIMARY KEY,
pin_id INT NOT NULL,
token CHAR(64) NOT NULL UNIQUE, -- bin2hex(random_bytes(32))
expires_at DATETIME NOT NULL, -- 生成時から72時間後
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (pin_id) REFERENCES pins(id) ON DELETE CASCADE
);
```
### 2-2. 共有リンク生成
- **トリガー箇所**: ピン詳細ポップアップ(Leafletのポップアップ内)および詳細モーダルに「🔗 共有リンクを生成」ボタンを追加。
- **動作**:
1. ログイン済みユーザー(合言葉認証済みセッション)のみボタンを表示。
2. ボタン押下でAjax(fetch)により`/share/generate.php`へPOST(pin_id送信)。
3. サーバー側で`random_bytes(32)`のトークンを生成し`pin_share_tokens`テーブルへ挿入、有効期限72時間を設定。
4. レスポンスとして生成URL(`https://ドメイン/share/view.php?token=xxx`)を返す。
5. クライアント側でURLをテキストフィールドに表示し「コピー」ボタン(`navigator.clipboard.writeText`)を隣接配置。
- **同一ピンの既存有効トークン**: 再生成時は古いトークンをDELETEしてから新規生成(1ピン1トークン運用)。
### 2-3. 共有ビューページ(`/share/view.php`)
- 認証不要でアクセス可能(セッションチェックをスキップ)。
- トークンをGETパラメータで受け取り、`pin_share_tokens`と`pins`を結合して情報を取得。
- **表示内容**(読み取り専用):
- ピン名、カテゴリ、タグ、カスタム項目の値、星評価の平均、添付写真(サムネイル)
- 小型LeafletマップでピンのみをCDN経由で表示(既存の地図コードを流用)
- 有効期限の残り時間(例:「あと47時間有効」)
- **期限切れ・無効トークン**: 404相当のメッセージページを返す。
- 編集履歴・レビュー投稿フォーム・管理UIは一切表示しない。
### 2-4. 期限切れトークンの自動削除
- `generate.php`の処理冒頭で`DELETE FROM pin_share_tokens WHERE expires_at < NOW()`を実行し、都度クリーンアップ(cronなし運用)。
### 2-5. UI/UXデザイン
- 共有ビューはヘッダーに「👁 読み取り専用 ― カスタムマッピングで表示中」のバナーを表示。
- スマホ対応: テキストフィールド+コピーボタンはflex横並びで幅100%。
- 日本語・英語両対応: ボタンラベル「共有リンクを生成 / Generate Share Link」、バナー文言も両言語に対応。
## 3. 既存機能との整合
- 合言葉認証のセッション管理ロジックは変更しない。共有ビューのみセッションチェックを免除するが、既存の全ページのチェックには影響しない。
- `pins`テーブルや既存のカテゴリ・タグ・カスタム項目テーブルはREADのみ使用し、構造変更なし。
- CSV/JSONエクスポート、クラスタリング、ルート表示などの既存機能は共有ビューに含めないため干渉しない。
- 新規ファイルは`/share/`ディレクトリ以下に分離し、既存ファイルへの変更は詳細モーダルのHTMLに「共有リンクを生成」ボタンを追加するのみ。
💬 返信 (3)
🛠 開発を開始しました (機能追加 custom-mapping)
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
📝 開発が完了しました
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
✅ リリース完了のお知らせ
ご要望いただいた「カスタムマッピング」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=custom-mapping
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/custom-mapping/
ご利用ありがとうございます!
ご要望いただいた「カスタムマッピング」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=custom-mapping
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/custom-mapping/
ご利用ありがとうございます!
Echo
Iris