feat(sketch): setup sketchbook form after initial login
nclazz/soundwerft/pipeline/head This commit looks good
Details
nclazz/soundwerft/pipeline/head This commit looks good
Details
closes: #69master
parent
2dcd78c193
commit
3d7c0b97d4
|
@ -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",
|
||||
}
|
||||
)
|
|
@ -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())
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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>
|
||||
}
|
||||
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Reference in New Issue