Files
MyGoNavi/internal/app/methods_saved_queries.go
Syngnat d3909c7dff feat(saved-query): 支持独立 SQL 文件与自定义存储目录
- 将已存查询内容从 JSON 拆分为独立 .sql 文件,并采用可读名称和数字后缀处理冲突
- 自动迁移旧版内联 SQL 与摘要文件名,保留外部编辑并在失败时回滚
- 支持选择、迁移、打开及恢复默认存储目录,补充数据根切换串行保护
- 新增已存查询右键在文件夹中打开,并同步处理查询重命名后的文件路径
- 补齐 Wails、浏览器模拟、六语言文案及后端和前端回归测试
2026-07-24 11:29:04 +08:00

121 lines
3.8 KiB
Go

package app
import (
"strings"
"GoNavi-Wails/internal/connection"
)
func (a *App) savedQueryRepository() *savedQueryRepository {
return newSavedQueryRepository(a.configDir)
}
func (a *App) GetSavedQueries() ([]connection.SavedQuery, error) {
savedQueriesMu.Lock()
defer savedQueriesMu.Unlock()
queries, err := a.savedQueryRepository().load()
if err != nil {
return nil, err
}
currentConnections, err := a.savedConnectionRepository().List()
if err != nil {
return queries, nil
}
return resolveSavedQueryBindings(queries, currentConnections, nil), nil
}
func (a *App) GetSavedQueryGroups() ([]connection.SavedQueryGroup, error) {
savedQueriesMu.Lock()
defer savedQueriesMu.Unlock()
return a.savedQueryRepository().loadGroups()
}
func (a *App) SaveQuery(input connection.SavedQuery) (connection.SavedQuery, error) {
if strings.TrimSpace(input.Name) == "" {
input.Name = a.localizedSavedQueryDefaultName(0)
}
currentConnections, err := a.savedConnectionRepository().List()
if err == nil {
input = resolveSavedQueryBindings([]connection.SavedQuery{input}, currentConnections, nil)[0]
}
return a.savedQueryRepository().Save(input)
}
func (a *App) ImportSavedQueries(payload connection.SavedQueryImportPayload) ([]connection.SavedQuery, error) {
if len(payload.Queries) > 0 {
localizedQueries := append([]connection.SavedQuery(nil), payload.Queries...)
for index := range localizedQueries {
if strings.TrimSpace(localizedQueries[index].Name) == "" {
localizedQueries[index].Name = a.localizedSavedQueryDefaultName(index)
}
}
payload.Queries = localizedQueries
}
currentConnections, err := a.savedConnectionRepository().List()
if err != nil {
currentConnections = nil
}
return a.savedQueryRepository().Import(payload, currentConnections)
}
func (a *App) localizedSavedQueryDefaultName(index int) string {
return a.appText("saved_query.default_name", map[string]any{"index": index + 1})
}
func (a *App) DeleteQuery(id string) error {
return a.savedQueryRepository().Delete(id)
}
func (a *App) RenameSavedQuery(id string, name string) (connection.SavedQuery, error) {
return a.savedQueryRepository().Rename(id, name)
}
// SaveSavedQueryGroup creates or fully replaces a saved SQL group. Callers
// must submit the current parent, query IDs, and child order; query IDs in the
// submitted group become owned by that direct group only.
func (a *App) SaveSavedQueryGroup(input connection.SavedQueryGroup) (connection.SavedQueryGroup, error) {
return a.savedQueryRepository().SaveGroup(input)
}
// DeleteSavedQueryGroup removes a group and promotes its direct queries and
// child groups to the deleted group's parent when it has one.
func (a *App) DeleteSavedQueryGroup(id string) error {
return a.savedQueryRepository().DeleteGroup(id)
}
// MoveSavedQueryToGroup moves a saved query to a direct group. An empty group
// id makes the query ungrouped.
func (a *App) MoveSavedQueryToGroup(queryID string, groupID string) error {
return a.savedQueryRepository().MoveQueryToGroup(queryID, groupID)
}
// MoveSavedQueryGroup reparents a saved-query group. An empty parent id moves
// it to the root level.
func (a *App) MoveSavedQueryGroup(groupID string, parentGroupID string) error {
return a.savedQueryRepository().MoveGroup(groupID, parentGroupID)
}
func (a *App) RebindSavedQuery(id string, connectionID string) (connection.SavedQuery, error) {
target, err := a.savedConnectionRepository().Find(connectionID)
if err != nil {
return connection.SavedQuery{}, err
}
return a.savedQueryRepository().Rebind(id, target)
}
func (a *App) GetUnboundSavedQueries() ([]connection.SavedQuery, error) {
queries, err := a.GetSavedQueries()
if err != nil {
return nil, err
}
result := make([]connection.SavedQuery, 0)
for _, query := range queries {
if query.BindingStatus == savedQueryBindingOrphan {
result = append(result, query)
}
}
return result, nil
}