Skip to content

Commit 3d48e3e

Browse files
committed
10/30 postman 테스트중 reservation 만 남았음 이후 proto 전체적으로 수정할 예정
1 parent 29db0be commit 3d48e3e

4 files changed

Lines changed: 228 additions & 230 deletions

File tree

grpc_service/service/reservation_service.rb

Lines changed: 64 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
# grpc_service/service/reservation_service.rb
21
# frozen_string_literal: true
32

43
require 'reservation/reservation_pb'
54
require 'reservation/service_pb'
65
require 'reservation/service_services_pb'
76

8-
# gRPC 실행 환경에서는 Rails autoload가 적용되지 않으므로 직접 경로 지정
97
require_relative '../../app/models/concerns/current'
108
require_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

Comments
 (0)