75 lines
2.2 KiB
Go
75 lines
2.2 KiB
Go
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
|
|
}
|