added contact info support and the code for sending a password reminder
This commit is contained in:
@@ -0,0 +1,102 @@
|
||||
/*
|
||||
* Amsterdam Web Communities System
|
||||
* Copyright (c) 2025 Erbosoft Metaverse Design Solutions, All Rights Reserved
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
// The database package contains database management and storage logic.
|
||||
package database
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
lru "github.com/hashicorp/golang-lru"
|
||||
)
|
||||
|
||||
// ContactInfo stores the contact information for a user or community.
|
||||
type ContactInfo struct {
|
||||
ContactId int32 `db:"contactid"`
|
||||
GivenName string `db:"given_name"`
|
||||
FamilyName string `db:"family_name"`
|
||||
MiddleInit string `db:"middle_init"`
|
||||
Prefix *string `db:"prefix"`
|
||||
Suffix *string `db:"suffix"`
|
||||
Company *string `db:"company"`
|
||||
Addr1 *string `db:"addr1"`
|
||||
Addr2 *string `db:"addr2"`
|
||||
Locality *string `db:"locality"`
|
||||
Region *string `db:"region"`
|
||||
PostalCode *string `db:"pcode"`
|
||||
Country *string `db:"country"`
|
||||
Phone *string `db:"phone"`
|
||||
Fax *string `db:"fax"`
|
||||
Mobile *string `db:"mobile"`
|
||||
Email *string `db:"email"`
|
||||
PrivateAddr bool `db:"pvt_addr"`
|
||||
PrivatePhone bool `db:"pvt_phone"`
|
||||
PrivateFax bool `db:"pvt_fax"`
|
||||
PrivateEmail bool `db:"pvt_email"`
|
||||
OwnerUid int32 `db:"owner_uid"`
|
||||
OwnerCommId int32 `db:"owner_commid"`
|
||||
PhotoURL *string `db:"photo_url"`
|
||||
URL *string `db:"url"`
|
||||
LastUpdate *time.Time
|
||||
}
|
||||
|
||||
// contactCache is the cache for ContactInfo objects.
|
||||
var contactCache *lru.TwoQueueCache = nil
|
||||
|
||||
// getContactMutex is a mutex on AmGetContactInfo.
|
||||
var getContactMutex sync.Mutex
|
||||
|
||||
// init initializes the contact info cache.
|
||||
func init() {
|
||||
var err error
|
||||
contactCache, err = lru.New2Q(100)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
// internalContactInfo retrieves the contact info from the database.
|
||||
func internalContactInfo(id int32) (*ContactInfo, error) {
|
||||
var dbdata []ContactInfo
|
||||
err := amdb.Select(&dbdata, "SELECT * from contacts WHERE contactid = ?", id)
|
||||
if err == nil {
|
||||
if len(dbdata) > 1 {
|
||||
err = fmt.Errorf("internalContactInfo(%d): Too many responses (%d)", id, len(dbdata))
|
||||
} else if len(dbdata) == 0 {
|
||||
return nil, nil
|
||||
} else {
|
||||
return &(dbdata[0]), nil
|
||||
}
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
|
||||
/* AmGetContactInfo retrieves the contact info for a given identifier.
|
||||
* Parameters:
|
||||
* id - The contact info ID top retrieve.
|
||||
* Returns:
|
||||
*
|
||||
*/
|
||||
func AmGetContactInfo(id int32) (*ContactInfo, error) {
|
||||
getContactMutex.Lock()
|
||||
defer getContactMutex.Unlock()
|
||||
rc, ok := contactCache.Get(id)
|
||||
if ok {
|
||||
return rc.(*ContactInfo), nil
|
||||
}
|
||||
rc2, err := internalContactInfo(id)
|
||||
if err == nil {
|
||||
if rc2 != nil {
|
||||
contactCache.Add(id, rc2)
|
||||
}
|
||||
return rc2, nil
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
@@ -60,6 +60,14 @@ func init() {
|
||||
}
|
||||
}
|
||||
|
||||
// ContactInfo returns the contact info structure for the user.
|
||||
func (u *User) ContactInfo() (*ContactInfo, error) {
|
||||
if u.ContactID < 0 {
|
||||
return nil, nil
|
||||
}
|
||||
return AmGetContactInfo(u.ContactID)
|
||||
}
|
||||
|
||||
/* AmGetUser returns a reference to the specified user.
|
||||
* Parameters:
|
||||
* uid - The UID of the user.
|
||||
|
||||
Reference in New Issue
Block a user