diff --git a/backend/app/controllers/gekanator_games_controller.rb b/backend/app/controllers/gekanator_games_controller.rb index abc9c16..9dba4a3 100644 --- a/backend/app/controllers/gekanator_games_controller.rb +++ b/backend/app/controllers/gekanator_games_controller.rb @@ -2,16 +2,22 @@ class GekanatorGamesController < ApplicationController def create return head :unauthorized unless current_user + guessed_post_id = params.require(:guessed_post_id) + correct_post_id = params[:correct_post_id].presence answers = params.require(:answers).as_json - game = GekanatorGame.create!( + game = GekanatorGame.new( user: current_user, - guessed_post_id: params.require(:guessed_post_id), - correct_post_id: params[:correct_post_id].presence, - won: params[:guessed_post_id].to_i == params[:correct_post_id].to_i, + guessed_post_id:, + correct_post_id:, + won: correct_post_id.present? && guessed_post_id.to_i == correct_post_id.to_i, question_count: params.require(:question_count), answers:) - render json: { id: game.id }, status: :created + if game.save + render json: { id: game.id }, status: :created + else + render json: { errors: game.errors.full_messages }, status: :unprocessable_entity + end end end diff --git a/backend/app/models/gekanator_game.rb b/backend/app/models/gekanator_game.rb index dad5819..2808be4 100644 --- a/backend/app/models/gekanator_game.rb +++ b/backend/app/models/gekanator_game.rb @@ -1,10 +1,9 @@ class GekanatorGame < ApplicationRecord - belongs_to :user, optional: true + belongs_to :user belongs_to :guessed_post, class_name: 'Post' - belongs_to :correct_post, class_name: 'Post', optional: true + belongs_to :correct_post, class_name: 'Post' validates :answers, presence: true - validates :correct_post, presence: true validates :question_count, numericality: { greater_than_or_equal_to: 0 } validates :won, inclusion: { in: [true, false] } end diff --git a/backend/db/migrate/20260608000000_require_gekanator_game_user_and_correct_post.rb b/backend/db/migrate/20260608000000_require_gekanator_game_user_and_correct_post.rb new file mode 100644 index 0000000..8071fab --- /dev/null +++ b/backend/db/migrate/20260608000000_require_gekanator_game_user_and_correct_post.rb @@ -0,0 +1,17 @@ +class RequireGekanatorGameUserAndCorrectPost < ActiveRecord::Migration[8.0] + def up + execute <<~SQL.squish + UPDATE gekanator_games + SET correct_post_id = guessed_post_id + WHERE correct_post_id IS NULL + SQL + + change_column_null :gekanator_games, :user_id, false + change_column_null :gekanator_games, :correct_post_id, false + end + + def down + change_column_null :gekanator_games, :correct_post_id, true + change_column_null :gekanator_games, :user_id, true + end +end diff --git a/backend/db/schema.rb b/backend/db/schema.rb index d08bd31..3ef8127 100644 --- a/backend/db/schema.rb +++ b/backend/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[8.0].define(version: 2026_06_07_000000) do +ActiveRecord::Schema[8.0].define(version: 2026_06_08_000000) do create_table "active_storage_attachments", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| t.string "name", null: false t.string "record_type", null: false @@ -49,9 +49,9 @@ ActiveRecord::Schema[8.0].define(version: 2026_06_07_000000) do end create_table "gekanator_games", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| - t.bigint "user_id" + t.bigint "user_id", null: false t.bigint "guessed_post_id", null: false - t.bigint "correct_post_id" + t.bigint "correct_post_id", null: false t.boolean "won", null: false t.integer "question_count", null: false t.json "answers", null: false