feat(app): static file serving

This commit is contained in:
Guz
2024-10-11 22:19:07 -03:00
parent e70e18aee5
commit 78718c29bf
6 changed files with 138 additions and 53 deletions

60
app/app.go Normal file
View File

@@ -0,0 +1,60 @@
package app
import (
"fmt"
"log"
"net/http"
"forge.capytal.company/capytalcode/project-comicverse/pages"
"forge.capytal.company/capytalcode/project-comicverse/router"
)
type App struct {
dev bool
port int
assets http.Handler
}
type AppOpts struct {
Dev *bool
Port *int
Assets http.Handler
}
func NewApp(opts ...AppOpts) *App {
if len(opts) == 0 {
opts[0] = AppOpts{}
}
if opts[0].Dev == nil {
d := false
opts[0].Dev = &d
}
if opts[0].Port == nil {
d := 8080
opts[0].Port = &d
}
if opts[0].Assets == nil {
// d := http.Dir("./assets")
// opts[0].Assets = d
}
return &App{
dev: *opts[0].Dev,
port: *opts[0].Port,
assets: opts[0].Assets,
}
}
func (a *App) Run() {
router := router.NewRouter()
router.HandleRoutes(pages.PAGES)
router.Handle("/assets/", a.assets)
if err := http.ListenAndServe(fmt.Sprintf(":%v", a.port), router); err != nil {
log.Fatal(err)
}
}

1
assets/js/hello.js Normal file
View File

@@ -0,0 +1 @@
console.log("hello world");

View File

@@ -1,29 +0,0 @@
package main
import (
"flag"
"os"
"strconv"
comicverse "forge.capytal.company/capytalcode/project-comicverse"
)
var port *int
func init() {
portEnv := os.Getenv("COMICVERSE_PORT")
if portEnv == "" {
portEnv = "8080"
}
p, err := strconv.Atoi(portEnv)
if err != nil {
p = 8080
}
port = flag.Int("port", p, "The port to the server to listen on")
}
func main() {
flag.Parse()
comicverse.Run(*port)
}

View File

@@ -1,20 +0,0 @@
package comicverse
import (
"fmt"
"log"
"net/http"
"forge.capytal.company/capytalcode/project-comicverse/pages"
"forge.capytal.company/capytalcode/project-comicverse/router"
)
func Run(port int) {
router := router.NewRouter()
router.HandleRoutes(pages.PAGES)
if err := http.ListenAndServe(fmt.Sprintf(":%v", port), router); err != nil {
log.Fatal(err)
}
}

67
main.go Normal file
View File

@@ -0,0 +1,67 @@
package main
import (
"embed"
"flag"
"net/http"
"os"
"strconv"
"forge.capytal.company/capytalcode/project-comicverse/app"
)
//go:embed assets
var assetsFolder embed.FS
var (
port *int
dev *bool
assets *string
)
func init() {
portEnv := os.Getenv("COMICVERSE_PORT")
if portEnv == "" {
portEnv = "8080"
}
p, err := strconv.Atoi(portEnv)
if err != nil {
p = 8080
}
port = flag.Int("port", p, "The port to the server to listen on")
devEnv := os.Getenv("COMICVERSE_DEV")
if devEnv == "" {
devEnv = "false"
}
d, err := strconv.ParseBool(devEnv)
if err != nil {
d = false
}
dev = flag.Bool("dev", d, "Run the application in development mode")
assetsEnv := os.Getenv("COMICVERSE_ASSETS")
if assetsEnv == "" {
assetsEnv = "./assets"
}
assets = flag.String("assets", assetsEnv, "The directory for the development assets")
}
func main() {
flag.Parse()
var assetsFS http.Handler
if *dev {
assetsFS = http.StripPrefix("/assets/", http.FileServer(http.Dir(*assets)))
} else {
assetsFS = http.FileServerFS(assetsFolder)
}
app := app.NewApp(app.AppOpts{
Port: port,
Dev: dev,
Assets: assetsFS,
})
app.Run()
}

View File

@@ -14,17 +14,18 @@ fmt:
dev/templ:
go run github.com/a-h/templ/cmd/templ@v0.2.707 generate --watch \
--proxy=http://localhost:$(PORT) \
--proxybind="0.0.0.0" \
--open-browser=false
dev/server:
go run github.com/air-verse/air@v1.52.2 \
--build.cmd "go build -o tmp/bin/main ./cmd/serve" \
--build.cmd "go build -o tmp/bin/main ." \
--build.bin "tmp/bin/main" \
--build.exclude_dir "node_modules" \
--build.include_ext "go" \
--build.stop_on_error "false" \
--misc.clean_on_exit true \
-- -port $(PORT)
-- -dev -port $(PORT)
dev/sync_assets:
go run github.com/air-verse/air@v1.52.2 \
@@ -45,12 +46,17 @@ dev:
build/templ:
go run github.com/a-h/templ/cmd/templ@v0.2.707 generate
build/server:
go build -o dist/server ./cmd/server
build/app:
go build -o dist/app .
build/assets:
npx unocss
build: build/templ build/assets build/app
run: build
./dist/app
clean:
if [[ -d "dist" ]]; then rm -r ./dist; fi
if [[ -d "tmp" ]]; then rm -r ./tmp; fi