refactor: POST env vars as JSON array instead of KEY=value string
All checks were successful
Check / check (pull_request) Successful in 4s

Replace the string-serialized KEY=value format with a proper JSON array
of {key, value} objects for the env var save endpoint.

Frontend changes:
- envVarEditor.submitAll() now uses fetch() with Content-Type:
  application/json and X-CSRF-Token header instead of form submission
- Sends JSON array: [{"key":"FOO","value":"bar"}, ...]
- Hidden bulk form replaced with hidden div holding CSRF token
- envVarEditor now receives appId parameter for the fetch URL

Backend changes:
- HandleEnvVarSave reads JSON body via json.NewDecoder instead of
  parsing form values with parseEnvPairs
- Returns JSON {"ok": true} instead of HTTP redirect
- Removed parseEnvPairs function and envPair struct entirely
- Added envPairJSON struct with json tags for deserialization

Tests updated to POST JSON arrays instead of form-encoded strings.

Closes #163
This commit is contained in:
clawbot
2026-03-10 11:37:55 -07:00
parent 3f96f4f81b
commit df6aad9b21
4 changed files with 54 additions and 74 deletions

View File

@@ -101,7 +101,7 @@
</div>
<!-- Environment Variables -->
<div class="card p-6 mb-6" x-data="envVarEditor()">
<div class="card p-6 mb-6" x-data="envVarEditor('{{.App.ID}}')">
<h2 class="section-title mb-4">Environment Variables</h2>
{{range .EnvVars}}<span class="env-init hidden" data-key="{{.Key}}" data-value="{{.Value}}"></span>{{end}}
<template x-if="vars.length > 0">
@@ -151,10 +151,7 @@
<input x-ref="newVal" type="text" placeholder="value" required class="input flex-1 font-mono text-sm">
<button type="submit" class="btn-primary">Add</button>
</form>
<form x-ref="bulkForm" method="POST" action="/apps/{{.App.ID}}/env" class="hidden">
{{ .CSRFField }}
<textarea x-ref="bulkData" name="env_vars"></textarea>
</form>
<div class="hidden">{{ .CSRFField }}</div>
</div>
<!-- Labels -->