Fundamentally, PretzelBox is an inbox for your domain. The semantics of being an inbox dictate that emails be shown in descending order by date i.e., emails in inboxes are LIFO or equally, your inbox is a stack.

(The stack like behaviour of inboxes should give you a hint as to why we use the word STACK in our DSL::response)

Sorting of emails can be solved in two ways - the easy way and the hard.

The Easy Way

The easy way would be to put email metadata into a relational database, then use SQL’s sorting mechanisms to retrieve the data in the correct sort order.

Easy as ABC, right?

Easy as ABC, right?

Easy as ABC, right?

Well,...wrong.

PretzelBox is fully serveless and is not backed by a database. At some point in the product journey, it was decided that we’d avoid using a database for as long as we could, probably for cost reasons, and now, I honestly don’t think a DB is necessary for where we are going.

The Hard Way

Before I proceed, I want to get it out there that hard here refers to the fact that I had to think a little bit about the features AWS provides out of the box, learn their consistency models, then implement some scaffolding code on top of it. The code itself isn’t very complicated to write.

So, without further delay, here’s how we are sorting inbound emails in LIFO order.

Our backend store for PretzelBox is S3.

S3’s default behaviour

In general, when you query S3 for a list of files under a directory (i.e., files having the same prefix), it returns the list of prefixes in ascending alphabetical sort.

The names of emails stored in S3 don’t have no set patterns so emails received one after the other could have wildly different names with no guarantees of “sortedness".

Therefore, the default behaviour is not going to work for us.

File renames