feat(sketch): setup sketchbook form after initial login
nclazz/soundwerft/pipeline/head This commit looks good Details

closes: #69
master
Niclas Thobaben 2024-03-02 14:52:47 +01:00
parent 2dcd78c193
commit 3d7c0b97d4
7 changed files with 139 additions and 13 deletions

View File

@ -0,0 +1,19 @@
package artist
import "github.com/nicksnyder/go-i18n/v2/i18n"
var (
MsgCreateSketchbookTitle = &i18n.Message{
ID: "Artist.CreateSketchbookTitle",
Other: "Set up your Sketchbook",
}
MsgCreateSketchbook = &i18n.Message{
ID: "Artist.CreateSketchbook",
Other: "Create",
}
MsgErrCreateSketchbook = &i18n.Message{
ID: "Artist.ErrCreateSketchbook",
Other: "Failed to create sketchbook. Check your input and try again",
}
)

View File

@ -4,17 +4,63 @@ import (
"git.l--n.de/nclazz/soundwerft/api/guard"
"git.l--n.de/nclazz/soundwerft/api/handler"
"git.l--n.de/nclazz/soundwerft/api/web/templates/artist"
"git.l--n.de/nclazz/soundwerft/internal/app/sketchbook"
"github.com/labstack/echo/v4"
"log/slog"
)
func Routes(h *handler.Handler) {
h.Echo.GET("/artist", getArtistDashboard(h), guard.Authenticated(h))
h.Echo.GET("/home", getArtistHome(h), guard.Authenticated(h))
g := h.Echo.Group("/sketchbook", guard.Authenticated(h))
g.POST("", postCreateSketchbook(h))
}
func getArtistDashboard(h *handler.Handler) echo.HandlerFunc {
return func(c echo.Context) error {
log := h.Logger(c)
log.Info("called artist page")
return h.Render(c, artist.ArtistPage(h.View(c)))
func artistView(c echo.Context, h *handler.Handler) artist.ArtistView {
return artist.ArtistView{
HasSketchbook: false,
}
}
func createSketchbookFormView(c echo.Context, h *handler.Handler) artist.CreateSketchbookFormView {
return artist.CreateSketchbookFormView{
MsgTitle: h.TranslateMessage(MsgCreateSketchbookTitle),
MsgCreate: h.TranslateMessage(MsgCreateSketchbook),
}
}
func getArtistHome(h *handler.Handler) echo.HandlerFunc {
return func(c echo.Context) error {
ctx := c.Request().Context()
usr := h.User(c)
sk, err := h.Repos.Sketchbooks.GetByOwnerID(ctx, usr.ID)
if err != nil {
return err
}
view := artistView(c, h)
view.HasSketchbook = sk != nil
return h.Render(c, artist.ArtistPage(h.View(c), view, createSketchbookFormView(c, h)))
}
}
func postCreateSketchbook(h *handler.Handler) echo.HandlerFunc {
return func(c echo.Context) error {
ctx := c.Request().Context()
usr := h.User(c)
log := h.Logger(c).With("owner", usr.ID)
view := createSketchbookFormView(c, h)
log.Info("create sketchbook")
sk, err := h.Services.Sketchbooks.CreateSketchbook(ctx, sketchbook.CreateSketchbookCommand{
Owner: usr.ID.String(),
})
if err != nil {
log.Warn("create sketchbook failed", "error", err)
view.Err = h.TranslateMessage(MsgErrCreateSketchbook)
return h.Render(c, artist.CreateSketchbookForm(h.View(c), view))
}
log.Info("created sketchbook", slog.Group("sketchbook", "id", sk.ID))
aView := artistView(c, h)
aView.HasSketchbook = true
return h.Render(c, artist.Dashboard())
}
}

View File

@ -5,8 +5,59 @@ import (
"git.l--n.de/nclazz/soundwerft/api/web/templates/partials"
)
templ ArtistPage(view web.View) {
type ArtistView struct {
HasSketchbook bool
}
type CreateSketchbookFormView struct {
MsgTitle string
MsgCreate string
Err string
}
templ ArtistPage(view web.View, artistView ArtistView, form CreateSketchbookFormView) {
@partials.Document(view) {
<div>Artist Page</div>
if !artistView.HasSketchbook {
@CreateSketchbookForm(view, form)
} else {
@Dashboard()
}
}
}
}
templ Dashboard() {
<div>Artist Dashboard</div>
}
templ CreateSketchbookForm(view web.View, form CreateSketchbookFormView) {
<div class="container-fluid">
<div class="row justify-content-center">
<div class="col-md-3">
<h4>{ form.MsgTitle }</h4>
</div>
</div>
<div class="row justify-content-center">
<div class="col-md-3">
<form class="form"
method="post"
action={view.URL("/sketchbook")}
hx-boost="true"
hx-target="#main"
hx-replace-url="false">
if form.Err != "" {
@partials.Alert("danger") {
{ form.Err }
}
}
<div class="d-grid gap-2">
<input type="submit" class="btn btn-primary btn-lg" value={ form.MsgCreate }/>
</div>
</form>
</div>
</div>
</div>
}

View File

@ -5,6 +5,7 @@ import (
"flag"
"git.l--n.de/nclazz/soundwerft/api"
"git.l--n.de/nclazz/soundwerft/internal/app"
"git.l--n.de/nclazz/soundwerft/internal/app/sketchbook"
"git.l--n.de/nclazz/soundwerft/internal/app/user"
"git.l--n.de/nclazz/soundwerft/internal/config"
"git.l--n.de/nclazz/soundwerft/internal/repository"
@ -45,6 +46,9 @@ func main() {
repos.Users = postgres.NewUserRepository(pg.Conn())
svc.Users = user.NewService(repos.Users.(user.ReadWriter), argon2.New())
repos.Sketchbooks = postgres.NewSketchbookRepository(pg.Conn())
svc.Sketchbooks = sketchbook.NewService(repos.Sketchbooks.(sketchbook.ReadWriter), repos.Users)
adminExists, err := svc.Users.EnsureAdminUserExists(ctx)
if err != nil {
errx.FailApplication(err, "ensuring admin user exists failed")

View File

@ -1,6 +1,7 @@
package app
import (
"git.l--n.de/nclazz/soundwerft/internal/app/sketchbook"
"git.l--n.de/nclazz/soundwerft/internal/app/user"
"github.com/nicksnyder/go-i18n/v2/i18n"
)
@ -17,8 +18,10 @@ var (
)
type Services struct {
Users *user.Service
Users *user.Service
Sketchbooks *sketchbook.Service
}
type Repositories struct {
Users user.Reader
Users user.Reader
Sketchbooks sketchbook.Reader
}

View File

@ -10,8 +10,8 @@ CREATE TABLE IF NOT EXISTS users
updated_at TIMESTAMP
);
CREATE INDEX users_name ON users (name);
CREATE INDEX users_email ON users (email);
CREATE INDEX IF NOT EXISTS users_name ON users (name);
CREATE INDEX IF NOT EXISTS users_email ON users (email);
-- sketchbooks

View File

@ -1,3 +1,6 @@
"Artist.CreateSketchbook" = "Create"
"Artist.CreateSketchbookTitle" = "Set up your Sketchbook"
"Artist.ErrCreateSketchbook" = "Failed to create sketchbook. Check your input and try again"
Save = "Save"
"User.AlreadyHaveAccount" = "Already have an account?"
"User.ConfirmPasswordLabel" = "Confirm password"