I’ve been working on a solution for a customer that utilizes SharePoint Online lists and libraries, PowerApps, Logic Apps, and Azure Functions. The solution works something like this: Project documents are stored and updated in a SharePoint Library by office staff. The shop floor needs to access the documents and know at a glance when documents have been updated. The PowerApp displays a count of the most recently updated documents by project and document type, and also displays the documents. A SharePoint List is used to store the counts of the most recently updated documents. The Logic App and Azure Function work together to update the SharePoint List with the counts from the SharePoint Library.
As part of the solution, we wanted a way to be notified if the Azure Function threw an error. This is where SendGrid comes in. SendGrid is a third-party email delivery service. Azure Functions support an output binding for SendGrid, which makes it very easy to integrate into your solution.Here is a grand overview of how my solution (just the Azure Function and SendGrid piece) will work – If my Azure Function throws an error, it will send the error message to Azure Queue Storage. The error message will be stored in Azure Queue Storage until another Azure Function (2) comes and picks it up. Azure Function (2) will use SendGrid to send an email containing the error message. Easy-peasy. You can use SendGrid to send emails for all kinds of reasons – when a customer places an order, you can send a confirmation email with the details of the order; when someone clicks a button on your site to request information, you can send an email with the requested information; the options are endless.
Earlier this month I attended the Codemash developers conference at the Kalahari Waterpark in Sandusky, OH. This was my 11th time going to the conference and I always come back with a list of things I want to learn more about. This year was no different and overall it was probably the best one I have attended. Following are a few of the more interesting sessions I attended.
This was full day workshop that went through in detail a typical API architecture written in .NET Core and including other common packages for Dependency Injection (Autofac), Testing (XUnit), Logging (SeriLog), Mocking (Moq), API Documentation (Swagger), Object Mapping (AutoMapper), plus a working example of using MongoDB with .NET Core. Lots of good takeaways from this.
Although Docker is not new, I have not really done anything with it before. This ½ day session included an AWS instance with the prerequisites already setup so we were able to go over creating a Docker image, and using DockerHub to find existing images to work with. It was a perfect to getting-started workshop for my level of Docker experience.
This session, in addition to the Docker pre-compiler, went over some cool uses of Docker images. The most interesting one to me was where the speaker described how each night that take a backup of the their production database, scrub the data of private information, and update an internal Docker image with the database backup. Then each morning all of the developers can pull the new image and do their development with data that is essentially production data.
These were two separate sessions but they are very much related technologies. Service Workers are a key part of Progress Web Apps. I have many years of web development experience and PWA’s are something I have been interested in learning more about. The PWA session was a great introduction and included details on when a PWA is the appropriate choice for an app, and a lot of good examples on how to setup a PWA.
Overall I feel like the time at Codemash was well spent and as usual I have a list of new tech to on my list of things to learn more about this year.
Recently we were asked by a client to develop a MS Flow that creates a sub site when users enter a new item into a SharePoint list. What we found was there’s no simple, out of the box way to have the new sub site inherit the top navigation of the parent site. As a result, we needed to create an Azure Function to preform this function. Read more