diff options
author | Gabriel A. Giovanini <mail@gabrielgio.me> | 2024-05-26 00:05:31 +0200 |
---|---|---|
committer | Gabriel A. Giovanini <mail@gabrielgio.me> | 2024-05-26 14:41:21 +0200 |
commit | 349a3d1ff36a436261b1b65b870f8f262f06584f (patch) | |
tree | 25c4d6933c49f818e520ce662ffa15e040877f4d | |
parent | c06945c189c1d8ef3cedeb51e416ba0fec36368f (diff) | |
download | cerrado-349a3d1ff36a436261b1b65b870f8f262f06584f.tar.gz cerrado-349a3d1ff36a436261b1b65b870f8f262f06584f.tar.bz2 cerrado-349a3d1ff36a436261b1b65b870f8f262f06584f.zip |
feat: Add bare bones project list
-rw-r--r-- | main.go | 65 | ||||
-rw-r--r-- | pkg/handler/git.go | 21 | ||||
-rw-r--r-- | pkg/handler/static.go | 18 | ||||
-rw-r--r-- | pkg/handler/status.go | 62 | ||||
-rw-r--r-- | pkg/service/git.go | 30 | ||||
-rw-r--r-- | scss/main.scss | 11 | ||||
-rw-r--r-- | templates/gitlist.qtpl | 34 | ||||
-rw-r--r-- | templates/gitlist.qtpl.go | 175 | ||||
-rw-r--r-- | templates/helloworld.qtpl | 2 | ||||
-rw-r--r-- | templates/helloworld.qtpl.go | 62 |
10 files changed, 389 insertions, 91 deletions
@@ -1,25 +1,17 @@ package main import ( - "bytes" "context" - "encoding/json" "flag" - "io/fs" "log/slog" "net/http" "os" "os/signal" "time" - "github.com/alecthomas/chroma/v2/formatters/html" - "github.com/alecthomas/chroma/v2/lexers" - "github.com/alecthomas/chroma/v2/styles" - - "git.gabrielgio.me/cerrado/pkg/config" + "git.gabrielgio.me/cerrado/pkg/handler" + "git.gabrielgio.me/cerrado/pkg/service" "git.gabrielgio.me/cerrado/pkg/worker" - "git.gabrielgio.me/cerrado/static" - "git.gabrielgio.me/cerrado/templates" ) func main() { @@ -41,57 +33,20 @@ func run(ctx context.Context) error { mux := http.NewServeMux() - staticFs, err := fs.Sub(static.Static, ".") + staticHandler, err := handler.NewStaticHander("/static/") if err != nil { return err } - mux.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.FS(staticFs)))) - mux.HandleFunc("/", func(w http.ResponseWriter, _ *http.Request) { - slog.Info("Handling index") - - f, err := os.Open(*configPath) - if err != nil { - slog.Error("Error openning config file json", "error", err, "path", *configPath) - return - } - - c, err := config.Parse(f) - if err != nil { - slog.Error("Error parsing config", "error", err, "path", *configPath) - return - } - - b, err := json.MarshalIndent(c, "", " ") - if err != nil { - slog.Error("Error parsing json", "error", err) - return - } - - lexer := lexers.Get("json") - style := styles.Get("monokailight") - formatter := html.New( - html.WithLineNumbers(true), - ) - iterator, err := lexer.Tokenise(nil, string(b)) - if err != nil { - slog.Error("Error tokenise", "error", err) - return - } - - var code bytes.Buffer - err = formatter.Format(&code, style, iterator) - if err != nil { - slog.Error("Error format", "error", err) - return - } + // services + gitService := service.NewGitService() - hello := &templates.HelloPage{ - Body: code.String(), - } + //handlers + gitHandler := handler.NewGitHandler(gitService) - templates.WritePageTemplate(w, hello) - }) + mux.Handle("/static/", staticHandler) + mux.HandleFunc("/config", handler.ConfigFile(*configPath)) + mux.HandleFunc("/", gitHandler.List) serverTask := worker.NewServerTask(&http.Server{Handler: mux, Addr: "0.0.0.0:8080"}) pool := worker.NewTaskPool() diff --git a/pkg/handler/git.go b/pkg/handler/git.go new file mode 100644 index 0000000..5b09121 --- /dev/null +++ b/pkg/handler/git.go @@ -0,0 +1,21 @@ +package handler + +import ( + "net/http" + + "git.gabrielgio.me/cerrado/pkg/service" + "git.gabrielgio.me/cerrado/templates" +) + +type GitHandler struct { + gitService *service.GitService +} + +func NewGitHandler(gitService *service.GitService) *GitHandler { + return &GitHandler{gitService} +} + +func (g *GitHandler) List(w http.ResponseWriter, _ *http.Request) { + gitList := &templates.GitListPage{g.gitService.ListRepositories()} + templates.WritePageTemplate(w, gitList) +} diff --git a/pkg/handler/static.go b/pkg/handler/static.go new file mode 100644 index 0000000..9f312f4 --- /dev/null +++ b/pkg/handler/static.go @@ -0,0 +1,18 @@ +package handler + +import ( + "io/fs" + "net/http" + + "git.gabrielgio.me/cerrado/static" +) + +func NewStaticHander(prefix string) (http.Handler, error) { + staticFs, err := fs.Sub(static.Static, ".") + if err != nil { + return nil, err + } + + handler := http.StripPrefix(prefix, http.FileServer(http.FS(staticFs))) + return handler, nil +} diff --git a/pkg/handler/status.go b/pkg/handler/status.go new file mode 100644 index 0000000..2a84a7e --- /dev/null +++ b/pkg/handler/status.go @@ -0,0 +1,62 @@ +package handler + +import ( + "bytes" + "encoding/json" + "log/slog" + "net/http" + "os" + + "github.com/alecthomas/chroma/v2/formatters/html" + "github.com/alecthomas/chroma/v2/lexers" + "github.com/alecthomas/chroma/v2/styles" + + "git.gabrielgio.me/cerrado/pkg/config" + "git.gabrielgio.me/cerrado/templates" +) + +func ConfigFile(configPath string) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, _ *http.Request) { + f, err := os.Open(configPath) + if err != nil { + slog.Error("Error openning config file json", "error", err, "path", configPath) + return + } + + c, err := config.Parse(f) + if err != nil { + slog.Error("Error parsing config", "error", err, "path", configPath) + return + } + + b, err := json.MarshalIndent(c, "", " ") + if err != nil { + slog.Error("Error parsing json", "error", err) + return + } + + lexer := lexers.Get("json") + style := styles.Get("monokailight") + formatter := html.New( + html.WithLineNumbers(true), + ) + iterator, err := lexer.Tokenise(nil, string(b)) + if err != nil { + slog.Error("Error tokenise", "error", err) + return + } + + var code bytes.Buffer + err = formatter.Format(&code, style, iterator) + if err != nil { + slog.Error("Error format", "error", err) + return + } + + hello := &templates.HelloPage{ + Body: code.String(), + } + + templates.WritePageTemplate(w, hello) + } +} diff --git a/pkg/service/git.go b/pkg/service/git.go new file mode 100644 index 0000000..0415cee --- /dev/null +++ b/pkg/service/git.go @@ -0,0 +1,30 @@ +package service + +import "fmt" + +type ( + GitService struct{} + Repository struct { + Name string + Title string + Description string + } +) + +func NewGitService() *GitService { + return &GitService{} +} + +func (g *GitService) ListRepositories() []*Repository { + repos := make([]*Repository, 10) + + for i := range 10 { + repos[i] = &Repository{ + Name: fmt.Sprintf("repository-%d", i), + Title: fmt.Sprintf("Repository %d", i), + Description: fmt.Sprintf("This is a description for repository %d", i), + } + } + + return repos +} diff --git a/scss/main.scss b/scss/main.scss index 7273c9f..eb8a6fe 100644 --- a/scss/main.scss +++ b/scss/main.scss @@ -1,4 +1,9 @@ +//$card-border-width: 0; +$card-border-radius: 0; +$card-cap-padding-y: 0; +$card-cap-padding-x: 0; +// basic functionality @import "bootstrap/scss/_functions.scss"; @import "bootstrap/scss/_variables.scss"; @import "bootstrap/scss/_variables-dark.scss"; @@ -6,14 +11,16 @@ @import "bootstrap/scss/_mixins.scss"; @import "bootstrap/scss/_utilities.scss"; - +// added component @import "bootstrap/scss/_root.scss"; @import "bootstrap/scss/_containers.scss"; @import "bootstrap/scss/_nav.scss"; @import "bootstrap/scss/_navbar.scss"; +@import "bootstrap/scss/_card.scss"; +@import "bootstrap/scss/_grid.scss"; body { font-family: $font-family-monospace; - + margin: 0; } diff --git a/templates/gitlist.qtpl b/templates/gitlist.qtpl new file mode 100644 index 0000000..10a89da --- /dev/null +++ b/templates/gitlist.qtpl @@ -0,0 +1,34 @@ +{% import "git.gabrielgio.me/cerrado/pkg/service" %} +{% import "git.gabrielgio.me/cerrado/pkg/u" %} + + +{% code +type GitListPage struct { + Respositories []*service.Repository +} +%} + +{% func (p *GitListPage) Title() %}Git | List{% endfunc %} + +{% func (p *GitListPage) Content() %} +{% for _, c := range u.ChunkBy(p.Respositories, 3) %} +<div class="row"> + {% for _, r := range c %} + <div class="col-md-4 g-0"> + <div class="card"> + <div class="card-header"> + {%s r.Title %} + </div> + <div class="card-body"> + <p class="card-text">{%s r.Description %}</p> + <a href="/{%s r.Name %}" class="btn btn-primary">go to repository</a> + </div> + </div> + </div> + {% endfor %} +</div> +{% endfor %} +{% endfunc %} + +{% func (p *GitListPage) Script() %} +{% endfunc %} diff --git a/templates/gitlist.qtpl.go b/templates/gitlist.qtpl.go new file mode 100644 index 0000000..b02eead --- /dev/null +++ b/templates/gitlist.qtpl.go @@ -0,0 +1,175 @@ +// Code generated by qtc from "gitlist.qtpl". DO NOT EDIT. +// See https://github.com/valyala/quicktemplate for details. + +//line gitlist.qtpl:1 +package templates + +//line gitlist.qtpl:1 +import "git.gabrielgio.me/cerrado/pkg/service" + +//line gitlist.qtpl:2 +import "git.gabrielgio.me/cerrado/pkg/u" + +//line gitlist.qtpl:5 +import ( + qtio422016 "io" + + qt422016 "github.com/valyala/quicktemplate" +) + +//line gitlist.qtpl:5 +var ( + _ = qtio422016.Copy + _ = qt422016.AcquireByteBuffer +) + +//line gitlist.qtpl:6 +type GitListPage struct { + Respositories []*service.Repository +} + +//line gitlist.qtpl:11 +func (p *GitListPage) StreamTitle(qw422016 *qt422016.Writer) { +//line gitlist.qtpl:11 + qw422016.N().S(`Git | List`) +//line gitlist.qtpl:11 +} + +//line gitlist.qtpl:11 +func (p *GitListPage) WriteTitle(qq422016 qtio422016.Writer) { +//line gitlist.qtpl:11 + qw422016 := qt422016.AcquireWriter(qq422016) +//line gitlist.qtpl:11 + p.StreamTitle(qw422016) +//line gitlist.qtpl:11 + qt422016.ReleaseWriter(qw422016) +//line gitlist.qtpl:11 +} + +//line gitlist.qtpl:11 +func (p *GitListPage) Title() string { +//line gitlist.qtpl:11 + qb422016 := qt422016.AcquireByteBuffer() +//line gitlist.qtpl:11 + p.WriteTitle(qb422016) +//line gitlist.qtpl:11 + qs422016 := string(qb422016.B) +//line gitlist.qtpl:11 + qt422016.ReleaseByteBuffer(qb422016) +//line gitlist.qtpl:11 + return qs422016 +//line gitlist.qtpl:11 +} + +//line gitlist.qtpl:13 +func (p *GitListPage) StreamContent(qw422016 *qt422016.Writer) { +//line gitlist.qtpl:13 + qw422016.N().S(` +`) +//line gitlist.qtpl:14 + for _, c := range u.ChunkBy(p.Respositories, 3) { +//line gitlist.qtpl:14 + qw422016.N().S(` +<div class="row"> + `) +//line gitlist.qtpl:16 + for _, r := range c { +//line gitlist.qtpl:16 + qw422016.N().S(` + <div class="col-md-4 g-0"> + <div class="card"> + <div class="card-header"> + `) +//line gitlist.qtpl:20 + qw422016.E().S(r.Title) +//line gitlist.qtpl:20 + qw422016.N().S(` + </div> + <div class="card-body"> + <p class="card-text">`) +//line gitlist.qtpl:23 + qw422016.E().S(r.Description) +//line gitlist.qtpl:23 + qw422016.N().S(`</p> + <a href="/`) +//line gitlist.qtpl:24 + qw422016.E().S(r.Name) +//line gitlist.qtpl:24 + qw422016.N().S(`" class="btn btn-primary">go to repository</a> + </div> + </div> + </div> + `) +//line gitlist.qtpl:28 + } +//line gitlist.qtpl:28 + qw422016.N().S(` +</div> +`) +//line gitlist.qtpl:30 + } +//line gitlist.qtpl:30 + qw422016.N().S(` +`) +//line gitlist.qtpl:31 +} + +//line gitlist.qtpl:31 +func (p *GitListPage) WriteContent(qq422016 qtio422016.Writer) { +//line gitlist.qtpl:31 + qw422016 := qt422016.AcquireWriter(qq422016) +//line gitlist.qtpl:31 + p.StreamContent(qw422016) +//line gitlist.qtpl:31 + qt422016.ReleaseWriter(qw422016) +//line gitlist.qtpl:31 +} + +//line gitlist.qtpl:31 +func (p *GitListPage) Content() string { +//line gitlist.qtpl:31 + qb422016 := qt422016.AcquireByteBuffer() +//line gitlist.qtpl:31 + p.WriteContent(qb422016) +//line gitlist.qtpl:31 + qs422016 := string(qb422016.B) +//line gitlist.qtpl:31 + qt422016.ReleaseByteBuffer(qb422016) +//line gitlist.qtpl:31 + return qs422016 +//line gitlist.qtpl:31 +} + +//line gitlist.qtpl:33 +func (p *GitListPage) StreamScript(qw422016 *qt422016.Writer) { +//line gitlist.qtpl:33 + qw422016.N().S(` +`) +//line gitlist.qtpl:34 +} + +//line gitlist.qtpl:34 +func (p *GitListPage) WriteScript(qq422016 qtio422016.Writer) { +//line gitlist.qtpl:34 + qw422016 := qt422016.AcquireWriter(qq422016) +//line gitlist.qtpl:34 + p.StreamScript(qw422016) +//line gitlist.qtpl:34 + qt422016.ReleaseWriter(qw422016) +//line gitlist.qtpl:34 +} + +//line gitlist.qtpl:34 +func (p *GitListPage) Script() string { +//line gitlist.qtpl:34 + qb422016 := qt422016.AcquireByteBuffer() +//line gitlist.qtpl:34 + p.WriteScript(qb422016) +//line gitlist.qtpl:34 + qs422016 := string(qb422016.B) +//line gitlist.qtpl:34 + qt422016.ReleaseByteBuffer(qb422016) +//line gitlist.qtpl:34 + return qs422016 +//line gitlist.qtpl:34 +} diff --git a/templates/helloworld.qtpl b/templates/helloworld.qtpl index 66287ea..45c5595 100644 --- a/templates/helloworld.qtpl +++ b/templates/helloworld.qtpl @@ -7,8 +7,6 @@ type HelloPage struct { {% func (p *HelloPage) Title() %}Hello{% endfunc %} {% func (p *HelloPage) Content() %} -HelloWorld - {%s= p.Body %} {% endfunc %} diff --git a/templates/helloworld.qtpl.go b/templates/helloworld.qtpl.go index a12455f..61c8f75 100644 --- a/templates/helloworld.qtpl.go +++ b/templates/helloworld.qtpl.go @@ -59,73 +59,71 @@ func (p *HelloPage) Title() string { func (p *HelloPage) StreamContent(qw422016 *qt422016.Writer) { //line helloworld.qtpl:9 qw422016.N().S(` -HelloWorld - `) -//line helloworld.qtpl:12 +//line helloworld.qtpl:10 qw422016.N().S(p.Body) -//line helloworld.qtpl:12 +//line helloworld.qtpl:10 qw422016.N().S(` `) -//line helloworld.qtpl:13 +//line helloworld.qtpl:11 } -//line helloworld.qtpl:13 +//line helloworld.qtpl:11 func (p *HelloPage) WriteContent(qq422016 qtio422016.Writer) { -//line helloworld.qtpl:13 +//line helloworld.qtpl:11 qw422016 := qt422016.AcquireWriter(qq422016) -//line helloworld.qtpl:13 +//line helloworld.qtpl:11 p.StreamContent(qw422016) -//line helloworld.qtpl:13 +//line helloworld.qtpl:11 qt422016.ReleaseWriter(qw422016) -//line helloworld.qtpl:13 +//line helloworld.qtpl:11 } -//line helloworld.qtpl:13 +//line helloworld.qtpl:11 func (p *HelloPage) Content() string { -//line helloworld.qtpl:13 +//line helloworld.qtpl:11 qb422016 := qt422016.AcquireByteBuffer() -//line helloworld.qtpl:13 +//line helloworld.qtpl:11 p.WriteContent(qb422016) -//line helloworld.qtpl:13 +//line helloworld.qtpl:11 qs422016 := string(qb422016.B) -//line helloworld.qtpl:13 +//line helloworld.qtpl:11 qt422016.ReleaseByteBuffer(qb422016) -//line helloworld.qtpl:13 +//line helloworld.qtpl:11 return qs422016 -//line helloworld.qtpl:13 +//line helloworld.qtpl:11 } -//line helloworld.qtpl:15 +//line helloworld.qtpl:13 func (p *HelloPage) StreamScript(qw422016 *qt422016.Writer) { -//line helloworld.qtpl:15 +//line helloworld.qtpl:13 qw422016.N().S(` `) -//line helloworld.qtpl:16 +//line helloworld.qtpl:14 } -//line helloworld.qtpl:16 +//line helloworld.qtpl:14 func (p *HelloPage) WriteScript(qq422016 qtio422016.Writer) { -//line helloworld.qtpl:16 +//line helloworld.qtpl:14 qw422016 := qt422016.AcquireWriter(qq422016) -//line helloworld.qtpl:16 +//line helloworld.qtpl:14 p.StreamScript(qw422016) -//line helloworld.qtpl:16 +//line helloworld.qtpl:14 qt422016.ReleaseWriter(qw422016) -//line helloworld.qtpl:16 +//line helloworld.qtpl:14 } -//line helloworld.qtpl:16 +//line helloworld.qtpl:14 func (p *HelloPage) Script() string { -//line helloworld.qtpl:16 +//line helloworld.qtpl:14 qb422016 := qt422016.AcquireByteBuffer() -//line helloworld.qtpl:16 +//line helloworld.qtpl:14 p.WriteScript(qb422016) -//line helloworld.qtpl:16 +//line helloworld.qtpl:14 qs422016 := string(qb422016.B) -//line helloworld.qtpl:16 +//line helloworld.qtpl:14 qt422016.ReleaseByteBuffer(qb422016) -//line helloworld.qtpl:16 +//line helloworld.qtpl:14 return qs422016 -//line helloworld.qtpl:16 +//line helloworld.qtpl:14 } |