CloudTechホテル口コミシステムのバックエンドAPIです。
- Go 1.21
- Gin (Webフレームワーク)
- MySQL 8.0
- sqlx (SQLライブラリ)
- Docker
- MySQLが起動していること
docker run -d \
--name cloudtech-mysql \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=cloudtech_hotel \
-p 3306:3306 \
mysql:8.0cd cloudtech-hotel-api
# イメージをビルド
docker build -t cloudtech-hotel-api .
# コンテナを起動
docker run -d \
--name cloudtech-hotel-api \
-p 8080:8080 \
-e DB_HOST=host.docker.internal \
-e DB_PORT=3306 \
-e DB_USER=root \
-e DB_PASSWORD=password \
-e DB_NAME=cloudtech_hotel \
cloudtech-hotel-api- Go 1.21以上
- MySQL 8.0
export PORT=8080
export DB_HOST=localhost
export DB_PORT=3306
export DB_USER=root
export DB_PASSWORD=password
export DB_NAME=cloudtech_hotel
export ALLOWED_ORIGINS=http://localhost:3000mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS cloudtech_hotel"
mysql -u root -p cloudtech_hotel < migrations/001_create_tables.sqlgo mod downloadgo run cmd/api/main.gogo test ./...
# 詳細出力
go test -v ./...
# カバレッジ
go test -cover ./...http://localhost:8080/api/v1
GET /health
レスポンス:
{"status": "ok"}GET /api/v1/reviews
レスポンス:
[
{
"id": 1,
"title": "最高のホテルでした",
"content": "スタッフの対応が素晴らしく...",
"author_name": "山田太郎",
"rating": 5,
"created_at": "2024-01-15T10:30:00Z",
"updated_at": "2024-01-15T10:30:00Z"
}
]GET /api/v1/reviews/:id
レスポンス:
{
"id": 1,
"title": "最高のホテルでした",
"content": "スタッフの対応が素晴らしく...",
"author_name": "山田太郎",
"rating": 5,
"created_at": "2024-01-15T10:30:00Z",
"updated_at": "2024-01-15T10:30:00Z"
}POST /api/v1/reviews
Content-Type: application/json
{
"title": "最高のホテルでした",
"content": "スタッフの対応が素晴らしく、部屋も清潔でした。",
"author_name": "山田太郎",
"rating": 5
}
レスポンス: 201 Created
{
"id": 1,
"title": "最高のホテルでした",
"content": "スタッフの対応が素晴らしく、部屋も清潔でした。",
"author_name": "山田太郎",
"rating": 5,
"created_at": "2024-01-15T10:30:00Z",
"updated_at": "2024-01-15T10:30:00Z"
}PUT /api/v1/reviews/:id
Content-Type: application/json
{
"title": "素晴らしいホテルでした",
"content": "更新した内容...",
"author_name": "山田太郎",
"rating": 4
}
DELETE /api/v1/reviews/:id
レスポンス:
{"message": "Review deleted successfully"}# ヘルスチェック
curl http://localhost:8080/health
# 口コミ一覧取得
curl http://localhost:8080/api/v1/reviews
# 口コミ投稿
curl -X POST http://localhost:8080/api/v1/reviews \
-H "Content-Type: application/json" \
-d '{"title":"テスト","content":"テスト内容","author_name":"テスト太郎","rating":5}'
# 口コミ詳細取得
curl http://localhost:8080/api/v1/reviews/1
# 口コミ編集
curl -X PUT http://localhost:8080/api/v1/reviews/1 \
-H "Content-Type: application/json" \
-d '{"title":"更新テスト","content":"更新内容","author_name":"テスト太郎","rating":4}'
# 口コミ削除
curl -X DELETE http://localhost:8080/api/v1/reviews/1| カラム名 | 型 | 説明 |
|---|---|---|
| id | BIGINT UNSIGNED | 主キー、自動採番 |
| title | VARCHAR(100) | 口コミタイトル |
| content | TEXT | 口コミ本文 |
| author_name | VARCHAR(50) | 投稿者名 |
| rating | TINYINT UNSIGNED | 評価(1-5) |
| created_at | TIMESTAMP | 作成日時 |
| updated_at | TIMESTAMP | 更新日時 |
CREATE TABLE IF NOT EXISTS reviews (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(100) NOT NULL,
content TEXT NOT NULL,
author_name VARCHAR(50) NOT NULL,
rating TINYINT UNSIGNED NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_created_at (created_at),
INDEX idx_rating (rating)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;