diff options
| author | Rose Hogenson <rosehogenson@posteo.net> | 2026-08-18 18:56:33 -0700 |
|---|---|---|
| committer | Rose Hogenson <rosehogenson@posteo.net> | 2026-08-18 18:56:33 -0700 |
| commit | e9fd0b3a06f0a42b8ac7f97ebd318775d52833e9 (patch) | |
| tree | ddd62d1e7da6696c7964a50e1f062e59e6ebf8ff | |
| parent | 9076095d7edc56ea44dcc66c1844659a156708e9 (diff) | |
| download | roseh.moe-e9fd0b3a06f0a42b8ac7f97ebd318775d52833e9.tar.zst | |
Improve URL structure
| -rw-r--r-- | roseh.moe.go | 148 | ||||
| -rw-r--r-- | templates/mart/girl.html.template | 5 | ||||
| -rw-r--r-- | templates/mart/index.html.template | 4 | ||||
| -rw-r--r-- | templates/mart/set.html.template | 3 |
4 files changed, 70 insertions, 90 deletions
diff --git a/roseh.moe.go b/roseh.moe.go index f3c7c78..48f93b6 100644 --- a/roseh.moe.go +++ b/roseh.moe.go @@ -30,6 +30,7 @@ import ( "net/http/httputil" "net/url" "os" + "path" "path/filepath" "slices" "strconv" @@ -921,7 +922,7 @@ var ( ) type metArtIndexTemplateArgsGirl struct { - ID int64 + URL string Name string } @@ -946,11 +947,12 @@ func (h *metArtIndexHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { var girls []metArtIndexTemplateArgsGirl for rows.Next() { var girl metArtIndexTemplateArgsGirl - if err := rows.Scan(&girl.ID, &girl.Name); err != nil { + if err := rows.Scan(&girl.Name); err != nil { log.Printf("Warning: list girls: %s", err) http.Error(w, "internal error", http.StatusInternalServerError) return } + girl.URL = strings.ReplaceAll(girl.Name, " ", "-") girls = append(girls, girl) } if err := rows.Err(); err != nil { @@ -971,7 +973,7 @@ func (h *metArtPhotoHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { if !stupidCache(w, r) { return } - id, err := strconv.ParseInt(r.PathValue("photo"), 10, 64) + id, err := strconv.ParseInt(strings.TrimSuffix(r.PathValue("photo"), ".jpeg"), 10, 64) if err != nil { notFound(w, r) return @@ -1016,13 +1018,14 @@ var ( ) type metArtGirlTemplateArgsSet struct { - ID int64 + URL string CoverID int64 Name string } type metArtGirlTemplateArgs struct { Name string + URL string Sets []metArtGirlTemplateArgsSet } @@ -1034,51 +1037,38 @@ func (h *metArtGirlHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { if !stupidCache(w, r) { return } - id, err := strconv.ParseInt(r.PathValue("girl"), 10, 64) + name := strings.ReplaceAll(r.PathValue("girl"), "-", " ") + rows, err := h.s.listSetsForGirl.Query(name) if err != nil { - notFound(w, r) + log.Printf("Warning: list sets: %s", err) + http.Error(w, "internal error", http.StatusInternalServerError) return } - wg := new(sync.WaitGroup) - var name string - var nameErr error - wg.Go(func() { - nameErr = h.s.girlName.QueryRow(id).Scan(&name) - }) var sets []metArtGirlTemplateArgsSet - var setsErr error - wg.Go(func() { - rows, err := h.s.listSetsForGirl.Query(id) - if err != nil { - setsErr = err - return - } - for rows.Next() { - var set metArtGirlTemplateArgsSet - if err := rows.Scan(&set.ID, &set.CoverID, &set.Name); err != nil { - setsErr = err - return - } - sets = append(sets, set) - } - setsErr = rows.Err() - }) - wg.Wait() - if nameErr != nil { - if nameErr == sql.ErrNoRows { - notFound(w, r) + for rows.Next() { + var id, coverID int64 + var name string + if err := rows.Scan(&id, &coverID, &name); err != nil { + log.Printf("Warning: list sets: %s", err) + http.Error(w, "internal error", http.StatusInternalServerError) return } - log.Printf("Warning: find girl name: %s", nameErr) + sets = append(sets, metArtGirlTemplateArgsSet{ + Name: name, + URL: fmt.Sprintf("%d-%s", id, strings.ReplaceAll(name, " ", "-")), + CoverID: coverID, + }) + } + if err := rows.Err(); err != nil { + log.Printf("Warning: list sets: %s", err) http.Error(w, "internal error", http.StatusInternalServerError) return } - if setsErr != nil { - log.Printf("Warning: list sets: %s", setsErr) - http.Error(w, "internal error", http.StatusInternalServerError) + if len(sets) == 0 { + notFound(w, r) return } - if err := metArtGirlTemplate.Execute(w, metArtGirlTemplateArgs{Name: name, Sets: sets}); err != nil { + if err := metArtGirlTemplate.Execute(w, metArtGirlTemplateArgs{Name: name, URL: r.PathValue("girl"), Sets: sets}); err != nil { log.Printf("Warning: mart girl: %s", err) } } @@ -1091,13 +1081,9 @@ func (h *metArtGirlPreviewHandler) ServeHTTP(w http.ResponseWriter, r *http.Requ if !stupidCache(w, r) { return } - id, err := strconv.ParseInt(r.PathValue("girl"), 10, 64) - if err != nil { - notFound(w, r) - return - } + name := strings.ReplaceAll(r.PathValue("girl"), "-", " ") var path, filename string - if err := h.s.findPreview.QueryRow(id).Scan(&path, &filename); err != nil { + if err := h.s.findPreview.QueryRow(name).Scan(&path, &filename); err != nil { if err == sql.ErrNoRows { notFound(w, r) return @@ -1142,6 +1128,7 @@ var ( type metArtSetTemplateArgs struct { Name string + URL string Photos []int64 } @@ -1153,51 +1140,42 @@ func (h *metArtSetHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { if !stupidCache(w, r) { return } - id, err := strconv.ParseInt(r.PathValue("set"), 10, 64) + setID, setName, ok := strings.Cut(r.PathValue("set"), "-") + if !ok { + notFound(w, r) + return + } + id, err := strconv.ParseInt(setID, 10, 64) if err != nil { notFound(w, r) return } - wg := new(sync.WaitGroup) - var name string - var nameErr error - wg.Go(func() { - nameErr = h.s.setName.QueryRow(id).Scan(&name) - }) + rows, err := h.s.listPhotosForSet.Query(id) + if err != nil { + log.Printf("Warning: list set photos: %s", err) + http.Error(w, "internal error", http.StatusInternalServerError) + return + } var photos []int64 - var photosErr error - wg.Go(func() { - rows, err := h.s.listPhotosForSet.Query(id) - if err != nil { - photosErr = err - return - } - for rows.Next() { - var photoID int64 - if err := rows.Scan(&photoID); err != nil { - photosErr = err - return - } - photos = append(photos, photoID) - } - photosErr = rows.Err() - }) - wg.Wait() - if nameErr != nil { - if nameErr == sql.ErrNoRows { - notFound(w, r) + for rows.Next() { + var photoID int64 + if err := rows.Scan(&photoID); err != nil { + log.Printf("Warning: list set photos: %s", err) + http.Error(w, "internal error", http.StatusInternalServerError) return } - log.Printf("Warning: find set name: %s", nameErr) + photos = append(photos, photoID) + } + if err := rows.Err(); err != nil { + log.Printf("Warning: list set photos: %s", err) http.Error(w, "internal error", http.StatusInternalServerError) return } - if photosErr != nil { - log.Printf("Warning: list set photos: %s", photosErr) - http.Error(w, "internal error", http.StatusInternalServerError) + if len(photos) == 0 { + notFound(w, r) return } - if err := metArtSetTemplate.Execute(w, metArtSetTemplateArgs{Name: name, Photos: photos}); err != nil { + if err := metArtSetTemplate.Execute(w, metArtSetTemplateArgs{Name: strings.ReplaceAll(setName, "-", " "), URL: path.Join(r.PathValue("girl"), r.PathValue("set")), Photos: photos}); err != nil { log.Printf("Warning: mart set: %s", err) } } @@ -1236,7 +1214,7 @@ type stmts struct { func prepareStatements(db *sql.DB) (*stmts, error) { s := new(stmts) var err error - s.listGirls, err = db.Prepare("SELECT girl_id, name FROM girls ORDER BY substr(name, instr(name, ' ')+1), name") + s.listGirls, err = db.Prepare("SELECT name FROM girls ORDER BY substr(name, instr(name, ' ')+1), name") if err != nil { return nil, err } @@ -1244,7 +1222,7 @@ func prepareStatements(db *sql.DB) (*stmts, error) { if err != nil { return nil, err } - s.findPreview, err = db.Prepare("SELECT path, filename FROM girls JOIN sets USING (girl_id) JOIN photos ON photo_id = cover_photo_id WHERE girl_id = ? ORDER BY date ASC, sets.name ASC LIMIT 1") + s.findPreview, err = db.Prepare("SELECT path, filename FROM girls JOIN sets USING (girl_id) JOIN photos ON photo_id = cover_photo_id WHERE girls.name = ? ORDER BY date ASC, sets.name ASC LIMIT 1") if err != nil { return nil, err } @@ -1252,7 +1230,7 @@ func prepareStatements(db *sql.DB) (*stmts, error) { if err != nil { return nil, err } - s.listSetsForGirl, err = db.Prepare("SELECT set_id, cover_photo_id, sets.name FROM girls JOIN sets USING (girl_id) WHERE girl_id = ? ORDER BY date ASC, sets.name ASC") + s.listSetsForGirl, err = db.Prepare("SELECT set_id, cover_photo_id, sets.name FROM girls JOIN sets USING (girl_id) WHERE girls.name = ? ORDER BY date ASC, sets.name ASC") if err != nil { return nil, err } @@ -1310,11 +1288,11 @@ func main() { mux.HandleFunc("GET /pkg/{pkg}", pkg) mux.Handle("GET /code/", http.StripPrefix("/code/", http.FileServer(http.Dir(*codeDir)))) mux.Handle("GET /nezuko/", &nezukoHandler{http.StripPrefix("/nezuko/", http.FileServer(http.Dir(*nezuko)))}) - mux.Handle("GET /mart", &metArtIndexHandler{stmts}) - mux.Handle("GET /mart/photos/{photo}", &metArtPhotoHandler{stmts}) - mux.Handle("GET /mart/girls/{girl}", &metArtGirlHandler{stmts}) - mux.Handle("GET /mart/girls/{girl}/preview.jpeg", &metArtGirlPreviewHandler{stmts}) - mux.Handle("GET /mart/sets/{set}", &metArtSetHandler{stmts}) + mux.Handle("GET /mart/", &metArtIndexHandler{stmts}) + mux.Handle("GET /mart/{girl}/", &metArtGirlHandler{stmts}) + mux.Handle("GET /mart/{girl}/preview.jpeg", &metArtGirlPreviewHandler{stmts}) + mux.Handle("GET /mart/{girl}/{set}/", &metArtSetHandler{stmts}) + mux.Handle("GET /mart/{girl}/{set}/{photo}", &metArtPhotoHandler{stmts}) mux.HandleFunc("GET /static/", static) mux.HandleFunc("GET /favicon.ico", favicon) apiMux := http.NewServeMux() diff --git a/templates/mart/girl.html.template b/templates/mart/girl.html.template index a4ffce3..de249c5 100644 --- a/templates/mart/girl.html.template +++ b/templates/mart/girl.html.template @@ -3,10 +3,11 @@ {{- end}} {{- define "body"}} + {{$girlURL := .URL}} {{- range .Sets}} <figure> - <a href="/mart/sets/{{.ID}}"> - <img width="250" src="/mart/photos/{{.CoverID}}"> + <a href="/mart/{{$girlURL}}/{{.URL}}/"> + <img width="250" src="/mart/{{$girlURL}}/{{.URL}}/{{.CoverID}}.jpeg"> </a> <figcaption>{{.Name}}</figcaption> </figure> diff --git a/templates/mart/index.html.template b/templates/mart/index.html.template index db52057..7cca57c 100644 --- a/templates/mart/index.html.template +++ b/templates/mart/index.html.template @@ -5,8 +5,8 @@ {{- define "body"}} {{- range .Girls}} <figure> - <a href="/mart/girls/{{.ID}}"> - <img src="/mart/girls/{{.ID}}/preview.jpeg"> + <a href="/mart/{{.URL}}/"> + <img src="/mart/{{.URL}}/preview.jpeg"> </a> <figcaption>{{.Name}}</figcaption> </figure> diff --git a/templates/mart/set.html.template b/templates/mart/set.html.template index 9af31d1..77f743e 100644 --- a/templates/mart/set.html.template +++ b/templates/mart/set.html.template @@ -3,10 +3,11 @@ {{- end}} {{- define "body"}} + {{$setURL := .URL}} <div class="fullwidth"> {{- range .Photos}} <figure> - <img src="/mart/photos/{{.}}"> + <img src="/mart/{{$setURL}}/{{.}}.jpeg"> </figure> {{- end}} </div> |
