Advanced search on members

This commit is contained in:
William Bouzourène 2025-03-26 18:13:00 +01:00
parent e53ace830a
commit 8044cb975a
Signed by: bouzoure
SSH key fingerprint: SHA256:19MbXpLua4rUtk8tunMesD8KUKb91LXLHg8E/qTooww
4 changed files with 396 additions and 176 deletions

View file

@ -30,6 +30,8 @@ type PersonValidation struct {
}
func Members(c *fiber.Ctx) error {
log := helpers.GetLogger()
userid, err := helpers.GetSessionUserId(c)
if err != nil {
return err
@ -61,133 +63,30 @@ func Members(c *fiber.Ctx) error {
return err
}
/*sqlFilterSections := allowedSections
sqlFilterAppend := "IS NULL"
if filterArchive == "1" {
sqlFilterAppend = "IS NOT NULL"
sqlFilterSections = allowedSectionsArchived
}
var filterSectionUint uint
if len(filterSection) > 0 {
filterSectionUint64, err := strconv.ParseUint(filterSection, 10, 0)
if err == nil {
for _, s := range sqlFilterSections {
if s == uint(filterSectionUint64) {
filterSectionUint = uint(filterSectionUint64)
}
}
}
}
if filterSectionUint > 0 {
sqlFilterAppend = fmt.Sprintf(
"%s AND section_id = %d",
sqlFilterAppend,
filterSectionUint,
)
}
var sqlFilterSearch string
if len(filterSearch) > 0 {
sqlFilterSearch = fmt.Sprintf(
"%%%s%%", filterSearch,
)
}
var count int64
if len(filterSearch) > 0 {
db.Model(&models.Person{}).Where(
fmt.Sprintf(
"is_member = ? AND section_id IN ? AND (first_name LIKE ? OR last_name LIKE ?) AND deleted_at %s",
sqlFilterAppend,
),
true, allowedSections, sqlFilterSearch, sqlFilterSearch,
).Count(&count)
} else {
db.Model(&models.Person{}).Where(
fmt.Sprintf(
"is_member = ? AND section_id IN ? AND deleted_at %s",
sqlFilterAppend,
),
true, allowedSections,
).Count(&count)
}
var people []models.Person
if len(filterSearch) > 0 {
result := db.Unscoped().Offset(
pagination.Offset,
).Limit(
pagination.PageSize,
).Order(
"concat(last_name, first_name) collate nocase asc",
).Preload(
"Section",
).Find(
&people,
fmt.Sprintf(
"is_member = ? AND section_id IN ? AND (first_name LIKE ? OR last_name LIKE ?) AND deleted_at %s",
sqlFilterAppend,
),
true, sqlFilterSections, sqlFilterSearch, sqlFilterSearch,
)
if result.Error != nil && !errors.Is(result.Error, gorm.ErrRecordNotFound) {
return err
}
} else {
result := db.Unscoped().Offset(
pagination.Offset,
).Limit(
pagination.PageSize,
).Order(
"concat(last_name, first_name) collate nocase asc",
).Preload(
"Section",
).Find(
&people,
fmt.Sprintf(
"is_member = ? AND section_id IN ? AND deleted_at %s",
sqlFilterAppend,
),
true, sqlFilterSections,
)
if result.Error != nil && !errors.Is(result.Error, gorm.ErrRecordNotFound) {
return err
}
}*/
/*var sections []models.Section
db.Order(
"name collate nocase asc",
).Find(
&sections,
"contains_members = ? AND id IN ?",
true, sqlFilterSections,
)*/
searchJSON := c.Query("s")
var params database.PeopleSearchParams
if len(searchJSON) > 0 {
err = json.Unmarshal([]byte(searchJSON), &params)
if err != nil {
return err
log.Warn(err)
searchJSON = ""
}
}
page, _ := strconv.Atoi(c.Query("p"))
params.PageNumber, _ = strconv.Atoi(c.Query("p"))
params.PageSize = 50
params.PersonType = "members"
results, err := database.PeopleSearch(params, "members", 50, page)
var sections []models.Section
db.Order("name collate nocase asc").Find(&sections, "contains_members = ? AND id IN ?", true, allowedSections)
params.AllowedSections = allowedSections
results, err := database.PeopleSearch(params)
if err != nil {
return err
}
var sections []models.Section
db.Order("name collate nocase asc").Find(&sections, "contains_members = ?", true)
var fields []models.Field
db.Order("position asc").Find(&fields, "person_type = ?", "member")