summaryrefslogtreecommitdiffstats
path: root/roseh.moe.go
diff options
context:
space:
mode:
Diffstat (limited to 'roseh.moe.go')
-rw-r--r--roseh.moe.go148
1 files changed, 63 insertions, 85 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()