package bm import ( "git.golem15.com/golem15/summercms/modules/pact" "git.golem15.com/golem15/summercms/modules/phrasebook" "git.golem15.com/golem15/summercms/modules/surf" "git.golem15.com/jakub/sm-bm-plugin/controllers/api" "gorm.io/gorm" ) var _ pact.HasRoutes = (*Plugin)(nil) // APIPrefix is the path prefix of the student API. const APIPrefix = "/_bm/api/v1" // Routes declares the student API. Every route needs a golem15.user JWT // (jwt.auth); students only read, except for their own reading progress. func (p *Plugin) Routes(r pact.Router) error { h := p.handlers() r.Group(APIPrefix, surf.Use("jwt.auth", "locale.from-principal"), func(g pact.Router) { g.Get("/dashboard", h.Dashboard) g.Get("/courses", h.Courses) g.Get("/courses/{id}", h.Course) g.Where("id", "[0-9]+") g.Get("/schedule", h.Schedule) g.Get("/meetings", h.Meetings) g.Get("/deadlines", h.Deadlines) g.Get("/readings", h.Readings) g.Put("/readings/{id}/progress", h.MarkRead) g.Where("id", "[0-9]+") g.Delete("/readings/{id}/progress", h.UnmarkRead) g.Where("id", "[0-9]+") g.Get("/materials", h.Materials) g.Get("/materials/{id}", h.Material) g.Where("id", "[0-9]+") }) // The student app: the least specific pattern, so every route above and // the admin's keep precedence. It also answers (404) the reserved paths. static, err := newStaticHandler(p.app, p.publicFS) if err != nil { return err } r.GroupRaw("", nil, func(g pact.Router) { g.Get("/{path...}", static.ServeHTTP) }) return nil } // handlers builds the API handlers on the application. The database is // looked up per request, because the binary boots plugins before serve // publishes it. func (p *Plugin) handlers() *api.Handlers { h := &api.Handlers{ DB: func() *gorm.DB { if p.app == nil { return nil } db, _ := p.app.Lookup[*gorm.DB]() return db }, Translator: func() *phrasebook.Translator { if p.app == nil { return nil } tr, _ := p.app.Lookup[*phrasebook.Translator]() return tr }, } if p.app != nil && p.app.Config != nil { h.PerPage = p.app.Config.Int("jz.bm.materials_per_page") h.DashboardLimit = p.app.Config.Int("jz.bm.dashboard_limit") } return h }