handle edge case of conflicting package names with handler generation

This commit is contained in:
Shane C. 2024-11-07 10:49:31 -05:00
parent 0ef25382b0
commit 45ac5faec6
Signed by: Shane C.
GPG key ID: E46B5FEA35B22FF9
8 changed files with 115 additions and 6 deletions

View file

@ -14,9 +14,13 @@ import (
"gitlab.com/omnibill/linux" "gitlab.com/omnibill/linux"
"gitlab.com/omnibill/tui/confirmation" "gitlab.com/omnibill/tui/confirmation"
"gitlab.com/omnibill/tui/textinput" "gitlab.com/omnibill/tui/textinput"
"go/format"
"go/parser"
"go/token"
"golang.org/x/mod/modfile" "golang.org/x/mod/modfile"
"golang.org/x/text/cases" "golang.org/x/text/cases"
"golang.org/x/text/language" "golang.org/x/text/language"
"io"
"io/fs" "io/fs"
"log" "log"
"os" "os"
@ -236,6 +240,10 @@ var handlerCmd = &cobra.Command{
log.Fatalln(err) log.Fatalln(err)
} }
if len(pathSplit) == 1 {
tmplData.PackagePath = "handlers"
}
for i, _ := range pathSplit { for i, _ := range pathSplit {
isLast := i == len(pathSplit)-1 isLast := i == len(pathSplit)-1
path := filepath.Join(append([]string{handlerDir}, pathSplit[0:i+1]...)...) path := filepath.Join(append([]string{handlerDir}, pathSplit[0:i+1]...)...)
@ -246,9 +254,38 @@ var handlerCmd = &cobra.Command{
if err := os.MkdirAll(path, 0740); err != nil { if err := os.MkdirAll(path, 0740); err != nil {
log.Fatalln(err) log.Fatalln(err)
} }
if err := os.Rename(path+".go", path+"/index.go"); err != nil { if err := os.Rename(path+".go", path+"/index.go"); err != nil {
log.Fatalln(err) log.Fatalln(err)
} }
file, err := os.OpenFile(path+"/index.go", os.O_RDWR|os.O_CREATE, 0600)
if err != nil {
log.Fatalln(err)
}
fset := token.NewFileSet()
node, err := parser.ParseFile(fset, path+"/index.go", file, parser.ParseComments)
if err != nil {
log.Fatalln(err)
}
node.Name.Name = tmplData.PackagePath
if err := file.Truncate(0); err != nil {
log.Fatalln(err)
}
_, err = file.Seek(0, io.SeekStart)
if err != nil {
log.Fatalf("Failed to seek to beginning: %v", err)
}
if err := format.Node(file, fset, node); err != nil {
log.Fatalln(err)
}
file.Close()
} }
if _, err := os.Lstat(path); err != nil && !errors.Is(err, fs.ErrNotExist) { if _, err := os.Lstat(path); err != nil && !errors.Is(err, fs.ErrNotExist) {

View file

@ -44,11 +44,12 @@ func Execute() {
func init() { func init() {
cobra.OnInitialize(initConfig) cobra.OnInitialize(initConfig)
rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.omnibill.yaml)") rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.omnibill.toml)")
} }
// initConfig reads in config file and ENV variables if set. // initConfig reads in config file and ENV variables if set.
func initConfig() { func initConfig() {
// All my homies hate yaml, lol.
viper.SetConfigType("toml") viper.SetConfigType("toml")
if cfgFile != "" { if cfgFile != "" {
viper.SetConfigFile(cfgFile) viper.SetConfigFile(cfgFile)

View file

@ -13,16 +13,17 @@ import (
"github.com/gofiber/fiber/v2/middleware/session" "github.com/gofiber/fiber/v2/middleware/session"
"github.com/uptrace/bun" "github.com/uptrace/bun"
"go.uber.org/zap" "go.uber.org/zap"
{{- if .GetView }}
"{{.ModulePath}}/web/utils" "{{.ModulePath}}/web/utils"
{{ end }}
. "{{.ModulePath}}/web/utils/handler"
{{- if .GetView }} {{- if .GetView }}
PAGE_VIEW "{{.ModulePath}}/web/views/{{.Path}}" PAGE_VIEW "{{.ModulePath}}/web/views/{{.Path}}"
{{ end }} {{ end }}
) )
func init() { func init() {
utils.Handlers = append(utils.Handlers, &{{.UpperName}}Handler{ Register({{.UpperName}}Handler{Path: "{{.Path}}"})
Path: "{{.Path}}",
})
} }
type {{.UpperName}}Handler struct { type {{.UpperName}}Handler struct {

View file

@ -1,4 +1,4 @@
// Code generated by Omnibill - DO NOT EDIT // Code generated by omnibill - DO NOT EDIT.
package handlers package handlers

3
go.mod
View file

@ -23,6 +23,7 @@ require (
) )
require ( require (
github.com/AfterShip/email-verifier v1.4.1 // indirect
github.com/a-h/templ v0.2.793 // indirect github.com/a-h/templ v0.2.793 // indirect
github.com/andybalholm/brotli v1.1.1 // indirect github.com/andybalholm/brotli v1.1.1 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect
@ -34,6 +35,7 @@ require (
github.com/google/go-tpm v0.9.1 // indirect github.com/google/go-tpm v0.9.1 // indirect
github.com/google/uuid v1.6.0 // indirect github.com/google/uuid v1.6.0 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect
github.com/hbollon/go-edlib v1.6.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
@ -69,6 +71,7 @@ require (
go.uber.org/atomic v1.9.0 // indirect go.uber.org/atomic v1.9.0 // indirect
go.uber.org/multierr v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
golang.org/x/net v0.30.0 // indirect
golang.org/x/sync v0.8.0 // indirect golang.org/x/sync v0.8.0 // indirect
golang.org/x/sys v0.26.0 // indirect golang.org/x/sys v0.26.0 // indirect
golang.org/x/term v0.25.0 // indirect golang.org/x/term v0.25.0 // indirect

6
go.sum
View file

@ -1,3 +1,5 @@
github.com/AfterShip/email-verifier v1.4.1 h1:vDmnqq680siSLw8rtiAYaqgmqYeW+AUoMfEY1RjWK8k=
github.com/AfterShip/email-verifier v1.4.1/go.mod h1:AcFyA5b7X6L4l5dBuemWBSh8mq74nxkBTtoWgLOFrbw=
github.com/a-h/templ v0.2.793 h1:Io+/ocnfGWYO4VHdR0zBbf39PQlnzVCVVD+wEEs6/qY= github.com/a-h/templ v0.2.793 h1:Io+/ocnfGWYO4VHdR0zBbf39PQlnzVCVVD+wEEs6/qY=
github.com/a-h/templ v0.2.793/go.mod h1:lq48JXoUvuQrU0VThrK31yFwdRjTCnIE5bcPCM9IP1w= github.com/a-h/templ v0.2.793/go.mod h1:lq48JXoUvuQrU0VThrK31yFwdRjTCnIE5bcPCM9IP1w=
github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA=
@ -32,6 +34,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/hbollon/go-edlib v1.6.0 h1:ga7AwwVIvP8mHm9GsPueC0d71cfRU/52hmPJ7Tprv4E=
github.com/hbollon/go-edlib v1.6.0/go.mod h1:wnt6o6EIVEzUfgbUZY7BerzQ2uvzp354qmS2xaLkrhM=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
@ -149,6 +153,8 @@ golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0= golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0=
golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=

View file

@ -0,0 +1,62 @@
package handler
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/session"
"go.uber.org/zap"
"omnibill.net/omnibill/web/utils"
)
// Register registers the handler with the webserver.
// It takes a handler as it's input.
// If the handler does not implement any of the handler interfaces, it will panic.
func Register(handler any) {
var hasHandler bool
if _, ok := handler.(utils.GET); ok {
hasHandler = true
}
if _, ok := handler.(utils.POST); ok {
hasHandler = true
}
if _, ok := handler.(utils.PUT); ok {
hasHandler = true
}
if _, ok := handler.(utils.DELETE); ok {
hasHandler = true
}
if _, ok := handler.(utils.PATCH); ok {
hasHandler = true
}
if _, ok := handler.(utils.HEAD); ok {
hasHandler = true
}
if _, ok := handler.(utils.OPTIONS); ok {
hasHandler = true
}
if !hasHandler {
panic("Invalid handler")
}
utils.Handlers = append(utils.Handlers, &handler)
}
// DestroySession destroys any Session provided to it.
// It takes: zap.Logger, session.Session, fiber.Ctx, and an optional redirectPath of type string.
// The function returns a redirect with an error, or just an error, if any.
func DestroySession(logger *zap.Logger, sess *session.Session, ctx *fiber.Ctx, redirectPath ...string) error {
if err := sess.Destroy(); err != nil {
logger.Error("error destroying session", zap.Error(err))
return fiber.ErrInternalServerError
}
if err := sess.Save(); err != nil {
logger.Error("error saving session", zap.Error(err))
return fiber.ErrInternalServerError
}
if redirectPath != nil && len(redirectPath) > 0 {
return ctx.Redirect(redirectPath[0])
} else {
return nil
}
}

View file

@ -1 +0,0 @@
package utils