セッション確認、書籍登録周りのヘルパー化、管理者用書籍情報の操作対応、コメント整理
authorOHASHI, Norikazu <katz@neko-mori.sakura.ne.jp>
Thu, 15 Apr 2021 22:46:11 +0000 (07:46 +0900)
committerOHASHI, Norikazu <katz@neko-mori.sakura.ne.jp>
Thu, 15 Apr 2021 22:46:11 +0000 (07:46 +0900)
.yardopts
cgi/startup.rb
create_table.sql
sinatra/app/controllers/web_gui.rb
sinatra/app/models/books_db.rb
sinatra/app/views/book_regist.haml

index 8df88ff..9fedcb7 100644 (file)
--- 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
 -
index c2c0ba7..b686d21 100644 (file)
@@ -1,4 +1,5 @@
 require 'sinatra'
+# book_server home directory
 APP_HOME='/home/wald-der-katze/sinatra/book_server'
 
 load "#{APP_HOME}/start.rb"
index 5b00dcc..96d8196 100644 (file)
@@ -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)));
index 2417c95..94b7d7d 100644 (file)
@@ -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
 
index 79febdd..c4bc726 100644 (file)
@@ -19,7 +19,7 @@ class Book < ActiveRecord::Base
   # 正規表現によるレコード探索
   # @param [Symbol] key カラム名
   # @param [String] pattern 正規表現パターン
-  # @return [Array<User>] 対象となるユーザ一覧
+  # @return [Array<Book>] 対象となる書籍一覧
   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<User>] 対象となるユーザ一覧
+  # @return [Array<BookCollection>] 対象となる蔵書一覧
   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<User>] 対象となるユーザ一覧
+  # @return [Array<BookCover>] 対象となる書影一覧
   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<User>] 対象となるユーザ一覧
+  # @return [Array<BookFull>] 対象となるユーザ書籍一覧
   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<Hash>] 絞り込んだ書籍情報
+  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<Hash>] 絞り込んだ書籍情報
   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<Books>] find_books 探索の一覧
+  # @param [Integer] start 表示開始位置
+  # @param [Integer] step 表示数
+  # @param [Hash]  find_keys 検索対象
+  # @return [Array<Hash>] 絞り込んだ書籍情報
+  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
index 194bc9d..6572204 100644 (file)
@@ -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
     本書の情報を修正することができます。
   - 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' }
         - 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