Skip to content

Commit 7bdc13a

Browse files
authored
Jnile/microsoft id change (#29)
* temporary store * Msft meeting id changed for reshcedule single * remove empty space * fix lint issues * update shared * Reformat rescheudle request to look for events with iCalUid and user email * Event from owner can be fetched * Update shared
1 parent e7fafb1 commit 7bdc13a

6 files changed

Lines changed: 233 additions & 144 deletions

File tree

api/calendar.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ func parseEventableResp(events []graphmodels.Eventable) ([]CalendarEvent, error)
5757
Created: e.GetCreatedDateTime(),
5858
EndTime: endTime,
5959
Id: e.GetId(),
60+
ICalUId: e.GetICalUId(),
6061
IsCancelled: e.GetIsCancelled(),
6162
JoinURL: joinURL,
6263
Locations: locations,

api/calendar_impl.go

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"go.uber.org/zap"
1313

1414
graphmodels "github.com/microsoftgraph/msgraph-sdk-go/models"
15+
"github.com/microsoftgraph/msgraph-sdk-go/users"
1516
)
1617

1718
// (GET /api/calendar/{userID}).
@@ -135,11 +136,41 @@ func (s Server) GetAPICalendarEvent(w http.ResponseWriter, r *http.Request, para
135136

136137
// Make call to API route and parse events
137138
// Get old meeting data from microsoft
138-
msftMeeting, err := graph.Me().Events().ByEventId(params.MsftID).Get(ctx, nil)
139-
if err != nil {
140-
logger.Error("failed to get meeting data from microsoft", zap.Error(err))
141-
sendError(w, http.StatusBadGateway, "Failed to get meeting data from microsoft")
142-
return
139+
var msftMeeting graphmodels.Eventable
140+
//nolint: nestif // nesting complexity is not too much
141+
if params.IsICalUId {
142+
queryFilter := "iCalUId eq '" + params.MsftID + "'"
143+
144+
// Get old meeting data from microsoft
145+
requestConfig := users.ItemEventsRequestBuilderGetRequestConfiguration{
146+
QueryParameters: &users.ItemEventsRequestBuilderGetQueryParameters{
147+
Filter: &queryFilter,
148+
},
149+
}
150+
151+
var msftMeetingRes graphmodels.EventCollectionResponseable
152+
msftMeetingRes, err = graph.Me().Events().Get(ctx, &requestConfig)
153+
if err != nil {
154+
logger.Error("failed to get meeting data from microsoft", zap.Error(err))
155+
sendError(w, http.StatusBadGateway, "Failed to get meeting data from microsoft")
156+
return
157+
}
158+
159+
if msftMeetingRes != nil && msftMeetingRes.GetValue() != nil &&
160+
len(msftMeetingRes.GetValue()) > 0 {
161+
msftMeeting = msftMeetingRes.GetValue()[0]
162+
} else {
163+
logger.Error("failed to get meeting data from microsoft", zap.Error(err))
164+
sendError(w, http.StatusBadGateway, "Failed to get meeting data from microsoft")
165+
return
166+
}
167+
} else {
168+
msftMeeting, err = graph.Me().Events().ByEventId(params.MsftID).Get(ctx, nil)
169+
if err != nil {
170+
logger.Error("failed to get meeting data from microsoft", zap.Error(err))
171+
sendError(w, http.StatusBadGateway, "Failed to get meeting data from microsoft")
172+
return
173+
}
143174
}
144175

145176
var parsedEvents []CalendarEvent

api/reschedule.go

Lines changed: 39 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
"github.com/avast/retry-go"
1111
msgraphsdkgo "github.com/microsoftgraph/msgraph-sdk-go"
1212
graphmodels "github.com/microsoftgraph/msgraph-sdk-go/models"
13-
"go.uber.org/zap"
13+
"github.com/microsoftgraph/msgraph-sdk-go/users"
1414
)
1515

1616
// durationToISO formats a positive duration in the ISO 8601 format.
@@ -175,6 +175,7 @@ type NewMeetingAndPrefsParams struct {
175175
func createNewMeetingsAndPrefs(ctx context.Context,
176176
body NewMeetingAndPrefsParams,
177177
s Server,
178+
msftID string,
178179
) (database.Meeting, error) {
179180
// Meeting Info does not exist so create a new one
180181
// Check valid user id
@@ -198,11 +199,12 @@ func createNewMeetingsAndPrefs(ctx context.Context,
198199
}
199200

200201
// Create Meeting
202+
201203
meetingParams := database.CreateMeetingParams{
202204
//nolint: gosec // id is unsigned 32 bit int
203205
MeetingPrefID: uint32(meetingPrefID),
204206
OwnerEmail: body.OwnerEmail,
205-
MsftMeetingID: body.MsftMeetingID,
207+
MsftMeetingID: msftID,
206208
}
207209

208210
err = retry.Do(func() error {
@@ -216,7 +218,7 @@ func createNewMeetingsAndPrefs(ctx context.Context,
216218
}
217219

218220
var meeting database.Meeting
219-
meeting, err = s.DB.GetMeetingByMSFTID(ctx, body.MsftMeetingID)
221+
meeting, err = s.DB.GetMeetingByMSFTID(ctx, msftID)
220222
if err != nil {
221223
return database.Meeting{}, err
222224
}
@@ -228,40 +230,57 @@ func processNewMeetingInfo(ctx context.Context,
228230
graph *msgraphsdkgo.GraphServiceClient,
229231
s Server,
230232
msftMeetingID string,
231-
logger zap.SugaredLogger,
233+
userEmail string,
232234
) (database.Meeting, error) {
233235
// Fetch meeting data from microsft
234-
msftMeeting, err := graph.Me().Events().ByEventId(msftMeetingID).Get(ctx, nil)
236+
237+
msftMeeting, err := getUsersEvent(ctx, graph, msftMeetingID)
235238
if err != nil {
236-
logger.Error("failed to get meeting data from microsoft", zap.Error(err))
237-
return database.Meeting{}, err
239+
return database.Meeting{}, fmt.Errorf("failed to get meeting data from microsoft: %w", err)
238240
}
239241

240242
var startTime time.Time
241243
startTime, err = time.Parse(time.RFC3339Nano, *msftMeeting.GetStart().GetDateTime()+"Z")
242244
if err != nil {
243-
logger.Error("failed to get parse start time", zap.Error(err))
244-
return database.Meeting{}, err
245-
}
246-
247-
// Parse email
248-
var email string
249-
if msftMeeting.GetOrganizer().GetEmailAddress() != nil &&
250-
msftMeeting.GetOrganizer().GetEmailAddress().GetAddress() != nil {
251-
email = *msftMeeting.GetOrganizer().GetEmailAddress().GetAddress()
245+
return database.Meeting{}, fmt.Errorf("failed to get parse start time: %w", err)
252246
}
253247

254248
newMeetingParams := NewMeetingAndPrefsParams{
255249
MeetingStartTime: startTime,
256-
OwnerEmail: email,
250+
OwnerEmail: userEmail,
257251
MsftMeetingID: msftMeetingID,
258252
}
259253

260-
meeting, err := createNewMeetingsAndPrefs(ctx, newMeetingParams, s)
254+
meeting, err := createNewMeetingsAndPrefs(ctx, newMeetingParams, s, msftMeetingID)
261255
if err != nil {
262-
logger.Error("failed to get data from new db.Meeting", zap.Error(err))
263-
return database.Meeting{}, err
256+
return database.Meeting{}, fmt.Errorf("failed to get data from new db.Meeting: %w", err)
264257
}
265258

266259
return meeting, nil
267260
}
261+
262+
func getUsersEvent(ctx context.Context,
263+
graph *msgraphsdkgo.GraphServiceClient,
264+
msftID string,
265+
) (graphmodels.Eventable, error) {
266+
queryFilter := "iCalUId eq '" + msftID + "'"
267+
268+
// Get old meeting data from microsoft
269+
requestConfig := users.ItemEventsRequestBuilderGetRequestConfiguration{
270+
QueryParameters: &users.ItemEventsRequestBuilderGetQueryParameters{
271+
Filter: &queryFilter,
272+
},
273+
}
274+
275+
msftMeetingRes, err := graph.Me().Events().Get(ctx, &requestConfig)
276+
if err != nil {
277+
return nil, fmt.Errorf("failed to get meeting data from microsoft: %w", err)
278+
}
279+
280+
if msftMeetingRes != nil && msftMeetingRes.GetValue() != nil &&
281+
len(msftMeetingRes.GetValue()) > 0 {
282+
return msftMeetingRes.GetValue()[0], nil
283+
}
284+
285+
return nil, errors.New("failed to get meeting data from microsoft: returned empty array")
286+
}

api/rescheduling_impl.go

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111

1212
"github.com/SlotifyApp/slotify-backend/database"
1313
"github.com/avast/retry-go"
14+
msgraphsdkgo "github.com/microsoftgraph/msgraph-sdk-go"
1415
graphmodels "github.com/microsoftgraph/msgraph-sdk-go/models"
1516
"go.uber.org/zap"
1617
)
@@ -43,8 +44,17 @@ func (s Server) PostAPIRescheduleCheck(w http.ResponseWriter, r *http.Request) {
4344
return
4445
}
4546

47+
var graphForOwner *msgraphsdkgo.GraphServiceClient
48+
graphForOwner, err = CreateMSFTGraphClient(ctx, s.MSALClient, s.DB, userID)
49+
if err != nil {
50+
logger.Error("failed to create msgraph client", zap.Error(err))
51+
sendError(w, http.StatusBadGateway, "Failed to connect to microsoft graph API")
52+
return
53+
}
54+
4655
// Get old meeting data from microsoft
47-
msftMeeting, err := graph.Me().Events().ByEventId(body.OldMeeting.MsftMeetingID).Get(ctx, nil)
56+
msftMeeting, err := getUsersEvent(ctx, graphForOwner,
57+
body.OldMeeting.MsftMeetingID)
4858
if err != nil {
4959
logger.Error("failed to get meeting data from microsoft", zap.Error(err))
5060
sendError(w, http.StatusBadGateway, "Failed to get meeting data from microsoft")
@@ -126,15 +136,22 @@ func (s Server) PostAPIRescheduleRequestReplace(w http.ResponseWriter, r *http.R
126136
var body ReschedulingRequestBodySchema
127137
var err error
128138
if err = json.NewDecoder(r.Body).Decode(&body); err != nil {
129-
// TODO: Add zap log for body
130139
logger.Error(ErrUnmarshalBody, zap.Error(err))
131140
sendError(w, http.StatusBadRequest, ErrUnmarshalBody.Error())
132141
return
133142
}
134143

135-
graph, err := CreateMSFTGraphClient(ctx, s.MSALClient, s.DB, userID)
144+
// Check owner exists
145+
ownerObj, err := s.DB.GetUserByEmail(ctx, string(body.OldMeeting.OwnerEmail))
136146
if err != nil {
137-
logger.Error("failed to create msgraph client", zap.Error(err))
147+
logger.Error("failed to get owner obj from db: ", zap.Error(err))
148+
sendError(w, http.StatusBadGateway, "owner is not found as a slotify user")
149+
return
150+
}
151+
152+
graph, err := CreateMSFTGraphClient(ctx, s.MSALClient, s.DB, ownerObj.ID)
153+
if err != nil {
154+
logger.Error("failed to create msgraph client with owner id", zap.Error(err))
138155
sendError(w, http.StatusBadGateway, "Failed to connect to microsoft graph API")
139156
return
140157
}
@@ -161,7 +178,8 @@ func (s Server) PostAPIRescheduleRequestReplace(w http.ResponseWriter, r *http.R
161178

162179
if errors.Is(err, sql.ErrNoRows) {
163180
// Meeting info not in db, so create new meeting info
164-
meeting, err = processNewMeetingInfo(ctx, graph, s, body.OldMeeting.MsftMeetingID, *logger)
181+
meeting, err = processNewMeetingInfo(ctx, graph, s,
182+
body.OldMeeting.MsftMeetingID, string(body.OldMeeting.OwnerEmail))
165183
if err != nil {
166184
logger.Error("DB Creation Error: ", zap.Error(err))
167185
sendError(w, http.StatusBadGateway, "Failed to create New Meeting Info")
@@ -249,12 +267,6 @@ func (s Server) PostAPIRescheduleRequestReplace(w http.ResponseWriter, r *http.R
249267
Created: time.Now(),
250268
}
251269

252-
// Get Owner ID
253-
ownerObj, err := s.DB.GetUserByEmail(ctx, meeting.OwnerEmail)
254-
if err != nil {
255-
logger.Error("Failed to get owner user obj: ", zap.Error(err))
256-
}
257-
258270
err = s.NotificationService.SendNotification(ctx, s.Logger, s.DB, []uint32{ownerObj.ID}, notifParam)
259271
if err != nil {
260272
logger.Error("Failed to send notification for reschedule request: ", zap.Error(err))
@@ -283,7 +295,15 @@ func (s Server) PostAPIRescheduleRequestSingle(w http.ResponseWriter, r *http.Re
283295
return
284296
}
285297

286-
graph, err := CreateMSFTGraphClient(ctx, s.MSALClient, s.DB, userID)
298+
// Check owner exists
299+
ownerObj, err := s.DB.GetUserByEmail(ctx, string(body.OwnerEmail))
300+
if err != nil {
301+
logger.Error("failed to get owner obj from db: ", zap.Error(err))
302+
sendError(w, http.StatusBadGateway, "owner is not found as a slotify user")
303+
return
304+
}
305+
306+
graph, err := CreateMSFTGraphClient(ctx, s.MSALClient, s.DB, ownerObj.ID)
287307
if err != nil {
288308
logger.Error("failed to create msgraph client", zap.Error(err))
289309
sendError(w, http.StatusBadGateway, "Failed to connect to microsoft graph API")
@@ -314,7 +334,7 @@ func (s Server) PostAPIRescheduleRequestSingle(w http.ResponseWriter, r *http.Re
314334
meeting, err = s.DB.GetMeetingByMSFTID(ctx, body.MsftMeetingID)
315335

316336
if errors.Is(err, sql.ErrNoRows) {
317-
meeting, err = processNewMeetingInfo(ctx, graph, s, body.MsftMeetingID, *logger)
337+
meeting, err = processNewMeetingInfo(ctx, graph, s, body.MsftMeetingID, string(body.OwnerEmail))
318338
if err != nil {
319339
logger.Error("failed to make new meeting info", zap.Error(err))
320340
sendError(w, http.StatusBadGateway, "Failed to make new meeting info")
@@ -351,12 +371,6 @@ func (s Server) PostAPIRescheduleRequestSingle(w http.ResponseWriter, r *http.Re
351371
Created: time.Now(),
352372
}
353373

354-
// Get Owner ID
355-
ownerObj, err := s.DB.GetUserByEmail(ctx, meeting.OwnerEmail)
356-
if err != nil {
357-
logger.Error("Failed to get owner user obj: ", zap.Error(err))
358-
}
359-
360374
err = s.NotificationService.SendNotification(ctx, s.Logger, s.DB, []uint32{ownerObj.ID}, notifParam)
361375
if err != nil {
362376
logger.Error("Failed to send notification for reschedule request: ", zap.Error(err))

0 commit comments

Comments
 (0)