Compare commits
5 Commits
75442d261d
...
01073aca78
Author | SHA1 | Date |
---|---|---|
Jeffrey Paul | 01073aca78 | 1 year ago |
Jeffrey Paul | 49709ad3d2 | 1 year ago |
Jeffrey Paul | 3f49d528e7 | 1 year ago |
Jeffrey Paul | 46b67f8a6e | 1 year ago |
Jeffrey Paul | 5fc22c36b0 | 1 year ago |
@ -1,30 +0,0 @@ |
||||
package handlers |
||||
|
||||
import ( |
||||
"net/http" |
||||
"time" |
||||
) |
||||
|
||||
func (s *Handlers) handleHealthCheck() http.HandlerFunc { |
||||
type response struct { |
||||
Status string `json:"status"` |
||||
Now string `json:"now"` |
||||
UptimeSeconds int64 `json:"uptime_seconds"` |
||||
UptimeHuman string `json:"uptime_human"` |
||||
Version string `json:"version"` |
||||
Appname string `json:"appname"` |
||||
Maintenance bool `json:"maintenance_mode"` |
||||
} |
||||
return func(w http.ResponseWriter, req *http.Request) { |
||||
resp := &response{ |
||||
Status: "ok", |
||||
Now: time.Now().UTC().Format(time.RFC3339Nano), |
||||
UptimeSeconds: int64(s.uptime().Seconds()), |
||||
UptimeHuman: s.uptime().String(), |
||||
Maintenance: s.maintenance(), |
||||
Appname: s.appname, |
||||
Version: s.version, |
||||
} |
||||
s.respondJSON(w, req, resp, 200) |
||||
} |
||||
} |
@ -1,12 +0,0 @@ |
||||
package handlers |
||||
|
||||
import ( |
||||
"fmt" |
||||
"net/http" |
||||
) |
||||
|
||||
func (s *Handlers) HandleLogin() http.HandlerFunc { |
||||
return func(w http.ResponseWriter, r *http.Request) { |
||||
fmt.Fprintf(w, "hello login") |
||||
} |
||||
} |
@ -0,0 +1,12 @@ |
||||
package handlers |
||||
|
||||
import ( |
||||
"net/http" |
||||
) |
||||
|
||||
func (s *Handlers) HandleHealthCheck() http.HandlerFunc { |
||||
return func(w http.ResponseWriter, req *http.Request) { |
||||
resp := s.hc.Healthcheck() |
||||
s.respondJSON(w, req, resp, 200) |
||||
} |
||||
} |
@ -1,19 +1,18 @@ |
||||
package handlers |
||||
|
||||
import ( |
||||
"html/template" |
||||
"net/http" |
||||
|
||||
"git.eeqj.de/sneak/gohttpserver/templates" |
||||
) |
||||
|
||||
func (s *Handlers) HandleIndex() http.HandlerFunc { |
||||
indexTemplate := template.Must(template.New("index").Parse(templates.MustString("index.html"))) |
||||
t := templates.GetParsed() |
||||
|
||||
return func(w http.ResponseWriter, r *http.Request) { |
||||
err := indexTemplate.ExecuteTemplate(w, "index", nil) |
||||
err := t.ExecuteTemplate(w, "index.html", nil) |
||||
if err != nil { |
||||
s.log.Println(err.Error()) |
||||
s.log.Error().Err(err).Msg("") |
||||
http.Error(w, http.StatusText(500), 500) |
||||
} |
||||
} |
@ -0,0 +1,19 @@ |
||||
package handlers |
||||
|
||||
import ( |
||||
"net/http" |
||||
|
||||
"git.eeqj.de/sneak/gohttpserver/templates" |
||||
) |
||||
|
||||
func (s *Handlers) HandleLoginGET() http.HandlerFunc { |
||||
t := templates.GetParsed() |
||||
|
||||
return func(w http.ResponseWriter, r *http.Request) { |
||||
err := t.ExecuteTemplate(w, "login.html", nil) |
||||
if err != nil { |
||||
s.log.Error().Err(err).Msg("") |
||||
http.Error(w, http.StatusText(500), 500) |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,34 @@ |
||||
package handlers |
||||
|
||||
import ( |
||||
"net/http" |
||||
|
||||
"git.eeqj.de/sneak/gohttpserver/templates" |
||||
) |
||||
|
||||
func (s *Handlers) HandleSignupGET() http.HandlerFunc { |
||||
t := templates.GetParsed() |
||||
|
||||
return func(w http.ResponseWriter, r *http.Request) { |
||||
err := t.ExecuteTemplate(w, "signup.html", nil) |
||||
if err != nil { |
||||
s.log.Error().Err(err).Msg("") |
||||
http.Error(w, http.StatusText(500), 500) |
||||
} |
||||
} |
||||
} |
||||
|
||||
func (s *Handlers) HandleSignupPOST() http.HandlerFunc { |
||||
t := templates.GetParsed() |
||||
return func(w http.ResponseWriter, r *http.Request) { |
||||
|
||||
_ = r.ParseForm() |
||||
|
||||
err := t.ExecuteTemplate(w, "signup.html", nil) |
||||
|
||||
if err != nil { |
||||
s.log.Error().Err(err).Msg("") |
||||
http.Error(w, http.StatusText(500), 500) |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,71 @@ |
||||
package healthcheck |
||||
|
||||
import ( |
||||
"context" |
||||
"time" |
||||
|
||||
"git.eeqj.de/sneak/gohttpserver/internal/config" |
||||
"git.eeqj.de/sneak/gohttpserver/internal/database" |
||||
"git.eeqj.de/sneak/gohttpserver/internal/globals" |
||||
"git.eeqj.de/sneak/gohttpserver/internal/logger" |
||||
"github.com/rs/zerolog" |
||||
"go.uber.org/fx" |
||||
) |
||||
|
||||
type HealthcheckParams struct { |
||||
fx.In |
||||
Globals *globals.Globals |
||||
Config *config.Config |
||||
Logger *logger.Logger |
||||
Database *database.Database |
||||
} |
||||
|
||||
type Healthcheck struct { |
||||
StartupTime time.Time |
||||
log *zerolog.Logger |
||||
params *HealthcheckParams |
||||
} |
||||
|
||||
func New(lc fx.Lifecycle, params HealthcheckParams) (*Healthcheck, error) { |
||||
s := new(Healthcheck) |
||||
s.params = ¶ms |
||||
s.log = params.Logger.Get() |
||||
|
||||
lc.Append(fx.Hook{ |
||||
OnStart: func(ctx context.Context) error { |
||||
s.StartupTime = time.Now() |
||||
return nil |
||||
}, |
||||
OnStop: func(ctx context.Context) error { |
||||
// FIXME do server shutdown here
|
||||
return nil |
||||
}, |
||||
}) |
||||
return s, nil |
||||
} |
||||
|
||||
type HealthcheckResponse struct { |
||||
Status string `json:"status"` |
||||
Now string `json:"now"` |
||||
UptimeSeconds int64 `json:"uptime_seconds"` |
||||
UptimeHuman string `json:"uptime_human"` |
||||
Version string `json:"version"` |
||||
Appname string `json:"appname"` |
||||
Maintenance bool `json:"maintenance_mode"` |
||||
} |
||||
|
||||
func (s *Healthcheck) uptime() time.Duration { |
||||
return time.Since(s.StartupTime) |
||||
} |
||||
|
||||
func (s *Healthcheck) Healthcheck() *HealthcheckResponse { |
||||
resp := &HealthcheckResponse{ |
||||
Status: "ok", |
||||
Now: time.Now().UTC().Format(time.RFC3339Nano), |
||||
UptimeSeconds: int64(s.uptime().Seconds()), |
||||
UptimeHuman: s.uptime().String(), |
||||
Appname: s.params.Globals.Appname, |
||||
Version: s.params.Globals.Version, |
||||
} |
||||
return resp |
||||
} |
@ -0,0 +1,3 @@ |
||||
<script src="/s/js/jquery-3.5.1.slim.min.js"></script> |
||||
<script src="/s/js/bootstrap-4.5.3.bundle.min.js"></script> |
||||
<script src="/s/js/main.js"></script> |
@ -0,0 +1,4 @@ |
||||
<meta charset="utf-8" /> |
||||
<title>{{ .HTMLTitle }}</title> |
||||
<link rel="stylesheet" href="/s/css/bootstrap-4.5.3.min.css" /> |
||||
<link rel="stylesheet" href="/s/css/style.css" /> |
@ -0,0 +1,64 @@ |
||||
<nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark"> |
||||
<a class="navbar-brand" href="/">{{.SiteName}}</a> |
||||
<button |
||||
class="navbar-toggler" |
||||
type="button" |
||||
data-toggle="collapse" |
||||
data-target="#navbarsExampleDefault" |
||||
aria-controls="navbarsExampleDefault" |
||||
aria-expanded="false" |
||||
aria-label="Toggle navigation" |
||||
> |
||||
<span class="navbar-toggler-icon"> </span> |
||||
</button> |
||||
|
||||
<div class="collapse navbar-collapse" id="navbarsExampleDefault"> |
||||
<ul class="navbar-nav mr-auto"> |
||||
<li class="nav-item active"> |
||||
<a class="nav-link" href="#" |
||||
>Home <span class="sr-only">(current)</span></a |
||||
> |
||||
</li> |
||||
<li class="nav-item"> |
||||
<a class="nav-link" href="#">Link</a> |
||||
</li> |
||||
<li class="nav-item"> |
||||
<a class="nav-link disabled" href="#" aria-disabled="true" |
||||
>Disabled</a |
||||
> |
||||
</li> |
||||
<li class="nav-item dropdown"> |
||||
<a |
||||
class="nav-link dropdown-toggle" |
||||
href="#" |
||||
id="dropdown01" |
||||
data-toggle="dropdown" |
||||
aria-haspopup="true" |
||||
aria-expanded="false" |
||||
>Dropdown</a |
||||
> |
||||
<div class="dropdown-menu" aria-labelledby="dropdown01"> |
||||
<a class="dropdown-item" href="#">Action</a> |
||||
<a class="dropdown-item" href="#">Another action</a> |
||||
<a class="dropdown-item" href="#" |
||||
>Something else here</a |
||||
> |
||||
</div> |
||||
</li> |
||||
</ul> |
||||
<form action="POST" class="form-inline my-2 my-lg-0"> |
||||
<input |
||||
class="form-control mr-sm-2" |
||||
type="text" |
||||
placeholder="Search" |
||||
aria-label="Search" |
||||
/> |
||||
<button |
||||
class="btn btn-outline-success my-2 my-sm-0" |
||||
type="submit" |
||||
> |
||||
Search |
||||
</button> |
||||
</form> |
||||
</div> |
||||
</nav> |
@ -0,0 +1,3 @@ |
||||
<footer class="container"> |
||||
<p>© No rights reserved - This is in the public domain!</p> |
||||
</footer> |
@ -0,0 +1,76 @@ |
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
{{ template "htmlheader.html" .HTMLHeader }} |
||||
<style> |
||||
body { |
||||
padding-top: 3.5rem; |
||||
} |
||||
|
||||
.bd-placeholder-img { |
||||
font-size: 1.125rem; |
||||
text-anchor: middle; |
||||
-webkit-user-select: none; |
||||
-moz-user-select: none; |
||||
-ms-user-select: none; |
||||
user-select: none; |
||||
} |
||||
|
||||
@media (min-width: 768px) { |
||||
.bd-placeholder-img-lg { |
||||
font-size: 3.5rem; |
||||
} |
||||
} |
||||
</style> |
||||
</head> |
||||
<body> |
||||
|
||||
{{ template "navbar.html" .Navbar}} |
||||
|
||||
<main role="main"> |
||||
<div class="signup-form"> |
||||
<form action="/signup" method="post"> |
||||
<h2 class="text-center">Create New Account</h2> |
||||
|
||||
<div class="form-group"> |
||||
<span>Email:</span> |
||||
<input type="text" class="form-control" name="email" |
||||
placeholder="user@domain.com" required="required"> |
||||
</div> |
||||
|
||||
<div class="form-group"> |
||||
<span>Desired Username:</span> |
||||
<input type="text" class="form-control" name="desiredUsername" placeholder="Username" required="required"> |
||||
</div> |
||||
<div class="form-group"> |
||||
<p>Please use a unique password that you don't use anywhere |
||||
else. Minimum 12 characters.</p> |
||||
<span>New Password:</span> |
||||
<input type="password" class="form-control" |
||||
name="desiredPassword1" placeholder="Password" required="required"> |
||||
</div> |
||||
<div class="form-group"> |
||||
<span>New Password (again):</span> |
||||
<input type="password" class="form-control" |
||||
name="desiredPassword2" placeholder="Password |
||||
(again)" required="required"> |
||||
</div> |
||||
<div class="form-group"> |
||||
<button type="submit" class="btn btn-primary btn-block">Create |
||||
New Account</button> |
||||
</div> |
||||
<!-- <div class="clearfix"> |
||||
<label class="float-left form-check-label"><input type="checkbox"> Remember me</label> |
||||
<a href="#" class="float-right">Forgot Password?</a> |
||||
</div> |
||||
--> |
||||
</form> |
||||
<p class="text-center"><a href="#">Create an Account</a></p> |
||||
</div> |
||||
|
||||
|
||||
</main> |
||||
|
||||
{{ template "pagefooter.html" .PageFooter }} |
||||
</body> |
||||
</html> |
Loading…
Reference in new issue