1- # grpc_service/service/reservation_service.rb
21# frozen_string_literal: true
32
43require 'reservation/reservation_pb'
54require 'reservation/service_pb'
65require 'reservation/service_services_pb'
76
8- # gRPC 실행 환경에서는 Rails autoload가 적용되지 않으므로 직접 경로 지정
97require_relative '../../app/models/concerns/current'
108require_relative '../../app/models/concerns/simulated_user_roles'
119
@@ -15,17 +13,11 @@ module Reservation
1513 module V1
1614 class ReservationServiceHandler < Bannote ::Studyroomservice ::Reservation ::V1 ::ReservationService ::Service
1715
18- # 예약 생성
16+ # =========================================
17+ # 1. 예약 생성
18+ # =========================================
1919 def create_reservation ( request , _call )
20- unless SimulatedUserRoles . has_authority? (
21- Current . user_id ,
22- SimulatedUserRoles ::AUTHORITY_LEVELS [ "student" ]
23- )
24- _call . abort (
25- GRPC ::Core ::StatusCodes ::PERMISSION_DENIED ,
26- details : "Permission denied: Requires Student authority or higher to create a reservation."
27- )
28- end
20+ authorize! ( "student" )
2921
3022 reservation = ::Reservation . new (
3123 room_id : request . room_id ,
@@ -35,53 +27,36 @@ def create_reservation(request, _call)
3527 end_time : request . end_time . to_time ,
3628 purpose : request . purpose ,
3729 priority : request . priority ,
38- created_by : Current . user_id # 임시값, 인증 시스템 연동 필요
30+ created_by : Current . user_id
3931 )
4032
41- if reservation . save
42- Bannote ::Studyroomservice ::Reservation ::V1 ::CreateReservationResponse . new (
43- reservation : reservation_to_proto ( reservation )
44- )
45- else
46- _call . abort (
47- GRPC ::Core ::StatusCodes ::INVALID_ARGUMENT ,
48- details : reservation . errors . full_messages . join ( ", " )
49- )
50- end
33+ reservation . save!
34+ Bannote ::Studyroomservice ::Reservation ::V1 ::CreateReservationResponse . new (
35+ reservation : reservation_to_proto ( reservation )
36+ )
37+ rescue ActiveRecord ::RecordInvalid => e
38+ raise GRPC ::BadStatus . new ( GRPC ::Core ::StatusCodes ::INVALID_ARGUMENT , e . message )
5139 end
5240
53- # 예약 조회
41+ # =========================================
42+ # 2. 예약 조회
43+ # =========================================
5444 def get_reservation ( request , _call )
55- unless SimulatedUserRoles . has_authority? (
56- Current . user_id ,
57- SimulatedUserRoles ::AUTHORITY_LEVELS [ "student" ]
58- )
59- _call . abort (
60- GRPC ::Core ::StatusCodes ::PERMISSION_DENIED ,
61- details : "Permission denied: Requires Student authority or higher to view a reservation."
62- )
63- end
45+ authorize! ( "student" )
6446
6547 reservation = ::Reservation . find_by! ( code : request . code )
66-
6748 Bannote ::Studyroomservice ::Reservation ::V1 ::GetReservationResponse . new (
6849 reservation : reservation_to_proto ( reservation )
6950 )
7051 rescue ActiveRecord ::RecordNotFound
71- _call . abort ( GRPC ::Core ::StatusCodes ::NOT_FOUND , details : "Reservation not found" )
52+ raise GRPC :: BadStatus . new ( GRPC ::Core ::StatusCodes ::NOT_FOUND , "Reservation not found" )
7253 end
7354
74- # 예약 목록 조회
55+ # =========================================
56+ # 3. 예약 목록 조회
57+ # =========================================
7558 def list_reservations ( request , _call )
76- unless SimulatedUserRoles . has_authority? (
77- Current . user_id ,
78- SimulatedUserRoles ::AUTHORITY_LEVELS [ "student" ]
79- )
80- _call . abort (
81- GRPC ::Core ::StatusCodes ::PERMISSION_DENIED ,
82- details : "Permission denied: Requires Student authority or higher to list reservations."
83- )
84- end
59+ authorize! ( "student" )
8560
8661 reservations = ::Reservation . all
8762 reservations = reservations . where ( room_id : request . room_id ) if request . room_id . present?
@@ -94,20 +69,17 @@ def list_reservations(request, _call)
9469 )
9570 end
9671
97- # 예약 수정
72+ # =========================================
73+ # 4. 예약 수정
74+ # =========================================
9875 def update_reservation ( request , _call )
9976 reservation = ::Reservation . find_by! ( code : request . code )
10077 user_authority_level = SimulatedUserRoles . get_authority_level ( Current . user_id )
10178
102- if user_authority_level >= SimulatedUserRoles ::AUTHORITY_LEVELS [ "assistant" ]
103- # Assistant or higher can update any reservation
104- elsif user_authority_level >= SimulatedUserRoles ::AUTHORITY_LEVELS [ "student" ] &&
105- reservation . created_by == Current . user_id
106- # Student 이상이면 자신이 만든 예약 수정 가능
107- else
108- _call . abort (
79+ unless can_modify? ( reservation , user_authority_level )
80+ raise GRPC ::BadStatus . new (
10981 GRPC ::Core ::StatusCodes ::PERMISSION_DENIED ,
110- details : "Permission denied: Insufficient authority to update this reservation."
82+ "Permission denied: Insufficient authority to update this reservation."
11183 )
11284 end
11385
@@ -119,46 +91,66 @@ def update_reservation(request, _call)
11991 end_time : request . end_time . to_time ,
12092 purpose : request . purpose ,
12193 priority : request . priority ,
122- updated_by : Current . user_id # 임시값, 인증 시스템 연동 필요
94+ updated_by : Current . user_id
12395 )
12496
12597 Bannote ::Studyroomservice ::Reservation ::V1 ::UpdateReservationResponse . new (
12698 reservation : reservation_to_proto ( reservation )
12799 )
128-
129100 rescue ActiveRecord ::RecordNotFound
130- _call . abort ( GRPC ::Core ::StatusCodes ::NOT_FOUND , details : "Reservation not found" )
101+ raise GRPC :: BadStatus . new ( GRPC ::Core ::StatusCodes ::NOT_FOUND , "Reservation not found" )
131102 rescue ActiveRecord ::RecordInvalid => e
132- _call . abort ( GRPC ::Core ::StatusCodes ::INVALID_ARGUMENT , details : e . message )
103+ raise GRPC :: BadStatus . new ( GRPC ::Core ::StatusCodes ::INVALID_ARGUMENT , e . message )
133104 end
134105
135- # 예약 삭제
106+ # =========================================
107+ # 5. 예약 삭제
108+ # =========================================
136109 def delete_reservation ( request , _call )
137110 reservation = ::Reservation . find_by! ( code : request . code )
138111 user_authority_level = SimulatedUserRoles . get_authority_level ( Current . user_id )
139112
140- if user_authority_level >= SimulatedUserRoles ::AUTHORITY_LEVELS [ "assistant" ]
141- # Assistant 이상이면 모두 삭제 가능
142- elsif user_authority_level >= SimulatedUserRoles ::AUTHORITY_LEVELS [ "student" ] &&
143- reservation . created_by == Current . user_id
144- # Student 이상이면 자신이 만든 예약 삭제 가능
145- else
146- _call . abort (
113+ unless can_modify? ( reservation , user_authority_level )
114+ raise GRPC ::BadStatus . new (
147115 GRPC ::Core ::StatusCodes ::PERMISSION_DENIED ,
148- details : "Permission denied: Insufficient authority to delete this reservation."
116+ "Permission denied: Insufficient authority to delete this reservation."
149117 )
150118 end
151119
152- reservation . soft_delete ( deleted_by : Current . user_id )
120+ reservation . update! ( deleted_at : Time . now , deleted_by : Current . user_id )
153121
154122 Bannote ::Studyroomservice ::Reservation ::V1 ::DeleteReservationResponse . new ( success : true )
155-
156123 rescue ActiveRecord ::RecordNotFound
157- _call . abort ( GRPC ::Core ::StatusCodes ::NOT_FOUND , details : "Reservation not found" )
124+ raise GRPC :: BadStatus . new ( GRPC ::Core ::StatusCodes ::NOT_FOUND , "Reservation not found" )
158125 end
159126
127+ # =========================================
128+ # 공통 메서드
129+ # =========================================
160130 private
161131
132+ # 권한 검증 단축 메서드
133+ def authorize! ( min_role )
134+ unless SimulatedUserRoles . has_authority? (
135+ Current . user_id ,
136+ SimulatedUserRoles ::AUTHORITY_LEVELS [ min_role ]
137+ )
138+ raise GRPC ::BadStatus . new (
139+ GRPC ::Core ::StatusCodes ::PERMISSION_DENIED ,
140+ "Permission denied: Requires #{ min_role . capitalize } authority or higher."
141+ )
142+ end
143+ end
144+
145+ # 수정 / 삭제 가능 여부 판정
146+ def can_modify? ( reservation , user_level )
147+ return true if user_level >= SimulatedUserRoles ::AUTHORITY_LEVELS [ "assistant" ]
148+ return true if user_level >= SimulatedUserRoles ::AUTHORITY_LEVELS [ "student" ] &&
149+ reservation . created_by == Current . user_id
150+ false
151+ end
152+
153+ # Reservation → Proto 변환
162154 def reservation_to_proto ( reservation )
163155 Bannote ::Studyroomservice ::Reservation ::V1 ::Reservation . new (
164156 id : reservation . id ,
@@ -172,7 +164,8 @@ def reservation_to_proto(reservation)
172164 priority : reservation . priority ,
173165 created_at : Google ::Protobuf ::Timestamp . new ( seconds : reservation . created_at . to_i ) ,
174166 updated_at : Google ::Protobuf ::Timestamp . new ( seconds : reservation . updated_at . to_i ) ,
175- deleted_at : reservation . deleted_at ? Google ::Protobuf ::Timestamp . new ( seconds : reservation . deleted_at . to_i ) : nil
167+ deleted_at : reservation . deleted_at ? Google ::Protobuf ::Timestamp . new ( seconds : reservation . deleted_at . to_i ) : nil ,
168+ created_by : reservation . created_by
176169 )
177170 end
178171 end
0 commit comments