all database operations now take a context.Context, which is propagated through from sources

This commit is contained in:
2025-12-20 22:29:26 -07:00
parent 9e6bf2feda
commit 5c8bb8dd5e
39 changed files with 605 additions and 504 deletions
+8 -8
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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" }}
+1 -1
View File
@@ -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
View File
@@ -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 }}