#!/usr/bin/env ruby require 'sqlite3' require 'cgi' require 'json' require 'time' # データベース接続 def connect_db begin db = SQLite3::Database.new('kappa_sushi.db') db.results_as_hash = true # テーブルが存在しない場合は作成 db.execute <<-SQL CREATE TABLE IF NOT EXISTS orders ( id INTEGER PRIMARY KEY AUTOINCREMENT, table_number INTEGER, character_id INTEGER, total_price INTEGER, order_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); SQL db.execute <<-SQL CREATE TABLE IF NOT EXISTS order_items ( id INTEGER PRIMARY KEY AUTOINCREMENT, order_id INTEGER, item_id INTEGER, item_name TEXT, price INTEGER, quantity INTEGER, FOREIGN KEY (order_id) REFERENCES orders(id) ); SQL return db rescue SQLite3::Exception => e error_response("データベースエラー: #{e.message}") exit end end # エラーレスポンスを返す関数 def error_response(message) response = { 'status' => 'error', 'message' => message } puts JSON.generate(response) end # 成功レスポンスを返す関数 def success_response(data) response = { 'status' => 'success', 'data' => data } puts JSON.generate(response) end # メイン処理 begin cgi = CGI.new print "Content-Type: application/json\n\n" # リクエストの種類に応じて処理を分岐 case cgi.request_method when 'POST' # POSTリクエストの処理(注文処理) request_body = cgi.stdinput.read order_data = JSON.parse(request_body) db = connect_db db.transaction db.execute( "INSERT INTO orders (table_number, character_id, total_price) VALUES (?, ?, ?)", [order_data['table'], order_data['character'], order_data['total']] ) order_id = db.last_insert_row_id order_data['items'].each do |item| db.execute( "INSERT INTO order_items (order_id, item_id, item_name, price, quantity) VALUES (?, ?, ?, ?, ?)", [order_id, item['id'], item['name'], item['price'], item['quantity']] ) end db.commit success_response({ 'order_id' => order_id, 'message' => '注文が正常に処理されました', 'timestamp' => Time.now.iso8601 }) when 'GET' # GETリクエストの処理(注文履歴取得・状態確認・リセット) action = cgi.path_info.to_s.gsub(/^\//, '') db = connect_db case action when 'orders' # クエリパラメータでキャラクターID指定可能 (例: ?character_id=2) character_id = cgi['character_id'] if character_id && !character_id.empty? orders = db.execute("SELECT * FROM orders WHERE character_id = ? ORDER BY order_time DESC LIMIT 50", [character_id]) else orders = db.execute("SELECT * FROM orders ORDER BY order_time DESC LIMIT 50") end # 各注文のアイテムを取得 orders.each do |order| order['items'] = db.execute( "SELECT * FROM order_items WHERE order_id = ?", [order['id']] ) end success_response(orders) when 'status' response = { 'system' => 'active', 'version' => '1.0.0', 'time' => Time.now.iso8601, 'endpoints' => { 'POST /' => '注文を送信する', 'GET /orders' => '注文履歴を取得する', 'GET /status' => 'システム状態を確認する', 'POST /reset_orders' => '注文履歴をリセットする(管理用)' } } success_response(response) when 'reset_orders' # セキュリティ対策:本来は認証を追加するべきですが、ここでは単純化 db.transaction db.execute("DELETE FROM order_items") db.execute("DELETE FROM orders") db.commit success_response({ 'message' => '注文履歴がリセットされました' }) else success_response({ 'message' => 'かっぱ寿司注文APIは正常に動作しています', 'version' => '1.0.0' }) end else error_response('サポートされていないリクエストメソッドです') end rescue => e error_response("サーバーエラー: #{e.message}") end