11package services
22
33import (
4+ "encoding/json"
45 "errors"
6+ "time"
57
68 "github.com/nevzattalhaozcan/forgotten/internal/config"
79 "github.com/nevzattalhaozcan/forgotten/internal/models"
@@ -49,6 +51,7 @@ func (s *EventService) CreateEvent(clubID uint, req *models.CreateEventRequest)
4951 }
5052
5153 response := event .ToResponse ()
54+ _ = s .refreshClubNextMeeting (clubID )
5255 return & response , nil
5356}
5457
@@ -126,18 +129,25 @@ func (s *EventService) UpdateEvent(id uint, req *models.UpdateEventRequest) (*mo
126129 }
127130
128131 response := event .ToResponse ()
132+ _ = s .refreshClubNextMeeting (event .ClubID )
129133 return & response , nil
130134}
131135
132136func (s * EventService ) DeleteEvent (id uint ) error {
133- _ , err := s .eventRepo .GetByID (id )
137+ event , err := s .eventRepo .GetByID (id )
134138 if err != nil {
135139 if errors .Is (err , gorm .ErrRecordNotFound ) {
136140 return errors .New ("event not found" )
137141 }
138142 return err
139143 }
140- return s .eventRepo .Delete (id )
144+ if err := s .eventRepo .Delete (id ); err != nil {
145+ return err
146+ }
147+
148+ _ = s .refreshClubNextMeeting (event .ClubID )
149+
150+ return nil
141151}
142152
143153func (s * EventService ) RSVPToEvent (id uint , rsvp * models.EventRSVP ) error {
@@ -161,3 +171,58 @@ func (s *EventService) GetEventAttendees(eventID uint) ([]models.EventRSVP, erro
161171 }
162172 return s .eventRepo .GetEventAttendees (eventID )
163173}
174+
175+ func (s * EventService ) refreshClubNextMeeting (clubID uint ) error {
176+ events , err := s .eventRepo .GetClubEvents (clubID )
177+ if err != nil {
178+ return err
179+ }
180+
181+ now := time .Now ()
182+ var next * models.Event
183+ for i := range events {
184+ e := events [i ]
185+ if e .StartTime .Before (now ) {
186+ continue
187+ }
188+ if next == nil || e .StartTime .Before (next .StartTime ) {
189+ next = & e
190+ }
191+ }
192+
193+ club , err := s .clubRepo .GetByID (clubID )
194+ if err != nil {
195+ return err
196+ }
197+
198+ if next == nil {
199+ club .NextMeeting = nil
200+ return s .clubRepo .Update (club )
201+ }
202+
203+ var loc * string
204+ switch next .EventType {
205+ case models .EventOnline :
206+ if next .OnlineLink != "" {
207+ l := next .OnlineLink
208+ loc = & l
209+ }
210+ default :
211+ if next .Location != "" {
212+ l := next .Location
213+ loc = & l
214+ }
215+ }
216+
217+ topic := next .Title
218+ nm := models.NextMeeting {
219+ Date : & next .StartTime ,
220+ Location : loc ,
221+ Topic : & topic ,
222+ }
223+ if b , merr := json .Marshal (& nm ); merr == nil {
224+ club .NextMeeting = b
225+ }
226+
227+ return s .clubRepo .Update (club )
228+ }
0 commit comments