initial version

master
Nilo Roberto C Paim 2024-01-29 08:04:27 -03:00
commit afd43e3ff3
11 changed files with 338 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
*.exe

52
frontend/assets/bars.svg Normal file
View File

@ -0,0 +1,52 @@
<svg width="135" height="140" viewBox="0 0 135 140" xmlns="http://www.w3.org/2000/svg" fill="#fff">
<rect y="10" width="15" height="120" rx="6">
<animate attributeName="height"
begin="0.5s" dur="1s"
values="120;110;100;90;80;70;60;50;40;140;120" calcMode="linear"
repeatCount="indefinite" />
<animate attributeName="y"
begin="0.5s" dur="1s"
values="10;15;20;25;30;35;40;45;50;0;10" calcMode="linear"
repeatCount="indefinite" />
</rect>
<rect x="30" y="10" width="15" height="120" rx="6">
<animate attributeName="height"
begin="0.25s" dur="1s"
values="120;110;100;90;80;70;60;50;40;140;120" calcMode="linear"
repeatCount="indefinite" />
<animate attributeName="y"
begin="0.25s" dur="1s"
values="10;15;20;25;30;35;40;45;50;0;10" calcMode="linear"
repeatCount="indefinite" />
</rect>
<rect x="60" width="15" height="140" rx="6">
<animate attributeName="height"
begin="0s" dur="1s"
values="120;110;100;90;80;70;60;50;40;140;120" calcMode="linear"
repeatCount="indefinite" />
<animate attributeName="y"
begin="0s" dur="1s"
values="10;15;20;25;30;35;40;45;50;0;10" calcMode="linear"
repeatCount="indefinite" />
</rect>
<rect x="90" y="10" width="15" height="120" rx="6">
<animate attributeName="height"
begin="0.25s" dur="1s"
values="120;110;100;90;80;70;60;50;40;140;120" calcMode="linear"
repeatCount="indefinite" />
<animate attributeName="y"
begin="0.25s" dur="1s"
values="10;15;20;25;30;35;40;45;50;0;10" calcMode="linear"
repeatCount="indefinite" />
</rect>
<rect x="120" y="10" width="15" height="120" rx="6">
<animate attributeName="height"
begin="0.5s" dur="1s"
values="120;110;100;90;80;70;60;50;40;140;120" calcMode="linear"
repeatCount="indefinite" />
<animate attributeName="y"
begin="0.5s" dur="1s"
values="10;15;20;25;30;35;40;45;50;0;10" calcMode="linear"
repeatCount="indefinite" />
</rect>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

6
frontend/contents.go Normal file
View File

@ -0,0 +1,6 @@
package frontend
import "embed"
//go:embed templates/*
var Frontend embed.FS

12
frontend/css/custom.css Normal file
View File

@ -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;
}

View File

@ -0,0 +1,34 @@
{{ define "index" }}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://cdn.jsdelivr.net/npm/daisyui@4.6.0/dist/full.min.css" rel="stylesheet" type="text/css" />
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://unpkg.com/htmx.org@latest"></script>
<script src="https://unpkg.com/htmx.org@latest/dist/ext/client-side-templates.js"></script>
<script src="https://unpkg.com/mustache@latest"></script>
<link rel="stylesheet" href="/css/custom.css">
<title>HTMX Test</title>
</head>
<body class="bg-[#a600f9] min-h-screen text-center text-white">
<div id="app">
<button class="btn btn-accent text-black text-2xl m-8" hx-disabled-elt="this" hx-get="/users"
hx-swap="innerHTML transition:true" hx-indicator="#indicator" hx-target="#content">Get
list of users</button>
</div>
<div id="indicator">
<img src="/assets/bars.svg" alt="Loading..." class="h-12 w-12 mx-auto indicator">
</div>
<div id="content">
</div>
</body>
</html>
{{ end }}

View File

@ -0,0 +1,5 @@
{{ define "init_page" }}
<p>Init page</p>
<button class="btn btn-accent" hx-get="/users" hx-swap="outerHTML" hx-target="#content">Get
list of users</button>
{{ end }}

View File

@ -0,0 +1,6 @@
{{ define "users" }}
<h1 class="text-3xl mb-8">Users</h1>
<ul>
{{ range .Users }}<li class="italic hover:font-bold">{{ .FirstName }}, {{ .Age }} years old</li>{{ end }}
</ul>
{{ end }}

19
go.mod Normal file
View File

@ -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
)

27
go.sum Normal file
View File

@ -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=

104
main.go Normal file
View File

@ -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")
}

72
models/user_model.go Normal file
View File

@ -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"`
}