From 5278c44ccf9b111531129c2ae905e727797511d7 Mon Sep 17 00:00:00 2001 From: Teppei Shintani Date: Tue, 28 May 2024 22:02:42 +0900 Subject: [PATCH] =?UTF-8?q?decode=5Frequest=5Fbody=20=E3=81=AE=E8=BF=94?= =?UTF-8?q?=E3=82=8A=E5=80=A4=E3=81=AE=E5=9E=8B=E3=81=8C=E4=B8=80=E6=84=8F?= =?UTF-8?q?=E3=81=AB=E5=AE=9A=E3=81=BE=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= =?UTF-8?q?=20Union=20=E3=81=AE=E4=BD=BF=E3=81=84=E6=96=B9=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webapp/ruby/Steepfile | 4 +--- webapp/ruby/app.rb | 21 ++++++++++++--------- webapp/ruby/sig/generated/app.rbs | 10 +++++++--- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/webapp/ruby/Steepfile b/webapp/ruby/Steepfile index c3921db..d4f93ec 100644 --- a/webapp/ruby/Steepfile +++ b/webapp/ruby/Steepfile @@ -7,7 +7,5 @@ target :app do library "json", "securerandom", "base64", "digest" - configure_code_diagnostics do |hash| - hash[D::Ruby::MethodDefinitionMissing] = :warning - end + configure_code_diagnostics(D::Ruby.all_error) end diff --git a/webapp/ruby/app.rb b/webapp/ruby/app.rb index 4355587..b34fc2a 100644 --- a/webapp/ruby/app.rb +++ b/webapp/ruby/app.rb @@ -86,8 +86,18 @@ def db_transaction(&block) end end - # singleton(T) が動いてほしいなあ - #:: (singleton(ReserveLivestreamRequest) | singleton(PostLivecommentRequest) | singleton(ModerateRequest) | singleton(PostReactionRequest) | singleton(PostIconRequest) | singleton(PostUserRequest) | singleton(LoginRequest) data_class) -> (ReserveLivestreamRequest | PostLivecommentRequest | ModerateRequest | PostReactionRequest | PostIconRequest | PostUserRequest | LoginRequest) + # #::記法ではオーバーロードが無視されるバグ?を回避するため @rbs! で記述 + # ref. https://github.com/soutaro/rbs-inline/issues/36 + # @rbs! + # def decode_request_body: (singleton(ReserveLivestreamRequest)) -> ReserveLivestreamRequest + # | (singleton(PostLivecommentRequest)) -> PostLivecommentRequest + # | (singleton(ModerateRequest)) -> ModerateRequest + # | (singleton(PostReactionRequest)) -> PostReactionRequest + # | (singleton(PostIconRequest)) -> PostIconRequest + # | (singleton(PostUserRequest)) -> PostUserRequest + # | (singleton(LoginRequest)) -> LoginRequest + + # @rbs skip def decode_request_body(data_class) body = JSON.parse(request.body.tap(&:rewind).read, symbolize_names: true) data_class.new(**data_class.members.map { |key| [key, body[key]] }.to_h) @@ -309,7 +319,6 @@ def fill_user_response(tx, user_model) end req = decode_request_body(ReserveLivestreamRequest) - raise unless req.is_a?(ReserveLivestreamRequest) livestream = db_transaction do |tx| # 2023/11/25 10:00からの1年間の期間内であるかチェック @@ -591,7 +600,6 @@ def fill_user_response(tx, user_model) livestream_id = cast_as_integer(params[:livestream_id]) req = decode_request_body(PostLivecommentRequest) - raise unless req.is_a?(PostLivecommentRequest) livecomment = db_transaction do |tx| livestream_model = tx.xquery('SELECT * FROM livestreams WHERE id = ?', livestream_id).first @@ -705,7 +713,6 @@ def fill_user_response(tx, user_model) livestream_id = cast_as_integer(params[:livestream_id]) req = decode_request_body(ModerateRequest) - raise unless req.is_a?(ModerateRequest) word_id = db_transaction do |tx| # 配信者自身の配信に対するmoderateなのかを検証 @@ -790,7 +797,6 @@ def fill_user_response(tx, user_model) livestream_id = Integer(params[:livestream_id], 10) req = decode_request_body(PostReactionRequest) - raise unless req.is_a?(PostReactionRequest) reaction = db_transaction do |tx| created_at = Time.now.to_i @@ -856,7 +862,6 @@ def fill_user_response(tx, user_model) end req = decode_request_body(PostIconRequest) - raise unless req.is_a?(PostIconRequest) image = Base64.decode64(req.image) icon_id = db_transaction do |tx| @@ -919,7 +924,6 @@ def fill_user_response(tx, user_model) # ユーザ登録API post '/api/register' do req = decode_request_body(PostUserRequest) - raise unless req.is_a?(PostUserRequest) if req.name == 'pipe' raise HttpError.new(400, "the username 'pipe' is reserved") end @@ -968,7 +972,6 @@ def fill_user_response(tx, user_model) # ユーザログインAPI post '/api/login' do req = decode_request_body(LoginRequest) - raise unless req.is_a?(LoginRequest) user_model = db_transaction do |tx| # usernameはUNIQUEなので、whereで一意に特定できる diff --git a/webapp/ruby/sig/generated/app.rbs b/webapp/ruby/sig/generated/app.rbs index e9bcc81..b3e698f 100644 --- a/webapp/ruby/sig/generated/app.rbs +++ b/webapp/ruby/sig/generated/app.rbs @@ -32,9 +32,13 @@ module Isupipe # :: [T] () { (Mysql2::Client[Mysql2::ResultAsHash]) -> T } -> T def db_transaction: [T] () { (Mysql2::Client[Mysql2::ResultAsHash]) -> T } -> T - # singleton(T) が動いてほしいなあ - # :: (singleton(ReserveLivestreamRequest) | singleton(PostLivecommentRequest) | singleton(ModerateRequest) | singleton(PostReactionRequest) | singleton(PostIconRequest) | singleton(PostUserRequest) | singleton(LoginRequest) data_class) -> (ReserveLivestreamRequest | PostLivecommentRequest | ModerateRequest | PostReactionRequest | PostIconRequest | PostUserRequest | LoginRequest) - def decode_request_body: (singleton(ReserveLivestreamRequest) | singleton(PostLivecommentRequest) | singleton(ModerateRequest) | singleton(PostReactionRequest) | singleton(PostIconRequest) | singleton(PostUserRequest) | singleton(LoginRequest) data_class) -> (ReserveLivestreamRequest | PostLivecommentRequest | ModerateRequest | PostReactionRequest | PostIconRequest | PostUserRequest | LoginRequest) + def decode_request_body: (singleton(ReserveLivestreamRequest)) -> ReserveLivestreamRequest + | (singleton(PostLivecommentRequest)) -> PostLivecommentRequest + | (singleton(ModerateRequest)) -> ModerateRequest + | (singleton(PostReactionRequest)) -> PostReactionRequest + | (singleton(PostIconRequest)) -> PostIconRequest + | (singleton(PostUserRequest)) -> PostUserRequest + | (singleton(LoginRequest)) -> LoginRequest # @rbs str: String # @rbs returns Integer