Упрощена логика переноса проекта

- Если проект с указанным именем не существует - просто переименовываем текущий проект
- Если проект существует - переносим все данные (nodes, weekly_goals) в существующий проект
- При удалении проекта удаляются все связанные weekly_goals
This commit is contained in:
poignatov
2025-12-29 21:38:43 +03:00
parent fc83bed1a3
commit 3b94ed2991

View File

@@ -3515,28 +3515,41 @@ func (a *App) moveProjectHandler(w http.ResponseWriter, r *http.Request) {
SELECT id FROM projects WHERE name = $1 AND deleted = FALSE SELECT id FROM projects WHERE name = $1 AND deleted = FALSE
`, req.NewName).Scan(&targetProjectID) `, req.NewName).Scan(&targetProjectID)
var finalProjectID int
if err == sql.ErrNoRows { if err == sql.ErrNoRows {
// Проект не найден - создаем новый // Проект не найден - просто переименовываем текущий проект
err = tx.QueryRow(` _, err = tx.Exec(`
INSERT INTO projects (name, deleted) UPDATE projects
VALUES ($1, FALSE) SET name = $1
RETURNING id WHERE id = $2
`, req.NewName).Scan(&finalProjectID) `, req.NewName, req.ID)
if err != nil { if err != nil {
log.Printf("Error creating new project: %v", err) log.Printf("Error renaming project: %v", err)
sendErrorWithCORS(w, fmt.Sprintf("Error creating new project: %v", err), http.StatusInternalServerError) sendErrorWithCORS(w, fmt.Sprintf("Error renaming project: %v", err), http.StatusInternalServerError)
return return
} }
// Коммитим транзакцию
if err := tx.Commit(); err != nil {
log.Printf("Error committing transaction: %v", err)
sendErrorWithCORS(w, fmt.Sprintf("Error committing transaction: %v", err), http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(map[string]interface{}{
"message": "Project renamed successfully",
"project_id": req.ID,
})
return
} else if err != nil { } else if err != nil {
log.Printf("Error querying target project: %v", err) log.Printf("Error querying target project: %v", err)
sendErrorWithCORS(w, fmt.Sprintf("Error querying target project: %v", err), http.StatusInternalServerError) sendErrorWithCORS(w, fmt.Sprintf("Error querying target project: %v", err), http.StatusInternalServerError)
return return
} else {
// Проект найден - используем его ID
finalProjectID = targetProjectID
} }
// Проект найден - переносим данные в существующий проект
finalProjectID := targetProjectID
// Обновляем все nodes с project_id на целевой // Обновляем все nodes с project_id на целевой
_, err = tx.Exec(` _, err = tx.Exec(`
UPDATE nodes UPDATE nodes