The most complicated code we had was for generating receipts, which used some functions which we kept separate, because it made sense.
Auth was handled by a middleware. And then once we'd stripped out all the layers, 95% of the handlers looked like roughly like this:
result = fetch(...);
/* Maybe more fetches, maps or filters */
response.send(result);
They didn't really _do_ anything. It was all just small tweaks to data someone else owned. The biggest challenge were upstream endpoints changing on us, making sure we were logging and passing things like correlationIds consistently. Moving to fat handlers, we unified those by having those things already set up and passed into the handlers. The focus was on devex, so a junior could easily modify/create an endpoint and not have to think about how to get it right. We made the pit of success as easy to fall into as possible by breaking the rules that weren't serving the project very well.
It was a glorified proxy layer. There were benefits in treating it as such, rather than deluding ourselves into thinking we needed services, repositories, models and such. Just transform data from someone else's endpoints and focus on the frontend.