diff --git a/drivers/place/attendee_scanner.cr b/drivers/place/attendee_scanner.cr new file mode 100644 index 00000000000..221053db06e --- /dev/null +++ b/drivers/place/attendee_scanner.cr @@ -0,0 +1,98 @@ +require "placeos-driver" +require "json" + +class Place::AttendeeScanner < PlaceOS::Driver + descriptive_name "PlaceOS Room Events" + generic_name :AttendeeScanner + + accessor staff_api : StaffAPI_1 + + default_settings({ + internal_domains: [] of String, + }) + + getter systems : Hash(String, Array(String)) { get_systems_list.not_nil! } + getter internal_domains : Array(String) = [] of String + + def on_update + @internal_domains = setting(Array(String), :internal_domains) + end + + # Grabs the list of systems in the building + def get_systems_list + building_id = system[:Location].building_id.get + system["StaffAPI"].systems_in_building(building_id).get.as_h.transform_values(&.as_a.map(&.as_s)) + rescue error + logger.warn(exception: error) { "unable to obtain list of systems in the building" } + nil + end + + # Lists external guests based on email domains + def list_external_guests + values = [] of Hash(String, JSON::Any) + + systems.each do |level_id, system_ids| + system_ids.each do |system_id| + period_start = Time.local.to_unix + period_end = Time.local.to_unix + 86400 + + events = staff_api.query_events(period_start, period_end, systems: [system_id]).get + + events.as_a.each do |event| + domain = event.as_h.["host"].as_s.split("@").last + + unless internal_domains.includes?(domain) + event_id = event.as_h.["id"].as_s + ical_uid = event.as_h.["ical_uid"].as_s + + bookings = staff_api.query_bookings(event_id: event_id, ical_uid: ical_uid).get + + attendee_emails = event["attendees"].as_a.map do |attendee| + attendee.as_h.["email"].as_s + end + + bookings.as_a.each do |booking| + booking = booking.as_h + + booking.["attendees"].as_a.each do |attendee| + attendee_email = attendee.as_h.["email"].as_s + + unless attendee_emails.includes?(attendee_email) + staff_api.create_booking( + booking_type: "visitor", + asset_id: attendee_email, + user_id: attendee_email, + user_email: attendee_email, + user_name: booking["user_name"].as_s, + zones: booking["zones"].as_a?, + booking_start: booking["booking_start"].as_s?, + booking_end: booking["booking_end"].as_s?, + checked_in: booking["checked_in"].as_bool?, + approved: booking["approved"].as_bool?, + title: booking["title"].as_s?, + description: booking["description"].as_s?, + time_zone: booking["time_zone"].as_s?, + extension_data: booking["extension_data"]?, + utm_source: nil, + limit_override: nil, + event_id: event_id, + ical_uid: ical_uid, + attendees: nil + ).get + + values.push({ + "event_id" => event.as_h.["id"], + "ical_uid" => event.as_h.["ical_uid"], + "booking" => JSON::Any.new(booking), + }) + end + end + end + end + end + end + end + + values + end +end diff --git a/drivers/place/staff_api.cr b/drivers/place/staff_api.cr index e2acb572e6a..387b5cafb55 100644 --- a/drivers/place/staff_api.cr +++ b/drivers/place/staff_api.cr @@ -547,6 +547,8 @@ class Place::StaffAPI < PlaceOS::Driver extension_data : JSON::Any? = nil, utm_source : String? = nil, limit_override : Int64? = nil, + event_id : String? = nil, + ical_uid : String? = nil, attendees : Array(PlaceCalendar::Event::Attendee)? = nil ) now = time_zone ? Time.local(Time::Location.load(time_zone)) : Time.local @@ -560,6 +562,8 @@ class Place::StaffAPI < PlaceOS::Driver params = URI::Params.build do |form| form.add "utm_source", utm_source.to_s unless utm_source.nil? form.add "limit_override", limit_override.to_s unless limit_override.nil? + form.add "event_id", event_id.to_s unless event_id.nil? + form.add "ical_uid", ical_uid.to_s unless ical_uid.nil? end response = post("/api/staff/v1/bookings?#{params}", headers: authentication, body: { @@ -728,6 +732,8 @@ class Place::StaffAPI < PlaceOS::Driver user : String? = nil, email : String? = nil, state : String? = nil, + event_id : String? = nil, + ical_uid : String? = nil, created_before : Int64? = nil, created_after : Int64? = nil, approved : Bool? = nil, @@ -754,6 +760,8 @@ class Place::StaffAPI < PlaceOS::Driver form.add "approved", approved.to_s unless approved.nil? form.add "rejected", rejected.to_s unless rejected.nil? form.add "checked_in", checked_in.to_s unless checked_in.nil? + form.add "event_id", event_id.to_s if event_id.presence + form.add "ical_uid", ical_uid.to_s if ical_uid.presence form.add "include_checked_out", include_checked_out.to_s unless include_checked_out.nil? if extension_data