/// <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)); }
/// <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(); }
/// <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"); } } }
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(); }