From 16704aeeb1cbc4320abf3a02d96e2fb540b0c5fb Mon Sep 17 00:00:00 2001 From: Gregory Ballantine Date: Tue, 28 Nov 2023 16:36:11 -0500 Subject: [PATCH] Added ability to create projects --- go.mod | 17 +++++++++++++---- go.sum | 24 ++++++++++++++++++++++++ main.go | 2 -- models/init.go | 6 ------ templates/project/create.tmpl | 10 +++++----- templates/project/list.tmpl | 4 ++-- web/forms/project.go | 6 ++++++ web/routes.go | 3 +++ web/routes/project.go | 27 +++++++++++++++++++++++++++ 9 files changed, 80 insertions(+), 19 deletions(-) create mode 100644 web/forms/project.go diff --git a/go.mod b/go.mod index 28e9769..9597030 100644 --- a/go.mod +++ b/go.mod @@ -2,16 +2,24 @@ module git.metaunix.net/bitgoblin/blt go 1.18 +require ( + github.com/flamego/flamego v1.9.4 + github.com/flamego/template v1.2.2 + gorm.io/driver/sqlite v1.5.4 + gorm.io/gorm v1.25.5 +) + require ( github.com/alecthomas/participle/v2 v2.0.0 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/charmbracelet/lipgloss v0.7.1 // indirect github.com/charmbracelet/log v0.2.3 // indirect - github.com/flamego/flamego v1.9.4 - github.com/flamego/template v1.2.2 + github.com/flamego/binding v1.3.0 // indirect + github.com/flamego/validator v1.0.0 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect + github.com/leodido/go-urn v1.2.1 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/mattn/go-isatty v0.0.18 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect @@ -20,7 +28,8 @@ require ( github.com/muesli/termenv v0.15.2 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/rivo/uniseg v0.2.0 // indirect + golang.org/x/crypto v0.0.0-20210920023735-84f357641f63 // indirect golang.org/x/sys v0.7.0 // indirect - gorm.io/driver/sqlite v1.5.4 - gorm.io/gorm v1.25.5 + golang.org/x/text v0.3.7 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index d014e5a..429e15a 100644 --- a/go.sum +++ b/go.sum @@ -12,18 +12,25 @@ github.com/charmbracelet/log v0.2.3 h1:YVmBhJtpGL7nW/nlf5u+SEloU8XYljxozGzZpgwIv github.com/charmbracelet/log v0.2.3/go.mod h1:ZApwwzDbbETVTIRTk7724yQRJAXIktt98yGVMMaa3y8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/flamego/binding v1.3.0 h1:CPbnSuP0SxT50JR7lK2khTjcQi1oOECqRK7kbOYw91U= +github.com/flamego/binding v1.3.0/go.mod h1:xgm6FEpEKKkF8CQilK2X3MJ5kTjOTnYdz/ooFctDTdc= github.com/flamego/flamego v1.9.1/go.mod h1:WjaZO8GM/EGvIIGXlOiwp3oPuyy1fAdjWqEgEJWovJo= github.com/flamego/flamego v1.9.4 h1:SNsooIfNa6ljQM1rBmfg4cFcXPIhQdG/uvNHqXxPvD8= github.com/flamego/flamego v1.9.4/go.mod h1:2tAVbugA3fgX8xOBoqR2jmJSSvZDLBFGXTFCR5h5eAU= github.com/flamego/template v1.2.2 h1:aMpt8RzXBb2ZGuABf9p/q8oBBpXrurUV8rgBbz7mj2o= github.com/flamego/template v1.2.2/go.mod h1:xTAmwCCPaOuxN5t4CpzOP7WZN5WkLRiJfJCpsiB0aUg= +github.com/flamego/validator v1.0.0 h1:ixuWHVgiVGp4pVGtUn/0d6HBjZJbbXfJHDNkxW+rZoY= +github.com/flamego/validator v1.0.0/go.mod h1:POYn0/5iW4sdamdPAYPrzqN6DFC4YaczY0gYY+Pyx5E= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= @@ -49,17 +56,34 @@ github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210920023735-84f357641f63 h1:kETrAMYZq6WVGPa8IIixL0CaEcIUNi+1WX7grUoi3y8= +golang.org/x/crypto v0.0.0-20210920023735-84f357641f63/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/sqlite v1.5.4 h1:IqXwXi8M/ZlPzH/947tn5uik3aYQslP9BVveoax0nV0= gorm.io/driver/sqlite v1.5.4/go.mod h1:qxAuCol+2r6PannQDpOP1FP6ag3mKi4esLnB/jHed+4= diff --git a/main.go b/main.go index 7f63c96..c4ede23 100644 --- a/main.go +++ b/main.go @@ -20,8 +20,6 @@ func main() { // initialize database models.Open() - // defer database connection closing til the app exits - defer models.Close() // initialize templating engine f.Use(template.Templater()) diff --git a/models/init.go b/models/init.go index 5212fbe..d4ea6e1 100644 --- a/models/init.go +++ b/models/init.go @@ -24,9 +24,3 @@ func Open() { DB.AutoMigrate(&Project{}, &Hardware{}, &Benchmark{}) log.Println("Database migrations complete.") } - -// Used to close the database connection; should be only called in main() as a deferral -func Close() error { - return DB.Close() -} - diff --git a/templates/project/create.tmpl b/templates/project/create.tmpl index d79aa07..50606b3 100644 --- a/templates/project/create.tmpl +++ b/templates/project/create.tmpl @@ -1,13 +1,13 @@ {{ template "header" . }}
-

Add a project

+

Create a project

-
+
-
diff --git a/templates/project/list.tmpl b/templates/project/list.tmpl index 320f92a..ffa7568 100644 --- a/templates/project/list.tmpl +++ b/templates/project/list.tmpl @@ -2,7 +2,7 @@

Projects

- Add a project + Create a new project @@ -15,7 +15,7 @@ {{ range $p := .projects }} - + diff --git a/web/forms/project.go b/web/forms/project.go new file mode 100644 index 0000000..35a1738 --- /dev/null +++ b/web/forms/project.go @@ -0,0 +1,6 @@ +package forms + +type ProjectForm struct { + Name string `form:"project_name" validate:"required"` + Description string `form:"project_description"` +} diff --git a/web/routes.go b/web/routes.go index d11527d..43118a2 100644 --- a/web/routes.go +++ b/web/routes.go @@ -1,8 +1,10 @@ package web import ( + "github.com/flamego/binding" "github.com/flamego/flamego" + "git.metaunix.net/bitgoblin/blt/web/forms" "git.metaunix.net/bitgoblin/blt/web/routes" ) @@ -19,5 +21,6 @@ func RegisterRoutes(f *flamego.Flame) { f.Get("/list", routes.ProjectGetList) f.Get("/create", routes.ProjectGetCreate) + f.Post("/create", binding.Form(forms.ProjectForm{}), routes.ProjectPostCreate) }) } diff --git a/web/routes/project.go b/web/routes/project.go index 4f8dd99..fa78958 100644 --- a/web/routes/project.go +++ b/web/routes/project.go @@ -1,11 +1,17 @@ package routes import ( + "fmt" + "log" "net/http" + "github.com/flamego/binding" + "github.com/flamego/flamego" "github.com/flamego/template" + "github.com/flamego/validator" "git.metaunix.net/bitgoblin/blt/models" + "git.metaunix.net/bitgoblin/blt/web/forms" ) func ProjectGetList(t template.Template, data template.Data) { @@ -22,3 +28,24 @@ func ProjectGetCreate(t template.Template, data template.Data) { data["title"] = "Create a Project" t.HTML(http.StatusOK, "project/create") } + +func ProjectPostCreate(c flamego.Context, form forms.ProjectForm, errs binding.Errors) { + if len(errs) > 0 { + var err error + switch errs[0].Category { + case binding.ErrorCategoryValidation: + err = errs[0].Err.(validator.ValidationErrors)[0] + default: + err = errs[0].Err + } + log.Fatal(err) + } + + project := models.Project{ + Name: form.Name, + Description: form.Description, + } + _ = models.DB.Create(&project) + + c.Redirect(fmt.Sprintf("/project/%d", project.ID)) +}
{{ $p.Name }}{{ $p.Name }} {{ $p.CreatedAt.Format "01/02/2006 15:04am" }} {{ $p.UpdatedAt.Format "01/02/2006 15:04am" }}