Skip to content

Comments

feat: アクティビティ入退室エンドポイントの実装#244

Merged
newt239 merged 6 commits intomasterfrom
feat/activity-base-endpoints
Dec 29, 2025
Merged

feat: アクティビティ入退室エンドポイントの実装#244
newt239 merged 6 commits intomasterfrom
feat/activity-base-endpoints

Conversation

@newt239
Copy link
Member

@newt239 newt239 commented Dec 23, 2025

概要

アクティビティ管理システムの入退室記録機能を実装しました。ユーザーのチェックイン・チェックアウト、管理者による強制チェックアウト、およびアクティビティレコードの時刻編集機能を提供します。

変更内容

追加されたエンドポイント

  1. POST /activity/checkin - ユーザーのチェックイン
  2. POST /activity/checkout - ユーザーのチェックアウト
  3. POST /activity/checkout/{userId} - 管理者による強制チェックアウト
  4. PUT /activity/record/{recordId} - アクティビティレコードの時刻編集

主要な実装

  • OpenAPI仕様の追加(document/paths/activity_*.yml, document/schemas/req_*.yml
  • HTTPハンドラの実装(pkg/activity/post_*.go, pkg/activity/put_*.go
  • SQLクエリの実装(pkg/db/sql/activity/*.sql
  • バリデーションロジック(時刻の整合性チェック、権限チェック)

主要な機能

  • チェックイン時に同じ場所で在室中の場合は自動的にチェックアウト
  • 管理者による他ユーザーの強制チェックアウト
  • レコード所有者または管理者によるチェックイン/チェックアウト時刻の編集
  • 時刻の整合性バリデーション(チェックアウト時刻 > チェックイン時刻)

テストプラン

以下のcurlコマンドで各エンドポイントをテストできます。

1. チェックイン

curl -X POST "http://localhost:8000/activity/checkin" \
  -H "Authorization: Bearer ${TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "place": "omiya-bushitsu"
  }'

期待される結果: {"success": true} が返される

2. チェックアウト

curl -X POST "http://localhost:8000/activity/checkout" \
  -H "Authorization: Bearer ${TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "place": "omiya-bushitsu"
  }'

期待される結果: {"success": true} が返される

エラーケース(在室中でない場合):

# 既にチェックアウト済みの場合
curl -X POST "http://localhost:8000/activity/checkout" \
  -H "Authorization: Bearer ${TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "place": "omiya-bushitsu"
  }'

期待される結果: 404 Not Found - "在室中ではありません"

3. 管理者による強制チェックアウト

Note

バイナリ文字列をUUIDに変換するシェルスクリプト

echo 0x9bca677fdfe511f0a248724daa63eb6e | sed 's/^0x//' | sed 's/^\(........\)\(....\)\(....\)\(....\)\(............\)$/\1-\2-\3-\4-\5/'
curl -X POST "http://localhost:8000/activity/checkout/${TARGET_USER_ID}" \
  -H "Authorization: Bearer ${ADMIN_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "place": "omiya-bushitsu"
  }'

期待される結果: {"success": true} が返される

エラーケース(管理者権限がない場合):

curl -X POST "http://localhost:8000/activity/checkout/${TARGET_USER_ID}" \
  -H "Authorization: Bearer ${TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "place": "omiya-bushitsu"
  }'

期待される結果: 403 Forbidden - "管理者権限がありません"

4. アクティビティレコードの時刻編集

まず、アクティビティレコードのIDを取得する必要があります(データベースから直接取得、または別のGET APIで取得)。

# チェックイン時刻を編集
curl -X PUT "http://localhost:8000/activity/record/${RECORD_ID}" \
  -H "Authorization: Bearer ${TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "activity_type": "checkin",
    "time": "2025-12-23T10:00:00+09:00"
  }'

期待される結果: {"success": true} が返される

# チェックアウト時刻を編集
curl -X PUT "http://localhost:8000/activity/record/${RECORD_ID}" \
  -H "Authorization: Bearer ${TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "activity_type": "checkout",
    "time": "2025-12-23T18:00:00+09:00"
  }'

期待される結果: {"success": true} が返される

エラーケース(時刻の整合性違反):

# チェックアウト時刻がチェックイン時刻より前
curl -X PUT "http://localhost:8000/activity/record/${RECORD_ID}" \
  -H "Authorization: Bearer ${TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "activity_type": "checkout",
    "time": "2025-12-23T09:00:00+09:00"
  }'

期待される結果: 400 Bad Request - "チェックアウト時刻はチェックイン時刻より後である必要があります"

エラーケース(編集権限がない場合):

# 他ユーザーのレコードを編集しようとする(管理者でない場合)
curl -X PUT "http://localhost:8000/activity/record/${OTHER_USER_RECORD_ID}" \
  -H "Authorization: Bearer ${TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "activity_type": "checkin",
    "time": "2025-12-23T10:00:00+09:00"
  }'

期待される結果: 403 Forbidden - "編集権限がありません"

5. バリデーションテスト

# 場所名が短すぎる(3文字未満)
curl -X POST "http://localhost:8000/activity/checkin" \
  -H "Authorization: Bearer ${TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "place": "x"
  }'

期待される結果: 400 Bad Request - バリデーションエラー

Copilot AI review requested due to automatic review settings December 23, 2025 09:05
@cloudflare-workers-and-pages
Copy link

cloudflare-workers-and-pages bot commented Dec 23, 2025

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
spec-core e532305 Commit Preview URL

Branch Preview URL
Dec 23 2025, 10:00 AM

Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

このPRは、アクティビティ管理システムの入退室記録機能を実装しています。ユーザーが部室などの場所へチェックイン・チェックアウトを記録し、管理者による強制チェックアウト、およびレコード所有者または管理者による時刻編集機能を提供します。

主な変更点:

  • 4つの新しいRESTful APIエンドポイント(チェックイン、チェックアウト、管理者強制チェックアウト、レコード時刻編集)
  • OpenAPI仕様の追加とGoコードの自動生成
  • MySQLクエリの実装(挿入、選択、更新)
  • 認証・認可ロジックとバリデーション

Reviewed changes

Copilot reviewed 29 out of 29 changed files in this pull request and generated 13 comments.

Show a summary per file
File Description
pkg/activity/post_activity_checkin.go ユーザーチェックイン処理の実装(重複チェックイン時の自動チェックアウトロジック含む)
pkg/activity/post_activity_checkout.go ユーザーチェックアウト処理と共有ヘルパー関数executeCheckout
pkg/activity/post_activity_checkout_user_id.go 管理者による他ユーザーの強制チェックアウト処理(権限チェック含む)
pkg/activity/put_activity_record_record_id.go アクティビティレコードの時刻編集機能(権限チェックと時刻整合性バリデーション含む)
pkg/activity/activity.go ActivityRecord構造体とselectLatestActivityヘルパー関数の定義
pkg/api/server/post_activity_checkin.go チェックインエンドポイントのHTTPハンドラーラッパー
pkg/api/server/post_activity_checkout.go チェックアウトエンドポイントのHTTPハンドラーラッパー
pkg/api/server/post_activity_checkout_user_id.go 管理者強制チェックアウトエンドポイントのHTTPハンドラーラッパー
pkg/api/server/put_activity_record_record_id.go レコード編集エンドポイントのHTTPハンドラーラッパー
pkg/api/server.gen.go 新しいエンドポイントのルーティング定義(自動生成)
pkg/api/models.gen.go リクエスト・レスポンスモデルの定義(自動生成)
pkg/api/spec.gen.go OpenAPI仕様のバンドル(自動生成)
pkg/db/sql/activity/insert_activity.sql 新規アクティビティレコード挿入クエリ
pkg/db/sql/activity/select_latest_activity.sql ユーザーと場所による最新アクティビティレコード取得クエリ
pkg/db/sql/activity/select_activity_from_id.sql IDによるアクティビティレコード取得クエリ
pkg/db/sql/activity/update_activity_checkout.sql チェックアウト時刻更新クエリ
pkg/db/sql/activity/update_activity_times.sql チェックイン・チェックアウト時刻の両方を更新するクエリ
document/paths/activity_checkin.yml チェックインエンドポイントのOpenAPI定義
document/paths/activity_checkout.yml チェックアウトエンドポイントのOpenAPI定義
document/paths/activity_checkout_user_id.yml 管理者強制チェックアウトエンドポイントのOpenAPI定義
document/paths/activity_record_record_id.yml レコード編集エンドポイントのOpenAPI定義
document/schemas/req_post_activity_checkin.yml チェックインリクエストスキーマ定義
document/schemas/req_post_activity_checkout.yml チェックアウトリクエストスキーマ定義
document/schemas/req_put_activity_record_record_id.yml レコード編集リクエストスキーマ定義
document/paths.yml 新しいエンドポイントパスのマッピング
document/schemas.yml 新しいスキーマの登録
document/tags.yml activityタグの追加
document/bundle.gen.yml OpenAPI仕様のバンドル(自動生成)
pkg/mail/post_mail.go Email型からstring型への変換処理(OpenAPI仕様変更に伴う修正)

@newt239 newt239 requested a review from saka-naname December 23, 2025 10:01
Copy link
Contributor

@saka-naname saka-naname left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTMeow

@newt239 newt239 merged commit a4e083a into master Dec 29, 2025
3 checks passed
@newt239 newt239 deleted the feat/activity-base-endpoints branch December 29, 2025 08:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants