/// <summary> /// Check-in a group of patrons to a dining service. /// </summary> /// <param name="venueId">Target venue ID</param> /// <param name="areaId">Target area ID</param> /// <param name="checkIn">Check-in information</param> public async Task SubmitDiningCheckIn(string venueId, string areaId, DiningCheckInRequest checkIn) { // Lookup venue information. // This will throw an error if the venue doesn't exist. var venue = await _database.GetVenueById(venueId); // Find an area that matches the requested areaId. var area = venue.DiningAreas.Find(a => a.Id == areaId); // Throw an exception if the area doesn't exist. if (area == null) { throw new AreaNotFoundException(); } // Throw an exception if the area isn't open. if (!area.IsOpen) { throw new AreaIsClosedException(); } // Throw an error if there is no active service. if (area.ActiveService == "NONE") { throw new ServiceNotFoundException(); } // Create a new check-in. CheckInDocument checkInDocument = new CheckInDocument { Id = ObjectId.GenerateNewId().ToString(), Time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), People = new List <DiningPatronDocument>() }; // Add patrons from the request into the check-in. checkIn.People.ForEach(person => { checkInDocument.People.Add(new DiningPatronDocument { Id = ObjectId.GenerateNewId().ToString(), FirstName = person.FirstName, PhoneNumber = person.PhoneNumber }); }); // Save the check-in to a new table, or append to an existing table. await _database.CreateOrAppendDiningCheckIn(area.ActiveService, checkIn.TableNumber, checkInDocument); }