Skip to content

Commit 75cf670

Browse files
committed
feat: workflow save load (#20)
1 parent 775c46f commit 75cf670

File tree

13 files changed

+462
-64
lines changed

13 files changed

+462
-64
lines changed

binding/database/service.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,23 @@ func (s *Service) DeleteModelProvider(id int) error {
2929
func (s *Service) ListModelProviders() ([]db.ModelProvider, error) {
3030
return db.ListModelProviders()
3131
}
32+
33+
// GetProject retrieves a project by ID
34+
func (s *Service) GetProject(id int) (*db.Project, error) {
35+
return db.GetProject(id)
36+
}
37+
38+
// SaveProject saves or updates a project
39+
func (s *Service) SaveProject(project db.Project) (*db.Project, error) {
40+
return db.SaveProject(project)
41+
}
42+
43+
// DeleteProject deletes a project
44+
func (s *Service) DeleteProject(id int) error {
45+
return db.DeleteProject(id)
46+
}
47+
48+
// ListProjects lists all projects
49+
func (s *Service) ListProjects() ([]db.Project, error) {
50+
return db.ListProjects()
51+
}

database/db.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,27 @@ func InitDB() error {
3333
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
3434
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
3535
);
36+
37+
CREATE TABLE IF NOT EXISTS projects (
38+
id INTEGER PRIMARY KEY AUTOINCREMENT,
39+
name TEXT NOT NULL,
40+
description TEXT DEFAULT '',
41+
workflow TEXT DEFAULT '',
42+
cover_image TEXT DEFAULT '',
43+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
44+
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
45+
);
3646
`
3747
_, err = DB.Exec(schema)
3848
if err != nil {
3949
return err
4050
}
4151

52+
// Auto-migrate for existing tables
53+
// Ignore errors if columns already exist
54+
DB.Exec("ALTER TABLE projects ADD COLUMN workflow TEXT DEFAULT ''")
55+
DB.Exec("ALTER TABLE projects ADD COLUMN cover_image TEXT DEFAULT ''")
56+
4257
log.Println("Database initialized successfully")
4358
return nil
4459
}

database/models.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,14 @@ type ModelProvider struct {
2020
CreatedAt time.Time `db:"created_at" json:"createdAt"`
2121
UpdatedAt time.Time `db:"updated_at" json:"updatedAt"`
2222
}
23+
24+
// Project represents a project entity
25+
type Project struct {
26+
ID int `db:"id" json:"id"`
27+
Name string `db:"name" json:"name"`
28+
Description string `db:"description" json:"description"`
29+
Workflow string `db:"workflow" json:"workflow"`
30+
CoverImage string `db:"cover_image" json:"coverImage"`
31+
CreatedAt time.Time `db:"created_at" json:"createdAt"`
32+
UpdatedAt time.Time `db:"updated_at" json:"updatedAt"`
33+
}

database/repository.go

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ func SaveModelProvider(config ModelProvider) error {
4545

4646
// Update
4747
_, err := DB.NamedExec(`
48-
UPDATE model_providers
48+
UPDATE projects
4949
SET name = :name, type = :type, api_key = :api_key, base_url = :base_url, updated_at = CURRENT_TIMESTAMP
5050
WHERE id = :id
5151
`, config)
@@ -68,3 +68,63 @@ func ListModelProviders() ([]ModelProvider, error) {
6868
}
6969
return configs, nil
7070
}
71+
72+
// GetProject retrieves a project by ID
73+
func GetProject(id int) (*Project, error) {
74+
var project Project
75+
err := DB.Get(&project, "SELECT * FROM projects WHERE id = ?", id)
76+
if err != nil {
77+
if errors.Is(err, sql.ErrNoRows) {
78+
return nil, nil // Not found
79+
}
80+
return nil, err
81+
}
82+
return &project, nil
83+
}
84+
85+
// SaveProject saves or updates a project
86+
func SaveProject(project Project) (*Project, error) {
87+
if project.ID == 0 {
88+
// Insert
89+
result, err := DB.NamedExec(`
90+
INSERT INTO projects (name, description, workflow, cover_image, created_at, updated_at)
91+
VALUES (:name, :description, :workflow, :cover_image, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
92+
`, project)
93+
if err != nil {
94+
return nil, err
95+
}
96+
id, err := result.LastInsertId()
97+
if err != nil {
98+
return nil, err
99+
}
100+
project.ID = int(id)
101+
return GetProject(project.ID)
102+
}
103+
104+
// Update
105+
_, err := DB.NamedExec(`
106+
UPDATE projects
107+
SET name = :name, description = :description, workflow = :workflow, cover_image = :cover_image, updated_at = CURRENT_TIMESTAMP
108+
WHERE id = :id
109+
`, project)
110+
if err != nil {
111+
return nil, err
112+
}
113+
return GetProject(project.ID)
114+
}
115+
116+
// DeleteProject deletes a project
117+
func DeleteProject(id int) error {
118+
_, err := DB.Exec("DELETE FROM projects WHERE id = ?", id)
119+
return err
120+
}
121+
122+
// ListProjects lists all projects
123+
func ListProjects() ([]Project, error) {
124+
var projects []Project
125+
err := DB.Select(&projects, "SELECT * FROM projects ORDER BY updated_at DESC")
126+
if err != nil {
127+
return nil, err
128+
}
129+
return projects, nil
130+
}

frontend/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
"class-variance-authority": "^0.7.1",
1818
"clsx": "^2.1.1",
1919
"cmdk": "^1.1.1",
20+
"html-to-image": "^1.11.13",
2021
"lucide-react": "^0.562.0",
2122
"next-themes": "^0.4.6",
2223
"radix-ui": "^1.4.3",

frontend/pnpm-lock.yaml

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

frontend/src/App.tsx

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,15 @@ import { CanvasView } from "@/components/canvas-view";
44
import { AppSidebar } from "@/components/app-sidebar";
55
import { SettingsDialog } from "@/components/settings/settings-dialog";
66
import { useState } from "react";
7-
8-
interface Project {
9-
id: string;
10-
name: string;
11-
image: string;
12-
}
7+
import { database } from "../wailsjs/go/models";
138

149
export default function App() {
15-
const [selectedProject, setSelectedProject] = useState<Project | null>(null);
10+
const [selectedProject, setSelectedProject] = useState<database.Project | null>(
11+
null
12+
);
1613
const [isSettingsOpen, setIsSettingsOpen] = useState(false);
1714

18-
const handleProjectClick = (project: Project) => {
15+
const handleProjectClick = (project: database.Project) => {
1916
setSelectedProject(project);
2017
};
2118

@@ -27,8 +24,7 @@ export default function App() {
2724
return (
2825
<div className="h-screen">
2926
<CanvasView
30-
projectId={selectedProject.id}
31-
projectName={selectedProject.name}
27+
project={selectedProject}
3228
onBack={handleBackToProjects}
3329
/>
3430
</div>

0 commit comments

Comments
 (0)