@@ -135,94 +135,6 @@ func (service *SendScheduleService) Delete(
135135 return service .repository .Delete (ctx , userID , scheduleID )
136136}
137137
138- // ResolveScheduledSendTime returns the next allowed send time based on the schedule windows and timezone.
139- func (service * SendScheduleService ) ResolveScheduledSendTime (
140- ctx context.Context ,
141- schedule * entities.MessageSendSchedule ,
142- current time.Time ,
143- ) (time.Time , error ) {
144- ctx , span := service .tracer .Start (ctx )
145- defer span .End ()
146-
147- if schedule == nil || ! schedule .IsActive || len (schedule .Windows ) == 0 {
148- return current .UTC (), nil
149- }
150-
151- location , err := time .LoadLocation (schedule .Timezone )
152- if err != nil {
153- return current .UTC (), service .tracer .WrapErrorSpan (
154- span ,
155- stacktrace .Propagate (
156- err ,
157- fmt .Sprintf ("cannot load location [%s]" , schedule .Timezone ),
158- ),
159- )
160- }
161-
162- base := current .In (location )
163- best := time.Time {}
164-
165- for dayOffset := 0 ; dayOffset <= 7 ; dayOffset ++ {
166- day := base .AddDate (0 , 0 , dayOffset )
167- weekday := int (day .Weekday ())
168-
169- for _ , window := range schedule .Windows {
170- if window .DayOfWeek != weekday {
171- continue
172- }
173-
174- start := time .Date (
175- day .Year (),
176- day .Month (),
177- day .Day (),
178- 0 ,
179- 0 ,
180- 0 ,
181- 0 ,
182- location ,
183- ).Add (time .Duration (window .StartMinute ) * time .Minute )
184-
185- end := time .Date (
186- day .Year (),
187- day .Month (),
188- day .Day (),
189- 0 ,
190- 0 ,
191- 0 ,
192- 0 ,
193- location ,
194- ).Add (time .Duration (window .EndMinute ) * time .Minute )
195-
196- var candidateTime time.Time
197-
198- switch {
199- case dayOffset == 0 && base .Before (start ):
200- candidateTime = start
201- case dayOffset == 0 && (base .Equal (start ) || (base .After (start ) && base .Before (end ))):
202- candidateTime = base
203- case dayOffset > 0 :
204- candidateTime = start
205- default :
206- continue
207- }
208-
209- if best .IsZero () || candidateTime .Before (best ) {
210- best = candidateTime
211- }
212- }
213-
214- if ! best .IsZero () {
215- break
216- }
217- }
218-
219- if best .IsZero () {
220- return current .UTC (), nil
221- }
222-
223- return best .UTC (), nil
224- }
225-
226138// sanitizeWindows normalizes and sorts schedule windows by day and start minute.
227139func sanitizeWindows (
228140 windows []entities.MessageSendScheduleWindow ,
0 commit comments