require 'logger'
require 'json'
require 'securerandom'
-
+require 'data_uri'
# ユーザアクセス用モデル
require_relative '../models/users_db'
@tokens = TokenManager.instance
end
+ helpers do
+
+ # 更新用の書籍情報を作成する。
+ # @param [Hash] params Postで取得した全パラメータ
+ # @param [Boolean] image_f 書影データの有無
+ # @return [Hash] 更新用書籍情報
+ def makeBookInfo(params)
+ book_info = {}
+ params.each do |key, value|
+ case key
+ when 'summary', 'book_rank', 'cover_data' then
+ # 対象キーは書籍情報ではないので飛す
+ next
+ end
+ book_info[key.to_sym] = value
+ end
+ return book_info
+ end
+
+ # 書影情報の作成
+ # @param [String] cover_data 書影データのData URI scheme(bas64)
+ # @return [Hash] 作成した書影データ
+ def setBookImage(cover_data)
+ cover_image = {}
+ # 書影情報の取得
+ data_uri = URI::Data.new(cover_data)
+ cover_image[:mime_type] = data_uri.content_type
+ cover_image[:data] = data_uri.data
+ return cover_image
+ end
+ end
+
+
+
# ユーザログイン
+ # @path_param [String] version API Version
+ # @example Request body
+ # {
+ # "user_name": "user01",
+ # "password": "password"
+ # }
+
post '/:version/login' do
begin
+ # パラメータ取得
body = JSON.parse(request.body.read)
name = body['user_name']
passwd = body['password']
+
+ # ログイン情報確認
id = @user_account.checkPasswd(name, passwd)
+ # トークン取得
token = @tokens.getToken(id)
logger.info("Get session of book server. id: #{id}, user_name: #{name}, token #{token}")
+
+ # レスポンスボディー作成
response = {:token => token, :id => id}
json response
+
rescue UserAccount::NotFoundInstanceError,
UserAccount::AuthenticationError
- logger.error("Invaild user or password. user_name: #{name}")
- raise WebError.new(:status => 401, :code => 'E01001')
+
+ # 認証失敗
+ raise WebError.new(:status => 401, :code => 'E01001',
+ :message => "Invaild user or password. user_name: #{name}")
+
rescue JSON::ParserError => e
- logger.error("Failed to parse JSON. #{e.message}")
- raise WebError.new(:status => 400, :code => 'E01002')
+
+ # JSONパースエラー
+ raise WebError.new(:status => 400, :code => 'E01002',
+ :message => "Failed to parse JSON. #{e.message}")
end
end
# ユーザーログアウト
+ # @path_param [String] version API Version
+ # @query_param [String] token APIアクセス用トークン
+
delete '/:version/logout' do
begin
+ # トークからユーザーIDの取得
token = params[:token]
@tokens.releseToken(token)
+
logger.info("Logout session of book server. token: #{token}")
response = {}
json response
end
# ユーザ一覧取得
+ # @path_param [String] version API Version
+ # @query_param [String] token APIアクセス用トークン
+ # @example Response Body
+ # [
+ # {
+ # "id": 15,
+ # "user_name": "user01",
+ # "full_name": "Taro Suzuki",
+ # "email": "user01@book-server2.neko-mori.org",
+ # "user_role": 8
+ # }
+ # ]
get '/:version/users' do
begin
+ # トークンからユーザーIDの取得
token = params[:token]
id = @token.getId(token)
# 管理者権限でなければ利用できない
- raise WebError.new(:status => 403, :code => "E02001") unless
- @user_account.checkRole(id, [User::ROLE_ADMIN])
+ raise WebError.new(:status => 403, :code => "E02001",
+ :message => "User is without authority. userid=#{id}"
+ ) unless @user_account.checkRole(id, [User::ROLE_ADMIN])
+ # ユーザ一覧の取得
users = @user_account.getUserList
+ # レスポンスボディーの生成
response = users.map {|u|
{ :id => u.user_id, :user_name => u.user_name,
:full_name => u.full_name, :email => u.emaiil,
rescue TokenManager::UnknownTokenError,
TokenManager::ExpiredTokenError
- logger.error("Session expired of #{token}")
- raise WebError.new(:status => 408, :code => "E02002")
+
+ # トークン認証失敗
+ raise WebError.new(:status => 408, :code => "E02002",
+ :message => "Session expired of #{token}")
end
end
#ユーザ登録
- put '/:version/users' do
+ # @path_param [String] version API Version
+ # @query_param [String] tonken APIアクセス用トークン
+ # @example Request Body
+ # {
+ # "user_name": "user01",
+ # "full_name": "Taro Suzuki",
+ # "email": "user01@book-server2.neko-mori.org",
+ # "user_role": 8,
+ # "password": "password00"
+ # }
+ post '/:version/users' do
begin
+ # トークンからユーザーIDの取得
token = params[:token]
id = @token.getId(token)
# 管理者権限でなければ利用できない
- raise WebError.new(:status => 403, :code => "E03001") unless
- @user_account.checkRole(id, [User::ROLE_ADMIN, User::ROLE_APPUSE])
-
+ raise WebError.new(:status => 403, :code => "E03001",
+ :message => "User is without authority. userid=#{id}"
+ ) unless @user_account.checkRole(id, [User::ROLE_ADMIN, User::ROLE_APPUSE])
+
+ # リクエストボディのJSONをパースする。
body = JSON.parse(request.body.read)
- create_id = createAccount(body['user_name'], body['full_name'],
+ # ユーザ作成
+ create_id = createAccount(body['user_name'], body['full_name'],
body['emaiil'], body['password'], body['user_role']);
-
+
+ # レスポンスボディーを生成
response={:id => create_id}
json response
rescue TokenManager::UnknownTokenError,
TokenManager::ExpiredTokenError
- logger.error("Session expired of #{token}")
- raise WebError.new(:status => 408, :code => "E03002")
+
+ # トークン認証失敗
+ raise WebError.new(:status => 408, :code => "E03002",
+ :message => "Session expired of #{token}")
+
rescue UserAccount::AlreadyInstanceError
- logger.error("Already exist user_name #{body['user_name']}")
- raise WebError.new(:status => 408, :code => "E03003")
+
+ # すでに同名のユーザーが登録済み
+ logger.error()
+ raise WebError.new(:status => 408, :code => "E03003",
+ :message => "Already exist user_name #{body['user_name']}")
+
rescue JSON::ParserError => e
- logger.error("Failed to parse JSON. #{e.message}")
- raise WebError.new(:status => 400, :code => 'E03004')
+
+ # JSONパースエラー
+ logger.error()
+ raise WebError.new(:status => 400, :code => 'E03004',
+ :message => "Failed to parse JSON. #{e.message}")
end
end
# ユーザ詳細
+ # @path_param [String] version API Version
+ # @path_param [String] id 取得対象のユーザーID
+ # @query_param [String] token APIアクセス用トークン
+ # @example Response Body
+ # {
+ # "id": 15,
+ # "user_name": "user01",
+ # "full_name": "Taro Suzuki",
+ # "email": "user01@book-server2.neko-mori.org",
+ # "user_role": 8
+ # }
get '/:version/users/:id' do
begin
+ #パラメータ取得
token = params[:token]
read_id = params[:id]
+ # トークンからユーザーIDの取得
id = @token.getId(token)
- raise WebError.new(:status => 403, :code => "E04001") if
- !@user_account.checkRole(id, [User::ROLE_ADMIN]) && id != read_id
-
+ # 管理者権限かログインしているユーザでなければ利用できない
+ raise WebError.new(:status => 403, :code => "E04001",
+ :message => "User is without authority. userid=#{id}"
+ ) if !@user_account.checkRole(id, [User::ROLE_ADMIN]) && id != read_id
+
+ # ユーザ情報を取得してレソポンスボディー用の情報に変換
user = @user_account.getUser(id)
response = { :id => user.user_id, :user_name => user.user_name,
:full_name => user.full_name, :email => user.emaiil,
rescue TokenManager::UnknownTokenError,
TokenManager::ExpiredTokenError
- logger.error("Session expired of #{token}")
- raise WebError.new(:status => 408, :code => "E04002")
+
+ # トークン認証失敗
+ raise WebError.new(:status => 408, :code => "E04002",
+ :message => "Session expired of #{token}")
+
rescue UserAccount::NotFoundInstanceError
- logger.error("Not found user. user id: #{update_id}")
- raise WebError.new(:status => 404, :code => "E04003")
+
+ # 対象ユーザーの情報がない
+ raise WebError.new(:status => 404, :code => "E04003",
+ :message => "Not found user. user id: #{update_id}")
end
end
- # ユーザ詳細
+ # ユーザ更新
+ # @path_param [String] version API Version
+ # @path_param [String] id 取得対象のユーザーID
+ # @query_param [String] tonken APIアクセス用トークン
+ # @example Request Body
+ # {
+ # "user_name": "user01",
+ # "full_name": "Taro Suzuki",
+ # "email": "user01@book-server2.neko-mori.org",
+ # "user_role": 8,
+ # "password": "password00",
+ # "orignal_password": "oldPassword"
+ # }
put '/:version/users/:id' do
begin
+ #パラメータ取得
token = params[:token]
update_id = params[:id]
+ # トークンからユーザーIDの取得
id = @token.getId(token)
- raise WebError.new(:status => 403, :code => "E05001") if
- !@user_account.checkRole(id, [User::ROLE_ADMIN]) && id != update_id
-
+ # 管理者権限かログインしているユーザでなければ利用できない
+ raise WebError.new(:status => 403, :code => "E05001",
+ :message => "User is without authority. userid=#{id}"
+ ) if !@user_account.checkRole(id, [User::ROLE_ADMIN]) && id != update_id
body = JSON.parse(request.body.read)
- raise WebError.new(:status => 401, :code => "E05002") if
- id == update_id && !checkPasswd!(id, body['orignal_password'])
+ # パスワード更新で元パスワードが異なる
+ raise WebError.new(:status => 401, :code => "E05002",
+ :message => "Authentication failed. userid=#{id}") if
+ !@user_account.checkPasswdOfId(id, body['orignal_password'])
params = { :passwd => body['password'], :user_name => body['user_name'],
:full_name => body['full_name'], :email => body['email'] }
rescue TokenManager::UnknownTokenError,
TokenManager::ExpiredTokenError
- logger.error("Session expired of #{token}")
- raise WebError.new(:status => 408, :code => "E05003")
+
+ # トークン認証失敗
+ raise WebError.new(:status => 408, :code => "E05003",
+ :message => "Session expired of #{token}")
+
rescue UserAccount::NotFoundInstanceError
- logger.error("Not found user. user id: #{update_id}")
- raise WebError.new(:status => 404, :code => "E05004")
+
+ # 対象ユーザーの情報がない
+ raise WebError.new(:status => 404, :code => "E05004", :message => "Not found user. user id: #{update_id}")
+
+ rescue JSON::ParserError => e
+
+ # JSONパースエラー
+ raise WebError.new(:status => 400, :code => 'E05005',
+ :message => "Failed to parse JSON. #{e.message}")
end
end
+ # ユーザ削除
+ # @path_param [String] version API Version
+ # @path_param [String] id 取得対象のユーザーID
+ # @query_param [String] tonken APIアクセス用トークン
delete '/:version/users/:id' do
begin
token = params[:token]
delete_id = params[:id]
id = @token.getId(token)
- raise WebError.new(:status => 403, :code => "E06001") unless
- @user_account.checkRole(id, [User::ROLE_ADMIN])
+ # 管理者権限でなければ利用できない
+ raise WebError.new(:status => 403, :code => "E06001",
+ :message => "User is without authority. userid=#{id}"
+ ) unless @user_account.checkRole(id, [User::ROLE_ADMIN])
@user_account.deleteUser(delete_id)
rescue TokenManager::UnknownTokenError,
TokenManager::ExpiredTokenError
- logger.error("Session expired of #{token}")
- raise WebError.new(:status => 408, :code => "E06002")
+
+ # トークン認証失敗
+ raise WebError.new(:status => 408, :code => "E06002",
+ :message => "Session expired of #{token}")
+
rescue UserAccount::NotFoundInstanceError
- logger.error("Not found user. user id: #{update_id}")
- raise WebError.new(:status => 404, :code => "E06003")
+
+ # 対象ユーザーの情報がない
+ raise WebError.new(:status => 404, :code => "E06003",
+ :message => "Not found user. user id: #{update_id}")
end
end
+ # ユーザ所持の蔵書一覧取得
+ # @path_param [String] version API Version
+ # @query_param [String] tonken APIアクセス用トークン
+ # @query_param [String] search 検索条件
+ # @example Response Body
+ # [
+ # {
+ # "isbn": "978412345678",
+ # "title": "羅生門",
+ # "volume": 0,
+ # "author": "芥川龍之介",
+ # "orignal_author": "芥川龍之介",
+ # "illustrator": "奥山誠司",
+ # "publisher": "角川文庫",
+ # "pubdate": "2012/01/20"
+ # }
+ # ]
get '/:version/book_collections' do
begin
token = params[:token]
- search = params[:search]
-
+ search = JSON.perse(params[:search])
id = @token.getId(token)
- raise WebError.new(:status => 403, :code => "E06001") unless
- @user_account.checkRole(id, [User::ROLE_ADMIN])
- book_list, full_size = @book_manager.narrowBooOfId(id,0,0, search)
+ book_list, full_size = @book_manager.narrowBookOfId(id,0,0, search)
if full_size > 0
response = book_list.map { |book|
{
- :isdn => book.isdn, :title => book.title, :volume => book.volume,
+ :isbn => book.isbn, :title => book.title, :volume => book.volume,
:author => book.author, :original_author => book.original_author,
:illustrator => book.illustrator, :publisher => book.publisher,
:pubdate => book.pubdate,
response = []
end
json response
+
+ rescue TokenManager::UnknownTokenError,
+ TokenManager::ExpiredTokenError
+
+ # トークン認証失敗
+ raise WebError.new(:status => 408, :code => "E07002",
+ :message => "Session expired of #{token}")
+
+ rescue JSON::ParserError => e
+
+ # JSONパースエラー
+ raise WebError.new(:status => 400, :code => 'E07003',
+ :message => "Failed to parse JSON. #{e.message}")
+ end
+ end
+
+ # ユーザ所持の書籍の登録
+ # @path_param [String] version API Version
+ # @query_param [String] tonken APIアクセス用トークン
+ # @example Request Body
+ # {
+ # "isbn": "978412345678",
+ # "title": "羅生門",
+ # "volume": 0,
+ # "subtitle": "人間の業",
+ # "series": "芥川全集",
+ # "author": "芥川龍之介",
+ # "orignal_author": "芥川龍之介",
+ # "illustrator": "奥山誠司",
+ # "translator": "ジェイ・ルービン",
+ # "supervisor": "角川春樹",
+ # "publisher": "角川文庫",
+ # "pubdate": "2012/01/20",
+ # "cover_uri": "https://cover.openbd.jp/9784107723369.jpg",
+ # "cover_data": "data:image/png;base64,q/9j/4AAQSkZJRgABAQAAAQABAAD...",
+ # "summary": "羅城門は芥川の書いた作品の...",
+ # "book_rank": 5
+ # }
+ post '/:version/book_collections' do
+ begin
+ token = params[:token]
+ id = @token.getId(token)
+ book = JSON.parse(request.body.read)
+
+ @book_manager.createCollectBook(id, book)
+ response = {}
+ json response
+
+ rescue TokenManager::UnknownTokenError,
+ TokenManager::ExpiredTokenError
+
+ raise WebError.new(:status => 408, :code => "E08001",
+ :message => "Session expired of #{token}")
+
+ rescue BookManager::AlreadyInstanceError
+
+ raise WebError.new(:status => 406, :code => "E08002",
+ :message => "Already exsit target book. isbn=#{isbn}")
+ end
+ end
+
+ # ユーザ所持の蔵書詳細取得
+ # @path_param [String] version API Version
+ # @path_param [String] isbn 対象書籍のISBN
+ # @query_param [String] tonken APIアクセス用トークン
+ # @example Response Body
+ # {
+ # "isbn": "978412345678",
+ # "title": "羅生門",
+ # "volume": 0,
+ # "subtitle": "人間の業",
+ # "series": "芥川全集",
+ # "author": "芥川龍之介",
+ # "orignal_author": "芥川龍之介",
+ # "illustrator": "奥山誠司",
+ # "translator": "ジェイ・ルービン",
+ # "supervisor": "角川春樹",
+ # "publisher": "角川文庫",
+ # "pubdate": "2012/01/20",
+ # "cover_uri": "https://cover.openbd.jp/9784107723369.jpg",
+ # "summary": "羅城門は芥川の書いた作品の...",
+ # "book_rank": 5
+ # }
+ get '/:version/book_collections/:isbn' do
+ begin
+ token = params[:token]
+ isbn = params[:isbn]
+ id = @token.getId(token)
+ response = @book_manager.getBookCollect(isbn, id)
+ json response
+
+ rescue TokenManager::UnknownTokenError,
+ TokenManager::ExpiredTokenError
+
+ # トークン認証失敗
+ raise WebError.new(:status => 408, :code => "E09001",
+ :message => "Session expired of #{token}")
+
+ rescue BookManager::NotFoundInstanceError
+
+ # 対象の書籍が存在しない
+ raise WebError.new(:status => 404, :code => "E09002",
+ :message => "Not found target book. isbn=#{isbn}")
+
+ end
+ end
+
+ # ユーザ所持の蔵書更新
+ # @path_param [String] version API Version
+ # @path_param [String] isbn 対象書籍のISBN
+ # @query_param [String] tonken APIアクセス用トークン
+ # @example Request Body
+ # {
+ # "title": "羅生門",
+ # "volume": 0,
+ # "subtitle": "人間の業",
+ # "series": "芥川全集",
+ # "author": "芥川龍之介",
+ # "orignal_author": "芥川龍之介",
+ # "illustrator": "奥山誠司",
+ # "translator": "ジェイ・ルービン",
+ # "supervisor": "角川春樹",
+ # "publisher": "角川文庫",
+ # "pubdate": "2012/01/20",
+ # "cover_uri": "https://cover.openbd.jp/9784107723369.jpg",
+ # "cover_data": "data:image/png;base64,q/9j/4AAQSkZJRgABAQAAAQABAAD...",
+ # "summary": "羅城門は芥川の書いた作品の...",
+ # "book_rank": 5
+ # }
+ put '/:version/book_collections/:isbn' do
+ begin
+ token = params[:token]
+ isbn = params[:isbn]
+ id = @token.getId(token)
+ book = JSON.parse(request.body.read)
+ @book_manager.updateCollectBook(id, book)
+
+ response = {}
+ json response
+
+ rescue TokenManager::UnknownTokenError,
+ TokenManager::ExpiredTokenError
+
+ #トークン認証失敗
+ raise WebError.new(:status => 408, :code => "E10001",
+ :message => "Session expired of #{token}")
+
+ rescue BookManager::NotFoundInstanceError
+
+ # 対象の書籍が存在しない
+ raise WebError.new(:status => 404, :code => "E10002",
+ :message => "Not found target book. isbn=#{isbn}")
+
+ rescue JSON::ParserError => e
+
+ # JSONパースエラー
+ raise WebError.new(:status => 400, :code => 'E10003',
+ :message => "Failed to parse JSON. #{e.message}")
+ end
+ end
+
+ # ユーザ所持の蔵書詳細取得
+ # @path_param [String] version API Version
+ # @path_param [String] isbn 対象書籍のISBN
+ # @query_param [String] tonken APIアクセス用トークン
+ delete '/:version/book_collections/:isbn' do
+ begin
+ token = params[:token]
+ isbn = params[:isbn]
+ id = @token.getId(token)
+ @book_manager.deleteBookCollect(isbn, id)
+ response = {}
+ json response
+
+ rescue TokenManager::UnknownTokenError,
+ TokenManager::ExpiredTokenError
+
+ # トークン認証失敗
+ raise WebError.new(:status => 408, :code => "E11001",
+ :message => "Session expired of #{token}")
+
+ rescue BookManager::NotFoundInstanceError
+
+ # 対象の書籍が存在しない
+ raise WebError.new(:status => 404, :code => "E11002",
+ :message => "Not found target book. isbn=#{isbn}")
+
end
end
+ # 登録書籍の一覧取得
+ # @path_param [String] version API Version
+ # @query_param [String] tonken APIアクセス用トークン
+ # @query_param [Boolean] nobody 所有者がいない書籍の一覧取得時に true
+ # @example Response Body
+ # [
+ # {
+ # "isbn": "978412345678",
+ # "title": "羅生門",
+ # "volume": 0,
+ # "author": "芥川龍之介",
+ # "orignal_author": "芥川龍之介",
+ # "illustrator": "奥山誠司",
+ # "publisher": "角川文庫",
+ # "pubdate": "2012/01/20"
+ # }
+ # ]
+ get '/:version/books' do
+ begin
+ token = params[:token]
+ nobody = params[:nobody]
+ id = @token.getId(token)
+ # 管理者権限でなければ利用できない
+ raise WebError.new(:status => 403, :code => "E12001",
+ :message => "User is without authority. userid=#{id}"
+ ) unless @user_account.checkRole(id, [User::ROLE_ADMIN])
+ book_list = @book_manager.getBookList(nobody == true)
+ response = book_list.map { |book|
+ {
+ :isbn => book.isbn, :title => book.title, :volume => book.volume,
+ :author => book.author, :original_author => book.original_author,
+ :illustrator => book.illustrator, :publisher => book.publisher,
+ :pubdate => book.pubdate,
+ }
+ }
+ json response
+
+ rescue TokenManager::UnknownTokenError,
+ TokenManager::ExpiredTokenError
+
+ # トークン認証失敗
+ raise WebError.new(:status => 408, :code => "E12002",
+ :message => "Session expired of #{token}")
+
+ end
+ end
+
+ # 登録書籍の詳細取得
+ # @path_param [String] version API Version
+ # @path_param [String] isbn 対象書籍のISBN
+ # @query_param [String] tonken APIアクセス用トークン
+ # @example Response Body
+ # {
+ # "isbn": "978412345678",
+ # "title": "羅生門",
+ # "volume": 0,
+ # "subtitle": "人間の業",
+ # "series": "芥川全集",
+ # "author": "芥川龍之介",
+ # "orignal_author": "芥川龍之介",
+ # "illustrator": "奥山誠司",
+ # "translator": "ジェイ・ルービン",
+ # "supervisor": "角川春樹",
+ # "publisher": "角川文庫",
+ # "pubdate": "2012/01/20",
+ # "cover_uri": "https://cover.openbd.jp/9784107723369.jpg"
+ # }
+ get '/:version/books/:isbn' do
+ begin
+ token = params[:token]
+ isbn = params[:isbn]
+ id = @token.getId(token)
+ # 管理者権限でなければ利用できない
+ raise WebError.new(:status => 403, :code => "E13001",
+ :message => "User is without authority. userid=#{id}"
+ ) unless @user_account.checkRole(id, [User::ROLE_ADMIN])
+ response = @book_manager.getBook(isbn)
+ json response
+
+ rescue TokenManager::UnknownTokenError,
+ TokenManager::ExpiredTokenError
+
+ # トークン認証失敗
+ raise WebError.new(:status => 408, :code => "E13002",
+ :message => "Session expired of #{token}")
+
+ rescue BookManager::NotFoundInstanceError
+
+ # 対象の書籍が存在しない
+ raise WebError.new(:status => 404, :code => "E13002",
+ :message => "Not found target book. isbn=#{isbn}")
+
+ end
+ end
+
+ # 登録書籍の詳細取得
+ # @path_param [String] version API Version
+ # @path_param [String] isbn 対象書籍のISBN
+ # @query_param [String] tonken APIアクセス用トークン
+ # @example Response Body
+ # {
+ # "isbn": "978412345678",
+ # "title": "羅生門",
+ # "volume": 0,
+ # "subtitle": "人間の業",
+ # "series": "芥川全集",
+ # "author": "芥川龍之介",
+ # "orignal_author": "芥川龍之介",
+ # "illustrator": "奥山誠司",
+ # "translator": "ジェイ・ルービン",
+ # "supervisor": "角川春樹",
+ # "publisher": "角川文庫",
+ # "pubdate": "2012/01/20",
+ # "cover_uri": "https://cover.openbd.jp/9784107723369.jpg"
+ # }
+ delete '/:version/books/:isbn' do
+ begin
+ token = params[:token]
+ isbn = params[:isbn]
+ id = @token.getId(token)
+ # 管理者権限でなければ利用できない
+ raise WebError.new(:status => 403, :code => "E13001",
+ :message => "User is without authority. userid=#{id}"
+ ) unless @user_account.checkRole(id, [User::ROLE_ADMIN])
+ response = @book_manager.deleteBook(isbn)
+ json response
+
+ rescue TokenManager::UnknownTokenError,
+ TokenManager::ExpiredTokenError
+
+ # トークン認証失敗
+ raise WebError.new(:status => 408, :code => "E14002",
+ :message => "Session expired of #{token}")
+
+ rescue BookManager::NotFoundInstanceError
+
+ # 対象の書籍が存在しない
+ raise WebError.new(:status => 404, :code => "E14002",
+ :message => "Not found target book. isbn=#{isbn}")
+
+ end
+ end
+
# エラー時のレスポンス生成処理
error WebError do
e = env['sinatra.error']
+ logger.error("Failed Access error. #{e.params}")
status e.params[:status]
- response = {:code => e.params[:code]}
+ response = {:code => e.params[:code], :message => e.params[:message]}
json response
end
end