all database operations now take a context.Context, which is propagated through from sources
This commit is contained in:
+8
-8
@@ -120,7 +120,7 @@ func (c *amContext) ClearLoginCookie() {
|
||||
|
||||
// ClearSession clears the current session.
|
||||
func (c *amContext) ClearSession() {
|
||||
AmResetSession(c.session)
|
||||
AmResetSession(c.echoContext.Request().Context(), c.session)
|
||||
c.user = nil
|
||||
c.effectiveLevel = 0
|
||||
}
|
||||
@@ -144,7 +144,7 @@ func (c *amContext) CurrentCommunity() *database.Community {
|
||||
// CurrentUser returns the current user from the session.
|
||||
func (c *amContext) CurrentUser() *database.User {
|
||||
if c.user == nil {
|
||||
u, err := database.AmGetUser(AmSessionUid(c.session))
|
||||
u, err := database.AmGetUser(c.echoContext.Request().Context(), AmSessionUid(c.session))
|
||||
if err != nil {
|
||||
log.Errorf("unable to retrieve current user")
|
||||
}
|
||||
@@ -327,12 +327,12 @@ func (c *amContext) SubRender(name string) ([]byte, error) {
|
||||
* Standard Go error status.
|
||||
*/
|
||||
func (c *amContext) SetCommunityContext(param string) error {
|
||||
comm, err := database.AmGetCommunityFromParam(param)
|
||||
comm, err := database.AmGetCommunityFromParam(c.echoContext.Request().Context(), param)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if c.community == nil || c.community.Id != comm.Id {
|
||||
mbr, lock, level, err := comm.Membership(c.CurrentUser())
|
||||
mbr, lock, level, err := comm.Membership(c.echoContext.Request().Context(), c.CurrentUser())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -459,11 +459,11 @@ func newContext(ctxt echo.Context) (*amContext, error) {
|
||||
}
|
||||
|
||||
var err error
|
||||
if rc.globals, err = database.AmGlobals(); err != nil {
|
||||
if rc.globals, err = database.AmGlobals(ctxt.Request().Context()); err != nil {
|
||||
amContextRecycleBin <- rc
|
||||
return nil, err
|
||||
}
|
||||
if rc.globalFlags, err = rc.globals.Flags(); err != nil {
|
||||
if rc.globalFlags, err = rc.globals.Flags(ctxt.Request().Context()); err != nil {
|
||||
amContextRecycleBin <- rc
|
||||
return nil, err
|
||||
}
|
||||
@@ -475,12 +475,12 @@ func newContext(ctxt echo.Context) (*amContext, error) {
|
||||
rc.session = sess
|
||||
sess.Options = defoptions
|
||||
if sess.IsNew {
|
||||
AmSessionFirstTime(sess)
|
||||
AmSessionFirstTime(ctxt.Request().Context(), sess)
|
||||
} else {
|
||||
AmHitSession(sess)
|
||||
}
|
||||
}
|
||||
rc.user, err = database.AmGetUser(AmSessionUid(sess))
|
||||
rc.user, err = database.AmGetUser(ctxt.Request().Context(), AmSessionUid(sess))
|
||||
if err == nil {
|
||||
rc.effectiveLevel = rc.user.BaseLevel
|
||||
} else {
|
||||
|
||||
+1
-1
@@ -78,7 +78,7 @@ func AmServeImage(ctxt AmContext) (string, any, error) {
|
||||
id, err = strconv.Atoi(components[3])
|
||||
if err == nil {
|
||||
var img *database.ImageStore
|
||||
img, err = database.AmLoadImage(int32(id))
|
||||
img, err = database.AmLoadImage(ctxt.Ctx(), int32(id))
|
||||
if err == nil {
|
||||
ctxt.SetOutputType(img.MimeType)
|
||||
return "bytes", img.Data, nil
|
||||
|
||||
+4
-2
@@ -10,6 +10,7 @@
|
||||
package ui
|
||||
|
||||
import (
|
||||
"context"
|
||||
_ "embed"
|
||||
"fmt"
|
||||
"slices"
|
||||
@@ -141,19 +142,20 @@ func AmMenu(name string) *MenuDefinition {
|
||||
|
||||
/* AmBuildCommunityMenu buids a community menu for the specified community.
|
||||
* Parameters:
|
||||
* ctx - Standard Go context value.
|
||||
* comm - The community to build the menu for.
|
||||
* Returns:
|
||||
* The new menu definition.
|
||||
* Standard Go error status.
|
||||
*/
|
||||
func AmBuildCommunityMenu(comm *database.Community) (*MenuDefinition, error) {
|
||||
func AmBuildCommunityMenu(ctx context.Context, comm *database.Community) (*MenuDefinition, error) {
|
||||
menuCacheMutex.Lock()
|
||||
defer menuCacheMutex.Unlock()
|
||||
m, ok := menuCache.Get(comm.Id)
|
||||
if ok {
|
||||
return m.(*MenuDefinition), nil
|
||||
}
|
||||
sdef, err := database.AmGetCommunityServices(comm.Id)
|
||||
sdef, err := database.AmGetCommunityServices(ctx, comm.Id)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
+6
-6
@@ -31,7 +31,7 @@ func middlewareErrorPage(c echo.Context, ctxt AmContext, err error) error {
|
||||
func IPBanTest(next echo.HandlerFunc) echo.HandlerFunc {
|
||||
return func(c echo.Context) error {
|
||||
// Check IP banning.
|
||||
banmsg, banerr := database.AmTestIPBan(c.RealIP())
|
||||
banmsg, banerr := database.AmTestIPBan(c.Request().Context(), c.RealIP())
|
||||
if banerr != nil {
|
||||
c.Logger().Warnf("address %s could not be tested: %v", c.RealIP(), banerr)
|
||||
// but let the request pass anyway
|
||||
@@ -55,12 +55,12 @@ func CookieLoginTest(next echo.HandlerFunc) echo.HandlerFunc {
|
||||
cookie, err := c.Cookie(config.GlobalConfig.Site.LoginCookieName)
|
||||
if err == nil {
|
||||
var user *database.User
|
||||
user, err = database.AmAuthenticateUserByToken(cookie.Value, c.RealIP())
|
||||
user, err = database.AmAuthenticateUserByToken(c.Request().Context(), cookie.Value, c.RealIP())
|
||||
if err == nil {
|
||||
// log the user in and rotate login cookie
|
||||
amctxt.ReplaceUser(user)
|
||||
var newToken string
|
||||
if newToken, err = user.NewAuthToken(); err == nil {
|
||||
if newToken, err = user.NewAuthToken(c.Request().Context()); err == nil {
|
||||
amctxt.SetLoginCookie(newToken)
|
||||
} else {
|
||||
log.Warnf("unable to rotate login cookie: %v", err)
|
||||
@@ -99,7 +99,7 @@ func ValidateConference(next echo.HandlerFunc) echo.HandlerFunc {
|
||||
return func(c echo.Context) error {
|
||||
ctxt := AmContextFromEchoContext(c)
|
||||
comm := ctxt.CurrentCommunity() // set by middleware
|
||||
b, err := database.AmTestService(comm, "Conference")
|
||||
b, err := database.AmTestService(c.Request().Context(), comm, "Conference")
|
||||
if err != nil {
|
||||
return middlewareErrorPage(c, ctxt, err)
|
||||
}
|
||||
@@ -122,11 +122,11 @@ func ValidateConference(next echo.HandlerFunc) echo.HandlerFunc {
|
||||
func SetConference(next echo.HandlerFunc) echo.HandlerFunc {
|
||||
return func(c echo.Context) error {
|
||||
ctxt := AmContextFromEchoContext(c)
|
||||
conf, err := database.AmGetConferenceByAliasInCommunity(ctxt.CurrentCommunity().Id, ctxt.URLParam("confid"))
|
||||
conf, err := database.AmGetConferenceByAliasInCommunity(ctxt.Ctx(), ctxt.CurrentCommunity().Id, ctxt.URLParam("confid"))
|
||||
if err != nil {
|
||||
return middlewareErrorPage(c, ctxt, err)
|
||||
}
|
||||
m, lvl, err := conf.Membership(ctxt.CurrentUser())
|
||||
m, lvl, err := conf.Membership(ctxt.Ctx(), ctxt.CurrentUser())
|
||||
if err != nil {
|
||||
return middlewareErrorPage(c, ctxt, err)
|
||||
}
|
||||
|
||||
+1
-1
@@ -51,7 +51,7 @@ func AmSendPageData(ctxt echo.Context, amctxt AmContext, command string, data an
|
||||
case "top":
|
||||
menus[0] = AmMenu("top")
|
||||
case "community":
|
||||
md, err := AmBuildCommunityMenu(amctxt.CurrentCommunity())
|
||||
md, err := AmBuildCommunityMenu(ctxt.Request().Context(), amctxt.CurrentCommunity())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
+7
-6
@@ -11,6 +11,7 @@
|
||||
package ui
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/rand"
|
||||
"encoding/gob"
|
||||
"encoding/hex"
|
||||
@@ -220,8 +221,8 @@ func AmSetSessionUser(session *sessions.Session, user *database.User) {
|
||||
}
|
||||
|
||||
// setSessionAnon sets the user for the session to the anonymous user.
|
||||
func setSessionAnon(session *sessions.Session) {
|
||||
u, err := database.AmGetAnonUser()
|
||||
func setSessionAnon(ctx context.Context, session *sessions.Session) {
|
||||
u, err := database.AmGetAnonUser(ctx)
|
||||
if err == nil {
|
||||
AmSetSessionUser(session, u)
|
||||
} else {
|
||||
@@ -232,20 +233,20 @@ func setSessionAnon(session *sessions.Session) {
|
||||
var lastHitMutex sync.Mutex
|
||||
|
||||
// AmSessionFirstTime initializes the session after it's first created.
|
||||
func AmSessionFirstTime(session *sessions.Session) {
|
||||
func AmSessionFirstTime(ctx context.Context, session *sessions.Session) {
|
||||
lastHitMutex.Lock()
|
||||
setSessionAnon(session)
|
||||
setSessionAnon(ctx, session)
|
||||
session.Values["lasthit"] = time.Now()
|
||||
lastHitMutex.Unlock()
|
||||
}
|
||||
|
||||
// AmResetSession clears the specified session.
|
||||
func AmResetSession(session *sessions.Session) {
|
||||
func AmResetSession(ctx context.Context, session *sessions.Session) {
|
||||
lastHitMutex.Lock()
|
||||
for k := range session.Values {
|
||||
delete(session.Values, k)
|
||||
}
|
||||
setSessionAnon(session)
|
||||
setSessionAnon(ctx, session)
|
||||
session.Values["lasthit"] = time.Now()
|
||||
lastHitMutex.Unlock()
|
||||
}
|
||||
|
||||
+8
-6
@@ -112,7 +112,8 @@ func immediateIf(a jet.Arguments) reflect.Value {
|
||||
func extractCommunityLogo(a jet.Arguments) reflect.Value {
|
||||
rc := "/img/builtin/default-community.jpg"
|
||||
comm := a.Get(0).Convert(reflect.TypeFor[*database.Community]()).Interface().(*database.Community)
|
||||
ci, err := comm.ContactInfo()
|
||||
ctxt := a.Get(1).Convert(reflect.TypeFor[AmContext]()).Interface().(AmContext)
|
||||
ci, err := comm.ContactInfo(ctxt.Ctx())
|
||||
if err == nil {
|
||||
if ci.PhotoURL != nil && *ci.PhotoURL != "" {
|
||||
rc = *ci.PhotoURL
|
||||
@@ -125,7 +126,7 @@ func extractCommunityLogo(a jet.Arguments) reflect.Value {
|
||||
func displayDateTime(a jet.Arguments) reflect.Value {
|
||||
timeval := a.Get(0).Convert(reflect.TypeFor[time.Time]()).Interface().(time.Time)
|
||||
ctxt := a.Get(1).Convert(reflect.TypeFor[AmContext]()).Interface().(AmContext)
|
||||
prefs, err := ctxt.CurrentUser().Prefs()
|
||||
prefs, err := ctxt.CurrentUser().Prefs(ctxt.Ctx())
|
||||
if err == nil {
|
||||
loc := prefs.Localizer()
|
||||
return reflect.ValueOf(loc.Strftime("%b %e, %Y %r", timeval))
|
||||
@@ -137,7 +138,7 @@ func displayDateTime(a jet.Arguments) reflect.Value {
|
||||
func displayActivity(a jet.Arguments) reflect.Value {
|
||||
timeval := a.Get(0).Convert(reflect.TypeFor[*time.Time]()).Interface().(*time.Time)
|
||||
ctxt := a.Get(1).Convert(reflect.TypeFor[AmContext]()).Interface().(AmContext)
|
||||
prefs, err := ctxt.CurrentUser().Prefs()
|
||||
prefs, err := ctxt.CurrentUser().Prefs(ctxt.Ctx())
|
||||
if err == nil {
|
||||
return reflect.ValueOf(util.AmActivityString(timeval, prefs.Localizer()))
|
||||
}
|
||||
@@ -150,14 +151,14 @@ func displayMemberCount(a jet.Arguments) reflect.Value {
|
||||
comm := a.Get(0).Convert(reflect.TypeFor[*database.Community]()).Interface().(*database.Community)
|
||||
ctxt := a.Get(1).Convert(reflect.TypeFor[AmContext]()).Interface().(AmContext)
|
||||
level := ctxt.CurrentUser().BaseLevel
|
||||
mbr, _, clevel, err := comm.Membership(ctxt.CurrentUser())
|
||||
mbr, _, clevel, err := comm.Membership(ctxt.Ctx(), ctxt.CurrentUser())
|
||||
if err == nil {
|
||||
if mbr && clevel > level {
|
||||
level = clevel
|
||||
}
|
||||
showHidden = comm.TestPermission("Community.ShowHiddenMembers", level)
|
||||
}
|
||||
count, err := comm.MemberCount(showHidden)
|
||||
count, err := comm.MemberCount(ctxt.Ctx(), showHidden)
|
||||
if err != nil {
|
||||
return reflect.ValueOf(-1)
|
||||
}
|
||||
@@ -194,7 +195,8 @@ func displayFullName(a jet.Arguments) reflect.Value {
|
||||
// displayExpandCat displays a category expanded into a hierarchy.
|
||||
func displayExpandCat(a jet.Arguments) reflect.Value {
|
||||
cat := a.Get(0).Convert(reflect.TypeFor[*database.Category]()).Interface().(*database.Category)
|
||||
hier, _ := database.AmGetCategoryHierarchy(cat.CatId)
|
||||
ctxt := a.Get(1).Convert(reflect.TypeFor[AmContext]()).Interface().(AmContext)
|
||||
hier, _ := database.AmGetCategoryHierarchy(ctxt.Ctx(), cat.CatId)
|
||||
var rc strings.Builder
|
||||
for i, c := range hier {
|
||||
if i > 0 {
|
||||
|
||||
+1
-1
@@ -257,7 +257,7 @@
|
||||
<span class="text-sm pt-0.5 flex-shrink-0">🟣</span>
|
||||
<div class="flex-1 mb-2">
|
||||
<a href="/find?mode=COM&catid={{ rx.CatId }}"
|
||||
class="text-blue-700 hover:text-blue-900 font-bold text-base">{{ DisplayExpandCat(rx) }}</a>
|
||||
class="text-blue-700 hover:text-blue-900 font-bold text-base">{{ DisplayExpandCat(rx, .) }}</a>
|
||||
</div>
|
||||
</div>
|
||||
{{ else if mode == "PST" }}
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
{{ comm := .CurrentCommunity() }}
|
||||
<div class="mb-2 mt-2">
|
||||
<div class="mb-1">
|
||||
<img src="{{ ExtractCommunityLogo(comm) }}" alt="{{ comm.Name }}" class="w-28 h-16 rounded">
|
||||
<img src="{{ ExtractCommunityLogo(comm, .) }}" alt="{{ comm.Name }}" class="w-28 h-16 rounded">
|
||||
</div>
|
||||
<div class="font-bold mb-1">{{ menu.Title }}</div>
|
||||
{{ ctxt := . }}
|
||||
|
||||
+2
-2
@@ -79,8 +79,8 @@
|
||||
{{ post_overrideLine := "" }}
|
||||
{{ post_overrideLink := "" }}
|
||||
{{ range i, post_cur := posts }}
|
||||
{{ post_userName = post_getUserName(post_cur) }}
|
||||
{{ post_text = post_getText(post_cur) }}
|
||||
{{ post_userName = post_getUserName(post_cur, .) }}
|
||||
{{ post_text = post_getText(post_cur, .) }}
|
||||
{{ post_overrideLine = post_getOverrideLine(post_cur, .) }}
|
||||
{{ post_overrideLink = post_getOverrideLink(post_cur, post_topicPermalink) }}
|
||||
{{ .SubRender("singlepost.jet") | raw }}
|
||||
|
||||
Reference in New Issue
Block a user