Beispiel #1
0
        /// <summary>
        /// Method posting an incoming change of an event into the MS Graph API.
        /// </summary>
        /// <param name="rabbitMQEvent">Updated event sent by the RabbitMQ message broker</param>
        public void EventUpdate(RabbitMQEvent rabbitMQEvent)
        {
            //Console.WriteLine("Update van Event nog niet klaar!");
            Master masterUserId  = masterDBService.GetGraphIdFromMUUID(rabbitMQEvent.OrganiserId);
            Master masterEventId = masterDBService.GetGraphIdFromMUUID(rabbitMQEvent.UUID);

            if (masterEventId != null && masterUserId != null && masterDBService.CheckSourceEntityVersionIsHigher(rabbitMQEvent.UUID, rabbitMQEvent.Header.Source))
            {
                RestClient  restClient  = new RestClient();
                RestRequest restRequest = new RestRequest();

                CalendarEvent calendarEvent = new CalendarEvent();
                calendarEvent.Subject = rabbitMQEvent.Title;

                calendarEvent.Start.DateTime   = DateTime.Parse(rabbitMQEvent.Start.ToString());
                calendarEvent.Start.Zone       = "Romance Standard Time";
                calendarEvent.End.DateTime     = DateTime.Parse(rabbitMQEvent.End.ToString());
                calendarEvent.End.Zone         = "Romance Standard Time";
                calendarEvent.Body.ContentType = "text";
                calendarEvent.Body.Content     = rabbitMQEvent.Description;
                calendarEvent.Organizer.EmailAddress.Address = rabbitMQEvent.OrganiserId.ToString();
                string[] location = rabbitMQEvent.Location.Split('%');
                calendarEvent.Location.Address.Street     = location[0] + " " + location[1] + " " + location[2];
                calendarEvent.Location.Address.City       = location[3];
                calendarEvent.Location.Address.PostalCode = location[4];

                /* --- Retrieve a valid accestoken for creating the event in the MS Graph API --- */
                BearerToken = services.RefreshAccesToken();

                /* --- Serialize the event into json and attach it to the rest request --- */
                var json = JsonConvert.SerializeObject(calendarEvent);

                restRequest.AddHeader("Authorization", BearerToken.Token_type + " " + BearerToken.Access_token);
                restRequest.AddJsonBody(json);

                /* --- execute the rest request to post the new event in the MS Graph API --- */
                restClient.BaseUrl = new Uri($"https://graph.microsoft.com/v1.0/users/{masterUserId.SourceEntityId}/events/{masterEventId.SourceEntityId}");
                var response = restClient.Patch(restRequest);

                Console.WriteLine(response.StatusCode);

                if (response.StatusCode == System.Net.HttpStatusCode.OK)
                {
                    masterDBService.ChangeEntityVersion(rabbitMQEvent.UUID);
                }
            }
        }
        public void ConvertEventToXML()
        {
            RabbitMQEvent rabbitMQEvent = new RabbitMQEvent();

            rabbitMQEvent.Header.Method = XMLMethod.CREATE;
            rabbitMQEvent.Header.Source = XMLSource.PLANNING;
            rabbitMQEvent.UUID          = new Guid("bf2d8864-c07d-11eb-8529-0242ac130003");
            rabbitMQEvent.EntityVersion = 1;
            rabbitMQEvent.Title         = "Titel";
            rabbitMQEvent.OrganiserId   = new Guid("bf2d8864-c07d-11eb-8529-0242ac130003");
            rabbitMQEvent.Description   = "Omschrijving";
            rabbitMQEvent.Start         = DateTime.Now;
            rabbitMQEvent.End           = rabbitMQEvent.Start.AddHours(3);
            rabbitMQEvent.Location      = "Rue de la Fontaine%4%%Brussels%1000";
            string xml = xmlController.ConvertObjectToXML(rabbitMQEvent);

            Assert.IsTrue(xmlController.XSDValidatie(xml, "Event"));
        }
        //public CalendarEvent GetEventFromUUID(string uuid)
        //{
        //    CalendarEvent calendarEvent = new CalendarEvent();
        //    RestClient restClient = new RestClient();
        //    RestRequest restRequest = new RestRequest();
        //    BearerToken = RefreshAccesToken();

        //    SetRestRequestHeader(restRequest);

        //    restClient.
        //}



        /* --- EVENT RELATED SERVICES --- */


        /// <summary>
        /// Method to convert MS Graph Calendar data so the message broker RabbitMQ can handle them.
        /// </summary>
        /// <param name="calendarEvent">a calendar event with attributes of MS Graph API</param>
        /// <param name="uuid">the UUID of the event in MS Graph API</param>
        /// <returns>event in xml format, ready to send to the RabbitMQ message queue</returns>
        public string ConvertCalendarEventToRabbitMQEvent(CalendarEvent calendarEvent, string uuid)
        {
            RabbitMQEvent rabbitMQEvent = new RabbitMQEvent();

            //rabbitMQEvent.Header = new RabbitMQHeader();
            rabbitMQEvent.Header.Method = XMLMethod.CREATE;
            //rabbitMQEvent.Header.Source = XMLSource.PLANNING;
            rabbitMQEvent.Header.Source = XMLSource.FRONTEND;                               //tester
            //rabbitMQEvent.UUID = new Guid(uuid);
            rabbitMQEvent.UUID          = new Guid("f9daab25-bccd-11eb-b876-00155d110504"); //tester
            rabbitMQEvent.EntityVersion = 1;
            rabbitMQEvent.Title         = calendarEvent.Subject;
            rabbitMQEvent.OrganiserId   = new Guid(uuid);
            rabbitMQEvent.Description   = "Komt dit door?";
            rabbitMQEvent.Start         = calendarEvent.Start.DateTime;
            rabbitMQEvent.End           = calendarEvent.End.DateTime;

            string straat = ConcatStreetNrAndBus(calendarEvent);

            rabbitMQEvent.Location = straat + "%" + calendarEvent.Location.Address.City + "%" + calendarEvent.Location.Address.PostalCode;
            return(xmlController.ConvertObjectToXML(rabbitMQEvent));
        }
Beispiel #4
0
        /// <summary>
        /// Method posting an incoming delete of an event into the MS Graph API.
        /// </summary>
        /// <param name="rabbitMQEvent">Deleted event sent by the RabbitMQ message broker</param>
        public void EventDelete(RabbitMQEvent rabbitMQEvent)
        {
            //Console.WriteLine("Delete van Event nog niet klaar!");
            Master masterUserId  = masterDBService.GetGraphIdFromMUUID(rabbitMQEvent.OrganiserId);
            Master masterEventId = masterDBService.GetGraphIdFromMUUID(rabbitMQEvent.UUID);

            if (masterEventId != null && masterUserId != null && masterDBService.CheckSourceEntityVersionIsHigher(rabbitMQEvent.UUID, rabbitMQEvent.Header.Source))
            {
                RestClient  restClient  = new RestClient();
                RestRequest restRequest = new RestRequest();
                BearerToken = services.RefreshAccesToken();

                restRequest.AddHeader("Authorization", BearerToken.Token_type + " " + BearerToken.Access_token);
                Console.WriteLine(rabbitMQEvent.UUID);
                restClient.BaseUrl = new Uri($"https://graph.microsoft.com/v1.0/users/{masterUserId.SourceEntityId}/events/{masterEventId.SourceEntityId}");
                var response = restClient.Delete(restRequest);

                Console.WriteLine(response.StatusCode);
                if (response.StatusCode == System.Net.HttpStatusCode.NoContent)
                {
                    masterDBService.ChangeEntityVersion(rabbitMQEvent.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();
        }
Beispiel #6
0
        /// <summary>
        /// Method posting an incoming new event into the MS Graph API.
        /// </summary>
        /// <param name="rabbitMQEvent">New event sent by the RabbitMQ message broker</param>
        public void EventCreate(RabbitMQEvent rabbitMQEvent)
        {
            Master masterUserId = masterDBService.GetGraphIdFromMUUID(rabbitMQEvent.OrganiserId);

            if (masterUserId != null)
            {
                /* --- prepare the restclient --- */
                RestClient  restClient  = new RestClient();
                RestRequest restRequest = new RestRequest();


                /* --- create an MS Graph CalendarEvent and fill the properties with the corresponding values from the received RabbitMQEvent --- */
                CalendarEvent calendarEvent = new CalendarEvent();
                calendarEvent.Subject = rabbitMQEvent.Title;
                //calendarEvent.Start = new CalendarEventTimeZone();

                //if (rabbitMQEvent.Header.Source.ToLower() != "canvas")
                calendarEvent.Start.DateTime = DateTime.Parse(rabbitMQEvent.Start.ToString());
                //else
                //    calendarEvent.Start.DateTime = DateTime.ParseExact(rabbitMQEvent.Start.ToString(), "d/MM/yyyy H:mm:ss", System.Globalization.CultureInfo.InvariantCulture);
                calendarEvent.Start.Zone = "Romance Standard Time";
                //calendarEvent.End = new CalendarEventTimeZone();
                //if (rabbitMQEvent.Header.Source.ToLower() != "canvas")
                calendarEvent.End.DateTime = DateTime.Parse(rabbitMQEvent.End.ToString());
                //else
                //    calendarEvent.End.DateTime = DateTime.ParseExact(rabbitMQEvent.End.ToString(), "d/MM/yyyy H:mm:ss", System.Globalization.CultureInfo.InvariantCulture);
                calendarEvent.End.Zone = "Romance Standard Time";
                //calendarEvent.BodyPreview = rabbitMQEvent.Description;
                //calendarEvent.Body = new CalendarEventBody();
                calendarEvent.Body.ContentType = "text";
                calendarEvent.Body.Content     = rabbitMQEvent.Description;
                //calendarEvent.Organizer = new CalendarEventOrganizer();
                //calendarEvent.Organizer.EmailAddress = new CalendarEventEmailAddress();
                calendarEvent.Organizer.EmailAddress.Address = services.GetEmailFromUUID(masterUserId.SourceEntityId);
                //calendarEvent.Location = new CalendarEventLocation();
                //calendarEvent.Location.Address = new CalendarEventLocationAddress();
                //calendarEvent.Location.DisplayName = rabbitMQEvent.Location;
                string[] location = rabbitMQEvent.Location.Split('%');
                calendarEvent.Location.Address.Street     = location[0] + " " + location[1] + " " + location[2];
                calendarEvent.Location.Address.City       = location[3];
                calendarEvent.Location.Address.PostalCode = location[4];


                /* --- Retrieve a valid accestoken for creating the event in the MS Graph API --- */
                BearerToken = services.RefreshAccesToken();

                /* --- Serialize the event into json and attach it to the rest request --- */
                var json = JsonConvert.SerializeObject(calendarEvent);
                restRequest.AddHeader("Authorization", BearerToken.Token_type + " " + BearerToken.Access_token);
                restRequest.AddJsonBody(json);

                /* --- test --- */
                Console.WriteLine(json);
                //restRequest.AddHeader("Prefer", "outlook.timezone=\"Romance Standard Time\"");
                //restRequest.AddHeader("Prefer", "outlook.body-content-type=\"text\"");


                /* --- execute the rest request to post the new event in the MS Graph API --- */
                restClient.BaseUrl = new Uri($"https://graph.microsoft.com/v1.0/users/{masterUserId.SourceEntityId}/events");
                var response = restClient.Post(restRequest);

                Console.WriteLine(response.StatusCode);

                if (response.StatusCode == System.Net.HttpStatusCode.Created)
                {
                    var           responsJson   = response.Content;
                    CalendarEvent responseEvent = JsonConvert.DeserializeObject <CalendarEvent>(responsJson);
                    Console.WriteLine(responseEvent.Id);
                    masterDBService.CreateEntity(rabbitMQEvent.UUID, responseEvent.Id, "Event");
                }
            }
        }
Beispiel #7
0
        static void Main(string[] args)
        {
            List <CalendarEvent> events = new List <CalendarEvent>();
            Uri    rabbitMQUri          = new Uri(Constant.RabbitMQConnectionUrl);
            string queueName            = Constant.RabbitMQEventQueueName;

            var factory = new ConnectionFactory
            {
                Uri = rabbitMQUri
            };

            using var connection = factory.CreateConnection();
            using var channel    = connection.CreateModel();
            channel.QueueDeclare(
                queueName,
                durable: true,
                exclusive: false,
                autoDelete: false,
                arguments: null);

            var consumer = new EventingBasicConsumer(channel);

            consumer.Received += (sender, e) =>
            {
                var message = e.Body.ToArray();
                var xml     = Encoding.UTF8.GetString(message);
                Console.WriteLine(xml);
                //events = JsonConvert.DeserializeObject<List<CalendarEvent>>(xml);
                //foreach (var ev in events)
                //{
                //    Console.WriteLine(ev.Email);
                //    Console.WriteLine(ev.Subject);
                //    Console.WriteLine(ev.Start.DateTime);
                //    Console.WriteLine(ev.Start.Zone);
                //    Console.WriteLine(ev.End.DateTime);
                //    Console.WriteLine(ev.End.Zone);
                //}
                //int hulp = xml.IndexOf("<", 1, xml.Length-1);
                //Console.WriteLine(hulp);
                XmlSerializer serializer = new XmlSerializer(typeof(RabbitMQEvent));
                //xml = xml.Substring(hulp);
                //if (xml.)
                //if (xml.IndexOf("?", 0, 1) == 0)
                //    xml = xml.Substring(1);
                Console.WriteLine(xml);
                //string _byteOrderMarkUtf8 = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
                //if (xml.StartsWith(_byteOrderMarkUtf8))
                //    xml = xml.Remove(0, _byteOrderMarkUtf8.Length);
                using (TextReader reader = new StringReader(xml))
                {
                    RabbitMQEvent result = (RabbitMQEvent)serializer.Deserialize(reader);
                    //result.uuid = "e768646c-eaf9-4f82-99ce-0a49736deef7";
                    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);
                    //Console.WriteLine(result.location);

                    if (result.Header.Method.ToLower() == "create" && result.Header.Source.ToLower() == "planning")
                    {
                        OfficeService.Post(result);
                    }
                }
            };

            channel.BasicConsume(queueName, true, consumer);
            Console.ReadLine();
        }