fix: validate account on mapping PUT; gate folders btn during run; prune stale mapping keys; drop dead export

This commit is contained in:
2026-07-03 12:08:22 +07:00
parent 964e4cfc33
commit b59ce67497
4 changed files with 11 additions and 5 deletions
+9
View File
@@ -228,11 +228,20 @@ func (s *Server) handleProbeAccountFolders(w http.ResponseWriter, r *http.Reques
// handleSetAccountFolderMapping persists one account's rename map + excluded set. // handleSetAccountFolderMapping persists one account's rename map + excluded set.
func (s *Server) handleSetAccountFolderMapping(w http.ResponseWriter, r *http.Request) { func (s *Server) handleSetAccountFolderMapping(w http.ResponseWriter, r *http.Request) {
taskID, err := pathID(r, "id")
if err != nil {
http.Error(w, "bad id", http.StatusBadRequest)
return
}
accID, err := pathID(r, "accountId") accID, err := pathID(r, "accountId")
if err != nil { if err != nil {
http.Error(w, "bad account id", http.StatusBadRequest) http.Error(w, "bad account id", http.StatusBadRequest)
return return
} }
if _, ok := s.findAccount(r, taskID, accID); !ok {
http.Error(w, "account not found", http.StatusNotFound)
return
}
var body struct { var body struct {
Mapping map[string]string `json:"mapping"` Mapping map[string]string `json:"mapping"`
Excluded []string `json:"excluded"` Excluded []string `json:"excluded"`
-3
View File
@@ -103,9 +103,6 @@ export const probeFolders = (
creds: { src_login: string; src_pass: string; dst_login: string; dst_pass: string }, creds: { src_login: string; src_pass: string; dst_login: string; dst_pass: string },
) => api<ProbeResult>(`/api/tasks/${taskId}/probe`, jsonBody(creds)) ) => api<ProbeResult>(`/api/tasks/${taskId}/probe`, jsonBody(creds))
export const setFolderMapping = (taskId: number, mapping: Record<string, string>) =>
api(`/api/tasks/${taskId}/folder-mapping`, { ...jsonBody({ mapping }), method: 'PUT' })
export const probeAccountFolders = (taskId: number, accId: number) => export const probeAccountFolders = (taskId: number, accId: number) =>
api<ProbeResult>(`/api/tasks/${taskId}/accounts/${accId}/probe`, { method: 'POST' }) api<ProbeResult>(`/api/tasks/${taskId}/accounts/${accId}/probe`, { method: 'POST' })
+1 -1
View File
@@ -42,7 +42,7 @@ export function FolderMappingModal({
const valueFor = (src: string) => choice[src] ?? defaultDst(src, dstFolders, initialMapping) const valueFor = (src: string) => choice[src] ?? defaultDst(src, dstFolders, initialMapping)
function confirm() { function confirm() {
const mapping: Record<string, string> = { ...initialMapping } const mapping: Record<string, string> = {}
const excluded: string[] = [] const excluded: string[] = []
for (const src of srcFolders) { for (const src of srcFolders) {
if (synced[src] === false) { if (synced[src] === false) {
+1 -1
View File
@@ -577,7 +577,7 @@ export function TaskDetail({ id }: { id: number }) {
<td className="num-cell">{a.errors}</td> <td className="num-cell">{a.errors}</td>
<td className="num-cell"> <td className="num-cell">
<div className="row-actions"> <div className="row-actions">
{a.status !== 'running' && ( {a.status !== 'running' && data?.task.status !== 'running' && (
<button <button
type="button" type="button"
className="link-btn" className="link-btn"