diff --git a/.gitignore b/.gitignore index 849ddff..e0341b1 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ dist/ + +# Database +gorm.db diff --git a/cmd/generate/main.go b/cmd/generate/main.go new file mode 100644 index 0000000..078421c --- /dev/null +++ b/cmd/generate/main.go @@ -0,0 +1,28 @@ +package main + +import ( + "code.tjo.space/mentos1386/zdravko/internal" + "code.tjo.space/mentos1386/zdravko/internal/models" + "gorm.io/gen" +) + +func main() { + // Initialize the generator with configuration + g := gen.NewGenerator(gen.Config{ + OutPath: "internal/database/query", + Mode: gen.WithDefaultQuery | gen.WithQueryInterface, + FieldNullable: true, + }) + + db, _ := internal.ConnectToDatabase() + + // Use the above `*gorm.DB` instance to initialize the generator, + // which is required to generate structs from db when using `GenerateModel/GenerateModelAs` + g.UseDB(db) + + // Generate default DAO interface for those specified structs + g.ApplyBasic(models.Healthcheck{}) + + // Execute the generator + g.Execute() +} diff --git a/cmd/server/main.go b/cmd/server/main.go index dd2a8e4..76c2023 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -9,6 +9,7 @@ import ( "code.tjo.space/mentos1386/zdravko/internal" "code.tjo.space/mentos1386/zdravko/internal/pages" + "code.tjo.space/mentos1386/zdravko/internal/static" ) func main() { @@ -19,11 +20,19 @@ func main() { r := mux.NewRouter() - // Server static files - r.PathPrefix("/static/").Handler(http.FileServer(http.FS(internal.Static))) + db, err := internal.ConnectToDatabase() + if err != nil { + log.Fatal(err) + } + log.Println("Connected to database") - r.HandleFunc("/", pages.Index).Methods("GET") - r.HandleFunc("/settings", pages.Settings).Methods("GET") + page := pages.NewPageHandler(db) + + // Server static files + r.PathPrefix("/static/").Handler(http.StripPrefix("/static/", http.FileServer(http.FS(static.Static)))) + + r.HandleFunc("/", page.Index).Methods("GET") + r.HandleFunc("/settings", page.Settings).Methods("GET") log.Println("Server started on", port) log.Fatal(http.ListenAndServe(":"+port, r)) diff --git a/go.mod b/go.mod index 6b28684..38f556c 100644 --- a/go.mod +++ b/go.mod @@ -9,30 +9,51 @@ require ( require ( github.com/davecgh/go-spew v1.1.1 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a // indirect + github.com/glebarez/go-sqlite v1.22.0 // indirect + github.com/glebarez/sqlite v1.10.0 // indirect + github.com/go-sql-driver/mysql v1.7.1 // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/gogo/status v1.1.1 // indirect github.com/golang/mock v1.6.0 // indirect github.com/golang/protobuf v1.5.3 // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/ncruces/go-strftime v0.1.9 // indirect github.com/pborman/uuid v1.2.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/robfig/cron v1.2.0 // indirect github.com/stretchr/objx v0.5.0 // indirect github.com/stretchr/testify v1.8.4 // indirect go.temporal.io/api v1.24.0 // indirect go.uber.org/atomic v1.9.0 // indirect - golang.org/x/net v0.14.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/text v0.12.0 // indirect + golang.org/x/mod v0.15.0 // indirect + golang.org/x/net v0.20.0 // indirect + golang.org/x/sys v0.17.0 // indirect + golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.3.0 // indirect + golang.org/x/tools v0.17.0 // indirect google.golang.org/genproto v0.0.0-20230815205213-6bfd019c3878 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20230815205213-6bfd019c3878 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230815205213-6bfd019c3878 // indirect google.golang.org/grpc v1.57.0 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + gorm.io/datatypes v1.2.0 // indirect + gorm.io/driver/mysql v1.5.4 // indirect + gorm.io/gen v0.3.25 // indirect + gorm.io/gorm v1.25.7 // indirect + gorm.io/hints v1.1.2 // indirect + gorm.io/plugin/dbresolver v1.5.0 // indirect + modernc.org/libc v1.41.0 // indirect + modernc.org/mathutil v1.6.0 // indirect + modernc.org/memory v1.7.2 // indirect + modernc.org/sqlite v1.28.0 // indirect ) diff --git a/go.sum b/go.sum index 905e120..6fb46a3 100644 --- a/go.sum +++ b/go.sum @@ -801,6 +801,7 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -824,6 +825,10 @@ github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a/go.mod h1:7Ga40eg github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/glebarez/go-sqlite v1.22.0 h1:uAcMJhaA6r3LHMTFgP0SifzgXg46yJkgxqyuyec+ruQ= +github.com/glebarez/go-sqlite v1.22.0/go.mod h1:PlBIdHe0+aUEFn+r2/uthrWq4FxbzugL0L8Li6yQJbc= +github.com/glebarez/sqlite v1.10.0 h1:u4gt8y7OND/cCei/NMHmfbLxF6xP2wgKcT/BJf2pYkc= +github.com/glebarez/sqlite v1.10.0/go.mod h1:IJ+lfSOmiekhQsFTJRx/lHtGYmCdtAiTaf5wI9u5uHA= github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= @@ -838,6 +843,10 @@ github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpx github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= +github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= @@ -933,6 +942,10 @@ github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +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/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= @@ -967,6 +980,11 @@ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +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.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= @@ -994,10 +1012,15 @@ github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WV github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= +github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= @@ -1016,6 +1039,7 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ= github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= @@ -1150,6 +1174,8 @@ golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1212,6 +1238,7 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1341,6 +1368,8 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1370,6 +1399,7 @@ golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1441,6 +1471,8 @@ golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= +golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1767,6 +1799,25 @@ gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/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/datatypes v1.2.0 h1:5YT+eokWdIxhJgWHdrb2zYUimyk0+TaFth+7a0ybzco= +gorm.io/datatypes v1.2.0/go.mod h1:o1dh0ZvjIjhH/bngTpypG6lVRJ5chTBxE09FH/71k04= +gorm.io/driver/mysql v1.4.3/go.mod h1:sSIebwZAVPiT+27jK9HIwvsqOGKx3YMPmrA3mBJR10c= +gorm.io/driver/mysql v1.5.4 h1:igQmHfKcbaTVyAIHNhhB888vvxh8EdQ2uSUT0LPcBso= +gorm.io/driver/mysql v1.5.4/go.mod h1:9rYxJph/u9SWkWc9yY4XJ1F/+xO0S/ChOmbk3+Z5Tvs= +gorm.io/driver/sqlite v1.5.0/go.mod h1:kDMDfntV9u/vuMmz8APHtHF0b4nyBB7sfCieC6G8k8I= +gorm.io/gen v0.3.25 h1:uT/1YfvcnYUdike4XPYyi89FEnVHZF115GUXQm2Sfug= +gorm.io/gen v0.3.25/go.mod h1:p+t0iCKjaPz+pKRxcx63nXdRgnrah/QD2l92747ihyA= +gorm.io/gorm v1.23.8/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= +gorm.io/gorm v1.24.7-0.20230306060331-85eaf9eeda11/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= +gorm.io/gorm v1.25.0/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= +gorm.io/gorm v1.25.2/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= +gorm.io/gorm v1.25.7-0.20240204074919-46816ad31dde/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.25.7 h1:VsD6acwRjz2zFxGO50gPO6AkNs7KKnvfzUjHQhZDz/A= +gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/hints v1.1.2 h1:b5j0kwk5p4+3BtDtYqqfY+ATSxjj+6ptPgVveuynn9o= +gorm.io/hints v1.1.2/go.mod h1:/ARdpUHAtyEMCh5NNi3tI7FsGh+Cj/MIUlvNxCNCFWg= +gorm.io/plugin/dbresolver v1.5.0 h1:XVHLxh775eP0CqVh3vcfJtYqja3uFl5Wr3cKlY8jgDY= +gorm.io/plugin/dbresolver v1.5.0/go.mod h1:l4Cn87EHLEYuqUncpEeTC2tTJQkjngPSD+lo8hIvcT0= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1805,19 +1856,27 @@ modernc.org/libc v1.18.0/go.mod h1:vj6zehR5bfc98ipowQOM2nIDUZnVew/wNC/2tOGS+q0= modernc.org/libc v1.20.3/go.mod h1:ZRfIaEkgrYgZDl6pa4W39HgN5G/yDW+NRmNKZBDFrk0= modernc.org/libc v1.21.4/go.mod h1:przBsL5RDOZajTVslkugzLBj1evTue36jEomFQOoYuI= modernc.org/libc v1.22.2/go.mod h1:uvQavJ1pZ0hIoC/jfqNoMLURIMhKzINIWypNM17puug= +modernc.org/libc v1.41.0 h1:g9YAc6BkKlgORsUWj+JwqoB1wU3o4DE3bM3yvA3k+Gk= +modernc.org/libc v1.41.0/go.mod h1:w0eszPsiXoOnoMJgrXjglgLuDy/bt5RR4y3QzUUeodY= modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= modernc.org/memory v1.3.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= modernc.org/memory v1.4.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= +modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= modernc.org/sqlite v1.18.2/go.mod h1:kvrTLEWgxUcHa2GfHBQtanR1H9ht3hTJNtKpzH9k1u0= +modernc.org/sqlite v1.28.0 h1:Zx+LyDDmXczNnEQdvPuEfcFVA2ZPyaD7UCZDjef3BHQ= +modernc.org/sqlite v1.28.0/go.mod h1:Qxpazz0zH8Z1xCFyi5GSL3FzbtZ3fvbjmywNogldEW0= modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= diff --git a/internal/database.go b/internal/database.go new file mode 100644 index 0000000..e1a31d7 --- /dev/null +++ b/internal/database.go @@ -0,0 +1,16 @@ +package internal + +import ( + "github.com/glebarez/sqlite" + "gorm.io/gorm" +) + +// go:generate just _generate-gorm +func ConnectToDatabase() (*gorm.DB, error) { + db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{}) + if err != nil { + return nil, err + } + + return db, nil +} diff --git a/internal/models/models.go b/internal/models/models.go new file mode 100644 index 0000000..27ab8bd --- /dev/null +++ b/internal/models/models.go @@ -0,0 +1,8 @@ +package models + +type Healthcheck struct { + ID uint `gorm:"primary_key"` + Name string + Status string // UP, DOWN + UptimePercentage float64 +} diff --git a/internal/models/query/gen.go b/internal/models/query/gen.go new file mode 100644 index 0000000..ccee5be --- /dev/null +++ b/internal/models/query/gen.go @@ -0,0 +1,103 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package query + +import ( + "context" + "database/sql" + + "gorm.io/gorm" + + "gorm.io/gen" + + "gorm.io/plugin/dbresolver" +) + +var ( + Q = new(Query) + Healthcheck *healthcheck +) + +func SetDefault(db *gorm.DB, opts ...gen.DOOption) { + *Q = *Use(db, opts...) + Healthcheck = &Q.Healthcheck +} + +func Use(db *gorm.DB, opts ...gen.DOOption) *Query { + return &Query{ + db: db, + Healthcheck: newHealthcheck(db, opts...), + } +} + +type Query struct { + db *gorm.DB + + Healthcheck healthcheck +} + +func (q *Query) Available() bool { return q.db != nil } + +func (q *Query) clone(db *gorm.DB) *Query { + return &Query{ + db: db, + Healthcheck: q.Healthcheck.clone(db), + } +} + +func (q *Query) ReadDB() *Query { + return q.ReplaceDB(q.db.Clauses(dbresolver.Read)) +} + +func (q *Query) WriteDB() *Query { + return q.ReplaceDB(q.db.Clauses(dbresolver.Write)) +} + +func (q *Query) ReplaceDB(db *gorm.DB) *Query { + return &Query{ + db: db, + Healthcheck: q.Healthcheck.replaceDB(db), + } +} + +type queryCtx struct { + Healthcheck IHealthcheckDo +} + +func (q *Query) WithContext(ctx context.Context) *queryCtx { + return &queryCtx{ + Healthcheck: q.Healthcheck.WithContext(ctx), + } +} + +func (q *Query) Transaction(fc func(tx *Query) error, opts ...*sql.TxOptions) error { + return q.db.Transaction(func(tx *gorm.DB) error { return fc(q.clone(tx)) }, opts...) +} + +func (q *Query) Begin(opts ...*sql.TxOptions) *QueryTx { + tx := q.db.Begin(opts...) + return &QueryTx{Query: q.clone(tx), Error: tx.Error} +} + +type QueryTx struct { + *Query + Error error +} + +func (q *QueryTx) Commit() error { + return q.db.Commit().Error +} + +func (q *QueryTx) Rollback() error { + return q.db.Rollback().Error +} + +func (q *QueryTx) SavePoint(name string) error { + return q.db.SavePoint(name).Error +} + +func (q *QueryTx) RollbackTo(name string) error { + return q.db.RollbackTo(name).Error +} diff --git a/internal/models/query/healthchecks.gen.go b/internal/models/query/healthchecks.gen.go new file mode 100644 index 0000000..07a9a74 --- /dev/null +++ b/internal/models/query/healthchecks.gen.go @@ -0,0 +1,402 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package query + +import ( + "context" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gorm.io/gen" + "gorm.io/gen/field" + + "gorm.io/plugin/dbresolver" + + "code.tjo.space/mentos1386/zdravko/internal/database" +) + +func newHealthcheck(db *gorm.DB, opts ...gen.DOOption) healthcheck { + _healthcheck := healthcheck{} + + _healthcheck.healthcheckDo.UseDB(db, opts...) + _healthcheck.healthcheckDo.UseModel(&database.Healthcheck{}) + + tableName := _healthcheck.healthcheckDo.TableName() + _healthcheck.ALL = field.NewAsterisk(tableName) + _healthcheck.ID = field.NewUint(tableName, "id") + _healthcheck.Name = field.NewString(tableName, "name") + _healthcheck.Status = field.NewString(tableName, "status") + _healthcheck.UptimePercentage = field.NewFloat64(tableName, "uptime_percentage") + + _healthcheck.fillFieldMap() + + return _healthcheck +} + +type healthcheck struct { + healthcheckDo healthcheckDo + + ALL field.Asterisk + ID field.Uint + Name field.String + Status field.String + UptimePercentage field.Float64 + + fieldMap map[string]field.Expr +} + +func (h healthcheck) Table(newTableName string) *healthcheck { + h.healthcheckDo.UseTable(newTableName) + return h.updateTableName(newTableName) +} + +func (h healthcheck) As(alias string) *healthcheck { + h.healthcheckDo.DO = *(h.healthcheckDo.As(alias).(*gen.DO)) + return h.updateTableName(alias) +} + +func (h *healthcheck) updateTableName(table string) *healthcheck { + h.ALL = field.NewAsterisk(table) + h.ID = field.NewUint(table, "id") + h.Name = field.NewString(table, "name") + h.Status = field.NewString(table, "status") + h.UptimePercentage = field.NewFloat64(table, "uptime_percentage") + + h.fillFieldMap() + + return h +} + +func (h *healthcheck) WithContext(ctx context.Context) IHealthcheckDo { + return h.healthcheckDo.WithContext(ctx) +} + +func (h healthcheck) TableName() string { return h.healthcheckDo.TableName() } + +func (h healthcheck) Alias() string { return h.healthcheckDo.Alias() } + +func (h healthcheck) Columns(cols ...field.Expr) gen.Columns { return h.healthcheckDo.Columns(cols...) } + +func (h *healthcheck) GetFieldByName(fieldName string) (field.OrderExpr, bool) { + _f, ok := h.fieldMap[fieldName] + if !ok || _f == nil { + return nil, false + } + _oe, ok := _f.(field.OrderExpr) + return _oe, ok +} + +func (h *healthcheck) fillFieldMap() { + h.fieldMap = make(map[string]field.Expr, 4) + h.fieldMap["id"] = h.ID + h.fieldMap["name"] = h.Name + h.fieldMap["status"] = h.Status + h.fieldMap["uptime_percentage"] = h.UptimePercentage +} + +func (h healthcheck) clone(db *gorm.DB) healthcheck { + h.healthcheckDo.ReplaceConnPool(db.Statement.ConnPool) + return h +} + +func (h healthcheck) replaceDB(db *gorm.DB) healthcheck { + h.healthcheckDo.ReplaceDB(db) + return h +} + +type healthcheckDo struct{ gen.DO } + +type IHealthcheckDo interface { + gen.SubQuery + Debug() IHealthcheckDo + WithContext(ctx context.Context) IHealthcheckDo + WithResult(fc func(tx gen.Dao)) gen.ResultInfo + ReplaceDB(db *gorm.DB) + ReadDB() IHealthcheckDo + WriteDB() IHealthcheckDo + As(alias string) gen.Dao + Session(config *gorm.Session) IHealthcheckDo + Columns(cols ...field.Expr) gen.Columns + Clauses(conds ...clause.Expression) IHealthcheckDo + Not(conds ...gen.Condition) IHealthcheckDo + Or(conds ...gen.Condition) IHealthcheckDo + Select(conds ...field.Expr) IHealthcheckDo + Where(conds ...gen.Condition) IHealthcheckDo + Order(conds ...field.Expr) IHealthcheckDo + Distinct(cols ...field.Expr) IHealthcheckDo + Omit(cols ...field.Expr) IHealthcheckDo + Join(table schema.Tabler, on ...field.Expr) IHealthcheckDo + LeftJoin(table schema.Tabler, on ...field.Expr) IHealthcheckDo + RightJoin(table schema.Tabler, on ...field.Expr) IHealthcheckDo + Group(cols ...field.Expr) IHealthcheckDo + Having(conds ...gen.Condition) IHealthcheckDo + Limit(limit int) IHealthcheckDo + Offset(offset int) IHealthcheckDo + Count() (count int64, err error) + Scopes(funcs ...func(gen.Dao) gen.Dao) IHealthcheckDo + Unscoped() IHealthcheckDo + Create(values ...*database.Healthcheck) error + CreateInBatches(values []*database.Healthcheck, batchSize int) error + Save(values ...*database.Healthcheck) error + First() (*database.Healthcheck, error) + Take() (*database.Healthcheck, error) + Last() (*database.Healthcheck, error) + Find() ([]*database.Healthcheck, error) + FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*database.Healthcheck, err error) + FindInBatches(result *[]*database.Healthcheck, batchSize int, fc func(tx gen.Dao, batch int) error) error + Pluck(column field.Expr, dest interface{}) error + Delete(...*database.Healthcheck) (info gen.ResultInfo, err error) + Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + Updates(value interface{}) (info gen.ResultInfo, err error) + UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + UpdateColumns(value interface{}) (info gen.ResultInfo, err error) + UpdateFrom(q gen.SubQuery) gen.Dao + Attrs(attrs ...field.AssignExpr) IHealthcheckDo + Assign(attrs ...field.AssignExpr) IHealthcheckDo + Joins(fields ...field.RelationField) IHealthcheckDo + Preload(fields ...field.RelationField) IHealthcheckDo + FirstOrInit() (*database.Healthcheck, error) + FirstOrCreate() (*database.Healthcheck, error) + FindByPage(offset int, limit int) (result []*database.Healthcheck, count int64, err error) + ScanByPage(result interface{}, offset int, limit int) (count int64, err error) + Scan(result interface{}) (err error) + Returning(value interface{}, columns ...string) IHealthcheckDo + UnderlyingDB() *gorm.DB + schema.Tabler +} + +func (h healthcheckDo) Debug() IHealthcheckDo { + return h.withDO(h.DO.Debug()) +} + +func (h healthcheckDo) WithContext(ctx context.Context) IHealthcheckDo { + return h.withDO(h.DO.WithContext(ctx)) +} + +func (h healthcheckDo) ReadDB() IHealthcheckDo { + return h.Clauses(dbresolver.Read) +} + +func (h healthcheckDo) WriteDB() IHealthcheckDo { + return h.Clauses(dbresolver.Write) +} + +func (h healthcheckDo) Session(config *gorm.Session) IHealthcheckDo { + return h.withDO(h.DO.Session(config)) +} + +func (h healthcheckDo) Clauses(conds ...clause.Expression) IHealthcheckDo { + return h.withDO(h.DO.Clauses(conds...)) +} + +func (h healthcheckDo) Returning(value interface{}, columns ...string) IHealthcheckDo { + return h.withDO(h.DO.Returning(value, columns...)) +} + +func (h healthcheckDo) Not(conds ...gen.Condition) IHealthcheckDo { + return h.withDO(h.DO.Not(conds...)) +} + +func (h healthcheckDo) Or(conds ...gen.Condition) IHealthcheckDo { + return h.withDO(h.DO.Or(conds...)) +} + +func (h healthcheckDo) Select(conds ...field.Expr) IHealthcheckDo { + return h.withDO(h.DO.Select(conds...)) +} + +func (h healthcheckDo) Where(conds ...gen.Condition) IHealthcheckDo { + return h.withDO(h.DO.Where(conds...)) +} + +func (h healthcheckDo) Order(conds ...field.Expr) IHealthcheckDo { + return h.withDO(h.DO.Order(conds...)) +} + +func (h healthcheckDo) Distinct(cols ...field.Expr) IHealthcheckDo { + return h.withDO(h.DO.Distinct(cols...)) +} + +func (h healthcheckDo) Omit(cols ...field.Expr) IHealthcheckDo { + return h.withDO(h.DO.Omit(cols...)) +} + +func (h healthcheckDo) Join(table schema.Tabler, on ...field.Expr) IHealthcheckDo { + return h.withDO(h.DO.Join(table, on...)) +} + +func (h healthcheckDo) LeftJoin(table schema.Tabler, on ...field.Expr) IHealthcheckDo { + return h.withDO(h.DO.LeftJoin(table, on...)) +} + +func (h healthcheckDo) RightJoin(table schema.Tabler, on ...field.Expr) IHealthcheckDo { + return h.withDO(h.DO.RightJoin(table, on...)) +} + +func (h healthcheckDo) Group(cols ...field.Expr) IHealthcheckDo { + return h.withDO(h.DO.Group(cols...)) +} + +func (h healthcheckDo) Having(conds ...gen.Condition) IHealthcheckDo { + return h.withDO(h.DO.Having(conds...)) +} + +func (h healthcheckDo) Limit(limit int) IHealthcheckDo { + return h.withDO(h.DO.Limit(limit)) +} + +func (h healthcheckDo) Offset(offset int) IHealthcheckDo { + return h.withDO(h.DO.Offset(offset)) +} + +func (h healthcheckDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IHealthcheckDo { + return h.withDO(h.DO.Scopes(funcs...)) +} + +func (h healthcheckDo) Unscoped() IHealthcheckDo { + return h.withDO(h.DO.Unscoped()) +} + +func (h healthcheckDo) Create(values ...*database.Healthcheck) error { + if len(values) == 0 { + return nil + } + return h.DO.Create(values) +} + +func (h healthcheckDo) CreateInBatches(values []*database.Healthcheck, batchSize int) error { + return h.DO.CreateInBatches(values, batchSize) +} + +// Save : !!! underlying implementation is different with GORM +// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) +func (h healthcheckDo) Save(values ...*database.Healthcheck) error { + if len(values) == 0 { + return nil + } + return h.DO.Save(values) +} + +func (h healthcheckDo) First() (*database.Healthcheck, error) { + if result, err := h.DO.First(); err != nil { + return nil, err + } else { + return result.(*database.Healthcheck), nil + } +} + +func (h healthcheckDo) Take() (*database.Healthcheck, error) { + if result, err := h.DO.Take(); err != nil { + return nil, err + } else { + return result.(*database.Healthcheck), nil + } +} + +func (h healthcheckDo) Last() (*database.Healthcheck, error) { + if result, err := h.DO.Last(); err != nil { + return nil, err + } else { + return result.(*database.Healthcheck), nil + } +} + +func (h healthcheckDo) Find() ([]*database.Healthcheck, error) { + result, err := h.DO.Find() + return result.([]*database.Healthcheck), err +} + +func (h healthcheckDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*database.Healthcheck, err error) { + buf := make([]*database.Healthcheck, 0, batchSize) + err = h.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { + defer func() { results = append(results, buf...) }() + return fc(tx, batch) + }) + return results, err +} + +func (h healthcheckDo) FindInBatches(result *[]*database.Healthcheck, batchSize int, fc func(tx gen.Dao, batch int) error) error { + return h.DO.FindInBatches(result, batchSize, fc) +} + +func (h healthcheckDo) Attrs(attrs ...field.AssignExpr) IHealthcheckDo { + return h.withDO(h.DO.Attrs(attrs...)) +} + +func (h healthcheckDo) Assign(attrs ...field.AssignExpr) IHealthcheckDo { + return h.withDO(h.DO.Assign(attrs...)) +} + +func (h healthcheckDo) Joins(fields ...field.RelationField) IHealthcheckDo { + for _, _f := range fields { + h = *h.withDO(h.DO.Joins(_f)) + } + return &h +} + +func (h healthcheckDo) Preload(fields ...field.RelationField) IHealthcheckDo { + for _, _f := range fields { + h = *h.withDO(h.DO.Preload(_f)) + } + return &h +} + +func (h healthcheckDo) FirstOrInit() (*database.Healthcheck, error) { + if result, err := h.DO.FirstOrInit(); err != nil { + return nil, err + } else { + return result.(*database.Healthcheck), nil + } +} + +func (h healthcheckDo) FirstOrCreate() (*database.Healthcheck, error) { + if result, err := h.DO.FirstOrCreate(); err != nil { + return nil, err + } else { + return result.(*database.Healthcheck), nil + } +} + +func (h healthcheckDo) FindByPage(offset int, limit int) (result []*database.Healthcheck, count int64, err error) { + result, err = h.Offset(offset).Limit(limit).Find() + if err != nil { + return + } + + if size := len(result); 0 < limit && 0 < size && size < limit { + count = int64(size + offset) + return + } + + count, err = h.Offset(-1).Limit(-1).Count() + return +} + +func (h healthcheckDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { + count, err = h.Count() + if err != nil { + return + } + + err = h.Offset(offset).Limit(limit).Scan(result) + return +} + +func (h healthcheckDo) Scan(result interface{}) (err error) { + return h.DO.Scan(result) +} + +func (h healthcheckDo) Delete(models ...*database.Healthcheck) (result gen.ResultInfo, err error) { + return h.DO.Delete(models) +} + +func (h *healthcheckDo) withDO(do gen.Dao) *healthcheckDo { + h.DO = *do.(*gen.DO) + return h +} diff --git a/internal/pages/index.go b/internal/pages/index.go index 8473940..7ed10e9 100644 --- a/internal/pages/index.go +++ b/internal/pages/index.go @@ -4,13 +4,13 @@ import ( "net/http" "text/template" - "code.tjo.space/mentos1386/zdravko/internal" + "code.tjo.space/mentos1386/zdravko/internal/ui" ) -func Index(w http.ResponseWriter, r *http.Request) { - ts, err := template.ParseFS(internal.Templates, - "ui/components/base.tmpl", - "ui/pages/index.tmpl", +func (p *PageHandler) Index(w http.ResponseWriter, r *http.Request) { + ts, err := template.ParseFS(ui.Templates, + "components/base.tmpl", + "pages/index.tmpl", ) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) diff --git a/internal/pages/pages.go b/internal/pages/pages.go new file mode 100644 index 0000000..65beed1 --- /dev/null +++ b/internal/pages/pages.go @@ -0,0 +1,11 @@ +package pages + +import "gorm.io/gorm" + +type PageHandler struct { + db *gorm.DB +} + +func NewPageHandler(db *gorm.DB) *PageHandler { + return &PageHandler{db} +} diff --git a/internal/pages/settings.go b/internal/pages/settings.go index ed2db3a..f217b4b 100644 --- a/internal/pages/settings.go +++ b/internal/pages/settings.go @@ -4,13 +4,13 @@ import ( "net/http" "text/template" - "code.tjo.space/mentos1386/zdravko/internal" + "code.tjo.space/mentos1386/zdravko/internal/ui" ) -func Settings(w http.ResponseWriter, r *http.Request) { - ts, err := template.ParseFS(internal.Templates, - "ui/components/base.tmpl", - "ui/pages/settings.tmpl", +func (p *PageHandler) Settings(w http.ResponseWriter, r *http.Request) { + ts, err := template.ParseFS(ui.Templates, + "components/base.tmpl", + "pages/settings.tmpl", ) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) diff --git a/internal/static.go b/internal/static.go deleted file mode 100644 index 8a23f2e..0000000 --- a/internal/static.go +++ /dev/null @@ -1,9 +0,0 @@ -package internal - -import ( - "embed" -) - -//go:generate just tailwindcss-build -//go:embed static -var Static embed.FS diff --git a/internal/static/static.go b/internal/static/static.go new file mode 100644 index 0000000..6dbf289 --- /dev/null +++ b/internal/static/static.go @@ -0,0 +1,11 @@ +package static + +import ( + "embed" +) + +//go:generate just _tailwindcss-build +//go:generate just _htmx-download +//go:generate just _feather-icons-download +//go:embed * +var Static embed.FS diff --git a/internal/ui.go b/internal/ui/ui.go similarity index 59% rename from internal/ui.go rename to internal/ui/ui.go index 28c19e6..4b3c37c 100644 --- a/internal/ui.go +++ b/internal/ui/ui.go @@ -1,8 +1,8 @@ -package internal +package ui import ( "embed" ) -//go:embed ui +//go:embed * var Templates embed.FS diff --git a/justfile b/justfile index ae6dbee..863a4f7 100644 --- a/justfile +++ b/justfile @@ -3,23 +3,9 @@ set shell := ["devbox", "run"] STATIC_DIR := "./internal/static" -# Start devbox shell -shell: - devbox shell - -tailwindcss-build: - tailwindcss build -i {{STATIC_DIR}}/css/main.css -o {{STATIC_DIR}}/css/tailwind.css - -htmx-download: - mkdir -p {{STATIC_DIR}}/js - curl -sLo {{STATIC_DIR}}/js/htmx.min.js https://unpkg.com/htmx.org/dist/htmx.min.js - -feather-icons-download: - mkdir -p {{STATIC_DIR}}/icons - curl -sLo {{STATIC_DIR}}/icons/feather-sprite.svg https://unpkg.com/feather-icons/dist/feather-sprite.svg - -generate: - go generate ./... +# Run full development environment +run: + devbox services up # Start temporal which is accassible at http://localhost:8233/ run-temporal: @@ -35,10 +21,28 @@ run-worker: go build -o dist/worker cmd/worker/main.go ./dist/worker -# Run full development environment -run: - devbox services up - # Deploy the application to fly.io deploy: fly deploy + +# Start devbox shell +shell: + devbox shell + +# Generate and download all external dependencies. +generate: + go generate ./... + +_tailwindcss-build: + tailwindcss build -i {{STATIC_DIR}}/css/main.css -o {{STATIC_DIR}}/css/tailwind.css + +_htmx-download: + mkdir -p {{STATIC_DIR}}/js + curl -sLo {{STATIC_DIR}}/js/htmx.min.js https://unpkg.com/htmx.org/dist/htmx.min.js + +_feather-icons-download: + mkdir -p {{STATIC_DIR}}/icons + curl -sLo {{STATIC_DIR}}/icons/feather-sprite.svg https://unpkg.com/feather-icons/dist/feather-sprite.svg + +_generate-gorm: + go run cmd/generate/main.go diff --git a/process-compose.yml b/process-compose.yml index 5edc59c..39206a9 100644 --- a/process-compose.yml +++ b/process-compose.yml @@ -2,7 +2,7 @@ version: "0.5" processes: tailwind: - command: watchexec -r -e go,tmpl,css just tailwindcss-build + command: watchexec -r -e go,tmpl,css just _tailwindcss-build availability: restart: "always" server: