Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
730d3ef
change db
touyamayusuke Nov 18, 2023
a4f7858
wip
touyamayusuke Nov 18, 2023
afc5871
Merge pull request #1 from CODEBASE-Okinawa/dbcreate-
touyamayusuke Nov 18, 2023
78a36e3
change seed
touyamayusuke Nov 18, 2023
43e0eec
Merge pull request #2 from CODEBASE-Okinawa/seedschange
touyamayusuke Nov 18, 2023
219e3eb
start coding
koikeasuka Nov 18, 2023
f0d2831
Modify: admin book new
koikeasuka Nov 18, 2023
63abece
Merge pull request #4 from CODEBASE-Okinawa/change_book_new
koikeasuka Nov 18, 2023
986efb4
リクエスト一覧画面を追加
kamenrider10 Nov 19, 2023
ec9a97a
Merge pull request #5 from CODEBASE-Okinawa/request1
kamenrider10 Nov 19, 2023
a8df5d0
Add: API controller routes
koikeasuka Nov 19, 2023
3d7e33d
Modify: API controller view
koikeasuka Nov 19, 2023
d877476
Modify: API controller
koikeasuka Nov 19, 2023
3861b5d
Modify: delete partial view
koikeasuka Nov 19, 2023
4aa303b
Merge pull request #6 from CODEBASE-Okinawa/add_admin_book_api_contro…
koikeasuka Nov 19, 2023
19153a6
Modify: book register view
koikeasuka Nov 19, 2023
1aa9d31
Modify: Book register controller
koikeasuka Nov 19, 2023
7e644d3
Merge pull request #7 from CODEBASE-Okinawa/add_data_transfer
koikeasuka Nov 19, 2023
81446f5
requests
touyamayusuke Nov 19, 2023
3e493db
Merge pull request #9 from CODEBASE-Okinawa/request3
touyamayusuke Nov 19, 2023
f7083a5
request sidebar add
touyamayusuke Nov 20, 2023
78d80fa
Merge pull request #10 from CODEBASE-Okinawa/request3
touyamayusuke Nov 20, 2023
c02649e
add image_url column toBooks
touyamayusuke Nov 20, 2023
8859fa2
Merge pull request #11 from CODEBASE-Okinawa/request3
touyamayusuke Nov 20, 2023
95ec555
book image add
touyamayusuke Nov 21, 2023
2021051
new update
touyamayusuke Nov 23, 2023
934d786
Merge pull request #12 from CODEBASE-Okinawa/branch
touyamayusuke Nov 23, 2023
c71f00a
request登録きのう
kamenrider10 Nov 24, 2023
69dadeb
Merge branch 'main' into requests3
kamenrider10 Nov 24, 2023
ca63f7b
Merge pull request #13 from CODEBASE-Okinawa/requests3
kamenrider10 Nov 24, 2023
dea189d
Add: rubocop and slack-notifer
koikeasuka Nov 25, 2023
4081e3f
Merge pull request #14 from CODEBASE-Okinawa/add_gemfile
koikeasuka Nov 25, 2023
8a606f8
Add: Slack notification
koikeasuka Nov 25, 2023
a3789e3
Merge pull request #15 from CODEBASE-Okinawa/add_slack_notify
koikeasuka Nov 25, 2023
1ff20fe
Add: rubocop command
koikeasuka Nov 25, 2023
3d7558a
Merge pull request #16 from CODEBASE-Okinawa/mod_readme
koikeasuka Nov 25, 2023
3cb8519
本登録画面更新
touyamayusuke Nov 25, 2023
0a66bfa
Merge pull request #17 from CODEBASE-Okinawa/branch
touyamayusuke Nov 25, 2023
91e1fe6
Amazonへのリダイレクト
kamenrider10 Nov 25, 2023
9687d16
Merge pull request #18 from CODEBASE-Okinawa/requests3
kamenrider10 Nov 25, 2023
5cfa88e
Add: request flag
koikeasuka Nov 26, 2023
42ed223
Clean: request controller refactoring
koikeasuka Nov 26, 2023
022b556
Merge pull request #19 from CODEBASE-Okinawa/add_request_purchase_button
koikeasuka Nov 26, 2023
3ca769b
start coding
koikeasuka Nov 26, 2023
a740a10
Modify: admin book index image
koikeasuka Nov 26, 2023
70ea241
Fix: バグ修正
koikeasuka Nov 26, 2023
6c1c735
Modify: book show image
koikeasuka Nov 26, 2023
5705310
Fix: バグ修正
koikeasuka Nov 26, 2023
6477e35
Modify: reservation index show image
koikeasuka Nov 26, 2023
90cf313
Merge pull request #20 from CODEBASE-Okinawa/mod_image_view
koikeasuka Nov 26, 2023
61d730b
start coding
koikeasuka Nov 26, 2023
977d52f
Add: user_id column to requests
koikeasuka Nov 26, 2023
af3a3ec
Add: request userリレーション
koikeasuka Nov 26, 2023
1bb182d
Add: user_id to create method
koikeasuka Nov 26, 2023
3387865
Add: request purchased notification mail
koikeasuka Nov 26, 2023
6f9b0cb
requestする本のステータス
kamenrider10 Nov 26, 2023
98752f8
()
aayaa2610 Nov 26, 2023
070f1fd
Merge pull request #24 from CODEBASE-Okinawa/add_request_purchase_not…
koikeasuka Nov 26, 2023
77396d9
Merge pull request #25 from CODEBASE-Okinawa/works2
aayaa2610 Nov 26, 2023
0479f43
Merge branch 'main' into request6
koikeasuka Nov 26, 2023
62ec17d
Merge pull request #26 from CODEBASE-Okinawa/request6
koikeasuka Nov 26, 2023
de69c82
ApplicationRecordのstatusモデルを削除 requestにstatus_userとして追加
kamenrider10 Nov 26, 2023
1f8452c
Merge pull request #27 from CODEBASE-Okinawa/request7
koikeasuka Nov 26, 2023
4975a0a
add lending MailDeliveryJob
touyamayusuke Nov 26, 2023
3f119a4
Merge pull request #28 from CODEBASE-Okinawa/branch
touyamayusuke Nov 26, 2023
8853f2b
Fix: no method
koikeasuka Nov 26, 2023
e0d350b
Merge pull request #29 from CODEBASE-Okinawa/mod_request_error2
koikeasuka Nov 26, 2023
133ebdf
【変更】リクエスト登録画面CSS
aayaa2610 Nov 26, 2023
9ac049e
Merge pull request #30 from CODEBASE-Okinawa/works5
aayaa2610 Nov 26, 2023
532091d
【軽微な修正】リクエスト登録画面CSS
aayaa2610 Nov 26, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -55,11 +55,14 @@ gem "sassc-rails"

gem "faker", "2.21.0"

# Use to notify for Slack
gem 'slack-notifier'

group :development, :test do
# See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem
gem "debase"
gem "debug", platforms: %i[mri mingw x64_mingw]
gem "ruby-debug-ide"
# gem "ruby-debug-ide"
end

group :development do
Expand All @@ -76,6 +79,8 @@ group :development do
gem "solargraph"
gem "dockerfile-rails", ">= 1.2"
gem 'letter_opener_web'
gem 'rubocop', require: false
gem 'rubocop-rails', require: false
end

group :test do
Expand Down
12 changes: 9 additions & 3 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -240,8 +240,10 @@ GEM
unicode-display_width (>= 2.4.0, < 3.0)
rubocop-ast (1.24.1)
parser (>= 3.1.1.0)
ruby-debug-ide (0.7.3)
rake (>= 0.8.1)
rubocop-rails (2.22.1)
activesupport (>= 4.2.0)
rack (>= 1.1)
rubocop (>= 1.33.0, < 2.0)
ruby-progressbar (1.11.0)
rubyzip (2.3.2)
sassc (2.4.0)
Expand All @@ -256,6 +258,7 @@ GEM
rexml (~> 3.2, >= 3.2.5)
rubyzip (>= 1.2.2, < 3.0)
websocket (~> 1.0)
slack-notifier (2.4.0)
solargraph (0.48.0)
backport (~> 1.2)
benchmark
Expand Down Expand Up @@ -315,6 +318,7 @@ GEM
PLATFORMS
aarch64-linux
arm64-darwin-21
arm64-darwin-23
x86_64-darwin-21
x86_64-linux

Expand All @@ -336,9 +340,11 @@ DEPENDENCIES
rails (~> 7.0.4, >= 7.0.4.2)
rbs (~> 2.8.4)
rbs_rails
ruby-debug-ide
rubocop
rubocop-rails
sassc-rails
selenium-webdriver
slack-notifier
solargraph
sprockets-rails
stimulus-rails
Expand Down
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@ $ docker compose up app
$ docker compose exec app bash
```

### rubocopを実行する
コミット前に以下のコマンドを実行
```
$ docker-compose exec app bundle exec rubocop
```

## 2. VSCode devcontainer で構築する

Expand Down
4 changes: 4 additions & 0 deletions app/assets/stylesheets/application.css
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,7 @@
*= require_tree .
*= require_self
*/



/* app/assets/stylesheets/custom_styles.css */
51 changes: 49 additions & 2 deletions app/controllers/admin/books_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,17 @@ def index

def new
@book = Book.new
@result_book = params[:result_book]
end

def create
@book = Book.new(book_params)
@book.image.attach(params[:book][:image])

# 画像のURLがあればそれを利用
if params[:book][:image_url].present?
@book.image_url = params[:book][:image_url]
end

if @book.save
flash[:success] = "本を登録しました"
redirect_to admin_books_path
Expand All @@ -20,9 +26,50 @@ def create
end
end


def search
require 'net/http'
require 'uri'

isbn10 = params[:isbn]
title = params[:title]
query = if isbn10.present?
"isbn:#{isbn10}"
elsif title.present?
title
else
""
end

uri = URI.parse('https://www.googleapis.com/books/v1/volumes')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
response = http.get("#{uri}?q=#{URI.encode_www_form_component(query)}")
hash = JSON.parse(response.body)

if hash["items"].present? && hash["items"].is_a?(Array) && hash["items"].first.present?
@result_book = hash["items"].first["volumeInfo"]

if @book.present? && @result_book["imageLinks"] && @result_book["imageLinks"]["thumbnail"]
@book.image_url = @result_book["imageLinks"]["thumbnail"]
@book.save
end

redirect_to action: 'new', result_book: @result_book
else
@result_book = nil
redirect_to action: 'new', result_book: @result_book
end
end






private

def book_params
params.require(:book).permit(:title, :image)
params.require(:book).permit(:title, :image, :isbn)
end
end
16 changes: 16 additions & 0 deletions app/controllers/admin/requests_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
class Admin::RequestsController < ApplicationController
def index
@request = Request.where(status: false)
end

def update
request = Request.find_by(id: params[:id])
if request.update(status: true)
RequestPurchasedNotificationJob.perform_later(request)
flash[:success] = "リクエスト本を購入処理が成功しました"
else
flash[:failed] = "リクエスト本の購入処理に失敗しました"
end
redirect_to requests_path
end
end
1 change: 1 addition & 0 deletions app/controllers/books_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ def show
@reservations = @book.reservations.where("reservation_at >= ?", Time.now).order(reservation_at: :asc)
end


private

def redirect_to_admin_books
Expand Down
20 changes: 17 additions & 3 deletions app/controllers/lendings_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,18 @@ def update

def create
@lending = Book.find(params[:book_id]).lendings.build(lending_params(params))
return unless @lending.save

flash[:success] = "貸出が完了しました"
redirect_to lendings_path
if @lending.save
# reservation_remind_dateメソッドで返された日付にメールを送るように、ジョブにキューイング。
MailDeliveryJob.set(wait_until: return_remind_date(@lending.return_at)).perform_later(@lending)

flash[:success] = "貸出が完了しました"
redirect_to lendings_path
else
# 保存が失敗した場合の処理
flash[:error] = "貸出の処理に失敗しました"
render :new
end
end

private
Expand All @@ -45,3 +53,9 @@ def redirect_lendings
end
end
end

# 返却のリマインド通知を送る、日付を返す
def return_remind_date(returmn_at)
# 貸出して、返却日の3日前の日付をセット
return_at.days_ago(3).to_time
end
41 changes: 41 additions & 0 deletions app/controllers/requests_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
class RequestsController < ApplicationController
WEBHOOK_URL = 'https://hooks.slack.com/services/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'

def new
end

def search
require 'net/http'
require 'uri'
uri = URI.parse('https://www.googleapis.com/books/v1/volumes')
text = params[:search]


# 検索窓がブランクの時
if text.present?
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
response = http.get("#{uri}?q=search:#{text}")
@google_books = JSON.parse(response.body)
else
@google_books = nil
end
end

def create
@bookRequest = Request.new
#モデルに書いたsave_with_authorメソッドを実行する
if @bookRequest.save_with_request(params[:title], params[:systemid], params[:book][:authors], current_user&.id)
notifier.ping("本のリクエストがありました。ISNB:#{params[:systemid]}")
redirect_to books_path, success: t('.success')
else
flash.now[:danger] = t('.fail')
end
end

private

def notifier
Slack::Notifier.new(WEBHOOK_URL, username: 'Codebase Book')
end
end
2 changes: 2 additions & 0 deletions app/helpers/admin/request_helper.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
module Admin::RequestHelper
end
17 changes: 17 additions & 0 deletions app/helpers/application_helper.rb
Original file line number Diff line number Diff line change
@@ -1,2 +1,19 @@
module ApplicationHelper
# サムネイル取得 volumeInfoの中のimageLinksの中のthumbnail
def google_book_thumbnail(google_book)
google_book['volumeInfo']['imageLinks'].nil? ? 'sample.jpg' : google_book['volumeInfo']['imageLinks']['thumbnail']
end

#thumbnailはネストしている配置となっているのでdigを使って取り出す
#また画像のリンクがhttpとなっているためgsubを使いhttpsに変更する。変更した値をbookImageに代入する
def set_google_book_params(google_book)
google_book['volumeInfo']['bookImage'] = google_book.dig('volumeInfo', 'imageLinks', 'thumbnail')&.gsub("http", "https")

# 10桁を取得するように修正した
if google_book['volumeInfo']['industryIdentifiers']&.select { |h| h["type"].include?("ISBN_10") }.present?
google_book['volumeInfo']['systemid'] = google_book['volumeInfo']['industryIdentifiers']&.find { |h| h["type"].include?("ISBN_10") }.fetch("identifier", nil)
end
#volumeInfoの中が必要な項目のみになるようsliceを使って絞りこむ
google_book['volumeInfo'].slice('title', 'authors', 'publishedDate', 'infoLink', 'bookImage', 'systemid', 'canonicalVolumeLink')
end
end
8 changes: 8 additions & 0 deletions app/jobs/request_purchased_notification_job.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
class RequestPurchasedNotificationJob < ApplicationJob
queue_as :default

def perform(request_data)
# リクエスト本が購入されたらリクエスト者に通知を送る
RequestPurchasedMailer.with(request: request_data).request_purchased_notification.deliver_later
end
end
10 changes: 10 additions & 0 deletions app/mailers/request_purchased_mailer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
class RequestPurchasedMailer < ApplicationMailer
default from: 'admin@example.com'

def request_purchased_notification
@request = params[:request]
@user = @request.user
@url = 'http://localhost:3000'
mail(to: @user.email, subject: 'リクエストいただいた本を購入いたしました')
end
end
4 changes: 4 additions & 0 deletions app/models/application_record.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
class ApplicationRecord < ActiveRecord::Base
primary_abstract_class

def self.exists_with_isbn?(isbn)
exists?(isbn: isbn)
end
end
2 changes: 1 addition & 1 deletion app/models/book.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ class Book < ApplicationRecord

delegate :created_at, :return_at, :user, to: :lending

def status(user)
def status_user(user)
user_id = user&.id
lending_status = lend_active.any?{ |lending| lending.user_id == user_id }
reservation_status = reservation_active.any?{ |reservation| reservation.user_id == user_id }
Expand Down
32 changes: 32 additions & 0 deletions app/models/request.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
class Request < ApplicationRecord
belongs_to :user
def save_with_request(title, systemid, authors, user_id)
ActiveRecord::Base.transaction do
puts title
self.title = title
self.author = authors.first.strip
self.isbn = systemid
self.user_id = user_id
self.save!
end
true
rescue StandardError
false
end

def status_user(user)
user_id = user&.id
lending_status = lend_active.any?{ |lending| lending.user_id == user_id }
reservation_status = reservation_active.any?{ |reservation| reservation.user_id == user_id }
if lending_status && user_id.present?
"lending"
elsif reservation_status && user_id.present?
"reserved"
elsif lend_active.present?
"lent"
else
"available"
end
end

end
1 change: 1 addition & 0 deletions app/models/user.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@ class User < ApplicationRecord

has_many :lendings, dependent: :destroy
has_many :reservations, dependent: :destroy
has_many :requests, dependent: :destroy
end
31 changes: 31 additions & 0 deletions app/views/admin/books/_search_result.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<h3 class="text-xl pt-20">検索結果</h3>

<%= form_with(model: @book, url: admin_books_path) do |f| %>
<div class="flex">
<div>
<div class="flex-col py-10 space-y-4 space-x-4">
<%= f.label :タイトル%>
<%= f.text_area :title, value: @result_book["title"], readonly: true, class: "border shadow rounded w-80 h-16 break-words" %>
<%= f.hidden_field :isbn, value: @result_book["industryIdentifiers"][0]["identifier"], class: "border" %>
</div>

<% if @result_book["imageLinks"] && @result_book["imageLinks"]["thumbnail"] %>
<%= f.hidden_field :image_url, value: @result_book["imageLinks"]["thumbnail"] %>

<!-- 画像を表示する -->
<div>
<%= image_tag @result_book["imageLinks"]["thumbnail"], class: "mw-full mt-6 items-center justify-center" %>
</div>
<% end %>

<% if Book.exists?(isbn: @result_book["industryIdentifiers"][0]["identifier"]) %>
<!-- データベースにデータがある場合 -->
<p class="w-full mt-6 text-white bg-gray-700 font-medium rounded-lg text-sm px-5 py-2.5 flex items-center justify-center">登録済み</p>

<% else %>
<!-- データベースにデータがない場合 -->
<%= f.submit "本を登録する", class: "w-full mt-6 text-white bg-blue-700 font-medium rounded-lg text-sm px-5 py-2.5" %>
<% end %>
</div>
</div>
<% end %>
Loading