From e92e5ef223b55e3149388482b0d4a7ecefcc9ed5 Mon Sep 17 00:00:00 2001 From: "OHASHI, Norikazu" Date: Fri, 16 Apr 2021 07:46:11 +0900 Subject: [PATCH] =?utf8?q?=E3=82=BB=E3=83=83=E3=82=B7=E3=83=A7=E3=83=B3?= =?utf8?q?=E7=A2=BA=E8=AA=8D=E3=80=81=E6=9B=B8=E7=B1=8D=E7=99=BB=E9=8C=B2?= =?utf8?q?=E5=91=A8=E3=82=8A=E3=81=AE=E3=83=98=E3=83=AB=E3=83=91=E3=83=BC?= =?utf8?q?=E5=8C=96=E3=80=81=E7=AE=A1=E7=90=86=E8=80=85=E7=94=A8=E6=9B=B8?= =?utf8?q?=E7=B1=8D=E6=83=85=E5=A0=B1=E3=81=AE=E6=93=8D=E4=BD=9C=E5=AF=BE?= =?utf8?q?=E5=BF=9C=E3=80=81=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88=E6=95=B4?= =?utf8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .yardopts | 3 +- cgi/startup.rb | 1 + create_table.sql | 2 +- sinatra/app/controllers/web_gui.rb | 256 +++++++++++++++-------------- sinatra/app/models/books_db.rb | 51 ++++-- sinatra/app/views/book_regist.haml | 39 +++-- 6 files changed, 195 insertions(+), 157 deletions(-) diff --git a/.yardopts b/.yardopts index 8df88ff..9fedcb7 100644 --- a/.yardopts +++ b/.yardopts @@ -1,5 +1,6 @@ --plugin yard-sinatra ---type-name-tag post_param:"POST parameters" +--type-name-tag post_param:"POST Parameters" +--type-name-tag path_param:"Path Paramaters" --markup-provider=redcarpet --markup=markdown - diff --git a/cgi/startup.rb b/cgi/startup.rb index c2c0ba7..b686d21 100644 --- a/cgi/startup.rb +++ b/cgi/startup.rb @@ -1,4 +1,5 @@ require 'sinatra' +# book_server home directory APP_HOME='/home/wald-der-katze/sinatra/book_server' load "#{APP_HOME}/start.rb" diff --git a/create_table.sql b/create_table.sql index 5b00dcc..96d8196 100644 --- a/create_table.sql +++ b/create_table.sql @@ -45,7 +45,7 @@ CREATE TABLE book_covers ( CREATE VIEW book_fulls (isbn, title, volume, author, publisher, pubdate, user_id) AS SELECT B.isbn AS isbn, B.title AS title, B.volume AS volume, - B.author AS author, B.publisher AS publisher, B.pubdate as pubdate, + B.author AS author, B.publisher AS publisher, B.pubdate AS pubdate, C.user_id AS user_id FROM (books AS B left join book_collections AS C ON((B.isbn = C.isbn))); diff --git a/sinatra/app/controllers/web_gui.rb b/sinatra/app/controllers/web_gui.rb index 2417c95..94b7d7d 100644 --- a/sinatra/app/controllers/web_gui.rb +++ b/sinatra/app/controllers/web_gui.rb @@ -57,6 +57,53 @@ class WebGui < Sinatra::Base return upload_data end + + # ユーザID が nil ならばセッションエラー + # @params [int] id ユーザid + def checkSession(id) + if (id == nil) + raise WebError.new(status: 408, message: "セッション期限切れです。再ログインをしてください。") + end + end + + # 更新用の書籍情報を作成する。 + # @param [Hash] params Postで取得した全パラメータ + # @return [Hash] 更新用書籍情報 + def makeBookInfo(params) + book_info = Hash.new + params.each do |key, value| + case key + when 'summary', 'book_rank', 'cover_base64', 'cover_file', 'mime_type' then + # 対象キーは書籍情報ではないので飛す + next + end + if ((key == 'cover_uriD') && (image_f)) + # 登録するイメージがあるのでURIの登録は飛す + next + end + book_info[key.to_sym] = value + end + return book_info + end + + # 書影情報の作成 + # @param [Boolean] image_f Base64のイメージデータ有 + # @param [Hash] params Postで取得した全パラメータ + # @param [String] book_url 書影URL + # @return [Hash] 作成した書影データ + def setBookImage(image_f, params, book_url) + cover_image = Hash.new + # 書影情報の更新 + if (image_f) + cover_image[:data] = Base64.decode64(params[:cover_base64]) + cover_image[:mime_type] = params[:mime_type] + end + if ((not image_f) && (book_url == nil) && + (params[:cover_file] != nil)) + cover_image = getUploadData(params[:cover_file]) + end + return cover_image + end end # スタイルシート @@ -132,9 +179,7 @@ class WebGui < Sinatra::Base get '/user_home' do cache_control :public, :must_revalidate, :max_age => 30 id = session[:userId] - if (id == nil) - raise WebError.new(status: 408, message: "セッション期限切れです。再ログインをしてください。") - end + checkSession(id) user = UserAccount.getUser(id) @id = id @username = user.full_name @@ -148,9 +193,7 @@ class WebGui < Sinatra::Base # @raise [WebError] ユーザID不正 get '/user_edit' do id = session[:userId] - if (id == nil) - raise WebError.new(status: 408, message: "セッション期限切れです。再ログインをしてください。") - end + checkSession(id) begin user = UserAccount.getUser(id) @is_admin = UserAccount.checkAdmin(id); @@ -173,9 +216,7 @@ class WebGui < Sinatra::Base get '/user_edit/:editId' do id = session[:userId] edit_id = params[:editId] - if (id == nil) - raise WebError.new(status: 408, message: "セッション期限切れです。再ログインをしてください。") - end + checkSession(id) if (not UserAccount.checkAdmin(id)) raise WebError.new(status: 405, message: "管理者アカウントでないと操作できません。") end @@ -209,9 +250,7 @@ class WebGui < Sinatra::Base email = params[:email]; try_pass = params[:try_pass] new_pass = params[:new_pass] - if (id == nil) - raise WebError.new(staut: 408, message: "セッション期限切れです。再ログインをしてください。") - end + checkSession(id) begin if (new_pass != "") check_id = UserAccount.checkPasswd(name, try_pass) @@ -231,6 +270,7 @@ class WebGui < Sinatra::Base end # ユーザ情報編集ページ(ユーザID指定)(POST) + # @path_param editId [Integer] 編集対象ユーザID # @post_param name [String] ログインユーザ名, # @post_param try_pass [String] 旧パスワード # @post_param new_pass [String] 新パスワード @@ -245,9 +285,7 @@ class WebGui < Sinatra::Base email = params[:email] new_pass = params[:new_pass] - if (id == nil) - raise WebError.new(staut: 408, message: "セッション期限切れです。再ログインをしてください。") - end + checkSession(id) if (not UserAccount.checkAdmin(id)) raise WebError.new(status: 405, message: "管理者アカウントでないと操作できません。") end @@ -271,9 +309,7 @@ class WebGui < Sinatra::Base id = session[:userId] book_update_f = false session[:book_update_f] = book_update_f - if (id == nil) - raise WebError.new(status: 408, message: "セッション期限切れです。再ログインをしてください。") - end + checkSession(id) if (not UserAccount.checkAdmin(id)) raise WebError.new(status: 405, message: "管理者アカウントでないと操作できません。") end @@ -296,9 +332,7 @@ class WebGui < Sinatra::Base cache_control :public, :must_revalidate, :max_age => 30 id = session[:userId] delete_id = params[:deleteId] - if (id == nil) - raise WebError.new(status: 408, message: "セッション期限切れです。再ログインをしてください。") - end + checkSession(id) if (not UserAccount.checkAdmin(id)) raise WebError.new(status: 405, message: "管理者アカウントでないと操作できません。") end @@ -319,9 +353,7 @@ class WebGui < Sinatra::Base cache_control :public, :must_revalidate, :max_age => 30 id = session[:userId] delete_id = params[:deleteId] - if (id == nil) - raise WebError.new(status: 408, message: "セッション期限切れです。再ログインをしてください。") - end + checkSession(id) if (not UserAccount.checkAdmin(id)) raise WebError.new(status: 405, message: "管理者アカウントでないと操作できません。") end @@ -345,16 +377,14 @@ class WebGui < Sinatra::Base id = session[:userId] book_update_f = false session[:book_update_f] = book_update_f - if (id == nil) - raise WebError.new(status: 408, message: "セッション期限切れです。再ログインをしてください。") - end + checkSession(id) begin user = UserAccount.getUser(id) @id = id @username = user.full_name @book_info = Hash.new @update_f = book_update_f - @is_admin = UserAccount.checkAdmin(id); + @is_admin = UserAccount.checkAdmin(id) rescue UserAccount::NotFoundInstanceError raise WebError.new(status: 404, message: "ユーザ情報が存在しません。") end @@ -371,16 +401,17 @@ class WebGui < Sinatra::Base book_update_f = true session[:book_update_f] = book_update_f isbn = params[:isbn] - if (id == nil) - raise WebError.new(status: 408, message: "セッション期限切れです。再ログインをしてください。") - end + is_admin_books = UserAccount.checkAdmin(id) & session[:is_admin] + checkSession(id) begin user = UserAccount.getUser(id) @id = id @username = user.full_name - @book_info = BookManager.getBookCollect(isbn, id) + @book_info = is_admin_books ? BookManager.getBook(isbn) : + BookManager.getBookCollect(isbn, id) @update_f = book_update_f - @is_admin = UserAccount.checkAdmin(id); + @is_admin = UserAccount.checkAdmin(id) + @is_admin_books = is_admin_books rescue UserAccount::NotFoundInstanceError raise WebError.new(status: 404, message: "ユーザ情報が存在しません。") end @@ -410,31 +441,15 @@ class WebGui < Sinatra::Base post '/book_regist' do id = session[:userId] book_update_f = session[:book_update_f] - book_info = Hash.new - - if (id == nil) - raise WebError.new(status: 408, message: "セッション期限切れです。再ログインをしてください。") - end - - # 書影の新規登録があるかを確認 - image_f = false - if (params[:cover_base64] != nil) - image_f = true - end + checkSession(id) + is_admin_books = UserAccount.checkAdmin(id) & session[:is_admin] - params.each do |key, value| - case key - when 'summary', 'book_rank', 'cover_base64', 'cover_file', 'mime_type' then - # 対象キーは書籍情報ではないので飛す - next - end - if ((key == "cover_uri") && (image_f)) - # 登録するイメージがあるのでURIの登録は飛す - next - end - book_info[key.to_sym] = value - end + # 書影の新規登録があるかを確認 + image_f = (params[:cover_base64] != nil) + # 書籍の設定情報を選出 + book_info = makeBookInfo(params) + begin isbn = book_info[:isbn] @@ -446,30 +461,24 @@ class WebGui < Sinatra::Base BookManager.createBook(book_info) end - cover_image = Hash.new + cover_image = setBookImage(image_f, params, book_info[:cover_uri]) + # 書影情報の更新 - if (image_f) - cover_image[:data] = Base64.decode64(params[:cover_base64]) - cover_image[:mime_type] = params[:mime_type] - end - if ((not image_f) && (book_info[:cover_uri] == nil) && - (params[:cover_file] != nil)) - cover_image = getUploadData(params[:cover_file]) - end if (cover_image[:data] != nil) image_hash = BookManager.addBookCover(isbn, cover_image) cover_uri = '/book_image/' + image_hash BookManager.updateBook(isbn, cover_uri: cover_uri) end - # 蔵書情報の更新 - summary = params[:summary]; book_rank = params[:book_rank] - if (book_update_f) - BookManager.updateBookCollect(isbn, id, summary, book_rank) - else - BookManager.createBookCollect(isbn, id, summary, book_rank) - end - + if (!is_admin_books) + # 蔵書情報の更新 + summary = params[:summary]; book_rank = params[:book_rank] + if (book_update_f) + BookManager.updateBookCollect(isbn, id, summary, book_rank) + else + BookManager.createBookCollect(isbn, id, summary, book_rank) + end + end rescue BookManager::NotFoundInstanceError, BookManager::AlreadyInstanceError raise WebError.new(status: 400, message: "蔵書情報の登録に失敗しました。", refs: "/book_regist") @@ -483,9 +492,7 @@ class WebGui < Sinatra::Base # @raise [WebError] 登録済みの蔵書だった。 post '/book_search_isbn' do id = session[:userId] - if (id == nil) - raise WebError.new(status: 408, message: "セッション期限切れです。再ログインをしてください。") - end + checkSession(id) isbn = params[:isbn] begin @@ -493,23 +500,23 @@ class WebGui < Sinatra::Base @id = id @username = user.full_name @book_info = BookManager.searchISBN(isbn, id) - @is_admin = UserAccount.checkAdmin(id); + @is_admin = UserAccount.checkAdmin(id) rescue UserAccount::NotFoundInstanceError raise WebError.new(status: 404, message: "ユーザ情報が存在しません。") rescue BookManager::AlreadyInstanceError raise WebError.new(status: 409, message: "あなたの蔵書にすでに該当する書籍があります。", refs: "/book_regist") + rescue BookManager::FailedGetInstance + raise WebError.new(status: 500, message: "ISBNによる書籍検索に失敗しました。", refs: "/book_regist") end goPage :book_regist end - # ISBN からの書籍情報を検索する + # 書影データのアップロード # @post_param [Hash] cover_file イメージファイル情報 # @raise [WebError] セッションの期限切れ post '/book_upload_cover' do id = session[:userId] - if (id == nil) - raise WebError.new(status: 408, message: "セッション期限切れです。再ログインをしてください。") - end + checkSession(id) begin user = UserAccount.getUser(id) @@ -520,7 +527,7 @@ class WebGui < Sinatra::Base @id = id @username = user.full_name @book_info = params - @is_admin = UserAccount.checkAdmin(id); + @is_admin = UserAccount.checkAdmin(id) cover_image = getUploadData(params[:cover_file]) if (cover_image != nil) base64 = Base64.encode64(cover_image[:data]) @@ -534,6 +541,7 @@ class WebGui < Sinatra::Base # 書影の表示 + # @path_param [String] hash 書影のハッシュキー get '/book_image/:hash' do cache_control :public, :must_revalidate, :max_age => 30 image_hash = params[:hash] @@ -548,6 +556,7 @@ class WebGui < Sinatra::Base end # 蔵書情報の取得ページ + # @path_param [String] isbn 取得対象のISBN # @raise [WebError] セッションの期限切れ # @raise [WebError] ユーザID不正 # @raise [WebError] 蔵書情報がない @@ -555,18 +564,16 @@ class WebGui < Sinatra::Base cache_control :public, :must_revalidate, :max_age => 30 id = session[:userId] isbn = params[:isbn] - if (id == nil) - raise WebError.new(status: 408, message: "セッション期限切れです。再ログインをしてください。") - end + checkSession(id) - begin - end begin user = UserAccount.getUser(id) + is_admin_books = UserAccount.checkAdmin(id) & session[:is_admin] @id = id @username = user.full_name - @book_info = BookManager.getBookCollect(isbn, id) - @is_admin = UserAccount.checkAdmin(id); + @book_info = is_admin_books ? BookManager.getBook(isbn) : + BookManager.getBookCollect(isbn, id) + @is_admin = UserAccount.checkAdmin(id) rescue UserAccount::NotFoundInstanceError raise WebError.new(status: 404, message: "ユーザ情報が存在しません。") rescue BookManager::NotFoundInstanceError @@ -578,22 +585,27 @@ class WebGui < Sinatra::Base # 蔵書一覧の取得(トリガページ) # @raise [WebError] セッションの期限切れ get '/book_list' do - id = session[:userId] - if (id == nil) - raise WebError.new(status: 408, message: "セッション期限切れです。再ログインをしてください。") - end + checkSession(session[:userId]) session[:list_status] = {position: {start: 0, step: 10}, find_status: nil} + session[:is_admin] = false + redirect to('/book_list/main') + end + + # 管理用の蔵書一覧の取得(トリガページ) + # @raise [WebError] セッションの期限切れ + get '/book_admin' do + checkSession(session[:userId]) + session[:list_status] = {position: {start: 0, step: 10}, + find_status: nil} + session[:is_admin] = true redirect to('/book_list/main') end # 蔵書一覧の取得(表示件数変更ページ) # @raise [WebError] セッションの期限切れ post '/book_list/change_step' do - id = session[:userId] - if (id == nil) - raise WebError.new(status: 408, message: "セッション期限切れです。再ログインをしてください。") - end + checkSession(session[:userId]) step = params[:step].to_i session[:list_status][:position] = {start: 0, step: step} redirect to('/book_list/main') @@ -602,10 +614,7 @@ class WebGui < Sinatra::Base # 蔵書一覧の取得(次ページ) # @raise [WebError] セッションの期限切れ post '/book_list/next' do - id = session[:userId] - if (id == nil) - raise WebError.new(status: 408, message: "セッション期限切れです。再ログインをしてください。") - end + checkSession(session[:userId]) step = session[:list_status][:position][:step] session[:list_status][:position][:start] += step redirect to('/book_list/main') @@ -614,10 +623,7 @@ class WebGui < Sinatra::Base # 蔵書一覧の取得(前ページ) # @raise [WebError] セッションの期限切れ post '/book_list/before' do - id = session[:userId] - if (id == nil) - raise WebError.new(status: 408, message: "セッション期限切れです。再ログインをしてください。") - end + checkSession(session[:userId]) step = session[:list_status][:position][:step] session[:list_status][:position][:start] -= step redirect to('/book_list/main') @@ -627,10 +633,7 @@ class WebGui < Sinatra::Base # 蔵書一覧の取得(検索後) # @raise [WebError] セッションの期限切れ post '/book_list/find' do - id = session[:userId] - if (id == nil) - raise WebError.new(status: 408, message: "セッション期限切れです。再ログインをしてください。") - end + checkSession(session[:userId]) find_status = session[:list_status][:find_status] find_key = params[:kind].to_sym find_value = params[:find_value] @@ -647,10 +650,7 @@ class WebGui < Sinatra::Base # 蔵書一覧の取得 (蔵書情報取得から) # @raise [WebError] セッションの期限切れ get '/book_list/fromInfo' do - id = session[:userId] - if (id == nil) - raise WebError.new(status: 408, message: "セッション期限切れです。再ログインをしてください。") - end + checkSession(session[:userId]) list_status = session[:list_status] if (list_status == nil) session[:list_status] = {position: {start:0, step: 10}, @@ -664,20 +664,24 @@ class WebGui < Sinatra::Base get '/book_list/main' do id = session[:userId] list_status = session[:list_status] - if (id == nil) - raise WebError.new(status: 408, message: "セッション期限切れです。再ログインをしてください。") - end + checkSession(id) begin user = UserAccount.getUser(id) + is_admin_books = UserAccount.checkAdmin(id) & session[:is_admin] @id = id @username = user.full_name - @is_admin = UserAccount.checkAdmin(id); + @is_admin = UserAccount.checkAdmin(id) + @is_admin_books = is_admin_books rescue UserAccount::NotFoundInstanceError raise WebError.new(status: 404, message: "ユーザ情報が存在しません。") end position = list_status[:position] find_status = list_status[:find_status] - @book_list, @full_size = BookManager.narrowBookOfId(id, position[:start], position[:step], find_status) + @book_list, @full_size = is_admin_books ? + BookManager.narrowBooks(position[:start], + position[:step], find_status) : + BookManager.narrowBookOfId(id, position[:start], + position[:step], find_status) @start = position[:start] @step = position[:step] if (@book_list == nil) @@ -694,15 +698,15 @@ class WebGui < Sinatra::Base cache_control :public, :must_revalidate, :max_age => 30 id = session[:userId] isbn = params[:isbn] - if (id == nil) - raise WebError.new(status: 408, message: "セッション期限切れです。再ログインをしてください。") - end + checkSession(id) begin user = UserAccount.getUser(id) + is_admin_books = UserAccount.checkAdmin(id) & session[:is_admin] @id = id @username = user.full_name - @book_info = BookManager.getBookCollect(isbn, id) - @is_admin = UserAccount.checkAdmin(id); + @book_info = is_admin_books ? BookManager.getBook(isbn) : + BookManager.getBookCollect(isbn, id) + @is_admin = UserAccount.checkAdmin(id) rescue UserAccount::NotFoundInstanceError raise WebError.new(status: 404, message: "ユーザ情報が存在しません。") rescue BookManager::NotFoundInstanceError @@ -717,9 +721,11 @@ class WebGui < Sinatra::Base get '/book_delete/result/:isbn' do cache_control :public, :must_revalidate, :max_age => 30 id = session[:userId] + is_admin_books = UserAccount.checkAdmin(id) & session[:is_admin] isbn = params[:isbn] begin - BookManager.deleteBookCollect(isbn, id) + is_admin_books ? BookManager.deleteBook(isbn) : + BookManager.deleteBookCollect(isbn, id) rescue UserAccount::NotFoundInstanceError raise WebError.new(status: 404, message: "ユーザ情報が存在しません。") rescue BookManager::NotFoundInstanceError @@ -742,7 +748,7 @@ class WebGui < Sinatra::Base status e.params[:status] @refs = e.params[:refs] @error_message = e.params[:message] - haml :error + goPage :error end end diff --git a/sinatra/app/models/books_db.rb b/sinatra/app/models/books_db.rb index 79febdd..c4bc726 100644 --- a/sinatra/app/models/books_db.rb +++ b/sinatra/app/models/books_db.rb @@ -19,7 +19,7 @@ class Book < ActiveRecord::Base # 正規表現によるレコード探索 # @param [Symbol] key カラム名 # @param [String] pattern 正規表現パターン - # @return [Array] 対象となるユーザ一覧 + # @return [Array] 対象となる書籍一覧 def self.with_regexp(key, pattern) column = columns_hash[key.to_s].name where("`#{table_name}`.`#{column}` REGEXP ?", pattern) @@ -31,7 +31,7 @@ class BookCollection < ActiveRecord::Base # 正規表現によるレコード探索 # @param [Symbol] key カラム名 # @param [String] pattern 正規表現パターン - # @return [Array] 対象となるユーザ一覧 + # @return [Array] 対象となる蔵書一覧 def self.with_regexp(key, pattern) column = columns_hash[key.to_s].name where("`#{table_name}`.`#{column}` REGEXP ?", pattern) @@ -43,7 +43,7 @@ class BookCover < ActiveRecord::Base # 正規表現によるレコード探索 # @param [Symbol] key カラム名 # @param [String] pattern 正規表現パターン - # @return [Array] 対象となるユーザ一覧 + # @return [Array] 対象となる書影一覧 def self.with_regexp(key, pattern) column = columns_hash[key.to_s].name where("`#{table_name}`.`#{column}` REGEXP ?", pattern) @@ -55,7 +55,7 @@ class BookFull < ActiveRecord::Base # 正規表現によるレコード探索 # @param [Symbol] key カラム名 # @param [String] pattern 正規表現パターン - # @return [Array] 対象となるユーザ一覧 + # @return [Array] 対象となるユーザ書籍一覧 def self.with_regexp(key, pattern) column = columns_hash[key.to_s].name where("`#{table_name}`.`#{column}` REGEXP ?", pattern) @@ -207,6 +207,9 @@ class BookManager def self.getHashOfOpenBD(isbn) client = HTTPClient.new res = client.get("http://api.openbd.jp/v1/get", isbn: isbn) + if (res.status != HTTP::Status::OK) + raise FailedGetInstance + end books = JSON.parse(res.body) if (books.size > 1) @@ -262,10 +265,13 @@ class BookManager # @return [Hash] 書籍情報 def self.getHashOfNDL(isbn) client = HTTPClient.new - res = client.get("http://iss.ndl.go.jp/api/sru", + res = client.get("https://iss.ndl.go.jp/api/sru", {'operation' => 'searchRetrieve', 'query' => "isbn=#{isbn}", 'recordSchema' => 'dcndl'}) + if (res.status != HTTP::Status::OK) + raise FailedGetInstance + end library_param = REXML::Document.new(res.body) book_num = library_param.elements['//searchRetrieveResponse/numberOfRecords'].text.to_i if (book_num < 1) @@ -280,7 +286,7 @@ class BookManager end parsons = getParsonsFromNDL(creators) book_hash = { - search_type: SEARCH_ON_OPENBD, + search_type: SEARCH_ON_OPENNDL, isbn: isbn, title: book.elements['dcterms:title'] != nil ? book.elements['dcterms:title'].text : nil, volume: book.elements['dcndl:volume/rdf:Description/rdf:value'] != nil ? book.elements['dcndl:volume/rdf:Description/rdf:value'].text.gsub(/[^\d]/, "").to_i : nil, @@ -303,6 +309,9 @@ class BookManager def self.getHashOfGBS(isbn) client = HTTPClient.new res = client.get("https://www.googleapis.com/books/v1/volumes", q: "isbn:#{isbn}") + if (res.status != HTTP::Status::OK) + raise FailedGetInstance + end books = JSON.parse(res.body) if (books["totalItems"] > 1) @@ -426,6 +435,7 @@ class BookManager # 書籍探索(ISBN) # @param [String] isbn_str 探索対象のISBN + # @param [Integer] user_id 探索対象のユーザID # @return [Hash] 書籍情報 def self.searchISBN(isbn_str, user_id) isbn = toIsbn(isbn_str) @@ -480,8 +490,7 @@ class BookManager # @return [Book] def self.getBook(isbn_str) isbn = toIsbn(isbn_str) - - book = Book.find_by(isbn) + book = Book.find_by(isbn: isbn) if (book == nil) # 対象の書籍情報がなかった。 raise NotFoundInstanceError @@ -578,7 +587,17 @@ class BookManager end end - # ユーザでの絞り込み + #全書籍取得 + # @param [Integer] start 表示開始位置 + # @param [Integer] step 表示数 + # @param [Hash] find_keys 検索対象 + # @return [Array] 絞り込んだ書籍情報 + def self.narrowBooks(start, step, find_keys) + return narrowBookList(Book.all, + start, step, find_keys); + end + + #ユーザでの絞り込み # @param [Integer] user_id ユーザID # @param [Integer] start 表示開始位置 # @param [Integer] step 表示数 @@ -586,8 +605,17 @@ class BookManager # @return [Array] 絞り込んだ書籍情報 def self.narrowBookOfId(user_id, start, step, find_keys) # ユーザに関連する書籍の一覧を取得する。 - find_books = BookFull.where(user_id: user_id) + return narrowBookList(BookFull.where(user_id: user_id), + start, step, find_keys); + end + #指定範囲の書籍一覧を取得 + # @param [Array] find_books 探索の一覧 + # @param [Integer] start 表示開始位置 + # @param [Integer] step 表示数 + # @param [Hash] find_keys 検索対象 + # @return [Array] 絞り込んだ書籍情報 + def self.narrowBookList(find_books, start, step, find_keys) # 条件に合う書籍を検索 if (find_keys != nil) find_keys.each do |key, value| @@ -598,7 +626,7 @@ class BookManager reg_value = $~[1] find_books = find_books.with_regexp(key, reg_value) else - find_books = books.where(key => value) + find_books = find_books.where(key => value) end end end @@ -607,7 +635,6 @@ class BookManager narrow_books = find_books.limit(step).offset(start) return narrow_books, find_books.size end - #蔵書情報の取得 # @param [String] isbn_str 取得対象のISBN # @param [Integer] user_id 取得対象のユーザID diff --git a/sinatra/app/views/book_regist.haml b/sinatra/app/views/book_regist.haml index 194bc9d..6572204 100644 --- a/sinatra/app/views/book_regist.haml +++ b/sinatra/app/views/book_regist.haml @@ -1,8 +1,6 @@ - # encoding: utf-8 -- is_admin = @is_admin -- id = @id -- book_info = @book_info -- update_f = @update_f +- is_admin = @is_admin; id = @id; book_info = @book_info +- update_f = @update_f; is_admin_books = @is_admin_books - if book_info[:title] != nil - isbn_regist_f = true - else @@ -14,9 +12,12 @@ 本書の情報を修正することができます。 - else 新規に蔵書の情報を登録することができます。 + +- if !isbn_regist_f + .message + 「ISBN探索」を押下すると、該当する本の情報が取得できます。 + (取得できない場合は、更新されません) -.message - 「ISBN探索」を押下すると、該当する本の情報が取得できます。 .message 「書影Upload」を押下すると、本の書影を登録できます。 @@ -31,7 +32,7 @@ %span ISBN: %input{ :name => 'isbn', :type => 'text', :class => 'input_text', :id => 'isbn', :value => book_info[:isbn], :readonly => isbn_regist_f, :required => isbn_regist_f} - %input{ :type => 'submit', :class => 'side_button', :value => 'ISBN探索', :formaction => '/book_search_isbn' } + %input{ :type => 'submit', :class => 'side_button', :value => 'ISBN探索', :formaction => '/book_search_isbn', :disabled => isbn_regist_f} .item %label{ :for => 'title' } @@ -125,18 +126,20 @@ - if book_info[:cover_base64] != nil %input{ :name => 'cover_base64', :type => 'hidden', :value => book_info[:cover_base64]} %input{ :name => 'mime_type', :type => 'hidden', :value => book_info[:mime_type]} - .item - %label{ :for => 'summary' } - %span - 概説: - %textarea{ :name => 'summary', :class => 'input_text', :rows => '5', :cols => '35', :id => 'summary'} - #{book_info[:summary]} + + - if !is_admin_books + .item + %label{ :for => 'summary' } + %span + 概説: + %textarea{ :name => 'summary', :class => 'input_text', :rows => '5', :cols => '35', :id => 'summary'} + #{book_info[:summary]} - .item - %label{ :for => 'book_rank' } - %span - 評価: - %input{:name => 'book_rank', :type => 'text', :class => 'input_text', :id => 'book_rank', :value => book_info[:book_rank], :pattern => '[0-5]'} + .item + %label{ :for => 'book_rank' } + %span + 評価: + %input{:name => 'book_rank', :type => 'text', :class => 'input_text', :id => 'book_rank', :value => book_info[:book_rank], :pattern => '[0-5]'} .buttons %hr -- 2.19.2