From 0ef60cda78aa255496bee7d1b212f31016a78dd9 Mon Sep 17 00:00:00 2001 From: Jonni Liljamo Date: Fri, 13 Oct 2023 14:22:27 +0300 Subject: [PATCH] feat: components in multiple files, and i think all endpoints initialized --- components.templ | 88 -------- components/base.templ | 54 +++++ components/base_templ.go | 187 ++++++++++++++++ components/index.templ | 12 + components/index_templ.go | 85 ++++++++ components/login.templ | 16 ++ components/login_templ.go | 76 +++++++ components/manage.templ | 18 ++ components/manage_templ.go | 115 ++++++++++ components/manageadmin.templ | 26 +++ components/manageadmin_templ.go | 163 ++++++++++++++ components_templ.go | 376 -------------------------------- db/users.go | 21 +- felu.go | 26 ++- handlers/login.go | 2 +- middlewares/admin.go | 37 ++++ middlewares/auth.go | 2 + 17 files changed, 832 insertions(+), 472 deletions(-) delete mode 100644 components.templ create mode 100644 components/base.templ create mode 100644 components/base_templ.go create mode 100644 components/index.templ create mode 100644 components/index_templ.go create mode 100644 components/login.templ create mode 100644 components/login_templ.go create mode 100644 components/manage.templ create mode 100644 components/manage_templ.go create mode 100644 components/manageadmin.templ create mode 100644 components/manageadmin_templ.go delete mode 100644 components_templ.go create mode 100644 middlewares/admin.go diff --git a/components.templ b/components.templ deleted file mode 100644 index 6096a8a..0000000 --- a/components.templ +++ /dev/null @@ -1,88 +0,0 @@ -package main - -import "git.src.quest/~skye/felu-ddns/config" - -func serviceName() string { - return config.FeluConfig.ServiceName -} - -templ baseBase(title string) { - - - - - - - - - - { title } - - -
- { children... } -
- - - -} - -templ base(title string) { - @baseBase(title) { -
- -
- { children... } -
-
- } -} - -templ manageBase(title string) { - @baseBase(title) { -
- -
- { children... } -
-
- } -} - -templ index() { - @base("Index") { -
- have info about the service here, - with a login button somewhere. -
and also something something, basic index page info, bla bla -
- - } -} - -templ pageLogin() { - @manageBase("Login") { -
-
- - - - -
- -
-
- } -} - -templ pageManage() { - @manageBase("Manage") { -
- something something manaag -
- } -} diff --git a/components/base.templ b/components/base.templ new file mode 100644 index 0000000..a7b4d77 --- /dev/null +++ b/components/base.templ @@ -0,0 +1,54 @@ +package components + +import "git.src.quest/~skye/felu-ddns/config" + +func serviceName() string { + return config.FeluConfig.ServiceName +} + +templ BaseBase(title string) { + + + + + + + + + + { title } + + +
+ { children... } +
+ + + +} + +templ Base(title string) { + @BaseBase(title) { +
+ +
+ { children... } +
+
+ } +} + +templ ManageBase(title string) { + @BaseBase(title) { +
+ +
+ { children... } +
+
+ } +} diff --git a/components/base_templ.go b/components/base_templ.go new file mode 100644 index 0000000..2e4a498 --- /dev/null +++ b/components/base_templ.go @@ -0,0 +1,187 @@ +// Code generated by templ@(devel) DO NOT EDIT. + +package components + +//lint:file-ignore SA4006 This context is only used if a nested component is present. + +import "github.com/a-h/templ" +import "context" +import "io" +import "bytes" + +import "git.src.quest/~skye/felu-ddns/config" + +func serviceName() string { + return config.FeluConfig.ServiceName +} + +func BaseBase(title string) templ.Component { + return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { + templBuffer, templIsBuffer := w.(*bytes.Buffer) + if !templIsBuffer { + templBuffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templBuffer) + } + ctx = templ.InitializeContext(ctx) + var_1 := templ.GetChildren(ctx) + if var_1 == nil { + var_1 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + _, err = templBuffer.WriteString("") + if err != nil { + return err + } + var var_3 string = title + _, err = templBuffer.WriteString(templ.EscapeString(var_3)) + if err != nil { + return err + } + _, err = templBuffer.WriteString("
") + if err != nil { + return err + } + err = var_1.Render(ctx, templBuffer) + if err != nil { + return err + } + _, err = templBuffer.WriteString("
") + if err != nil { + return err + } + if !templIsBuffer { + _, err = templBuffer.WriteTo(w) + } + return err + }) +} + +func Base(title string) templ.Component { + return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { + templBuffer, templIsBuffer := w.(*bytes.Buffer) + if !templIsBuffer { + templBuffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templBuffer) + } + ctx = templ.InitializeContext(ctx) + var_5 := templ.GetChildren(ctx) + if var_5 == nil { + var_5 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + var_6 := templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { + templBuffer, templIsBuffer := w.(*bytes.Buffer) + if !templIsBuffer { + templBuffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templBuffer) + } + _, err = templBuffer.WriteString("
") + if err != nil { + return err + } + err = var_5.Render(ctx, templBuffer) + if err != nil { + return err + } + _, err = templBuffer.WriteString("
") + if err != nil { + return err + } + if !templIsBuffer { + _, err = io.Copy(w, templBuffer) + } + return err + }) + err = BaseBase(title).Render(templ.WithChildren(ctx, var_6), templBuffer) + if err != nil { + return err + } + if !templIsBuffer { + _, err = templBuffer.WriteTo(w) + } + return err + }) +} + +func ManageBase(title string) templ.Component { + return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { + templBuffer, templIsBuffer := w.(*bytes.Buffer) + if !templIsBuffer { + templBuffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templBuffer) + } + ctx = templ.InitializeContext(ctx) + var_8 := templ.GetChildren(ctx) + if var_8 == nil { + var_8 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + var_9 := templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { + templBuffer, templIsBuffer := w.(*bytes.Buffer) + if !templIsBuffer { + templBuffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templBuffer) + } + _, err = templBuffer.WriteString("
") + if err != nil { + return err + } + err = var_8.Render(ctx, templBuffer) + if err != nil { + return err + } + _, err = templBuffer.WriteString("
") + if err != nil { + return err + } + if !templIsBuffer { + _, err = io.Copy(w, templBuffer) + } + return err + }) + err = BaseBase(title).Render(templ.WithChildren(ctx, var_9), templBuffer) + if err != nil { + return err + } + if !templIsBuffer { + _, err = templBuffer.WriteTo(w) + } + return err + }) +} diff --git a/components/index.templ b/components/index.templ new file mode 100644 index 0000000..d02eff1 --- /dev/null +++ b/components/index.templ @@ -0,0 +1,12 @@ +package components + +templ Index() { + @Base("Index") { +
+ have info about the service here, + with a login button somewhere. +
and also something something, basic index page info, bla bla +
+ + } +} diff --git a/components/index_templ.go b/components/index_templ.go new file mode 100644 index 0000000..261530f --- /dev/null +++ b/components/index_templ.go @@ -0,0 +1,85 @@ +// Code generated by templ@(devel) DO NOT EDIT. + +package components + +//lint:file-ignore SA4006 This context is only used if a nested component is present. + +import "github.com/a-h/templ" +import "context" +import "io" +import "bytes" + +func Index() templ.Component { + return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { + templBuffer, templIsBuffer := w.(*bytes.Buffer) + if !templIsBuffer { + templBuffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templBuffer) + } + ctx = templ.InitializeContext(ctx) + var_1 := templ.GetChildren(ctx) + if var_1 == nil { + var_1 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + var_2 := templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { + templBuffer, templIsBuffer := w.(*bytes.Buffer) + if !templIsBuffer { + templBuffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templBuffer) + } + _, err = templBuffer.WriteString("
") + if err != nil { + return err + } + var_3 := `have info about the service here,` + _, err = templBuffer.WriteString(var_3) + if err != nil { + return err + } + _, err = templBuffer.WriteString(" ") + if err != nil { + return err + } + var_4 := `with a login button somewhere.` + _, err = templBuffer.WriteString(var_4) + if err != nil { + return err + } + _, err = templBuffer.WriteString("
") + if err != nil { + return err + } + var_5 := `and also something something, basic index page info, bla bla` + _, err = templBuffer.WriteString(var_5) + if err != nil { + return err + } + _, err = templBuffer.WriteString("
") + if err != nil { + return err + } + if !templIsBuffer { + _, err = io.Copy(w, templBuffer) + } + return err + }) + err = Base("Index").Render(templ.WithChildren(ctx, var_2), templBuffer) + if err != nil { + return err + } + if !templIsBuffer { + _, err = templBuffer.WriteTo(w) + } + return err + }) +} diff --git a/components/login.templ b/components/login.templ new file mode 100644 index 0000000..81aa4b8 --- /dev/null +++ b/components/login.templ @@ -0,0 +1,16 @@ +package components + +templ Login() { + @ManageBase("Login") { +
+
+ + + + +
+ +
+
+ } +} diff --git a/components/login_templ.go b/components/login_templ.go new file mode 100644 index 0000000..12d863f --- /dev/null +++ b/components/login_templ.go @@ -0,0 +1,76 @@ +// Code generated by templ@(devel) DO NOT EDIT. + +package components + +//lint:file-ignore SA4006 This context is only used if a nested component is present. + +import "github.com/a-h/templ" +import "context" +import "io" +import "bytes" + +func Login() templ.Component { + return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { + templBuffer, templIsBuffer := w.(*bytes.Buffer) + if !templIsBuffer { + templBuffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templBuffer) + } + ctx = templ.InitializeContext(ctx) + var_1 := templ.GetChildren(ctx) + if var_1 == nil { + var_1 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + var_2 := templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { + templBuffer, templIsBuffer := w.(*bytes.Buffer) + if !templIsBuffer { + templBuffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templBuffer) + } + _, err = templBuffer.WriteString("
") + if err != nil { + return err + } + if !templIsBuffer { + _, err = io.Copy(w, templBuffer) + } + return err + }) + err = ManageBase("Login").Render(templ.WithChildren(ctx, var_2), templBuffer) + if err != nil { + return err + } + if !templIsBuffer { + _, err = templBuffer.WriteTo(w) + } + return err + }) +} diff --git a/components/manage.templ b/components/manage.templ new file mode 100644 index 0000000..7e26b94 --- /dev/null +++ b/components/manage.templ @@ -0,0 +1,18 @@ +package components + +templ Manage() { + @ManageBase("Manage") { +
+ something something manaag +
have the domains of a user listed here, with also the edit stuff and all that +
+ } +} + +templ ManageSettings() { + @ManageBase("Settings") { +
+ user settings here, like updating email and password +
+ } +} diff --git a/components/manage_templ.go b/components/manage_templ.go new file mode 100644 index 0000000..9066715 --- /dev/null +++ b/components/manage_templ.go @@ -0,0 +1,115 @@ +// Code generated by templ@(devel) DO NOT EDIT. + +package components + +//lint:file-ignore SA4006 This context is only used if a nested component is present. + +import "github.com/a-h/templ" +import "context" +import "io" +import "bytes" + +func Manage() templ.Component { + return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { + templBuffer, templIsBuffer := w.(*bytes.Buffer) + if !templIsBuffer { + templBuffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templBuffer) + } + ctx = templ.InitializeContext(ctx) + var_1 := templ.GetChildren(ctx) + if var_1 == nil { + var_1 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + var_2 := templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { + templBuffer, templIsBuffer := w.(*bytes.Buffer) + if !templIsBuffer { + templBuffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templBuffer) + } + _, err = templBuffer.WriteString("
") + if err != nil { + return err + } + var_3 := `something something manaag` + _, err = templBuffer.WriteString(var_3) + if err != nil { + return err + } + _, err = templBuffer.WriteString("
") + if err != nil { + return err + } + var_4 := `have the domains of a user listed here, with also the edit stuff and all that` + _, err = templBuffer.WriteString(var_4) + if err != nil { + return err + } + _, err = templBuffer.WriteString("
") + if err != nil { + return err + } + if !templIsBuffer { + _, err = io.Copy(w, templBuffer) + } + return err + }) + err = ManageBase("Manage").Render(templ.WithChildren(ctx, var_2), templBuffer) + if err != nil { + return err + } + if !templIsBuffer { + _, err = templBuffer.WriteTo(w) + } + return err + }) +} + +func ManageSettings() templ.Component { + return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { + templBuffer, templIsBuffer := w.(*bytes.Buffer) + if !templIsBuffer { + templBuffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templBuffer) + } + ctx = templ.InitializeContext(ctx) + var_5 := templ.GetChildren(ctx) + if var_5 == nil { + var_5 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + var_6 := templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { + templBuffer, templIsBuffer := w.(*bytes.Buffer) + if !templIsBuffer { + templBuffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templBuffer) + } + _, err = templBuffer.WriteString("
") + if err != nil { + return err + } + var_7 := `user settings here, like updating email and password` + _, err = templBuffer.WriteString(var_7) + if err != nil { + return err + } + _, err = templBuffer.WriteString("
") + if err != nil { + return err + } + if !templIsBuffer { + _, err = io.Copy(w, templBuffer) + } + return err + }) + err = ManageBase("Settings").Render(templ.WithChildren(ctx, var_6), templBuffer) + if err != nil { + return err + } + if !templIsBuffer { + _, err = templBuffer.WriteTo(w) + } + return err + }) +} diff --git a/components/manageadmin.templ b/components/manageadmin.templ new file mode 100644 index 0000000..f13d1d0 --- /dev/null +++ b/components/manageadmin.templ @@ -0,0 +1,26 @@ +package components + +templ ManageAdmin() { + @ManageBase("ManageAdmin") { +
+ something something admin page +
probs have like stats and that kinda stuff here +
+ } +} + +templ ManageAdminUsers() { + @ManageBase("ManageAdmin") { +
+ list of users here, with also the ability to add new users +
+ } +} + +templ ManageAdminDomains() { + @ManageBase("ManageAdmin") { +
+ list of all domains on the instance, with owner details and such +
+ } +} diff --git a/components/manageadmin_templ.go b/components/manageadmin_templ.go new file mode 100644 index 0000000..cc0d95a --- /dev/null +++ b/components/manageadmin_templ.go @@ -0,0 +1,163 @@ +// Code generated by templ@(devel) DO NOT EDIT. + +package components + +//lint:file-ignore SA4006 This context is only used if a nested component is present. + +import "github.com/a-h/templ" +import "context" +import "io" +import "bytes" + +func ManageAdmin() templ.Component { + return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { + templBuffer, templIsBuffer := w.(*bytes.Buffer) + if !templIsBuffer { + templBuffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templBuffer) + } + ctx = templ.InitializeContext(ctx) + var_1 := templ.GetChildren(ctx) + if var_1 == nil { + var_1 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + var_2 := templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { + templBuffer, templIsBuffer := w.(*bytes.Buffer) + if !templIsBuffer { + templBuffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templBuffer) + } + _, err = templBuffer.WriteString("
") + if err != nil { + return err + } + var_3 := `something something admin page` + _, err = templBuffer.WriteString(var_3) + if err != nil { + return err + } + _, err = templBuffer.WriteString("
") + if err != nil { + return err + } + var_4 := `probs have like stats and that kinda stuff here` + _, err = templBuffer.WriteString(var_4) + if err != nil { + return err + } + _, err = templBuffer.WriteString("
") + if err != nil { + return err + } + if !templIsBuffer { + _, err = io.Copy(w, templBuffer) + } + return err + }) + err = ManageBase("ManageAdmin").Render(templ.WithChildren(ctx, var_2), templBuffer) + if err != nil { + return err + } + if !templIsBuffer { + _, err = templBuffer.WriteTo(w) + } + return err + }) +} + +func ManageAdminUsers() templ.Component { + return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { + templBuffer, templIsBuffer := w.(*bytes.Buffer) + if !templIsBuffer { + templBuffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templBuffer) + } + ctx = templ.InitializeContext(ctx) + var_5 := templ.GetChildren(ctx) + if var_5 == nil { + var_5 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + var_6 := templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { + templBuffer, templIsBuffer := w.(*bytes.Buffer) + if !templIsBuffer { + templBuffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templBuffer) + } + _, err = templBuffer.WriteString("
") + if err != nil { + return err + } + var_7 := `list of users here, with also the ability to add new users` + _, err = templBuffer.WriteString(var_7) + if err != nil { + return err + } + _, err = templBuffer.WriteString("
") + if err != nil { + return err + } + if !templIsBuffer { + _, err = io.Copy(w, templBuffer) + } + return err + }) + err = ManageBase("ManageAdmin").Render(templ.WithChildren(ctx, var_6), templBuffer) + if err != nil { + return err + } + if !templIsBuffer { + _, err = templBuffer.WriteTo(w) + } + return err + }) +} + +func ManageAdminDomains() templ.Component { + return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { + templBuffer, templIsBuffer := w.(*bytes.Buffer) + if !templIsBuffer { + templBuffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templBuffer) + } + ctx = templ.InitializeContext(ctx) + var_8 := templ.GetChildren(ctx) + if var_8 == nil { + var_8 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + var_9 := templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { + templBuffer, templIsBuffer := w.(*bytes.Buffer) + if !templIsBuffer { + templBuffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templBuffer) + } + _, err = templBuffer.WriteString("
") + if err != nil { + return err + } + var_10 := `list of all domains on the instance, with owner details and such` + _, err = templBuffer.WriteString(var_10) + if err != nil { + return err + } + _, err = templBuffer.WriteString("
") + if err != nil { + return err + } + if !templIsBuffer { + _, err = io.Copy(w, templBuffer) + } + return err + }) + err = ManageBase("ManageAdmin").Render(templ.WithChildren(ctx, var_9), templBuffer) + if err != nil { + return err + } + if !templIsBuffer { + _, err = templBuffer.WriteTo(w) + } + return err + }) +} diff --git a/components_templ.go b/components_templ.go deleted file mode 100644 index a6c6252..0000000 --- a/components_templ.go +++ /dev/null @@ -1,376 +0,0 @@ -// Code generated by templ@(devel) DO NOT EDIT. - -package main - -//lint:file-ignore SA4006 This context is only used if a nested component is present. - -import "github.com/a-h/templ" -import "context" -import "io" -import "bytes" - -import "git.src.quest/~skye/felu-ddns/config" - -func serviceName() string { - return config.FeluConfig.ServiceName -} - -func baseBase(title string) templ.Component { - return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { - templBuffer, templIsBuffer := w.(*bytes.Buffer) - if !templIsBuffer { - templBuffer = templ.GetBuffer() - defer templ.ReleaseBuffer(templBuffer) - } - ctx = templ.InitializeContext(ctx) - var_1 := templ.GetChildren(ctx) - if var_1 == nil { - var_1 = templ.NopComponent - } - ctx = templ.ClearChildren(ctx) - _, err = templBuffer.WriteString("") - if err != nil { - return err - } - var var_3 string = title - _, err = templBuffer.WriteString(templ.EscapeString(var_3)) - if err != nil { - return err - } - _, err = templBuffer.WriteString("
") - if err != nil { - return err - } - err = var_1.Render(ctx, templBuffer) - if err != nil { - return err - } - _, err = templBuffer.WriteString("
") - if err != nil { - return err - } - if !templIsBuffer { - _, err = templBuffer.WriteTo(w) - } - return err - }) -} - -func base(title string) templ.Component { - return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { - templBuffer, templIsBuffer := w.(*bytes.Buffer) - if !templIsBuffer { - templBuffer = templ.GetBuffer() - defer templ.ReleaseBuffer(templBuffer) - } - ctx = templ.InitializeContext(ctx) - var_5 := templ.GetChildren(ctx) - if var_5 == nil { - var_5 = templ.NopComponent - } - ctx = templ.ClearChildren(ctx) - var_6 := templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { - templBuffer, templIsBuffer := w.(*bytes.Buffer) - if !templIsBuffer { - templBuffer = templ.GetBuffer() - defer templ.ReleaseBuffer(templBuffer) - } - _, err = templBuffer.WriteString("
") - if err != nil { - return err - } - err = var_5.Render(ctx, templBuffer) - if err != nil { - return err - } - _, err = templBuffer.WriteString("
") - if err != nil { - return err - } - if !templIsBuffer { - _, err = io.Copy(w, templBuffer) - } - return err - }) - err = baseBase(title).Render(templ.WithChildren(ctx, var_6), templBuffer) - if err != nil { - return err - } - if !templIsBuffer { - _, err = templBuffer.WriteTo(w) - } - return err - }) -} - -func manageBase(title string) templ.Component { - return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { - templBuffer, templIsBuffer := w.(*bytes.Buffer) - if !templIsBuffer { - templBuffer = templ.GetBuffer() - defer templ.ReleaseBuffer(templBuffer) - } - ctx = templ.InitializeContext(ctx) - var_8 := templ.GetChildren(ctx) - if var_8 == nil { - var_8 = templ.NopComponent - } - ctx = templ.ClearChildren(ctx) - var_9 := templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { - templBuffer, templIsBuffer := w.(*bytes.Buffer) - if !templIsBuffer { - templBuffer = templ.GetBuffer() - defer templ.ReleaseBuffer(templBuffer) - } - _, err = templBuffer.WriteString("
") - if err != nil { - return err - } - err = var_8.Render(ctx, templBuffer) - if err != nil { - return err - } - _, err = templBuffer.WriteString("
") - if err != nil { - return err - } - if !templIsBuffer { - _, err = io.Copy(w, templBuffer) - } - return err - }) - err = baseBase(title).Render(templ.WithChildren(ctx, var_9), templBuffer) - if err != nil { - return err - } - if !templIsBuffer { - _, err = templBuffer.WriteTo(w) - } - return err - }) -} - -func index() templ.Component { - return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { - templBuffer, templIsBuffer := w.(*bytes.Buffer) - if !templIsBuffer { - templBuffer = templ.GetBuffer() - defer templ.ReleaseBuffer(templBuffer) - } - ctx = templ.InitializeContext(ctx) - var_11 := templ.GetChildren(ctx) - if var_11 == nil { - var_11 = templ.NopComponent - } - ctx = templ.ClearChildren(ctx) - var_12 := templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { - templBuffer, templIsBuffer := w.(*bytes.Buffer) - if !templIsBuffer { - templBuffer = templ.GetBuffer() - defer templ.ReleaseBuffer(templBuffer) - } - _, err = templBuffer.WriteString("
") - if err != nil { - return err - } - var_13 := `have info about the service here,` - _, err = templBuffer.WriteString(var_13) - if err != nil { - return err - } - _, err = templBuffer.WriteString(" ") - if err != nil { - return err - } - var_14 := `with a login button somewhere.` - _, err = templBuffer.WriteString(var_14) - if err != nil { - return err - } - _, err = templBuffer.WriteString("
") - if err != nil { - return err - } - var_15 := `and also something something, basic index page info, bla bla` - _, err = templBuffer.WriteString(var_15) - if err != nil { - return err - } - _, err = templBuffer.WriteString("
") - if err != nil { - return err - } - if !templIsBuffer { - _, err = io.Copy(w, templBuffer) - } - return err - }) - err = base("Index").Render(templ.WithChildren(ctx, var_12), templBuffer) - if err != nil { - return err - } - if !templIsBuffer { - _, err = templBuffer.WriteTo(w) - } - return err - }) -} - -func pageLogin() templ.Component { - return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { - templBuffer, templIsBuffer := w.(*bytes.Buffer) - if !templIsBuffer { - templBuffer = templ.GetBuffer() - defer templ.ReleaseBuffer(templBuffer) - } - ctx = templ.InitializeContext(ctx) - var_17 := templ.GetChildren(ctx) - if var_17 == nil { - var_17 = templ.NopComponent - } - ctx = templ.ClearChildren(ctx) - var_18 := templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { - templBuffer, templIsBuffer := w.(*bytes.Buffer) - if !templIsBuffer { - templBuffer = templ.GetBuffer() - defer templ.ReleaseBuffer(templBuffer) - } - _, err = templBuffer.WriteString("
") - if err != nil { - return err - } - if !templIsBuffer { - _, err = io.Copy(w, templBuffer) - } - return err - }) - err = manageBase("Login").Render(templ.WithChildren(ctx, var_18), templBuffer) - if err != nil { - return err - } - if !templIsBuffer { - _, err = templBuffer.WriteTo(w) - } - return err - }) -} - -func pageManage() templ.Component { - return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { - templBuffer, templIsBuffer := w.(*bytes.Buffer) - if !templIsBuffer { - templBuffer = templ.GetBuffer() - defer templ.ReleaseBuffer(templBuffer) - } - ctx = templ.InitializeContext(ctx) - var_22 := templ.GetChildren(ctx) - if var_22 == nil { - var_22 = templ.NopComponent - } - ctx = templ.ClearChildren(ctx) - var_23 := templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { - templBuffer, templIsBuffer := w.(*bytes.Buffer) - if !templIsBuffer { - templBuffer = templ.GetBuffer() - defer templ.ReleaseBuffer(templBuffer) - } - _, err = templBuffer.WriteString("
") - if err != nil { - return err - } - var_24 := `something something manaag` - _, err = templBuffer.WriteString(var_24) - if err != nil { - return err - } - _, err = templBuffer.WriteString("
") - if err != nil { - return err - } - if !templIsBuffer { - _, err = io.Copy(w, templBuffer) - } - return err - }) - err = manageBase("Manage").Render(templ.WithChildren(ctx, var_23), templBuffer) - if err != nil { - return err - } - if !templIsBuffer { - _, err = templBuffer.WriteTo(w) - } - return err - }) -} diff --git a/db/users.go b/db/users.go index dbf139a..4f0129b 100644 --- a/db/users.go +++ b/db/users.go @@ -51,11 +51,12 @@ func CreateAdmin(email string, pwd string) error { } type User struct { - Ulid string - Email string + Ulid string + Email string + IsAdmin bool } -func FetchUser(email string, pwd string) (*User, error) { +func FetchUserWithCreds(email string, pwd string) (*User, error) { user := User{ Email: email } var encodedPwd string err := DBConn.QueryRow(`SELECT ulid, pwd FROM users WHERE email = $1`, @@ -77,3 +78,17 @@ func FetchUser(email string, pwd string) (*User, error) { return &user, nil } + +func FetchUserWithUlid(ulid string) (*User, error) { + user := User{ Ulid: ulid } + err := DBConn.QueryRow(`SELECT email, is_admin FROM users WHERE ulid = $1`, + ulid).Scan(&user.Email, &user.IsAdmin) + if err == sql.ErrNoRows { + return nil, errors.New("User not found") + } + if err != nil { + return nil, errors.New("User query failed") + } + + return &user, nil +} diff --git a/felu.go b/felu.go index 28e252d..82e55d5 100644 --- a/felu.go +++ b/felu.go @@ -13,6 +13,7 @@ import ( "strconv" "time" + "git.src.quest/~skye/felu-ddns/components" "git.src.quest/~skye/felu-ddns/config" "git.src.quest/~skye/felu-ddns/db" "git.src.quest/~skye/felu-ddns/dns" @@ -63,11 +64,11 @@ func setupFrontendRouter() *gin.Engine { r.HTMLRender = &TemplRender{} r.GET("/", func(c *gin.Context) { - c.HTML(http.StatusOK, "", index()) + c.HTML(http.StatusOK, "", components.Index()) }) r.GET("/login", middlewares.SessionExists(sessionManager), func(c *gin.Context) { - c.HTML(http.StatusOK, "", pageLogin()) + c.HTML(http.StatusOK, "", components.Login()) }) auth := r.Group("/auth") @@ -81,9 +82,26 @@ func setupFrontendRouter() *gin.Engine { manage := r.Group("/manage").Use(middlewares.SessionExists(sessionManager)) { manage.GET("/", func(c *gin.Context) { - c.HTML(http.StatusOK, "", pageManage()) + c.HTML(http.StatusOK, "", components.Manage()) + }) + manage.GET("/settings", func(c *gin.Context) { + c.HTML(http.StatusOK, "", components.ManageSettings()) + }) + } + manageAdmin := r.Group("/manage/admin").Use( + middlewares.SessionExists(sessionManager), + middlewares.AdminOnly(), + ) + { + manageAdmin.GET("/", func(c *gin.Context) { + c.HTML(http.StatusOK, "", components.ManageAdmin()) + }) + manageAdmin.GET("/users", func(c *gin.Context) { + c.HTML(http.StatusOK, "", components.ManageAdminUsers()) + }) + manageAdmin.GET("/domains", func(c *gin.Context) { + c.HTML(http.StatusOK, "", components.ManageAdminDomains()) }) - manage.GET("/settings") } return r diff --git a/handlers/login.go b/handlers/login.go index c9a1298..034afe5 100644 --- a/handlers/login.go +++ b/handlers/login.go @@ -28,7 +28,7 @@ func AuthLogin(sm *scs.SessionManager, c *gin.Context) { return } - user, err := db.FetchUser(data.Email, data.Password) + user, err := db.FetchUserWithCreds(data.Email, data.Password) if err != nil { c.String(http.StatusUnauthorized, err.Error()) return diff --git a/middlewares/admin.go b/middlewares/admin.go new file mode 100644 index 0000000..57395e9 --- /dev/null +++ b/middlewares/admin.go @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2023 Jonni Liljamo + * + * This file is licensed under AGPL-3.0-or-later, see NOTICE and LICENSE for + * more information. + */ +package middlewares + +import ( + "net/http" + + "git.src.quest/~skye/felu-ddns/db" + "github.com/gin-gonic/gin" +) + +func AdminOnly() gin.HandlerFunc { + return func(c *gin.Context) { + user_id, exists := c.Get("user_id") + if exists { + user, err := db.FetchUserWithUlid(user_id.(string)) + if err == nil { + if user.IsAdmin { + c.Next() + } else { + c.Redirect(http.StatusTemporaryRedirect, "/manage") + c.Abort() + } + } else { + c.String(http.StatusInternalServerError, "This should not be possible, but don't quote me on that, S01E02") + c.Abort() + } + } else { + c.String(http.StatusInternalServerError, "This should not be possible, but don't quote me on that, S01E01") + c.Abort() + } + } +} diff --git a/middlewares/auth.go b/middlewares/auth.go index 464deab..4b24433 100644 --- a/middlewares/auth.go +++ b/middlewares/auth.go @@ -21,6 +21,8 @@ func SessionExists(sm *scs.SessionManager) gin.HandlerFunc { c.Redirect(http.StatusTemporaryRedirect, "/manage") c.Abort() } else { + // Set user_id in context, if needed later (e.g. AdminOnly middleware) + c.Set("user_id", user_id) // TODO: Validate in db? c.Next() } -- 2.44.1