96 行
2.8 KiB
Ruby
96 行
2.8 KiB
Ruby
class GekanatorQuestionSuggestionsController < ApplicationController
|
|
def create
|
|
return head :unauthorized unless current_user
|
|
|
|
game = GekanatorGame.find_by(id: params.require(:gekanator_game_id))
|
|
return head :not_found unless game
|
|
if !current_user.admin? && game.user_id != current_user.id
|
|
return head :not_found
|
|
end
|
|
|
|
existing_question_id = params[:existing_question_id].presence
|
|
if existing_question_id
|
|
question = GekanatorQuestion.accepted.find_by(id: existing_question_id)
|
|
return head :not_found unless question
|
|
unless learnable_existing_question?(question)
|
|
return render_validation_error fields: { existing_question_id: ['質問が不正です.'] }
|
|
end
|
|
|
|
example =
|
|
GekanatorQuestionExample.find_or_initialize_by(
|
|
gekanator_question: question,
|
|
post: game.correct_post,
|
|
user: current_user)
|
|
example.record_answer!(
|
|
answer: params.require(:answer),
|
|
source: 'post_game_extra',
|
|
gekanator_game: game)
|
|
|
|
if example.save
|
|
render json: {
|
|
id: question.id,
|
|
count: game.question_suggestions.count
|
|
}, status: :created
|
|
else
|
|
render_validation_error example
|
|
end
|
|
return
|
|
end
|
|
|
|
suggestion = GekanatorQuestionSuggestion.new(
|
|
gekanator_game: game,
|
|
user: current_user,
|
|
question_text: params.require(:question_text),
|
|
answer: params.require(:answer))
|
|
|
|
if suggestion.valid?
|
|
ActiveRecord::Base.transaction do
|
|
suggestion.save!
|
|
Gekanator::QuestionSuggestionPromoter.call(
|
|
suggestion: suggestion,
|
|
user: current_user)
|
|
end
|
|
|
|
render json: {
|
|
id: suggestion.id,
|
|
count: game.question_suggestions.count
|
|
}, status: :created
|
|
else
|
|
render_validation_error suggestion
|
|
end
|
|
end
|
|
|
|
def ai_convert
|
|
return head :not_found unless current_user&.admin?
|
|
|
|
suggestion = GekanatorQuestionSuggestion.find_by(id: params[:id])
|
|
return head :not_found unless suggestion
|
|
if Gekanator::AiRunBudget.exceeded_after_next_run?
|
|
suggestion.gekanator_ai_runs.create!(
|
|
model: 'budget_guard',
|
|
status: 'blocked_budget',
|
|
input_tokens: 0,
|
|
output_tokens: 0,
|
|
estimated_cost_jpy: 0)
|
|
return head :payment_required
|
|
end
|
|
|
|
Gekanator::QuestionSuggestionAiConverter.call(
|
|
suggestion: suggestion,
|
|
user: current_user)
|
|
head :no_content
|
|
rescue NotImplementedError
|
|
head :not_implemented
|
|
end
|
|
|
|
private
|
|
|
|
def learnable_existing_question? question
|
|
return true if question.kind == 'post_similarity'
|
|
return false unless question.kind == 'tag'
|
|
|
|
key = question.condition.as_json['key'].to_s
|
|
!key.start_with?('nico:')
|
|
end
|
|
end
|