diff --git a/pkg/config/config.go b/pkg/config/config.go index ace4fdb..5f8e73f 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -8,14 +8,16 @@ import ( ) type Config struct { - URL string `envconfig:"APP_URL" required:"true" default:"http://localhost:8080"` - Port string `envconfig:"PORT" required:"true" default:":8080"` - Env string `envconfig:"APP_ENV" required:"true" default:"debug"` - AppSecret string `envconfig:"APP_SECRET" required:"true"` - DatabaseURL string `envconfig:"DATABASE_URL" required:"true"` - Email *EmailConfig - Twitter *TwitterConfig - SlackHook string `envconfig:"SLACK_HOOK"` + URL string `envconfig:"APP_URL" required:"true" default:"http://localhost:8080"` + Port string `envconfig:"PORT" required:"true" default:":8080"` + Env string `envconfig:"APP_ENV" required:"true" default:"debug"` + AppSecret string `envconfig:"APP_SECRET" required:"true"` + DatabaseURL string `envconfig:"DATABASE_URL" required:"true"` + Email *EmailConfig + Twitter *TwitterConfig + SlackHook string `envconfig:"SLACK_HOOK"` + AdminUser string `envconfig:"ADMIN_USER" required:"true"` + AdminPassword string `envconfig:"ADMIN_PASSWORD" require:"true"` } type EmailConfig struct { diff --git a/pkg/server/routes.go b/pkg/server/routes.go index 4a26de2..bc061e1 100644 --- a/pkg/server/routes.go +++ b/pkg/server/routes.go @@ -245,6 +245,19 @@ func (ctrl *Controller) ViewJob(ctx *gin.Context) { ctx.HTML(200, "view", gin.H{"job": job, "description": template.HTML(description)}) } +func (ctrl *Controller) AdminIndex(ctx *gin.Context) { + jobs, err := data.GetAllJobs(ctrl.DB) + if err != nil { + log.Println(fmt.Errorf("failed to get jobs: %w", err)) + ctx.AbortWithStatus(http.StatusInternalServerError) + return + } + + ctx.HTML(http.StatusOK, "admin", gin.H{ + "jobs": jobs, + }) +} + func (ctrl *Controller) DeleteJob(ctx *gin.Context) { id := ctx.Param("id") err := data.DeleteJob(id, ctrl.DB) diff --git a/pkg/server/server.go b/pkg/server/server.go index 40dd231..18e8dcf 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -80,6 +80,18 @@ func NewServer(c *ServerConfig) (http.Server, error) { authorized.POST("/jobs/:id/delete", ctrl.DeleteJob) } + // Admin routes + admin := router.Group("/admin") + admin.Use(gin.BasicAuth(gin.Accounts{ + c.Config.AdminUser: c.Config.AdminPassword, + })) + { + admin.GET("", ctrl.AdminIndex) + admin.GET("/jobs/:id/edit", ctrl.EditJob) + admin.POST("/jobs/:id", ctrl.UpdateJob) + admin.POST("/jobs/:id/delete", ctrl.DeleteJob) + } + return http.Server{ Addr: c.Config.Port, Handler: router, @@ -100,6 +112,7 @@ func renderer(templatePath string) multitemplate.Renderer { r.AddFromFilesFuncs("new", funcMap, basePath, path.Join(templatePath, "new.html")) r.AddFromFilesFuncs("edit", funcMap, basePath, path.Join(templatePath, "edit.html")) r.AddFromFilesFuncs("view", funcMap, basePath, path.Join(templatePath, "view.html")) + r.AddFromFilesFuncs("admin", funcMap, basePath, path.Join(templatePath, "admin.html")) return r } diff --git a/templates/admin.html b/templates/admin.html new file mode 100644 index 0000000..cf10688 --- /dev/null +++ b/templates/admin.html @@ -0,0 +1,38 @@ +{{ define "content" }} +
+

Admin Dashboard

+ +
+ + + + + + + + + + {{ range .jobs }} + + + + + + + {{ end }} + +
JobEmailActions
+ + {{ .Position }} at {{ .Organization }} + + {{ .Email }} +
+ +
+
+
+
+{{ end }}