/// <summary>
        /// Method posting an incoming delete of a user into the MS Graph API.
        /// </summary>
        /// <param name="rabbitMQUser">Deleted user sent by the RabbitMQ message broker</param>
        public void AttendanceDelete(RabbitMQAttendance rabbitMQAttendance)
        {
            RestClient  restClient  = new RestClient();
            RestRequest restRequest = new RestRequest();

            CalendarAttendees attendees       = new CalendarAttendees();
            Master            masterOrganiser = masterDBServices.GetGraphIdFromMUUID(rabbitMQAttendance.UUID);
            Master            masterUserId    = masterDBServices.GetGraphIdFromMUUID(rabbitMQAttendance.AttendeeId);
            Master            masterEventId   = masterDBServices.GetGraphIdFromMUUID(rabbitMQAttendance.EventId);

            //graph attendees ophalen uit event in graph
            BearerToken        = services.RefreshAccesToken();
            restClient.BaseUrl = new Uri($"https://graph.microsoft.com/v1.0/users/{masterOrganiser.SourceEntityId}/events/{masterEventId.SourceEntityId}");
            restRequest.AddHeader("Authorization", BearerToken.Token_type + " " + BearerToken.Access_token);
            var response = restClient.Get(restRequest);

            attendees = JsonConvert.DeserializeObject <CalendarAttendees>(response.Content);
            string email = services.GetEmailFromUUID(masterUserId.SourceEntityId);

            attendees.Attendees = (from attendee in attendees.Attendees
                                   where attendee.EmailAddress.Address != email
                                   select attendee).ToList();

            var json = JsonConvert.SerializeObject(attendees);

            restRequest.AddJsonBody(json);
            Console.WriteLine(json);

            response = restClient.Patch(restRequest);

            Console.WriteLine(response.StatusCode);
        }
        public void ConvertAttendanceToXML()
        {
            RabbitMQAttendance rabbitMQAttendance = new RabbitMQAttendance();

            rabbitMQAttendance.Header.Method = XMLMethod.CREATE;
            rabbitMQAttendance.UUID          = new Guid("dcf8fa36-c07d-11eb-8529-0242ac130003");
            rabbitMQAttendance.CreatorId     = new Guid("bf2d8864-c07d-11eb-8529-0242ac130003");
            rabbitMQAttendance.AttendeeId    = new Guid("c6365d02-c07d-11eb-8529-0242ac130003");
            rabbitMQAttendance.EventId       = new Guid("dcf8fa36-c07d-11eb-8529-0242ac130003");
            string xml = xmlController.ConvertObjectToXML(rabbitMQAttendance);

            Assert.IsTrue(xmlController.XSDValidatie(xml, "Attendance"));
        }
        public void AttendanceCreate(RabbitMQAttendance rabbitMQAttendance)
        {
            RestClient  restClient  = new RestClient();
            RestRequest restRequest = new RestRequest();

            CalendarAttendees attendees       = new CalendarAttendees();
            CalendarAttendee  attendee        = new CalendarAttendee();
            Master            masterOrganiser = masterDBServices.GetGraphIdFromMUUID(rabbitMQAttendance.CreatorId);
            Master            masterUserId    = masterDBServices.GetGraphIdFromMUUID(rabbitMQAttendance.AttendeeId);
            Master            masterEventId   = masterDBServices.GetGraphIdFromMUUID(rabbitMQAttendance.EventId);

            //graph attendees ophalen uit event in graph
            BearerToken        = services.RefreshAccesToken();
            restClient.BaseUrl = new Uri($"https://graph.microsoft.com/v1.0/users/{masterOrganiser.SourceEntityId}/events/{masterEventId.SourceEntityId}");
            restRequest.AddHeader("Authorization", BearerToken.Token_type + " " + BearerToken.Access_token);
            var response = restClient.Get(restRequest);

            attendees = JsonConvert.DeserializeObject <CalendarAttendees>(response.Content);
            //graph user ophalen en in attendee lijst attendees steken
            User user = services.GetUserFromUUID(masterUserId.SourceEntityId);

            attendee.EmailAddress.Name    = user.DisplayName;
            attendee.EmailAddress.Address = user.UserPrincipalName;
            attendee.Type = "required";
            attendees.Attendees.Add(attendee);

            var json = JsonConvert.SerializeObject(attendees);

            restRequest.AddJsonBody(json);
            Console.WriteLine(json);

            response = restClient.Patch(restRequest);

            Console.WriteLine(response.StatusCode);

            if (response.StatusCode == System.Net.HttpStatusCode.OK)
            {
                //newid voor MasterDB = organiserId + userId + eerste 32 chars van eventId + laatste 32 chars van eventId
                string newId = masterOrganiser.SourceEntityId + "%" + masterUserId.SourceEntityId + "%" + masterEventId.SourceEntityId.Substring(0, 32) + "%" + masterEventId.SourceEntityId.Substring(masterEventId.SourceEntityId.Length - 32, 32);
                masterDBServices.CreateEntity(rabbitMQAttendance.UUID, newId, "Attendance");
                //masterDBService.ChangeEntityVersion(rabbitMQUser.UUID);
            }
        }
        static void Main(string[] args)
        {
            /* --- Instatiate the Services --- */
            Services          OfficeService     = new Services();
            UserService       userService       = new UserService();
            EventService      eventService      = new EventService();
            AttendanceService attendanceService = new AttendanceService();
            XmlController     xmlController     = new XmlController();


            /* --- Instatiate timer and trigger sendHeartbeat every second --- */
            HeartBeat heartBeat = new HeartBeat();

            Timer timer = new Timer();

            timer.Elapsed += new ElapsedEventHandler(heartBeat.sendHeartBeat);
            timer.Interval = 1000;
            timer.Start();

            /* --- Instatiate List of CalendarEvents --- */
            List <CalendarEvent> events = new List <CalendarEvent>();

            /* --- Instatiate connection with RabbitMQ --- */
            Uri    rabbitMQUri         = new Uri(Constant.RabbitMQConnectionUrl);
            string queueEventName      = Constant.RabbitMQEventQueueName;
            string queueUserName       = Constant.RabbitMQUserQueueName;
            string queueAttendanceName = Constant.RabbitMQAttendanceQueueName;

            var factory = new ConnectionFactory
            {
                Uri = rabbitMQUri
            };

            using var connection = factory.CreateConnection();
            using var channel    = connection.CreateModel();

            /* --- Instatiate consumer for event, user & attendance queue --- */
            var eventConsumer      = new EventingBasicConsumer(channel);
            var userConsumer       = new EventingBasicConsumer(channel);
            var attendanceConsumer = new EventingBasicConsumer(channel);


            /* --- Execute valid User changes (create, dupdate, delete) from other systems (Canvas, Frontend) )--- */
            // User
            userConsumer.Received += (sender, e) =>
            {
                var message = e.Body.ToArray();
                var xml     = Encoding.UTF8.GetString(message);
                Console.WriteLine(xml);
                if (xmlController.XSDValidatie(xml, "user"))
                {
                    RabbitMQUser result = xmlController.ConvertXMLtoObject <RabbitMQUser>(xml);
                    Console.WriteLine(result.Header.Method);
                    Console.WriteLine(result.Header.Source);
                    Console.WriteLine(result.UUID);
                    Console.WriteLine(result.EntityVersion);
                    Console.WriteLine(result.LastName);
                    Console.WriteLine(result.FirstName);
                    Console.WriteLine(result.EmailAddress);
                    Console.WriteLine(result.Role);
                    if (result.Header.Source != XMLSource.PLANNING)
                    {
                        switch (result.Header.Method)
                        {
                        case XMLMethod.CREATE:
                            userService.UserCreate(result);
                            break;

                        case XMLMethod.UPDATE:
                            userService.UserUpdate(result);
                            break;

                        case XMLMethod.DELETE:
                            userService.UserDelete(result);
                            break;
                        }
                    }
                }
            };

            /* --- Execute valid Event changes (create, dupdate, delete) from other systems (Canvas, Frontend) --- */
            //Event
            eventConsumer.Received += (sender, e) =>
            {
                var message = e.Body.ToArray();
                var xml     = Encoding.UTF8.GetString(message);
                Console.WriteLine(xml);
                if (xmlController.XSDValidatie(xml, "event"))
                {
                    RabbitMQEvent result = xmlController.ConvertXMLtoObject <RabbitMQEvent>(xml);
                    Console.WriteLine(result.Header.Method);
                    Console.WriteLine(result.Header.Source);
                    Console.WriteLine(result.UUID);
                    Console.WriteLine(result.EntityVersion);
                    Console.WriteLine(result.Title);
                    Console.WriteLine(result.OrganiserId);
                    Console.WriteLine(result.Description);
                    Console.WriteLine(result.Start);
                    Console.WriteLine(result.End);
                    if (result.Header.Source != XMLSource.PLANNING)
                    {
                        switch (result.Header.Method)
                        {
                        case XMLMethod.CREATE:
                            eventService.EventCreate(result);
                            break;

                        case XMLMethod.UPDATE:
                            eventService.EventUpdate(result);
                            break;

                        case XMLMethod.DELETE:
                            eventService.EventDelete(result);
                            break;
                        }
                    }
                }
            };

            /* --- Execute valid Attendance changes (create, delete) from other systems (Canvas, Frontend) --- */
            //Attendance
            attendanceConsumer.Received += (sender, e) =>
            {
                var message = e.Body.ToArray();
                var xml     = Encoding.UTF8.GetString(message);
                Console.WriteLine(xml);
                if (xmlController.XSDValidatie(xml, "attendance"))
                {
                    RabbitMQAttendance result = xmlController.ConvertXMLtoObject <RabbitMQAttendance>(xml);
                    Console.WriteLine(result.Header.Method);
                    Console.WriteLine(result.UUID);
                    Console.WriteLine(result.CreatorId);
                    Console.WriteLine(result.AttendeeId);
                    Console.WriteLine(result.EventId);
                    switch (result.Header.Method)
                    {
                    case XMLMethod.CREATE:
                        attendanceService.AttendanceCreate(result);
                        break;

                    case XMLMethod.DELETE:
                        attendanceService.AttendanceDelete(result);
                        break;
                    }
                }
            };


            /* --- Consume the event, user & attendance queues --- */
            channel.BasicConsume(queueUserName, true, userConsumer);
            channel.BasicConsume(queueEventName, true, eventConsumer);
            channel.BasicConsume(queueAttendanceName, true, attendanceConsumer);
            Console.ReadLine();
        }