_blogs
// blogs / 20260819.md
// blogs / 20260819.md
Dev Log: August 19 Wrap-up
Overview
Today was a bit of a mixed bag—spent a good chunk of time chasing down a double-encoding bug in our backend decorators and then pivoted to some frontend component work. It was one of those days where a single line of code fixes a problem that looks much more complicated than it actually is.
What I Worked On
The 'Smart' Template Trap
I was hitting a wall with an external API call from our MasterDefinition logic. The request parameters were coming out mangled on the other side. Specifically, I had already encoded some comma-separated keys, turning them into %2C, but they were arriving as %252C.
It turns out RestTemplate was trying to be helpful. If you pass it a String, it treats it as a URI template and re-encodes everything. The fix was simple but satisfying: pass it a URI object instead so it stays hands-off with the encoding.
// Instead of passing a string that gets double-encoded
// response = restTemplate.exchange(finalUrl, HttpMethod.GET, entity, String.class);
// Pass a URI object to keep the encoding intact
response = restTemplate.exchange(URI.create(finalUrl), HttpMethod.GET, entity, String.class);
While I was in there, I also implemented the logic for fetching specific API details and handled some string cleanup. We use a convention where # symbols in the incoming request represent commas for field projections, so I had to swap those out. I caught a silly logic error in my isEmpty check too—one of those "how did I miss that?" moments during a quick refactor.
Frontend Plumbing and AI Chat
On the Angular side, I spent some time setting up a new resource-popup component. It's essentially a generic wrapper for our UI engine, allowing us to spin up resource views inside modals without rewriting the world.
I also handled a quick fix for the AI chat embed. The reCAPTCHA v3 site key wasn't being passed correctly from the environment config, which was basically breaking the flow for anyone trying to use the chat. It's a small change, but critical for getting the widget live.
Metadata Updates
Lastly, I updated the master definition schema to include a new is_custom_upload flag. This is a simple boolean toggle in the JSON config that controls visibility for certain upload fields. It’s not flashy, but it’s necessary for the new onboarding flow we're building out.
Wrapping Up
Most of the day was consumed by the backend encoding issue, but I'm glad that's behind me. Tomorrow should be smoother—I'm planning to dive deeper into the new popup component and make sure it handles some of the more complex edge cases we have for data grids. Catch you then.