172 lines
4.4 KiB
Go
172 lines
4.4 KiB
Go
package backend
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/wailsapp/wails/v2/pkg/runtime"
|
|
)
|
|
|
|
func (a *App) SelectFile(title string, defaultDir string, filter string) (string, error) {
|
|
return runtime.OpenFileDialog(a.ctx, runtime.OpenDialogOptions{
|
|
Title: title,
|
|
DefaultDirectory: defaultDir,
|
|
Filters: []runtime.FileFilter{{Pattern: filter}},
|
|
})
|
|
}
|
|
|
|
func (a *App) SelectDirectory(title string, defaultDir string) (string, error) {
|
|
return runtime.OpenDirectoryDialog(a.ctx, runtime.OpenDialogOptions{
|
|
Title: title,
|
|
DefaultDirectory: defaultDir,
|
|
})
|
|
}
|
|
|
|
func (a *App) CheckGenPs1Exists(filePath string) (bool, error) {
|
|
if filePath == "" {
|
|
return false, fmt.Errorf("file path is empty")
|
|
}
|
|
|
|
_, err := os.Stat(filePath)
|
|
if err != nil {
|
|
if os.IsNotExist(err) {
|
|
return false, nil
|
|
}
|
|
return false, err
|
|
}
|
|
return true, nil
|
|
}
|
|
|
|
func (a *App) ReadGoModModule(filePath string) (string, error) {
|
|
if filePath == "" {
|
|
return "", fmt.Errorf("file path is empty")
|
|
}
|
|
|
|
dirPath := filepath.Dir(filePath)
|
|
goModPath := filepath.Join(dirPath, "go.mod")
|
|
|
|
content, err := os.ReadFile(goModPath)
|
|
if err != nil {
|
|
return "", fmt.Errorf("go.mod not found: %w", err)
|
|
}
|
|
|
|
lines := strings.Split(string(content), "\n")
|
|
for _, line := range lines {
|
|
line = strings.TrimSpace(line)
|
|
if strings.HasPrefix(line, "module ") {
|
|
moduleName := strings.TrimPrefix(line, "module ")
|
|
moduleName = strings.TrimSpace(moduleName)
|
|
return moduleName, nil
|
|
}
|
|
}
|
|
|
|
return "", fmt.Errorf("module declaration not found in go.mod")
|
|
}
|
|
|
|
func (a *App) ExecuteGenPs1(genPs1Path string, dbName string, targetPath string, modelPackagePath string) (string, error) {
|
|
if genPs1Path == "" {
|
|
return "", fmt.Errorf("gen.ps1 path is empty")
|
|
}
|
|
if dbName == "" {
|
|
return "", fmt.Errorf("database name is empty")
|
|
}
|
|
|
|
if _, err := os.Stat(genPs1Path); err != nil {
|
|
if os.IsNotExist(err) {
|
|
return "", fmt.Errorf("gen.ps1 not found")
|
|
}
|
|
return "", fmt.Errorf("error checking gen.ps1: %w", err)
|
|
}
|
|
|
|
dirPath := filepath.Dir(genPs1Path)
|
|
|
|
psPath, err := exec.LookPath("powershell.exe")
|
|
if err != nil {
|
|
return "", fmt.Errorf("PowerShell not found: %w", err)
|
|
}
|
|
|
|
args := []string{
|
|
"-NoProfile",
|
|
"-ExecutionPolicy", "Bypass",
|
|
"-Command",
|
|
fmt.Sprintf("Set-Location -Path '%s'; & .\\gen.ps1 -dbName '%s'", dirPath, dbName),
|
|
}
|
|
|
|
cmd := exec.Command(psPath, args...)
|
|
|
|
output, err := cmd.CombinedOutput()
|
|
if err != nil {
|
|
return "", fmt.Errorf("script execution failed: %w\nOutput: %s", err, string(output))
|
|
}
|
|
|
|
if targetPath != "" {
|
|
sourceDir := filepath.Join(dirPath, dbName)
|
|
if _, err := os.Stat(sourceDir); err == nil {
|
|
modelSource := filepath.Join(sourceDir, "model")
|
|
querySource := filepath.Join(sourceDir, "query")
|
|
|
|
modelTarget := filepath.Join(targetPath, "model")
|
|
queryTarget := filepath.Join(targetPath, "query")
|
|
|
|
if _, err := os.Stat(modelSource); err == nil {
|
|
if err := copyDir(modelSource, modelTarget); err != nil {
|
|
return string(output), fmt.Errorf("failed to copy model directory: %w", err)
|
|
}
|
|
}
|
|
|
|
if _, err := os.Stat(querySource); err == nil {
|
|
if err := copyDir(querySource, queryTarget); err != nil {
|
|
return string(output), fmt.Errorf("failed to copy query directory: %w", err)
|
|
}
|
|
if modelPackagePath != "" {
|
|
if err := replaceImportPaths(queryTarget, dbName, modelPackagePath, a.settings.DefaultQueryPackagePath); err != nil {
|
|
return string(output), fmt.Errorf("failed to replace import paths: %w", err)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return string(output), nil
|
|
}
|
|
|
|
func replaceImportPaths(queryDir string, dbName string, newPackagePath string, basePath string) error {
|
|
err := filepath.Walk(queryDir, func(path string, info os.FileInfo, err error) error {
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if !info.IsDir() && strings.HasSuffix(path, ".gen.go") {
|
|
if err := replaceImportInFile(path, dbName, newPackagePath, basePath); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
})
|
|
|
|
return err
|
|
}
|
|
|
|
func replaceImportInFile(filePath string, dbName string, newPackagePath string, basePath string) error {
|
|
content, err := os.ReadFile(filePath)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if basePath == "" {
|
|
basePath = "git.hlsq.asia/mmorpg"
|
|
}
|
|
|
|
oldImport := fmt.Sprintf(`"%s/%s/model"`, basePath, dbName)
|
|
newImport := fmt.Sprintf(`"%s"`, newPackagePath)
|
|
|
|
newContent := bytes.ReplaceAll(content, []byte(oldImport), []byte(newImport))
|
|
|
|
return os.WriteFile(filePath, newContent, 0644)
|
|
}
|