commit afd43e3ff3bebdbefdd8699dcdde86614b7c6491 Author: Nilo Roberto C Paim Date: Mon Jan 29 08:04:27 2024 -0300 initial version diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..adb36c8 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.exe \ No newline at end of file diff --git a/frontend/assets/bars.svg b/frontend/assets/bars.svg new file mode 100644 index 0000000..faff448 --- /dev/null +++ b/frontend/assets/bars.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/contents.go b/frontend/contents.go new file mode 100644 index 0000000..7b2605c --- /dev/null +++ b/frontend/contents.go @@ -0,0 +1,6 @@ +package frontend + +import "embed" + +//go:embed templates/* +var Frontend embed.FS diff --git a/frontend/css/custom.css b/frontend/css/custom.css new file mode 100644 index 0000000..ed217e1 --- /dev/null +++ b/frontend/css/custom.css @@ -0,0 +1,12 @@ +.indicator { + display: none; +} + +.htmx-request .indicator { + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + z-index: 9999; + display: block; +} diff --git a/frontend/templates/index.html b/frontend/templates/index.html new file mode 100644 index 0000000..95d5ac9 --- /dev/null +++ b/frontend/templates/index.html @@ -0,0 +1,34 @@ +{{ define "index" }} + + + + + + + + + + + + + HTMX Test + + + +
+ +
+ +
+ Loading... +
+ +
+
+ + + + +{{ end }} \ No newline at end of file diff --git a/frontend/templates/init_page.html b/frontend/templates/init_page.html new file mode 100644 index 0000000..b227173 --- /dev/null +++ b/frontend/templates/init_page.html @@ -0,0 +1,5 @@ +{{ define "init_page" }} +

Init page

+ +{{ end }} \ No newline at end of file diff --git a/frontend/templates/users.html b/frontend/templates/users.html new file mode 100644 index 0000000..f8d5b30 --- /dev/null +++ b/frontend/templates/users.html @@ -0,0 +1,6 @@ +{{ define "users" }} +

Users

+ +{{ end }} \ No newline at end of file diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..68c075a --- /dev/null +++ b/go.mod @@ -0,0 +1,19 @@ +module todo + +go 1.21.6 + +require github.com/gofiber/fiber/v2 v2.52.0 + +require ( + github.com/andybalholm/brotli v1.0.5 // indirect + github.com/google/uuid v1.5.0 // indirect + github.com/klauspost/compress v1.17.0 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/rivo/uniseg v0.2.0 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasthttp v1.51.0 // indirect + github.com/valyala/tcplisten v1.0.0 // indirect + golang.org/x/sys v0.15.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..caafe41 --- /dev/null +++ b/go.sum @@ -0,0 +1,27 @@ +github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= +github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/gofiber/fiber/v2 v2.52.0 h1:S+qXi7y+/Pgvqq4DrSmREGiFwtB7Bu6+QFLuIHYw/UE= +github.com/gofiber/fiber/v2 v2.52.0/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= +github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= +github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM= +github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/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-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.51.0 h1:8b30A5JlZ6C7AS81RsWjYMQmrZG6feChmgAolCl1SqA= +github.com/valyala/fasthttp v1.51.0/go.mod h1:oI2XroL+lI7vdXyYoQk03bXBThfFl2cVdIA3Xl7cH8g= +github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +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.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= diff --git a/main.go b/main.go new file mode 100644 index 0000000..27609de --- /dev/null +++ b/main.go @@ -0,0 +1,104 @@ +package main + +import ( + "bytes" + "encoding/json" + "fmt" + "html/template" + "io" + "net/http" + "todo/frontend" + "todo/models" + + "github.com/gofiber/fiber/v2" +) + +var Tmpl *template.Template + +func doGet(url string) ([]byte, error) { + // Perform an HTTP GET request + response, err := http.Get(url) + if err != nil { + return nil, err + } + defer response.Body.Close() + + // Read the response body + body, err := io.ReadAll(response.Body) + if err != nil { + return nil, err + } + + return body, nil +} + +func SetupTemplates() error { + + tmpl, err := template.New("").ParseFS(frontend.Frontend, "templates/*.html") + + if err != nil { + return err + } + + Tmpl = tmpl + + return nil + +} + +func main() { + + SetupTemplates() + + app := fiber.New(fiber.Config{ + StrictRouting: false, + DisableStartupMessage: false, + }) + + app.Static("/", "./frontend") + + app.Get("/", func(c *fiber.Ctx) error { + + var result bytes.Buffer + + err := Tmpl.ExecuteTemplate(&result, "index", nil) + if err != nil { + fmt.Println(err) + return err + } + + c.Set("Content-Type", "text/html") + + return c.SendString(result.String()) + + }) + + app.Get("/users", func(c *fiber.Ctx) error { + + response, err := doGet("https://dummyjson.com/users") + if err != nil { + fmt.Println(err) + return err + } + + var users models.Users + + err = json.Unmarshal(response, &users) + if err != nil { + fmt.Println(err) + return err + } + + var result bytes.Buffer + + err = Tmpl.ExecuteTemplate(&result, "users", users) + if err != nil { + fmt.Println(err) + return err + } + + return c.SendString(result.String()) + }) + + app.Listen(":3000") +} diff --git a/models/user_model.go b/models/user_model.go new file mode 100644 index 0000000..35a2805 --- /dev/null +++ b/models/user_model.go @@ -0,0 +1,72 @@ +package models + +type Users struct { + Users []User `json:"users"` +} + +type User struct { + ID int `json:"id"` + FirstName string `json:"firstName"` + LastName string `json:"lastName"` + MaidenName string `json:"maidenName"` + Age int `json:"age"` + Gender string `json:"gender"` + Email string `json:"email"` + Phone string `json:"phone"` + Username string `json:"username"` + Password string `json:"password"` + BirthDate string `json:"birthDate"` + Image string `json:"image"` + BloodGroup string `json:"bloodGroup"` + Height int `json:"height"` + Weight float64 `json:"weight"` + EyeColor string `json:"eyeColor"` + Hair struct { + Color string `json:"color"` + Type string `json:"type"` + } `json:"hair"` + Domain string `json:"domain"` + IP string `json:"ip"` + Address struct { + Address string `json:"address"` + City string `json:"city"` + Coordinates struct { + Lat float64 `json:"lat"` + Lng float64 `json:"lng"` + } `json:"coordinates"` + PostalCode string `json:"postalCode"` + State string `json:"state"` + } `json:"address"` + MacAddress string `json:"macAddress"` + University string `json:"university"` + Bank struct { + CardExpire string `json:"cardExpire"` + CardNumber string `json:"cardNumber"` + CardType string `json:"cardType"` + Currency string `json:"currency"` + Iban string `json:"iban"` + } `json:"bank"` + Company struct { + Address struct { + Address string `json:"address"` + City string `json:"city"` + Coordinates struct { + Lat float64 `json:"lat"` + Lng float64 `json:"lng"` + } `json:"coordinates"` + PostalCode string `json:"postalCode"` + State string `json:"state"` + } `json:"address"` + Department string `json:"department"` + Name string `json:"name"` + Title string `json:"title"` + } `json:"company"` + Ein string `json:"ein"` + Ssn string `json:"ssn"` + UserAgent string `json:"userAgent"` + Crypto struct { + Coin string `json:"coin"` + Wallet string `json:"wallet"` + Network string `json:"network"` + } `json:"crypto"` +}