@@ -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