Skip to content

Commit 62d46c4

Browse files
Migrate from templates to Gomponents (#103)
1 parent 5cad4cb commit 62d46c4

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

104 files changed

+2689
-2745
lines changed

.air.toml

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
root = "."
2+
testdata_dir = "testdata"
3+
tmp_dir = "tmp"
4+
5+
[build]
6+
args_bin = []
7+
bin = "./tmp/main"
8+
cmd = "go build -o ./tmp/main ./cmd/web"
9+
delay = 1000
10+
exclude_dir = ["assets", "tmp", "vendor", "testdata", "uploads", "dbs"]
11+
exclude_file = []
12+
exclude_regex = ["_test.go"]
13+
exclude_unchanged = false
14+
follow_symlink = false
15+
full_bin = ""
16+
include_dir = []
17+
include_ext = ["go", "tpl", "tmpl", "html"]
18+
include_file = []
19+
kill_delay = "0s"
20+
log = "build-errors.log"
21+
poll = false
22+
poll_interval = 0
23+
post_cmd = []
24+
pre_cmd = []
25+
rerun = false
26+
rerun_delay = 500
27+
send_interrupt = false
28+
stop_on_error = true
29+
30+
[color]
31+
app = ""
32+
build = "yellow"
33+
main = "magenta"
34+
runner = "green"
35+
watcher = "cyan"
36+
37+
[log]
38+
main_only = false
39+
silent = false
40+
time = false
41+
42+
[misc]
43+
clean_on_exit = false
44+
45+
[proxy]
46+
app_port = 0
47+
enabled = false
48+
proxy_port = 0
49+
50+
[screen]
51+
clear_on_rebuild = false
52+
keep_scroll = true

.gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
.idea
22
dbs
3-
uploads
3+
uploads
4+
tmp

Makefile

+20-13
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,37 @@
1-
# Install Ent code-generation module
1+
.PHONY: help
2+
help: ## Print make targets
3+
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
4+
25
.PHONY: ent-install
3-
ent-install:
6+
ent-install: ## Install Ent code-generation module
47
go get entgo.io/ent/cmd/ent
58

6-
# Generate Ent code
9+
.PHONY: air-install
10+
air-install: ## Install air
11+
go install github.com/air-verse/air@latest
12+
713
.PHONY: ent-gen
8-
ent-gen:
14+
ent-gen: ## Generate Ent code
915
go generate ./ent
1016

11-
# Create a new Ent entity
1217
.PHONY: ent-new
13-
ent-new:
18+
ent-new: ## Create a new Ent entity (ie, make ent-new NAME=MyEntity)
1419
go run entgo.io/ent/cmd/ent new $(name)
1520

16-
# Run the application
1721
.PHONY: run
18-
run:
22+
run: ## Run the application
1923
clear
2024
go run cmd/web/main.go
2125

22-
# Run all tests
26+
.PHONY: watch
27+
watch: ## Run the application and watch for changes with air to automatically rebuild
28+
clear
29+
air
30+
2331
.PHONY: test
24-
test:
25-
go test -count=1 -p 1 ./...
32+
test: ## Run all tests
33+
go test ./...
2634

27-
# Check for direct dependency updates
2835
.PHONY: check-updates
29-
check-updates:
36+
check-updates: ## Check for direct dependency updates
3037
go list -u -m -f '{{if not .Indirect}}{{.}}{{end}}' all | grep "\["

README.md

+260-357
Large diffs are not rendered by default.

config/config.go

+20-22
Original file line numberDiff line numberDiff line change
@@ -9,35 +9,32 @@ import (
99
)
1010

1111
const (
12-
// TemplateExt stores the extension used for the template files
13-
TemplateExt = ".gohtml"
14-
15-
// StaticDir stores the name of the directory that will serve static files
12+
// StaticDir stores the name of the directory that will serve static files.
1613
StaticDir = "static"
1714

18-
// StaticPrefix stores the URL prefix used when serving static files
15+
// StaticPrefix stores the URL prefix used when serving static files.
1916
StaticPrefix = "files"
2017
)
2118

2219
type environment string
2320

2421
const (
25-
// EnvLocal represents the local environment
22+
// EnvLocal represents the local environment.
2623
EnvLocal environment = "local"
2724

28-
// EnvTest represents the test environment
25+
// EnvTest represents the test environment.
2926
EnvTest environment = "test"
3027

31-
// EnvDevelop represents the development environment
28+
// EnvDevelop represents the development environment.
3229
EnvDevelop environment = "dev"
3330

34-
// EnvStaging represents the staging environment
31+
// EnvStaging represents the staging environment.
3532
EnvStaging environment = "staging"
3633

37-
// EnvQA represents the qa environment
34+
// EnvQA represents the qa environment.
3835
EnvQA environment = "qa"
3936

40-
// EnvProduction represents the production environment
37+
// EnvProduction represents the production environment.
4138
EnvProduction environment = "prod"
4239
)
4340

@@ -51,7 +48,7 @@ func SwitchEnvironment(env environment) {
5148
}
5249

5350
type (
54-
// Config stores complete configuration
51+
// Config stores complete configuration.
5552
Config struct {
5653
HTTP HTTPConfig
5754
App AppConfig
@@ -62,7 +59,7 @@ type (
6259
Mail MailConfig
6360
}
6461

65-
// HTTPConfig stores HTTP configuration
62+
// HTTPConfig stores HTTP configuration.
6663
HTTPConfig struct {
6764
Hostname string
6865
Port uint16
@@ -77,9 +74,10 @@ type (
7774
}
7875
}
7976

80-
// AppConfig stores application configuration
77+
// AppConfig stores application configuration.
8178
AppConfig struct {
8279
Name string
80+
Host string
8381
Environment environment
8482
EncryptionKey string
8583
Timeout time.Duration
@@ -90,7 +88,7 @@ type (
9088
EmailVerificationTokenExpiration time.Duration
9189
}
9290

93-
// CacheConfig stores the cache configuration
91+
// CacheConfig stores the cache configuration.
9492
CacheConfig struct {
9593
Capacity int
9694
Expiration struct {
@@ -99,27 +97,27 @@ type (
9997
}
10098
}
10199

102-
// DatabaseConfig stores the database configuration
100+
// DatabaseConfig stores the database configuration.
103101
DatabaseConfig struct {
104102
Driver string
105103
Connection string
106104
TestConnection string
107105
}
108106

109-
// FilesConfig stores the file system configuration
107+
// FilesConfig stores the file system configuration.
110108
FilesConfig struct {
111109
Directory string
112110
}
113111

114-
// TasksConfig stores the tasks configuration
112+
// TasksConfig stores the tasks configuration.
115113
TasksConfig struct {
116114
Goroutines int
117115
ReleaseAfter time.Duration
118116
CleanupInterval time.Duration
119117
ShutdownTimeout time.Duration
120118
}
121119

122-
// MailConfig stores the mail configuration
120+
// MailConfig stores the mail configuration.
123121
MailConfig struct {
124122
Hostname string
125123
Port uint16
@@ -129,19 +127,19 @@ type (
129127
}
130128
)
131129

132-
// GetConfig loads and returns configuration
130+
// GetConfig loads and returns configuration.
133131
func GetConfig() (Config, error) {
134132
var c Config
135133

136-
// Load the config file
134+
// Load the config file.
137135
viper.SetConfigName("config")
138136
viper.SetConfigType("yaml")
139137
viper.AddConfigPath(".")
140138
viper.AddConfigPath("config")
141139
viper.AddConfigPath("../config")
142140
viper.AddConfigPath("../../config")
143141

144-
// Load env variables
142+
// Load env variables.
145143
viper.SetEnvPrefix("pagoda")
146144
viper.AutomaticEnv()
147145
viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))

config/config.yaml

+4-1
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,11 @@ http:
1212

1313
app:
1414
name: "Pagoda"
15+
# We manually set this rather than using the HTTP settings in order to build absolute URLs for users
16+
# since it's likely your app's HTTP settings are not identical to what is exposed by your server.
17+
host: "http://localhost:8000"
1518
environment: "local"
16-
# Change this on any live environments
19+
# Change this on any live environments.
1720
encryptionKey: "?E(G+KbPeShVmYq3t6w9z$C&F)J@McQf"
1821
timeout: "20s"
1922
passwordToken:

go.mod

+2-8
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,24 @@ go 1.23.0
44

55
require (
66
entgo.io/ent v0.14.2
7-
github.com/Masterminds/sprig v2.22.0+incompatible
87
github.com/PuerkitoBio/goquery v1.10.1
98
github.com/go-playground/validator/v10 v10.24.0
109
github.com/golang-jwt/jwt v3.2.2+incompatible
1110
github.com/gorilla/context v1.1.2
1211
github.com/gorilla/sessions v1.4.0
1312
github.com/labstack/echo/v4 v4.13.3
14-
github.com/labstack/gommon v0.4.2
1513
github.com/mattn/go-sqlite3 v1.14.24
1614
github.com/maypok86/otter v1.2.4
1715
github.com/mikestefanello/backlite v0.2.0
1816
github.com/spf13/afero v1.12.0
1917
github.com/spf13/viper v1.19.0
2018
github.com/stretchr/testify v1.10.0
2119
golang.org/x/crypto v0.33.0
20+
maragu.dev/gomponents v1.1.0
2221
)
2322

2423
require (
2524
ariga.io/atlas v0.31.1-0.20250212144724-069be8033e83 // indirect
26-
github.com/Masterminds/goutils v1.1.1 // indirect
27-
github.com/Masterminds/semver v1.5.0 // indirect
2825
github.com/agext/levenshtein v1.2.3 // indirect
2926
github.com/andybalholm/cascadia v1.3.3 // indirect
3027
github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect
@@ -42,16 +39,13 @@ require (
4239
github.com/gorilla/securecookie v1.1.2 // indirect
4340
github.com/hashicorp/hcl v1.0.0 // indirect
4441
github.com/hashicorp/hcl/v2 v2.20.1 // indirect
45-
github.com/huandu/xstrings v1.4.0 // indirect
46-
github.com/imdario/mergo v0.3.16 // indirect
42+
github.com/labstack/gommon v0.4.2 // indirect
4743
github.com/leodido/go-urn v1.4.0 // indirect
4844
github.com/magiconair/properties v1.8.7 // indirect
4945
github.com/mattn/go-colorable v0.1.13 // indirect
5046
github.com/mattn/go-isatty v0.0.20 // indirect
51-
github.com/mitchellh/copystructure v1.2.0 // indirect
5247
github.com/mitchellh/go-wordwrap v1.0.1 // indirect
5348
github.com/mitchellh/mapstructure v1.5.0 // indirect
54-
github.com/mitchellh/reflectwalk v1.0.2 // indirect
5549
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
5650
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
5751
github.com/rogpeppe/go-internal v1.10.0 // indirect

go.sum

+2-20
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,6 @@ entgo.io/ent v0.14.2 h1:ywld/j2Rx4EmnIKs8eZ29cbFA1zpB+DA9TLL5l3rlq0=
44
entgo.io/ent v0.14.2/go.mod h1:aDPE/OziPEu8+OWbzy4UlvWmD2/kbRuWfK2A40hcxJM=
55
github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60=
66
github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
7-
github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
8-
github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
9-
github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww=
10-
github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
11-
github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60=
12-
github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o=
137
github.com/PuerkitoBio/goquery v1.10.1 h1:Y8JGYUkXWTGRB6Ars3+j3kN0xg1YqqlwvdTV8WTFQcU=
148
github.com/PuerkitoBio/goquery v1.10.1/go.mod h1:IYiHrOMps66ag56LEH7QYDDupKXyo5A8qrjIx3ZtujY=
159
github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo=
@@ -64,10 +58,6 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
6458
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
6559
github.com/hashicorp/hcl/v2 v2.20.1 h1:M6hgdyz7HYt1UN9e61j+qKJBqR3orTWbI1HKBJEdxtc=
6660
github.com/hashicorp/hcl/v2 v2.20.1/go.mod h1:TZDqQ4kNKCbh1iJp99FdPiUaVDDUPivbqxZulxDYqL4=
67-
github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU=
68-
github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
69-
github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4=
70-
github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY=
7161
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
7262
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
7363
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
@@ -88,24 +78,16 @@ github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovk
8878
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
8979
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
9080
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
91-
github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
92-
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
9381
github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM=
9482
github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
9583
github.com/maypok86/otter v1.2.4 h1:HhW1Pq6VdJkmWwcZZq19BlEQkHtI8xgsQzBVXJU0nfc=
9684
github.com/maypok86/otter v1.2.4/go.mod h1:mKLfoI7v1HOmQMwFgX4QkRk23mX6ge3RDvjdHOWG4R4=
9785
github.com/mikestefanello/backlite v0.2.0 h1:nX+QUy/z5FEV+ApMqvZ1jGqyRPGbuBI2mJR0BvirT9s=
9886
github.com/mikestefanello/backlite v0.2.0/go.mod h1:/vj8LPZWG/xqK/3uHaqOtu5JRLDEWqeyJKWTAlADTV0=
99-
github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
100-
github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
10187
github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0=
10288
github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0=
10389
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
10490
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
105-
github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=
106-
github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
107-
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
108-
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
10991
github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
11092
github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
11193
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
@@ -123,8 +105,6 @@ github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs=
123105
github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4=
124106
github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0=
125107
github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
126-
github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I=
127-
github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0=
128108
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
129109
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
130110
github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI=
@@ -245,3 +225,5 @@ gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
245225
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
246226
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
247227
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
228+
maragu.dev/gomponents v1.1.0 h1:iCybZZChHr1eSlvkWp/JP3CrZGzctLudQ/JI3sBcO4U=
229+
maragu.dev/gomponents v1.1.0/go.mod h1:oEDahza2gZoXDoDHhw8jBNgH+3UR5ni7Ur648HORydM=

0 commit comments

Comments
 (0)