From 8fdc3ded44e7ddc13be11a77aa4d04a9a2da03cd Mon Sep 17 00:00:00 2001 From: Amy Gale Ruth Bowersox Date: Wed, 8 Oct 2025 17:52:43 -0600 Subject: [PATCH] added AmAutoJoinCommunities --- database/community.go | 50 +++++++++++++++++++++++++++++++++++++------ database/user.go | 12 ++++++++--- 2 files changed, 52 insertions(+), 10 deletions(-) diff --git a/database/community.go b/database/community.go index c469b17..da157e6 100644 --- a/database/community.go +++ b/database/community.go @@ -11,6 +11,7 @@ package database import ( "fmt" + "slices" "sync" "time" @@ -96,16 +97,15 @@ func AmGetCommunity(id int32) (*Community, error) { */ func AmGetCommunitiesForUser(uid int32) ([]*Community, error) { var rc []*Community = make([]*Community, 0) - rows, err := amdb.Queryx("SELECT commid FROM commmember WHERE uid = ?", uid) + var ids []int32 = make([]int32, 0) + err := amdb.Select(&ids, "SELECT commid FROM commmember WHERE uid = ?", uid) if err == nil { - defer rows.Close() - for err == nil && rows.Next() { - var cid int32 - var c *Community - rows.Scan(&cid) - c, err = AmGetCommunity(cid) + for _, id := range ids { + c, err := AmGetCommunity(id) if err == nil { rc = append(rc, c) + } else { + break } } } @@ -133,3 +133,39 @@ func AmGetCommunityAccessLevel(uid int32, commid int32) (uint16, error) { } return rc, err } + +/* AmAutoJoinCommunities joins the specified user to any communities they're not yet a part of. + * Parameters: + * user - The user to be auto-joined to communities. + * Returns: + * Standard Go error status. + */ +func AmAutoJoinCommunities(user *User) error { + // get list of current communities + var current []int32 = make([]int32, 0) + err := amdb.Select(¤t, "SELECT commid FROM commmember WHERE uid = ?", user.Uid) + if err != nil { + return err + } + + // look for candidate communities + rows, err := amdb.Queryx(`SELECT m.commid, m.locked FROM users u, communities c, commmember m + WHERE m.uid = u.uid AND m.commid = c.commid AND u.is_anon = 1 AND c.join_lvl <= ?`, user.BaseLevel) + if err == nil { + defer rows.Close() + grantLevel := AmDefaultRole("Community.NewUser").Level() + for rows.Next() { + var cid int32 + var lock bool + rows.Scan(&cid, &lock) + if !slices.Contains(current, cid) { + _, err = amdb.Exec("INSERT INTO commmember (commid, uid, granted_lvl, locked) VALUES (?. ?, ?, ?)", + cid, user.Uid, grantLevel, lock) + if err != nil { + break + } + } + } + } + return err +} diff --git a/database/user.go b/database/user.go index b7eb167..32a3a7b 100644 --- a/database/user.go +++ b/database/user.go @@ -181,8 +181,10 @@ func (u *User) ConfirmEMailAddress(confnum int32, remoteIP string) error { if err == nil { u.VerifyEMail = true u.BaseLevel = AmDefaultRole("Global.AfterVerify").Level() - // TODO: auto-join communities if necessary - ar = AmNewAudit(AuditVerifyEmailOK, u.Uid, remoteIP) + err = AmAutoJoinCommunities(u) + if err == nil { + ar = AmNewAudit(AuditVerifyEmailOK, u.Uid, remoteIP) + } } return err } @@ -523,7 +525,11 @@ func AmCreateNewUser(username string, password string, reminder string, dob *tim return nil, err } - // TODO: auto-join communities + // auto-join communities + err = AmAutoJoinCommunities(user) + if err != nil { + return nil, err + } // TODO: copy conference hotlists