Skip to content

Commit fbec5fa

Browse files
committed
reservation postman 테스트 완료
1 parent f6c8382 commit fbec5fa

1 file changed

Lines changed: 36 additions & 24 deletions

File tree

grpc_service/service/reservation_service.rb

Lines changed: 36 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -47,19 +47,27 @@ def conflict_with_exception?(start_time, end_time, ex)
4747
ex_end_hour, ex_end_min = parse_hhmm(ex.closing_time)
4848

4949
start_before_ex_end = (st_h < ex_end_hour) || (st_h == ex_end_hour && st_m < ex_end_min)
50-
end_after_ex_start = (et_h > ex_start_hour) || (et_h == ex_start_hour && et_m > ex_start_min)
50+
end_after_ex_start = (et_h > ex_start_hour) || (et_h == ex_start_hour && et_m > ex_end_min)
5151

5252
start_before_ex_end && end_after_ex_start
5353
end
5454

55+
# -----------------------------------------------------------
56+
# timestamp → Time(Zoned) 변환 (중복 체크 핵심)
57+
# -----------------------------------------------------------
58+
def to_local_time(ts)
59+
return nil if ts.nil? || ts.seconds.nil?
60+
Time.at(ts.seconds).in_time_zone("Asia/Seoul")
61+
end
62+
5563
# ===========================================================
5664
# 1. 예약 생성
5765
# ===========================================================
5866
def create_reservation(request, _call)
5967
authorize!("student")
6068

61-
start_time = request.start_time&.seconds ? Time.at(request.start_time.seconds) : nil
62-
end_time = request.end_time&.seconds ? Time.at(request.end_time.seconds) : nil
69+
start_time = to_local_time(request.start_time)
70+
end_time = to_local_time(request.end_time)
6371

6472
raise_invalid("start_time is required") unless start_time
6573
raise_invalid("end_time is required") unless end_time
@@ -98,17 +106,23 @@ def create_reservation(request, _call)
98106
user_codes = request.user_codes.to_a
99107
raise_invalid("user_codes cannot be empty") if user_codes.empty?
100108

101-
# user_codes.each do |code|
102-
# raise_invalid("Invalid user_code #{code}") unless ::User.exists?(user_code: code)
103-
# end
109+
# ---------------------------
110+
# 🔥 중복 체크 (완전 정상 버전)
111+
# ---------------------------
112+
overlap = ::Reservation
113+
.where(room_id: room.id)
114+
.where("start_time < ? AND end_time > ?", end_time, start_time)
115+
.exists?
116+
117+
raise_precondition("Reservation time overlaps") if overlap
104118

105119
reservation = ::Reservation.create!(
106120
room_id: request.room_id,
107121
start_time: start_time,
108122
end_time: end_time,
109123
purpose: request.purpose,
110124
priority: request.priority,
111-
status: 1, # 기본 CONFIRMED
125+
status: 1, # CONFIRMED
112126
user_codes: user_codes,
113127
created_by: Current.user_code
114128
)
@@ -119,7 +133,7 @@ def create_reservation(request, _call)
119133
end
120134

121135
# ===========================================================
122-
# 2. 예약 단건 조회
136+
# 2. 단건 조회
123137
# ===========================================================
124138
def get_reservation(request, _call)
125139
authorize!("student")
@@ -135,15 +149,15 @@ def get_reservation(request, _call)
135149
end
136150

137151
# ===========================================================
138-
# 3. 예약 목록 조회
152+
# 3. 목록 조회
139153
# ===========================================================
140154
def list_reservations(request, _call)
141155
authorize!("student")
142156

143157
reservations = ::Reservation.where(deleted_at: nil)
144158
reservations = reservations.where(room_id: request.room_id) if request.room_id.present?
145-
reservations = reservations.where("start_time >= ?", Time.at(request.start_time_after.seconds)) if request.start_time_after&.seconds
146-
reservations = reservations.where("end_time <= ?", Time.at(request.end_time_before.seconds)) if request.end_time_before&.seconds
159+
reservations = reservations.where("start_time >= ?", to_local_time(request.start_time_after)) if request.start_time_after&.seconds
160+
reservations = reservations.where("end_time <= ?", to_local_time(request.end_time_before)) if request.end_time_before&.seconds
147161

148162
ListReservationsResponse.new(
149163
reservations: reservations.map { |r| reservation_to_proto(r) }
@@ -160,15 +174,16 @@ def update_reservation(request, _call)
160174
raise_not_found("Reservation") if reservation.deleted_at.present?
161175
raise_permission("Not allowed") unless can_modify?(Current.user_role)
162176

163-
start_time = request.start_time ? Time.at(request.start_time.seconds) : reservation.start_time
164-
end_time = request.end_time ? Time.at(request.end_time.seconds) : reservation.end_time
177+
start_time = request.start_time ? to_local_time(request.start_time) : reservation.start_time
178+
end_time = request.end_time ? to_local_time(request.end_time) : reservation.end_time
179+
165180
raise_invalid("start_time must be earlier than end_time") if start_time >= end_time
166181

167182
room = ::Room.find_by(id: request.room_id || reservation.room_id)
168183
raise_not_found("Room") unless room
169184
raise_precondition("Cannot reserve a deleted room") if room.deleted_at.present?
170185

171-
# operating hour
186+
# 운영시간
172187
op = ::RoomOperatingHour.find_by(
173188
room_id: room.id,
174189
day_of_week: start_time.wday,
@@ -178,19 +193,16 @@ def update_reservation(request, _call)
178193
raise_precondition("Outside operating hours") unless within_operating_hours?(start_time, end_time, op)
179194

180195
# 중복 체크
181-
overlap = ::Reservation.where(room_id: room.id, deleted_at: nil)
182-
.where("start_time < ? AND end_time > ?", end_time, start_time)
183-
.where.not(id: reservation.id)
184-
.exists?
196+
overlap = ::Reservation
197+
.where(room_id: room.id)
198+
.where("start_time < ? AND end_time > ?", end_time, start_time)
199+
.where.not(id: reservation.id)
200+
.exists?
201+
185202
raise_precondition("Reservation time overlaps") if overlap
186203

187204
# user_codes 업데이트
188-
if request.user_codes.any?
189-
request.user_codes.each do |code|
190-
raise_invalid("Invalid user_code #{code}") unless ::User.exists?(user_code: code)
191-
end
192-
reservation.user_codes = request.user_codes.to_a
193-
end
205+
reservation.user_codes = request.user_codes.to_a if request.user_codes.any?
194206

195207
reservation.update!(
196208
room_id: request.room_id || reservation.room_id,

0 commit comments

Comments
 (0)