Newer
Older
2024-hinata / 情報システム / order_processor.cgi
@hinata0428 hinata0428 on 16 May 4 KB add
#!/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