package tags import ( "log" "math" "net/http" "strconv" "fagott.pw/charakterin" "fagott.pw/grilist/eventlogging" "fagott.pw/grilist/frontend" "fagott.pw/grilist/grilist" "fagott.pw/grilist/modules/grils" "github.com/julienschmidt/httprouter" ) type Module struct { g *grilist.Grilist grils *grils.GrilsModule } func New() *Module { return &Module{} } func (m *Module) Name() string { return "Tags" } func (m *Module) Init(g *grilist.Grilist) { m.g = g gm, ok := g.Modules["Grils"] if !ok { log.Fatal("tags: grils module not found") } m.grils = gm.(*grils.GrilsModule) m.g.Router.GET("/tag/:tag", m.viewTag) m.g.Router.GET("/tag/:tag/:page", m.viewTagPage) } func (m *Module) Interface() interface{} { return m } func (m *Module) ProvideDashboardData(user *charakterin.User) []grilist.DashboardCategory { return make([]grilist.DashboardCategory, 0) } func (m *Module) viewTag(w http.ResponseWriter, r *http.Request, p httprouter.Params) { p = append(p, httprouter.Param{ Key: "page", Value: "1", }) m.viewTagPage(w, r, p) } func (m *Module) viewTagPage(w http.ResponseWriter, r *http.Request, p httprouter.Params) { el := m.g.EventLogger(r) user, _ := m.g.Charakterin.GetUserFromRequest(r) tag := p.ByName("tag") var tagID int row := m.g.DB.QueryRow("SELECT id FROM grilist.tags WHERE name = $1;", tag) if err := row.Scan(&tagID); err != nil { log.Println("error getting tag id", err) http.Redirect(w, r, "/", 302) return } pageNumber, err := strconv.Atoi(p.ByName("page")) if err != nil || pageNumber < 1 { pageNumber = 1 } // Anzahl an Pages holen var pageNum int err = m.g.DB.QueryRow(`SELECT COUNT(*) FROM grilist.grils_tags WHERE tag_id = $1`, tagID).Scan(&pageNum) if err != nil { log.Println("error getting page count", err) http.Redirect(w, r, "/", 302) return } pageCount := (int)(math.Ceil(float64(pageNum) / 12.0)) if pageNumber > pageCount { pageNumber = pageCount } idList := make([]int, 0) rows, err := m.g.DB.Query( "SELECT gril_id FROM grilist.grils_tags WHERE tag_id = $1 LIMIT 12 OFFSET $2", tagID, (pageNumber-1)*12) if err != nil { log.Println("error getting idList", err) http.Redirect(w, r, "/", 302) return } defer rows.Close() for rows.Next() { var grilID int rows.Scan(&grilID) idList = append(idList, grilID) } grils, err := m.grils.FromIDs(idList) if err != nil { log.Println(err) http.Redirect(w, r, "/", 302) return } cards := make([]frontend.Card, 0) for _, v := range grils { cards = append(cards, frontend.Card{ Title: v.RomajiName, Description: v.KanjiName, Size: "medium", Actions: []frontend.Action{ frontend.Action{ Name: "anguckieren", Link: "/gril/" + v.Slug(), }, }, }) } data := m.g.Renderer.DefaultData() data["user"] = user data["tag"] = tag data["cards"] = cards data["pagination"] = frontend.PaginationFromPage(3, pageNumber, pageCount) m.g.Renderer.RenderPage("tag", w, data) el.ViewTag(user, eventlogging.ViewTagData{ Tag: tag, TagID: tagID, Results: pageNum, Pages: pageCount, Page: pageNumber, }) }